|
| 1 | +-- |
| 2 | +-- Test the LOCK statement |
| 3 | +-- |
| 4 | +-- Setup |
| 5 | +CREATE SCHEMA lock_schema1; |
| 6 | +SET search_path = lock_schema1; |
| 7 | +CREATE TABLE lock_tbl1 (a BIGINT); |
| 8 | +CREATE VIEW lock_view1 AS SELECT 1; |
| 9 | +CREATE ROLE regress_rol_lock1; |
| 10 | +ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1; |
| 11 | +GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1; |
| 12 | +-- Try all valid lock options; also try omitting the optional TABLE keyword. |
| 13 | +BEGIN TRANSACTION; |
| 14 | +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE; |
| 15 | +LOCK lock_tbl1 IN ROW SHARE MODE; |
| 16 | +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE; |
| 17 | +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE; |
| 18 | +LOCK TABLE lock_tbl1 IN SHARE MODE; |
| 19 | +LOCK lock_tbl1 IN SHARE ROW EXCLUSIVE MODE; |
| 20 | +LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE; |
| 21 | +LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE; |
| 22 | +ROLLBACK; |
| 23 | +-- Try using NOWAIT along with valid options. |
| 24 | +BEGIN TRANSACTION; |
| 25 | +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE NOWAIT; |
| 26 | +LOCK TABLE lock_tbl1 IN ROW SHARE MODE NOWAIT; |
| 27 | +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE NOWAIT; |
| 28 | +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE NOWAIT; |
| 29 | +LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT; |
| 30 | +LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT; |
| 31 | +LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT; |
| 32 | +LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT; |
| 33 | +LOCK TABLE lock_view1 IN EXCLUSIVE MODE; -- Will fail; can't lock a non-table |
| 34 | +ERROR: "lock_view1" is not a table |
| 35 | +ROLLBACK; |
| 36 | +-- Verify that we can lock a table with inheritance children. |
| 37 | +CREATE TABLE lock_tbl2 (b BIGINT) INHERITS (lock_tbl1); |
| 38 | +CREATE TABLE lock_tbl3 () INHERITS (lock_tbl2); |
| 39 | +BEGIN TRANSACTION; |
| 40 | +LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE; |
| 41 | +ROLLBACK; |
| 42 | +-- Verify that we can't lock a child table just because we have permission |
| 43 | +-- on the parent, but that we can lock the parent only. |
| 44 | +GRANT UPDATE ON TABLE lock_tbl1 TO regress_rol_lock1; |
| 45 | +SET ROLE regress_rol_lock1; |
| 46 | +BEGIN; |
| 47 | +LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE; |
| 48 | +ERROR: permission denied for relation lock_tbl2 |
| 49 | +ROLLBACK; |
| 50 | +BEGIN; |
| 51 | +LOCK TABLE ONLY lock_tbl1; |
| 52 | +ROLLBACK; |
| 53 | +RESET ROLE; |
| 54 | +-- |
| 55 | +-- Clean up |
| 56 | +-- |
| 57 | +DROP VIEW lock_view1; |
| 58 | +DROP TABLE lock_tbl3; |
| 59 | +DROP TABLE lock_tbl2; |
| 60 | +DROP TABLE lock_tbl1; |
| 61 | +DROP SCHEMA lock_schema1 CASCADE; |
| 62 | +DROP ROLE regress_rol_lock1; |
0 commit comments