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;
}