aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/nodeAppend.c21
-rw-r--r--src/test/regress/expected/select_parallel.out11
-rw-r--r--src/test/regress/sql/select_parallel.sql6
3 files changed, 31 insertions, 7 deletions
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c
index 7a3dd2ee2d0..dcbf4d68aa4 100644
--- a/src/backend/executor/nodeAppend.c
+++ b/src/backend/executor/nodeAppend.c
@@ -162,7 +162,7 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
appendstate->as_whichplan =
appendstate->ps.plan->parallel_aware ? INVALID_SUBPLAN_INDEX : 0;
- /* If parallel-aware, this will be overridden later. */
+ /* For parallel query, this will be overridden later. */
appendstate->choose_next_subplan = choose_next_subplan_locally;
return appendstate;
@@ -361,14 +361,21 @@ choose_next_subplan_locally(AppendState *node)
{
int whichplan = node->as_whichplan;
- /* We should never see INVALID_SUBPLAN_INDEX in this case. */
- Assert(whichplan >= 0 && whichplan <= node->as_nplans);
-
if (ScanDirectionIsForward(node->ps.state->es_direction))
{
- if (whichplan >= node->as_nplans - 1)
- return false;
- node->as_whichplan++;
+ /*
+ * We won't normally see INVALID_SUBPLAN_INDEX in this case, but we
+ * might if a plan intended to be run in parallel ends up being run
+ * serially.
+ */
+ if (whichplan == INVALID_SUBPLAN_INDEX)
+ node->as_whichplan = 0;
+ else
+ {
+ if (whichplan >= node->as_nplans - 1)
+ return false;
+ node->as_whichplan++;
+ }
}
else
{
diff --git a/src/test/regress/expected/select_parallel.out b/src/test/regress/expected/select_parallel.out
index 452494fbfa3..0a782616385 100644
--- a/src/test/regress/expected/select_parallel.out
+++ b/src/test/regress/expected/select_parallel.out
@@ -121,6 +121,17 @@ select round(avg(aa)), sum(aa) from a_star a4;
(1 row)
reset enable_parallel_append;
+-- Parallel Append that runs serially
+create or replace function foobar() returns setof text as
+$$ select 'foo'::varchar union all select 'bar'::varchar $$
+language sql stable;
+select foobar() order by 1;
+ foobar
+--------
+ bar
+ foo
+(2 rows)
+
-- test with leader participation disabled
set parallel_leader_participation = off;
explain (costs off)
diff --git a/src/test/regress/sql/select_parallel.sql b/src/test/regress/sql/select_parallel.sql
index b12ba0b74a0..fa03aae0c03 100644
--- a/src/test/regress/sql/select_parallel.sql
+++ b/src/test/regress/sql/select_parallel.sql
@@ -49,6 +49,12 @@ explain (costs off)
select round(avg(aa)), sum(aa) from a_star a4;
reset enable_parallel_append;
+-- Parallel Append that runs serially
+create or replace function foobar() returns setof text as
+$$ select 'foo'::varchar union all select 'bar'::varchar $$
+language sql stable;
+select foobar() order by 1;
+
-- test with leader participation disabled
set parallel_leader_participation = off;
explain (costs off)