diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 8 | ||||
-rw-r--r-- | src/backend/utils/cache/relmapper.c | 10 |
2 files changed, 12 insertions, 6 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 00db38e90bd..173f0d21fed 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 99d095f2df3..e3a5e4e386e 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 */ |