diff --git a/src/backend/distributed/commands/distribute_object_ops.c b/src/backend/distributed/commands/distribute_object_ops.c index 258986327..dd456ec4d 100644 --- a/src/backend/distributed/commands/distribute_object_ops.c +++ b/src/backend/distributed/commands/distribute_object_ops.c @@ -431,6 +431,13 @@ static DistributeObjectOps Statistics_AlterObjectSchema = { .postprocess = PostprocessAlterStatisticsSchemaStmt, .address = AlterStatisticsSchemaStmtObjectAddress, }; +static DistributeObjectOps Statistics_AlterOwner = { + .deparse = DeparseAlterStatisticsOwnerStmt, + .qualify = QualifyAlterStatisticsOwnerStmt, + .preprocess = PreprocessAlterStatisticsOwnerStmt, + .postprocess = NULL, + .address = NULL, +}; static DistributeObjectOps Statistics_Drop = { .deparse = NULL, .qualify = QualifyDropStatisticsStmt, @@ -666,6 +673,11 @@ GetDistributeObjectOps(Node *node) return &Routine_AlterOwner; } + case OBJECT_STATISTIC_EXT: + { + return &Statistics_AlterOwner; + } + case OBJECT_TYPE: { return &Type_AlterOwner; diff --git a/src/backend/distributed/commands/statistics.c b/src/backend/distributed/commands/statistics.c index 95c63d900..7476b8ca9 100644 --- a/src/backend/distributed/commands/statistics.c +++ b/src/backend/distributed/commands/statistics.c @@ -322,8 +322,7 @@ AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk) /* * PreprocessAlterStatisticsStmt is called during the planning phase for - * ALTER STATISTICS .. SET STATISTICS command has been executed - * by standard process utility. + * ALTER STATISTICS .. SET STATISTICS. */ List * PreprocessAlterStatisticsStmt(Node *node, const char *queryString) @@ -360,6 +359,43 @@ PreprocessAlterStatisticsStmt(Node *node, const char *queryString) #endif +/* + * PreprocessAlterStatisticsOwnerStmt is called during the planning phase for + * ALTER STATISTICS .. OWNER TO. + */ +List * +PreprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString) +{ + AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, node); + Assert(stmt->objectType == OBJECT_STATISTIC_EXT); + + Oid statsOid = get_statistics_object_oid((List *) stmt->object, false); + Oid relationId = GetRelIdByStatsOid(statsOid); + + if (!IsCitusTable(relationId) || !ShouldPropagate()) + { + return NIL; + } + + EnsureCoordinator(); + + QualifyTreeNode((Node *) stmt); + + char *ddlCommand = DeparseTreeNode((Node *) stmt); + + DDLJob *ddlJob = palloc0(sizeof(DDLJob)); + + ddlJob->targetRelationId = relationId; + ddlJob->concurrentIndexCmd = false; + ddlJob->startNewTransaction = false; + ddlJob->commandString = ddlCommand; + ddlJob->taskList = DDLTaskList(relationId, ddlCommand); + + List *ddlJobs = list_make1(ddlJob); + + return ddlJobs; +} + /* * GetExplicitStatisticsCommandList returns the list of DDL commands to create diff --git a/src/backend/distributed/deparser/deparse_statistics_stmts.c b/src/backend/distributed/deparser/deparse_statistics_stmts.c index 1473980db..74350c766 100644 --- a/src/backend/distributed/deparser/deparse_statistics_stmts.c +++ b/src/backend/distributed/deparser/deparse_statistics_stmts.c @@ -27,6 +27,7 @@ static void AppendAlterStatisticsSchemaStmt(StringInfo buf, AlterObjectSchemaStm #if PG_VERSION_NUM >= PG_VERSION_13 static void AppendAlterStatisticsStmt(StringInfo buf, AlterStatsStmt *stmt); #endif +static void AppendAlterStatisticsOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt); static void AppendStatisticsName(StringInfo buf, CreateStatsStmt *stmt); static void AppendStatTypes(StringInfo buf, CreateStatsStmt *stmt); static void AppendColumnNames(StringInfo buf, CreateStatsStmt *stmt); @@ -102,6 +103,19 @@ DeparseAlterStatisticsStmt(Node *node) #endif +char * +DeparseAlterStatisticsOwnerStmt(Node *node) +{ + AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, node); + Assert(stmt->objectType == OBJECT_STATISTIC_EXT); + + StringInfoData str; + initStringInfo(&str); + + AppendAlterStatisticsOwnerStmt(&str, stmt); + + return str.data; +} static void @@ -170,6 +184,14 @@ AppendAlterStatisticsStmt(StringInfo buf, AlterStatsStmt *stmt) #endif +static void +AppendAlterStatisticsOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt) +{ + List *names = (List *) stmt->object; + appendStringInfo(buf, "ALTER STATISTICS %s OWNER TO %s;", NameListToQuotedString( + names), + RoleSpecString(stmt->newowner, true)); +} static void diff --git a/src/backend/distributed/deparser/qualify_statistics_stmt.c b/src/backend/distributed/deparser/qualify_statistics_stmt.c index ad60b42a3..2a8cb1eaa 100644 --- a/src/backend/distributed/deparser/qualify_statistics_stmt.c +++ b/src/backend/distributed/deparser/qualify_statistics_stmt.c @@ -102,7 +102,7 @@ QualifyAlterStatisticsRenameStmt(Node *node) /* - * QualifyAlterStatisticsSchemaStmt qualifies RenameStmt's with schema name for + * QualifyAlterStatisticsSchemaStmt qualifies AlterObjectSchemaStmt's with schema name for * ALTER STATISTICS RENAME statements. */ void @@ -125,7 +125,7 @@ QualifyAlterStatisticsSchemaStmt(Node *node) #if PG_VERSION_NUM >= PG_VERSION_13 /* - * QualifyAlterStatisticsStmt qualifies AlterObjectSchemaStmt's with schema name for + * QualifyAlterStatisticsStmt qualifies AlterStatsStmt's with schema name for * ALTER STATISTICS .. SET STATISTICS statements. */ void @@ -144,3 +144,23 @@ QualifyAlterStatisticsStmt(Node *node) #endif + +/* + * QualifyAlterStatisticsStmt qualifies AlterOwnerStmt's with schema name for + * ALTER STATISTICS .. OWNER TO statements. + */ +void +QualifyAlterStatisticsOwnerStmt(Node *node) +{ + AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, node); + Assert(stmt->objectType == OBJECT_STATISTIC_EXT); + + List *nameList = (List *) stmt->object; + if (list_length(nameList) == 1) + { + RangeVar *stat = makeRangeVarFromNameList(nameList); + Oid schemaOid = RangeVarGetCreationNamespace(stat); + stat->schemaname = get_namespace_name(schemaOid); + stmt->object = (Node *) MakeNameListFromRangeVar(stat); + } +} diff --git a/src/backend/distributed/relay/relay_event_utility.c b/src/backend/distributed/relay/relay_event_utility.c index 6db69297b..6cc8ab1ca 100644 --- a/src/backend/distributed/relay/relay_event_utility.c +++ b/src/backend/distributed/relay/relay_event_utility.c @@ -213,6 +213,23 @@ RelayEventExtendNames(Node *parseTree, char *schemaName, uint64 shardId) break; } + case T_AlterOwnerStmt: + { + AlterOwnerStmt *alterOwnerStmt = castNode(AlterOwnerStmt, parseTree); + + /* we currently extend names in alter owner statements only for statistics */ + Assert(alterOwnerStmt->objectType == OBJECT_STATISTIC_EXT); + + RangeVar *stat = makeRangeVarFromNameList((List *) alterOwnerStmt->object); + + AppendShardIdToName(&stat->relname, shardId); + SetSchemaNameIfNotExist(&stat->schemaname, schemaName); + + alterOwnerStmt->object = (Node *) MakeNameListFromRangeVar(stat); + + break; + } + case T_ClusterStmt: { ClusterStmt *clusterStmt = (ClusterStmt *) parseTree; diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index e25aee2d2..338f3f25c 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -287,6 +287,7 @@ extern List * PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryS extern List * PostprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString); extern ObjectAddress AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk); extern List * PreprocessAlterStatisticsStmt(Node *node, const char *queryString); +extern List * PreprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString); extern List * GetExplicitStatisticsCommandList(Oid relationId); extern List * GetExplicitStatisticsSchemaIdList(Oid relationId); diff --git a/src/include/distributed/deparser.h b/src/include/distributed/deparser.h index 7ff42b6e3..7e264544c 100644 --- a/src/include/distributed/deparser.h +++ b/src/include/distributed/deparser.h @@ -61,12 +61,14 @@ extern char * DeparseDropStatisticsStmt(List *nameList, bool ifExists); extern char * DeparseAlterStatisticsRenameStmt(Node *node); extern char * DeparseAlterStatisticsSchemaStmt(Node *node); extern char * DeparseAlterStatisticsStmt(Node *node); +extern char * DeparseAlterStatisticsOwnerStmt(Node *node); extern void QualifyCreateStatisticsStmt(Node *node); extern void QualifyDropStatisticsStmt(Node *node); extern void QualifyAlterStatisticsRenameStmt(Node *node); extern void QualifyAlterStatisticsSchemaStmt(Node *node); extern void QualifyAlterStatisticsStmt(Node *node); +extern void QualifyAlterStatisticsOwnerStmt(Node *node); /* forward declarations for deparse_type_stmts.c */ extern char * DeparseCompositeTypeStmt(Node *stmt);