summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/planner.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r--src/backend/optimizer/plan/planner.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 38d070fa004..0e34873d6a8 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -911,6 +911,9 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
EXPRKIND_QUAL);
}
+ parse->mergeJoinCondition =
+ preprocess_expression(root, parse->mergeJoinCondition, EXPRKIND_QUAL);
+
root->append_rel_list = (List *)
preprocess_expression(root, (Node *) root->append_rel_list,
EXPRKIND_APPINFO);
@@ -1805,6 +1808,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
List *withCheckOptionLists = NIL;
List *returningLists = NIL;
List *mergeActionLists = NIL;
+ List *mergeJoinConditions = NIL;
List *rowMarks;
if (bms_membership(root->all_result_relids) == BMS_MULTIPLE)
@@ -1911,6 +1915,19 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
mergeActionLists = lappend(mergeActionLists,
mergeActionList);
}
+ if (parse->commandType == CMD_MERGE)
+ {
+ Node *mergeJoinCondition = parse->mergeJoinCondition;
+
+ if (this_result_rel != top_result_rel)
+ mergeJoinCondition =
+ adjust_appendrel_attrs_multilevel(root,
+ mergeJoinCondition,
+ this_result_rel,
+ top_result_rel);
+ mergeJoinConditions = lappend(mergeJoinConditions,
+ mergeJoinCondition);
+ }
}
if (resultRelations == NIL)
@@ -1935,6 +1952,8 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
returningLists = list_make1(parse->returningList);
if (parse->mergeActionList)
mergeActionLists = list_make1(parse->mergeActionList);
+ if (parse->commandType == CMD_MERGE)
+ mergeJoinConditions = list_make1(parse->mergeJoinCondition);
}
}
else
@@ -1950,6 +1969,8 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
returningLists = list_make1(parse->returningList);
if (parse->mergeActionList)
mergeActionLists = list_make1(parse->mergeActionList);
+ if (parse->commandType == CMD_MERGE)
+ mergeJoinConditions = list_make1(parse->mergeJoinCondition);
}
/*
@@ -1977,6 +1998,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
rowMarks,
parse->onConflict,
mergeActionLists,
+ mergeJoinConditions,
assign_special_exec_param(root));
}