diff --git a/src/test/regress/expected/lock.out b/src/test/regress/expected/lock.out new file mode 100644 index 0000000..d84918f --- /dev/null +++ b/src/test/regress/expected/lock.out @@ -0,0 +1,108 @@ +-- +-- CASE +-- Test the case statement +-- +-- Setup +CREATE SCHEMA lock_schema1; +SET search_path = lock_schema1; +CREATE TABLE lock_tbl1 (a BIGINT); +-- Should work. Using Valid options. +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE; +LOCK TABLE lock_tbl1 IN ROW SHARE MODE; +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN SHARE MODE; +LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE; +ROLLBACK; +-- Should work. Using NOWAIT along with valid options. +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ROW SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE NOWAIT; +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; +ROLLBACK; +-- Should fail. Can only LOCK a TABLE +CREATE VIEW lock_view1 AS SELECT 1; +BEGIN TRANSACTION; +LOCK TABLE lock_view1 IN EXCLUSIVE MODE; +ERROR: "lock_view1" is not a table +ROLLBACK; +DROP VIEW lock_view1; +-- Should fail. Can LOCK only if USER has permission +CREATE ROLE lock_usr1; +CREATE TABLE lock_tbl2(a BIGINT); +REVOKE ALL ON TABLE lock_tbl2 FROM lock_usr1; +SET ROLE lock_usr1; +SET search_path = lock_schema1; +BEGIN TRANSACTION; +LOCK TABLE lock_tbl2 IN EXCLUSIVE MODE; +ERROR: relation "lock_tbl2" does not exist +ROLLBACK; +RESET ROLE; +DROP TABLE lock_tbl2; +DROP ROLE lock_usr1; +-- Should work. Ensure that LOCK works for inherited tables; +CREATE ROLE lock_rol3; +CREATE TABLE lock_tbl3 (a BIGINT); +CREATE TABLE lock_tbl4 (b BIGINT) INHERITS (lock_tbl3); +BEGIN TRANSACTION; +LOCK TABLE lock_tbl4 * IN access EXCLUSIVE MODE; +SET ROLE lock_rol3; +SET search_path = lock_schema1; +LOCK TABLE lock_tbl3 NOWAIT; +ERROR: relation "lock_tbl3" does not exist +ROLLBACK; +RESET ROLE; +DROP TABLE lock_tbl4; +DROP TABLE lock_tbl3; +DROP ROLE lock_rol3; +-- Should fail. Ensure that LOCK is allowed when ROLE has appropriate rights +-- either directly, or via INHERITANCE +CREATE ROLE lock_rol5; +CREATE TABLE lock_tbl5 (a BIGINT); +CREATE TABLE lock_tbl6 (b BIGINT) INHERITS (lock_tbl5); +GRANT USAGE ON SCHEMA lock_schema1 TO lock_rol5; +GRANT ALL ON TABLE lock_tbl5 TO lock_rol5; +REVOKE ALL ON TABLE lock_tbl6 FROM lock_rol5; +SET ROLE lock_rol5; +SET search_path=lock_schema1; +BEGIN TRANSACTION; +LOCK TABLE lock_tbl5 * IN access EXCLUSIVE MODE; +ERROR: permission denied for relation lock_tbl6 +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE ONLY lock_tbl5 IN access EXCLUSIVE MODE; +ROLLBACK; +RESET ROLE; +DROP TABLE lock_tbl6; +DROP TABLE lock_tbl5; +REVOKE ALL ON SCHEMA lock_schema1 FROM lock_rol5; +DROP ROLE lock_rol5; +-- Should fail. Ensure that LOCK is allowed when ROLE has appropriate rights +-- either directly, or via INHERITANCE +CREATE TABLE lock_tbl7 (a BIGINT); +CREATE TABLE lock_tbl8 (b BIGINT) INHERITS (lock_tbl7); +CREATE TABLE lock_tbl9 (c BIGINT) INHERITS (lock_tbl8); +CREATE TABLE lock_tbl10(d BIGINT) INHERITS (lock_tbl9); +BEGIN TRANSACTION; +LOCK TABLE lock_tbl7 * IN access EXCLUSIVE MODE; +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_tbl7 * IN access EXCLUSIVE MODE NOWAIT; +ROLLBACK; +DROP TABLE lock_tbl10; +DROP TABLE lock_tbl9; +DROP TABLE lock_tbl8; +DROP TABLE lock_tbl7; +-- +-- Clean up +-- +DROP SCHEMA lock_schema1 CASCADE; +NOTICE: drop cascades to table lock_tbl1 diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 2af28b1..1610cbe 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -88,7 +88,7 @@ test: privileges security_label collate matview # ---------- # Another group of parallel tests # ---------- -test: alter_generic misc psql +test: alter_generic misc psql lock # rules cannot run concurrently with any test that creates a view test: rules diff --git a/src/test/regress/sql/lock.sql b/src/test/regress/sql/lock.sql new file mode 100644 index 0000000..d39dbdd --- /dev/null +++ b/src/test/regress/sql/lock.sql @@ -0,0 +1,118 @@ +-- +-- CASE +-- Test the case statement +-- + +-- Setup +CREATE SCHEMA lock_schema1; +SET search_path = lock_schema1; +CREATE TABLE lock_tbl1 (a BIGINT); + +-- Should work. Using Valid options. +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE; +LOCK TABLE lock_tbl1 IN ROW SHARE MODE; +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN SHARE MODE; +LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE; +LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE; +ROLLBACK; + +-- Should work. Using NOWAIT along with valid options. +BEGIN TRANSACTION; +LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ROW SHARE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE NOWAIT; +LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE NOWAIT; +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; +ROLLBACK; + + + +-- Should fail. Can only LOCK a TABLE +CREATE VIEW lock_view1 AS SELECT 1; +BEGIN TRANSACTION; +LOCK TABLE lock_view1 IN EXCLUSIVE MODE; +ROLLBACK; +DROP VIEW lock_view1; + +-- Should fail. Can LOCK only if USER has permission +CREATE ROLE lock_usr1; +CREATE TABLE lock_tbl2(a BIGINT); +REVOKE ALL ON TABLE lock_tbl2 FROM lock_usr1; +SET ROLE lock_usr1; +SET search_path = lock_schema1; +BEGIN TRANSACTION; +LOCK TABLE lock_tbl2 IN EXCLUSIVE MODE; +ROLLBACK; +RESET ROLE; +DROP TABLE lock_tbl2; +DROP ROLE lock_usr1; + +-- Should work. Ensure that LOCK works for inherited tables; +CREATE ROLE lock_rol3; +CREATE TABLE lock_tbl3 (a BIGINT); +CREATE TABLE lock_tbl4 (b BIGINT) INHERITS (lock_tbl3); +BEGIN TRANSACTION; +LOCK TABLE lock_tbl4 * IN access EXCLUSIVE MODE; +SET ROLE lock_rol3; +SET search_path = lock_schema1; +LOCK TABLE lock_tbl3 NOWAIT; +ROLLBACK; +RESET ROLE; +DROP TABLE lock_tbl4; +DROP TABLE lock_tbl3; +DROP ROLE lock_rol3; + + +-- Should fail. Ensure that LOCK is allowed when ROLE has appropriate rights +-- either directly, or via INHERITANCE +CREATE ROLE lock_rol5; +CREATE TABLE lock_tbl5 (a BIGINT); +CREATE TABLE lock_tbl6 (b BIGINT) INHERITS (lock_tbl5); +GRANT USAGE ON SCHEMA lock_schema1 TO lock_rol5; +GRANT ALL ON TABLE lock_tbl5 TO lock_rol5; +REVOKE ALL ON TABLE lock_tbl6 FROM lock_rol5; +SET ROLE lock_rol5; +SET search_path=lock_schema1; +BEGIN TRANSACTION; +LOCK TABLE lock_tbl5 * IN access EXCLUSIVE MODE; +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE ONLY lock_tbl5 IN access EXCLUSIVE MODE; +ROLLBACK; +RESET ROLE; +DROP TABLE lock_tbl6; +DROP TABLE lock_tbl5; +REVOKE ALL ON SCHEMA lock_schema1 FROM lock_rol5; +DROP ROLE lock_rol5; + + + +-- Should fail. Ensure that LOCK is allowed when ROLE has appropriate rights +-- either directly, or via INHERITANCE +CREATE TABLE lock_tbl7 (a BIGINT); +CREATE TABLE lock_tbl8 (b BIGINT) INHERITS (lock_tbl7); +CREATE TABLE lock_tbl9 (c BIGINT) INHERITS (lock_tbl8); +CREATE TABLE lock_tbl10(d BIGINT) INHERITS (lock_tbl9); +BEGIN TRANSACTION; +LOCK TABLE lock_tbl7 * IN access EXCLUSIVE MODE; +ROLLBACK; +BEGIN TRANSACTION; +LOCK TABLE lock_tbl7 * IN access EXCLUSIVE MODE NOWAIT; +ROLLBACK; +DROP TABLE lock_tbl10; +DROP TABLE lock_tbl9; +DROP TABLE lock_tbl8; +DROP TABLE lock_tbl7; + +-- +-- Clean up +-- + +DROP SCHEMA lock_schema1 CASCADE;