mirror of https://github.com/citusdata/citus.git
Propagate rename statistics
parent
5ed9197041
commit
bdce4a7e67
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue