mirror of https://github.com/citusdata/citus.git
Propagate alter stats schema
parent
bdce4a7e67
commit
5a1607b6c0
|
@ -414,12 +414,12 @@ static DistributeObjectOps Schema_Rename = {
|
||||||
.postprocess = NULL,
|
.postprocess = NULL,
|
||||||
.address = AlterSchemaRenameStmtObjectAddress,
|
.address = AlterSchemaRenameStmtObjectAddress,
|
||||||
};
|
};
|
||||||
static DistributeObjectOps Statistics_Rename = {
|
static DistributeObjectOps Statistics_AlterObjectSchema = {
|
||||||
.deparse = DeparseAlterStatisticsRenameStmt,
|
.deparse = DeparseAlterStatisticsSchemaStmt,
|
||||||
.qualify = QualifyAlterStatisticsRenameStmt,
|
.qualify = QualifyAlterStatisticsSchemaStmt,
|
||||||
.preprocess = PreprocessAlterStatisticsRenameStmt,
|
.preprocess = PreprocessAlterStatisticsSchemaStmt,
|
||||||
.postprocess = NULL,
|
.postprocess = PostprocessAlterStatisticsSchemaStmt,
|
||||||
.address = NULL,
|
.address = AlterStatisticsSchemaStmtObjectAddress,
|
||||||
};
|
};
|
||||||
static DistributeObjectOps Statistics_Drop = {
|
static DistributeObjectOps Statistics_Drop = {
|
||||||
.deparse = NULL,
|
.deparse = NULL,
|
||||||
|
@ -428,6 +428,13 @@ static DistributeObjectOps Statistics_Drop = {
|
||||||
.postprocess = NULL,
|
.postprocess = NULL,
|
||||||
.address = NULL,
|
.address = NULL,
|
||||||
};
|
};
|
||||||
|
static DistributeObjectOps Statistics_Rename = {
|
||||||
|
.deparse = DeparseAlterStatisticsRenameStmt,
|
||||||
|
.qualify = QualifyAlterStatisticsRenameStmt,
|
||||||
|
.preprocess = PreprocessAlterStatisticsRenameStmt,
|
||||||
|
.postprocess = NULL,
|
||||||
|
.address = NULL,
|
||||||
|
};
|
||||||
static DistributeObjectOps Table_AlterTable = {
|
static DistributeObjectOps Table_AlterTable = {
|
||||||
.deparse = NULL,
|
.deparse = NULL,
|
||||||
.qualify = NULL,
|
.qualify = NULL,
|
||||||
|
@ -597,6 +604,11 @@ GetDistributeObjectOps(Node *node)
|
||||||
return &Routine_AlterObjectSchema;
|
return &Routine_AlterObjectSchema;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case OBJECT_STATISTIC_EXT:
|
||||||
|
{
|
||||||
|
return &Statistics_AlterObjectSchema;
|
||||||
|
}
|
||||||
|
|
||||||
case OBJECT_TABLE:
|
case OBJECT_TABLE:
|
||||||
{
|
{
|
||||||
return &Table_AlterObjectSchema;
|
return &Table_AlterObjectSchema;
|
||||||
|
|
|
@ -228,6 +228,96 @@ PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryString)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PreprocessAlterStatisticsSchemaStmt is called during the planning phase for
|
||||||
|
* ALTER STATISTICS SET SCHEMA.
|
||||||
|
*/
|
||||||
|
List *
|
||||||
|
PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString)
|
||||||
|
{
|
||||||
|
AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PostprocessAlterStatisticsSchemaStmt is called after a ALTER STATISTICS SCHEMA
|
||||||
|
* command has been executed by standard process utility.
|
||||||
|
*/
|
||||||
|
List *
|
||||||
|
PostprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString)
|
||||||
|
{
|
||||||
|
AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, node);
|
||||||
|
Assert(stmt->objectType == OBJECT_STATISTIC_EXT);
|
||||||
|
|
||||||
|
Value *statName = llast((List *) stmt->object);
|
||||||
|
Oid statsOid = get_statistics_object_oid(list_make2(makeString(stmt->newschema),
|
||||||
|
statName), false);
|
||||||
|
Oid relationId = GetRelIdByStatsOid(statsOid);
|
||||||
|
|
||||||
|
if (!IsCitusTable(relationId) || !ShouldPropagate())
|
||||||
|
{
|
||||||
|
return NIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool missingOk = false;
|
||||||
|
ObjectAddress objectAddress = GetObjectAddressFromParseTree((Node *) stmt, missingOk);
|
||||||
|
|
||||||
|
EnsureDependenciesExistOnAllNodes(&objectAddress);
|
||||||
|
|
||||||
|
return NIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AlterStatisticsSchemaStmtObjectAddress finds the ObjectAddress for the statistics
|
||||||
|
* that is altered by given AlterObjectSchemaStmt. If missingOk is false and if
|
||||||
|
* the statistics does not exist, then it errors out.
|
||||||
|
*
|
||||||
|
* Never returns NULL, but the objid in the address can be invalid if missingOk
|
||||||
|
* was set to true.
|
||||||
|
*/
|
||||||
|
ObjectAddress
|
||||||
|
AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk)
|
||||||
|
{
|
||||||
|
AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, node);
|
||||||
|
|
||||||
|
ObjectAddress address = { 0 };
|
||||||
|
Value *statName = llast((List *) stmt->object);
|
||||||
|
Oid statsOid = get_statistics_object_oid(list_make2(makeString(stmt->newschema),
|
||||||
|
statName), false);
|
||||||
|
ObjectAddressSet(address, StatisticExtRelationId, statsOid);
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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
|
||||||
|
|
|
@ -22,11 +22,12 @@
|
||||||
|
|
||||||
static void AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt);
|
static void AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt);
|
||||||
static void AppendDropStatisticsStmt(StringInfo buf, List *nameList, bool ifExists);
|
static void AppendDropStatisticsStmt(StringInfo buf, List *nameList, bool ifExists);
|
||||||
|
static void AppendAlterStatisticsRenameStmt(StringInfo buf, RenameStmt *stmt);
|
||||||
|
static void AppendAlterStatisticsSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *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);
|
||||||
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)
|
||||||
|
@ -68,6 +69,20 @@ DeparseAlterStatisticsRenameStmt(Node *node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
DeparseAlterStatisticsSchemaStmt(Node *node)
|
||||||
|
{
|
||||||
|
AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, node);
|
||||||
|
|
||||||
|
StringInfoData str;
|
||||||
|
initStringInfo(&str);
|
||||||
|
|
||||||
|
AppendAlterStatisticsSchemaStmt(&str, stmt);
|
||||||
|
|
||||||
|
return str.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt)
|
AppendCreateStatisticsStmt(StringInfo buf, CreateStatsStmt *stmt)
|
||||||
{
|
{
|
||||||
|
@ -110,7 +125,17 @@ static void
|
||||||
AppendAlterStatisticsRenameStmt(StringInfo buf, RenameStmt *stmt)
|
AppendAlterStatisticsRenameStmt(StringInfo buf, RenameStmt *stmt)
|
||||||
{
|
{
|
||||||
appendStringInfo(buf, "ALTER STATISTICS %s RENAME TO %s",
|
appendStringInfo(buf, "ALTER STATISTICS %s RENAME TO %s",
|
||||||
NameListToQuotedString((List *) stmt->object), stmt->newname);
|
NameListToQuotedString((List *) stmt->object), quote_identifier(
|
||||||
|
stmt->newname));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
AppendAlterStatisticsSchemaStmt(StringInfo buf, AlterObjectSchemaStmt *stmt)
|
||||||
|
{
|
||||||
|
appendStringInfo(buf, "ALTER STATISTICS %s SET SCHEMA %s",
|
||||||
|
NameListToQuotedString((List *) stmt->object), quote_identifier(
|
||||||
|
stmt->newschema));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -99,3 +99,24 @@ QualifyAlterStatisticsRenameStmt(Node *node)
|
||||||
renameStmt->object = (Node *) MakeNameListFromRangeVar(stat);
|
renameStmt->object = (Node *) MakeNameListFromRangeVar(stat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* QualifyAlterStatisticsSchemaStmt qualifies RenameStmt's with schema name for
|
||||||
|
* ALTER STATISTICS RENAME statements.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
QualifyAlterStatisticsSchemaStmt(Node *node)
|
||||||
|
{
|
||||||
|
AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -82,14 +82,32 @@ RelayEventExtendNames(Node *parseTree, char *schemaName, uint64 shardId)
|
||||||
{
|
{
|
||||||
AlterObjectSchemaStmt *alterObjectSchemaStmt =
|
AlterObjectSchemaStmt *alterObjectSchemaStmt =
|
||||||
(AlterObjectSchemaStmt *) parseTree;
|
(AlterObjectSchemaStmt *) parseTree;
|
||||||
|
ObjectType objectType = alterObjectSchemaStmt->objectType;
|
||||||
|
|
||||||
|
if (objectType == OBJECT_STATISTIC_EXT)
|
||||||
|
{
|
||||||
|
RangeVar *stat = makeRangeVarFromNameList(
|
||||||
|
(List *) alterObjectSchemaStmt->object);
|
||||||
|
|
||||||
|
/* set schema name and append shard id */
|
||||||
|
SetSchemaNameIfNotExist(&stat->schemaname, schemaName);
|
||||||
|
AppendShardIdToName(&stat->relname, shardId);
|
||||||
|
|
||||||
|
alterObjectSchemaStmt->object = (Node *) MakeNameListFromRangeVar(stat);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
char **relationName = &(alterObjectSchemaStmt->relation->relname);
|
char **relationName = &(alterObjectSchemaStmt->relation->relname);
|
||||||
char **relationSchemaName = &(alterObjectSchemaStmt->relation->schemaname);
|
char **relationSchemaName =
|
||||||
|
&(alterObjectSchemaStmt->relation->schemaname);
|
||||||
|
|
||||||
/* prefix with schema name if it is not added already */
|
/* prefix with schema name if it is not added already */
|
||||||
SetSchemaNameIfNotExist(relationSchemaName, schemaName);
|
SetSchemaNameIfNotExist(relationSchemaName, schemaName);
|
||||||
|
|
||||||
/* append shardId to base relation name */
|
/* append shardId to base relation name */
|
||||||
AppendShardIdToName(relationName, shardId);
|
AppendShardIdToName(relationName, shardId);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -283,6 +283,9 @@ extern List * PostprocessCreateStatisticsStmt(Node *node, const char *queryStrin
|
||||||
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 * PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryString);
|
||||||
|
extern List * PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString);
|
||||||
|
extern List * PostprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString);
|
||||||
|
extern ObjectAddress AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk);
|
||||||
extern List * GetExplicitStatisticsCommandList(Oid relationId);
|
extern List * GetExplicitStatisticsCommandList(Oid relationId);
|
||||||
extern List * GetExplicitStatisticsSchemaIdList(Oid relationId);
|
extern List * GetExplicitStatisticsSchemaIdList(Oid relationId);
|
||||||
|
|
||||||
|
|
|
@ -59,10 +59,12 @@ extern char * DeparseAlterSchemaRenameStmt(Node *stmt);
|
||||||
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 char * DeparseAlterStatisticsRenameStmt(Node *node);
|
||||||
|
extern char * DeparseAlterStatisticsSchemaStmt(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);
|
||||||
|
|
||||||
/* forward declarations for deparse_type_stmts.c */
|
/* forward declarations for deparse_type_stmts.c */
|
||||||
extern char * DeparseCompositeTypeStmt(Node *stmt);
|
extern char * DeparseCompositeTypeStmt(Node *stmt);
|
||||||
|
|
|
@ -75,7 +75,10 @@ CREATE STATISTICS s6 ON a,b FROM test_stats4;
|
||||||
DROP STATISTICS s7;
|
DROP STATISTICS s7;
|
||||||
ERROR: statistics object "statistics'Test.s7" does not exist
|
ERROR: statistics object "statistics'Test.s7" does not exist
|
||||||
ALTER STATISTICS s6 RENAME TO s7;
|
ALTER STATISTICS s6 RENAME TO s7;
|
||||||
DROP STATISTICS s7;
|
-- test altering stats schema
|
||||||
|
CREATE SCHEMA test_alter_schema;
|
||||||
|
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
||||||
|
DROP STATISTICS test_alter_schema.s7;
|
||||||
\c - - - :worker_1_port
|
\c - - - :worker_1_port
|
||||||
SELECT stxname
|
SELECT stxname
|
||||||
FROM pg_statistic_ext
|
FROM pg_statistic_ext
|
||||||
|
@ -168,5 +171,6 @@ WHERE stxnamespace IN (
|
||||||
\c - - - :master_port
|
\c - - - :master_port
|
||||||
SET client_min_messages TO WARNING;
|
SET client_min_messages TO WARNING;
|
||||||
DROP SCHEMA "statistics'Test" CASCADE;
|
DROP SCHEMA "statistics'Test" CASCADE;
|
||||||
|
DROP SCHEMA test_alter_schema CASCADE;
|
||||||
DROP SCHEMA sc1 CASCADE;
|
DROP SCHEMA sc1 CASCADE;
|
||||||
DROP SCHEMA sc2 CASCADE;
|
DROP SCHEMA sc2 CASCADE;
|
||||||
|
|
|
@ -61,7 +61,11 @@ DROP STATISTICS IF EXISTS s5,s5,s6,s6;
|
||||||
CREATE STATISTICS s6 ON a,b FROM test_stats4;
|
CREATE STATISTICS s6 ON a,b FROM test_stats4;
|
||||||
DROP STATISTICS s7;
|
DROP STATISTICS s7;
|
||||||
ALTER STATISTICS s6 RENAME TO s7;
|
ALTER STATISTICS s6 RENAME TO s7;
|
||||||
DROP STATISTICS s7;
|
|
||||||
|
-- test altering stats schema
|
||||||
|
CREATE SCHEMA test_alter_schema;
|
||||||
|
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
||||||
|
DROP STATISTICS test_alter_schema.s7;
|
||||||
|
|
||||||
\c - - - :worker_1_port
|
\c - - - :worker_1_port
|
||||||
SELECT stxname
|
SELECT stxname
|
||||||
|
@ -84,5 +88,6 @@ WHERE stxnamespace IN (
|
||||||
\c - - - :master_port
|
\c - - - :master_port
|
||||||
SET client_min_messages TO WARNING;
|
SET client_min_messages TO WARNING;
|
||||||
DROP SCHEMA "statistics'Test" CASCADE;
|
DROP SCHEMA "statistics'Test" CASCADE;
|
||||||
|
DROP SCHEMA test_alter_schema CASCADE;
|
||||||
DROP SCHEMA sc1 CASCADE;
|
DROP SCHEMA sc1 CASCADE;
|
||||||
DROP SCHEMA sc2 CASCADE;
|
DROP SCHEMA sc2 CASCADE;
|
||||||
|
|
Loading…
Reference in New Issue