diff options
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 2 | ||||
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 19 | ||||
-rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 2 |
3 files changed, 22 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 655be8155a4..76ba1bfa8d2 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -4809,6 +4809,7 @@ make_result(PlannerInfo *root, ModifyTable * make_modifytable(PlannerInfo *root, CmdType operation, bool canSetTag, + Index nominalRelation, List *resultRelations, List *subplans, List *withCheckOptionLists, List *returningLists, List *rowMarks, int epqParam) @@ -4857,6 +4858,7 @@ make_modifytable(PlannerInfo *root, node->operation = operation; node->canSetTag = canSetTag; + node->nominalRelation = nominalRelation; node->resultRelations = resultRelations; node->resultRelIndex = -1; /* will be set correctly in setrefs.c */ node->plans = subplans; diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 9cbbcfb19d4..5c4884f46b9 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -607,6 +607,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse, plan = (Plan *) make_modifytable(root, parse->commandType, parse->canSetTag, + parse->resultRelation, list_make1_int(parse->resultRelation), list_make1(plan), withCheckOptionLists, @@ -790,6 +791,7 @@ inheritance_planner(PlannerInfo *root) { Query *parse = root->parse; int parentRTindex = parse->resultRelation; + int nominalRelation = -1; List *final_rtable = NIL; int save_rel_array_size = 0; RelOptInfo **save_rel_array = NULL; @@ -925,6 +927,20 @@ inheritance_planner(PlannerInfo *root) appinfo->child_relid = subroot.parse->resultRelation; /* + * We'll use the first child relation (even if it's excluded) as the + * nominal target relation of the ModifyTable node. Because of the + * way expand_inherited_rtentry works, this should always be the RTE + * representing the parent table in its role as a simple member of the + * inheritance set. (It would be logically cleaner to use the + * inheritance parent RTE as the nominal target; but since that RTE + * will not be otherwise referenced in the plan, doing so would give + * rise to confusing use of multiple aliases in EXPLAIN output for + * what the user will think is the "same" table.) + */ + if (nominalRelation < 0) + nominalRelation = appinfo->child_relid; + + /* * If this child rel was excluded by constraint exclusion, exclude it * from the result plan. */ @@ -1051,6 +1067,7 @@ inheritance_planner(PlannerInfo *root) return (Plan *) make_modifytable(root, parse->commandType, parse->canSetTag, + nominalRelation, resultRelations, subplans, withCheckOptionLists, @@ -2260,7 +2277,7 @@ preprocess_rowmarks(PlannerInfo *root) newrc->markType = ROW_MARK_REFERENCE; else newrc->markType = ROW_MARK_COPY; - newrc->waitPolicy = LockWaitBlock; /* doesn't matter */ + newrc->waitPolicy = LockWaitBlock; /* doesn't matter */ newrc->isParent = false; prowmarks = lappend(prowmarks, newrc); diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 7703946c853..57195e5d68f 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -754,6 +754,8 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) splan->plan.targetlist = copyObject(linitial(newRL)); } + splan->nominalRelation += rtoffset; + foreach(l, splan->resultRelations) { lfirst_int(l) += rtoffset; |