diff --git a/src/backend/distributed/commands/cluster.c b/src/backend/distributed/commands/cluster.c index b464ca395..977409947 100644 --- a/src/backend/distributed/commands/cluster.c +++ b/src/backend/distributed/commands/cluster.c @@ -17,7 +17,8 @@ /* placeholder for PreprocessClusterStmt */ List * -PreprocessClusterStmt(Node *node, const char *clusterCommand) +PreprocessClusterStmt(Node *node, const char *clusterCommand, + ProcessUtilityContext processUtilityContext) { ClusterStmt *clusterStmt = castNode(ClusterStmt, node); bool showPropagationWarning = false; diff --git a/src/backend/distributed/commands/collation.c b/src/backend/distributed/commands/collation.c index e0fc367d8..602e1493a 100644 --- a/src/backend/distributed/commands/collation.c +++ b/src/backend/distributed/commands/collation.c @@ -220,7 +220,8 @@ FilterNameListForDistributedCollations(List *objects, bool missing_ok, List * -PreprocessDropCollationStmt(Node *node, const char *queryString) +PreprocessDropCollationStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { DropStmt *stmt = castNode(DropStmt, node); @@ -290,7 +291,8 @@ PreprocessDropCollationStmt(Node *node, const char *queryString) * the workers to keep the type in sync across the cluster. */ List * -PreprocessAlterCollationOwnerStmt(Node *node, const char *queryString) +PreprocessAlterCollationOwnerStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, node); Assert(stmt->objectType == OBJECT_COLLATION); @@ -324,7 +326,8 @@ PreprocessAlterCollationOwnerStmt(Node *node, const char *queryString) * executed on all the workers to keep the collation in sync across the cluster. */ List * -PreprocessRenameCollationStmt(Node *node, const char *queryString) +PreprocessRenameCollationStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { RenameStmt *stmt = castNode(RenameStmt, node); ObjectAddress collationAddress = GetObjectAddressFromParseTree((Node *) stmt, false); @@ -357,7 +360,8 @@ PreprocessRenameCollationStmt(Node *node, const char *queryString) * In this stage we can prepare the commands that need to be run on all workers. */ List * -PreprocessAlterCollationSchemaStmt(Node *node, const char *queryString) +PreprocessAlterCollationSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, node); Assert(stmt->objectType == OBJECT_COLLATION); diff --git a/src/backend/distributed/commands/extension.c b/src/backend/distributed/commands/extension.c index d7e167488..342f10fd4 100644 --- a/src/backend/distributed/commands/extension.c +++ b/src/backend/distributed/commands/extension.c @@ -239,7 +239,8 @@ AddSchemaFieldIfMissing(CreateExtensionStmt *createExtensionStmt) * be made to the workers. */ List * -PreprocessDropExtensionStmt(Node *node, const char *queryString) +PreprocessDropExtensionStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { DropStmt *stmt = castNode(DropStmt, node); @@ -386,7 +387,8 @@ ExtensionNameListToObjectAddressList(List *extensionObjectList) * PreprocessAlterExtensionSchemaStmt is invoked for alter extension set schema statements. */ List * -PreprocessAlterExtensionSchemaStmt(Node *node, const char *queryString) +PreprocessAlterExtensionSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { if (!ShouldPropagateExtensionCommand(node)) { @@ -451,7 +453,8 @@ PostprocessAlterExtensionSchemaStmt(Node *node, const char *queryString) * PreprocessAlterExtensionUpdateStmt is invoked for alter extension update statements. */ List * -PreprocessAlterExtensionUpdateStmt(Node *node, const char *queryString) +PreprocessAlterExtensionUpdateStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterExtensionStmt *alterExtensionStmt = castNode(AlterExtensionStmt, node); @@ -599,7 +602,8 @@ MarkExistingObjectDependenciesDistributedIfSupported() * PreprocessAlterExtensionContentsStmt issues a notice. It does not propagate. */ List * -PreprocessAlterExtensionContentsStmt(Node *node, const char *queryString) +PreprocessAlterExtensionContentsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { ereport(NOTICE, (errmsg( "Citus does not propagate adding/dropping member objects"), diff --git a/src/backend/distributed/commands/function.c b/src/backend/distributed/commands/function.c index 62b7cc880..afe993031 100644 --- a/src/backend/distributed/commands/function.c +++ b/src/backend/distributed/commands/function.c @@ -1244,7 +1244,8 @@ ShouldPropagateAlterFunction(const ObjectAddress *address) * can propagate the function in sequential mode. */ List * -PreprocessCreateFunctionStmt(Node *node, const char *queryString) +PreprocessCreateFunctionStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { CreateFunctionStmt *stmt = castNode(CreateFunctionStmt, node); @@ -1356,7 +1357,8 @@ DefineAggregateStmtObjectAddress(Node *node, bool missing_ok) * the cluster. */ List * -PreprocessAlterFunctionStmt(Node *node, const char *queryString) +PreprocessAlterFunctionStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterFunctionStmt *stmt = castNode(AlterFunctionStmt, node); AssertObjectTypeIsFunctional(stmt->objtype); @@ -1390,7 +1392,8 @@ PreprocessAlterFunctionStmt(Node *node, const char *queryString) * types in sync across the cluster. */ List * -PreprocessRenameFunctionStmt(Node *node, const char *queryString) +PreprocessRenameFunctionStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { RenameStmt *stmt = castNode(RenameStmt, node); AssertObjectTypeIsFunctional(stmt->renameType); @@ -1421,7 +1424,8 @@ PreprocessRenameFunctionStmt(Node *node, const char *queryString) * In this stage we can prepare the commands that need to be run on all workers. */ List * -PreprocessAlterFunctionSchemaStmt(Node *node, const char *queryString) +PreprocessAlterFunctionSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, node); AssertObjectTypeIsFunctional(stmt->objectType); @@ -1453,7 +1457,8 @@ PreprocessAlterFunctionSchemaStmt(Node *node, const char *queryString) * all the workers to keep the type in sync across the cluster. */ List * -PreprocessAlterFunctionOwnerStmt(Node *node, const char *queryString) +PreprocessAlterFunctionOwnerStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, node); AssertObjectTypeIsFunctional(stmt->objectType); @@ -1487,7 +1492,8 @@ PreprocessAlterFunctionOwnerStmt(Node *node, const char *queryString) * functions will still be dropped locally but not on the workers. */ List * -PreprocessDropFunctionStmt(Node *node, const char *queryString) +PreprocessDropFunctionStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { DropStmt *stmt = castNode(DropStmt, node); List *deletingObjectWithArgsList = stmt->objects; @@ -1591,7 +1597,8 @@ PreprocessDropFunctionStmt(Node *node, const char *queryString) * don't allow this dependency to be created. */ List * -PreprocessAlterFunctionDependsStmt(Node *node, const char *queryString) +PreprocessAlterFunctionDependsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterObjectDependsStmt *stmt = castNode(AlterObjectDependsStmt, node); AssertObjectTypeIsFunctional(stmt->objectType); diff --git a/src/backend/distributed/commands/grant.c b/src/backend/distributed/commands/grant.c index 4bfef449c..c40605e69 100644 --- a/src/backend/distributed/commands/grant.c +++ b/src/backend/distributed/commands/grant.c @@ -13,7 +13,8 @@ /* placeholder for PreprocessGrantStmt */ List * -PreprocessGrantStmt(Node *node, const char *queryString) +PreprocessGrantStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { return NIL; } diff --git a/src/backend/distributed/commands/index.c b/src/backend/distributed/commands/index.c index 0eeaa41a5..fe22b4392 100644 --- a/src/backend/distributed/commands/index.c +++ b/src/backend/distributed/commands/index.c @@ -130,7 +130,8 @@ IsIndexRenameStmt(RenameStmt *renameStmt) * in a List. If no distributed table is involved, this function returns NIL. */ List * -PreprocessIndexStmt(Node *node, const char *createIndexCommand) +PreprocessIndexStmt(Node *node, const char *createIndexCommand, + ProcessUtilityContext processUtilityContext) { IndexStmt *createIndexStatement = castNode(IndexStmt, node); @@ -528,7 +529,8 @@ GetCreateIndexRelationLockMode(IndexStmt *createIndexStatement) * in a List. If no distributed table is involved, this function returns NIL. */ List * -PreprocessReindexStmt(Node *node, const char *reindexCommand) +PreprocessReindexStmt(Node *node, const char *reindexCommand, + ProcessUtilityContext processUtilityContext) { ReindexStmt *reindexStatement = castNode(ReindexStmt, node); List *ddlJobs = NIL; @@ -637,7 +639,8 @@ PreprocessReindexStmt(Node *node, const char *reindexCommand) * in a List. If no distributed table is involved, this function returns NIL. */ List * -PreprocessDropIndexStmt(Node *node, const char *dropIndexCommand) +PreprocessDropIndexStmt(Node *node, const char *dropIndexCommand, + ProcessUtilityContext processUtilityContext) { DropStmt *dropIndexStatement = castNode(DropStmt, node); List *ddlJobs = NIL; diff --git a/src/backend/distributed/commands/policy.c b/src/backend/distributed/commands/policy.c index 3ec45bc13..0956a0268 100644 --- a/src/backend/distributed/commands/policy.c +++ b/src/backend/distributed/commands/policy.c @@ -28,7 +28,8 @@ CreatePolicyCommands(Oid relationId) /* placeholder for PreprocessCreatePolicyStmt */ List * -PreprocessCreatePolicyStmt(Node *node, const char *queryString) +PreprocessCreatePolicyStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { CreatePolicyStmt *stmt = castNode(CreatePolicyStmt, node); Oid relationId = RangeVarGetRelid(stmt->table, @@ -48,7 +49,8 @@ PreprocessCreatePolicyStmt(Node *node, const char *queryString) /* placeholder for PreprocessAlterPolicyStmt */ List * -PreprocessAlterPolicyStmt(Node *node, const char *queryString) +PreprocessAlterPolicyStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { /* placeholder for future implementation */ return NIL; @@ -71,7 +73,8 @@ ErrorIfUnsupportedPolicy(Relation relation) /* placeholder for PreprocessDropPolicyStmt */ List * -PreprocessDropPolicyStmt(Node *node, const char *queryString) +PreprocessDropPolicyStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { /* placeholder for future implementation */ return NIL; diff --git a/src/backend/distributed/commands/rename.c b/src/backend/distributed/commands/rename.c index 01acc9d82..8af5639b5 100644 --- a/src/backend/distributed/commands/rename.c +++ b/src/backend/distributed/commands/rename.c @@ -26,7 +26,8 @@ * tributed table is involved, this function returns NIL. */ List * -PreprocessRenameStmt(Node *node, const char *renameCommand) +PreprocessRenameStmt(Node *node, const char *renameCommand, + ProcessUtilityContext processUtilityContext) { RenameStmt *renameStmt = castNode(RenameStmt, node); Oid objectRelationId = InvalidOid; /* SQL Object OID */ @@ -144,7 +145,8 @@ ErrorIfUnsupportedRenameStmt(RenameStmt *renameStmt) * a specialized implementation if present, otherwise return an empty list for its DDLJobs */ List * -PreprocessRenameAttributeStmt(Node *node, const char *queryString) +PreprocessRenameAttributeStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { RenameStmt *stmt = castNode(RenameStmt, node); Assert(stmt->renameType == OBJECT_ATTRIBUTE); @@ -153,7 +155,8 @@ PreprocessRenameAttributeStmt(Node *node, const char *queryString) { case OBJECT_TYPE: { - return PreprocessRenameTypeAttributeStmt(node, queryString); + return PreprocessRenameTypeAttributeStmt(node, queryString, + processUtilityContext); } default: diff --git a/src/backend/distributed/commands/role.c b/src/backend/distributed/commands/role.c index 6f655b934..e46b06ef4 100644 --- a/src/backend/distributed/commands/role.c +++ b/src/backend/distributed/commands/role.c @@ -181,7 +181,8 @@ PostprocessAlterRoleStmt(Node *node, const char *queryString) * role set statement. */ List * -PreprocessAlterRoleSetStmt(Node *node, const char *queryString) +PreprocessAlterRoleSetStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { if (!ShouldPropagate()) { diff --git a/src/backend/distributed/commands/schema.c b/src/backend/distributed/commands/schema.c index 795ec9f07..9f6683496 100644 --- a/src/backend/distributed/commands/schema.c +++ b/src/backend/distributed/commands/schema.c @@ -49,7 +49,8 @@ static void EnsureSequentialModeForSchemaDDL(void); * under dropped schema involved in any foreign key relationship. */ List * -PreprocessDropSchemaStmt(Node *node, const char *queryString) +PreprocessDropSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { DropStmt *dropStatement = castNode(DropStmt, node); Relation pgClass = NULL; @@ -133,7 +134,8 @@ PreprocessDropSchemaStmt(Node *node, const char *queryString) * on schemas. Only grant statements for distributed schema are propagated. */ List * -PreprocessGrantOnSchemaStmt(Node *node, const char *queryString) +PreprocessGrantOnSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { GrantStmt *stmt = castNode(GrantStmt, node); Assert(stmt->objtype == OBJECT_SCHEMA); @@ -166,7 +168,8 @@ PreprocessGrantOnSchemaStmt(Node *node, const char *queryString) * is executed on all the workers to keep the schemas in sync across the cluster. */ List * -PreprocessAlterSchemaRenameStmt(Node *node, const char *queryString) +PreprocessAlterSchemaRenameStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { ObjectAddress schemaAddress = GetObjectAddressFromParseTree(node, false); if (!ShouldPropagateObject(&schemaAddress)) diff --git a/src/backend/distributed/commands/statistics.c b/src/backend/distributed/commands/statistics.c index e7db54e27..ac04aa550 100644 --- a/src/backend/distributed/commands/statistics.c +++ b/src/backend/distributed/commands/statistics.c @@ -65,7 +65,8 @@ static char * CreateAlterCommandIfTargetNotDefault(Oid statsOid); * CREATE STATISTICS. */ List * -PreprocessCreateStatisticsStmt(Node *node, const char *queryString) +PreprocessCreateStatisticsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { CreateStatsStmt *stmt = castNode(CreateStatsStmt, node); @@ -150,7 +151,8 @@ CreateStatisticsStmtObjectAddress(Node *node, bool missingOk) * DROP STATISTICS. */ List * -PreprocessDropStatisticsStmt(Node *node, const char *queryString) +PreprocessDropStatisticsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { DropStmt *dropStatisticsStmt = castNode(DropStmt, node); Assert(dropStatisticsStmt->removeType == OBJECT_STATISTIC_EXT); @@ -208,7 +210,8 @@ PreprocessDropStatisticsStmt(Node *node, const char *queryString) * ALTER STATISTICS RENAME. */ List * -PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryString) +PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { RenameStmt *renameStmt = castNode(RenameStmt, node); Assert(renameStmt->renameType == OBJECT_STATISTIC_EXT); @@ -246,7 +249,8 @@ PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryString) * ALTER STATISTICS SET SCHEMA. */ List * -PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString) +PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, node); Assert(stmt->objectType == OBJECT_STATISTIC_EXT); @@ -338,7 +342,8 @@ AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk) * ALTER STATISTICS .. SET STATISTICS. */ List * -PreprocessAlterStatisticsStmt(Node *node, const char *queryString) +PreprocessAlterStatisticsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterStatsStmt *stmt = castNode(AlterStatsStmt, node); @@ -377,7 +382,8 @@ PreprocessAlterStatisticsStmt(Node *node, const char *queryString) * ALTER STATISTICS .. OWNER TO. */ List * -PreprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString) +PreprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, node); Assert(stmt->objectType == OBJECT_STATISTIC_EXT); diff --git a/src/backend/distributed/commands/table.c b/src/backend/distributed/commands/table.c index 77baade6d..494ed8720 100644 --- a/src/backend/distributed/commands/table.c +++ b/src/backend/distributed/commands/table.c @@ -87,7 +87,8 @@ static bool SetupExecutionModeForAlterTable(Oid relationId, AlterTableCmd *comma * about not processing same DROP command twice. */ List * -PreprocessDropTableStmt(Node *node, const char *queryString) +PreprocessDropTableStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { DropStmt *dropTableStatement = castNode(DropStmt, node); @@ -346,7 +347,8 @@ PostprocessAlterTableSchemaStmt(Node *node, const char *queryString) * function returns NIL. */ List * -PreprocessAlterTableStmt(Node *node, const char *alterTableCommand) +PreprocessAlterTableStmt(Node *node, const char *alterTableCommand, + ProcessUtilityContext processUtilityContext) { AlterTableStmt *alterTableStatement = castNode(AlterTableStmt, node); @@ -724,7 +726,8 @@ AlterTableCommandTypeIsTrigger(AlterTableType alterTableType) * the distributed environment. We warn out here. */ List * -PreprocessAlterTableMoveAllStmt(Node *node, const char *queryString) +PreprocessAlterTableMoveAllStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { ereport(WARNING, (errmsg("not propagating ALTER TABLE ALL IN TABLESPACE " "commands to worker nodes"), @@ -743,7 +746,8 @@ PreprocessAlterTableMoveAllStmt(Node *node, const char *queryString) * shards. */ List * -PreprocessAlterTableSchemaStmt(Node *node, const char *queryString) +PreprocessAlterTableSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, node); Assert(stmt->objectType == OBJECT_TABLE); diff --git a/src/backend/distributed/commands/trigger.c b/src/backend/distributed/commands/trigger.c index 88d5402f8..aa6aa6cae 100644 --- a/src/backend/distributed/commands/trigger.c +++ b/src/backend/distributed/commands/trigger.c @@ -483,7 +483,8 @@ GetAlterTriggerDependsTriggerNameValue(AlterObjectDependsStmt *alterTriggerDepen * standard process utility. */ List * -PreprocessDropTriggerStmt(Node *node, const char *queryString) +PreprocessDropTriggerStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { DropStmt *dropTriggerStmt = castNode(DropStmt, node); Assert(dropTriggerStmt->removeType == OBJECT_TRIGGER); diff --git a/src/backend/distributed/commands/type.c b/src/backend/distributed/commands/type.c index 09042130f..dbcbcdab1 100644 --- a/src/backend/distributed/commands/type.c +++ b/src/backend/distributed/commands/type.c @@ -116,7 +116,8 @@ static bool ShouldPropagateTypeCreate(void); * access to the ObjectAddress of the new type. */ List * -PreprocessCompositeTypeStmt(Node *node, const char *queryString) +PreprocessCompositeTypeStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { if (!ShouldPropagateTypeCreate()) { @@ -201,7 +202,8 @@ PostprocessCompositeTypeStmt(Node *node, const char *queryString) * this is already implemented by the post processing for adding columns to tables. */ List * -PreprocessAlterTypeStmt(Node *node, const char *queryString) +PreprocessAlterTypeStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterTableStmt *stmt = castNode(AlterTableStmt, node); Assert(stmt->relkind == OBJECT_TYPE); @@ -244,7 +246,8 @@ PreprocessAlterTypeStmt(Node *node, const char *queryString) * ObjectAddress for the new type just yet. */ List * -PreprocessCreateEnumStmt(Node *node, const char *queryString) +PreprocessCreateEnumStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { if (!ShouldPropagateTypeCreate()) { @@ -316,7 +319,8 @@ PostprocessCreateEnumStmt(Node *node, const char *queryString) * workers directly to keep the types in sync accross the cluster. */ List * -PreprocessAlterEnumStmt(Node *node, const char *queryString) +PreprocessAlterEnumStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { List *commands = NIL; @@ -446,7 +450,8 @@ PostprocessAlterEnumStmt(Node *node, const char *queryString) * no types in the drop list are distributed no calls will be made to the workers. */ List * -PreprocessDropTypeStmt(Node *node, const char *queryString) +PreprocessDropTypeStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { DropStmt *stmt = castNode(DropStmt, node); @@ -514,7 +519,8 @@ PreprocessDropTypeStmt(Node *node, const char *queryString) * executed on all the workers to keep the types in sync across the cluster. */ List * -PreprocessRenameTypeStmt(Node *node, const char *queryString) +PreprocessRenameTypeStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { ObjectAddress typeAddress = GetObjectAddressFromParseTree(node, false); if (!ShouldPropagateObject(&typeAddress)) @@ -547,7 +553,8 @@ PreprocessRenameTypeStmt(Node *node, const char *queryString) * keep the type in sync across the cluster. */ List * -PreprocessRenameTypeAttributeStmt(Node *node, const char *queryString) +PreprocessRenameTypeAttributeStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { RenameStmt *stmt = castNode(RenameStmt, node); Assert(stmt->renameType == OBJECT_ATTRIBUTE); @@ -579,7 +586,8 @@ PreprocessRenameTypeAttributeStmt(Node *node, const char *queryString) * In this stage we can prepare the commands that need to be run on all workers. */ List * -PreprocessAlterTypeSchemaStmt(Node *node, const char *queryString) +PreprocessAlterTypeSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterObjectSchemaStmt *stmt = castNode(AlterObjectSchemaStmt, node); Assert(stmt->objectType == OBJECT_TYPE); @@ -637,7 +645,8 @@ PostprocessAlterTypeSchemaStmt(Node *node, const char *queryString) * the workers to keep the type in sync across the cluster. */ List * -PreprocessAlterTypeOwnerStmt(Node *node, const char *queryString) +PreprocessAlterTypeOwnerStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) { AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, node); Assert(stmt->objectType == OBJECT_TYPE); diff --git a/src/backend/distributed/commands/utility_hook.c b/src/backend/distributed/commands/utility_hook.c index c9f121781..2290a31f4 100644 --- a/src/backend/distributed/commands/utility_hook.c +++ b/src/backend/distributed/commands/utility_hook.c @@ -384,7 +384,7 @@ multi_ProcessUtility(PlannedStmt *pstmt, if (ops && ops->preprocess) { - ddlJobs = ops->preprocess(parsetree, queryString); + ddlJobs = ops->preprocess(parsetree, queryString, context); } } else diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index bb7df82ec..01fb17e29 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -18,6 +18,7 @@ #include "utils/rel.h" #include "nodes/parsenodes.h" #include "tcop/dest.h" +#include "tcop/utility.h" /* * DistributeObjectOps specifies handlers for node/object type pairs. @@ -39,7 +40,7 @@ typedef struct DistributeObjectOps { char * (*deparse)(Node *); void (*qualify)(Node *); - List * (*preprocess)(Node *, const char *); + List * (*preprocess)(Node *, const char *, ProcessUtilityContext); List * (*postprocess)(Node *, const char *); ObjectAddress (*address)(Node *, bool); } DistributeObjectOps; @@ -102,7 +103,8 @@ typedef enum SearchForeignKeyColumnFlags /* cluster.c - forward declarations */ -extern List * PreprocessClusterStmt(Node *node, const char *clusterCommand); +extern List * PreprocessClusterStmt(Node *node, const char *clusterCommand, + ProcessUtilityContext processUtilityContext); /* index.c */ typedef void (*PGIndexProcessor)(Form_pg_index, List **); @@ -116,10 +118,16 @@ extern bool CallDistributedProcedureRemotely(CallStmt *callStmt, DestReceiver *d extern char * CreateCollationDDL(Oid collationId); extern List * CreateCollationDDLsIdempotent(Oid collationId); extern ObjectAddress AlterCollationOwnerObjectAddress(Node *stmt, bool missing_ok); -extern List * PreprocessDropCollationStmt(Node *stmt, const char *queryString); -extern List * PreprocessAlterCollationOwnerStmt(Node *stmt, const char *queryString); -extern List * PreprocessAlterCollationSchemaStmt(Node *stmt, const char *queryString); -extern List * PreprocessRenameCollationStmt(Node *stmt, const char *queryString); +extern List * PreprocessDropCollationStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessAlterCollationOwnerStmt(Node *stmt, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List * PreprocessAlterCollationSchemaStmt(Node *stmt, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List * PreprocessRenameCollationStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern ObjectAddress RenameCollationStmtObjectAddress(Node *stmt, bool missing_ok); extern ObjectAddress AlterCollationSchemaStmtObjectAddress(Node *stmt, bool missing_ok); @@ -133,16 +141,23 @@ extern bool IsDropCitusExtensionStmt(Node *parsetree); extern bool IsCreateAlterExtensionUpdateCitusStmt(Node *parsetree); extern void ErrorIfUnstableCreateOrAlterExtensionStmt(Node *parsetree); extern List * PostprocessCreateExtensionStmt(Node *stmt, const char *queryString); -extern List * PreprocessDropExtensionStmt(Node *stmt, const char *queryString); +extern List * PreprocessDropExtensionStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PreprocessAlterExtensionSchemaStmt(Node *stmt, - const char *queryString); + const char *queryString, + ProcessUtilityContext + processUtilityContext); extern List * PostprocessAlterExtensionSchemaStmt(Node *stmt, const char *queryString); extern List * PreprocessAlterExtensionUpdateStmt(Node *stmt, - const char *queryString); + const char *queryString, + ProcessUtilityContext + processUtilityContext); extern void PostprocessAlterExtensionCitusUpdateStmt(Node *node); extern List * PreprocessAlterExtensionContentsStmt(Node *node, - const char *queryString); + const char *queryString, + ProcessUtilityContext + processUtilityContext); extern List * CreateExtensionDDLCommand(const ObjectAddress *extensionAddress); extern ObjectAddress AlterExtensionSchemaStmtObjectAddress(Node *stmt, bool missing_ok); @@ -182,51 +197,64 @@ extern bool RelationInvolvedInAnyNonInheritedForeignKeys(Oid relationId); /* function.c - forward declarations */ -extern List * PreprocessCreateFunctionStmt(Node *stmt, const char *queryString); +extern List * PreprocessCreateFunctionStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PostprocessCreateFunctionStmt(Node *stmt, const char *queryString); extern ObjectAddress CreateFunctionStmtObjectAddress(Node *stmt, bool missing_ok); extern ObjectAddress DefineAggregateStmtObjectAddress(Node *stmt, bool missing_ok); -extern List * PreprocessAlterFunctionStmt(Node *stmt, const char *queryString); +extern List * PreprocessAlterFunctionStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern ObjectAddress AlterFunctionStmtObjectAddress(Node *stmt, bool missing_ok); -extern List * PreprocessRenameFunctionStmt(Node *stmt, const char *queryString); +extern List * PreprocessRenameFunctionStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern ObjectAddress RenameFunctionStmtObjectAddress(Node *stmt, bool missing_ok); -extern List * PreprocessAlterFunctionOwnerStmt(Node *stmt, const char *queryString); +extern List * PreprocessAlterFunctionOwnerStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern ObjectAddress AlterFunctionOwnerObjectAddress(Node *stmt, bool missing_ok); -extern List * PreprocessAlterFunctionSchemaStmt(Node *stmt, const char *queryString); +extern List * PreprocessAlterFunctionSchemaStmt(Node *stmt, const char *queryString, + ProcessUtilityContext + processUtilityContext); extern ObjectAddress AlterFunctionSchemaStmtObjectAddress(Node *stmt, bool missing_ok); extern List * PostprocessAlterFunctionSchemaStmt(Node *stmt, const char *queryString); -extern List * PreprocessDropFunctionStmt(Node *stmt, const char *queryString); +extern List * PreprocessDropFunctionStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PreprocessAlterFunctionDependsStmt(Node *stmt, - const char *queryString); + const char *queryString, + ProcessUtilityContext + processUtilityContext); extern ObjectAddress AlterFunctionDependsStmtObjectAddress(Node *stmt, bool missing_ok); /* grant.c - forward declarations */ -extern List * PreprocessGrantStmt(Node *node, const char *queryString); +extern List * PreprocessGrantStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); /* index.c - forward declarations */ extern bool IsIndexRenameStmt(RenameStmt *renameStmt); extern List * PreprocessIndexStmt(Node *createIndexStatement, - const char *createIndexCommand); + const char *createIndexCommand, + ProcessUtilityContext processUtilityContext); extern char * ChooseIndexName(const char *tabname, Oid namespaceId, List *colnames, List *exclusionOpNames, bool primary, bool isconstraint); extern char * ChooseIndexNameAddition(List *colnames); extern List * ChooseIndexColumnNames(List *indexElems); extern List * PreprocessReindexStmt(Node *ReindexStatement, - const char *ReindexCommand); + const char *ReindexCommand, + ProcessUtilityContext processUtilityContext); extern List * PreprocessDropIndexStmt(Node *dropIndexStatement, - const char *dropIndexCommand); + const char *dropIndexCommand, + ProcessUtilityContext processUtilityContext); extern List * PostprocessIndexStmt(Node *node, const char *queryString); extern void ErrorIfUnsupportedAlterIndexStmt(AlterTableStmt *alterTableStatement); @@ -241,9 +269,12 @@ extern ObjectAddress CreateExtensionStmtObjectAddress(Node *stmt, bool missing_o /* policy.c - forward declarations */ extern List * CreatePolicyCommands(Oid relationId); extern void ErrorIfUnsupportedPolicy(Relation relation); -extern List * PreprocessCreatePolicyStmt(Node *node, const char *queryString); -extern List * PreprocessAlterPolicyStmt(Node *node, const char *queryString); -extern List * PreprocessDropPolicyStmt(Node *stmt, const char *queryString); +extern List * PreprocessCreatePolicyStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessAlterPolicyStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessDropPolicyStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern bool IsPolicyRenameStmt(RenameStmt *stmt); extern void CreatePolicyEventExtendNames(CreatePolicyStmt *stmt, const char *schemaName, uint64 shardId); @@ -256,14 +287,17 @@ extern void DropPolicyEventExtendNames(DropStmt *stmt, const char *schemaName, u /* rename.c - forward declarations*/ -extern List * PreprocessRenameStmt(Node *renameStmt, const char *renameCommand); +extern List * PreprocessRenameStmt(Node *renameStmt, const char *renameCommand, + ProcessUtilityContext processUtilityContext); extern void ErrorIfUnsupportedRenameStmt(RenameStmt *renameStmt); -extern List * PreprocessRenameAttributeStmt(Node *stmt, const char *queryString); +extern List * PreprocessRenameAttributeStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); /* role.c - forward declarations*/ extern List * PostprocessAlterRoleStmt(Node *stmt, const char *queryString); -extern List * PreprocessAlterRoleSetStmt(Node *stmt, const char *queryString); +extern List * PreprocessAlterRoleSetStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * GenerateAlterRoleSetCommandForRole(Oid roleid); extern ObjectAddress AlterRoleStmtObjectAddress(Node *node, bool missing_ok); @@ -273,11 +307,14 @@ extern List * GenerateCreateOrAlterRoleCommand(Oid roleOid); /* schema.c - forward declarations */ extern List * PreprocessDropSchemaStmt(Node *dropSchemaStatement, - const char *queryString); + const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PreprocessAlterObjectSchemaStmt(Node *alterObjectSchemaStmt, const char *alterObjectSchemaCommand); -extern List * PreprocessGrantOnSchemaStmt(Node *node, const char *queryString); -extern List * PreprocessAlterSchemaRenameStmt(Node *node, const char *queryString); +extern List * PreprocessGrantOnSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessAlterSchemaRenameStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); extern ObjectAddress AlterSchemaRenameStmtObjectAddress(Node *node, bool missing_ok); /* sequence.c - forward declarations */ @@ -285,16 +322,25 @@ extern void ErrorIfUnsupportedSeqStmt(CreateSeqStmt *createSeqStmt); extern void ErrorIfDistributedAlterSeqOwnedBy(AlterSeqStmt *alterSeqStmt); /* statistics.c - forward declarations */ -extern List * PreprocessCreateStatisticsStmt(Node *node, const char *queryString); +extern List * PreprocessCreateStatisticsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PostprocessCreateStatisticsStmt(Node *node, const char *queryString); extern ObjectAddress CreateStatisticsStmtObjectAddress(Node *node, bool missingOk); -extern List * PreprocessDropStatisticsStmt(Node *node, const char *queryString); -extern List * PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryString); -extern List * PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString); +extern List * PreprocessDropStatisticsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List * PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); 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 * PreprocessAlterStatisticsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); extern List * GetExplicitStatisticsCommandList(Oid relationId); extern List * GetExplicitStatisticsSchemaIdList(Oid relationId); @@ -303,16 +349,20 @@ extern Node * ProcessCreateSubscriptionStmt(CreateSubscriptionStmt *createSubStm /* table.c - forward declarations */ -extern List * PreprocessDropTableStmt(Node *stmt, const char *queryString); +extern List * PreprocessDropTableStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern void PostprocessCreateTableStmt(CreateStmt *createStatement, const char *queryString); extern List * PostprocessAlterTableStmtAttachPartition( AlterTableStmt *alterTableStatement, const char *queryString); extern List * PostprocessAlterTableSchemaStmt(Node *node, const char *queryString); -extern List * PreprocessAlterTableStmt(Node *node, const char *alterTableCommand); -extern List * PreprocessAlterTableMoveAllStmt(Node *node, const char *queryString); -extern List * PreprocessAlterTableSchemaStmt(Node *node, const char *queryString); +extern List * PreprocessAlterTableStmt(Node *node, const char *alterTableCommand, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessAlterTableMoveAllStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessAlterTableSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); extern Node * WorkerProcessAlterTableStmt(AlterTableStmt *alterTableStatement, const char *alterTableCommand); extern bool IsAlterTableRenameStmt(RenameStmt *renameStmt); @@ -332,18 +382,28 @@ extern List * MakeNameListFromRangeVar(const RangeVar *rel); extern void PreprocessTruncateStatement(TruncateStmt *truncateStatement); /* type.c - forward declarations */ -extern List * PreprocessCompositeTypeStmt(Node *stmt, const char *queryString); +extern List * PreprocessCompositeTypeStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PostprocessCompositeTypeStmt(Node *stmt, const char *queryString); -extern List * PreprocessAlterTypeStmt(Node *stmt, const char *queryString); -extern List * PreprocessCreateEnumStmt(Node *stmt, const char *queryString); +extern List * PreprocessAlterTypeStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessCreateEnumStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PostprocessCreateEnumStmt(Node *stmt, const char *queryString); -extern List * PreprocessAlterEnumStmt(Node *stmt, const char *queryString); +extern List * PreprocessAlterEnumStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PostprocessAlterEnumStmt(Node *stmt, const char *queryString); -extern List * PreprocessDropTypeStmt(Node *stmt, const char *queryString); -extern List * PreprocessRenameTypeStmt(Node *stmt, const char *queryString); -extern List * PreprocessRenameTypeAttributeStmt(Node *stmt, const char *queryString); -extern List * PreprocessAlterTypeSchemaStmt(Node *stmt, const char *queryString); -extern List * PreprocessAlterTypeOwnerStmt(Node *stmt, const char *queryString); +extern List * PreprocessDropTypeStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessRenameTypeStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessRenameTypeAttributeStmt(Node *stmt, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List * PreprocessAlterTypeSchemaStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List * PreprocessAlterTypeOwnerStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PostprocessAlterTypeSchemaStmt(Node *stmt, const char *queryString); extern Node * CreateTypeStmtByObjectAddress(const ObjectAddress *address); extern ObjectAddress CompositeTypeStmtObjectAddress(Node *stmt, bool missing_ok); @@ -384,7 +444,8 @@ extern List * PostprocessAlterTriggerDependsStmt(Node *node, const char *querySt extern void AlterTriggerDependsEventExtendNames( AlterObjectDependsStmt *alterTriggerDependsStmt, char *schemaName, uint64 shardId); -extern List * PreprocessDropTriggerStmt(Node *node, const char *queryString); +extern List * PreprocessDropTriggerStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); extern void ErrorOutForTriggerIfNotCitusLocalTable(Oid relationId); extern void DropTriggerEventExtendNames(DropStmt *dropTriggerStmt, char *schemaName, uint64 shardId);