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
This commit is contained in:
parent
b3a101eff0
commit
88fdc70060
@ -473,6 +473,9 @@ choose_next_subplan_for_worker(AppendState *node)
|
|||||||
return false;
|
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. */
|
/* Loop until we find a subplan to execute. */
|
||||||
while (pstate->pa_finished[pstate->pa_next_plan])
|
while (pstate->pa_finished[pstate->pa_next_plan])
|
||||||
{
|
{
|
||||||
@ -481,14 +484,17 @@ choose_next_subplan_for_worker(AppendState *node)
|
|||||||
/* Advance to next plan. */
|
/* Advance to next plan. */
|
||||||
pstate->pa_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. */
|
/* Loop back to first partial plan. */
|
||||||
pstate->pa_next_plan = append->first_partial_plan;
|
pstate->pa_next_plan = append->first_partial_plan;
|
||||||
}
|
}
|
||||||
else
|
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;
|
pstate->pa_next_plan = node->as_whichplan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user