[ 
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)

Reply via email to