mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Handle dependencies properly in ALTER POLICY
ALTER POLICY hadn't fully considered partial policy alternation (eg: change just the roles on the policy, or just change one of the expressions) when rebuilding the dependencies. Instead, it would happily remove all dependencies which existed for the policy and then only recreate the dependencies for the objects referred to in the specific ALTER POLICY command. Correct that by extracting and building the dependencies for all objects referenced by the policy, regardless of if they were provided as part of the ALTER POLICY command or were already in place as part of the pre-existing policy.
This commit is contained in:
@ -3246,6 +3246,49 @@ SET row_security = on;
|
||||
UPDATE r1 SET a = 30 RETURNING *;
|
||||
ERROR: new row violates row-level security policy for table "r1"
|
||||
DROP TABLE r1;
|
||||
-- Check dependency handling
|
||||
RESET SESSION AUTHORIZATION;
|
||||
CREATE TABLE dep1 (c1 int);
|
||||
CREATE TABLE dep2 (c1 int);
|
||||
CREATE POLICY dep_p1 ON dep1 TO rls_regress_user1 USING (c1 > (select max(dep2.c1) from dep2));
|
||||
ALTER POLICY dep_p1 ON dep1 TO rls_regress_user1,rls_regress_user2;
|
||||
-- Should return one
|
||||
SELECT count(*) = 1 FROM pg_depend
|
||||
WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1')
|
||||
AND refobjid = (SELECT oid FROM pg_class WHERE relname = 'dep2');
|
||||
?column?
|
||||
----------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
ALTER POLICY dep_p1 ON dep1 USING (true);
|
||||
-- Should return one
|
||||
SELECT count(*) = 1 FROM pg_shdepend
|
||||
WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1')
|
||||
AND refobjid = (SELECT oid FROM pg_authid WHERE rolname = 'rls_regress_user1');
|
||||
?column?
|
||||
----------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
-- Should return one
|
||||
SELECT count(*) = 1 FROM pg_shdepend
|
||||
WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1')
|
||||
AND refobjid = (SELECT oid FROM pg_authid WHERE rolname = 'rls_regress_user2');
|
||||
?column?
|
||||
----------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
-- Should return zero
|
||||
SELECT count(*) = 0 FROM pg_depend
|
||||
WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1')
|
||||
AND refobjid = (SELECT oid FROM pg_class WHERE relname = 'dep2');
|
||||
?column?
|
||||
----------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
--
|
||||
-- Clean up objects
|
||||
--
|
||||
|
@ -1490,6 +1490,37 @@ UPDATE r1 SET a = 30 RETURNING *;
|
||||
|
||||
DROP TABLE r1;
|
||||
|
||||
-- Check dependency handling
|
||||
RESET SESSION AUTHORIZATION;
|
||||
CREATE TABLE dep1 (c1 int);
|
||||
CREATE TABLE dep2 (c1 int);
|
||||
|
||||
CREATE POLICY dep_p1 ON dep1 TO rls_regress_user1 USING (c1 > (select max(dep2.c1) from dep2));
|
||||
ALTER POLICY dep_p1 ON dep1 TO rls_regress_user1,rls_regress_user2;
|
||||
|
||||
-- Should return one
|
||||
SELECT count(*) = 1 FROM pg_depend
|
||||
WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1')
|
||||
AND refobjid = (SELECT oid FROM pg_class WHERE relname = 'dep2');
|
||||
|
||||
ALTER POLICY dep_p1 ON dep1 USING (true);
|
||||
|
||||
-- Should return one
|
||||
SELECT count(*) = 1 FROM pg_shdepend
|
||||
WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1')
|
||||
AND refobjid = (SELECT oid FROM pg_authid WHERE rolname = 'rls_regress_user1');
|
||||
|
||||
-- Should return one
|
||||
SELECT count(*) = 1 FROM pg_shdepend
|
||||
WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1')
|
||||
AND refobjid = (SELECT oid FROM pg_authid WHERE rolname = 'rls_regress_user2');
|
||||
|
||||
-- Should return zero
|
||||
SELECT count(*) = 0 FROM pg_depend
|
||||
WHERE objid = (SELECT oid FROM pg_policy WHERE polname = 'dep_p1')
|
||||
AND refobjid = (SELECT oid FROM pg_class WHERE relname = 'dep2');
|
||||
|
||||
|
||||
--
|
||||
-- Clean up objects
|
||||
--
|
||||
|
Reference in New Issue
Block a user