Propagate alter stats owner

pull/4444/head
Ahmet Gedemenli 2020-12-23 19:28:41 +03:00
parent f7c70f9a63
commit 48ca1637a4
7 changed files with 114 additions and 4 deletions

View File

@ -431,6 +431,13 @@ static DistributeObjectOps Statistics_AlterObjectSchema = {
.postprocess = PostprocessAlterStatisticsSchemaStmt, .postprocess = PostprocessAlterStatisticsSchemaStmt,
.address = AlterStatisticsSchemaStmtObjectAddress, .address = AlterStatisticsSchemaStmtObjectAddress,
}; };
static DistributeObjectOps Statistics_AlterOwner = {
.deparse = DeparseAlterStatisticsOwnerStmt,
.qualify = QualifyAlterStatisticsOwnerStmt,
.preprocess = PreprocessAlterStatisticsOwnerStmt,
.postprocess = NULL,
.address = NULL,
};
static DistributeObjectOps Statistics_Drop = { static DistributeObjectOps Statistics_Drop = {
.deparse = NULL, .deparse = NULL,
.qualify = QualifyDropStatisticsStmt, .qualify = QualifyDropStatisticsStmt,
@ -666,6 +673,11 @@ GetDistributeObjectOps(Node *node)
return &Routine_AlterOwner; return &Routine_AlterOwner;
} }
case OBJECT_STATISTIC_EXT:
{
return &Statistics_AlterOwner;
}
case OBJECT_TYPE: case OBJECT_TYPE:
{ {
return &Type_AlterOwner; return &Type_AlterOwner;

View File

@ -322,8 +322,7 @@ AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk)
/* /*
* PreprocessAlterStatisticsStmt is called during the planning phase for * PreprocessAlterStatisticsStmt is called during the planning phase for
* ALTER STATISTICS .. SET STATISTICS command has been executed * ALTER STATISTICS .. SET STATISTICS.
* by standard process utility.
*/ */
List * List *
PreprocessAlterStatisticsStmt(Node *node, const char *queryString) PreprocessAlterStatisticsStmt(Node *node, const char *queryString)
@ -360,6 +359,43 @@ PreprocessAlterStatisticsStmt(Node *node, const char *queryString)
#endif #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 * GetExplicitStatisticsCommandList returns the list of DDL commands to create

View File

@ -27,6 +27,7 @@ static void AppendAlterStatisticsSchemaStmt(StringInfo buf, AlterObjectSchemaStm
#if PG_VERSION_NUM >= PG_VERSION_13 #if PG_VERSION_NUM >= PG_VERSION_13
static void AppendAlterStatisticsStmt(StringInfo buf, AlterStatsStmt *stmt); static void AppendAlterStatisticsStmt(StringInfo buf, AlterStatsStmt *stmt);
#endif #endif
static void AppendAlterStatisticsOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt);
static void AppendStatisticsName(StringInfo buf, CreateStatsStmt *stmt); static void AppendStatisticsName(StringInfo buf, CreateStatsStmt *stmt);
static void AppendStatTypes(StringInfo buf, CreateStatsStmt *stmt); static void AppendStatTypes(StringInfo buf, CreateStatsStmt *stmt);
static void AppendColumnNames(StringInfo buf, CreateStatsStmt *stmt); static void AppendColumnNames(StringInfo buf, CreateStatsStmt *stmt);
@ -102,6 +103,19 @@ DeparseAlterStatisticsStmt(Node *node)
#endif #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 static void
@ -170,6 +184,14 @@ AppendAlterStatisticsStmt(StringInfo buf, AlterStatsStmt *stmt)
#endif #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 static void

View File

@ -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. * ALTER STATISTICS RENAME statements.
*/ */
void void
@ -125,7 +125,7 @@ QualifyAlterStatisticsSchemaStmt(Node *node)
#if PG_VERSION_NUM >= PG_VERSION_13 #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. * ALTER STATISTICS .. SET STATISTICS statements.
*/ */
void void
@ -144,3 +144,23 @@ QualifyAlterStatisticsStmt(Node *node)
#endif #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);
}
}

View File

@ -213,6 +213,23 @@ RelayEventExtendNames(Node *parseTree, char *schemaName, uint64 shardId)
break; 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: case T_ClusterStmt:
{ {
ClusterStmt *clusterStmt = (ClusterStmt *) parseTree; ClusterStmt *clusterStmt = (ClusterStmt *) parseTree;

View File

@ -287,6 +287,7 @@ extern List * PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryS
extern List * PostprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString); extern List * PostprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString);
extern ObjectAddress AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk); extern ObjectAddress AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk);
extern List * PreprocessAlterStatisticsStmt(Node *node, const char *queryString); extern List * PreprocessAlterStatisticsStmt(Node *node, const char *queryString);
extern List * PreprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString);
extern List * GetExplicitStatisticsCommandList(Oid relationId); extern List * GetExplicitStatisticsCommandList(Oid relationId);
extern List * GetExplicitStatisticsSchemaIdList(Oid relationId); extern List * GetExplicitStatisticsSchemaIdList(Oid relationId);

View File

@ -61,12 +61,14 @@ extern char * DeparseDropStatisticsStmt(List *nameList, bool ifExists);
extern char * DeparseAlterStatisticsRenameStmt(Node *node); extern char * DeparseAlterStatisticsRenameStmt(Node *node);
extern char * DeparseAlterStatisticsSchemaStmt(Node *node); extern char * DeparseAlterStatisticsSchemaStmt(Node *node);
extern char * DeparseAlterStatisticsStmt(Node *node); extern char * DeparseAlterStatisticsStmt(Node *node);
extern char * DeparseAlterStatisticsOwnerStmt(Node *node);
extern void QualifyCreateStatisticsStmt(Node *node); extern void QualifyCreateStatisticsStmt(Node *node);
extern void QualifyDropStatisticsStmt(Node *node); extern void QualifyDropStatisticsStmt(Node *node);
extern void QualifyAlterStatisticsRenameStmt(Node *node); extern void QualifyAlterStatisticsRenameStmt(Node *node);
extern void QualifyAlterStatisticsSchemaStmt(Node *node); extern void QualifyAlterStatisticsSchemaStmt(Node *node);
extern void QualifyAlterStatisticsStmt(Node *node); extern void QualifyAlterStatisticsStmt(Node *node);
extern void QualifyAlterStatisticsOwnerStmt(Node *node);
/* forward declarations for deparse_type_stmts.c */ /* forward declarations for deparse_type_stmts.c */
extern char * DeparseCompositeTypeStmt(Node *stmt); extern char * DeparseCompositeTypeStmt(Node *stmt);