@ -2296,9 +2296,9 @@ SELECT pg_input_is_valid('regress_priv_user1=rY', 'aclitem');
(1 row)
(1 row)
SELECT * FROM pg_input_error_info('regress_priv_user1=rY', 'aclitem');
SELECT * FROM pg_input_error_info('regress_priv_user1=rY', 'aclitem');
message | detail | hint | sql_error_code
message | detail | hint | sql_error_code
---------------------------------------------------------+--------+------+----------------
---------------------------------------------------------- +--------+------+----------------
invalid mode character: must be one of "arwdDxtXUCTcsA" | | | 22P02
invalid mode character: must be one of "arwdDxtXUCTcsAm " | | | 22P02
(1 row)
(1 row)
--
--
@ -2639,38 +2639,38 @@ set session role regress_priv_user4;
grant select on dep_priv_test to regress_priv_user5;
grant select on dep_priv_test to regress_priv_user5;
\dp dep_priv_test
\dp dep_priv_test
Access privileges
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+---------------+-------+-----------------------------------------------+-------------------+----------
--------+---------------+-------+------------------------------------------------ +-------------------+----------
public | dep_priv_test | table | regress_priv_user1=arwdDxt/regress_priv_user1+| |
public | dep_priv_test | table | regress_priv_user1=arwdDxtm /regress_priv_user1+| |
| | | regress_priv_user2=r*/regress_priv_user1 +| |
| | | regress_priv_user2=r*/regress_priv_user1 +| |
| | | regress_priv_user3=r*/regress_priv_user1 +| |
| | | regress_priv_user3=r*/regress_priv_user1 +| |
| | | regress_priv_user4=r*/regress_priv_user2 +| |
| | | regress_priv_user4=r*/regress_priv_user2 +| |
| | | regress_priv_user4=r*/regress_priv_user3 +| |
| | | regress_priv_user4=r*/regress_priv_user3 +| |
| | | regress_priv_user5=r/regress_priv_user4 | |
| | | regress_priv_user5=r/regress_priv_user4 | |
(1 row)
(1 row)
set session role regress_priv_user2;
set session role regress_priv_user2;
revoke select on dep_priv_test from regress_priv_user4 cascade;
revoke select on dep_priv_test from regress_priv_user4 cascade;
\dp dep_priv_test
\dp dep_priv_test
Access privileges
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+---------------+-------+-----------------------------------------------+-------------------+----------
--------+---------------+-------+------------------------------------------------ +-------------------+----------
public | dep_priv_test | table | regress_priv_user1=arwdDxt/regress_priv_user1+| |
public | dep_priv_test | table | regress_priv_user1=arwdDxtm /regress_priv_user1+| |
| | | regress_priv_user2=r*/regress_priv_user1 +| |
| | | regress_priv_user2=r*/regress_priv_user1 +| |
| | | regress_priv_user3=r*/regress_priv_user1 +| |
| | | regress_priv_user3=r*/regress_priv_user1 +| |
| | | regress_priv_user4=r*/regress_priv_user3 +| |
| | | regress_priv_user4=r*/regress_priv_user3 +| |
| | | regress_priv_user5=r/regress_priv_user4 | |
| | | regress_priv_user5=r/regress_priv_user4 | |
(1 row)
(1 row)
set session role regress_priv_user3;
set session role regress_priv_user3;
revoke select on dep_priv_test from regress_priv_user4 cascade;
revoke select on dep_priv_test from regress_priv_user4 cascade;
\dp dep_priv_test
\dp dep_priv_test
Access privileges
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+---------------+-------+-----------------------------------------------+-------------------+----------
--------+---------------+-------+------------------------------------------------ +-------------------+----------
public | dep_priv_test | table | regress_priv_user1=arwdDxt/regress_priv_user1+| |
public | dep_priv_test | table | regress_priv_user1=arwdDxtm /regress_priv_user1+| |
| | | regress_priv_user2=r*/regress_priv_user1 +| |
| | | regress_priv_user2=r*/regress_priv_user1 +| |
| | | regress_priv_user3=r*/regress_priv_user1 | |
| | | regress_priv_user3=r*/regress_priv_user1 | |
(1 row)
(1 row)
set session role regress_priv_user1;
set session role regress_priv_user1;
@ -2800,6 +2800,20 @@ LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should pass
COMMIT;
COMMIT;
\c
\c
REVOKE TRUNCATE ON lock_table FROM regress_locktable_user;
REVOKE TRUNCATE ON lock_table FROM regress_locktable_user;
-- LOCK TABLE and MAINTAIN permission
GRANT MAINTAIN ON lock_table TO regress_locktable_user;
SET SESSION AUTHORIZATION regress_locktable_user;
BEGIN;
LOCK TABLE lock_table IN ACCESS SHARE MODE; -- should pass
ROLLBACK;
BEGIN;
LOCK TABLE lock_table IN ROW EXCLUSIVE MODE; -- should pass
COMMIT;
BEGIN;
LOCK TABLE lock_table IN ACCESS EXCLUSIVE MODE; -- should pass
COMMIT;
\c
REVOKE MAINTAIN ON lock_table FROM regress_locktable_user;
-- clean up
-- clean up
DROP TABLE lock_table;
DROP TABLE lock_table;
DROP USER regress_locktable_user;
DROP USER regress_locktable_user;
@ -2913,3 +2927,59 @@ DROP SCHEMA regress_roleoption;
DROP ROLE regress_roleoption_protagonist;
DROP ROLE regress_roleoption_protagonist;
DROP ROLE regress_roleoption_donor;
DROP ROLE regress_roleoption_donor;
DROP ROLE regress_roleoption_recipient;
DROP ROLE regress_roleoption_recipient;
-- MAINTAIN
CREATE ROLE regress_no_maintain;
CREATE ROLE regress_maintain;
CREATE ROLE regress_maintain_all IN ROLE pg_maintain;
CREATE TABLE maintain_test (a INT);
CREATE INDEX ON maintain_test (a);
GRANT MAINTAIN ON maintain_test TO regress_maintain;
CREATE MATERIALIZED VIEW refresh_test AS SELECT 1;
GRANT MAINTAIN ON refresh_test TO regress_maintain;
CREATE SCHEMA reindex_test;
-- negative tests; should fail
SET ROLE regress_no_maintain;
VACUUM maintain_test;
WARNING: permission denied to vacuum "maintain_test", skipping it
ANALYZE maintain_test;
WARNING: permission denied to analyze "maintain_test", skipping it
VACUUM (ANALYZE) maintain_test;
WARNING: permission denied to vacuum "maintain_test", skipping it
CLUSTER maintain_test USING maintain_test_a_idx;
ERROR: permission denied for table maintain_test
REFRESH MATERIALIZED VIEW refresh_test;
ERROR: permission denied for materialized view refresh_test
REINDEX TABLE maintain_test;
ERROR: permission denied for table maintain_test
REINDEX INDEX maintain_test_a_idx;
ERROR: permission denied for index maintain_test_a_idx
REINDEX SCHEMA reindex_test;
ERROR: must be owner of schema reindex_test
RESET ROLE;
SET ROLE regress_maintain;
VACUUM maintain_test;
ANALYZE maintain_test;
VACUUM (ANALYZE) maintain_test;
CLUSTER maintain_test USING maintain_test_a_idx;
REFRESH MATERIALIZED VIEW refresh_test;
REINDEX TABLE maintain_test;
REINDEX INDEX maintain_test_a_idx;
REINDEX SCHEMA reindex_test;
ERROR: must be owner of schema reindex_test
RESET ROLE;
SET ROLE regress_maintain_all;
VACUUM maintain_test;
ANALYZE maintain_test;
VACUUM (ANALYZE) maintain_test;
CLUSTER maintain_test USING maintain_test_a_idx;
REFRESH MATERIALIZED VIEW refresh_test;
REINDEX TABLE maintain_test;
REINDEX INDEX maintain_test_a_idx;
REINDEX SCHEMA reindex_test;
RESET ROLE;
DROP TABLE maintain_test;
DROP MATERIALIZED VIEW refresh_test;
DROP SCHEMA reindex_test;
DROP ROLE regress_no_maintain;
DROP ROLE regress_maintain;
DROP ROLE regress_maintain_all;