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);
