diff options
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 22 |
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)); } |