diff --git a/src/test/regress/expected/rowsecurity.out b/src/test/regress/expected/rowsecurity.out new file mode 100644 index 14495ef..c15bf95 *** a/src/test/regress/expected/rowsecurity.out --- b/src/test/regress/expected/rowsecurity.out *************** SELECT * FROM t1; *** 488,494 **** a | b ---+----- 2 | bbb ! 4 | ddd 2 | bcd 4 | def 2 | yyy --- 488,494 ---- a | b ---+----- 2 | bbb ! 4 | dad 2 | bcd 4 | def 2 | yyy *************** EXPLAIN (COSTS OFF) SELECT * FROM t1; *** 508,521 **** SELECT * FROM t1 WHERE f_leak(b); NOTICE: f_leak => bbb ! NOTICE: f_leak => ddd NOTICE: f_leak => bcd NOTICE: f_leak => def NOTICE: f_leak => yyy a | b ---+----- 2 | bbb ! 4 | ddd 2 | bcd 4 | def 2 | yyy --- 508,521 ---- SELECT * FROM t1 WHERE f_leak(b); NOTICE: f_leak => bbb ! NOTICE: f_leak => dad NOTICE: f_leak => bcd NOTICE: f_leak => def NOTICE: f_leak => yyy a | b ---+----- 2 | bbb ! 4 | dad 2 | bcd 4 | def 2 | yyy *************** SELECT oid, * FROM t1; *** 540,546 **** oid | a | b -----+---+----- 102 | 2 | bbb ! 104 | 4 | ddd 202 | 2 | bcd 204 | 4 | def 302 | 2 | yyy --- 540,546 ---- oid | a | b -----+---+----- 102 | 2 | bbb ! 104 | 4 | dad 202 | 2 | bcd 204 | 4 | def 302 | 2 | yyy *************** SELECT *, t1 FROM t1; *** 563,569 **** a | b | t1 ---+-----+--------- 2 | bbb | (2,bbb) ! 4 | ddd | (4,ddd) 2 | bcd | (2,bcd) 4 | def | (4,def) 2 | yyy | (2,yyy) --- 563,569 ---- a | b | t1 ---+-----+--------- 2 | bbb | (2,bbb) ! 4 | dad | (4,dad) 2 | bcd | (2,bcd) 4 | def | (4,def) 2 | yyy | (2,yyy) *************** SELECT * FROM t1 FOR SHARE; *** 586,592 **** a | b ---+----- 2 | bbb ! 4 | ddd 2 | bcd 4 | def 2 | yyy --- 586,592 ---- a | b ---+----- 2 | bbb ! 4 | dad 2 | bcd 4 | def 2 | yyy *************** EXPLAIN (COSTS OFF) SELECT * FROM t1 FOR *** 610,623 **** SELECT * FROM t1 WHERE f_leak(b) FOR SHARE; NOTICE: f_leak => bbb ! NOTICE: f_leak => ddd NOTICE: f_leak => bcd NOTICE: f_leak => def NOTICE: f_leak => yyy a | b ---+----- 2 | bbb ! 4 | ddd 2 | bcd 4 | def 2 | yyy --- 610,623 ---- SELECT * FROM t1 WHERE f_leak(b) FOR SHARE; NOTICE: f_leak => bbb ! NOTICE: f_leak => dad NOTICE: f_leak => bcd NOTICE: f_leak => def NOTICE: f_leak => yyy a | b ---+----- 2 | bbb ! 4 | dad 2 | bcd 4 | def 2 | yyy *************** SELECT * FROM t1 WHERE f_leak(b); *** 667,673 **** NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => ddd NOTICE: f_leak => abc NOTICE: f_leak => bcd NOTICE: f_leak => cde --- 667,673 ---- NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => dad NOTICE: f_leak => abc NOTICE: f_leak => bcd NOTICE: f_leak => cde *************** NOTICE: f_leak => zzz *** 680,686 **** 1 | aba 2 | bbb 3 | ccc ! 4 | ddd 1 | abc 2 | bcd 3 | cde --- 680,686 ---- 1 | aba 2 | bbb 3 | ccc ! 4 | dad 1 | abc 2 | bcd 3 | cde *************** SELECT * FROM t1 WHERE f_leak(b); *** 709,715 **** NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => ddd NOTICE: f_leak => abc NOTICE: f_leak => bcd NOTICE: f_leak => cde --- 709,715 ---- NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => dad NOTICE: f_leak => abc NOTICE: f_leak => bcd NOTICE: f_leak => cde *************** NOTICE: f_leak => zzz *** 722,728 **** 1 | aba 2 | bbb 3 | ccc ! 4 | ddd 1 | abc 2 | bcd 3 | cde --- 722,728 ---- 1 | aba 2 | bbb 3 | ccc ! 4 | dad 1 | abc 2 | bcd 3 | cde *************** SELECT * FROM t1 WHERE f_leak(b); *** 955,961 **** NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => ddd NOTICE: f_leak => abc NOTICE: f_leak => bcd NOTICE: f_leak => cde --- 955,961 ---- NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => dad NOTICE: f_leak => abc NOTICE: f_leak => bcd NOTICE: f_leak => cde *************** NOTICE: f_leak => zzz *** 968,974 **** 1 | aba 2 | bbb 3 | ccc ! 4 | ddd 1 | abc 2 | bcd 3 | cde --- 968,974 ---- 1 | aba 2 | bbb 3 | ccc ! 4 | dad 1 | abc 2 | bcd 3 | cde *************** EXPLAIN (COSTS OFF) UPDATE t1 SET b = b *** 1088,1094 **** UPDATE t1 SET b = b || b WHERE f_leak(b); NOTICE: f_leak => bbb ! NOTICE: f_leak => ddd NOTICE: f_leak => bcd NOTICE: f_leak => def NOTICE: f_leak => yyy --- 1088,1094 ---- UPDATE t1 SET b = b || b WHERE f_leak(b); NOTICE: f_leak => bbb ! NOTICE: f_leak => dad NOTICE: f_leak => bcd NOTICE: f_leak => def NOTICE: f_leak => yyy *************** EXPLAIN (COSTS OFF) UPDATE only t1 SET b *** 1105,1131 **** UPDATE only t1 SET b = b || '_updt' WHERE f_leak(b); NOTICE: f_leak => bbbbbb ! NOTICE: f_leak => dddddd -- returning clause with system column UPDATE only t1 SET b = b WHERE f_leak(b) RETURNING oid, *, t1; NOTICE: f_leak => bbbbbb_updt ! NOTICE: f_leak => dddddd_updt oid | a | b | t1 -----+---+-------------+----------------- 102 | 2 | bbbbbb_updt | (2,bbbbbb_updt) ! 104 | 4 | dddddd_updt | (4,dddddd_updt) (2 rows) UPDATE t1 SET b = b WHERE f_leak(b) RETURNING *; NOTICE: f_leak => bbbbbb_updt ! NOTICE: f_leak => dddddd_updt NOTICE: f_leak => bcdbcd NOTICE: f_leak => defdef NOTICE: f_leak => yyyyyy a | b ---+------------- 2 | bbbbbb_updt ! 4 | dddddd_updt 2 | bcdbcd 4 | defdef 2 | yyyyyy --- 1105,1131 ---- UPDATE only t1 SET b = b || '_updt' WHERE f_leak(b); NOTICE: f_leak => bbbbbb ! NOTICE: f_leak => daddad -- returning clause with system column UPDATE only t1 SET b = b WHERE f_leak(b) RETURNING oid, *, t1; NOTICE: f_leak => bbbbbb_updt ! NOTICE: f_leak => daddad_updt oid | a | b | t1 -----+---+-------------+----------------- 102 | 2 | bbbbbb_updt | (2,bbbbbb_updt) ! 104 | 4 | daddad_updt | (4,daddad_updt) (2 rows) UPDATE t1 SET b = b WHERE f_leak(b) RETURNING *; NOTICE: f_leak => bbbbbb_updt ! NOTICE: f_leak => daddad_updt NOTICE: f_leak => bcdbcd NOTICE: f_leak => defdef NOTICE: f_leak => yyyyyy a | b ---+------------- 2 | bbbbbb_updt ! 4 | daddad_updt 2 | bcdbcd 4 | defdef 2 | yyyyyy *************** NOTICE: f_leak => yyyyyy *** 1133,1146 **** UPDATE t1 SET b = b WHERE f_leak(b) RETURNING oid, *, t1; NOTICE: f_leak => bbbbbb_updt ! NOTICE: f_leak => dddddd_updt NOTICE: f_leak => bcdbcd NOTICE: f_leak => defdef NOTICE: f_leak => yyyyyy oid | a | b | t1 -----+---+-------------+----------------- 102 | 2 | bbbbbb_updt | (2,bbbbbb_updt) ! 104 | 4 | dddddd_updt | (4,dddddd_updt) 202 | 2 | bcdbcd | (2,bcdbcd) 204 | 4 | defdef | (4,defdef) 302 | 2 | yyyyyy | (2,yyyyyy) --- 1133,1146 ---- UPDATE t1 SET b = b WHERE f_leak(b) RETURNING oid, *, t1; NOTICE: f_leak => bbbbbb_updt ! NOTICE: f_leak => daddad_updt NOTICE: f_leak => bcdbcd NOTICE: f_leak => defdef NOTICE: f_leak => yyyyyy oid | a | b | t1 -----+---+-------------+----------------- 102 | 2 | bbbbbb_updt | (2,bbbbbb_updt) ! 104 | 4 | daddad_updt | (4,daddad_updt) 202 | 2 | bcdbcd | (2,bcdbcd) 204 | 4 | defdef | (4,defdef) 302 | 2 | yyyyyy | (2,yyyyyy) *************** AND f_leak(t1_1.b) AND f_leak(t1_2.b) RE *** 1328,1342 **** UPDATE t1 t1_1 SET b = t1_2.b FROM t1 t1_2 WHERE t1_1.a = 4 AND t1_2.a = t1_1.a AND t1_2.b = t1_1.b AND f_leak(t1_1.b) AND f_leak(t1_2.b) RETURNING *, t1_1, t1_2; ! NOTICE: f_leak => dddddd_updt ! NOTICE: f_leak => dddddd_updt NOTICE: f_leak => defdef NOTICE: f_leak => defdef ! NOTICE: f_leak => dddddd_updt NOTICE: f_leak => defdef a | b | a | b | t1_1 | t1_2 ---+-------------+---+-------------+-----------------+----------------- ! 4 | dddddd_updt | 4 | dddddd_updt | (4,dddddd_updt) | (4,dddddd_updt) 4 | defdef | 4 | defdef | (4,defdef) | (4,defdef) (2 rows) --- 1328,1342 ---- UPDATE t1 t1_1 SET b = t1_2.b FROM t1 t1_2 WHERE t1_1.a = 4 AND t1_2.a = t1_1.a AND t1_2.b = t1_1.b AND f_leak(t1_1.b) AND f_leak(t1_2.b) RETURNING *, t1_1, t1_2; ! NOTICE: f_leak => daddad_updt ! NOTICE: f_leak => daddad_updt NOTICE: f_leak => defdef NOTICE: f_leak => defdef ! NOTICE: f_leak => daddad_updt NOTICE: f_leak => defdef a | b | a | b | t1_1 | t1_2 ---+-------------+---+-------------+-----------------+----------------- ! 4 | daddad_updt | 4 | daddad_updt | (4,daddad_updt) | (4,daddad_updt) 4 | defdef | 4 | defdef | (4,defdef) | (4,defdef) (2 rows) *************** SELECT * FROM t1 ORDER BY a,b; *** 1354,1360 **** 3 | ccc 3 | cde 3 | zzz ! 4 | dddddd_updt 4 | defdef (11 rows) --- 1354,1360 ---- 3 | ccc 3 | cde 3 | zzz ! 4 | daddad_updt 4 | defdef (11 rows) *************** EXPLAIN (COSTS OFF) DELETE FROM t1 WHERE *** 1397,1407 **** DELETE FROM only t1 WHERE f_leak(b) RETURNING oid, *, t1; NOTICE: f_leak => bbbbbb_updt ! NOTICE: f_leak => dddddd_updt oid | a | b | t1 -----+---+-------------+----------------- 102 | 2 | bbbbbb_updt | (2,bbbbbb_updt) ! 104 | 4 | dddddd_updt | (4,dddddd_updt) (2 rows) DELETE FROM t1 WHERE f_leak(b) RETURNING oid, *, t1; --- 1397,1407 ---- DELETE FROM only t1 WHERE f_leak(b) RETURNING oid, *, t1; NOTICE: f_leak => bbbbbb_updt ! NOTICE: f_leak => daddad_updt oid | a | b | t1 -----+---+-------------+----------------- 102 | 2 | bbbbbb_updt | (2,bbbbbb_updt) ! 104 | 4 | daddad_updt | (4,daddad_updt) (2 rows) DELETE FROM t1 WHERE f_leak(b) RETURNING oid, *, t1; *************** INSERT INTO z1 VALUES *** 1656,1673 **** (1, 'aba'), (2, 'bbb'), (3, 'ccc'), ! (4, 'ddd'); CREATE POLICY p1 ON z1 TO regress_rls_group1 USING (a % 2 = 0); CREATE POLICY p2 ON z1 TO regress_rls_group2 USING (a % 2 = 1); ALTER TABLE z1 ENABLE ROW LEVEL SECURITY; SET SESSION AUTHORIZATION regress_rls_bob; SELECT * FROM z1 WHERE f_leak(b); NOTICE: f_leak => bbb ! NOTICE: f_leak => ddd a | b ---+----- 2 | bbb ! 4 | ddd (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); --- 1656,1673 ---- (1, 'aba'), (2, 'bbb'), (3, 'ccc'), ! (4, 'dad'); CREATE POLICY p1 ON z1 TO regress_rls_group1 USING (a % 2 = 0); CREATE POLICY p2 ON z1 TO regress_rls_group2 USING (a % 2 = 1); ALTER TABLE z1 ENABLE ROW LEVEL SECURITY; SET SESSION AUTHORIZATION regress_rls_bob; SELECT * FROM z1 WHERE f_leak(b); NOTICE: f_leak => bbb ! NOTICE: f_leak => dad a | b ---+----- 2 | bbb ! 4 | dad (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); *************** EXPLAIN (COSTS OFF) EXECUTE plancache_te *** 1722,1732 **** SET ROLE regress_rls_group1; SELECT * FROM z1 WHERE f_leak(b); NOTICE: f_leak => bbb ! NOTICE: f_leak => ddd a | b ---+----- 2 | bbb ! 4 | ddd (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); --- 1722,1732 ---- SET ROLE regress_rls_group1; SELECT * FROM z1 WHERE f_leak(b); NOTICE: f_leak => bbb ! NOTICE: f_leak => dad a | b ---+----- 2 | bbb ! 4 | dad (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b); *************** SELECT * FROM rls_view; *** 1900,1912 **** NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => ddd a | b ---+----- 1 | aba 2 | bbb 3 | ccc ! 4 | ddd (4 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --- 1900,1912 ---- NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => dad a | b ---+----- 1 | aba 2 | bbb 3 | ccc ! 4 | dad (4 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; *************** SELECT * FROM rls_view; *** 1922,1934 **** NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => ddd a | b ---+----- 1 | aba 2 | bbb 3 | ccc ! 4 | ddd (4 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --- 1922,1934 ---- NOTICE: f_leak => aba NOTICE: f_leak => bbb NOTICE: f_leak => ccc ! NOTICE: f_leak => dad a | b ---+----- 1 | aba 2 | bbb 3 | ccc ! 4 | dad (4 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; *************** GRANT SELECT ON rls_view TO regress_rls_ *** 1948,1958 **** SET SESSION AUTHORIZATION regress_rls_alice; SELECT * FROM rls_view; NOTICE: f_leak => bbb ! NOTICE: f_leak => ddd a | b ---+----- 2 | bbb ! 4 | ddd (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --- 1948,1958 ---- SET SESSION AUTHORIZATION regress_rls_alice; SELECT * FROM rls_view; NOTICE: f_leak => bbb ! NOTICE: f_leak => dad a | b ---+----- 2 | bbb ! 4 | dad (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; *************** EXPLAIN (COSTS OFF) SELECT * FROM rls_vi *** 1969,1979 **** SET SESSION AUTHORIZATION regress_rls_bob; SELECT * FROM rls_view; NOTICE: f_leak => bbb ! NOTICE: f_leak => ddd a | b ---+----- 2 | bbb ! 4 | ddd (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --- 1969,1979 ---- SET SESSION AUTHORIZATION regress_rls_bob; SELECT * FROM rls_view; NOTICE: f_leak => bbb ! NOTICE: f_leak => dad a | b ---+----- 2 | bbb ! 4 | dad (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; *************** SET SESSION AUTHORIZATION regress_rls_bo *** 1996,2006 **** GRANT SELECT ON rls_view TO regress_rls_carol; SELECT * FROM rls_view; NOTICE: f_leak => bbb ! NOTICE: f_leak => ddd a | b ---+----- 2 | bbb ! 4 | ddd (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; --- 1996,2006 ---- GRANT SELECT ON rls_view TO regress_rls_carol; SELECT * FROM rls_view; NOTICE: f_leak => bbb ! NOTICE: f_leak => dad a | b ---+----- 2 | bbb ! 4 | dad (2 rows) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; diff --git a/src/test/regress/sql/rowsecurity.sql b/src/test/regress/sql/rowsecurity.sql new file mode 100644 index 785ac84..7fcefe4 *** a/src/test/regress/sql/rowsecurity.sql --- b/src/test/regress/sql/rowsecurity.sql *************** COPY t1 FROM stdin WITH (oids); *** 203,209 **** 101 1 aba 102 2 bbb 103 3 ccc ! 104 4 ddd \. CREATE TABLE t2 (c float) INHERITS (t1); --- 203,209 ---- 101 1 aba 102 2 bbb 103 3 ccc ! 104 4 dad \. CREATE TABLE t2 (c float) INHERITS (t1); *************** INSERT INTO z1 VALUES *** 638,644 **** (1, 'aba'), (2, 'bbb'), (3, 'ccc'), ! (4, 'ddd'); CREATE POLICY p1 ON z1 TO regress_rls_group1 USING (a % 2 = 0); CREATE POLICY p2 ON z1 TO regress_rls_group2 USING (a % 2 = 1); --- 638,644 ---- (1, 'aba'), (2, 'bbb'), (3, 'ccc'), ! (4, 'dad'); CREATE POLICY p1 ON z1 TO regress_rls_group1 USING (a % 2 = 0); CREATE POLICY p2 ON z1 TO regress_rls_group2 USING (a % 2 = 1);