Guard against core dump from uninitialized subplan.
authorTom Lane <[email protected]>
Tue, 3 Nov 2020 21:16:36 +0000 (16:16 -0500)
committerTom Lane <[email protected]>
Tue, 3 Nov 2020 21:16:36 +0000 (16:16 -0500)
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

index 9a706df5f061df8aa090f3fa14676a2445b5c7b6..152c7ae7eb4ea7458d07126c48a79619b0638a92 100644 (file)
@@ -797,7 +797,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 */