aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r--src/backend/optimizer/plan/createplan.c2
-rw-r--r--src/backend/optimizer/plan/planner.c19
-rw-r--r--src/backend/optimizer/plan/setrefs.c2
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;