diff options
author | Robert Haas <rhaas@postgresql.org> | 2018-02-08 12:31:48 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2018-02-08 12:31:48 -0500 |
commit | 88fdc7006018b92d6ec92c54b3819764703daaba (patch) | |
tree | e7fbaf2b57f0d839fd6f8f34511cdf68fe5ae51b /src/backend/executor/nodeAppend.c | |
parent | b3a101eff0fd3747bebf547b1769e28f820f4515 (diff) | |
download | postgresql-88fdc7006018b92d6ec92c54b3819764703daaba.tar.gz postgresql-88fdc7006018b92d6ec92c54b3819764703daaba.zip |
Fix possible infinite loop with Parallel Append.
When the previously-chosen plan was non-partial, all pa_finished
flags for partial plans are now set, and pa_next_plan has not yet
been set to INVALID_SUBPLAN_INDEX, the previous code could go into
an infinite loop.
Report by Rajkumar Raghuwanshi. Patch by Amit Khandekar and me.
Review by Kyotaro Horiguchi.
Discussion: http://postgr.es/m/CAJ3gD9cf43z78qY=U=H0HvOEN341qfRO-vLpnKPSviHeWgJQ5w@mail.gmail.com
Diffstat (limited to 'src/backend/executor/nodeAppend.c')
-rw-r--r-- | src/backend/executor/nodeAppend.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index 64a17fb0327..264d8fea8d9 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -473,6 +473,9 @@ choose_next_subplan_for_worker(AppendState *node) return false; } + /* Save the plan from which we are starting the search. */ + node->as_whichplan = pstate->pa_next_plan; + /* Loop until we find a subplan to execute. */ while (pstate->pa_finished[pstate->pa_next_plan]) { @@ -481,14 +484,17 @@ choose_next_subplan_for_worker(AppendState *node) /* Advance to next plan. */ pstate->pa_next_plan++; } - else if (append->first_partial_plan < node->as_nplans) + else if (node->as_whichplan > append->first_partial_plan) { /* Loop back to first partial plan. */ pstate->pa_next_plan = append->first_partial_plan; } else { - /* At last plan, no partial plans, arrange to bail out. */ + /* + * At last plan, and either there are no partial plans or we've + * tried them all. Arrange to bail out. + */ pstate->pa_next_plan = node->as_whichplan; } |