You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by so...@apache.org on 2018/09/15 14:54:55 UTC
[drill] 02/02: DRILL-3853: Upgrade to SqlLine 1.5.0 closes #1462
This is an automated email from the ASF dual-hosted git repository.
sorabh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git
commit 8f164bc4081ea3b825553ec9215df5b068eec67a
Author: Arina Ielchiieva <ar...@gmail.com>
AuthorDate: Fri Sep 7 16:42:17 2018 +0000
DRILL-3853: Upgrade to SqlLine 1.5.0
closes #1462
---
contrib/pom.xml | 1 -
contrib/sqlline/pom.xml | 54 ------
distribution/pom.xml | 4 -
distribution/src/assemble/bin.xml | 5 +
.../resources/drill-sqlline-override-example.conf | 31 ++++
distribution/src/resources/sqlline | 2 +-
distribution/src/resources/sqlline.bat | 17 +-
exec/java-exec/pom.xml | 4 +
.../drill/exec/client/DrillSqlLineApplication.java | 193 +++++++++++++++++++++
.../org/apache/drill/exec/server/Drillbit.java | 4 +
.../src/main/resources/drill-sqlline.conf | 88 ++++++++++
.../exec/client/DrillSqlLineApplicationTest.java | 113 ++++++++++++
.../resources/drill-sqlline-test-override.conf | 30 ++++
.../src/test/resources/drill-sqlline-test.conf | 40 +++++
exec/jdbc-all/pom.xml | 4 +
pom.xml | 7 +-
16 files changed, 518 insertions(+), 79 deletions(-)
diff --git a/contrib/pom.xml b/contrib/pom.xml
index a96aa42..796e79b 100644
--- a/contrib/pom.xml
+++ b/contrib/pom.xml
@@ -43,7 +43,6 @@
<module>storage-kafka</module>
<module>storage-kudu</module>
<module>storage-opentsdb</module>
- <module>sqlline</module>
<module>data</module>
<module>udfs</module>
</modules>
diff --git a/contrib/sqlline/pom.xml b/contrib/sqlline/pom.xml
deleted file mode 100644
index 77070fc..0000000
--- a/contrib/sqlline/pom.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <artifactId>drill-contrib-parent</artifactId>
- <groupId>org.apache.drill.contrib</groupId>
- <version>1.15.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>drill-sqlline</artifactId>
- <name>contrib/sqlline</name>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.drill.exec</groupId>
- <artifactId>drill-jdbc</artifactId>
- <version>${project.version}</version>
- </dependency>
-
- <dependency>
- <groupId>sqlline</groupId>
- <artifactId>sqlline</artifactId>
- </dependency>
- <!-- Specify xalan and xerces versions to avoid setXIncludeAware error. -->
- <dependency>
- <groupId>xerces</groupId>
- <artifactId>xercesImpl</artifactId>
- </dependency>
- <dependency>
- <groupId>xalan</groupId>
- <artifactId>xalan</artifactId>
- </dependency>
- </dependencies>
-</project>
diff --git a/distribution/pom.xml b/distribution/pom.xml
index 35a274a..4952ca5 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -222,10 +222,6 @@
</activation>
<dependencies>
<dependency>
- <groupId>sqlline</groupId>
- <artifactId>sqlline</artifactId>
- </dependency>
- <dependency>
<groupId>org.apache.drill.contrib.data</groupId>
<artifactId>tpch-sample-data</artifactId>
<version>${project.version}</version>
diff --git a/distribution/src/assemble/bin.xml b/distribution/src/assemble/bin.xml
index c65d31a..85a4d5b 100644
--- a/distribution/src/assemble/bin.xml
+++ b/distribution/src/assemble/bin.xml
@@ -427,5 +427,10 @@
<outputDirectory>conf</outputDirectory>
<fileMode>0640</fileMode>
</file>
+ <file>
+ <source>src/resources/drill-sqlline-override-example.conf</source>
+ <outputDirectory>conf</outputDirectory>
+ <fileMode>0640</fileMode>
+ </file>
</files>
</assembly>
diff --git a/distribution/src/resources/drill-sqlline-override-example.conf b/distribution/src/resources/drill-sqlline-override-example.conf
new file mode 100644
index 0000000..34decdc
--- /dev/null
+++ b/distribution/src/resources/drill-sqlline-override-example.conf
@@ -0,0 +1,31 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This file customizes SqlLine application.
+# This file is in HOCON format, see https://github.com/typesafehub/config/blob/master/HOCON.md for more information.
+
+drill.sqlline {
+ # ${?drill.sqlline.quotes} is used to append new quotes to the existing ones
+ # remove it if you want to override existing quotes completely
+ quotes: ${?drill.sqlline.quotes} [
+ "east or west, drill is the best"
+ ],
+ # overrides default SqlLine properties
+ # for the full list of properties use !set command in SqlLine
+ opts: {
+ maxWidth: 10000,
+ timeout: -1
+ }
+}
diff --git a/distribution/src/resources/sqlline b/distribution/src/resources/sqlline
index 3f982bb..1db0083 100644
--- a/distribution/src/resources/sqlline
+++ b/distribution/src/resources/sqlline
@@ -82,7 +82,7 @@ if [[ ( ! $(ps -o stat= -p $$) =~ "+" ) && ! ( -p /dev/stdin ) ]]; then
fi
SHELL_OPTS="$DRILL_SHELL_JAVA_OPTS $SQLLINE_JAVA_OPTS $DRILL_SHELL_LOG_OPTS $CLIENT_GC_OPTS"
-CMD="$JAVA $SHELL_OPTS -cp $CP sqlline.SqlLine -d org.apache.drill.jdbc.Driver --maxWidth=10000"
+CMD="$JAVA $SHELL_OPTS -cp $CP sqlline.SqlLine -ac org.apache.drill.exec.client.DrillSqlLineApplication -d org.apache.drill.jdbc.Driver"
# The wrapper is purely for unit testing.
diff --git a/distribution/src/resources/sqlline.bat b/distribution/src/resources/sqlline.bat
index ac5a626..7821efa 100755
--- a/distribution/src/resources/sqlline.bat
+++ b/distribution/src/resources/sqlline.bat
@@ -200,28 +200,19 @@ set DRILL_CP=%DRILL_CP%;%DRILL_HOME%\jars\3rdparty\*
set DRILL_CP=%DRILL_CP%;%DRILL_HOME%\jars\classb\*
if NOT "test%DRILL_CLASSPATH%"=="test" set DRILL_CP=!DRILL_CP!;%DRILL_CLASSPATH%
-rem Override SQLLine's default initial transaction isolation level. (SQLLine
-rem sets an initial level instead of leaving it at whatever the Driver's default
-rem is.)
-rem Put our property specification before previous value of DRILL_SHELL_JAVA_OPTS
-rem so that it can still be overridden via DRILL_SHELL_JAVA_OPTS.
-rem
-rem This is not currently needed as the new SQLLine we are using doesn't isolate.
-rem set DRILL_SHELL_JAVA_OPTS=-Dsqlline.isolation=TRANSACTION_NONE %DRILL_SHELL_JAVA_OPTS%
-
set DRILL_SHELL_JAVA_OPTS=%DRILL_SHELL_JAVA_OPTS% -Dlog.path="%DRILL_LOG_DIR%\sqlline.log" -Dlog.query.path="%DRILL_LOG_DIR%\sqlline_queries.log"
SET JAVA_CMD=%JAVA_HOME%\bin\%JAVA_EXE%
if "%JAVA_HOME%" == "" (set JAVA_CMD=%JAVA_EXE%)
set ERROR_CODE=0
-
+set SQLLINE_CALL=sqlline.SqlLine -ac org.apache.drill.exec.client.DrillSqlLineApplication -d org.apache.drill.jdbc.Driver
if NOT "test%QUERY%"=="test" (
- echo %QUERY% | "%JAVA_CMD%" %DRILL_SHELL_JAVA_OPTS% %DRILL_JAVA_OPTS% -cp "%DRILL_CP%" sqlline.SqlLine -d org.apache.drill.jdbc.Driver %DRILL_ARGS%
+ echo %QUERY% | "%JAVA_CMD%" %DRILL_SHELL_JAVA_OPTS% %DRILL_JAVA_OPTS% -cp "%DRILL_CP%" %SQLLINE_CALL% %DRILL_ARGS%
) else (
if NOT "test%FILE%"=="test" (
- "%JAVA_CMD%" %DRILL_SHELL_JAVA_OPTS% %DRILL_JAVA_OPTS% -cp "%DRILL_CP%" sqlline.SqlLine -d org.apache.drill.jdbc.Driver %DRILL_ARGS% --run=%FILE%
+ "%JAVA_CMD%" %DRILL_SHELL_JAVA_OPTS% %DRILL_JAVA_OPTS% -cp "%DRILL_CP%" %SQLLINE_CALL% %DRILL_ARGS% --run=%FILE%
) else (
- "%JAVA_CMD%" %DRILL_SHELL_JAVA_OPTS% %DRILL_JAVA_OPTS% -cp "%DRILL_CP%" sqlline.SqlLine -d org.apache.drill.jdbc.Driver %DRILL_ARGS%
+ "%JAVA_CMD%" %DRILL_SHELL_JAVA_OPTS% %DRILL_JAVA_OPTS% -cp "%DRILL_CP%" %SQLLINE_CALL% %DRILL_ARGS%
)
)
if ERRORLEVEL 1 goto error
diff --git a/exec/java-exec/pom.xml b/exec/java-exec/pom.xml
index e5b055b..5b00a8c 100644
--- a/exec/java-exec/pom.xml
+++ b/exec/java-exec/pom.xml
@@ -539,6 +539,10 @@
<artifactId>pcapngdecoder</artifactId>
<version>1.2</version>
</dependency>
+ <dependency>
+ <groupId>sqlline</groupId>
+ <artifactId>sqlline</artifactId>
+ </dependency>
</dependencies>
<profiles>
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillSqlLineApplication.java b/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillSqlLineApplication.java
new file mode 100644
index 0000000..13d2b33
--- /dev/null
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillSqlLineApplication.java
@@ -0,0 +1,193 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.drill.exec.client;
+
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+import jline.console.completer.StringsCompleter;
+import org.apache.drill.common.scanner.ClassPathScanner;
+import org.apache.drill.common.util.DrillVersionInfo;
+import org.apache.drill.shaded.guava.com.google.common.annotations.VisibleForTesting;
+import sqlline.Application;
+import sqlline.CommandHandler;
+import sqlline.OutputFormat;
+import sqlline.ReflectiveCommandHandler;
+import sqlline.SqlLine;
+import sqlline.SqlLineOpts;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * <p>Drill SqlLine application configuration.</p>
+ *
+ * <p>Customizes SqlLine for Drill, i.e. overrides application info message,
+ * known drivers, connection url examples, removes non applicable commands, sets SqlLine properties.</p>
+ *
+ * <p>Uses {@link #DRILL_SQLLINE_CONF} as base configuration, allows to override it using {@link #DRILL_SQLLINE_OVERRIDE_CONF}.
+ * If configuration files are missing in the classpath, issues warning and proceeds with default SqlLine configuration.</p>
+ */
+public class DrillSqlLineApplication extends Application {
+
+ private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillSqlLineApplication.class);
+
+ private static final String DRILL_SQLLINE_CONF = "drill-sqlline.conf";
+ private static final String DRILL_SQLLINE_OVERRIDE_CONF = "drill-sqlline-override.conf";
+
+ private static final String INFO_MESSAGE_TEMPLATE_CONF = "drill.sqlline.info_message_template";
+ private static final String QUOTES_CONF = "drill.sqlline.quotes";
+ private static final String DRIVERS_CONF = "drill.sqlline.drivers";
+ private static final String CONNECTION_URL_EXAMPLES_CONF = "drill.sqlline.connection_url_examples";
+ private static final String COMMANDS_TO_EXCLUDE_CONF = "drill.sqlline.commands.exclude";
+ private static final String OPTS_CONF = "drill.sqlline.opts";
+
+ private final Config config;
+
+ public DrillSqlLineApplication() {
+ this(DRILL_SQLLINE_CONF, DRILL_SQLLINE_OVERRIDE_CONF);
+ }
+
+ @VisibleForTesting
+ public DrillSqlLineApplication(String configName, String overrideConfigName) {
+ this.config = overrideConfig(overrideConfigName, loadConfig(configName));
+ if (config.isEmpty()) {
+ logger.warn("Was unable to find / load [{}]. Will use default SqlLine configuration.", configName);
+ }
+ }
+
+ public Config getConfig() {
+ return config;
+ }
+
+ @Override
+ public String getInfoMessage() throws Exception {
+ if (config.hasPath(INFO_MESSAGE_TEMPLATE_CONF)) {
+ String quote = "";
+ if (config.hasPath(QUOTES_CONF)) {
+ List<String> quotes = config.getStringList(QUOTES_CONF);
+ quote = quotes.get(new Random().nextInt(quotes.size()));
+ }
+ return String.format(config.getString(INFO_MESSAGE_TEMPLATE_CONF), DrillVersionInfo.getVersion(), quote);
+ }
+
+ return super.getInfoMessage();
+ }
+
+ @Override
+ public Collection<String> initDrivers() {
+ if (config.hasPath(DRIVERS_CONF)) {
+ return config.getStringList(DRIVERS_CONF);
+ }
+ return super.initDrivers();
+ }
+
+ @Override
+ public Map<String, OutputFormat> getOutputFormats(SqlLine sqlLine) {
+ return sqlLine.getOutputFormats();
+ }
+
+ @Override
+ public Collection<String> getConnectionUrlExamples() {
+ if (config.hasPath(CONNECTION_URL_EXAMPLES_CONF)) {
+ return config.getStringList(CONNECTION_URL_EXAMPLES_CONF);
+ }
+ return super.getConnectionUrlExamples();
+ }
+
+ @Override
+ public Collection<CommandHandler> getCommandHandlers(SqlLine sqlLine) {
+ List<String> commandsToExclude = new ArrayList<>();
+
+ // exclude connect command and then add it back to ensure connection url examples are updated
+ boolean reloadConnect = config.hasPath(CONNECTION_URL_EXAMPLES_CONF);
+ if (reloadConnect) {
+ commandsToExclude.add("connect");
+ }
+
+ if (config.hasPath(COMMANDS_TO_EXCLUDE_CONF)) {
+ commandsToExclude.addAll(config.getStringList(COMMANDS_TO_EXCLUDE_CONF));
+ }
+
+ if (commandsToExclude.isEmpty()) {
+ return sqlLine.getCommandHandlers();
+ }
+
+ List<CommandHandler> commandHandlers = sqlLine.getCommandHandlers().stream()
+ .filter(c -> c.getNames().stream()
+ .noneMatch(commandsToExclude::contains))
+ .collect(Collectors.toList());
+
+ if (reloadConnect) {
+ commandHandlers.add(new ReflectiveCommandHandler(sqlLine,
+ new StringsCompleter(getConnectionUrlExamples()), "connect", "open"));
+ }
+
+ return commandHandlers;
+ }
+
+ @Override
+ public SqlLineOpts getOpts(SqlLine sqlLine) {
+ SqlLineOpts opts = sqlLine.getOpts();
+ if (config.hasPath(OPTS_CONF)) {
+ Config optsConfig = config.getConfig(OPTS_CONF);
+ optsConfig.entrySet().forEach(
+ e -> {
+ String key = e.getKey();
+ String value = String.valueOf(e.getValue().unwrapped());
+ if (!opts.set(key, value, true)) {
+ logger.warn("Unable to set SqlLine property [{}] to [{}].", key, value);
+ }
+ }
+ );
+ }
+ return opts;
+ }
+
+ private Config loadConfig(String configName) {
+ Set<URL> urls = ClassPathScanner.forResource(configName, false);
+ if (urls.size() != 1) {
+ if (logger.isDebugEnabled()) {
+ urls.forEach(
+ u -> logger.debug("Found duplicating [{}]: [{}].", configName, u.getPath())
+ );
+ }
+ return ConfigFactory.empty();
+ }
+
+ URL url = urls.iterator().next();
+ try {
+ logger.debug("Parsing [{}] for the url: [{}].", configName, url.getPath());
+ return ConfigFactory.parseURL(url);
+ } catch (Exception e) {
+ logger.warn("Was unable to parse [{}].", url.getPath(), e);
+ return ConfigFactory.empty();
+ }
+ }
+
+ private Config overrideConfig(String configName, Config config) {
+ Config overrideConfig = loadConfig(configName);
+ return overrideConfig.withFallback(config).resolve();
+ }
+
+}
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java
index 9fe7bea..dd1c5f1 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/Drillbit.java
@@ -55,6 +55,7 @@ import org.apache.zookeeper.Environment;
import org.apache.drill.exec.proto.CoordinationProtos.DrillbitEndpoint.State;
import org.apache.drill.shaded.guava.com.google.common.annotations.VisibleForTesting;
import org.apache.drill.shaded.guava.com.google.common.base.Stopwatch;
+import org.slf4j.bridge.SLF4JBridgeHandler;
/**
* Starts, tracks and stops all the required services for a Drillbit daemon to work.
@@ -70,6 +71,9 @@ public class Drillbit implements AutoCloseable {
*/
GuavaPatcher.patch();
Environment.logEnv("Drillbit environment: ", logger);
+ // Jersey uses java.util.logging - create bridge: jul to slf4j
+ SLF4JBridgeHandler.removeHandlersForRootLogger();
+ SLF4JBridgeHandler.install();
}
public final static String SYSTEM_OPTIONS_NAME = "org.apache.drill.exec.server.Drillbit.system_options";
diff --git a/exec/java-exec/src/main/resources/drill-sqlline.conf b/exec/java-exec/src/main/resources/drill-sqlline.conf
new file mode 100644
index 0000000..b977d9f
--- /dev/null
+++ b/exec/java-exec/src/main/resources/drill-sqlline.conf
@@ -0,0 +1,88 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This file customizes SqlLine application.
+# This file is in HOCON format, see https://github.com/typesafehub/config/blob/master/HOCON.md for more information.
+
+drill.sqlline {
+ info_message_template: "apache drill %s\n%s",
+ quotes: [
+ "start your sql engine",
+ "this isn't your grandfather's sql",
+ "a little sql for your nosql",
+ "json ain't no thang",
+ "drill baby drill",
+ "just drill it",
+ "say hello to my little drill",
+ "what ever the mind of man can conceive and believe, drill can query",
+ "the only truly happy people are children, the creative minority and drill users",
+ "a drill is a terrible thing to waste",
+ "got drill?",
+ "a drill in the hand is better than two in the bush",
+ "drill never goes out of style",
+ "everything is easier with drill",
+ "you told me to drill, sergeant",
+ "you're gonna need a bigger drill",
+ "keep your data close, but your drillbits closer",
+ "let's drill something more solid than concrete",
+ "drill must go on",
+ "in drill we trust",
+ "two things are infinite: the universe and drill; and i'm not sure about the universe",
+ "a query result is never late, nor is it early, it arrives precisely when it means to",
+ "think different, think drill",
+ "there are two types of analysts in the world: those who use drill and those who don't",
+ "good friends, good books and drill cluster: this is the ideal life",
+ "data is the new oil: ready to drill some?",
+ "you won't meet santa, but drill supports clauses",
+ "your drill is the drill that will pierce the heavens"
+ ],
+ drivers: [
+ org.apache.drill.jdbc.Driver
+ ],
+ connection_url_examples: [
+ "jdbc:drill:drillbit=localhost",
+ "jdbc:drill:zk=local"
+ ],
+ commands.exclude: [
+ describe,
+ indexes,
+ primarykeys,
+ exportedkeys,
+ manual,
+ importedkeys,
+ procedures,
+ typeinfo,
+ dropall,
+ metadata,
+ nativesql,
+ dbinfo,
+ rehash,
+ batch,
+ all,
+ go,
+ isolation,
+ autocommit,
+ commit,
+ rollback,
+ scan,
+ sql,
+ call
+ ],
+ opts: {
+ incremental: false,
+ isolation: TRANSACTION_NONE,
+ maxWidth: 10000
+ }
+}
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/client/DrillSqlLineApplicationTest.java b/exec/java-exec/src/test/java/org/apache/drill/exec/client/DrillSqlLineApplicationTest.java
new file mode 100644
index 0000000..4996ce2
--- /dev/null
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/client/DrillSqlLineApplicationTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.drill.exec.client;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import sqlline.CommandHandler;
+import sqlline.OutputFormat;
+import sqlline.SqlLine;
+import sqlline.SqlLineOpts;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public class DrillSqlLineApplicationTest {
+
+ private static DrillSqlLineApplication application;
+
+ @BeforeClass
+ public static void init() {
+ application = new DrillSqlLineApplication(
+ "drill-sqlline-test.conf",
+ "drill-sqlline-test-override.conf");
+ }
+
+ @Test
+ public void testInfoMessage() throws Exception {
+ String infoMessage = application.getInfoMessage();
+ assertThat(infoMessage, containsString("all code is guilty until proven innocent"));
+ }
+
+ @Test
+ public void testDrivers() {
+ Collection<String> drivers = application.initDrivers();
+ assertEquals(1L, drivers.size());
+ assertEquals("org.apache.drill.jdbc.Driver", drivers.iterator().next());
+ }
+
+ @Test
+ public void testOutputFormats() {
+ SqlLine sqlLine = new SqlLine();
+ Map<String, OutputFormat> outputFormats = application.getOutputFormats(sqlLine);
+ assertEquals(sqlLine.getOutputFormats(), outputFormats);
+ }
+
+ @Test
+ public void testConnectionUrlExamples() {
+ Collection<String> examples = application.getConnectionUrlExamples();
+ assertEquals(1L, examples.size());
+ assertEquals("jdbc:drill:zk=local", examples.iterator().next());
+ }
+
+ @Test
+ public void testCommandHandlers() {
+ SqlLine sqlLine = new SqlLine();
+ Collection<CommandHandler> commandHandlers = application.getCommandHandlers(sqlLine);
+ List<String> excludedCommands = Arrays.asList("describe", "indexes");
+ List<CommandHandler> matchingCommands = commandHandlers.stream()
+ .filter(c -> c.getNames().stream()
+ .anyMatch(excludedCommands::contains))
+ .collect(Collectors.toList());
+ assertTrue(matchingCommands.isEmpty());
+ }
+
+ @Test
+ public void testOpts() {
+ SqlLine sqlLine = new SqlLine();
+ SqlLineOpts opts = application.getOpts(sqlLine);
+ assertFalse(opts.getIncremental());
+ assertEquals("TRANSACTION_NONE", opts.getIsolation());
+ assertEquals(20_000, opts.getMaxWidth());
+ assertEquals(200, opts.getTimeout());
+ }
+
+ @Test
+ public void testEmptyConfig() {
+ DrillSqlLineApplication application = new DrillSqlLineApplication(
+ "missing.conf", "missing_example.conf");
+ assertTrue(application.getConfig().isEmpty());
+ }
+
+ @Test
+ public void testConfigWithoutOverride() {
+ DrillSqlLineApplication application = new DrillSqlLineApplication(
+ "drill-sqlline-test.conf", "missing_example.conf");
+ assertFalse(application.getConfig().isEmpty());
+ }
+
+}
diff --git a/exec/java-exec/src/test/resources/drill-sqlline-test-override.conf b/exec/java-exec/src/test/resources/drill-sqlline-test-override.conf
new file mode 100644
index 0000000..380785c
--- /dev/null
+++ b/exec/java-exec/src/test/resources/drill-sqlline-test-override.conf
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This file customizes SqlLine application.
+# This file is in HOCON format, see https://github.com/typesafehub/config/blob/master/HOCON.md for more information.
+
+drill.sqlline {
+ quotes: [
+ "all code is guilty until proven innocent"
+ ],
+ connection_url_examples: [
+ "jdbc:drill:zk=local"
+ ],
+ opts: {
+ maxWidth: 20000,
+ timeout: 200
+ }
+}
diff --git a/exec/java-exec/src/test/resources/drill-sqlline-test.conf b/exec/java-exec/src/test/resources/drill-sqlline-test.conf
new file mode 100644
index 0000000..d0d9a89
--- /dev/null
+++ b/exec/java-exec/src/test/resources/drill-sqlline-test.conf
@@ -0,0 +1,40 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This file customizes SqlLine application.
+# This file is in HOCON format, see https://github.com/typesafehub/config/blob/master/HOCON.md for more information.
+
+drill.sqlline {
+ info_message_template: "apache drill %s\n%s",
+ quotes: [
+ "start your sql engine"
+ ],
+ drivers: [
+ org.apache.drill.jdbc.Driver
+ ],
+ connection_url_examples: [
+ "jdbc:drill:drillbit=localhost",
+ "jdbc:drill:zk=local"
+ ],
+ commands.exclude: [
+ describe,
+ indexes
+ ],
+ opts: {
+ incremental: false,
+ isolation: TRANSACTION_NONE,
+ maxWidth: 10000
+ }
+}
diff --git a/exec/jdbc-all/pom.xml b/exec/jdbc-all/pom.xml
index e5124f0..7a6c9ee 100644
--- a/exec/jdbc-all/pom.xml
+++ b/exec/jdbc-all/pom.xml
@@ -168,6 +168,10 @@
<artifactId>metadata-extractor</artifactId>
<groupId>com.drewnoakes</groupId>
</exclusion>
+ <exclusion>
+ <groupId>sqlline</groupId>
+ <artifactId>sqlline</artifactId>
+ </exclusion>
</exclusions>
</dependency>
<dependency>
diff --git a/pom.xml b/pom.xml
index a6e1f41..4d81927 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,7 +49,7 @@
<calcite.version>1.17.0-drill-r1</calcite.version>
<avatica.version>1.12.0</avatica.version>
<janino.version>2.7.6</janino.version>
- <sqlline.version>1.1.9-drill-r7</sqlline.version>
+ <sqlline.version>1.5.0</sqlline.version>
<jackson.version>2.9.5</jackson.version>
<jackson.databind.version>2.9.5</jackson.databind.version>
<zookeeper.version>3.4.12</zookeeper.version>
@@ -2747,11 +2747,6 @@
<version>2.7.1</version>
</dependency>
<dependency>
- <groupId>sqlline</groupId>
- <artifactId>sqlline</artifactId>
- <version>${sqlline.version}</version>
- </dependency>
- <dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-hadoop</artifactId>
<version>${parquet.version}</version>