From 11feabd2237427e456838a79b52b02823b5e4cfc Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Mon, 8 Jan 2024 18:50:47 +0300 Subject: [PATCH] improve --- .../distributed/serialize_distributed_ddls.c | 8 +++ src/backend/distributed/utils/listutils.c | 13 ---- src/include/distributed/listutils.h | 1 - src/include/distributed/resource_lock.h | 1 - .../create_drop_database_propagation.out | 7 -- .../isolation_database_cmd_from_any_node.out | 70 ++++++------------- .../isolation_database_cmd_from_any_node.spec | 57 +++++++++------ 7 files changed, 66 insertions(+), 91 deletions(-) diff --git a/src/backend/distributed/serialize_distributed_ddls.c b/src/backend/distributed/serialize_distributed_ddls.c index 469cb5024..fa8d5ebc2 100644 --- a/src/backend/distributed/serialize_distributed_ddls.c +++ b/src/backend/distributed/serialize_distributed_ddls.c @@ -141,6 +141,14 @@ SerializeDistributedDDLsOnObjectClassInternal(ObjectClass objectClass, return; } + /* + * Indeed we would already ensure permission checks in remote node + * --via AcquireCitusAdvisoryObjectClassLock()-- but we first do so on + * the local node to avoid from reporting confusing error messages. + */ + Oid oid = AcquireCitusAdvisoryObjectClassLockGetOid(objectClass, qualifiedObjectName); + AcquireCitusAdvisoryObjectClassLockCheckPrivileges(objectClass, oid); + Task *task = CitusMakeNode(Task); task->taskType = DDL_TASK; diff --git a/src/backend/distributed/utils/listutils.c b/src/backend/distributed/utils/listutils.c index 0ae23f3a1..eddef1fea 100644 --- a/src/backend/distributed/utils/listutils.c +++ b/src/backend/distributed/utils/listutils.c @@ -289,16 +289,3 @@ list_filter_oid(List *list, bool (*keepElement)(Oid element)) return result; } - - -/* - * CompareStringNodes returns the result of strcmp on given two String nodes. - */ -int -CompareStringNodes(const void *leftElement, const void *rightElement) -{ - String *leftString = castNode(String, (Node *) leftElement); - String *rightString = castNode(String, (Node *) rightElement); - - return strcmp(strVal(leftString), strVal(rightString)); -} diff --git a/src/include/distributed/listutils.h b/src/include/distributed/listutils.h index facbaf72d..2a52cbc75 100644 --- a/src/include/distributed/listutils.h +++ b/src/include/distributed/listutils.h @@ -175,6 +175,5 @@ extern void * safe_list_nth(const List *list, int index); extern List * GeneratePositiveIntSequenceList(int upTo); extern List * GenerateListFromElement(void *listElement, int listLength); extern List * list_filter_oid(List *list, bool (*keepElement)(Oid element)); -extern int CompareStringNodes(const void *leftElement, const void *rightElement); #endif /* CITUS_LISTUTILS_H */ diff --git a/src/include/distributed/resource_lock.h b/src/include/distributed/resource_lock.h index 956f41fa8..576d2bf15 100644 --- a/src/include/distributed/resource_lock.h +++ b/src/include/distributed/resource_lock.h @@ -176,7 +176,6 @@ IsNodeWideObjectClass(ObjectClass objectClass) { case OCLASS_ROLE: case OCLASS_DATABASE: - case OCLASS_SUBSCRIPTION: case OCLASS_TBLSPACE: #if PG_VERSION_NUM >= PG_VERSION_15 case OCLASS_PARAMETER_ACL: diff --git a/src/test/regress/expected/create_drop_database_propagation.out b/src/test/regress/expected/create_drop_database_propagation.out index 36b7e50cd..6c9be95bc 100644 --- a/src/test/regress/expected/create_drop_database_propagation.out +++ b/src/test/regress/expected/create_drop_database_propagation.out @@ -1218,22 +1218,16 @@ SET ROLE no_createdb; SET citus.enable_create_database_propagation TO ON; CREATE DATABASE no_createdb; ERROR: permission denied to create / rename database -CONTEXT: while executing command on localhost:xxxxx ALTER DATABASE distributed_db RENAME TO rename_test; ERROR: permission denied to create / rename database -CONTEXT: while executing command on localhost:xxxxx DROP DATABASE distributed_db; ERROR: must be owner of database distributed_db -CONTEXT: while executing command on localhost:xxxxx ALTER DATABASE distributed_db SET TABLESPACE pg_default; ERROR: must be owner of database distributed_db -CONTEXT: while executing command on localhost:xxxxx ALTER DATABASE distributed_db SET timezone TO 'UTC'; ERROR: must be owner of database distributed_db -CONTEXT: while executing command on localhost:xxxxx ALTER DATABASE distributed_db RESET timezone; ERROR: must be owner of database distributed_db -CONTEXT: while executing command on localhost:xxxxx GRANT ALL ON DATABASE distributed_db TO postgres; WARNING: no privileges were granted for "distributed_db" RESET ROLE; @@ -1242,7 +1236,6 @@ SET ROLE no_createdb; CREATE DATABASE no_createdb; ALTER DATABASE distributed_db RENAME TO rename_test; ERROR: must be owner of database distributed_db -CONTEXT: while executing command on localhost:xxxxx RESET ROLE; SELECT 1 FROM run_command_on_all_nodes($$GRANT ALL ON TABLESPACE pg_default TO no_createdb$$); ?column? diff --git a/src/test/regress/expected/isolation_database_cmd_from_any_node.out b/src/test/regress/expected/isolation_database_cmd_from_any_node.out index 640059214..5ca30fb1e 100644 --- a/src/test/regress/expected/isolation_database_cmd_from_any_node.out +++ b/src/test/regress/expected/isolation_database_cmd_from_any_node.out @@ -3,13 +3,13 @@ Parsed test spec with 2 sessions starting permutation: s1-begin s2-begin s1-acquire-citus-adv-oclass-lock s2-acquire-citus-adv-oclass-lock s1-commit s2-commit step s1-begin: BEGIN; step s2-begin: BEGIN; -step s1-acquire-citus-adv-oclass-lock: SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), NULL); +step s1-acquire-citus-adv-oclass-lock: SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, NULL) FROM oclass_database; citus_internal_acquire_citus_advisory_object_class_lock --------------------------------------------------------------------- (1 row) -step s2-acquire-citus-adv-oclass-lock: SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), NULL); +step s2-acquire-citus-adv-oclass-lock: SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, NULL) FROM oclass_database; step s1-commit: COMMIT; step s2-acquire-citus-adv-oclass-lock: <... completed> citus_internal_acquire_citus_advisory_object_class_lock @@ -19,18 +19,17 @@ citus_internal_acquire_citus_advisory_object_class_lock step s2-commit: COMMIT; -starting permutation: s1-enable-create-db-prop s1-create-testdb1 s1-begin s2-begin s1-acquire-citus-adv-oclass-lock-with-oid-testdb1 s2-acquire-citus-adv-oclass-lock-with-oid-testdb1 s1-commit s2-commit s1-drop-testdb1 -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s1-create-testdb1 s1-begin s2-begin s1-acquire-citus-adv-oclass-lock-with-oid-testdb1 s2-acquire-citus-adv-oclass-lock-with-oid-testdb1 s1-commit s2-commit s1-drop-testdb1 step s1-create-testdb1: CREATE DATABASE testdb1; step s1-begin: BEGIN; step s2-begin: BEGIN; -step s1-acquire-citus-adv-oclass-lock-with-oid-testdb1: SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), 'testdb1'); +step s1-acquire-citus-adv-oclass-lock-with-oid-testdb1: SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, 'testdb1') FROM oclass_database; citus_internal_acquire_citus_advisory_object_class_lock --------------------------------------------------------------------- (1 row) -step s2-acquire-citus-adv-oclass-lock-with-oid-testdb1: SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), 'testdb1'); +step s2-acquire-citus-adv-oclass-lock-with-oid-testdb1: SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, 'testdb1') FROM oclass_database; step s1-commit: COMMIT; step s2-acquire-citus-adv-oclass-lock-with-oid-testdb1: <... completed> citus_internal_acquire_citus_advisory_object_class_lock @@ -41,20 +40,18 @@ citus_internal_acquire_citus_advisory_object_class_lock step s2-commit: COMMIT; step s1-drop-testdb1: DROP DATABASE testdb1; -starting permutation: s1-enable-create-db-prop s1-create-testdb1 s2-enable-create-db-prop s2-create-testdb2 s1-begin s2-begin s1-acquire-citus-adv-oclass-lock-with-oid-testdb1 s2-acquire-citus-adv-oclass-lock-with-oid-testdb2 s1-commit s2-commit s1-drop-testdb1 s2-drop-testdb2 -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s1-create-testdb1 s2-create-testdb2 s1-begin s2-begin s1-acquire-citus-adv-oclass-lock-with-oid-testdb1 s2-acquire-citus-adv-oclass-lock-with-oid-testdb2 s1-commit s2-commit s1-drop-testdb1 s2-drop-testdb2 step s1-create-testdb1: CREATE DATABASE testdb1; -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; step s2-create-testdb2: CREATE DATABASE testdb2; step s1-begin: BEGIN; step s2-begin: BEGIN; -step s1-acquire-citus-adv-oclass-lock-with-oid-testdb1: SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), 'testdb1'); +step s1-acquire-citus-adv-oclass-lock-with-oid-testdb1: SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, 'testdb1') FROM oclass_database; citus_internal_acquire_citus_advisory_object_class_lock --------------------------------------------------------------------- (1 row) -step s2-acquire-citus-adv-oclass-lock-with-oid-testdb2: SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), 'testdb2'); +step s2-acquire-citus-adv-oclass-lock-with-oid-testdb2: SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, 'testdb2') FROM oclass_database; citus_internal_acquire_citus_advisory_object_class_lock --------------------------------------------------------------------- @@ -65,18 +62,17 @@ step s2-commit: COMMIT; step s1-drop-testdb1: DROP DATABASE testdb1; step s2-drop-testdb2: DROP DATABASE testdb2; -starting permutation: s2-enable-create-db-prop s2-create-testdb2 s1-begin s2-begin s1-acquire-citus-adv-oclass-lock s2-acquire-citus-adv-oclass-lock-with-oid-testdb2 s1-commit s2-commit s2-drop-testdb2 -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s2-create-testdb2 s1-begin s2-begin s1-acquire-citus-adv-oclass-lock s2-acquire-citus-adv-oclass-lock-with-oid-testdb2 s1-commit s2-commit s2-drop-testdb2 step s2-create-testdb2: CREATE DATABASE testdb2; step s1-begin: BEGIN; step s2-begin: BEGIN; -step s1-acquire-citus-adv-oclass-lock: SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), NULL); +step s1-acquire-citus-adv-oclass-lock: SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, NULL) FROM oclass_database; citus_internal_acquire_citus_advisory_object_class_lock --------------------------------------------------------------------- (1 row) -step s2-acquire-citus-adv-oclass-lock-with-oid-testdb2: SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), 'testdb2'); +step s2-acquire-citus-adv-oclass-lock-with-oid-testdb2: SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, 'testdb2') FROM oclass_database; citus_internal_acquire_citus_advisory_object_class_lock --------------------------------------------------------------------- @@ -86,19 +82,16 @@ step s1-commit: COMMIT; step s2-commit: COMMIT; step s2-drop-testdb2: DROP DATABASE testdb2; -starting permutation: s2-enable-create-db-prop s2-create-testdb2 s2-begin s2-alter-testdb2-set-lc_monetary s1-enable-create-db-prop s1-create-db1 s2-rollback s2-drop-testdb2 s1-drop-db1 -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s2-create-testdb2 s2-begin s2-alter-testdb2-set-lc_monetary s1-create-db1 s2-rollback s2-drop-testdb2 s1-drop-db1 step s2-create-testdb2: CREATE DATABASE testdb2; step s2-begin: BEGIN; step s2-alter-testdb2-set-lc_monetary: ALTER DATABASE testdb2 SET lc_monetary TO 'C'; -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; step s1-create-db1: CREATE DATABASE db1; step s2-rollback: ROLLBACK; step s2-drop-testdb2: DROP DATABASE testdb2; step s1-drop-db1: DROP DATABASE db1; -starting permutation: s2-enable-create-db-prop s2-create-testdb2 s2-begin s2-alter-testdb2-set-lc_monetary s1-create-user-dbuser s1-grant-on-testdb2-to-dbuser s2-rollback s2-drop-testdb2 s1-drop-user-dbuser -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s2-create-testdb2 s2-begin s2-alter-testdb2-set-lc_monetary s1-create-user-dbuser s1-grant-on-testdb2-to-dbuser s2-rollback s2-drop-testdb2 s1-drop-user-dbuser step s2-create-testdb2: CREATE DATABASE testdb2; step s2-begin: BEGIN; step s2-alter-testdb2-set-lc_monetary: ALTER DATABASE testdb2 SET lc_monetary TO 'C'; @@ -108,12 +101,10 @@ step s2-rollback: ROLLBACK; step s2-drop-testdb2: DROP DATABASE testdb2; step s1-drop-user-dbuser: DROP USER dbuser; -starting permutation: s2-enable-create-db-prop s2-create-testdb2 s2-begin s2-alter-testdb2-set-lc_monetary s1-enable-create-db-prop s1-create-testdb1 s1-create-user-dbuser s1-grant-on-testdb1-to-dbuser s2-rollback s2-drop-testdb2 s1-drop-testdb1 s1-drop-user-dbuser -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s2-create-testdb2 s2-begin s2-alter-testdb2-set-lc_monetary s1-create-testdb1 s1-create-user-dbuser s1-grant-on-testdb1-to-dbuser s2-rollback s2-drop-testdb2 s1-drop-testdb1 s1-drop-user-dbuser step s2-create-testdb2: CREATE DATABASE testdb2; step s2-begin: BEGIN; step s2-alter-testdb2-set-lc_monetary: ALTER DATABASE testdb2 SET lc_monetary TO 'C'; -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; step s1-create-testdb1: CREATE DATABASE testdb1; step s1-create-user-dbuser: CREATE USER dbuser; step s1-grant-on-testdb1-to-dbuser: GRANT ALL ON DATABASE testdb1 TO dbuser; @@ -122,10 +113,8 @@ step s2-drop-testdb2: DROP DATABASE testdb2; step s1-drop-testdb1: DROP DATABASE testdb1; step s1-drop-user-dbuser: DROP USER dbuser; -starting permutation: s1-enable-create-db-prop s1-create-testdb1 s2-enable-create-db-prop s2-create-testdb2 s1-begin s2-begin s1-alter-testdb1-rename-to-db1 s2-alter-testdb2-rename-to-db1 s1-commit s2-rollback s1-drop-db1 s2-drop-testdb2 -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s1-create-testdb1 s2-create-testdb2 s1-begin s2-begin s1-alter-testdb1-rename-to-db1 s2-alter-testdb2-rename-to-db1 s1-commit s2-rollback s1-drop-db1 s2-drop-testdb2 step s1-create-testdb1: CREATE DATABASE testdb1; -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; step s2-create-testdb2: CREATE DATABASE testdb2; step s1-begin: BEGIN; step s2-begin: BEGIN; @@ -138,10 +127,8 @@ step s2-rollback: ROLLBACK; step s1-drop-db1: DROP DATABASE db1; step s2-drop-testdb2: DROP DATABASE testdb2; -starting permutation: s1-enable-create-db-prop s1-create-testdb1 s2-enable-create-db-prop s2-create-testdb2 s1-begin s2-begin s1-alter-testdb1-rename-to-db1 s2-alter-testdb2-rename-to-db1 s1-rollback s2-commit s1-drop-testdb1 s2-drop-db1 -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s1-create-testdb1 s2-create-testdb2 s1-begin s2-begin s1-alter-testdb1-rename-to-db1 s2-alter-testdb2-rename-to-db1 s1-rollback s2-commit s1-drop-testdb1 s2-drop-db1 step s1-create-testdb1: CREATE DATABASE testdb1; -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; step s2-create-testdb2: CREATE DATABASE testdb2; step s1-begin: BEGIN; step s2-begin: BEGIN; @@ -153,8 +140,7 @@ step s2-commit: COMMIT; step s1-drop-testdb1: DROP DATABASE testdb1; step s2-drop-db1: DROP DATABASE db1; -starting permutation: s1-enable-create-db-prop s1-create-testdb1 s1-begin s2-begin s1-alter-testdb1-rename-to-db1 s2-alter-testdb1-rename-to-db1 s1-commit s2-rollback s1-drop-db1 -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s1-create-testdb1 s1-begin s2-begin s1-alter-testdb1-rename-to-db1 s2-alter-testdb1-rename-to-db1 s1-commit s2-rollback s1-drop-db1 step s1-create-testdb1: CREATE DATABASE testdb1; step s1-begin: BEGIN; step s2-begin: BEGIN; @@ -166,8 +152,7 @@ ERROR: database "testdb1" does not exist step s2-rollback: ROLLBACK; step s1-drop-db1: DROP DATABASE db1; -starting permutation: s1-enable-create-db-prop s1-create-testdb1 s1-begin s2-begin s1-alter-testdb1-rename-to-db1 s2-alter-testdb1-rename-to-db1 s1-rollback s2-commit s2-drop-db1 -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s1-create-testdb1 s1-begin s2-begin s1-alter-testdb1-rename-to-db1 s2-alter-testdb1-rename-to-db1 s1-rollback s2-commit s2-drop-db1 step s1-create-testdb1: CREATE DATABASE testdb1; step s1-begin: BEGIN; step s2-begin: BEGIN; @@ -178,44 +163,37 @@ step s2-alter-testdb1-rename-to-db1: <... completed> step s2-commit: COMMIT; step s2-drop-db1: DROP DATABASE db1; -starting permutation: s2-enable-create-db-prop s2-create-testdb2 s2-begin s2-alter-testdb2-rename-to-db1 s1-enable-create-db-prop s1-create-db1 s2-rollback s2-drop-testdb2 s1-drop-db1 -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s2-create-testdb2 s2-begin s2-alter-testdb2-rename-to-db1 s1-create-db1 s2-rollback s2-drop-testdb2 s1-drop-db1 step s2-create-testdb2: CREATE DATABASE testdb2; step s2-begin: BEGIN; step s2-alter-testdb2-rename-to-db1: ALTER DATABASE testdb2 RENAME TO db1; -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; step s1-create-db1: CREATE DATABASE db1; step s2-rollback: ROLLBACK; step s1-create-db1: <... completed> step s2-drop-testdb2: DROP DATABASE testdb2; step s1-drop-db1: DROP DATABASE db1; -starting permutation: s2-enable-create-db-prop s2-create-testdb2 s2-begin s2-alter-testdb2-rename-to-db1 s1-enable-create-db-prop s1-create-db1 s2-commit s2-drop-db1 -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s2-create-testdb2 s2-begin s2-alter-testdb2-rename-to-db1 s1-create-db1 s2-commit s2-drop-db1 step s2-create-testdb2: CREATE DATABASE testdb2; step s2-begin: BEGIN; step s2-alter-testdb2-rename-to-db1: ALTER DATABASE testdb2 RENAME TO db1; -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; step s1-create-db1: CREATE DATABASE db1; step s2-commit: COMMIT; step s1-create-db1: <... completed> ERROR: database "db1" already exists step s2-drop-db1: DROP DATABASE db1; -starting permutation: s2-enable-create-db-prop s2-create-testdb2 s2-begin s2-alter-testdb2-rename-to-db2 s1-enable-create-db-prop s1-create-db1 s2-commit s2-drop-db2 s1-drop-db1 -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s2-create-testdb2 s2-begin s2-alter-testdb2-rename-to-db2 s1-create-db1 s2-commit s2-drop-db2 s1-drop-db1 step s2-create-testdb2: CREATE DATABASE testdb2; step s2-begin: BEGIN; step s2-alter-testdb2-rename-to-db2: ALTER DATABASE testdb2 RENAME TO db2; -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; step s1-create-db1: CREATE DATABASE db1; step s2-commit: COMMIT; step s1-create-db1: <... completed> step s2-drop-db2: DROP DATABASE db2; step s1-drop-db1: DROP DATABASE db1; -starting permutation: s2-enable-create-db-prop s2-create-testdb2 s2-begin s2-alter-testdb2-rename-to-db1 s1-drop-testdb2 s2-rollback -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s2-create-testdb2 s2-begin s2-alter-testdb2-rename-to-db1 s1-drop-testdb2 s2-rollback step s2-create-testdb2: CREATE DATABASE testdb2; step s2-begin: BEGIN; step s2-alter-testdb2-rename-to-db1: ALTER DATABASE testdb2 RENAME TO db1; @@ -223,10 +201,8 @@ step s1-drop-testdb2: DROP DATABASE testdb2; step s2-rollback: ROLLBACK; step s1-drop-testdb2: <... completed> -starting permutation: s2-enable-create-db-prop s2-create-testdb2 s1-enable-create-db-prop s1-create-db1 s2-begin s2-alter-testdb2-rename-to-db2 s1-drop-db1 s2-commit s2-drop-db2 -step s2-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; +starting permutation: s2-create-testdb2 s1-create-db1 s2-begin s2-alter-testdb2-rename-to-db2 s1-drop-db1 s2-commit s2-drop-db2 step s2-create-testdb2: CREATE DATABASE testdb2; -step s1-enable-create-db-prop: SET citus.enable_create_database_propagation TO ON; step s1-create-db1: CREATE DATABASE db1; step s2-begin: BEGIN; step s2-alter-testdb2-rename-to-db2: ALTER DATABASE testdb2 RENAME TO db2; diff --git a/src/test/regress/spec/isolation_database_cmd_from_any_node.spec b/src/test/regress/spec/isolation_database_cmd_from_any_node.spec index 7ac17e705..85dc27433 100644 --- a/src/test/regress/spec/isolation_database_cmd_from_any_node.spec +++ b/src/test/regress/spec/isolation_database_cmd_from_any_node.spec @@ -1,15 +1,27 @@ +setup +{ + -- OCLASS for database changed in PG 16 from 25 to 26 + SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS value INTO oclass_database; +} + +teardown +{ + DROP TABLE IF EXISTS oclass_database; +} + session "s1" +setup { SET citus.enable_create_database_propagation TO ON; } + step "s1-begin" { BEGIN; } step "s1-commit" { COMMIT; } step "s1-rollback" { ROLLBACK; } -step "s1-enable-create-db-prop" { SET citus.enable_create_database_propagation TO ON; } step "s1-create-user-dbuser" { CREATE USER dbuser; } step "s1-drop-user-dbuser" { DROP USER dbuser; } -step "s1-acquire-citus-adv-oclass-lock" { SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), NULL); } -step "s1-acquire-citus-adv-oclass-lock-with-oid-testdb1" { SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), 'testdb1'); } +step "s1-acquire-citus-adv-oclass-lock" { SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, NULL) FROM oclass_database; } +step "s1-acquire-citus-adv-oclass-lock-with-oid-testdb1" { SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, 'testdb1') FROM oclass_database; } step "s1-create-testdb1" { CREATE DATABASE testdb1; } step "s1-drop-testdb1" { DROP DATABASE testdb1; } @@ -24,14 +36,15 @@ step "s1-drop-db1" { DROP DATABASE db1; } session "s2" +setup { SET citus.enable_create_database_propagation TO ON; } + step "s2-begin" { BEGIN; } step "s2-commit" { COMMIT; } step "s2-rollback" { ROLLBACK; } -step "s2-enable-create-db-prop" { SET citus.enable_create_database_propagation TO ON; } -step "s2-acquire-citus-adv-oclass-lock" { SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), NULL); } -step "s2-acquire-citus-adv-oclass-lock-with-oid-testdb1" { SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), 'testdb1'); } -step "s2-acquire-citus-adv-oclass-lock-with-oid-testdb2" { SELECT citus_internal_acquire_citus_advisory_object_class_lock((SELECT CASE WHEN substring(version(), '\d+')::integer < 16 THEN 25 ELSE 26 END AS oclass_database), 'testdb2'); } +step "s2-acquire-citus-adv-oclass-lock" { SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, NULL) FROM oclass_database; } +step "s2-acquire-citus-adv-oclass-lock-with-oid-testdb1" { SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, 'testdb1') FROM oclass_database; } +step "s2-acquire-citus-adv-oclass-lock-with-oid-testdb2" { SELECT citus_internal_acquire_citus_advisory_object_class_lock(value, 'testdb2') FROM oclass_database; } step "s2-alter-testdb1-rename-to-db1" { ALTER DATABASE testdb1 RENAME TO db1; } @@ -53,37 +66,37 @@ permutation "s1-begin" "s2-begin" "s1-acquire-citus-adv-oclass-lock" "s2-acquire // e.g., DROP DATABASE vs DROP DATABASE // dropping the same database -permutation "s1-enable-create-db-prop" "s1-create-testdb1" "s1-begin" "s2-begin" "s1-acquire-citus-adv-oclass-lock-with-oid-testdb1" "s2-acquire-citus-adv-oclass-lock-with-oid-testdb1" "s1-commit" "s2-commit" "s1-drop-testdb1" +permutation "s1-create-testdb1" "s1-begin" "s2-begin" "s1-acquire-citus-adv-oclass-lock-with-oid-testdb1" "s2-acquire-citus-adv-oclass-lock-with-oid-testdb1" "s1-commit" "s2-commit" "s1-drop-testdb1" // dropping a different database -permutation "s1-enable-create-db-prop" "s1-create-testdb1" "s2-enable-create-db-prop" "s2-create-testdb2" "s1-begin" "s2-begin" "s1-acquire-citus-adv-oclass-lock-with-oid-testdb1" "s2-acquire-citus-adv-oclass-lock-with-oid-testdb2" "s1-commit" "s2-commit" "s1-drop-testdb1" "s2-drop-testdb2" +permutation "s1-create-testdb1" "s2-create-testdb2" "s1-begin" "s2-begin" "s1-acquire-citus-adv-oclass-lock-with-oid-testdb1" "s2-acquire-citus-adv-oclass-lock-with-oid-testdb2" "s1-commit" "s2-commit" "s1-drop-testdb1" "s2-drop-testdb2" // CREATE DATABASE vs DROP DATABASE -permutation "s2-enable-create-db-prop" "s2-create-testdb2" "s1-begin" "s2-begin" "s1-acquire-citus-adv-oclass-lock" "s2-acquire-citus-adv-oclass-lock-with-oid-testdb2" "s1-commit" "s2-commit" "s2-drop-testdb2" +permutation "s2-create-testdb2" "s1-begin" "s2-begin" "s1-acquire-citus-adv-oclass-lock" "s2-acquire-citus-adv-oclass-lock-with-oid-testdb2" "s1-commit" "s2-commit" "s2-drop-testdb2" // CREATE DATABASE vs ALTER DATABASE SET -permutation "s2-enable-create-db-prop" "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-set-lc_monetary" "s1-enable-create-db-prop" "s1-create-db1" "s2-rollback" "s2-drop-testdb2" "s1-drop-db1" +permutation "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-set-lc_monetary" "s1-create-db1" "s2-rollback" "s2-drop-testdb2" "s1-drop-db1" // GRANT .. ON DATABASE .. TO ... vs ALTER DATABASE SET // on the same database -permutation "s2-enable-create-db-prop" "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-set-lc_monetary" "s1-create-user-dbuser" "s1-grant-on-testdb2-to-dbuser" "s2-rollback" "s2-drop-testdb2" "s1-drop-user-dbuser" +permutation "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-set-lc_monetary" "s1-create-user-dbuser" "s1-grant-on-testdb2-to-dbuser" "s2-rollback" "s2-drop-testdb2" "s1-drop-user-dbuser" // on a different database -permutation "s2-enable-create-db-prop" "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-set-lc_monetary" "s1-enable-create-db-prop" "s1-create-testdb1" "s1-create-user-dbuser" "s1-grant-on-testdb1-to-dbuser" "s2-rollback" "s2-drop-testdb2" "s1-drop-testdb1" "s1-drop-user-dbuser" +permutation "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-set-lc_monetary" "s1-create-testdb1" "s1-create-user-dbuser" "s1-grant-on-testdb1-to-dbuser" "s2-rollback" "s2-drop-testdb2" "s1-drop-testdb1" "s1-drop-user-dbuser" // ALTER DATABASE .. RENAME TO .. vs ALTER DATABASE .. RENAME TO .. // try to rename different databases to the same name -permutation "s1-enable-create-db-prop" "s1-create-testdb1" "s2-enable-create-db-prop" "s2-create-testdb2" "s1-begin" "s2-begin" "s1-alter-testdb1-rename-to-db1" "s2-alter-testdb2-rename-to-db1" "s1-commit" "s2-rollback" "s1-drop-db1" "s2-drop-testdb2" -permutation "s1-enable-create-db-prop" "s1-create-testdb1" "s2-enable-create-db-prop" "s2-create-testdb2" "s1-begin" "s2-begin" "s1-alter-testdb1-rename-to-db1" "s2-alter-testdb2-rename-to-db1" "s1-rollback" "s2-commit" "s1-drop-testdb1" "s2-drop-db1" +permutation "s1-create-testdb1" "s2-create-testdb2" "s1-begin" "s2-begin" "s1-alter-testdb1-rename-to-db1" "s2-alter-testdb2-rename-to-db1" "s1-commit" "s2-rollback" "s1-drop-db1" "s2-drop-testdb2" +permutation "s1-create-testdb1" "s2-create-testdb2" "s1-begin" "s2-begin" "s1-alter-testdb1-rename-to-db1" "s2-alter-testdb2-rename-to-db1" "s1-rollback" "s2-commit" "s1-drop-testdb1" "s2-drop-db1" // try to rename same database -permutation "s1-enable-create-db-prop" "s1-create-testdb1" "s1-begin" "s2-begin" "s1-alter-testdb1-rename-to-db1" "s2-alter-testdb1-rename-to-db1" "s1-commit" "s2-rollback" "s1-drop-db1" -permutation "s1-enable-create-db-prop" "s1-create-testdb1" "s1-begin" "s2-begin" "s1-alter-testdb1-rename-to-db1" "s2-alter-testdb1-rename-to-db1" "s1-rollback" "s2-commit" "s2-drop-db1" +permutation "s1-create-testdb1" "s1-begin" "s2-begin" "s1-alter-testdb1-rename-to-db1" "s2-alter-testdb1-rename-to-db1" "s1-commit" "s2-rollback" "s1-drop-db1" +permutation "s1-create-testdb1" "s1-begin" "s2-begin" "s1-alter-testdb1-rename-to-db1" "s2-alter-testdb1-rename-to-db1" "s1-rollback" "s2-commit" "s2-drop-db1" // CREATE DATABASE vs ALTER DATABASE .. RENAME TO .. -permutation "s2-enable-create-db-prop" "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-rename-to-db1" "s1-enable-create-db-prop" "s1-create-db1" "s2-rollback" "s2-drop-testdb2" "s1-drop-db1" -permutation "s2-enable-create-db-prop" "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-rename-to-db1" "s1-enable-create-db-prop" "s1-create-db1" "s2-commit" "s2-drop-db1" -permutation "s2-enable-create-db-prop" "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-rename-to-db2" "s1-enable-create-db-prop" "s1-create-db1" "s2-commit" "s2-drop-db2" "s1-drop-db1" +permutation "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-rename-to-db1" "s1-create-db1" "s2-rollback" "s2-drop-testdb2" "s1-drop-db1" +permutation "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-rename-to-db1" "s1-create-db1" "s2-commit" "s2-drop-db1" +permutation "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-rename-to-db2" "s1-create-db1" "s2-commit" "s2-drop-db2" "s1-drop-db1" // DROP DATABASE vs ALTER DATABASE .. RENAME TO .. // try to rename the same database -permutation "s2-enable-create-db-prop" "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-rename-to-db1" "s1-drop-testdb2" "s2-rollback" +permutation "s2-create-testdb2" "s2-begin" "s2-alter-testdb2-rename-to-db1" "s1-drop-testdb2" "s2-rollback" // try to rename a different database -permutation "s2-enable-create-db-prop" "s2-create-testdb2" "s1-enable-create-db-prop" "s1-create-db1" "s2-begin" "s2-alter-testdb2-rename-to-db2" "s1-drop-db1" "s2-commit" "s2-drop-db2" +permutation "s2-create-testdb2" "s1-create-db1" "s2-begin" "s2-alter-testdb2-rename-to-db2" "s1-drop-db1" "s2-commit" "s2-drop-db2"