Ensure dummy paths have correct required_outer if rel is parameterized.
The assertions added by commits 34ea1ab7f et al found another problem: set_dummy_rel_pathlist and mark_dummy_rel were failing to label the dummy paths they create with the correct outer_relids, in case the relation is necessarily parameterized due to having lateral references in its tlist. It's likely that this has no user-visible consequences in production builds, at the moment; but still an assertion failure is a bad thing, so back-patch the fix. Per bug #15694 from Roman Zharkov (via Alexander Lakhin) and an independent report by Tushar Ahuja. Discussion: https://postgr.es/m/15694-74f2ca97e7044f7f@postgresql.org Discussion: https://postgr.es/m/7d72ab20-c725-3ce2-f99d-4e64dd8a0de6@enterprisedb.com
This commit is contained in:
parent
72f725ab25
commit
71288846ef
@ -1257,7 +1257,8 @@ set_dummy_rel_pathlist(RelOptInfo *rel)
|
||||
/* Discard any pre-existing paths; no further need for them */
|
||||
rel->pathlist = NIL;
|
||||
|
||||
add_path(rel, (Path *) create_append_path(rel, NIL, NULL));
|
||||
add_path(rel, (Path *) create_append_path(rel, NIL,
|
||||
rel->lateral_relids));
|
||||
|
||||
/*
|
||||
* We set the cheapest path immediately, to ensure that IS_DUMMY_REL()
|
||||
|
@ -1197,7 +1197,8 @@ mark_dummy_rel(RelOptInfo *rel)
|
||||
rel->pathlist = NIL;
|
||||
|
||||
/* Set up the dummy path */
|
||||
add_path(rel, (Path *) create_append_path(rel, NIL, NULL));
|
||||
add_path(rel, (Path *) create_append_path(rel, NIL,
|
||||
rel->lateral_relids));
|
||||
|
||||
/* Set or update cheapest_total_path and related fields */
|
||||
set_cheapest(rel);
|
||||
|
@ -5290,6 +5290,37 @@ select * from
|
||||
Output: 3
|
||||
(11 rows)
|
||||
|
||||
-- check dummy rels with lateral references (bug #15694)
|
||||
explain (verbose, costs off)
|
||||
select * from int8_tbl i8 left join lateral
|
||||
(select *, i8.q2 from int4_tbl where false) ss on true;
|
||||
QUERY PLAN
|
||||
----------------------------------------------
|
||||
Nested Loop Left Join
|
||||
Output: i8.q1, i8.q2, int4_tbl.f1, (i8.q2)
|
||||
-> Seq Scan on public.int8_tbl i8
|
||||
Output: i8.q1, i8.q2
|
||||
-> Result
|
||||
Output: int4_tbl.f1, (i8.q2)
|
||||
One-Time Filter: false
|
||||
-> Seq Scan on public.int4_tbl
|
||||
Output: int4_tbl.f1, i8.q2
|
||||
(9 rows)
|
||||
|
||||
explain (verbose, costs off)
|
||||
select * from int8_tbl i8 left join lateral
|
||||
(select *, i8.q2 from int4_tbl i1, int4_tbl i2 where false) ss on true;
|
||||
QUERY PLAN
|
||||
-----------------------------------------
|
||||
Nested Loop Left Join
|
||||
Output: i8.q1, i8.q2, f1, f1, (i8.q2)
|
||||
-> Seq Scan on public.int8_tbl i8
|
||||
Output: i8.q1, i8.q2
|
||||
-> Result
|
||||
Output: f1, f1, i8.q2
|
||||
One-Time Filter: false
|
||||
(7 rows)
|
||||
|
||||
-- check handling of nested appendrels inside LATERAL
|
||||
select * from
|
||||
((select 2 as v) union all (select 3 as v)) as q1
|
||||
|
@ -1726,6 +1726,14 @@ select * from
|
||||
select * from (select 3 as z offset 0) z where z.z = x.x
|
||||
) zz on zz.z = y.y;
|
||||
|
||||
-- check dummy rels with lateral references (bug #15694)
|
||||
explain (verbose, costs off)
|
||||
select * from int8_tbl i8 left join lateral
|
||||
(select *, i8.q2 from int4_tbl where false) ss on true;
|
||||
explain (verbose, costs off)
|
||||
select * from int8_tbl i8 left join lateral
|
||||
(select *, i8.q2 from int4_tbl i1, int4_tbl i2 where false) ss on true;
|
||||
|
||||
-- check handling of nested appendrels inside LATERAL
|
||||
select * from
|
||||
((select 2 as v) union all (select 3 as v)) as q1
|
||||
|
Loading…
x
Reference in New Issue
Block a user