Commit 88fdc700 authored by Robert Haas's avatar Robert Haas

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
parent b3a101ef
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment