Propagate rename statistics

pull/4444/head
Ahmet Gedemenli 2020-12-23 14:46:46 +03:00
parent 5ed9197041
commit bdce4a7e67
9 changed files with 122 additions and 3 deletions

View File

@ -414,6 +414,13 @@ static DistributeObjectOps Schema_Rename = {
.postprocess = NULL, .postprocess = NULL,
.address = AlterSchemaRenameStmtObjectAddress, .address = AlterSchemaRenameStmtObjectAddress,
}; };
static DistributeObjectOps Statistics_Rename = {
.deparse = DeparseAlterStatisticsRenameStmt,
.qualify = QualifyAlterStatisticsRenameStmt,
.preprocess = PreprocessAlterStatisticsRenameStmt,
.postprocess = NULL,
.address = NULL,
};
static DistributeObjectOps Statistics_Drop = { static DistributeObjectOps Statistics_Drop = {
.deparse = NULL, .deparse = NULL,
.qualify = QualifyDropStatisticsStmt, .qualify = QualifyDropStatisticsStmt,
@ -907,6 +914,11 @@ GetDistributeObjectOps(Node *node)
return &Schema_Rename; return &Schema_Rename;
} }
case OBJECT_STATISTIC_EXT:
{
return &Statistics_Rename;
}
case OBJECT_TYPE: case OBJECT_TYPE:
{ {
return &Type_Rename; return &Type_Rename;

View File

@ -190,6 +190,44 @@ PreprocessDropStatisticsStmt(Node *node, const char *queryString)
} }
/*
* PreprocessAlterStatisticsRenameStmt is called during the planning phase for
* ALTER STATISTICS RENAME.
*/
List *
PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryString)
{
RenameStmt *renameStmt = castNode(RenameStmt, node);
Assert(renameStmt->renameType == OBJECT_STATISTIC_EXT);
Oid statsOid = get_statistics_object_oid((List *) renameStmt->object, false);
Oid relationId = GetRelIdByStatsOid(statsOid);
if (!IsCitusTable(relationId) || !ShouldPropagate())
{
return NIL;
}
EnsureCoordinator();
QualifyTreeNode((Node *) renameStmt);
char *ddlCommand = DeparseTreeNode((Node *) renameStmt);
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
* statistics that are explicitly created for the table with relationId. See * statistics that are explicitly created for the table with relationId. See
@ -207,7 +245,8 @@ GetExplicitStatisticsCommandList(Oid relationId)
Oid statisticsId = InvalidOid; Oid statisticsId = InvalidOid;
foreach_oid(statisticsId, statisticsIdList) foreach_oid(statisticsId, statisticsIdList)
{ {
char *createStatisticsCommand = pg_get_statisticsobj_worker(statisticsId, false); char *createStatisticsCommand = pg_get_statisticsobj_worker(statisticsId,
false);
createStatisticsCommandList = lappend( createStatisticsCommandList = lappend(
createStatisticsCommandList, createStatisticsCommandList,

View File

@ -26,6 +26,7 @@ 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);
static void AppendTableName(StringInfo buf, CreateStatsStmt *stmt); static void AppendTableName(StringInfo buf, CreateStatsStmt *stmt);
static void AppendAlterStatisticsRenameStmt(StringInfo buf, RenameStmt *stmt);
char * char *
DeparseCreateStatisticsStmt(Node *node) DeparseCreateStatisticsStmt(Node *node)
@ -53,6 +54,20 @@ DeparseDropStatisticsStmt(List *nameList, bool ifExists)
} }
char *
DeparseAlterStatisticsRenameStmt(Node *node)
{
RenameStmt *stmt = castNode(RenameStmt, node);
StringInfoData str;
initStringInfo(&str);
AppendAlterStatisticsRenameStmt(&str, stmt);
return str.data;
}
static void static void
AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt) AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt)
{ {
@ -74,8 +89,6 @@ AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt)
appendStringInfoString(buf, " FROM "); appendStringInfoString(buf, " FROM ");
AppendTableName(buf, stmt); AppendTableName(buf, stmt);
appendStringInfoString(buf, ";");
} }
@ -93,6 +106,14 @@ AppendDropStatisticsStmt(StringInfo buf, List *nameList, bool ifExists)
} }
static void
AppendAlterStatisticsRenameStmt(StringInfo buf, RenameStmt *stmt)
{
appendStringInfo(buf, "ALTER STATISTICS %s RENAME TO %s",
NameListToQuotedString((List *) stmt->object), stmt->newname);
}
static void static void
AppendStatisticsName(StringInfo buf, CreateStatsStmt *stmt) AppendStatisticsName(StringInfo buf, CreateStatsStmt *stmt)
{ {

View File

@ -78,3 +78,24 @@ QualifyDropStatisticsStmt(Node *node)
dropStatisticsStmt->objects = objectNameListWithSchema; dropStatisticsStmt->objects = objectNameListWithSchema;
} }
/*
* QualifyAlterStatisticsRenameStmt qualifies RenameStmt's with schema name for
* ALTER STATISTICS RENAME statements.
*/
void
QualifyAlterStatisticsRenameStmt(Node *node)
{
RenameStmt *renameStmt = castNode(RenameStmt, node);
Assert(renameStmt->renameType == OBJECT_STATISTIC_EXT);
List *nameList = (List *) renameStmt->object;
if (list_length(nameList) == 1)
{
RangeVar *stat = makeRangeVarFromNameList(nameList);
Oid schemaOid = RangeVarGetCreationNamespace(stat);
stat->schemaname = get_namespace_name(schemaOid);
renameStmt->object = (Node *) MakeNameListFromRangeVar(stat);
}
}

View File

@ -530,6 +530,17 @@ RelayEventExtendNames(Node *parseTree, char *schemaName, uint64 shardId)
{ {
RenamePolicyEventExtendNames(renameStmt, schemaName, shardId); RenamePolicyEventExtendNames(renameStmt, schemaName, shardId);
} }
else if (objectType == OBJECT_STATISTIC_EXT)
{
RangeVar *stat = makeRangeVarFromNameList((List *) renameStmt->object);
AppendShardIdToName(&stat->relname, shardId);
AppendShardIdToName(&renameStmt->newname, shardId);
SetSchemaNameIfNotExist(&stat->schemaname, schemaName);
renameStmt->object = (Node *) MakeNameListFromRangeVar(stat);
}
else else
{ {
ereport(WARNING, (errmsg("unsafe object type in rename statement"), ereport(WARNING, (errmsg("unsafe object type in rename statement"),

View File

@ -282,6 +282,7 @@ extern List * PreprocessCreateStatisticsStmt(Node *node, const char *queryString
extern List * PostprocessCreateStatisticsStmt(Node *node, const char *queryString); extern List * PostprocessCreateStatisticsStmt(Node *node, const char *queryString);
extern ObjectAddress CreateStatisticsStmtObjectAddress(Node *node, bool missingOk); extern ObjectAddress CreateStatisticsStmtObjectAddress(Node *node, bool missingOk);
extern List * PreprocessDropStatisticsStmt(Node *node, const char *queryString); extern List * PreprocessDropStatisticsStmt(Node *node, const char *queryString);
extern List * PreprocessAlterStatisticsRenameStmt(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

@ -58,9 +58,11 @@ extern char * DeparseAlterSchemaRenameStmt(Node *stmt);
/* forward declarations for deparse_statistics_stmts.c */ /* forward declarations for deparse_statistics_stmts.c */
extern char * DeparseCreateStatisticsStmt(Node *node); extern char * DeparseCreateStatisticsStmt(Node *node);
extern char * DeparseDropStatisticsStmt(List *nameList, bool ifExists); extern char * DeparseDropStatisticsStmt(List *nameList, bool ifExists);
extern char * DeparseAlterStatisticsRenameStmt(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);
/* forward declarations for deparse_type_stmts.c */ /* forward declarations for deparse_type_stmts.c */
extern char * DeparseCompositeTypeStmt(Node *stmt); extern char * DeparseCompositeTypeStmt(Node *stmt);

View File

@ -70,6 +70,12 @@ DROP STATISTICS IF EXISTS s3, sc2.s4, s6;
DROP STATISTICS s5,s6; DROP STATISTICS s5,s6;
ERROR: statistics object "statistics'Test.s6" does not exist ERROR: statistics object "statistics'Test.s6" does not exist
DROP STATISTICS IF EXISTS s5,s5,s6,s6; DROP STATISTICS IF EXISTS s5,s5,s6,s6;
-- test renaming statistics
CREATE STATISTICS s6 ON a,b FROM test_stats4;
DROP STATISTICS s7;
ERROR: statistics object "statistics'Test.s7" does not exist
ALTER STATISTICS s6 RENAME TO s7;
DROP STATISTICS s7;
\c - - - :worker_1_port \c - - - :worker_1_port
SELECT stxname SELECT stxname
FROM pg_statistic_ext FROM pg_statistic_ext

View File

@ -57,6 +57,12 @@ DROP STATISTICS IF EXISTS s3, sc2.s4, s6;
DROP STATISTICS s5,s6; DROP STATISTICS s5,s6;
DROP STATISTICS IF EXISTS s5,s5,s6,s6; DROP STATISTICS IF EXISTS s5,s5,s6,s6;
-- test renaming statistics
CREATE STATISTICS s6 ON a,b FROM test_stats4;
DROP STATISTICS s7;
ALTER STATISTICS s6 RENAME TO s7;
DROP STATISTICS s7;
\c - - - :worker_1_port \c - - - :worker_1_port
SELECT stxname SELECT stxname
FROM pg_statistic_ext FROM pg_statistic_ext