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>
