postgres.git / summary / log / commit / refs

commit    55416b26a98fcf354af88cdd27fc2e045453b68a
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Tue Nov 03 21:16:36 2020 +0000
First released in: 14.0, 10.15, 11.10, 12.5, 13.1

    Guard against core dump from uninitialized subplan.
    
    If the planner erroneously puts a non-parallel-safe SubPlan into
    a parallelized portion of the query tree, nodeSubplan.c will fail
    in the worker processes because it finds a null in es_subplanstates,
    which it's unable to cope with.  It seems worth a test-and-elog to
    make that an error case rather than a core dump case.
    
    This probably should have been included in commit 16ebab688, which
    was responsible for allowing nulls to appear in es_subplanstates
    to begin with.  So, back-patch to v10 where that came in.
    
    Discussion: https://postgr.es/m/924226.1604422326@sss.pgh.pa.us


src/backend/executor/nodeSubplan.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index 5e9ce229b89..62ef1385710 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -798,7 +798,15 @@ ExecInitSubPlan(SubPlan *subplan, PlanState *parent) sstate->planstate = (PlanState *) list_nth(estate->es_subplanstates, subplan->plan_id - 1); - /* ... and to its parent's state */ + /* + * This check can fail if the planner mistakenly puts a parallel-unsafe + * subplan into a parallelized subquery; see ExecSerializePlan. + */ + if (sstate->planstate == NULL) + elog(ERROR, "subplan \"%s\" was not initialized", + subplan->plan_name); + + /* Link to parent's state, too */ sstate->parent = parent; /* Initialize subexpressions */ [parent: 136f87ea57b3]