Add regression tests for INSERT/UPDATE+RETURNING
This adds regressions tests which are specific to INSERT+RETURNING and UPDATE+RETURNING to ensure that the SELECT policies are added as WithCheckOptions (and should therefore throw an error when the policy is violated). Per suggestion from Andres. Back-patch to 9.5 as the prior commit was.
This commit is contained in:
parent
5976097c0f
commit
be400cd25c
@ -3158,6 +3158,75 @@ TABLE r2;
|
|||||||
DROP TABLE r2;
|
DROP TABLE r2;
|
||||||
DROP TABLE r1;
|
DROP TABLE r1;
|
||||||
--
|
--
|
||||||
|
-- Test INSERT+RETURNING applies SELECT policies as
|
||||||
|
-- WithCheckOptions (meaning an error is thrown)
|
||||||
|
--
|
||||||
|
SET SESSION AUTHORIZATION rls_regress_user0;
|
||||||
|
SET row_security = on;
|
||||||
|
CREATE TABLE r1 (a int);
|
||||||
|
CREATE POLICY p1 ON r1 FOR SELECT USING (false);
|
||||||
|
CREATE POLICY p2 ON r1 FOR INSERT WITH CHECK (true);
|
||||||
|
ALTER TABLE r1 ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE r1 FORCE ROW LEVEL SECURITY;
|
||||||
|
-- Works fine
|
||||||
|
INSERT INTO r1 VALUES (10), (20);
|
||||||
|
-- No error, but no rows
|
||||||
|
TABLE r1;
|
||||||
|
a
|
||||||
|
---
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
SET row_security = off;
|
||||||
|
-- Rows shown now
|
||||||
|
TABLE r1;
|
||||||
|
a
|
||||||
|
----
|
||||||
|
10
|
||||||
|
20
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
SET row_security = on;
|
||||||
|
-- Error
|
||||||
|
INSERT INTO r1 VALUES (10), (20) RETURNING *;
|
||||||
|
ERROR: new row violates row level security policy for "r1"
|
||||||
|
DROP TABLE r1;
|
||||||
|
--
|
||||||
|
-- Test UPDATE+RETURNING applies SELECT policies as
|
||||||
|
-- WithCheckOptions (meaning an error is thrown)
|
||||||
|
--
|
||||||
|
SET SESSION AUTHORIZATION rls_regress_user0;
|
||||||
|
SET row_security = on;
|
||||||
|
CREATE TABLE r1 (a int);
|
||||||
|
CREATE POLICY p1 ON r1 FOR SELECT USING (a < 20);
|
||||||
|
CREATE POLICY p2 ON r1 FOR UPDATE USING (a < 20) WITH CHECK (true);
|
||||||
|
INSERT INTO r1 VALUES (10);
|
||||||
|
ALTER TABLE r1 ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE r1 FORCE ROW LEVEL SECURITY;
|
||||||
|
-- Works fine
|
||||||
|
UPDATE r1 SET a = 30;
|
||||||
|
-- Show updated rows
|
||||||
|
SET row_security = off;
|
||||||
|
TABLE r1;
|
||||||
|
a
|
||||||
|
----
|
||||||
|
30
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- reset value in r1 for test with RETURNING
|
||||||
|
UPDATE r1 SET a = 10;
|
||||||
|
-- Verify row reset
|
||||||
|
TABLE r1;
|
||||||
|
a
|
||||||
|
----
|
||||||
|
10
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SET row_security = on;
|
||||||
|
-- Error
|
||||||
|
UPDATE r1 SET a = 30 RETURNING *;
|
||||||
|
ERROR: new row violates row level security policy for "r1"
|
||||||
|
DROP TABLE r1;
|
||||||
|
--
|
||||||
-- Clean up objects
|
-- Clean up objects
|
||||||
--
|
--
|
||||||
RESET SESSION AUTHORIZATION;
|
RESET SESSION AUTHORIZATION;
|
||||||
|
@ -1423,6 +1423,69 @@ TABLE r2;
|
|||||||
DROP TABLE r2;
|
DROP TABLE r2;
|
||||||
DROP TABLE r1;
|
DROP TABLE r1;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Test INSERT+RETURNING applies SELECT policies as
|
||||||
|
-- WithCheckOptions (meaning an error is thrown)
|
||||||
|
--
|
||||||
|
SET SESSION AUTHORIZATION rls_regress_user0;
|
||||||
|
SET row_security = on;
|
||||||
|
CREATE TABLE r1 (a int);
|
||||||
|
|
||||||
|
CREATE POLICY p1 ON r1 FOR SELECT USING (false);
|
||||||
|
CREATE POLICY p2 ON r1 FOR INSERT WITH CHECK (true);
|
||||||
|
ALTER TABLE r1 ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE r1 FORCE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
-- Works fine
|
||||||
|
INSERT INTO r1 VALUES (10), (20);
|
||||||
|
|
||||||
|
-- No error, but no rows
|
||||||
|
TABLE r1;
|
||||||
|
|
||||||
|
SET row_security = off;
|
||||||
|
-- Rows shown now
|
||||||
|
TABLE r1;
|
||||||
|
|
||||||
|
SET row_security = on;
|
||||||
|
|
||||||
|
-- Error
|
||||||
|
INSERT INTO r1 VALUES (10), (20) RETURNING *;
|
||||||
|
|
||||||
|
DROP TABLE r1;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Test UPDATE+RETURNING applies SELECT policies as
|
||||||
|
-- WithCheckOptions (meaning an error is thrown)
|
||||||
|
--
|
||||||
|
SET SESSION AUTHORIZATION rls_regress_user0;
|
||||||
|
SET row_security = on;
|
||||||
|
CREATE TABLE r1 (a int);
|
||||||
|
|
||||||
|
CREATE POLICY p1 ON r1 FOR SELECT USING (a < 20);
|
||||||
|
CREATE POLICY p2 ON r1 FOR UPDATE USING (a < 20) WITH CHECK (true);
|
||||||
|
INSERT INTO r1 VALUES (10);
|
||||||
|
ALTER TABLE r1 ENABLE ROW LEVEL SECURITY;
|
||||||
|
ALTER TABLE r1 FORCE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
-- Works fine
|
||||||
|
UPDATE r1 SET a = 30;
|
||||||
|
|
||||||
|
-- Show updated rows
|
||||||
|
SET row_security = off;
|
||||||
|
TABLE r1;
|
||||||
|
-- reset value in r1 for test with RETURNING
|
||||||
|
UPDATE r1 SET a = 10;
|
||||||
|
|
||||||
|
-- Verify row reset
|
||||||
|
TABLE r1;
|
||||||
|
|
||||||
|
SET row_security = on;
|
||||||
|
|
||||||
|
-- Error
|
||||||
|
UPDATE r1 SET a = 30 RETURNING *;
|
||||||
|
|
||||||
|
DROP TABLE r1;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Clean up objects
|
-- Clean up objects
|
||||||
--
|
--
|
||||||
|
Loading…
x
Reference in New Issue
Block a user