diff options
author | Robert Haas <rhaas@postgresql.org> | 2018-02-28 10:56:06 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2018-02-28 10:58:27 -0500 |
commit | ce1663cdcdbd9bf15c81570277f70571b3727dd3 (patch) | |
tree | 5dab19d776f5c78c882c7bed9ec9a8e571f0a58c /src/backend/executor/nodeAppend.c | |
parent | 4fa396464e5fe238b7994535182f28318c61c78e (diff) | |
download | postgresql-ce1663cdcdbd9bf15c81570277f70571b3727dd3.tar.gz postgresql-ce1663cdcdbd9bf15c81570277f70571b3727dd3.zip |
Fix assertion failure when Parallel Append is run serially.
Parallel-aware plan nodes must be prepared to run without parallelism
if it's not possible at execution time for whatever reason. Commit
ab72716778128fb63d54ac256adf7fe6820a1185, which introduced Parallel
Append, overlooked this.
Rajkumar Raghuwanshi reported this problem, and I included his test
case in this patch. The code changes are by me.
Discussion: http://postgr.es/m/CAKcux6=WqkUudLg1GLZZ7fc5ScWC1+Y9qD=pAHeqy32WoeJQvw@mail.gmail.com
Diffstat (limited to 'src/backend/executor/nodeAppend.c')
-rw-r--r-- | src/backend/executor/nodeAppend.c | 21 |
1 files changed, 14 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 { |