diff options
Diffstat (limited to 'src/backend/optimizer/plan/analyzejoins.c')
-rw-r--r-- | src/backend/optimizer/plan/analyzejoins.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 1fb17ee29f2..1f2167a11de 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -2086,6 +2086,14 @@ remove_self_joins_one_group(PlannerInfo *root, Relids relids) { RelOptInfo *inner = root->simple_rel_array[r]; + /* + * We don't accept result relation as either source or target relation + * of SJE, because result relation has different behavior in + * EvalPlanQual() and RETURNING clause. + */ + if (root->parse->resultRelation == r) + continue; + k = r; while ((k = bms_next_member(relids, k)) > 0) @@ -2101,6 +2109,9 @@ remove_self_joins_one_group(PlannerInfo *root, Relids relids) PlanRowMark *imark = NULL; List *uclauses = NIL; + if (root->parse->resultRelation == k) + continue; + /* A sanity check: the relations have the same Oid. */ Assert(root->simple_rte_array[k]->relid == root->simple_rte_array[r]->relid); |