v17-0004-Move-EquivalenceMember-indexes-from-RelOptInfo-t.patch
application/octet-stream
Filename: v17-0004-Move-EquivalenceMember-indexes-from-RelOptInfo-t.patch
Type: application/octet-stream
Part: 3
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 v17-0004
Subject: Move EquivalenceMember indexes from RelOptInfo to RangeTblEntry
| File | + | − |
|---|---|---|
| src/backend/nodes/outfuncs.c | 3 | 0 |
| src/backend/nodes/readfuncs.c | 3 | 0 |
| src/backend/optimizer/path/equivclass.c | 27 | 27 |
| src/backend/optimizer/path/indxpath.c | 1 | 1 |
| src/backend/optimizer/prep/prepunion.c | 6 | 6 |
| src/backend/optimizer/util/inherit.c | 2 | 1 |
| src/backend/optimizer/util/relnode.c | 0 | 9 |
| src/include/nodes/parsenodes.h | 17 | 0 |
| src/include/nodes/pathnodes.h | 0 | 17 |
From ac89a73ff9e783471e35d9be6059ea303e667697 Mon Sep 17 00:00:00 2001
From: Yuya Watari <watari.yuya@gmail.com>
Date: Fri, 17 Feb 2023 16:56:38 +0900
Subject: [PATCH v17 4/4] Move EquivalenceMember indexes from RelOptInfo to
RangeTblEntry
---
src/backend/nodes/outfuncs.c | 3 ++
src/backend/nodes/readfuncs.c | 3 ++
src/backend/optimizer/path/equivclass.c | 54 ++++++++++++-------------
src/backend/optimizer/path/indxpath.c | 2 +-
src/backend/optimizer/prep/prepunion.c | 12 +++---
src/backend/optimizer/util/inherit.c | 3 +-
src/backend/optimizer/util/relnode.c | 9 -----
src/include/nodes/parsenodes.h | 17 ++++++++
src/include/nodes/pathnodes.h | 17 --------
9 files changed, 59 insertions(+), 61 deletions(-)
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 416c972b4e..7e1ef5995c 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -569,6 +569,9 @@ _outRangeTblEntry(StringInfo str, const RangeTblEntry *node)
WRITE_BOOL_FIELD(inh);
WRITE_BOOL_FIELD(inFromCl);
WRITE_NODE_FIELD(securityQuals);
+ WRITE_BITMAPSET_FIELD(eclass_member_indexes);
+ WRITE_BITMAPSET_FIELD(eclass_source_indexes);
+ WRITE_BITMAPSET_FIELD(eclass_derive_indexes);
}
static void
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index f3629cdfd1..0befbbe222 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -543,6 +543,9 @@ _readRangeTblEntry(void)
READ_BOOL_FIELD(inh);
READ_BOOL_FIELD(inFromCl);
READ_NODE_FIELD(securityQuals);
+ READ_BITMAPSET_FIELD(eclass_member_indexes);
+ READ_BITMAPSET_FIELD(eclass_source_indexes);
+ READ_BITMAPSET_FIELD(eclass_derive_indexes);
READ_DONE();
}
diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c
index f8bd400c42..329b206e1e 100644
--- a/src/backend/optimizer/path/equivclass.c
+++ b/src/backend/optimizer/path/equivclass.c
@@ -546,9 +546,9 @@ add_eq_source(PlannerInfo *root, EquivalenceClass *ec, RestrictInfo *rinfo)
i = -1;
while ((i = bms_next_member(rinfo->clause_relids, i)) >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
- rel->eclass_source_indexes = bms_add_member(rel->eclass_source_indexes,
+ rte->eclass_source_indexes = bms_add_member(rte->eclass_source_indexes,
source_idx);
}
}
@@ -568,9 +568,9 @@ add_eq_derive(PlannerInfo *root, EquivalenceClass *ec, RestrictInfo *rinfo)
i = -1;
while ((i = bms_next_member(rinfo->clause_relids, i)) >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
- rel->eclass_derive_indexes = bms_add_member(rel->eclass_derive_indexes,
+ rte->eclass_derive_indexes = bms_add_member(rte->eclass_derive_indexes,
derive_idx);
}
}
@@ -650,9 +650,9 @@ add_eq_member(PlannerInfo *root, EquivalenceClass *ec, Expr *expr, Relids relids
i = -1;
while ((i = bms_next_member(expr_relids, i)) >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
- rel->eclass_member_indexes = bms_add_member(rel->eclass_member_indexes, em_index);
+ rte->eclass_member_indexes = bms_add_member(rte->eclass_member_indexes, em_index);
}
return em;
@@ -2527,9 +2527,9 @@ reconsider_full_join_clause(PlannerInfo *root, OuterJoinClauseInfo *ojcinfo)
i = -1;
while ((i = bms_next_member(coal_em->em_relids, i)) >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
- rel->eclass_member_indexes = bms_del_member(rel->eclass_member_indexes,
+ rte->eclass_member_indexes = bms_del_member(rte->eclass_member_indexes,
coal_idx);
}
@@ -3466,9 +3466,9 @@ get_ecmember_indexes(PlannerInfo *root, EquivalenceClass *ec, Relids relids,
while ((i = bms_next_member(relids, i)) >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
- rel_ems = bms_add_members(rel_ems, rel->eclass_member_indexes);
+ rel_ems = bms_add_members(rel_ems, rte->eclass_member_indexes);
}
#ifdef USE_ASSERT_CHECKING
@@ -3514,7 +3514,7 @@ get_ecmember_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
if (i >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
/*
* bms_intersect to the first relation to try to keep the resulting
@@ -3523,17 +3523,17 @@ get_ecmember_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
* more words than the other.
*/
if (!with_children)
- matching_ems = bms_intersect(rel->eclass_member_indexes,
+ matching_ems = bms_intersect(rte->eclass_member_indexes,
ec->ec_nonchild_indexes);
else
- matching_ems = bms_intersect(rel->eclass_member_indexes,
+ matching_ems = bms_intersect(rte->eclass_member_indexes,
ec->ec_member_indexes);
while ((i = bms_next_member(relids, i)) >= 0)
{
- rel = root->simple_rel_array[i];
+ rte = root->simple_rte_array[i];
matching_ems = bms_int_members(matching_ems,
- rel->eclass_member_indexes);
+ rte->eclass_member_indexes);
}
}
@@ -3878,9 +3878,9 @@ get_ec_source_indexes(PlannerInfo *root, EquivalenceClass *ec, Relids relids)
while ((i = bms_next_member(relids, i)) >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
- rel_esis = bms_add_members(rel_esis, rel->eclass_source_indexes);
+ rel_esis = bms_add_members(rel_esis, rte->eclass_source_indexes);
}
#ifdef USE_ASSERT_CHECKING
@@ -3916,7 +3916,7 @@ get_ec_source_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
if (i >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
/*
* bms_intersect to the first relation to try to keep the resulting
@@ -3925,12 +3925,12 @@ get_ec_source_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
* more words than the other.
*/
esis = bms_intersect(ec->ec_source_indexes,
- rel->eclass_source_indexes);
+ rte->eclass_source_indexes);
while ((i = bms_next_member(relids, i)) >= 0)
{
- rel = root->simple_rel_array[i];
- esis = bms_int_members(esis, rel->eclass_source_indexes);
+ rte = root->simple_rte_array[i];
+ esis = bms_int_members(esis, rte->eclass_source_indexes);
}
}
@@ -3967,9 +3967,9 @@ get_ec_derive_indexes(PlannerInfo *root, EquivalenceClass *ec, Relids relids)
while ((i = bms_next_member(relids, i)) >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
- rel_edis = bms_add_members(rel_edis, rel->eclass_derive_indexes);
+ rel_edis = bms_add_members(rel_edis, rte->eclass_derive_indexes);
}
#ifdef USE_ASSERT_CHECKING
@@ -4005,7 +4005,7 @@ get_ec_derive_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
if (i >= 0)
{
- RelOptInfo *rel = root->simple_rel_array[i];
+ RangeTblEntry *rte = root->simple_rte_array[i];
/*
* bms_intersect to the first relation to try to keep the resulting
@@ -4014,12 +4014,12 @@ get_ec_derive_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
* more words than the other.
*/
edis = bms_intersect(ec->ec_derive_indexes,
- rel->eclass_derive_indexes);
+ rte->eclass_derive_indexes);
while ((i = bms_next_member(relids, i)) >= 0)
{
- rel = root->simple_rel_array[i];
- edis = bms_int_members(edis, rel->eclass_derive_indexes);
+ rte = root->simple_rte_array[i];
+ edis = bms_int_members(edis, rte->eclass_derive_indexes);
}
}
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 5ebf944cb1..63343085f3 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -3111,7 +3111,7 @@ match_pathkeys_to_index(PlannerInfo *root, IndexOptInfo *index,
* here. See also get_eclass_for_sort_expr.)
*/
matching_ems = bms_intersect(pathkey->pk_eclass->ec_member_indexes,
- index->rel->eclass_member_indexes);
+ root->simple_rte_array[index->rel->relid]->eclass_member_indexes);
i = -1;
while ((i = bms_next_member(matching_ems, i)) >= 0)
diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index 4c7d66311f..8eb054f8ed 100644
--- a/src/backend/optimizer/prep/prepunion.c
+++ b/src/backend/optimizer/prep/prepunion.c
@@ -185,7 +185,7 @@ plan_set_operations(PlannerInfo *root)
/*
* setup_append_rel_entry
- * Add entry into root's simple_rel_array at element 0. This is required
+ * Add entry into root's simple_rte_array at element 0. This is required
* because generate_append_tlist() makes Vars with varno=0. In
* add_eq_member() we need to index EquivalenceMembers belonging to this
* relation.
@@ -193,14 +193,14 @@ plan_set_operations(PlannerInfo *root)
static void
setup_append_rel_entry(PlannerInfo *root)
{
- RelOptInfo *rel = makeNode(RelOptInfo);
+ RangeTblEntry *rte = makeNode(RangeTblEntry);
- memset(rel, 0, sizeof(RelOptInfo));
- rel->eclass_member_indexes = NULL;
+ memset(rte, 0, sizeof(RangeTblEntry));
+ rte->eclass_member_indexes = NULL;
/* make sure nothing else has made use of this element */
- Assert(root->simple_rel_array[0] == NULL);
- root->simple_rel_array[0] = rel;
+ Assert(root->simple_rte_array[0] == NULL);
+ root->simple_rte_array[0] = rte;
}
/*
diff --git a/src/backend/optimizer/util/inherit.c b/src/backend/optimizer/util/inherit.c
index bae9688e46..3d6345b2cd 100644
--- a/src/backend/optimizer/util/inherit.c
+++ b/src/backend/optimizer/util/inherit.c
@@ -480,7 +480,8 @@ expand_single_inheritance_child(PlannerInfo *root, RangeTblEntry *parentrte,
* below, so a "flat" copy is sufficient to start with.
*/
childrte = makeNode(RangeTblEntry);
- memcpy(childrte, parentrte, sizeof(RangeTblEntry));
+ /* TODO: Usage of offsetof */
+ memcpy(childrte, parentrte, offsetof(RangeTblEntry, eclass_member_indexes));
Assert(parentrte->rtekind == RTE_RELATION); /* else this is dubious */
childrte->relid = childOID;
childrte->relkind = childrel->rd_rel->relkind;
diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c
index 77ab4990e7..a70a16238a 100644
--- a/src/backend/optimizer/util/relnode.c
+++ b/src/backend/optimizer/util/relnode.c
@@ -226,9 +226,6 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptInfo *parent)
rel->tuples = 0;
rel->allvisfrac = 0;
rel->eclass_indexes = NULL;
- rel->eclass_member_indexes = NULL;
- rel->eclass_source_indexes = NULL;
- rel->eclass_derive_indexes = NULL;
rel->subroot = NULL;
rel->subplan_params = NIL;
rel->rel_parallel_workers = -1; /* set up in get_relation_info */
@@ -704,9 +701,6 @@ build_join_rel(PlannerInfo *root,
joinrel->tuples = 0;
joinrel->allvisfrac = 0;
joinrel->eclass_indexes = NULL;
- joinrel->eclass_member_indexes = NULL;
- joinrel->eclass_source_indexes = NULL;
- joinrel->eclass_derive_indexes = NULL;
joinrel->subroot = NULL;
joinrel->subplan_params = NIL;
joinrel->rel_parallel_workers = -1;
@@ -896,9 +890,6 @@ build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel,
joinrel->tuples = 0;
joinrel->allvisfrac = 0;
joinrel->eclass_indexes = NULL;
- joinrel->eclass_member_indexes = NULL;
- joinrel->eclass_source_indexes = NULL;
- joinrel->eclass_derive_indexes = NULL;
joinrel->subroot = NULL;
joinrel->subplan_params = NIL;
joinrel->amflags = 0;
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index f7d7f10f7d..94a3dd6ae1 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -1202,6 +1202,23 @@ typedef struct RangeTblEntry
bool inh; /* inheritance requested? */
bool inFromCl; /* present in FROM clause? */
List *securityQuals; /* security barrier quals to apply, if any */
+
+ /*
+ * Indexes in PlannerInfo's eq_members list of EMs that mention this rel
+ */
+ Bitmapset *eclass_member_indexes;
+
+ /*
+ * Indexes in PlannerInfo's eq_sources list for RestrictInfos that mention
+ * this relation.
+ */
+ Bitmapset *eclass_source_indexes;
+
+ /*
+ * Indexes in PlannerInfo's eq_derives list for RestrictInfos that mention
+ * this relation.
+ */
+ Bitmapset *eclass_derive_indexes;
} RangeTblEntry;
/*
diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h
index 40c86e6c4b..1668a06368 100644
--- a/src/include/nodes/pathnodes.h
+++ b/src/include/nodes/pathnodes.h
@@ -945,23 +945,6 @@ typedef struct RelOptInfo
/* indexes in PlannerInfo's eq_classes list of ECs that mention this rel */
Bitmapset *eclass_indexes;
- /*
- * Indexes in PlannerInfo's eq_members list of EMs that mention this rel
- */
- Bitmapset *eclass_member_indexes;
-
- /*
- * Indexes in PlannerInfo's eq_sources list for RestrictInfos that mention
- * this relation.
- */
- Bitmapset *eclass_source_indexes;
-
- /*
- * Indexes in PlannerInfo's eq_derives list for RestrictInfos that mention
- * this relation.
- */
- Bitmapset *eclass_derive_indexes;
-
PlannerInfo *subroot; /* if subquery */
List *subplan_params; /* if subquery */
/* wanted number of parallel workers */
--
2.35.3.windows.1