From 1253eeb9ff37206d276910c87e6fefa44d28eec6 Mon Sep 17 00:00:00 2001 From: Brian Bergeron Date: Mon, 1 Feb 2021 04:49:26 -0800 Subject: [PATCH] Don't propagate ALTER ROLE SET when scoped to a different database (#4471) Co-authored-by: brberger --- src/backend/distributed/commands/role.c | 8 +++++++ .../expected/alter_role_propagation.out | 21 +++++++++++++++++++ .../regress/sql/alter_role_propagation.sql | 8 +++++++ 3 files changed, 37 insertions(+) diff --git a/src/backend/distributed/commands/role.c b/src/backend/distributed/commands/role.c index e46b06ef4..9c1cff062 100644 --- a/src/backend/distributed/commands/role.c +++ b/src/backend/distributed/commands/role.c @@ -195,6 +195,14 @@ PreprocessAlterRoleSetStmt(Node *node, const char *queryString, } AlterRoleSetStmt *stmt = castNode(AlterRoleSetStmt, node); + + /* don't propagate if the statement is scoped to another database */ + if (stmt->database != NULL && + strcmp(stmt->database, get_database_name(MyDatabaseId)) != 0) + { + return NIL; + } + ObjectAddress address = GetObjectAddressFromParseTree(node, false); /* diff --git a/src/test/regress/expected/alter_role_propagation.out b/src/test/regress/expected/alter_role_propagation.out index ecaea374e..0e37c2f94 100644 --- a/src/test/regress/expected/alter_role_propagation.out +++ b/src/test/regress/expected/alter_role_propagation.out @@ -223,6 +223,27 @@ SELECT run_command_on_workers('SHOW enable_hashagg'); (localhost,57638,t,on) (2 rows) +-- check that ALTER ROLE SET is not propagated when scoped to a different database +-- also test case sensitivity +CREATE DATABASE "REGRESSION"; +NOTICE: Citus partially supports CREATE DATABASE for distributed databases +DETAIL: Citus does not propagate CREATE DATABASE command to workers +HINT: You can manually create a database and its extensions on workers. +ALTER ROLE CURRENT_USER IN DATABASE "REGRESSION" SET public.myguc TO "Hello from coordinator only"; +SELECT d.datname, r.setconfig FROM pg_db_role_setting r LEFT JOIN pg_database d ON r.setdatabase=d.oid WHERE r.setconfig::text LIKE '%Hello from coordinator only%'; + datname | setconfig +--------------------------------------------------------------------- + REGRESSION | {"public.myguc=Hello from coordinator only"} +(1 row) + +SELECT run_command_on_workers($$SELECT json_agg((d.datname, r.setconfig)) FROM pg_db_role_setting r LEFT JOIN pg_database d ON r.setdatabase=d.oid WHERE r.setconfig::text LIKE '%Hello from coordinator only%'$$); + run_command_on_workers +--------------------------------------------------------------------- + (localhost,57637,t,"") + (localhost,57638,t,"") +(2 rows) + +DROP DATABASE "REGRESSION"; -- make sure alter role set is not propagated when the feature is deliberately turned off SET citus.enable_alter_role_set_propagation TO off; -- remove 1 node to verify settings are NOT copied when the node gets added back diff --git a/src/test/regress/sql/alter_role_propagation.sql b/src/test/regress/sql/alter_role_propagation.sql index a73c0248a..09462a7fd 100644 --- a/src/test/regress/sql/alter_role_propagation.sql +++ b/src/test/regress/sql/alter_role_propagation.sql @@ -72,6 +72,14 @@ SELECT run_command_on_workers('SHOW enable_hashjoin'); SELECT run_command_on_workers('SHOW enable_indexonlyscan'); SELECT run_command_on_workers('SHOW enable_hashagg'); +-- check that ALTER ROLE SET is not propagated when scoped to a different database +-- also test case sensitivity +CREATE DATABASE "REGRESSION"; +ALTER ROLE CURRENT_USER IN DATABASE "REGRESSION" SET public.myguc TO "Hello from coordinator only"; +SELECT d.datname, r.setconfig FROM pg_db_role_setting r LEFT JOIN pg_database d ON r.setdatabase=d.oid WHERE r.setconfig::text LIKE '%Hello from coordinator only%'; +SELECT run_command_on_workers($$SELECT json_agg((d.datname, r.setconfig)) FROM pg_db_role_setting r LEFT JOIN pg_database d ON r.setdatabase=d.oid WHERE r.setconfig::text LIKE '%Hello from coordinator only%'$$); +DROP DATABASE "REGRESSION"; + -- make sure alter role set is not propagated when the feature is deliberately turned off SET citus.enable_alter_role_set_propagation TO off; -- remove 1 node to verify settings are NOT copied when the node gets added back