fix_srf-v2.diff
text/x-patch
Filename: fix_srf-v2.diff
Type: text/x-patch
Part: 0
Patch
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| src/backend/optimizer/plan/planner.c | 9 | 3 |
| src/test/regress/expected/tsrf.out | 6 | 0 |
| src/test/regress/sql/tsrf.sql | 3 | 0 |
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');