Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix missed step in removal of useless RESULT RTEs in the planner.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 5 Dec 2020 21:16:13 +0000 (16:16 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 5 Dec 2020 21:16:13 +0000 (16:16 -0500)
Commit 4be058fe9 forgot that the append_rel_list would already be
populated at the time we remove useless result RTEs, and it might contain
PlaceHolderVars that need to be adjusted like the ones in the main parse
tree.  This could lead to "no relation entry for relid N" failures later
on, when the planner tries to do something with an unadjusted PHV.

Per report from Tom Ellis.  Back-patch to v12 where the bug came in.

Discussion: https://postgr.es/m/20201205173056.GF30712@cloudinit-builder

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

index 2b19af7cb7025a0aa61142d0c7fbb98c98c2604e..722fd16eeb4962eed84ba0c40e56455fe5049bce 100644 (file)
@@ -3090,6 +3090,7 @@ remove_result_refs(PlannerInfo *root, int varno, Node *newjtloc)
        subrelids = get_relids_in_jointree(newjtloc, false);
        Assert(!bms_is_empty(subrelids));
        substitute_phv_relids((Node *) root->parse, varno, subrelids);
+       fix_append_rel_relids(root->append_rel_list, varno, subrelids);
    }
 
    /*
index 55f17ffe1dd860bd830a36530e3dd5eecd69f253..3d889314a24fa681838f8a5e5fd8b73beb9748fc 100644 (file)
@@ -3330,6 +3330,42 @@ select * from
  1 | 2 | 2
 (1 row)
 
+-- Test proper handling of appendrel PHVs during useless-RTE removal
+explain (costs off)
+select * from
+  (select 0 as z) as t1
+  left join
+  (select true as a) as t2
+  on true,
+  lateral (select true as b
+           union all
+           select a as b) as t3
+where b;
+              QUERY PLAN               
+---------------------------------------
+ Nested Loop
+   ->  Result
+   ->  Append
+         ->  Result
+         ->  Result
+               One-Time Filter: (true)
+(6 rows)
+
+select * from
+  (select 0 as z) as t1
+  left join
+  (select true as a) as t2
+  on true,
+  lateral (select true as b
+           union all
+           select a as b) as t3
+where b;
+ z | a | b 
+---+---+---
+ 0 | t | t
+ 0 | t | t
+(2 rows)
+
 --
 -- test extraction of restriction OR clauses from join OR clause
 -- (we used to only do this for indexable clauses)
index 7a68d306d1db3f9e0f52fdde95909ace80deb3d9..9e8dfd156ab8987c759f5fd530dcdbde1aa55982 100644 (file)
@@ -1052,6 +1052,28 @@ select * from
   (select 1 as x) ss1 left join (select 2 as y) ss2 on (true),
   lateral (select ss2.y as z limit 1) ss3;
 
+-- Test proper handling of appendrel PHVs during useless-RTE removal
+explain (costs off)
+select * from
+  (select 0 as z) as t1
+  left join
+  (select true as a) as t2
+  on true,
+  lateral (select true as b
+           union all
+           select a as b) as t3
+where b;
+
+select * from
+  (select 0 as z) as t1
+  left join
+  (select true as a) as t2
+  on true,
+  lateral (select true as b
+           union all
+           select a as b) as t3
+where b;
+
 --
 -- test extraction of restriction OR clauses from join OR clause
 -- (we used to only do this for indexable clauses)