Avoid creating a RESULT RTE that's marked LATERAL.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 9 Jul 2021 17:38:24 +0000 (13:38 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 9 Jul 2021 17:38:24 +0000 (13:38 -0400)
Commit 7266d0997 added code to pull up simple constant function
results, converting the RTE_FUNCTION RTE to a dummy RTE_RESULT
RTE since it no longer need be scanned.  But I forgot to clear
the LATERAL flag if the RTE has it set.  If the function reduced
to a constant, it surely contains no lateral references so this
simplification is logically OK.  It's needed because various other
places will Assert that RESULT RTEs aren't LATERAL.

Per bug #17097 from Yaoguang Chen.  Back-patch to v13 where the
faulty code came in.

Discussion: https://postgr.es/m/17097-3372ef9f798fc94f@postgresql.org

src/backend/optimizer/prep/prepjointree.c
src/test/regress/expected/join.out
src/test/regress/sql/join.sql

index 99ac3351146c6b112c9cced02878e35b84231149..224c5153b1586c32aaf3f61244851d94767bcb6f 100644 (file)
@@ -1808,10 +1808,13 @@ pull_up_constant_function(PlannerInfo *root, Node *jtnode,
 
    /*
     * Convert the RTE to be RTE_RESULT type, signifying that we don't need to
-    * scan it anymore, and zero out RTE_FUNCTION-specific fields.
+    * scan it anymore, and zero out RTE_FUNCTION-specific fields.  Also make
+    * sure the RTE is not marked LATERAL, since elsewhere we don't expect
+    * RTE_RESULTs to be LATERAL.
     */
    rte->rtekind = RTE_RESULT;
    rte->functions = NIL;
+   rte->lateral = false;
 
    /*
     * We can reuse the RangeTblRef node.
index fec0325e73e58015335fbd73e02308409ed71a91..19cd0569876057aa48733b93d79a9e8152d83191 100644 (file)
@@ -3469,6 +3469,14 @@ select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
    Index Cond: (unique1 = 1)
 (2 rows)
 
+explain (costs off)
+select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17);
+        QUERY PLAN        
+--------------------------
+ Result
+   One-Time Filter: false
+(2 rows)
+
 explain (costs off)
 select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
                   QUERY PLAN                  
index 7f866c603b8d65524584f16ae96205e1dad32e0b..2a0e2d12d83207733d1c47eca3d69792b85553c1 100644 (file)
@@ -1113,6 +1113,9 @@ select unique1 from tenk1, f_immutable_int4(1) x where x = unique1;
 explain (costs off)
 select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
 
+explain (costs off)
+select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17);
+
 explain (costs off)
 select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;