diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index bc81535905..647baa3cf6 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -6939,6 +6939,9 @@ apply_scanjoin_target_to_paths(PlannerInfo *root, */ rel->reltarget = llast_node(PathTarget, scanjoin_targets); + /* Extract SRF-free scan/join target. */ + scanjoin_target = linitial_node(PathTarget, scanjoin_targets); + /* Special case: handle dummy relations separately. */ if (is_dummy_rel) { @@ -6967,12 +6970,15 @@ apply_scanjoin_target_to_paths(PlannerInfo *root, rel->part_rels = NULL; rel->boundinfo = NULL; + /* Now fix things up if scan/join target contains SRFs */ + if (root->parse->hasTargetSRFs) + adjust_paths_for_srfs(root, rel, + scanjoin_targets, + scanjoin_targets_contain_srfs); + return; } - /* Extract SRF-free scan/join target. */ - scanjoin_target = linitial_node(PathTarget, scanjoin_targets); - /* * Adjust each input path. If the tlist exprs are the same, we can just * inject the sortgroupref information into the existing pathtarget. diff --git a/src/test/regress/expected/tsrf.out b/src/test/regress/expected/tsrf.out index 25be6b9ab1..75e6614ab3 100644 --- a/src/test/regress/expected/tsrf.out +++ b/src/test/regress/expected/tsrf.out @@ -81,6 +81,12 @@ SELECT generate_series(1, generate_series(1, 3)), generate_series(2, 4); 3 | 4 (6 rows) +-- SRF in a no-op query +SELECT unnest(ARRAY[1, 2]) FROM pg_class WHERE false; + unnest +-------- +(0 rows) + CREATE TABLE few(id int, dataa text, datab text); INSERT INTO few VALUES(1, 'a', 'foo'),(2, 'a', 'bar'),(3, 'b', 'bar'); -- SRF output order of sorting is maintained, if SRF is not referenced diff --git a/src/test/regress/sql/tsrf.sql b/src/test/regress/sql/tsrf.sql index 0a1e8e5666..dafeab7b68 100644 --- a/src/test/regress/sql/tsrf.sql +++ b/src/test/regress/sql/tsrf.sql @@ -25,6 +25,9 @@ explain (verbose, costs off) SELECT generate_series(1, generate_series(1, 3)), generate_series(2, 4); SELECT generate_series(1, generate_series(1, 3)), generate_series(2, 4); +-- SRF in a no-op query +SELECT unnest(ARRAY[1, 2]) FROM pg_class WHERE false; + CREATE TABLE few(id int, dataa text, datab text); INSERT INTO few VALUES(1, 'a', 'foo'),(2, 'a', 'bar'),(3, 'b', 'bar');