public TDdlExecResponse execDdlRequest()

in fe/src/main/java/org/apache/impala/service/CatalogOpExecutor.java [431:664]


  public TDdlExecResponse execDdlRequest(TDdlExecRequest ddlRequest)
      throws ImpalaException {
    EventSequence catalogTimeline = new EventSequence(CATALOG_TIMELINE_NAME);
    TDdlExecResponse response = new TDdlExecResponse();
    response.setResult(new TCatalogUpdateResult());
    response.getResult().setCatalog_service_id(JniCatalog.getServiceId());
    User requestingUser = null;
    TUniqueId queryId = null;
    boolean wantMinimalResult = false;
    if (ddlRequest.isSetHeader()) {
      TCatalogServiceRequestHeader header = ddlRequest.getHeader();
      if (header.isSetRequesting_user()) {
        requestingUser = new User(ddlRequest.getHeader().getRequesting_user());
      }
      wantMinimalResult = ddlRequest.getHeader().isWant_minimal_response();
      queryId = header.getQuery_id();
    }
    Optional<TTableName> tTableName = Optional.empty();
    TDdlType ddlType = ddlRequest.ddl_type;
    try {
      boolean syncDdl = ddlRequest.getQuery_options().isSync_ddl();
      String debugAction = ddlRequest.getQuery_options().getDebug_action();
      switch (ddlType) {
        case ALTER_DATABASE:
          TAlterDbParams alter_db_params = ddlRequest.getAlter_db_params();
          tTableName = Optional.of(new TTableName(alter_db_params.db, ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          alterDatabase(alter_db_params, wantMinimalResult, response, catalogTimeline);
          break;
        case ALTER_TABLE:
          TAlterTableParams alter_table_params = ddlRequest.getAlter_table_params();
          tTableName = Optional.of(alter_table_params.getTable_name());
          catalogOpTracker_.increment(ddlRequest, tTableName);
          alterTable(alter_table_params, debugAction, wantMinimalResult, response,
              catalogTimeline);
          break;
        case ALTER_VIEW:
          TCreateOrAlterViewParams alter_view_params = ddlRequest.getAlter_view_params();
          tTableName = Optional.of(alter_view_params.getView_name());
          catalogOpTracker_.increment(ddlRequest, tTableName);
          alterView(alter_view_params, wantMinimalResult, response, catalogTimeline);
          break;
        case CREATE_DATABASE:
          TCreateDbParams create_db_params = ddlRequest.getCreate_db_params();
          tTableName = Optional.of(new TTableName(create_db_params.db, ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          createDatabase(create_db_params, response, catalogTimeline, syncDdl,
              wantMinimalResult);
          break;
        case CREATE_TABLE_AS_SELECT:
          TCreateTableParams create_table_as_select_params =
              ddlRequest.getCreate_table_params();
          tTableName = Optional.of(create_table_as_select_params.getTable_name());
          catalogOpTracker_.increment(ddlRequest, tTableName);
          response.setNew_table_created(createTable(create_table_as_select_params,
              response, catalogTimeline, syncDdl, wantMinimalResult, debugAction));
          break;
        case CREATE_TABLE:
          TCreateTableParams create_table_params = ddlRequest.getCreate_table_params();
          tTableName = Optional.of((create_table_params.getTable_name()));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          createTable(ddlRequest.getCreate_table_params(), response, catalogTimeline,
              syncDdl, wantMinimalResult, debugAction);
          break;
        case CREATE_TABLE_LIKE:
          TCreateTableLikeParams create_table_like_params =
              ddlRequest.getCreate_table_like_params();
          tTableName = Optional.of(create_table_like_params.getTable_name());
          catalogOpTracker_.increment(ddlRequest, tTableName);
          createTableLike(create_table_like_params, response, catalogTimeline, syncDdl,
              wantMinimalResult, debugAction);
          break;
        case CREATE_VIEW:
          TCreateOrAlterViewParams create_view_params =
              ddlRequest.getCreate_view_params();
          tTableName = Optional.of(create_view_params.getView_name());
          catalogOpTracker_.increment(ddlRequest, tTableName);
          createView(create_view_params, wantMinimalResult, response, catalogTimeline);
          break;
        case CREATE_FUNCTION:
          TCreateFunctionParams create_func_params = ddlRequest.getCreate_fn_params();
          TFunctionName fnName = create_func_params.getFn().getName();
          tTableName = Optional.of(new TTableName(fnName.db_name, fnName.function_name));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          createFunction(ddlRequest.getCreate_fn_params(), response, catalogTimeline);
          break;
        case CREATE_DATA_SOURCE:
          TCreateDataSourceParams create_ds_params =
              ddlRequest.getCreate_data_source_params();
          tTableName = Optional.of(
              new TTableName(create_ds_params.getData_source().name, ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          createDataSource(create_ds_params, response);
          break;
        case COMPUTE_STATS:
          Preconditions.checkState(false, "Compute stats should trigger an ALTER TABLE.");
          break;
        case DROP_STATS:
          TDropStatsParams drop_stats_params = ddlRequest.getDrop_stats_params();
          tTableName = Optional.of(drop_stats_params.getTable_name());
          catalogOpTracker_.increment(ddlRequest, tTableName);
          dropStats(drop_stats_params, wantMinimalResult, response, catalogTimeline,
              ddlRequest.getQuery_options().getDebug_action());
          break;
        case DROP_DATABASE:
          TDropDbParams drop_db_params = ddlRequest.getDrop_db_params();
          tTableName = Optional.of(new TTableName(drop_db_params.getDb(), ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          dropDatabase(drop_db_params, response,
              ddlRequest.getQuery_options().getKudu_table_reserve_seconds(),
              catalogTimeline);
          break;
        case DROP_TABLE:
        case DROP_VIEW:
          TDropTableOrViewParams drop_table_or_view_params =
              ddlRequest.getDrop_table_or_view_params();
          tTableName = Optional.of(drop_table_or_view_params.getTable_name());
          catalogOpTracker_.increment(ddlRequest, tTableName);
          // Dropped tables and views are already returned as minimal results, so don't
          // need to pass down wantMinimalResult here.
          dropTableOrView(drop_table_or_view_params, response,
              ddlRequest.getQuery_options().getLock_max_wait_time_s(),
              ddlRequest.getQuery_options().getKudu_table_reserve_seconds(),
              catalogTimeline);
          break;
        case TRUNCATE_TABLE:
          TTruncateParams truncate_params = ddlRequest.getTruncate_params();
          tTableName = Optional.of(truncate_params.getTable_name());
          catalogOpTracker_.increment(ddlRequest, tTableName);
          truncateTable(truncate_params, wantMinimalResult, response,
              ddlRequest.getQuery_options().getLock_max_wait_time_s(), catalogTimeline,
              ddlRequest.getQuery_options().getDebug_action());
          break;
        case DROP_FUNCTION:
          TDropFunctionParams drop_func_params = ddlRequest.getDrop_fn_params();
          TFunctionName dropFnName = drop_func_params.getFn_name();
          tTableName = Optional.of(
              new TTableName(dropFnName.db_name, dropFnName.function_name));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          dropFunction(ddlRequest.getDrop_fn_params(), response, catalogTimeline);
          break;
        case DROP_DATA_SOURCE:
          TDropDataSourceParams drop_ds_params = ddlRequest.getDrop_data_source_params();
          tTableName = Optional.of(new TTableName(drop_ds_params.data_source, ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          dropDataSource(drop_ds_params, response);
          break;
        case CREATE_ROLE:
          TCreateDropRoleParams create_role_params =
              ddlRequest.getCreate_drop_role_params();
          tTableName = Optional.of(new TTableName(create_role_params.role_name, ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          createRole(requestingUser, create_role_params, response);
          break;
        case DROP_ROLE:
          TCreateDropRoleParams drop_role_params =
            ddlRequest.getCreate_drop_role_params();
          tTableName = Optional.of(new TTableName(drop_role_params.role_name, ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          dropRole(requestingUser, drop_role_params, response);
          break;
        case GRANT_ROLE:
          TGrantRevokeRoleParams grant_role_params =
              ddlRequest.getGrant_revoke_role_params();
          tTableName = Optional.of(new TTableName(
              StringUtils.join(",", grant_role_params.group_names), ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          grantRoleToGroup(requestingUser, grant_role_params, response);
          break;
        case REVOKE_ROLE:
          TGrantRevokeRoleParams revoke_role_params =
              ddlRequest.getGrant_revoke_role_params();
          tTableName = Optional.of(new TTableName(
              StringUtils.join(",", revoke_role_params.group_names), ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          revokeRoleFromGroup(
              requestingUser, revoke_role_params, response);
          break;
        case GRANT_PRIVILEGE:
          TGrantRevokePrivParams grant_priv_params =
              ddlRequest.getGrant_revoke_priv_params();
          tTableName = Optional.of(new TTableName(grant_priv_params.principal_name, ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          grantPrivilege(ddlRequest.getHeader(), grant_priv_params, response);
          break;
        case REVOKE_PRIVILEGE:
          TGrantRevokePrivParams revoke_priv_params =
              ddlRequest.getGrant_revoke_priv_params();
          tTableName = Optional.of(new TTableName(revoke_priv_params.principal_name, ""));
          catalogOpTracker_.increment(ddlRequest, tTableName);
          revokePrivilege(ddlRequest.getHeader(), revoke_priv_params, response);
          break;
        case COMMENT_ON:
          tTableName = Optional.of(new TTableName("", ""));
          alterCommentOn(ddlRequest, response, tTableName, wantMinimalResult,
              catalogTimeline);
          break;
        case COPY_TESTCASE:
          catalogOpTracker_.increment(ddlRequest, Optional.empty());
          copyTestCaseData(ddlRequest.getCopy_test_case_params(), response,
              wantMinimalResult);
          break;
        default:
          catalogOpTracker_.increment(ddlRequest, Optional.empty());
          throw new IllegalStateException(
              "Unexpected DDL exec request type: " + ddlType);
      }
      catalogTimeline.markEvent(DDL_FINISHED);

      // If SYNC_DDL is set, set the catalog update that contains the results of this DDL
      // operation. The version of this catalog update is returned to the requesting
      // impalad which will wait until this catalog update has been broadcast to all the
      // coordinators.
      if (syncDdl) {
        response.getResult().setVersion(
            catalog_.waitForSyncDdlVersion(response.getResult()));
        catalogTimeline.markEvent(SENT_CATALOG_FOR_SYNC_DDL);
      }

      TRuntimeProfileNode profile = Frontend.createTRuntimeProfileNode("CatalogOp");
      profile.addToEvent_sequences(catalogTimeline.toThrift());
      response.setProfile(profile);
      // At this point, the operation is considered successful. If any errors occurred
      // during execution, this function will throw an exception and the CatalogServer
      // will handle setting a bad status code.
      response.getResult().setStatus(new TStatus(TErrorCode.OK, new ArrayList<>()));
      catalogOpTracker_.decrement(ddlType, queryId, tTableName, /*exception*/null);
    } catch (Exception e) {
      catalogOpTracker_.decrement(ddlType, queryId, tTableName,
          JniUtil.throwableToString(e));
      throw e;
    }
    return response;
  }