diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2024-01-09 10:01:22 +0200 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2024-01-09 10:01:22 +0200 |
commit | 8c441c082797f22ae96f50b641a8ef3f65c92b8d (patch) | |
tree | ebc1da408c3be4f1f09a09195bc006e6079c4a05 /src/backend/optimizer/plan/analyzejoins.c | |
parent | 30b4955a4668887044568743debef804b14418ca (diff) |
Forbid SJE with result relation
The target relation for INSERT/UPDATE/DELETE/MERGE has a different behavior
than other relations in EvalPlanQual() and RETURNING clause. This is why we
forbid target relation to be either source or target relation in SJE.
It's not clear if we could ever support this.
Reported-by: Alexander Lakhin
Discussion: https://postgr.es/m/b9e8f460-f9a6-0e9b-e8ba-60d59f0bc22c%40gmail.com
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); |