--
 SET SESSION AUTHORIZATION rls_regress_user0;
 CREATE TABLE z1 (a int, b text);
-GRANT SELECT ON z1 TO rls_regress_group1, rls_regress_group2,
+CREATE TABLE z2 (a int, b text);
+GRANT SELECT ON z1,z2 TO rls_regress_group1, rls_regress_group2,
     rls_regress_user1, rls_regress_user2;
 INSERT INTO z1 VALUES
     (1, 'aaa'),
          Filter: ((a % 2) = 0)
 (4 rows)
 
+PREPARE plancache_test AS SELECT * FROM z1 WHERE f_leak(b);
+EXPLAIN EXECUTE plancache_test;
+                          QUERY PLAN                           
+---------------------------------------------------------------
+ Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+   Filter: f_leak(z1.b)
+   ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+         Filter: ((a % 2) = 0)
+(4 rows)
+
+PREPARE plancache_test2 AS WITH q AS (SELECT * FROM z1 WHERE f_leak(b)) SELECT * FROM q,z2;
+EXPLAIN EXECUTE plancache_test2;
+                              QUERY PLAN                               
+-----------------------------------------------------------------------
+ Nested Loop  (cost=29.11..86.78 rows=2540 width=72)
+   CTE q
+     ->  Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+           Filter: f_leak(z1.b)
+           ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+                 Filter: ((a % 2) = 0)
+   ->  CTE Scan on q  (cost=0.00..0.04 rows=2 width=36)
+   ->  Materialize  (cost=0.00..29.05 rows=1270 width=36)
+         ->  Seq Scan on z2  (cost=0.00..22.70 rows=1270 width=36)
+(9 rows)
+
+PREPARE plancache_test3 AS WITH q AS (SELECT * FROM z2) SELECT * FROM q,z1 WHERE f_leak(z1.b);
+EXPLAIN EXECUTE plancache_test3;
+                                QUERY PLAN                                 
+---------------------------------------------------------------------------
+ Nested Loop  (cost=22.70..108.97 rows=2540 width=72)
+   CTE q
+     ->  Seq Scan on z2  (cost=0.00..22.70 rows=1270 width=36)
+   ->  CTE Scan on q  (cost=0.00..25.40 rows=1270 width=36)
+   ->  Materialize  (cost=0.00..29.12 rows=2 width=36)
+         ->  Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+               Filter: f_leak(z1.b)
+               ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+                     Filter: ((a % 2) = 0)
+(9 rows)
+
 SET ROLE rls_regress_group1;
 SELECT * FROM z1 WHERE f_leak(b);
 NOTICE:  f_leak => bbb
          Filter: ((a % 2) = 0)
 (4 rows)
 
+EXPLAIN EXECUTE plancache_test;
+                          QUERY PLAN                           
+---------------------------------------------------------------
+ Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+   Filter: f_leak(z1.b)
+   ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+         Filter: ((a % 2) = 0)
+(4 rows)
+
+EXPLAIN EXECUTE plancache_test2;
+                              QUERY PLAN                               
+-----------------------------------------------------------------------
+ Nested Loop  (cost=29.11..86.78 rows=2540 width=72)
+   CTE q
+     ->  Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+           Filter: f_leak(z1.b)
+           ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+                 Filter: ((a % 2) = 0)
+   ->  CTE Scan on q  (cost=0.00..0.04 rows=2 width=36)
+   ->  Materialize  (cost=0.00..29.05 rows=1270 width=36)
+         ->  Seq Scan on z2  (cost=0.00..22.70 rows=1270 width=36)
+(9 rows)
+
+EXPLAIN EXECUTE plancache_test3;
+                                QUERY PLAN                                 
+---------------------------------------------------------------------------
+ Nested Loop  (cost=22.70..108.97 rows=2540 width=72)
+   CTE q
+     ->  Seq Scan on z2  (cost=0.00..22.70 rows=1270 width=36)
+   ->  CTE Scan on q  (cost=0.00..25.40 rows=1270 width=36)
+   ->  Materialize  (cost=0.00..29.12 rows=2 width=36)
+         ->  Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+               Filter: f_leak(z1.b)
+               ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+                     Filter: ((a % 2) = 0)
+(9 rows)
+
 SET SESSION AUTHORIZATION rls_regress_user2;
 SELECT * FROM z1 WHERE f_leak(b);
 NOTICE:  f_leak => aaa
          Filter: ((a % 2) = 1)
 (4 rows)
 
+EXPLAIN EXECUTE plancache_test;
+                          QUERY PLAN                           
+---------------------------------------------------------------
+ Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+   Filter: f_leak(z1.b)
+   ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+         Filter: ((a % 2) = 1)
+(4 rows)
+
+EXPLAIN EXECUTE plancache_test2;
+                              QUERY PLAN                               
+-----------------------------------------------------------------------
+ Nested Loop  (cost=29.11..86.78 rows=2540 width=72)
+   CTE q
+     ->  Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+           Filter: f_leak(z1.b)
+           ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+                 Filter: ((a % 2) = 1)
+   ->  CTE Scan on q  (cost=0.00..0.04 rows=2 width=36)
+   ->  Materialize  (cost=0.00..29.05 rows=1270 width=36)
+         ->  Seq Scan on z2  (cost=0.00..22.70 rows=1270 width=36)
+(9 rows)
+
+EXPLAIN EXECUTE plancache_test3;
+                                QUERY PLAN                                 
+---------------------------------------------------------------------------
+ Nested Loop  (cost=22.70..108.97 rows=2540 width=72)
+   CTE q
+     ->  Seq Scan on z2  (cost=0.00..22.70 rows=1270 width=36)
+   ->  CTE Scan on q  (cost=0.00..25.40 rows=1270 width=36)
+   ->  Materialize  (cost=0.00..29.12 rows=2 width=36)
+         ->  Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+               Filter: f_leak(z1.b)
+               ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+                     Filter: ((a % 2) = 1)
+(9 rows)
+
 SET ROLE rls_regress_group2;
 SELECT * FROM z1 WHERE f_leak(b);
 NOTICE:  f_leak => aaa
          Filter: ((a % 2) = 1)
 (4 rows)
 
+EXPLAIN EXECUTE plancache_test;
+                          QUERY PLAN                           
+---------------------------------------------------------------
+ Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+   Filter: f_leak(z1.b)
+   ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+         Filter: ((a % 2) = 1)
+(4 rows)
+
+EXPLAIN EXECUTE plancache_test2;
+                              QUERY PLAN                               
+-----------------------------------------------------------------------
+ Nested Loop  (cost=29.11..86.78 rows=2540 width=72)
+   CTE q
+     ->  Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+           Filter: f_leak(z1.b)
+           ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+                 Filter: ((a % 2) = 1)
+   ->  CTE Scan on q  (cost=0.00..0.04 rows=2 width=36)
+   ->  Materialize  (cost=0.00..29.05 rows=1270 width=36)
+         ->  Seq Scan on z2  (cost=0.00..22.70 rows=1270 width=36)
+(9 rows)
+
+EXPLAIN EXECUTE plancache_test3;
+                                QUERY PLAN                                 
+---------------------------------------------------------------------------
+ Nested Loop  (cost=22.70..108.97 rows=2540 width=72)
+   CTE q
+     ->  Seq Scan on z2  (cost=0.00..22.70 rows=1270 width=36)
+   ->  CTE Scan on q  (cost=0.00..25.40 rows=1270 width=36)
+   ->  Materialize  (cost=0.00..29.12 rows=2 width=36)
+         ->  Subquery Scan on z1  (cost=0.00..29.11 rows=2 width=36)
+               Filter: f_leak(z1.b)
+               ->  Seq Scan on z1 z1_1  (cost=0.00..29.05 rows=6 width=36)
+                     Filter: ((a % 2) = 1)
+(9 rows)
+
 --
 -- Views should follow policy for view owner.
 --
 
 --
 SET SESSION AUTHORIZATION rls_regress_user0;
 CREATE TABLE z1 (a int, b text);
+CREATE TABLE z2 (a int, b text);
 
-GRANT SELECT ON z1 TO rls_regress_group1, rls_regress_group2,
+GRANT SELECT ON z1,z2 TO rls_regress_group1, rls_regress_group2,
     rls_regress_user1, rls_regress_user2;
 
 INSERT INTO z1 VALUES
 SELECT * FROM z1 WHERE f_leak(b);
 EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b);
 
+PREPARE plancache_test AS SELECT * FROM z1 WHERE f_leak(b);
+EXPLAIN EXECUTE plancache_test;
+
+PREPARE plancache_test2 AS WITH q AS (SELECT * FROM z1 WHERE f_leak(b)) SELECT * FROM q,z2;
+EXPLAIN EXECUTE plancache_test2;
+
+PREPARE plancache_test3 AS WITH q AS (SELECT * FROM z2) SELECT * FROM q,z1 WHERE f_leak(z1.b);
+EXPLAIN EXECUTE plancache_test3;
+
 SET ROLE rls_regress_group1;
 SELECT * FROM z1 WHERE f_leak(b);
 EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b);
 
+EXPLAIN EXECUTE plancache_test;
+EXPLAIN EXECUTE plancache_test2;
+EXPLAIN EXECUTE plancache_test3;
+
 SET SESSION AUTHORIZATION rls_regress_user2;
 SELECT * FROM z1 WHERE f_leak(b);
 EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b);
 
+EXPLAIN EXECUTE plancache_test;
+EXPLAIN EXECUTE plancache_test2;
+EXPLAIN EXECUTE plancache_test3;
+
 SET ROLE rls_regress_group2;
 SELECT * FROM z1 WHERE f_leak(b);
 EXPLAIN (COSTS OFF) SELECT * FROM z1 WHERE f_leak(b);
 
+EXPLAIN EXECUTE plancache_test;
+EXPLAIN EXECUTE plancache_test2;
+EXPLAIN EXECUTE plancache_test3;
+
 --
 -- Views should follow policy for view owner.
 --