mirror of
https://github.com/postgres/postgres.git
synced 2025-07-20 05:03:10 +03:00
Allow to lock views.
Now all tables used in view definitions can be recursively locked by a LOCK command. Author: Yugo Nagata Reviewed by Robert Haas, Thomas Munro and me. Discussion: https://postgr.es/m/20171011183629.eb2817b3.nagata%40sraoss.co.jp
This commit is contained in:
@ -5,7 +5,13 @@
|
||||
CREATE SCHEMA lock_schema1;
|
||||
SET search_path = lock_schema1;
|
||||
CREATE TABLE lock_tbl1 (a BIGINT);
|
||||
CREATE VIEW lock_view1 AS SELECT 1;
|
||||
CREATE TABLE lock_tbl1a (a BIGINT);
|
||||
CREATE VIEW lock_view1 AS SELECT * FROM lock_tbl1;
|
||||
CREATE VIEW lock_view2(a,b) AS SELECT * FROM lock_tbl1, lock_tbl1a;
|
||||
CREATE VIEW lock_view3 AS SELECT * from lock_view2;
|
||||
CREATE VIEW lock_view4 AS SELECT (select a from lock_tbl1a limit 1) from lock_tbl1;
|
||||
CREATE VIEW lock_view5 AS SELECT * from lock_tbl1 where a in (select * from lock_tbl1a);
|
||||
CREATE VIEW lock_view6 AS SELECT * from (select * from lock_tbl1) sub;
|
||||
CREATE ROLE regress_rol_lock1;
|
||||
ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1;
|
||||
GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1;
|
||||
@ -30,8 +36,90 @@ LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT;
|
||||
LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT;
|
||||
LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT;
|
||||
LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT;
|
||||
LOCK TABLE lock_view1 IN EXCLUSIVE MODE; -- Will fail; can't lock a non-table
|
||||
ERROR: "lock_view1" is not a table
|
||||
ROLLBACK;
|
||||
-- Verify that we can lock views.
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view1 IN EXCLUSIVE MODE;
|
||||
-- lock_view1 and lock_tbl1 are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
relname
|
||||
------------
|
||||
lock_tbl1
|
||||
lock_view1
|
||||
(2 rows)
|
||||
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view2 IN EXCLUSIVE MODE;
|
||||
-- lock_view1, lock_tbl1, and lock_tbl1a are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
relname
|
||||
------------
|
||||
lock_tbl1
|
||||
lock_tbl1a
|
||||
lock_view2
|
||||
(3 rows)
|
||||
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view3 IN EXCLUSIVE MODE;
|
||||
-- lock_view3, lock_view2, lock_tbl1, and lock_tbl1a are locked recursively.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
relname
|
||||
------------
|
||||
lock_tbl1
|
||||
lock_tbl1a
|
||||
lock_view2
|
||||
lock_view3
|
||||
(4 rows)
|
||||
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view4 IN EXCLUSIVE MODE;
|
||||
-- lock_view4, lock_tbl1, and lock_tbl1a are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
relname
|
||||
------------
|
||||
lock_tbl1
|
||||
lock_tbl1a
|
||||
lock_view4
|
||||
(3 rows)
|
||||
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view5 IN EXCLUSIVE MODE;
|
||||
-- lock_view5, lock_tbl1, and lock_tbl1a are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
relname
|
||||
------------
|
||||
lock_tbl1
|
||||
lock_tbl1a
|
||||
lock_view5
|
||||
(3 rows)
|
||||
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view6 IN EXCLUSIVE MODE;
|
||||
-- lock_view6 an lock_tbl1 are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
relname
|
||||
------------
|
||||
lock_tbl1
|
||||
lock_view6
|
||||
(2 rows)
|
||||
|
||||
ROLLBACK;
|
||||
-- Verify that we can lock a table with inheritance children.
|
||||
CREATE TABLE lock_tbl2 (b BIGINT) INHERITS (lock_tbl1);
|
||||
@ -54,10 +142,16 @@ RESET ROLE;
|
||||
--
|
||||
-- Clean up
|
||||
--
|
||||
DROP VIEW lock_view6;
|
||||
DROP VIEW lock_view5;
|
||||
DROP VIEW lock_view4;
|
||||
DROP VIEW lock_view3;
|
||||
DROP VIEW lock_view2;
|
||||
DROP VIEW lock_view1;
|
||||
DROP TABLE lock_tbl3;
|
||||
DROP TABLE lock_tbl2;
|
||||
DROP TABLE lock_tbl1;
|
||||
DROP TABLE lock_tbl1a;
|
||||
DROP SCHEMA lock_schema1 CASCADE;
|
||||
DROP ROLE regress_rol_lock1;
|
||||
-- atomic ops tests
|
||||
|
@ -6,7 +6,13 @@
|
||||
CREATE SCHEMA lock_schema1;
|
||||
SET search_path = lock_schema1;
|
||||
CREATE TABLE lock_tbl1 (a BIGINT);
|
||||
CREATE VIEW lock_view1 AS SELECT 1;
|
||||
CREATE TABLE lock_tbl1a (a BIGINT);
|
||||
CREATE VIEW lock_view1 AS SELECT * FROM lock_tbl1;
|
||||
CREATE VIEW lock_view2(a,b) AS SELECT * FROM lock_tbl1, lock_tbl1a;
|
||||
CREATE VIEW lock_view3 AS SELECT * from lock_view2;
|
||||
CREATE VIEW lock_view4 AS SELECT (select a from lock_tbl1a limit 1) from lock_tbl1;
|
||||
CREATE VIEW lock_view5 AS SELECT * from lock_tbl1 where a in (select * from lock_tbl1a);
|
||||
CREATE VIEW lock_view6 AS SELECT * from (select * from lock_tbl1) sub;
|
||||
CREATE ROLE regress_rol_lock1;
|
||||
ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1;
|
||||
GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1;
|
||||
@ -33,7 +39,50 @@ LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT;
|
||||
LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT;
|
||||
LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT;
|
||||
LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT;
|
||||
LOCK TABLE lock_view1 IN EXCLUSIVE MODE; -- Will fail; can't lock a non-table
|
||||
ROLLBACK;
|
||||
|
||||
-- Verify that we can lock views.
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view1 IN EXCLUSIVE MODE;
|
||||
-- lock_view1 and lock_tbl1 are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view2 IN EXCLUSIVE MODE;
|
||||
-- lock_view1, lock_tbl1, and lock_tbl1a are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view3 IN EXCLUSIVE MODE;
|
||||
-- lock_view3, lock_view2, lock_tbl1, and lock_tbl1a are locked recursively.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view4 IN EXCLUSIVE MODE;
|
||||
-- lock_view4, lock_tbl1, and lock_tbl1a are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view5 IN EXCLUSIVE MODE;
|
||||
-- lock_view5, lock_tbl1, and lock_tbl1a are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
ROLLBACK;
|
||||
BEGIN TRANSACTION;
|
||||
LOCK TABLE lock_view6 IN EXCLUSIVE MODE;
|
||||
-- lock_view6 an lock_tbl1 are locked.
|
||||
select relname from pg_locks l, pg_class c
|
||||
where l.relation = c.oid and relname like '%lock_%' and mode = 'ExclusiveLock'
|
||||
order by relname;
|
||||
ROLLBACK;
|
||||
|
||||
-- Verify that we can lock a table with inheritance children.
|
||||
@ -58,10 +107,16 @@ RESET ROLE;
|
||||
--
|
||||
-- Clean up
|
||||
--
|
||||
DROP VIEW lock_view6;
|
||||
DROP VIEW lock_view5;
|
||||
DROP VIEW lock_view4;
|
||||
DROP VIEW lock_view3;
|
||||
DROP VIEW lock_view2;
|
||||
DROP VIEW lock_view1;
|
||||
DROP TABLE lock_tbl3;
|
||||
DROP TABLE lock_tbl2;
|
||||
DROP TABLE lock_tbl1;
|
||||
DROP TABLE lock_tbl1a;
|
||||
DROP SCHEMA lock_schema1 CASCADE;
|
||||
DROP ROLE regress_rol_lock1;
|
||||
|
||||
|
Reference in New Issue
Block a user