Skip to content

Commit 1c3a4d4

Browse files
committed
Fix ALTER DEFAULT PRIVILEGES with duplicated objects
Specifying duplicated objects in this command would lead to unique constraint violations in pg_default_acl or "tuple already updated by self" errors. Similarly to GRANT/REVOKE, increment the command ID after each subcommand processing to allow this case to work transparently. A regression test is added by tweaking one of the existing queries of privileges.sql to stress this case. Reported-by: Andrus Author: Michael Paquier Reviewed-by: Álvaro Herrera Discussion: https://postgr.es/m/ae2a7dc1-9d71-8cba-3bb9-e4cb7eb1f44e@hot.ee Backpatch-through: 9.5
1 parent 794562d commit 1c3a4d4

File tree

3 files changed

+7
-2
lines changed

3 files changed

+7
-2
lines changed

src/backend/catalog/aclchk.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,9 @@ SetDefaultACL(InternalDefaultACL *iacls)
13831383
ReleaseSysCache(tuple);
13841384

13851385
heap_close(rel, RowExclusiveLock);
1386+
1387+
/* prevent error when processing duplicate objects */
1388+
CommandCounterIncrement();
13861389
}
13871390

13881391

src/test/regress/expected/privileges.out

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1617,7 +1617,8 @@ SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -
16171617
f
16181618
(1 row)
16191619

1620-
ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT SELECT ON TABLES TO public;
1620+
-- placeholder for test with duplicated schema and role names
1621+
ALTER DEFAULT PRIVILEGES IN SCHEMA testns,testns GRANT SELECT ON TABLES TO public,public;
16211622
SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- no
16221623
has_table_privilege
16231624
---------------------

src/test/regress/sql/privileges.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,8 @@ CREATE TABLE testns.acltest1 (x int);
961961
SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- no
962962
SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no
963963

964-
ALTER DEFAULT PRIVILEGES IN SCHEMA testns GRANT SELECT ON TABLES TO public;
964+
-- placeholder for test with duplicated schema and role names
965+
ALTER DEFAULT PRIVILEGES IN SCHEMA testns,testns GRANT SELECT ON TABLES TO public,public;
965966

966967
SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'SELECT'); -- no
967968
SELECT has_table_privilege('regress_priv_user1', 'testns.acltest1', 'INSERT'); -- no

0 commit comments

Comments
 (0)