diff options
author | Andres Freund <andres@anarazel.de> | 2015-05-13 00:13:22 +0200 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2015-05-13 00:13:22 +0200 |
commit | 4af6e61a363246cf7fff3368a76603b0ce9945dd (patch) | |
tree | 95812a969e049a62dedc89eb60c96304b81f5a5a /src/backend/optimizer/plan/setrefs.c | |
parent | 5c7df74204e2fb9440b576518d40fcf3ac65c8ac (diff) | |
download | postgresql-4af6e61a363246cf7fff3368a76603b0ce9945dd.tar.gz postgresql-4af6e61a363246cf7fff3368a76603b0ce9945dd.zip |
Fix ON CONFLICT bugs that manifest when used in rules.
Specifically the tlist and rti of the pseudo "excluded" relation weren't
properly treated by expression_tree_walker, which lead to errors when
excluded was referenced inside a rule because the varnos where not
properly adjusted. Similar omissions in OffsetVarNodes and
expression_tree_mutator had less impact, but should obviously be fixed
nonetheless.
A couple tests of for ON CONFLICT UPDATE into INSERT rule bearing
relations have been added.
In passing I updated a couple comments.
Diffstat (limited to 'src/backend/optimizer/plan/setrefs.c')
-rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index fac51c91474..517409d28a0 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -740,9 +740,9 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) /* * We treat ModifyTable with ON CONFLICT as a form of 'pseudo - * join', where the inner side is the EXLUDED tuple. Therefore - * use fix_join_expr to setup the relevant variables to - * INNER_VAR. We explicitly don't create any OUTER_VARs as + * join', where the inner side is the EXCLUDED tuple. + * Therefore use fix_join_expr to setup the relevant variables + * to INNER_VAR. We explicitly don't create any OUTER_VARs as * those are already used by RETURNING and it seems better to * be non-conflicting. */ @@ -763,6 +763,9 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) NULL, itlist, linitial_int(splan->resultRelations), rtoffset); + + splan->exclRelTlist = + fix_scan_list(root, splan->exclRelTlist, rtoffset); } splan->nominalRelation += rtoffset; |