[ https://issues.apache.org/jira/browse/DRILL-4956?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15800066#comment-15800066 ]
ASF GitHub Bot commented on DRILL-4956: --------------------------------------- Github user paul-rogers commented on a diff in the pull request: https://github.com/apache/drill/pull/666#discussion_r94703966 --- Diff: exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DropTableHandler.java --- @@ -55,35 +58,79 @@ public DropTableHandler(SqlHandlerConfig config) { */ @Override public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, RelConversionException, IOException { - SqlDropTable dropTableNode = ((SqlDropTable) sqlNode); - SqlIdentifier tableIdentifier = dropTableNode.getTableIdentifier(); - + String originalTableName = dropTableNode.getName(); SchemaPlus defaultSchema = config.getConverter().getDefaultSchema(); - AbstractSchema drillSchema = null; + List<String> tableSchema = dropTableNode.getSchema(); + + boolean removedTemporaryTable = removeTemporaryTable(defaultSchema, tableSchema, originalTableName); + // if table to be dropped is not temporary table, we need to check among persistent tables or views + if (!removedTemporaryTable) { + AbstractSchema drillSchema = SchemaUtilites.resolveToMutableDrillSchema(defaultSchema, tableSchema); + Table tableToDrop = SqlHandlerUtil.getTableFromSchema(drillSchema, originalTableName); + if (tableToDrop == null || tableToDrop.getJdbcTableType() != Schema.TableType.TABLE) { + if (dropTableNode.checkTableExistence()) { + return DirectPlan.createDirectPlan(context, false, String.format("Table [%s] not found", originalTableName)); + } else { + throw UserException.validationError().message("Table [%s] not found", originalTableName).build(logger); + } + } - if (tableIdentifier != null) { - drillSchema = SchemaUtilites.resolveToMutableDrillSchema(defaultSchema, dropTableNode.getSchema()); + try { + drillSchema.dropTable(originalTableName); + } catch (Exception e) { + // concurrency check: we might have failed because somebody has already dropped the table + if (SqlHandlerUtil.getTableFromSchema(drillSchema, originalTableName) != null) { + throw e; + } + } } - String tableName = dropTableNode.getName(); - if (drillSchema == null) { - throw UserException.validationError() - .message("Invalid table_name [%s]", tableName) - .build(logger); + String message = String.format("%s [%s] dropped", + removedTemporaryTable ? "Temporary table" : "Table", originalTableName); + logger.info(message); + return DirectPlan.createDirectPlan(context, true, message); + } + + /** + * If used workspace is default temporary workspace and temporary table is found, + * drops the table and removes it from session temporary tables list. + * + * @param defaultSchema default schema + * @param tableSchema table schema indicated in drop statement + * @param tableName table name to drop + * @return true if temporary table existed and was dropped, false otherwise + */ + private boolean removeTemporaryTable(SchemaPlus defaultSchema, List<String> tableSchema, String tableName) { + String temporaryWorkspace = context.getConfig().getString(ExecConstants.DEFAULT_TEMPORARY_WORKSPACE); + + // look for temporary table only if default temporary workspace is used + if (!(tableSchema.isEmpty() || SchemaUtilites.getSchemaPath(tableSchema).equals(temporaryWorkspace))) { + return false; } - if (dropTableNode.checkTableExistence()) { - final Table tableToDrop = SqlHandlerUtil.getTableFromSchema(drillSchema, tableName); - if (tableToDrop == null || tableToDrop.getJdbcTableType() != Schema.TableType.TABLE) { - return DirectPlan.createDirectPlan(context, true, - String.format("Table [%s] not found", tableName)); - } + String temporaryTable = context.getSession().findTemporaryTable(tableName); + if (temporaryTable == null) { + return false; --- End diff -- Here we return false if the name is a temp table, but the temp table does not exist. This sends us down the non-temp table path in the above method. Since the table won't exist there, the user will get an error. I wonder if this can be written as ``` if ( temp table ) { go down temp route } else { go down non-temp route } ``` > Temporary tables support > ------------------------ > > Key: DRILL-4956 > URL: https://issues.apache.org/jira/browse/DRILL-4956 > Project: Apache Drill > Issue Type: Improvement > Affects Versions: 1.8.0 > Reporter: Arina Ielchiieva > Assignee: Arina Ielchiieva > Labels: doc-impacting > Fix For: Future > > > Link to design doc - > https://docs.google.com/document/d/1gSRo_w6q2WR5fPx7SsQ5IaVmJXJ6xCOJfYGyqpVOC-g/edit -- This message was sent by Atlassian JIRA (v6.3.4#6332)