diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2023-11-10 22:46:46 +0200 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2023-11-10 22:46:46 +0200 |
commit | b7f315c9d7d839dda847b10d170ffec7c3f4dbba (patch) | |
tree | b71e44b4d33e9f273d8fa5187a57d6c7d20eecbd /src/backend/optimizer/plan/analyzejoins.c | |
parent | eb81e8e7902f63c4d292638edc8b7e92b766a692 (diff) | |
download | postgresql-b7f315c9d7d839dda847b10d170ffec7c3f4dbba.tar.gz postgresql-b7f315c9d7d839dda847b10d170ffec7c3f4dbba.zip |
Fix how SJE checks against PHVs
It seems that a PHV evaluated/needed at or below the self join should not have
a problem if we remove the self join. But this requires further investigation.
For now, we just do not remove self joins if the rel to be removed is laterally
referenced by PHVs.
Discussion: https://postgr.es/m/CAMbWs4-ns73VF9gi37q61G3dS6Xuos+HtryMaBh37WQn=BsaJw@mail.gmail.com
Author: Richard Guo
Diffstat (limited to 'src/backend/optimizer/plan/analyzejoins.c')
-rw-r--r-- | src/backend/optimizer/plan/analyzejoins.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 271f694d996..b9be19a687f 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -476,7 +476,6 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel, phv->phrels = replace_relid(phv->phrels, ojrelid, subst); Assert(!bms_is_empty(phv->phrels)); replace_varno((Node *) phv->phexpr, relid, subst); - phinfo->ph_lateral = replace_relid(phinfo->ph_lateral, relid, subst); Assert(phv->phnullingrels == NULL); /* no need to adjust */ } } @@ -2134,7 +2133,8 @@ remove_self_joins_one_group(PlannerInfo *root, Relids relids) /* there isn't any other place to eval PHV */ if (bms_is_subset(phinfo->ph_eval_at, joinrelids) || - bms_is_subset(phinfo->ph_needed, joinrelids)) + bms_is_subset(phinfo->ph_needed, joinrelids) || + bms_is_member(r, phinfo->ph_lateral)) break; } if (lc) |