From f1f7313c8b29c3fe707b94ad74a478e39d212f42 Mon Sep 17 00:00:00 2001 From: gindibay Date: Wed, 22 Nov 2023 15:50:23 +0300 Subject: [PATCH] Adds dependencies --- src/backend/distributed/commands/dependencies.c | 4 ++-- src/backend/distributed/commands/owned.c | 16 ++++++++++++++++ src/include/distributed/metadata_utility.h | 2 +- src/test/regress/sql/reassign_owned.sql | 2 ++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/commands/dependencies.c b/src/backend/distributed/commands/dependencies.c index 430726814..ae828a574 100644 --- a/src/backend/distributed/commands/dependencies.c +++ b/src/backend/distributed/commands/dependencies.c @@ -47,7 +47,7 @@ static bool ShouldPropagateObject(const ObjectAddress *address); static char * DropTableIfExistsCommand(Oid relationId); /* - * EnsureObjectExistOnAllNodes is a wrapper around + * EnsureObjectAndDependenciesExistOnAllNodes is a wrapper around * EnsureRequiredObjectExistOnAllNodes to ensure the "object itself" (together * with its dependencies) is available on all nodes. * @@ -55,7 +55,7 @@ static char * DropTableIfExistsCommand(Oid relationId); * function deals with an object created within the same transaction. */ void -EnsureObjectExistOnAllNodes(const ObjectAddress *target) +EnsureObjectAndDependenciesExistOnAllNodes(const ObjectAddress *target) { EnsureRequiredObjectExistOnAllNodes(target, REQUIRE_OBJECT_AND_DEPENDENCIES); } diff --git a/src/backend/distributed/commands/owned.c b/src/backend/distributed/commands/owned.c index 216e3e4a1..9f61bf5d2 100644 --- a/src/backend/distributed/commands/owned.c +++ b/src/backend/distributed/commands/owned.c @@ -47,6 +47,9 @@ #include "utils/varlena.h" #include "utils/syscache.h" + +static ObjectAddress * GetNewRoleAddress(ReassignOwnedStmt *stmt); + /* * PreprocessDropOwnedStmt finds the distributed role out of the ones * being dropped and unmarks them distributed and creates the drop statements @@ -131,9 +134,22 @@ PostprocessReassignOwnedStmt(Node *node, const char *queryString) char *sql = DeparseTreeNode((Node *) stmt); stmt->roles = allReassignRoles; + ObjectAddress *newRoleAddress = GetNewRoleAddress(stmt); + + EnsureObjectAndDependenciesExistOnAllNodes(newRoleAddress); + List *commands = list_make3(DISABLE_DDL_PROPAGATION, sql, ENABLE_DDL_PROPAGATION); return NodeDDLTaskList(NON_COORDINATOR_NODES, commands); } + + +static ObjectAddress * GetNewRoleAddress(ReassignOwnedStmt *stmt) +{ + Oid roleOid = get_role_oid(stmt->newrole->rolename, false); + ObjectAddress *address = palloc0(sizeof(ObjectAddress)); + ObjectAddressSet(*address, AuthIdRelationId, roleOid); + return address; +} diff --git a/src/include/distributed/metadata_utility.h b/src/include/distributed/metadata_utility.h index 764ebd4ca..e5fc1eea5 100644 --- a/src/include/distributed/metadata_utility.h +++ b/src/include/distributed/metadata_utility.h @@ -385,7 +385,7 @@ extern void EnsureUndistributeTenantTableSafe(Oid relationId, const char *operat extern TableConversionReturn * UndistributeTable(TableConversionParameters *params); extern void UndistributeTables(List *relationIdList); -extern void EnsureObjectExistOnAllNodes(const ObjectAddress *target); +extern void EnsureObjectAndDependenciesExistOnAllNodes(const ObjectAddress *target); extern void EnsureAllObjectDependenciesExistOnAllNodes(const List *targets); extern DeferredErrorMessage * DeferErrorIfCircularDependencyExists(const ObjectAddress * diff --git a/src/test/regress/sql/reassign_owned.sql b/src/test/regress/sql/reassign_owned.sql index 2fdd853a1..bd13ede8d 100644 --- a/src/test/regress/sql/reassign_owned.sql +++ b/src/test/regress/sql/reassign_owned.sql @@ -1,6 +1,8 @@ CREATE ROLE role1; create ROLE role2; + +set citus.create_role CREATE ROLE role3; GRANT CREATE ON SCHEMA public TO role1,role2;