v2-0002-Minor-refactoring-for-self-join-elimination-code.patch
application/octet-stream
Filename: v2-0002-Minor-refactoring-for-self-join-elimination-code.patch
Type: application/octet-stream
Part: 0
Message:
Re: Removing unneeded self joins
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v2-0002
Subject: Minor refactoring for self-join elimination code
| File | + | − |
|---|---|---|
| src/backend/optimizer/plan/analyzejoins.c | 12 | 6 |
From 55667635034e5844b73b065928683d01bb874d40 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
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)