aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeSubplan.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-11-03 16:16:36 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2020-11-03 16:16:36 -0500
commit92f87182f2c617fd420832972b6d0ae4527301c8 (patch)
treeb79a003f6dd640d8c6fc6dfa6a69956ea59616ef /src/backend/executor/nodeSubplan.c
parent17fb60387ce3fdc2bbb13d9b67bed0e4da77e173 (diff)
downloadpostgresql-92f87182f2c617fd420832972b6d0ae4527301c8.tar.gz
postgresql-92f87182f2c617fd420832972b6d0ae4527301c8.zip
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
Diffstat (limited to 'src/backend/executor/nodeSubplan.c')
-rw-r--r--src/backend/executor/nodeSubplan.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c
index 9a706df5f06..152c7ae7eb4 100644
--- a/src/backend/executor/nodeSubplan.c
+++ b/src/backend/executor/nodeSubplan.c
@@ -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 */