Commit e98c9009 authored by Tom Lane's avatar Tom Lane

Fix missed step in removal of useless RESULT RTEs in the planner.

Commit 4be058fe 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
parent 36a4ac20
...@@ -3256,6 +3256,7 @@ remove_result_refs(PlannerInfo *root, int varno, Node *newjtloc) ...@@ -3256,6 +3256,7 @@ remove_result_refs(PlannerInfo *root, int varno, Node *newjtloc)
subrelids = get_relids_in_jointree(newjtloc, false); subrelids = get_relids_in_jointree(newjtloc, false);
Assert(!bms_is_empty(subrelids)); Assert(!bms_is_empty(subrelids));
substitute_phv_relids((Node *) root->parse, varno, subrelids); substitute_phv_relids((Node *) root->parse, varno, subrelids);
fix_append_rel_relids(root->append_rel_list, varno, subrelids);
} }
/* /*
......
...@@ -3333,6 +3333,42 @@ select * from ...@@ -3333,6 +3333,42 @@ select * from
1 | 2 | 2 1 | 2 | 2
(1 row) (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 inlining of immutable functions -- test inlining of immutable functions
-- --
......
...@@ -1056,6 +1056,28 @@ select * from ...@@ -1056,6 +1056,28 @@ select * from
(select 1 as x) ss1 left join (select 2 as y) ss2 on (true), (select 1 as x) ss1 left join (select 2 as y) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3; 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 inlining of immutable functions -- test inlining of immutable functions
-- --
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment