diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/executor/nodeAppend.c | 21 | ||||
-rw-r--r-- | src/test/regress/expected/select_parallel.out | 11 | ||||
-rw-r--r-- | src/test/regress/sql/select_parallel.sql | 6 |
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) |