diff --git a/src/backend/distributed/Makefile b/src/backend/distributed/Makefile index 8f28b04b0..f4f9ffd86 100644 --- a/src/backend/distributed/Makefile +++ b/src/backend/distributed/Makefile @@ -18,7 +18,7 @@ generated_downgrade_sql_files += $(patsubst %,$(citus_abs_srcdir)/build/sql/%,$( DATA_built = $(generated_sql_files) # directories with source files -SUBDIRS = . commands connection ddl deparser executor metadata operations planner progress relay safeclib shardsplit test transaction utils worker clock +SUBDIRS = . commands connection database ddl deparser executor metadata operations planner progress relay safeclib shardsplit test transaction utils worker clock # enterprise modules SUBDIRS += replication diff --git a/src/backend/distributed/commands/database.c b/src/backend/distributed/commands/database.c index 944ff627d..626234434 100644 --- a/src/backend/distributed/commands/database.c +++ b/src/backend/distributed/commands/database.c @@ -19,6 +19,7 @@ #include "miscadmin.h" #include "nodes/parsenodes.h" #include "utils/syscache.h" +#include "utils/builtins.h" #include "distributed/commands.h" #include "distributed/commands/utility_hook.h" @@ -28,13 +29,42 @@ #include "distributed/multi_executor.h" #include "distributed/relation_access_tracking.h" #include "distributed/worker_transaction.h" +#include "distributed/deparser.h" +#include "distributed/worker_protocol.h" +#include "distributed/metadata/distobject.h" +#include "distributed/database/database_sharding.h" +#include "distributed/deparse_shard_query.h" + + + +/* macros to add DefElems to a list */ +#define DEFELEM_ADD_STRING(options, key, value) { \ + DefElem *elem = makeDefElem(key, (Node *) makeString(value), -1); \ + options = lappend(options, elem); \ +} + +#define DEFELEM_ADD_BOOL(options, key, value) { \ + DefElem *elem = makeDefElem(key, (Node *) makeBoolean(value), -1); \ + options = lappend(options, elem); \ +} + +#define DEFELEM_ADD_INT(options, key, value) { \ + DefElem *elem = makeDefElem(key, (Node *) makeInteger(value), -1); \ + options = lappend(options, elem); \ +} static AlterOwnerStmt * RecreateAlterDatabaseOwnerStmt(Oid databaseOid); + +static List * CreateDDLTaskList(char *command, List *workerNodeList, + bool outsideTransaction); + +PG_FUNCTION_INFO_V1(citus_internal_database_command); static Oid get_database_owner(Oid db_oid); List * PreprocessGrantOnDatabaseStmt(Node *node, const char *queryString, ProcessUtilityContext processUtilityContext); /* controlled via GUC */ +bool EnableCreateDatabasePropagation = true; bool EnableAlterDatabaseOwner = true; @@ -148,6 +178,78 @@ PreprocessGrantOnDatabaseStmt(Node *node, const char *queryString, return NodeDDLTaskList(NON_COORDINATOR_NODES, commands); } +/* + * citus_internal_database_command is an internal UDF to + * create/drop a database in an idempotent maner without + * transaction block restrictions. + */ +Datum +citus_internal_database_command(PG_FUNCTION_ARGS) +{ + text *commandText = PG_GETARG_TEXT_P(0); + char *command = text_to_cstring(commandText); + Node *parseTree = ParseTreeNode(command); + + set_config_option("citus.enable_ddl_propagation", "off", + (superuser() ? PGC_SUSET : PGC_USERSET), PGC_S_SESSION, + GUC_ACTION_LOCAL, true, 0, false); + + set_config_option("citus.enable_create_database_propagation", "off", + (superuser() ? PGC_SUSET : PGC_USERSET), PGC_S_SESSION, + GUC_ACTION_LOCAL, true, 0, false); + + if (IsA(parseTree, CreatedbStmt)) + { + CreatedbStmt *stmt = castNode(CreatedbStmt, parseTree); + + bool missingOk = true; + Oid databaseOid = get_database_oid(stmt->dbname, missingOk); + + if (!OidIsValid(databaseOid)) + { + createdb(NULL, (CreatedbStmt *) parseTree); + } + else + { + /* TODO: check database properties */ + } + } + else if (IsA(parseTree, DropdbStmt)) + { + DropdbStmt *stmt = castNode(DropdbStmt, parseTree); + + bool missingOk = true; + Oid databaseOid = get_database_oid(stmt->dbname, missingOk); + + if (!OidIsValid(databaseOid)) + { + /* already dropped? */ + } + else + { + /* remove database from pg_dist_object */ + ObjectAddress dbAddress = { 0 }; + ObjectAddressSet(dbAddress, DatabaseRelationId, databaseOid); + + if (IsObjectDistributed(&dbAddress)) + { + UnmarkObjectDistributed(&dbAddress); + } + + /* remove database from database shards */ + DeleteDatabaseShardByDatabaseIdLocally(databaseOid); + + DropDatabase(NULL, (DropdbStmt *) parseTree); + } + } + else + { + ereport(ERROR, (errmsg("unsupported command type %d", nodeTag(parseTree)))); + } + + PG_RETURN_VOID(); +} + /* * PreprocessAlterDatabaseStmt is executed before the statement is applied to the local @@ -213,6 +315,35 @@ PreprocessAlterDatabaseRefreshCollStmt(Node *node, const char *queryString, #endif +/* + * CreateDDLTaskList creates a task list for running a single DDL command. + */ +static List * +CreateDDLTaskList(char *command, List *workerNodeList, bool outsideTransaction) +{ + List *commandList = list_make3(DISABLE_DDL_PROPAGATION, + command, + ENABLE_DDL_PROPAGATION); + + Task *task = CitusMakeNode(Task); + task->taskType = DDL_TASK; + SetTaskQueryStringList(task, commandList); + task->cannotBeExecutedInTransction = outsideTransaction; + + WorkerNode *workerNode = NULL; + foreach_ptr(workerNode, workerNodeList) + { + ShardPlacement *targetPlacement = CitusMakeNode(ShardPlacement); + targetPlacement->nodeName = workerNode->workerName; + targetPlacement->nodePort = workerNode->workerPort; + targetPlacement->groupId = workerNode->groupId; + task->taskPlacementList = lappend(task->taskPlacementList, + targetPlacement); + } + + return list_make1(task); +} + /* * PreprocessAlterDatabaseSetStmt is executed before the statement is applied to the local @@ -242,3 +373,111 @@ PreprocessAlterDatabaseSetStmt(Node *node, const char *queryString, return NodeDDLTaskList(NON_COORDINATOR_NODES, commands); } + + +/* + * PostprocessCreatedbStmt creates the plan to synchronize CREATE DATABASE + * across nodes. We use the cannotBeExecutedInTransction option to avoid + * u* sending transaction blocks. + */ +List * +PostprocessCreateDatabaseStmt(Node *node, const char *queryString) +{ + if (!EnableCreateDatabasePropagation || !ShouldPropagate()) + { + return NIL; + } + + CreatedbStmt *stmt = castNode(CreatedbStmt, node); + char *databaseName = stmt->dbname; + bool missingOk = false; + Oid databaseOid = get_database_oid(databaseName, missingOk); + + /* + * TODO: try to reuse regular DDL infrastructure + * + * We do not do this right now because of the AssignDatabaseToShard at the end. + */ + List *workerNodes = TargetWorkerSetNodeList(NON_COORDINATOR_METADATA_NODES, RowShareLock); + if (list_length(workerNodes) > 0) + { + char *createDatabaseCommand = DeparseTreeNode(node); + + StringInfo internalCreateCommand = makeStringInfo(); + appendStringInfo(internalCreateCommand, + "SELECT pg_catalog.citus_internal_database_command(%s)", + quote_literal_cstr(createDatabaseCommand)); + + /* + * For the moment, we run CREATE DATABASE in 2PC, though that prevents + * us from immediately doing a pg_dump | pg_restore when dealing with + * a remote template database. + */ + bool outsideTransaction = false; + + List *taskList = CreateDDLTaskList(internalCreateCommand->data, workerNodes, + outsideTransaction); + + bool localExecutionSupported = false; + ExecuteUtilityTaskList(taskList, localExecutionSupported); + } + + /* synchronize pg_dist_object records */ + ObjectAddress dbAddress = { 0 }; + ObjectAddressSet(dbAddress, DatabaseRelationId, databaseOid); + MarkObjectDistributed(&dbAddress); + + + return NIL; +} + +List * +PreprocessDropDatabaseStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) +{ + if (!EnableCreateDatabasePropagation || !ShouldPropagate()) + { + return NIL; + } + + DropdbStmt *stmt = (DropdbStmt *) node; + char *databaseName = stmt->dbname; + bool missingOk = true; + Oid databaseOid = get_database_oid(databaseName, missingOk); + if (databaseOid == InvalidOid) + { + /* let regular ProcessUtility deal with IF NOT EXISTS */ + return NIL; + } + + ObjectAddress dbAddress = { 0 }; + ObjectAddressSet(dbAddress, DatabaseRelationId, databaseOid); + if (!IsObjectDistributed(&dbAddress)) + { + return NIL; + } + + List *workerNodes = TargetWorkerSetNodeList(NON_COORDINATOR_METADATA_NODES, RowShareLock); + if (list_length(workerNodes) == 0) + { + return NIL; + } + + char *dropDatabaseCommand = DeparseTreeNode(node); + + StringInfo internalDropCommand = makeStringInfo(); + appendStringInfo(internalDropCommand, + "SELECT pg_catalog.citus_internal_database_command(%s)", + quote_literal_cstr(dropDatabaseCommand)); + + + /* we execute here to avoid EnsureCoordinator check in ExecuteDistributedDDLJob */ + bool outsideTransaction = false; + List *taskList = CreateDDLTaskList(internalDropCommand->data, workerNodes, + outsideTransaction); + + bool localExecutionSupported = false; + ExecuteUtilityTaskList(taskList, localExecutionSupported); + + return NIL; +} diff --git a/src/backend/distributed/commands/distribute_object_ops.c b/src/backend/distributed/commands/distribute_object_ops.c index a0a306e8d..7465a58cd 100644 --- a/src/backend/distributed/commands/distribute_object_ops.c +++ b/src/backend/distributed/commands/distribute_object_ops.c @@ -466,6 +466,28 @@ static DistributeObjectOps Database_Alter = { .markDistributed = false, }; +static DistributeObjectOps Database_Create = { + .deparse = DeparseCreateDatabaseStmt, + .qualify = NULL, + .preprocess = NULL, + .postprocess = PostprocessCreateDatabaseStmt, + .objectType = OBJECT_DATABASE, + .operationType = DIST_OPS_CREATE, + .address = NULL, + .markDistributed = false, +}; + +static DistributeObjectOps Database_Drop = { + .deparse = DeparseDropDatabaseStmt, + .qualify = NULL, + .preprocess = PreprocessDropDatabaseStmt, + .postprocess = NULL, + .objectType = OBJECT_DATABASE, + .operationType = DIST_OPS_DROP, + .address = NULL, + .markDistributed = false, +}; + #if PG_VERSION_NUM >= PG_VERSION_15 static DistributeObjectOps Database_RefreshColl = { .deparse = DeparseAlterDatabaseRefreshCollStmt, @@ -1333,6 +1355,15 @@ GetDistributeObjectOps(Node *node) { return &Database_Alter; } + case T_CreatedbStmt: + { + return &Database_Create; + } + + case T_DropdbStmt: + { + return &Database_Drop; + } #if PG_VERSION_NUM >= PG_VERSION_15 case T_AlterDatabaseRefreshCollStmt: diff --git a/src/backend/distributed/database/database_sharding.h b/src/backend/distributed/database/database_sharding.h new file mode 100644 index 000000000..390be1383 --- /dev/null +++ b/src/backend/distributed/database/database_sharding.h @@ -0,0 +1,53 @@ +/* + * database_sharding.h + * + * Data structure definition for managing backend data and related function + * + * Copyright (c) Microsoft, Inc. + */ + +#ifndef DATABASE_SHARDING_H +#define DATABASE_SHARDING_H + + +#include "tcop/utility.h" + + +/* attributes of citus_catalog.database_shard */ +#define Natts_database_shard 3 +#define Anum_database_shard_database_id 1 +#define Anum_database_shard_node_group_id 2 +#define Anum_database_shard_is_available 3 + + +typedef struct DatabaseShard +{ + /* database oid */ + Oid databaseOid; + + /* node group on which the database shard is placed */ + int nodeGroupId; + + /* whether the database shard is available */ + bool isAvailable; +} DatabaseShard; + +/* citus.enable_database_sharding setting */ +extern bool EnableDatabaseSharding; + +void PreProcessUtilityInDatabaseShard(Node *parseTree, const char *queryString, + ProcessUtilityContext context, + bool *runPreviousUtilityHook); +void PostProcessUtilityInDatabaseShard(Node *parseTree, const char *queryString, + ProcessUtilityContext context); +bool DatabaseShardingEnabled(void); +void AssignDatabaseToShard(Oid databaseOid); +void UpdateDatabaseShard(Oid databaseOid, int targetNodeGroupId); +void DeleteDatabaseShardByDatabaseIdLocally(Oid databaseOid); +DatabaseShard * GetDatabaseShardByOid(Oid databaseOid); +List * ListDatabaseShards(void); +int64 CitusDatabaseSize(Oid databaseId); +char * InsertDatabaseShardAssignmentCommand(Oid databaseOid, int nodeGroupId); + + +#endif diff --git a/src/backend/distributed/deparser/deparse_database_stmts.c b/src/backend/distributed/deparser/deparse_database_stmts.c index d3d3ce633..1247aba43 100644 --- a/src/backend/distributed/deparser/deparse_database_stmts.c +++ b/src/backend/distributed/deparser/deparse_database_stmts.c @@ -24,7 +24,7 @@ #include "distributed/deparser.h" #include "distributed/log_utils.h" #include "parser/parse_type.h" - +#include "distributed/listutils.h" static void AppendAlterDatabaseOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt); static void AppendAlterDatabaseStmt(StringInfo buf, AlterDatabaseStmt *stmt); @@ -34,7 +34,7 @@ char * DeparseAlterDatabaseOwnerStmt(Node *node) { AlterOwnerStmt *stmt = castNode(AlterOwnerStmt, node); - StringInfoData str = { 0 }; + StringInfoData str = {0}; initStringInfo(&str); Assert(stmt->objectType == OBJECT_DATABASE); @@ -44,7 +44,6 @@ DeparseAlterDatabaseOwnerStmt(Node *node) return str.data; } - static void AppendAlterDatabaseOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt) { @@ -52,18 +51,17 @@ AppendAlterDatabaseOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt) appendStringInfo(buf, "ALTER DATABASE %s OWNER TO %s;", - quote_identifier(strVal((String *) stmt->object)), + quote_identifier(strVal((String *)stmt->object)), RoleSpecString(stmt->newowner, true)); } - static void AppendGrantDatabases(StringInfo buf, GrantStmt *stmt) { ListCell *cell = NULL; appendStringInfo(buf, " ON DATABASE "); - foreach(cell, stmt->objects) + foreach (cell, stmt->objects) { char *database = strVal(lfirst(cell)); appendStringInfoString(buf, quote_identifier(database)); @@ -74,7 +72,6 @@ AppendGrantDatabases(StringInfo buf, GrantStmt *stmt) } } - static void AppendGrantOnDatabaseStmt(StringInfo buf, GrantStmt *stmt) { @@ -87,14 +84,12 @@ AppendGrantOnDatabaseStmt(StringInfo buf, GrantStmt *stmt) AppendGrantSharedSuffix(buf, stmt); } - static void AppendDefElemConnLimit(StringInfo buf, DefElem *def) { - appendStringInfo(buf, " CONNECTION LIMIT %ld", (long int) defGetNumeric(def)); + appendStringInfo(buf, " CONNECTION LIMIT %ld", (long int)defGetNumeric(def)); } - static void AppendAlterDatabaseStmt(StringInfo buf, AlterDatabaseStmt *stmt) { @@ -104,7 +99,7 @@ AppendAlterDatabaseStmt(StringInfo buf, AlterDatabaseStmt *stmt) { ListCell *cell = NULL; appendStringInfo(buf, "WITH "); - foreach(cell, stmt->options) + foreach (cell, stmt->options) { DefElem *def = castNode(DefElem, lfirst(cell)); if (strcmp(def->defname, "is_template") == 0) @@ -133,14 +128,13 @@ AppendAlterDatabaseStmt(StringInfo buf, AlterDatabaseStmt *stmt) appendStringInfo(buf, ";"); } - char * DeparseGrantOnDatabaseStmt(Node *node) { GrantStmt *stmt = castNode(GrantStmt, node); Assert(stmt->objtype == OBJECT_DATABASE); - StringInfoData str = { 0 }; + StringInfoData str = {0}; initStringInfo(&str); AppendGrantOnDatabaseStmt(&str, stmt); @@ -148,13 +142,12 @@ DeparseGrantOnDatabaseStmt(Node *node) return str.data; } - char * DeparseAlterDatabaseStmt(Node *node) { AlterDatabaseStmt *stmt = castNode(AlterDatabaseStmt, node); - StringInfoData str = { 0 }; + StringInfoData str = {0}; initStringInfo(&str); AppendAlterDatabaseStmt(&str, stmt); @@ -162,12 +155,11 @@ DeparseAlterDatabaseStmt(Node *node) return str.data; } - #if PG_VERSION_NUM >= PG_VERSION_15 char * DeparseAlterDatabaseRefreshCollStmt(Node *node) { - AlterDatabaseRefreshCollStmt *stmt = (AlterDatabaseRefreshCollStmt *) node; + AlterDatabaseRefreshCollStmt *stmt = (AlterDatabaseRefreshCollStmt *)node; StringInfoData str; initStringInfo(&str); @@ -179,7 +171,6 @@ DeparseAlterDatabaseRefreshCollStmt(Node *node) return str.data; } - #endif static void @@ -192,16 +183,193 @@ AppendAlterDatabaseSetStmt(StringInfo buf, AlterDatabaseSetStmt *stmt) AppendVariableSet(buf, varSetStmt); } - char * DeparseAlterDatabaseSetStmt(Node *node) { AlterDatabaseSetStmt *stmt = castNode(AlterDatabaseSetStmt, node); - StringInfoData str = { 0 }; + StringInfoData str = {0}; initStringInfo(&str); AppendAlterDatabaseSetStmt(&str, stmt); return str.data; } + +char * +DeparseCreateDatabaseSetStmt(Node *node) +{ + CreatedbStmt *stmt = castNode(CreatedbStmt, node); + StringInfoData str = {0}; + initStringInfo(&str); + + AppendCreatedbStmt(&str, stmt); + + return str.data; +} + +static void +AppendCreatedbStmt(StringInfo buf, CreatedbStmt *stmt) +{ + appendStringInfo(buf, + "CREATE DATABASE %s", + quote_identifier(stmt->dbname)); + + DefElem *option = NULL; + + foreach_ptr(option, stmt->options) + { + if (strcmp(option->defname, "tablespace") == 0) + { + char *tablespaceName = defGetString(option); + + appendStringInfo(buf, " TABLESPACE %s", + quote_identifier(tablespaceName)); + } + else if (strcmp(option->defname, "owner") == 0) + { + char *owner = defGetString(option); + + appendStringInfo(buf, " OWNER %s", + quote_identifier(owner)); + } + else if (strcmp(option->defname, "template") == 0) + { + char *template = defGetString(option); + + appendStringInfo(buf, " TEMPLATE %s", + quote_identifier(template)); + } + else if (strcmp(option->defname, "encoding") == 0) + { + char *encoding = defGetString(option); + + appendStringInfo(buf, " ENCODING %s", + quote_literal_cstr(encoding)); + } + else if (strcmp(option->defname, "locale") == 0) + { + char *locale = defGetString(option); + + appendStringInfo(buf, " LOCALE %s", + quote_literal_cstr(locale)); + } + else if (strcmp(option->defname, "lc_collate") == 0) + { + char *lc_collate = defGetString(option); + + appendStringInfo(buf, " LC_COLLATE %s", + quote_literal_cstr(lc_collate)); + } + else if (strcmp(option->defname, "lc_ctype") == 0) + { + char *lc_ctype = defGetString(option); + + appendStringInfo(buf, " LC_CTYPE %s", + quote_literal_cstr(lc_ctype)); + } + else if (strcmp(option->defname, "icu_locale") == 0) + { + char *icuLocale = defGetString(option); + + appendStringInfo(buf, " ICU_LOCALE %s", + quote_literal_cstr(icuLocale)); + } + else if (strcmp(option->defname, "locale_provider") == 0) + { + char *localeProvider = defGetString(option); + + appendStringInfo(buf, " LOCALE_PROVIDER %s", + quote_literal_cstr(localeProvider)); + } + else if (strcmp(option->defname, "is_template") == 0) + { + bool isTemplate = defGetBoolean(option); + + appendStringInfo(buf, " IS_TEMPLATE %s", + isTemplate ? "true" : "false"); + } + else if (strcmp(option->defname, "allow_connections") == 0) + { + bool allowConnections = defGetBoolean(option); + + appendStringInfo(buf, " ALLOW_CONNECTIONS %s", + allowConnections ? "true" : "false"); + } + else if (strcmp(option->defname, "connection_limit") == 0) + { + int connectionLimit = defGetInt32(option); + + appendStringInfo(buf, " CONNECTION_LIMIT %d", connectionLimit); + } +#if PG_VERSION_NUM >= PG_VERSION_15 + else if (strcmp(option->defname, "collation_version") == 0) + { + char *collationVersion = defGetString(option); + + appendStringInfo(buf, " COLLATION_VERSION %s", + quote_literal_cstr(collationVersion)); + } + else if (strcmp(option->defname, "oid") == 0) + { + Oid objectId = defGetObjectId(option); + + appendStringInfo(buf, " OID %d", objectId); + } + else if (strcmp(option->defname, "strategy") == 0) + { + char *strategy = defGetString(option); + + appendStringInfo(buf, " STRATEGY %s", + quote_literal_cstr(strategy)); + } +#endif + else if (strcmp(option->defname, "location") == 0) + { + /* deprecated option */ + } + else + { + ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized CREATE DATABASE option \"%s\"", + option->defname))); + } + } +} + +char * +DeparseDropDatabaseStmt(Node *node) +{ + DropdbStmt *stmt = castNode(DropdbStmt, node); + StringInfoData str = { 0 }; + initStringInfo(&str); + + AppendDropDatabaseStmt(&str, stmt); + + return str.data; +} + + +static void +AppendDropDatabaseStmt(StringInfo buf, DropdbStmt *stmt) +{ + appendStringInfo(buf, + "DROP DATABASE %s", + quote_identifier(stmt->dbname)); + + DefElem *option = NULL; + + foreach_ptr(option, stmt->options) + { + if (strcmp(option->defname, "force") == 0) + { + appendStringInfo(buf, " FORCE"); + } + else + { + ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized DROP DATABASE option \"%s\"", + option->defname))); + } + } +} diff --git a/src/backend/distributed/sql/citus--12.1-1--12.2-1.sql b/src/backend/distributed/sql/citus--12.1-1--12.2-1.sql index bb9d22969..49fb4ec20 100644 --- a/src/backend/distributed/sql/citus--12.1-1--12.2-1.sql +++ b/src/backend/distributed/sql/citus--12.1-1--12.2-1.sql @@ -1,3 +1,14 @@ -- citus--12.1-1--12.2-1 +/* + * citus_internal_database_command creates a database according to the given command. + */ +CREATE OR REPLACE FUNCTION pg_catalog.citus_internal_database_command(command text) + RETURNS void + LANGUAGE C + STRICT +AS 'MODULE_PATHNAME', $$citus_internal_database_command$$; +COMMENT ON FUNCTION pg_catalog.citus_internal_database_command(text) IS + 'run a database command without transaction block restrictions'; + -- bump version to 12.2-1 diff --git a/src/backend/distributed/sql/downgrades/citus--12.2-1--12.1-1.sql b/src/backend/distributed/sql/downgrades/citus--12.2-1--12.1-1.sql index b26fc16bc..0550bd5cf 100644 --- a/src/backend/distributed/sql/downgrades/citus--12.2-1--12.1-1.sql +++ b/src/backend/distributed/sql/downgrades/citus--12.2-1--12.1-1.sql @@ -1,2 +1,3 @@ -- citus--12.2-1--12.1-1 +DROP FUNCTION pg_catalog.citus_internal_database_command(text); -- this is an empty downgrade path since citus--12.2-1--12.1-1.sql is empty for now diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index 43429278f..6b764dfbb 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -22,7 +22,6 @@ #include "tcop/utility.h" #include "utils/acl.h" - extern bool AddAllLocalTablesToMetadata; extern bool EnableSchemaBasedSharding; @@ -43,11 +42,11 @@ extern bool EnforceLocalObjectRestrictions; extern void SwitchToSequentialAndLocalExecutionIfRelationNameTooLong(Oid relationId, char * - finalRelationName); + finalRelationName); extern void SwitchToSequentialAndLocalExecutionIfPartitionNameTooLong(Oid - parentRelationId, + parentRelationId, Oid - partitionRelationId); + partitionRelationId); /* DistOpsOperationType to be used in DistributeObjectOps */ typedef enum DistOpsOperationType @@ -58,7 +57,6 @@ typedef enum DistOpsOperationType DIST_OPS_DROP, } DistOpsOperationType; - /* * DistributeObjectOps specifies handlers for node/object type pairs. * Instances of this type should all be declared in deparse.c. @@ -79,11 +77,11 @@ typedef enum DistOpsOperationType */ typedef struct DistributeObjectOps { - char * (*deparse)(Node *); + char *(*deparse)(Node *); void (*qualify)(Node *); - List * (*preprocess)(Node *, const char *, ProcessUtilityContext); - List * (*postprocess)(Node *, const char *); - List * (*address)(Node *, bool, bool); + List *(*preprocess)(Node *, const char *, ProcessUtilityContext); + List *(*postprocess)(Node *, const char *); + List *(*address)(Node *, bool, bool); bool markDistributed; /* fields used by common implementations, omitted for specialized implementations */ @@ -101,7 +99,7 @@ typedef struct DistributeObjectOps #define CITUS_TRUNCATE_TRIGGER_NAME "citus_truncate_trigger" -const DistributeObjectOps * GetDistributeObjectOps(Node *node); +const DistributeObjectOps *GetDistributeObjectOps(Node *node); /* * Flags that can be passed to GetForeignKeyOids to indicate @@ -140,7 +138,6 @@ typedef enum ExtractForeignKeyConstraintsMode INCLUDE_SINGLE_SHARD_TABLES } ExtractForeignKeyConstraintMode; - /* * Flags that can be passed to GetForeignKeyIdsForColumn to * indicate whether relationId argument should match: @@ -159,7 +156,6 @@ typedef enum SearchForeignKeyColumnFlags /* callers can also pass union of above flags */ } SearchForeignKeyColumnFlags; - typedef enum TenantOperation { TENANT_UNDISTRIBUTE_TABLE = 0, @@ -176,113 +172,101 @@ extern const char *TenantOperationNames[TOTAL_TENANT_OPERATION]; extern void SaveBeginCommandProperties(TransactionStmt *transactionStmt); /* cluster.c - forward declarations */ -extern List * PreprocessClusterStmt(Node *node, const char *clusterCommand, - ProcessUtilityContext processUtilityContext); +extern List *PreprocessClusterStmt(Node *node, const char *clusterCommand, + ProcessUtilityContext processUtilityContext); /* common.c - forward declarations*/ -extern List * PostprocessCreateDistributedObjectFromCatalogStmt(Node *stmt, - const char *queryString); -extern List * PreprocessAlterDistributedObjectStmt(Node *stmt, const char *queryString, - ProcessUtilityContext - processUtilityContext); -extern List * PostprocessAlterDistributedObjectStmt(Node *stmt, const char *queryString); -extern List * PreprocessDropDistributedObjectStmt(Node *node, const char *queryString, +extern List *PostprocessCreateDistributedObjectFromCatalogStmt(Node *stmt, + const char *queryString); +extern List *PreprocessAlterDistributedObjectStmt(Node *stmt, const char *queryString, ProcessUtilityContext - processUtilityContext); -extern List * DropTextSearchConfigObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * DropTextSearchDictObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); + processUtilityContext); +extern List *PostprocessAlterDistributedObjectStmt(Node *stmt, const char *queryString); +extern List *PreprocessDropDistributedObjectStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List *DropTextSearchConfigObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *DropTextSearchDictObjectAddress(Node *node, bool missing_ok, bool isPostprocess); /* index.c */ typedef void (*PGIndexProcessor)(Form_pg_index, List **, int); - /* call.c */ extern bool CallDistributedProcedureRemotely(CallStmt *callStmt, DestReceiver *dest); - /* collation.c - forward declarations */ -extern char * CreateCollationDDL(Oid collationId); -extern List * CreateCollationDDLsIdempotent(Oid collationId); -extern List * AlterCollationOwnerObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); -extern List * RenameCollationStmtObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); -extern List * AlterCollationSchemaStmtObjectAddress(Node *stmt, - bool missing_ok, bool isPostprocess); -extern char * GenerateBackupNameForCollationCollision(const ObjectAddress *address); -extern List * DefineCollationStmtObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); +extern char *CreateCollationDDL(Oid collationId); +extern List *CreateCollationDDLsIdempotent(Oid collationId); +extern List *AlterCollationOwnerObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *RenameCollationStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *AlterCollationSchemaStmtObjectAddress(Node *stmt, + bool missing_ok, bool isPostprocess); +extern char *GenerateBackupNameForCollationCollision(const ObjectAddress *address); +extern List *DefineCollationStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); /* database.c - forward declarations */ -extern List * AlterDatabaseOwnerObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * DatabaseOwnerDDLCommands(const ObjectAddress *address); +extern List *AlterDatabaseOwnerObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *DatabaseOwnerDDLCommands(const ObjectAddress *address); -extern List * PreprocessGrantOnDatabaseStmt(Node *node, const char *queryString, +extern List *PreprocessGrantOnDatabaseStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); + +extern List *PreprocessAlterDatabaseStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); + +extern List *PreprocessAlterDatabaseRefreshCollStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); + +extern List *PreprocessAlterDatabaseSetStmt(Node *node, const char *queryString, ProcessUtilityContext processUtilityContext); -extern List * PreprocessAlterDatabaseStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); +extern List *PostprocessCreateDatabaseStmt(Node *node, const char *queryString); +extern List *PreprocessDropDatabaseStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); -extern List * PreprocessAlterDatabaseRefreshCollStmt(Node *node, const char *queryString, - ProcessUtilityContext - processUtilityContext); - - -extern List * PreprocessAlterDatabaseSetStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); - - -/* domain.c - forward declarations */ -extern List * CreateDomainStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * AlterDomainStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * DomainRenameConstraintStmtObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * AlterDomainOwnerStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * RenameDomainStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern CreateDomainStmt * RecreateDomainStmt(Oid domainOid); + /* domain.c - forward declarations */ + extern List *CreateDomainStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *AlterDomainStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *DomainRenameConstraintStmtObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *AlterDomainOwnerStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *RenameDomainStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern CreateDomainStmt *RecreateDomainStmt(Oid domainOid); extern Oid get_constraint_typid(Oid conoid); - /* extension.c - forward declarations */ extern bool IsDropCitusExtensionStmt(Node *parsetree); -extern List * GetDependentFDWsToExtension(Oid extensionId); +extern List *GetDependentFDWsToExtension(Oid extensionId); extern bool IsCreateAlterExtensionUpdateCitusStmt(Node *parsetree); extern void PreprocessCreateExtensionStmtForCitusColumnar(Node *parsetree); extern void PreprocessAlterExtensionCitusStmtForCitusColumnar(Node *parsetree); extern void PostprocessAlterExtensionCitusStmtForCitusColumnar(Node *parsetree); extern bool ShouldMarkRelationDistributed(Oid relationId); extern void ErrorIfUnstableCreateOrAlterExtensionStmt(Node *parsetree); -extern List * PostprocessCreateExtensionStmt(Node *stmt, const char *queryString); -extern List * PreprocessDropExtensionStmt(Node *stmt, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PreprocessAlterExtensionSchemaStmt(Node *stmt, - const char *queryString, - ProcessUtilityContext - processUtilityContext); -extern List * PostprocessAlterExtensionSchemaStmt(Node *stmt, - const char *queryString); -extern List * PreprocessAlterExtensionUpdateStmt(Node *stmt, - const char *queryString, - ProcessUtilityContext - processUtilityContext); +extern List *PostprocessCreateExtensionStmt(Node *stmt, const char *queryString); +extern List *PreprocessDropExtensionStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PreprocessAlterExtensionSchemaStmt(Node *stmt, + const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List *PostprocessAlterExtensionSchemaStmt(Node *stmt, + const char *queryString); +extern List *PreprocessAlterExtensionUpdateStmt(Node *stmt, + const char *queryString, + ProcessUtilityContext + processUtilityContext); extern void PostprocessAlterExtensionCitusUpdateStmt(Node *node); -extern List * PreprocessAlterExtensionContentsStmt(Node *node, - const char *queryString, - ProcessUtilityContext - processUtilityContext); -extern List * CreateExtensionDDLCommand(const ObjectAddress *extensionAddress); -extern List * AlterExtensionSchemaStmtObjectAddress(Node *stmt, - bool missing_ok, bool isPostprocess); -extern List * AlterExtensionUpdateStmtObjectAddress(Node *stmt, - bool missing_ok, bool isPostprocess); +extern List *PreprocessAlterExtensionContentsStmt(Node *node, + const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List *CreateExtensionDDLCommand(const ObjectAddress *extensionAddress); +extern List *AlterExtensionSchemaStmtObjectAddress(Node *stmt, + bool missing_ok, bool isPostprocess); +extern List *AlterExtensionUpdateStmtObjectAddress(Node *stmt, + bool missing_ok, bool isPostprocess); extern void CreateExtensionWithVersion(char *extname, char *extVersion); extern void AlterExtensionUpdateStmt(char *extname, char *extVersion); extern int GetExtensionVersionNumber(char *extVersion); @@ -301,21 +285,21 @@ extern void ErrorOutForFKeyBetweenPostgresAndCitusLocalTable(Oid localTableId); extern bool ColumnReferencedByAnyForeignKey(char *columnName, Oid relationId); extern bool ColumnAppearsInForeignKey(char *columnName, Oid relationId); extern bool ColumnAppearsInForeignKeyToReferenceTable(char *columnName, Oid - relationId); -extern List * GetReferencingForeignConstaintCommands(Oid relationOid); -extern List * GetForeignConstraintToReferenceTablesCommands(Oid relationId); -extern List * GetForeignConstraintFromOtherReferenceTablesCommands(Oid relationId); -extern List * GetForeignConstraintToDistributedTablesCommands(Oid relationId); -extern List * GetForeignConstraintFromDistributedTablesCommands(Oid relationId); -extern List * GetForeignConstraintCommandsInternal(Oid relationId, int flags); + relationId); +extern List *GetReferencingForeignConstaintCommands(Oid relationOid); +extern List *GetForeignConstraintToReferenceTablesCommands(Oid relationId); +extern List *GetForeignConstraintFromOtherReferenceTablesCommands(Oid relationId); +extern List *GetForeignConstraintToDistributedTablesCommands(Oid relationId); +extern List *GetForeignConstraintFromDistributedTablesCommands(Oid relationId); +extern List *GetForeignConstraintCommandsInternal(Oid relationId, int flags); extern Oid DropFKeysAndUndistributeTable(Oid relationId); extern void DropFKeysRelationInvolvedWithTableType(Oid relationId, int tableTypeFlag); -extern List * GetFKeyCreationCommandsRelationInvolvedWithTableType(Oid relationId, - int tableTypeFlag); +extern List *GetFKeyCreationCommandsRelationInvolvedWithTableType(Oid relationId, + int tableTypeFlag); extern bool AnyForeignKeyDependsOnIndex(Oid indexId); extern bool HasForeignKeyWithLocalTable(Oid relationId); extern bool HasForeignKeyToReferenceTable(Oid relationOid); -extern List * GetForeignKeysFromLocalTables(Oid relationId); +extern List *GetForeignKeysFromLocalTables(Oid relationId); extern bool TableReferenced(Oid relationOid); extern bool TableReferencing(Oid relationOid); extern bool ConstraintIsAUniquenessConstraint(char *inputConstaintName, Oid relationId); @@ -324,297 +308,269 @@ extern bool ConstraintWithNameIsOfType(char *inputConstaintName, Oid relationId, char targetConstraintType); extern bool ConstraintWithIdIsOfType(Oid constraintId, char targetConstraintType); extern bool TableHasExternalForeignKeys(Oid relationId); -extern List * GetForeignKeyOids(Oid relationId, int flags); +extern List *GetForeignKeyOids(Oid relationId, int flags); extern Oid GetReferencedTableId(Oid foreignKeyId); extern Oid GetReferencingTableId(Oid foreignKeyId); extern bool RelationInvolvedInAnyNonInheritedForeignKeys(Oid relationId); - /* foreign_data_wrapper.c - forward declarations */ -extern List * PreprocessGrantOnFDWStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern Acl * GetPrivilegesForFDW(Oid FDWOid); - +extern List *PreprocessGrantOnFDWStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern Acl *GetPrivilegesForFDW(Oid FDWOid); /* foreign_server.c - forward declarations */ -extern List * PreprocessGrantOnForeignServerStmt(Node *node, const char *queryString, - ProcessUtilityContext - processUtilityContext); -extern List * CreateForeignServerStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * AlterForeignServerStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * RenameForeignServerStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * AlterForeignServerOwnerStmtObjectAddress(Node *node, bool - missing_ok, bool isPostprocess); -extern List * GetForeignServerCreateDDLCommand(Oid serverId); - +extern List *PreprocessGrantOnForeignServerStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List *CreateForeignServerStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *AlterForeignServerStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *RenameForeignServerStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *AlterForeignServerOwnerStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *GetForeignServerCreateDDLCommand(Oid serverId); /* foreign_table.c - forward declarations */ -extern List * PreprocessAlterForeignTableSchemaStmt(Node *node, const char *queryString, - ProcessUtilityContext - processUtilityContext); - +extern List *PreprocessAlterForeignTableSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); /* function.c - forward declarations */ -extern List * PreprocessCreateFunctionStmt(Node *stmt, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PostprocessCreateFunctionStmt(Node *stmt, - const char *queryString); -extern List * CreateFunctionStmtObjectAddress(Node *stmt, - bool missing_ok, bool isPostprocess); -extern List * DefineAggregateStmtObjectAddress(Node *stmt, - bool missing_ok, bool isPostprocess); -extern List * PreprocessAlterFunctionStmt(Node *stmt, const char *queryString, +extern List *PreprocessCreateFunctionStmt(Node *stmt, const char *queryString, ProcessUtilityContext processUtilityContext); -extern List * AlterFunctionStmtObjectAddress(Node *stmt, +extern List *PostprocessCreateFunctionStmt(Node *stmt, + const char *queryString); +extern List *CreateFunctionStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); -extern List * RenameFunctionStmtObjectAddress(Node *stmt, +extern List *DefineAggregateStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); -extern List * AlterFunctionOwnerObjectAddress(Node *stmt, - bool missing_ok, bool isPostprocess); -extern List * AlterFunctionSchemaStmtObjectAddress(Node *stmt, +extern List *PreprocessAlterFunctionStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *AlterFunctionStmtObjectAddress(Node *stmt, + bool missing_ok, bool isPostprocess); +extern List *RenameFunctionStmtObjectAddress(Node *stmt, + bool missing_ok, bool isPostprocess); +extern List *AlterFunctionOwnerObjectAddress(Node *stmt, + bool missing_ok, bool isPostprocess); +extern List *AlterFunctionSchemaStmtObjectAddress(Node *stmt, + bool missing_ok, bool isPostprocess); +extern List *PreprocessAlterFunctionDependsStmt(Node *stmt, + const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List *AlterFunctionDependsStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); -extern List * PreprocessAlterFunctionDependsStmt(Node *stmt, - const char *queryString, - ProcessUtilityContext - processUtilityContext); -extern List * AlterFunctionDependsStmtObjectAddress(Node *stmt, - bool missing_ok, bool isPostprocess); -extern List * PreprocessGrantOnFunctionStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PostprocessGrantOnFunctionStmt(Node *node, const char *queryString); - +extern List *PreprocessGrantOnFunctionStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PostprocessGrantOnFunctionStmt(Node *node, const char *queryString); /* grant.c - forward declarations */ -extern List * PreprocessGrantStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); +extern List *PreprocessGrantStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); extern void deparsePrivileges(StringInfo privsString, GrantStmt *grantStmt); extern void deparseGrantees(StringInfo granteesString, GrantStmt *grantStmt); - /* index.c - forward declarations */ extern bool IsIndexRenameStmt(RenameStmt *renameStmt); -extern List * PreprocessIndexStmt(Node *createIndexStatement, - 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 *PreprocessIndexStmt(Node *createIndexStatement, + 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 LOCKMODE GetCreateIndexRelationLockMode(IndexStmt *createIndexStatement); -extern List * PreprocessReindexStmt(Node *ReindexStatement, - const char *ReindexCommand, - ProcessUtilityContext processUtilityContext); -extern List * ReindexStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); -extern List * PreprocessDropIndexStmt(Node *dropIndexStatement, - const char *dropIndexCommand, - ProcessUtilityContext processUtilityContext); -extern List * PostprocessIndexStmt(Node *node, - const char *queryString); +extern List *PreprocessReindexStmt(Node *ReindexStatement, + const char *ReindexCommand, + ProcessUtilityContext processUtilityContext); +extern List *ReindexStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *PreprocessDropIndexStmt(Node *dropIndexStatement, + const char *dropIndexCommand, + ProcessUtilityContext processUtilityContext); +extern List *PostprocessIndexStmt(Node *node, + const char *queryString); extern void ErrorIfUnsupportedAlterIndexStmt(AlterTableStmt *alterTableStatement); extern void MarkIndexValid(IndexStmt *indexStmt); -extern List * ExecuteFunctionOnEachTableIndex(Oid relationId, PGIndexProcessor - pgIndexProcessor, int flags); +extern List *ExecuteFunctionOnEachTableIndex(Oid relationId, PGIndexProcessor pgIndexProcessor, int flags); extern bool IsReindexWithParam_compat(ReindexStmt *stmt, char *paramName); /* objectaddress.c - forward declarations */ -extern List * CreateExtensionStmtObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); +extern List *CreateExtensionStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); /* owned.c - forward declarations */ -extern List * PreprocessDropOwnedStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); +extern List *PreprocessDropOwnedStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); /* policy.c - forward declarations */ -extern List * CreatePolicyCommands(Oid relationId); +extern List *CreatePolicyCommands(Oid relationId); extern void ErrorIfUnsupportedPolicy(Relation relation); extern void ErrorIfUnsupportedPolicyExpr(Node *expr); -extern List * PostprocessCreatePolicyStmt(Node *node, const char *queryString); -extern List * PreprocessAlterPolicyStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PreprocessDropPolicyStmt(Node *stmt, const char *queryString, +extern List *PostprocessCreatePolicyStmt(Node *node, const char *queryString); +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); extern void AlterPolicyEventExtendNames(AlterPolicyStmt *stmt, const char *schemaName, uint64 shardId); -extern void RenamePolicyEventExtendNames(RenameStmt *stmt, const char *schemaName, uint64 - shardId); -extern void DropPolicyEventExtendNames(DropStmt *stmt, const char *schemaName, uint64 - shardId); +extern void RenamePolicyEventExtendNames(RenameStmt *stmt, const char *schemaName, uint64 shardId); +extern void DropPolicyEventExtendNames(DropStmt *stmt, const char *schemaName, uint64 shardId); extern void AddRangeTableEntryToQueryCompat(ParseState *parseState, Relation relation); /* publication.c - forward declarations */ -extern List * PostProcessCreatePublicationStmt(Node *node, const char *queryString); -extern List * CreatePublicationDDLCommandsIdempotent(const ObjectAddress *address); -extern char * CreatePublicationDDLCommand(Oid publicationId); -extern List * PreprocessAlterPublicationStmt(Node *stmt, const char *queryString, - ProcessUtilityContext processUtilityCtx); -extern List * GetAlterPublicationDDLCommandsForTable(Oid relationId, bool isAdd); -extern char * GetAlterPublicationTableDDLCommand(Oid publicationId, Oid relationId, - bool isAdd); -extern List * AlterPublicationOwnerStmtObjectAddress(Node *node, bool missingOk, - bool isPostProcess); -extern List * AlterPublicationStmtObjectAddress(Node *node, bool missingOk, +extern List *PostProcessCreatePublicationStmt(Node *node, const char *queryString); +extern List *CreatePublicationDDLCommandsIdempotent(const ObjectAddress *address); +extern char *CreatePublicationDDLCommand(Oid publicationId); +extern List *PreprocessAlterPublicationStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityCtx); +extern List *GetAlterPublicationDDLCommandsForTable(Oid relationId, bool isAdd); +extern char *GetAlterPublicationTableDDLCommand(Oid publicationId, Oid relationId, + bool isAdd); +extern List *AlterPublicationOwnerStmtObjectAddress(Node *node, bool missingOk, + bool isPostProcess); +extern List *AlterPublicationStmtObjectAddress(Node *node, bool missingOk, + bool isPostProcess); +extern List *CreatePublicationStmtObjectAddress(Node *node, bool missingOk, + bool isPostProcess); +extern List *RenamePublicationStmtObjectAddress(Node *node, bool missingOk, bool isPostProcess); -extern List * CreatePublicationStmtObjectAddress(Node *node, bool missingOk, - bool isPostProcess); -extern List * RenamePublicationStmtObjectAddress(Node *node, bool missingOk, - bool isPostProcess); /* rename.c - forward declarations*/ -extern List * PreprocessRenameStmt(Node *renameStmt, const char *renameCommand, - ProcessUtilityContext processUtilityContext); +extern List *PreprocessRenameStmt(Node *renameStmt, const char *renameCommand, + ProcessUtilityContext processUtilityContext); extern void ErrorIfUnsupportedRenameStmt(RenameStmt *renameStmt); -extern List * PreprocessRenameAttributeStmt(Node *stmt, const char *queryString, - ProcessUtilityContext processUtilityContext); - +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, - ProcessUtilityContext processUtilityContext); +extern List *PostprocessAlterRoleStmt(Node *stmt, const char *queryString); +extern List *PreprocessAlterRoleSetStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern List * PreprocessAlterRoleRenameStmt(Node *stmt, const char *queryString, ProcessUtilityContext processUtilityContext); -extern List * GenerateAlterRoleSetCommandForRole(Oid roleid); -extern List * AlterRoleStmtObjectAddress(Node *node, - bool missing_ok, bool isPostprocess); -extern List * AlterRoleSetStmtObjectAddress(Node *node, - bool missing_ok, bool isPostprocess); -extern List * PreprocessCreateRoleStmt(Node *stmt, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PreprocessDropRoleStmt(Node *stmt, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PreprocessGrantRoleStmt(Node *stmt, const char *queryString, +extern List *GenerateAlterRoleSetCommandForRole(Oid roleid); +extern List *AlterRoleStmtObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *AlterRoleSetStmtObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *PreprocessCreateRoleStmt(Node *stmt, const char *queryString, ProcessUtilityContext processUtilityContext); -extern List * PostprocessGrantRoleStmt(Node *stmt, const char *queryString); -extern List * GenerateCreateOrAlterRoleCommand(Oid roleOid); -extern List * CreateRoleStmtObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); +extern List *PreprocessDropRoleStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PreprocessGrantRoleStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PostprocessGrantRoleStmt(Node *stmt, const char *queryString); +extern List *GenerateCreateOrAlterRoleCommand(Oid roleOid); +extern List *CreateRoleStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); extern List * RenameRoleStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); extern void UnmarkRolesDistributed(List *roles); -extern List * FilterDistributedRoles(List *roles); +extern List *FilterDistributedRoles(List *roles); /* schema.c - forward declarations */ -extern List * PostprocessCreateSchemaStmt(Node *node, const char *queryString); -extern List * PreprocessDropSchemaStmt(Node *dropSchemaStatement, - const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PreprocessAlterObjectSchemaStmt(Node *alterObjectSchemaStmt, - const char *alterObjectSchemaCommand); -extern List * PreprocessGrantOnSchemaStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * CreateSchemaStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * AlterSchemaOwnerStmtObjectAddress(Node *node, bool missing_ok, - bool isPostprocess); -extern List * AlterSchemaRenameStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); +extern List *PostprocessCreateSchemaStmt(Node *node, const char *queryString); +extern List *PreprocessDropSchemaStmt(Node *dropSchemaStatement, + const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PreprocessAlterObjectSchemaStmt(Node *alterObjectSchemaStmt, + const char *alterObjectSchemaCommand); +extern List *PreprocessGrantOnSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *CreateSchemaStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *AlterSchemaOwnerStmtObjectAddress(Node *node, bool missing_ok, + bool isPostprocess); +extern List *AlterSchemaRenameStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); /* sequence.c - forward declarations */ -extern List * PreprocessAlterSequenceStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PreprocessAlterSequenceSchemaStmt(Node *node, const char *queryString, - ProcessUtilityContext - processUtilityContext); -extern List * PostprocessAlterSequenceSchemaStmt(Node *node, const char *queryString); -extern List * PreprocessAlterSequenceOwnerStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PostprocessAlterSequenceOwnerStmt(Node *node, const char *queryString); -#if (PG_VERSION_NUM >= PG_VERSION_15) -extern List * PreprocessAlterSequencePersistenceStmt(Node *node, const char *queryString, - ProcessUtilityContext - processUtilityContext); -extern List * PreprocessSequenceAlterTableStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -#endif -extern List * PreprocessDropSequenceStmt(Node *node, const char *queryString, +extern List *PreprocessAlterSequenceStmt(Node *node, const char *queryString, ProcessUtilityContext processUtilityContext); -extern List * SequenceDropStmtObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); -extern List * PreprocessRenameSequenceStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PreprocessGrantOnSequenceStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PostprocessGrantOnSequenceStmt(Node *node, const char *queryString); -extern List * AlterSequenceStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * AlterSequenceSchemaStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * AlterSequenceOwnerStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); +extern List *PreprocessAlterSequenceSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List *PostprocessAlterSequenceSchemaStmt(Node *node, const char *queryString); +extern List *PreprocessAlterSequenceOwnerStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PostprocessAlterSequenceOwnerStmt(Node *node, const char *queryString); #if (PG_VERSION_NUM >= PG_VERSION_15) -extern List * AlterSequencePersistenceStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); +extern List *PreprocessAlterSequencePersistenceStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List *PreprocessSequenceAlterTableStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); #endif -extern List * RenameSequenceStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); +extern List *PreprocessDropSequenceStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *SequenceDropStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *PreprocessRenameSequenceStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PreprocessGrantOnSequenceStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PostprocessGrantOnSequenceStmt(Node *node, const char *queryString); +extern List *AlterSequenceStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *AlterSequenceSchemaStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *AlterSequenceOwnerStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +#if (PG_VERSION_NUM >= PG_VERSION_15) +extern List *AlterSequencePersistenceStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +#endif +extern List *RenameSequenceStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); extern void ErrorIfUnsupportedSeqStmt(CreateSeqStmt *createSeqStmt); extern void ErrorIfDistributedAlterSeqOwnedBy(AlterSeqStmt *alterSeqStmt); -extern char * GenerateBackupNameForSequenceCollision(const ObjectAddress *address); +extern char *GenerateBackupNameForSequenceCollision(const ObjectAddress *address); extern void RenameExistingSequenceWithDifferentTypeIfExists(RangeVar *sequence, Oid desiredSeqTypeId); /* statistics.c - forward declarations */ -extern List * PreprocessCreateStatisticsStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PostprocessCreateStatisticsStmt(Node *node, const char *queryString); -extern List * CreateStatisticsStmtObjectAddress(Node *node, bool missingOk, bool - isPostprocess); -extern List * PreprocessDropStatisticsStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * DropStatisticsObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -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 List * AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk, bool - isPostprocess); -extern List * PreprocessAlterStatisticsStmt(Node *node, const char *queryString, +extern List *PreprocessCreateStatisticsStmt(Node *node, const char *queryString, ProcessUtilityContext processUtilityContext); -extern List * PreprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString, +extern List *PostprocessCreateStatisticsStmt(Node *node, const char *queryString); +extern List *CreateStatisticsStmtObjectAddress(Node *node, bool missingOk, bool isPostprocess); +extern List *PreprocessDropStatisticsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *DropStatisticsObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *PreprocessAlterStatisticsRenameStmt(Node *node, const char *queryString, ProcessUtilityContext - processUtilityContext); -extern List * PostprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString); -extern List * GetExplicitStatisticsCommandList(Oid relationId); -extern List * GetExplicitStatisticsSchemaIdList(Oid relationId); -extern List * GetAlterIndexStatisticsCommands(Oid indexOid); + processUtilityContext); +extern List *PreprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List *PostprocessAlterStatisticsSchemaStmt(Node *node, const char *queryString); +extern List *AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk, bool isPostprocess); +extern List *PreprocessAlterStatisticsStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PreprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern List *PostprocessAlterStatisticsOwnerStmt(Node *node, const char *queryString); +extern List *GetExplicitStatisticsCommandList(Oid relationId); +extern List *GetExplicitStatisticsSchemaIdList(Oid relationId); +extern List *GetAlterIndexStatisticsCommands(Oid indexOid); /* subscription.c - forward declarations */ -extern Node * ProcessCreateSubscriptionStmt(CreateSubscriptionStmt *createSubStmt); - +extern Node *ProcessCreateSubscriptionStmt(CreateSubscriptionStmt *createSubStmt); /* table.c - forward declarations */ -extern List * PreprocessDropTableStmt(Node *stmt, const char *queryString, - ProcessUtilityContext processUtilityContext); +extern List *PreprocessDropTableStmt(Node *stmt, const char *queryString, + ProcessUtilityContext processUtilityContext); extern void PostprocessCreateTableStmt(CreateStmt *createStatement, const char *queryString); extern bool ShouldEnableLocalReferenceForeignKeys(void); -extern List * PreprocessAlterTableStmtAttachPartition(AlterTableStmt *alterTableStatement, - const char *queryString); -extern List * PostprocessAlterTableSchemaStmt(Node *node, const char *queryString); +extern List *PreprocessAlterTableStmtAttachPartition(AlterTableStmt *alterTableStatement, + const char *queryString); +extern List *PostprocessAlterTableSchemaStmt(Node *node, const char *queryString); extern void PrepareAlterTableStmtForConstraint(AlterTableStmt *alterTableStatement, Oid relationId, Constraint *constraint); -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, +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 void SkipForeignKeyValidationIfConstraintIsFkey(AlterTableStmt *alterTableStmt, bool processLocalRelation); extern bool IsAlterTableRenameStmt(RenameStmt *renameStmt); @@ -626,160 +582,144 @@ extern void ErrorUnsupportedAlterTableAddColumn(Oid relationId, AlterTableCmd *c extern void ErrorIfUnsupportedConstraint(Relation relation, char distributionMethod, char referencingReplicationModel, Var *distributionColumn, uint32 colocationId); -extern List * InterShardDDLTaskList(Oid leftRelationId, Oid rightRelationId, - const char *commandString); -extern List * AlterTableSchemaStmtObjectAddress(Node *stmt, - bool missing_ok, bool isPostprocess); -extern List * MakeNameListFromRangeVar(const RangeVar *rel); +extern List *InterShardDDLTaskList(Oid leftRelationId, Oid rightRelationId, + const char *commandString); +extern List *AlterTableSchemaStmtObjectAddress(Node *stmt, + bool missing_ok, bool isPostprocess); +extern List *MakeNameListFromRangeVar(const RangeVar *rel); extern Oid GetSequenceOid(Oid relationId, AttrNumber attnum); extern bool ConstrTypeUsesIndex(ConstrType constrType); extern bool ConstrTypeCitusCanDefaultName(ConstrType constrType); -extern char * GetAlterColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, - char *colname, bool missingTableOk); +extern char *GetAlterColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, + char *colname, bool missingTableOk); extern void ErrorIfTableHasIdentityColumn(Oid relationId); extern void ConvertNewTableIfNecessary(Node *createStmt); extern void ConvertToTenantTableIfNecessary(AlterObjectSchemaStmt *alterObjectSchemaStmt); /* text_search.c - forward declarations */ -extern List * GetCreateTextSearchConfigStatements(const ObjectAddress *address); -extern List * GetCreateTextSearchDictionaryStatements(const ObjectAddress *address); -extern List * CreateTextSearchConfigDDLCommandsIdempotent(const ObjectAddress *address); -extern List * CreateTextSearchDictDDLCommandsIdempotent(const ObjectAddress *address); -extern List * CreateTextSearchConfigurationObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * CreateTextSearchDictObjectAddress(Node *node, +extern List *GetCreateTextSearchConfigStatements(const ObjectAddress *address); +extern List *GetCreateTextSearchDictionaryStatements(const ObjectAddress *address); +extern List *CreateTextSearchConfigDDLCommandsIdempotent(const ObjectAddress *address); +extern List *CreateTextSearchDictDDLCommandsIdempotent(const ObjectAddress *address); +extern List *CreateTextSearchConfigurationObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *CreateTextSearchDictObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *RenameTextSearchConfigurationStmtObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *RenameTextSearchDictionaryStmtObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *AlterTextSearchConfigurationStmtObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *AlterTextSearchDictionaryStmtObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *AlterTextSearchConfigurationSchemaStmtObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *AlterTextSearchDictionarySchemaStmtObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *TextSearchConfigurationCommentObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *TextSearchDictCommentObjectAddress(Node *node, bool missing_ok, bool isPostprocess); -extern List * RenameTextSearchConfigurationStmtObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * RenameTextSearchDictionaryStmtObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * AlterTextSearchConfigurationStmtObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * AlterTextSearchDictionaryStmtObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * AlterTextSearchConfigurationSchemaStmtObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * AlterTextSearchDictionarySchemaStmtObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * TextSearchConfigurationCommentObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * TextSearchDictCommentObjectAddress(Node *node, - bool missing_ok, bool isPostprocess); -extern List * AlterTextSearchConfigurationOwnerObjectAddress(Node *node, - bool missing_ok, bool - isPostprocess); -extern List * AlterTextSearchDictOwnerObjectAddress(Node *node, - bool missing_ok, bool isPostprocess); -extern char * GenerateBackupNameForTextSearchConfiguration(const ObjectAddress *address); -extern char * GenerateBackupNameForTextSearchDict(const ObjectAddress *address); -extern List * get_ts_config_namelist(Oid tsconfigOid); +extern List *AlterTextSearchConfigurationOwnerObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern List *AlterTextSearchDictOwnerObjectAddress(Node *node, + bool missing_ok, bool isPostprocess); +extern char *GenerateBackupNameForTextSearchConfiguration(const ObjectAddress *address); +extern char *GenerateBackupNameForTextSearchDict(const ObjectAddress *address); +extern List *get_ts_config_namelist(Oid tsconfigOid); /* truncate.c - forward declarations */ extern void PreprocessTruncateStatement(TruncateStmt *truncateStatement); /* type.c - forward declarations */ -extern List * PreprocessRenameTypeAttributeStmt(Node *stmt, const char *queryString, - ProcessUtilityContext - processUtilityContext); -extern Node * CreateTypeStmtByObjectAddress(const ObjectAddress *address); -extern List * CompositeTypeStmtObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); -extern List * CreateEnumStmtObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); -extern List * AlterTypeStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); -extern List * AlterEnumStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); -extern List * RenameTypeStmtObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); -extern List * AlterTypeSchemaStmtObjectAddress(Node *stmt, - bool missing_ok, bool isPostprocess); -extern List * RenameTypeAttributeStmtObjectAddress(Node *stmt, - bool missing_ok); -extern List * AlterTypeOwnerObjectAddress(Node *stmt, bool missing_ok, bool - isPostprocess); -extern List * CreateTypeDDLCommandsIdempotent(const ObjectAddress *typeAddress); -extern char * GenerateBackupNameForTypeCollision(const ObjectAddress *address); +extern List *PreprocessRenameTypeAttributeStmt(Node *stmt, const char *queryString, + ProcessUtilityContext + processUtilityContext); +extern Node *CreateTypeStmtByObjectAddress(const ObjectAddress *address); +extern List *CompositeTypeStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *CreateEnumStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *AlterTypeStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *AlterEnumStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *RenameTypeStmtObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *AlterTypeSchemaStmtObjectAddress(Node *stmt, + bool missing_ok, bool isPostprocess); +extern List *RenameTypeAttributeStmtObjectAddress(Node *stmt, + bool missing_ok); +extern List *AlterTypeOwnerObjectAddress(Node *stmt, bool missing_ok, bool isPostprocess); +extern List *CreateTypeDDLCommandsIdempotent(const ObjectAddress *typeAddress); +extern char *GenerateBackupNameForTypeCollision(const ObjectAddress *address); /* function.c - forward declarations */ -extern List * CreateFunctionDDLCommandsIdempotent(const ObjectAddress *functionAddress); -extern char * GetFunctionDDLCommand(const RegProcedure funcOid, bool useCreateOrReplace); -extern char * GenerateBackupNameForProcCollision(const ObjectAddress *address); -extern ObjectWithArgs * ObjectWithArgsFromOid(Oid funcOid); +extern List *CreateFunctionDDLCommandsIdempotent(const ObjectAddress *functionAddress); +extern char *GetFunctionDDLCommand(const RegProcedure funcOid, bool useCreateOrReplace); +extern char *GenerateBackupNameForProcCollision(const ObjectAddress *address); +extern ObjectWithArgs *ObjectWithArgsFromOid(Oid funcOid); extern void UpdateFunctionDistributionInfo(const ObjectAddress *distAddress, int *distribution_argument_index, int *colocationId, bool *forceDelegation); /* vacuum.c - forward declarations */ -extern List * PostprocessVacuumStmt(Node *node, const char *vacuumCommand); +extern List *PostprocessVacuumStmt(Node *node, const char *vacuumCommand); /* view.c - forward declarations */ -extern List * PreprocessViewStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PostprocessViewStmt(Node *node, const char *queryString); -extern List * ViewStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); -extern List * AlterViewStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); -extern List * PreprocessDropViewStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * DropViewStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); -extern char * CreateViewDDLCommand(Oid viewOid); -extern List * GetViewCreationCommandsOfTable(Oid relationId); -extern char * AlterViewOwnerCommand(Oid viewOid); -extern char * DeparseViewStmt(Node *node); -extern char * DeparseDropViewStmt(Node *node); +extern List *PreprocessViewStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PostprocessViewStmt(Node *node, const char *queryString); +extern List *ViewStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *AlterViewStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *PreprocessDropViewStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *DropViewStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern char *CreateViewDDLCommand(Oid viewOid); +extern List *GetViewCreationCommandsOfTable(Oid relationId); +extern char *AlterViewOwnerCommand(Oid viewOid); +extern char *DeparseViewStmt(Node *node); +extern char *DeparseDropViewStmt(Node *node); extern bool IsViewDistributed(Oid viewOid); -extern List * CreateViewDDLCommandsIdempotent(Oid viewOid); -extern List * PreprocessAlterViewStmt(Node *node, const char *queryString, +extern List *CreateViewDDLCommandsIdempotent(Oid viewOid); +extern List *PreprocessAlterViewStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PostprocessAlterViewStmt(Node *node, const char *queryString); +extern List *PreprocessRenameViewStmt(Node *node, const char *queryString, ProcessUtilityContext processUtilityContext); -extern List * PostprocessAlterViewStmt(Node *node, const char *queryString); -extern List * PreprocessRenameViewStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * RenameViewStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); -extern List * PreprocessAlterViewSchemaStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PostprocessAlterViewSchemaStmt(Node *node, const char *queryString); -extern List * AlterViewSchemaStmtObjectAddress(Node *node, bool missing_ok, bool - isPostprocess); +extern List *RenameViewStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); +extern List *PreprocessAlterViewSchemaStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PostprocessAlterViewSchemaStmt(Node *node, const char *queryString); +extern List *AlterViewSchemaStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); extern bool IsViewRenameStmt(RenameStmt *renameStmt); /* trigger.c - forward declarations */ -extern List * GetExplicitTriggerCommandList(Oid relationId); +extern List *GetExplicitTriggerCommandList(Oid relationId); extern HeapTuple GetTriggerTupleById(Oid triggerId, bool missingOk); -extern List * GetExplicitTriggerIdList(Oid relationId); -extern List * PostprocessCreateTriggerStmt(Node *node, const char *queryString); -extern List * CreateTriggerStmtObjectAddress(Node *node, bool missingOk, bool - isPostprocess); +extern List *GetExplicitTriggerIdList(Oid relationId); +extern List *PostprocessCreateTriggerStmt(Node *node, const char *queryString); +extern List *CreateTriggerStmtObjectAddress(Node *node, bool missingOk, bool isPostprocess); extern void CreateTriggerEventExtendNames(CreateTrigStmt *createTriggerStmt, char *schemaName, uint64 shardId); -extern List * PreprocessAlterTriggerRenameStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); -extern List * PostprocessAlterTriggerRenameStmt(Node *node, const char *queryString); +extern List *PreprocessAlterTriggerRenameStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); +extern List *PostprocessAlterTriggerRenameStmt(Node *node, const char *queryString); extern void AlterTriggerRenameEventExtendNames(RenameStmt *renameTriggerStmt, char *schemaName, uint64 shardId); -extern List * PostprocessAlterTriggerDependsStmt(Node *node, const char *queryString); -extern List * PreprocessAlterTriggerDependsStmt(Node *node, const char *queryString, - ProcessUtilityContext - processUtilityContext); +extern List *PostprocessAlterTriggerDependsStmt(Node *node, const char *queryString); +extern List *PreprocessAlterTriggerDependsStmt(Node *node, const char *queryString, + ProcessUtilityContext + processUtilityContext); extern void AlterTriggerDependsEventExtendNames( AlterObjectDependsStmt *alterTriggerDependsStmt, char *schemaName, uint64 shardId); extern void ErrorOutForTriggerIfNotSupported(Oid relationId); extern void ErrorIfRelationHasUnsupportedTrigger(Oid relationId); -extern List * PreprocessDropTriggerStmt(Node *node, const char *queryString, - ProcessUtilityContext processUtilityContext); +extern List *PreprocessDropTriggerStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); extern void DropTriggerEventExtendNames(DropStmt *dropTriggerStmt, char *schemaName, uint64 shardId); -extern List * CitusCreateTriggerCommandDDLJob(Oid relationId, char *triggerName, - const char *queryString); +extern List *CitusCreateTriggerCommandDDLJob(Oid relationId, char *triggerName, + const char *queryString); extern Oid GetTriggerFunctionId(Oid triggerId); /* cascade_table_operation_for_connected_relations.c */ @@ -806,12 +746,12 @@ typedef enum CascadeOperationType extern void CascadeOperationForFkeyConnectedRelations(Oid relationId, LOCKMODE relLockMode, CascadeOperationType - cascadeOperationType); + cascadeOperationType); extern void CascadeOperationForRelationIdList(List *relationIdList, LOCKMODE lockMode, CascadeOperationType cascadeOperationType); extern void ErrorIfAnyPartitionRelationInvolvedInNonInheritedFKey(List *relationIdList); extern bool RelationIdListHasReferenceTable(List *relationIdList); -extern List * GetFKeyCreationCommandsForRelationIdList(List *relationIdList); +extern List *GetFKeyCreationCommandsForRelationIdList(List *relationIdList); extern void DropRelationForeignKeys(Oid relationId, int flags); extern void SetLocalEnableLocalReferenceForeignKeys(bool state); extern void ExecuteAndLogUtilityCommandListInTableTypeConversionViaSPI( @@ -825,7 +765,7 @@ extern void ExecuteForeignKeyCreateCommandList(List *ddlCommandList, extern void CreateCitusLocalTable(Oid relationId, bool cascadeViaForeignKeys, bool autoConverted); extern bool ShouldAddNewTableToMetadata(Oid relationId); -extern List * GetExplicitIndexOidList(Oid relationId); +extern List *GetExplicitIndexOidList(Oid relationId); extern bool ShouldPropagateSetCommand(VariableSetStmt *setStmt); extern void PostprocessVariableSetStmt(VariableSetStmt *setStmt, const char *setCommand); @@ -833,7 +773,7 @@ extern void PostprocessVariableSetStmt(VariableSetStmt *setStmt, const char *set extern void CreateCitusLocalTablePartitionOf(CreateStmt *createStatement, Oid relationId, Oid parentRelationId); extern void UpdateAutoConvertedForConnectedRelations(List *relationId, bool - autoConverted); + autoConverted); /* schema_based_sharding.c */ extern bool ShouldUseSchemaBasedSharding(char *schemaName); diff --git a/src/include/distributed/deparser.h b/src/include/distributed/deparser.h index 95d948bc9..f7ba8c02b 100644 --- a/src/include/distributed/deparser.h +++ b/src/include/distributed/deparser.h @@ -227,6 +227,9 @@ extern char * DeparseGrantOnDatabaseStmt(Node *node); extern char * DeparseAlterDatabaseStmt(Node *node); extern char * DeparseAlterDatabaseRefreshCollStmt(Node *node); extern char * DeparseAlterDatabaseSetStmt(Node *node); +extern char * DeparseCreateDatabaseStmt(Node *node); +extern char * DeparseDropDatabaseStmt(Node *node); + /* forward declaration for deparse_publication_stmts.c */ diff --git a/src/include/distributed/metadata/distobject.h b/src/include/distributed/metadata/distobject.h index de56c0e1f..ba984091c 100644 --- a/src/include/distributed/metadata/distobject.h +++ b/src/include/distributed/metadata/distobject.h @@ -21,6 +21,7 @@ extern bool ObjectExists(const ObjectAddress *address); extern bool CitusExtensionObject(const ObjectAddress *objectAddress); extern bool IsAnyObjectDistributed(const List *addresses); +extern bool IsObjectDistributed(const ObjectAddress *address); extern bool ClusterHasDistributedFunctionWithDistArgument(void); extern void MarkObjectDistributed(const ObjectAddress *distAddress); extern void MarkObjectDistributedViaSuperUser(const ObjectAddress *distAddress);