diff options
Diffstat (limited to 'src/backend/optimizer/prep/prepunion.c')
-rw-r--r-- | src/backend/optimizer/prep/prepunion.c | 18 |
1 files changed, 3 insertions, 15 deletions
diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c index 690b6bbab7f..d5720518a81 100644 --- a/src/backend/optimizer/prep/prepunion.c +++ b/src/backend/optimizer/prep/prepunion.c @@ -1515,7 +1515,6 @@ expand_inherited_tables(PlannerInfo *root) static void expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) { - Query *parse = root->parse; Oid parentOID; PlanRowMark *oldrc; Relation oldrelation; @@ -1546,21 +1545,9 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) * relation named in the query. However, for each child relation we add * to the query, we must obtain an appropriate lock, because this will be * the first use of those relations in the parse/rewrite/plan pipeline. - * - * If the parent relation is the query's result relation, then we need - * RowExclusiveLock. Otherwise, if it's accessed FOR UPDATE/SHARE, we - * need RowShareLock; otherwise AccessShareLock. We can't just grab - * AccessShareLock because then the executor would be trying to upgrade - * the lock, leading to possible deadlocks. (This code should match the - * parser and rewriter.) + * Child rels should use the same lockmode as their parent. */ - oldrc = get_plan_rowmark(root->rowMarks, rti); - if (rti == parse->resultRelation) - lockmode = RowExclusiveLock; - else if (oldrc && RowMarkRequiresRowShareLock(oldrc->markType)) - lockmode = RowShareLock; - else - lockmode = AccessShareLock; + lockmode = rte->rellockmode; /* Scan for all members of inheritance set, acquire needed locks */ inhOIDs = find_all_inheritors(parentOID, lockmode, NULL); @@ -1582,6 +1569,7 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti) * PlanRowMark as isParent = true, and generate a new PlanRowMark for each * child. */ + oldrc = get_plan_rowmark(root->rowMarks, rti); if (oldrc) oldrc->isParent = true; |