mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Ensure correct lock level is used in ALTER ... RENAME
Commit 1b5d797cd4
intended to relax the lock level used to rename
indexes, but inadvertently allowed *any* relation to be renamed with a
lowered lock level, as long as the command is spelled ALTER INDEX.
That's undesirable for other relation types, so retry the operation with
the higher lock if the relation turns out not to be an index.
After this fix, ALTER INDEX <sometable> RENAME will require access
exclusive lock, which it didn't before.
Author: Nathan Bossart <bossartn@amazon.com>
Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
Reported-by: Onder Kalaci <onderk@microsoft.com>
Discussion: https://postgr.es/m/PH0PR21MB1328189E2821CDEC646F8178D8AE9@PH0PR21MB1328.namprd21.prod.outlook.com
This commit is contained in:
@@ -237,6 +237,54 @@ SET ROLE regress_alter_table_user1;
|
||||
ALTER INDEX onek_unique1 RENAME TO fail; -- permission denied
|
||||
ERROR: must be owner of index onek_unique1
|
||||
RESET ROLE;
|
||||
-- rename statements with mismatching statement and object types
|
||||
CREATE TABLE alter_idx_rename_test (a INT);
|
||||
CREATE INDEX alter_idx_rename_test_idx ON alter_idx_rename_test (a);
|
||||
CREATE TABLE alter_idx_rename_test_parted (a INT) PARTITION BY LIST (a);
|
||||
CREATE INDEX alter_idx_rename_test_parted_idx ON alter_idx_rename_test_parted (a);
|
||||
BEGIN;
|
||||
ALTER INDEX alter_idx_rename_test RENAME TO alter_idx_rename_test_2;
|
||||
ALTER INDEX alter_idx_rename_test_parted RENAME TO alter_idx_rename_test_parted_2;
|
||||
SELECT relation::regclass, mode FROM pg_locks
|
||||
WHERE pid = pg_backend_pid() AND locktype = 'relation'
|
||||
AND relation::regclass::text LIKE 'alter\_idx%'
|
||||
ORDER BY relation::regclass::text;
|
||||
relation | mode
|
||||
--------------------------------+---------------------
|
||||
alter_idx_rename_test_2 | AccessExclusiveLock
|
||||
alter_idx_rename_test_parted_2 | AccessExclusiveLock
|
||||
(2 rows)
|
||||
|
||||
COMMIT;
|
||||
BEGIN;
|
||||
ALTER INDEX alter_idx_rename_test_idx RENAME TO alter_idx_rename_test_idx_2;
|
||||
ALTER INDEX alter_idx_rename_test_parted_idx RENAME TO alter_idx_rename_test_parted_idx_2;
|
||||
SELECT relation::regclass, mode FROM pg_locks
|
||||
WHERE pid = pg_backend_pid() AND locktype = 'relation'
|
||||
AND relation::regclass::text LIKE 'alter\_idx%'
|
||||
ORDER BY relation::regclass::text;
|
||||
relation | mode
|
||||
------------------------------------+--------------------------
|
||||
alter_idx_rename_test_idx_2 | ShareUpdateExclusiveLock
|
||||
alter_idx_rename_test_parted_idx_2 | ShareUpdateExclusiveLock
|
||||
(2 rows)
|
||||
|
||||
COMMIT;
|
||||
BEGIN;
|
||||
ALTER TABLE alter_idx_rename_test_idx_2 RENAME TO alter_idx_rename_test_idx_3;
|
||||
ALTER TABLE alter_idx_rename_test_parted_idx_2 RENAME TO alter_idx_rename_test_parted_idx_3;
|
||||
SELECT relation::regclass, mode FROM pg_locks
|
||||
WHERE pid = pg_backend_pid() AND locktype = 'relation'
|
||||
AND relation::regclass::text LIKE 'alter\_idx%'
|
||||
ORDER BY relation::regclass::text;
|
||||
relation | mode
|
||||
------------------------------------+---------------------
|
||||
alter_idx_rename_test_idx_3 | AccessExclusiveLock
|
||||
alter_idx_rename_test_parted_idx_3 | AccessExclusiveLock
|
||||
(2 rows)
|
||||
|
||||
COMMIT;
|
||||
DROP TABLE alter_idx_rename_test_2;
|
||||
-- renaming views
|
||||
CREATE VIEW attmp_view (unique1) AS SELECT unique1 FROM tenk1;
|
||||
ALTER TABLE attmp_view RENAME TO attmp_view_new;
|
||||
|
@@ -231,6 +231,37 @@ SET ROLE regress_alter_table_user1;
|
||||
ALTER INDEX onek_unique1 RENAME TO fail; -- permission denied
|
||||
RESET ROLE;
|
||||
|
||||
-- rename statements with mismatching statement and object types
|
||||
CREATE TABLE alter_idx_rename_test (a INT);
|
||||
CREATE INDEX alter_idx_rename_test_idx ON alter_idx_rename_test (a);
|
||||
CREATE TABLE alter_idx_rename_test_parted (a INT) PARTITION BY LIST (a);
|
||||
CREATE INDEX alter_idx_rename_test_parted_idx ON alter_idx_rename_test_parted (a);
|
||||
BEGIN;
|
||||
ALTER INDEX alter_idx_rename_test RENAME TO alter_idx_rename_test_2;
|
||||
ALTER INDEX alter_idx_rename_test_parted RENAME TO alter_idx_rename_test_parted_2;
|
||||
SELECT relation::regclass, mode FROM pg_locks
|
||||
WHERE pid = pg_backend_pid() AND locktype = 'relation'
|
||||
AND relation::regclass::text LIKE 'alter\_idx%'
|
||||
ORDER BY relation::regclass::text;
|
||||
COMMIT;
|
||||
BEGIN;
|
||||
ALTER INDEX alter_idx_rename_test_idx RENAME TO alter_idx_rename_test_idx_2;
|
||||
ALTER INDEX alter_idx_rename_test_parted_idx RENAME TO alter_idx_rename_test_parted_idx_2;
|
||||
SELECT relation::regclass, mode FROM pg_locks
|
||||
WHERE pid = pg_backend_pid() AND locktype = 'relation'
|
||||
AND relation::regclass::text LIKE 'alter\_idx%'
|
||||
ORDER BY relation::regclass::text;
|
||||
COMMIT;
|
||||
BEGIN;
|
||||
ALTER TABLE alter_idx_rename_test_idx_2 RENAME TO alter_idx_rename_test_idx_3;
|
||||
ALTER TABLE alter_idx_rename_test_parted_idx_2 RENAME TO alter_idx_rename_test_parted_idx_3;
|
||||
SELECT relation::regclass, mode FROM pg_locks
|
||||
WHERE pid = pg_backend_pid() AND locktype = 'relation'
|
||||
AND relation::regclass::text LIKE 'alter\_idx%'
|
||||
ORDER BY relation::regclass::text;
|
||||
COMMIT;
|
||||
DROP TABLE alter_idx_rename_test_2;
|
||||
|
||||
-- renaming views
|
||||
CREATE VIEW attmp_view (unique1) AS SELECT unique1 FROM tenk1;
|
||||
ALTER TABLE attmp_view RENAME TO attmp_view_new;
|
||||
|
Reference in New Issue
Block a user