This is an automated email from the ASF dual-hosted git repository.

vitalii pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git

commit 1df935f8f4ed0635ceb38f42fc5b5387c49bdf73
Author: Arina Ielchiieva <[email protected]>
AuthorDate: Wed Dec 19 15:01:59 2018 +0200

    DRILL-6913: Fix multiple error output in the console
    
    1. Bump up Calcite version to 1.17.0-drill-r2 (includes CALCITE-2463).
    2. Optimized exception handling in DrillSqlWorker getPlan method.
    
    closes #1578
---
 .../drill/exec/planner/sql/DrillSqlWorker.java     | 107 ++++++++++++---------
 pom.xml                                            |   2 +-
 2 files changed, 61 insertions(+), 48 deletions(-)

diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java
index 7a4fcdf..c7963a5 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java
@@ -64,6 +64,34 @@ public class DrillSqlWorker {
 
   /**
    * Converts sql query string into query physical plan.
+   * Catches various exceptions and converts them into user exception when 
possible.
+   *
+   * @param context query context
+   * @param sql sql query
+   * @param textPlan text plan
+   * @return query physical plan
+   */
+  public static PhysicalPlan getPlan(QueryContext context, String sql, 
Pointer<String> textPlan) throws ForemanSetupException {
+    try {
+      return convertPlan(context, sql, textPlan);
+    } catch (ValidationException e) {
+      String errorMessage = e.getCause() != null ? e.getCause().getMessage() : 
e.getMessage();
+      throw UserException.validationError(e)
+        .message(errorMessage)
+        .build(logger);
+    } catch (AccessControlException e) {
+      throw UserException.permissionError(e)
+        .build(logger);
+    } catch (SqlUnsupportedException e) {
+      throw UserException.unsupportedError(e)
+        .build(logger);
+    } catch (IOException | RelConversionException e) {
+      throw new QueryInputException("Failure handling SQL.", e);
+    }
+  }
+
+  /**
+   * Converts sql query string into query physical plan.
    * In case of any errors (that might occur due to missing function 
implementation),
    * checks if local function registry should be synchronized with remote 
function registry.
    * If sync took place, reloads drill operator table
@@ -75,7 +103,8 @@ public class DrillSqlWorker {
    * @param textPlan text plan
    * @return query physical plan
    */
-  public static PhysicalPlan getPlan(QueryContext context, String sql, 
Pointer<String> textPlan) throws ForemanSetupException {
+  private static PhysicalPlan convertPlan(QueryContext context, String sql, 
Pointer<String> textPlan)
+      throws ForemanSetupException, RelConversionException, IOException, 
ValidationException {
     Pointer<String> textPlanCopy = textPlan == null ? null : new 
Pointer<>(textPlan.value);
     try {
       return getQueryPlan(context, sql, textPlan);
@@ -102,47 +131,46 @@ public class DrillSqlWorker {
    * @return query physical plan
    */
   private static PhysicalPlan getQueryPlan(QueryContext context, String sql, 
Pointer<String> textPlan)
-      throws ForemanSetupException {
+      throws ForemanSetupException, RelConversionException, IOException, 
ValidationException {
 
     final SqlConverter parser = new SqlConverter(context);
-
     injector.injectChecked(context.getExecutionControls(), "sql-parsing", 
ForemanSetupException.class);
     final SqlNode sqlNode = parser.parse(sql);
     final AbstractSqlHandler handler;
     final SqlHandlerConfig config = new SqlHandlerConfig(context, parser);
 
     switch(sqlNode.getKind()) {
-    case EXPLAIN:
-      handler = new ExplainHandler(config, textPlan);
-      break;
-    case SET_OPTION:
-      handler = new SetOptionHandler(context);
-      break;
-    case DESCRIBE_TABLE:
-      if (sqlNode instanceof DrillSqlDescribeTable) {
-        handler = new DescribeTableHandler(config);
+      case EXPLAIN:
+        handler = new ExplainHandler(config, textPlan);
         break;
-      }
-    case DESCRIBE_SCHEMA:
-      if (sqlNode instanceof SqlDescribeSchema) {
-        handler = new DescribeSchemaHandler(config);
+      case SET_OPTION:
+        handler = new SetOptionHandler(context);
         break;
-      }
-    case CREATE_TABLE:
-      handler = ((DrillSqlCall) sqlNode).getSqlHandler(config, textPlan);
-      break;
-    case DROP_TABLE:
-    case CREATE_VIEW:
-    case DROP_VIEW:
-    case OTHER_DDL:
-    case OTHER:
-      if (sqlNode instanceof DrillSqlCall) {
-        handler = ((DrillSqlCall) sqlNode).getSqlHandler(config);
+      case DESCRIBE_TABLE:
+        if (sqlNode instanceof DrillSqlDescribeTable) {
+          handler = new DescribeTableHandler(config);
+          break;
+        }
+      case DESCRIBE_SCHEMA:
+        if (sqlNode instanceof SqlDescribeSchema) {
+          handler = new DescribeSchemaHandler(config);
+          break;
+        }
+      case CREATE_TABLE:
+        handler = ((DrillSqlCall) sqlNode).getSqlHandler(config, textPlan);
         break;
-      }
-      // fallthrough
-    default:
-      handler = new DefaultSqlHandler(config, textPlan);
+      case DROP_TABLE:
+      case CREATE_VIEW:
+      case DROP_VIEW:
+      case OTHER_DDL:
+      case OTHER:
+        if (sqlNode instanceof DrillSqlCall) {
+          handler = ((DrillSqlCall) sqlNode).getSqlHandler(config);
+          break;
+        }
+        // fallthrough
+      default:
+        handler = new DefaultSqlHandler(config, textPlan);
     }
 
     boolean returnResultSet = 
context.getOptions().getBoolean(ExecConstants.RETURN_RESULT_SET_FOR_DDL);
@@ -151,21 +179,6 @@ public class DrillSqlWorker {
     
context.getOptions().setLocalOption(ExecConstants.RETURN_RESULT_SET_FOR_DDL,
         returnResultSet || !SqlKind.DDL.contains(sqlNode.getKind()));
 
-    try {
-      return handler.getPlan(sqlNode);
-    } catch(ValidationException e) {
-      String errorMessage = e.getCause() != null ? e.getCause().getMessage() : 
e.getMessage();
-      throw UserException.validationError(e)
-          .message(errorMessage)
-          .build(logger);
-    } catch (AccessControlException e) {
-      throw UserException.permissionError(e)
-          .build(logger);
-    } catch(SqlUnsupportedException e) {
-      throw UserException.unsupportedError(e)
-          .build(logger);
-    } catch (IOException | RelConversionException e) {
-      throw new QueryInputException("Failure handling SQL.", e);
-    }
+    return handler.getPlan(sqlNode);
   }
 }
diff --git a/pom.xml b/pom.xml
index 01ca3e3..1d9b29b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,7 +50,7 @@
     <guava.version>19.0</guava.version>
     <forkCount>2</forkCount>
     <parquet.version>1.10.0</parquet.version>
-    <calcite.version>1.17.0-drill-r1</calcite.version>
+    <calcite.version>1.17.0-drill-r2</calcite.version>
     <avatica.version>1.12.0</avatica.version>
     <janino.version>3.0.11</janino.version>
     <sqlline.version>1.6.0</sqlline.version>

Reply via email to