diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 00db38e90b..173f0d21fe 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -6093,11 +6093,13 @@ plan_create_index_workers(Oid tableOid, Oid indexOid) /* * Determine if it's safe to proceed. * - * Currently, parallel workers can't access the leader's temporary tables. - * Furthermore, any index predicate or index expressions must be parallel - * safe. + * Currently, parallel workers can't access the leader's temporary tables, + * or the leader's relmapper.c state, which is needed for builds on mapped + * relations. Furthermore, any index predicate or index expressions must + * be parallel safe. */ if (heap->rd_rel->relpersistence == RELPERSISTENCE_TEMP || + RelationIsMapped(heap) || !is_parallel_safe(root, (Node *) RelationGetIndexExpressions(index)) || !is_parallel_safe(root, (Node *) RelationGetIndexPredicate(index))) { diff --git a/src/backend/utils/cache/relmapper.c b/src/backend/utils/cache/relmapper.c index 99d095f2df..e3a5e4e386 100644 --- a/src/backend/utils/cache/relmapper.c +++ b/src/backend/utils/cache/relmapper.c @@ -263,13 +263,17 @@ RelationMapUpdateMap(Oid relationId, Oid fileNode, bool shared, else { /* - * We don't currently support map changes within subtransactions. This - * could be done with more bookkeeping infrastructure, but it doesn't - * presently seem worth it. + * We don't currently support map changes within subtransactions, and + * parallel workers must avoid relying on mapping state, since it + * isn't propagated from the leader. This could be done with more + * bookkeeping infrastructure, but it doesn't presently seem worth it. */ if (GetCurrentTransactionNestLevel() > 1) elog(ERROR, "cannot change relation mapping within subtransaction"); + if (IsInParallelMode()) + elog(ERROR, "cannot change relation mapping in parallel mode"); + if (immediate) { /* Make it active, but only locally */