diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 1d735589cb6..9b90be5a3e6 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -2075,6 +2075,28 @@ reparameterize_path(PlannerInfo *root, Path *path, case T_SubqueryScan: return create_subqueryscan_path(root, rel, path->pathkeys, required_outer); + case T_Append: + { + AppendPath *apath = (AppendPath *) path; + List *childpaths = NIL; + ListCell *lc; + + /* Reparameterize the children */ + foreach(lc, apath->subpaths) + { + Path *spath = (Path *) lfirst(lc); + + spath = reparameterize_path(root, spath, + required_outer, + loop_count); + if (spath == NULL) + return NULL; + childpaths = lappend(childpaths, spath); + } + return (Path *) + create_append_path(rel, childpaths, + required_outer); + } default: break; } diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index 2c53c729226..d14ab18eda1 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -4954,6 +4954,25 @@ select * from Output: 3 (11 rows) +-- check handling of nested appendrels inside LATERAL +select * from + ((select 2 as v) union all (select 3 as v)) as q1 + cross join lateral + ((select * from + ((select 4 as v) union all (select 5 as v)) as q3) + union all + (select q1.v) + ) as q2; + v | v +---+--- + 2 | 4 + 2 | 5 + 2 | 2 + 3 | 4 + 3 | 5 + 3 | 3 +(6 rows) + -- check we don't try to do a unique-ified semijoin with LATERAL explain (verbose, costs off) select * from diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql index 8378ba1b516..5e69a478508 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -1569,6 +1569,16 @@ select * from select * from (select 3 as z) z where z.z = x.x ) zz on zz.z = y.y; +-- check handling of nested appendrels inside LATERAL +select * from + ((select 2 as v) union all (select 3 as v)) as q1 + cross join lateral + ((select * from + ((select 4 as v) union all (select 5 as v)) as q3) + union all + (select q1.v) + ) as q2; + -- check we don't try to do a unique-ified semijoin with LATERAL explain (verbose, costs off) select * from