From 55667635034e5844b73b065928683d01bb874d40 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Thu, 2 May 2024 23:20:36 +0300 Subject: [PATCH v2 2/4] Minor refactoring for self-join elimination code This commit makes some minor miscellaneous refactoring for the self-join elimination code including: * Empty lines for better code readability, * Rearrangement of local variables in remove_self_joins_recurse() for the sake of brevity and clarity, * Remove redundant check for not null RangeTblEntry pointer, which has been dereferenced before. Discussion: https://postgr.es/m/CAMbWs49Q8g1LPVCeNHYv-Y-gFo826ertrg6nYNC9LL%3D8%3DzHP3g%40mail.gmail.com Author: Richard Guo Reviewed-by: Alexander Korotkov --- src/backend/optimizer/plan/analyzejoins.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index b2a633ba4d7..a46c3ffaa5a 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -457,15 +457,20 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel, phinfo->ph_eval_at = replace_relid(phinfo->ph_eval_at, relid, subst); phinfo->ph_eval_at = replace_relid(phinfo->ph_eval_at, ojrelid, subst); Assert(!bms_is_empty(phinfo->ph_eval_at)); /* checked previously */ + phinfo->ph_needed = replace_relid(phinfo->ph_needed, relid, subst); phinfo->ph_needed = replace_relid(phinfo->ph_needed, ojrelid, subst); /* ph_needed might or might not become empty */ + phinfo->ph_lateral = replace_relid(phinfo->ph_lateral, relid, subst); /* ph_lateral might or might not be empty */ + phv->phrels = replace_relid(phv->phrels, relid, subst); phv->phrels = replace_relid(phv->phrels, ojrelid, subst); Assert(!bms_is_empty(phv->phrels)); + replace_varno((Node *) phv->phexpr, relid, subst); + Assert(phv->phnullingrels == NULL); /* no need to adjust */ } } @@ -2292,25 +2297,26 @@ remove_self_joins_recurse(PlannerInfo *root, List *joinlist, Relids toRemove) if (IsA(jlnode, RangeTblRef)) { - RangeTblRef *ref = (RangeTblRef *) jlnode; - RangeTblEntry *rte = root->simple_rte_array[ref->rtindex]; + int varno = ((RangeTblRef *) jlnode)->rtindex; + RangeTblEntry *rte = root->simple_rte_array[varno]; /* * We only care about base relations from which we select * something. */ if (rte->rtekind == RTE_RELATION && - rte->relkind == RELKIND_RELATION && - root->simple_rel_array[ref->rtindex] != NULL) + rte->relkind == RELKIND_RELATION) { - Assert(!bms_is_member(ref->rtindex, relids)); - relids = bms_add_member(relids, ref->rtindex); + Assert(!bms_is_member(varno, relids)); + relids = bms_add_member(relids, varno); } } else if (IsA(jlnode, List)) + { /* Recursively go inside the sub-joinlist */ toRemove = remove_self_joins_recurse(root, (List *) jlnode, toRemove); + } else elog(ERROR, "unrecognized joinlist node type: %d", (int) nodeTag(jlnode)); -- 2.39.3 (Apple Git-145)