From 6a333ca742fd584c05429104ff5e8f1749599f39 Mon Sep 17 00:00:00 2001 From: gindibay Date: Wed, 11 Oct 2023 19:59:33 +0300 Subject: [PATCH] Adds alter database rename stmt propagation --- src/backend/distributed/commands/database.c | 26 +++++++++++++++++-- .../commands/distribute_object_ops.c | 15 +++++++++++ .../deparser/deparse_database_stmts.c | 16 +++++++++++- src/include/distributed/commands.h | 3 +++ src/include/distributed/deparser.h | 1 + 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/commands/database.c b/src/backend/distributed/commands/database.c index 17f45ec10..baf7fb7dc 100644 --- a/src/backend/distributed/commands/database.c +++ b/src/backend/distributed/commands/database.c @@ -184,7 +184,7 @@ PreprocessAlterDatabaseStmt(Node *node, const char *queryString, if (strstr(sql, "SET TABLESPACE") != NULL) { - if (IsCoordinatorNode()) + if (IsCoordinator()) { ereport(NOTICE, (errmsg( "Citus partially supports ALTER DATABASE SET TABLESPACE for " @@ -240,9 +240,31 @@ PreprocessAlterDatabaseRefreshCollStmt(Node *node, const char *queryString, return NodeDDLTaskList(NON_COORDINATOR_NODES, commands); } - #endif + +List * +PreprocessAlterDatabaseRenameStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext) +{ + if (!ShouldPropagate()) + { + return NIL; + } + + RenameStmt *stmt = castNode(RenameStmt, node); + + EnsureCoordinator(); + + char *sql = DeparseTreeNode((Node *) stmt); + + List *commands = list_make3(DISABLE_DDL_PROPAGATION, + (void *) sql, + ENABLE_DDL_PROPAGATION); + + return NodeDDLTaskList(NON_COORDINATOR_NODES, commands); +} + /* * CreateDDLTaskList creates a task list for running a single DDL command. */ diff --git a/src/backend/distributed/commands/distribute_object_ops.c b/src/backend/distributed/commands/distribute_object_ops.c index ef7d486b5..60a452d37 100644 --- a/src/backend/distributed/commands/distribute_object_ops.c +++ b/src/backend/distributed/commands/distribute_object_ops.c @@ -512,6 +512,16 @@ static DistributeObjectOps Database_Set = { .markDistributed = false, }; +static DistributeObjectOps Database_Rename = { + .deparse = DeparseAlterDatabaseRenameStmt, + .qualify = NULL, + .preprocess = PreprocessAlterDatabaseRenameStmt, + .postprocess = NULL, + .objectType = OBJECT_DATABASE, + .operationType = DIST_OPS_ALTER, + .address = NULL, + .markDistributed = false, +}; static DistributeObjectOps Domain_Alter = { .deparse = DeparseAlterDomainStmt, @@ -2072,6 +2082,11 @@ GetDistributeObjectOps(Node *node) return &Collation_Rename; } + case OBJECT_DATABASE: + { + return &Database_Rename; + } + case OBJECT_DOMAIN: { return &Domain_Rename; diff --git a/src/backend/distributed/deparser/deparse_database_stmts.c b/src/backend/distributed/deparser/deparse_database_stmts.c index ae8a37e87..daa1d28e3 100644 --- a/src/backend/distributed/deparser/deparse_database_stmts.c +++ b/src/backend/distributed/deparser/deparse_database_stmts.c @@ -208,9 +208,23 @@ DeparseAlterDatabaseRefreshCollStmt(Node *node) return str.data; } - #endif +char * +DeparseAlterDatabaseRenameStmt(Node *node) +{ + RenameStmt *stmt = (RenameStmt *) node; + + StringInfoData str; + initStringInfo(&str); + + appendStringInfo(&str, "ALTER DATABASE %s RENAME TO %s", + quote_identifier(stmt->subname), + quote_identifier(stmt->newname)); + + return str.data; +} + static void AppendAlterDatabaseSetStmt(StringInfo buf, AlterDatabaseSetStmt *stmt) { diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index 36e412378..fd810616f 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -231,6 +231,9 @@ extern List * PostprocessCreateDatabaseStmt(Node *node, const char *queryString) extern List * PreprocessDropDatabaseStmt(Node *node, const char *queryString, ProcessUtilityContext processUtilityContext); +extern List * PreprocessAlterDatabaseRenameStmt(Node *node, const char *queryString, + ProcessUtilityContext processUtilityContext); + /* domain.c - forward declarations */ extern List * CreateDomainStmtObjectAddress(Node *node, bool missing_ok, bool isPostprocess); diff --git a/src/include/distributed/deparser.h b/src/include/distributed/deparser.h index d47d3c18a..dabad79e8 100644 --- a/src/include/distributed/deparser.h +++ b/src/include/distributed/deparser.h @@ -243,6 +243,7 @@ extern char * DeparseAlterDatabaseRefreshCollStmt(Node *node); extern char * DeparseAlterDatabaseSetStmt(Node *node); extern char * DeparseCreateDatabaseStmt(Node *node); extern char * DeparseDropDatabaseStmt(Node *node); +extern char * DeparseAlterDatabaseRenameStmt(Node *node); /* forward declaration for deparse_publication_stmts.c */