poc-alias-reloptinfo.txt
text/plain
Filename: poc-alias-reloptinfo.txt
Type: text/plain
Part: 0
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 1904a53acb..241be97920 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -569,8 +569,6 @@ _outRangeTblEntry(StringInfo str, const RangeTblEntry *node)
WRITE_BOOL_FIELD(inh);
WRITE_BOOL_FIELD(inFromCl);
WRITE_NODE_FIELD(securityQuals);
- WRITE_BITMAPSET_FIELD(eclass_source_indexes);
- WRITE_BITMAPSET_FIELD(eclass_derive_indexes);
}
static void
diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c
index 314736d989..813eda3e73 100644
--- a/src/backend/nodes/read.c
+++ b/src/backend/nodes/read.c
@@ -514,23 +514,3 @@ nodeRead(const char *token, int tok_len)
return (void *) result;
}
-
-/*
- * pg_strtok_save_context -
- * Save context initialized by stringToNode.
- */
-void
-pg_strtok_save_context(const char **pcontext)
-{
- *pcontext = pg_strtok_ptr;
-}
-
-/*
- * pg_strtok_restore_context -
- * Resore saved context.
- */
-void
-pg_strtok_restore_context(const char *context)
-{
- pg_strtok_ptr = context;
-}
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 0915c0e661..cc2021c1f7 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -191,26 +191,6 @@ nullable_string(const char *token, int length)
return debackslash(token, length);
}
-/* Read an equivalence field (anything written as ":fldname %u") and check it */
-#define READ_EQ_BITMAPSET_FIELD_CHECK(fldname) \
-{ \
- int save_length = length; \
- const char *context; \
- pg_strtok_save_context(&context); \
- token = pg_strtok(&length); \
- if (length > 0 && strncmp(token, ":"#fldname, strlen(":"#fldname))) \
- { \
- /* "fldname" field was not found - fill it and restore context. */ \
- local_node->fldname = NULL; \
- pg_strtok_restore_context(context); \
- length = save_length; \
- } \
- else \
- { \
- local_node->fldname = _readBitmapset(); \
- } \
-}
-
/*
* _readBitmapset
@@ -594,8 +574,6 @@ _readRangeTblEntry(void)
READ_BOOL_FIELD(inh);
READ_BOOL_FIELD(inFromCl);
READ_NODE_FIELD(securityQuals);
- READ_EQ_BITMAPSET_FIELD_CHECK(eclass_source_indexes);
- READ_EQ_BITMAPSET_FIELD_CHECK(eclass_derive_indexes);
READ_DONE();
}
diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c
index 813a365e63..7e0a0c45f1 100644
--- a/src/backend/optimizer/path/equivclass.c
+++ b/src/backend/optimizer/path/equivclass.c
@@ -627,9 +627,19 @@ add_eq_source(PlannerInfo *root, EquivalenceClass *ec, RestrictInfo *rinfo)
i = -1;
while ((i = bms_next_member(rinfo->clause_relids, i)) >= 0)
{
- RangeTblEntry *rte = root->simple_rte_array[i];
+ RelOptInfo *rel = root->simple_rel_array[i];
- rte->eclass_source_indexes = bms_add_member(rte->eclass_source_indexes,
+ /*
+ * If the corresponding RelOptInfo does not exist, we create a 'dummy'
+ * RelOptInfo for storing EquivalenceClass indexes.
+ */
+ if (rel == NULL)
+ {
+ rel = root->simple_rel_array[i] = makeNode(RelOptInfo);
+ rel->eclass_source_indexes = NULL;
+ rel->eclass_derive_indexes = NULL;
+ }
+ rel->eclass_source_indexes = bms_add_member(rel->eclass_source_indexes,
source_idx);
}
}
@@ -649,9 +659,19 @@ add_eq_derive(PlannerInfo *root, EquivalenceClass *ec, RestrictInfo *rinfo)
i = -1;
while ((i = bms_next_member(rinfo->clause_relids, i)) >= 0)
{
- RangeTblEntry *rte = root->simple_rte_array[i];
+ RelOptInfo *rel = root->simple_rel_array[i];
- rte->eclass_derive_indexes = bms_add_member(rte->eclass_derive_indexes,
+ /*
+ * If the corresponding RelOptInfo does not exist, we create a 'dummy'
+ * RelOptInfo for storing EquivalenceClass indexes.
+ */
+ if (rel == NULL)
+ {
+ rel = root->simple_rel_array[i] = makeNode(RelOptInfo);
+ rel->eclass_source_indexes = NULL;
+ rel->eclass_derive_indexes = NULL;
+ }
+ rel->eclass_derive_indexes = bms_add_member(rel->eclass_derive_indexes,
derive_idx);
}
}
@@ -3667,9 +3687,9 @@ get_ec_source_indexes(PlannerInfo *root, EquivalenceClass *ec, Relids relids)
while ((i = bms_next_member(relids, i)) >= 0)
{
- RangeTblEntry *rte = root->simple_rte_array[i];
+ RelOptInfo *rel = root->simple_rel_array[i];
- rel_esis = bms_add_members(rel_esis, rte->eclass_source_indexes);
+ rel_esis = bms_add_members(rel_esis, rel->eclass_source_indexes);
}
#ifdef USE_ASSERT_CHECKING
@@ -3705,7 +3725,7 @@ get_ec_source_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
if (i >= 0)
{
- RangeTblEntry *rte = root->simple_rte_array[i];
+ RelOptInfo *rel = root->simple_rel_array[i];
/*
* bms_intersect to the first relation to try to keep the resulting
@@ -3714,12 +3734,12 @@ get_ec_source_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
* more words than the other.
*/
esis = bms_intersect(ec->ec_source_indexes,
- rte->eclass_source_indexes);
+ rel->eclass_source_indexes);
while ((i = bms_next_member(relids, i)) >= 0)
{
- rte = root->simple_rte_array[i];
- esis = bms_int_members(esis, rte->eclass_source_indexes);
+ rel = root->simple_rel_array[i];
+ esis = bms_int_members(esis, rel->eclass_source_indexes);
}
}
@@ -3756,9 +3776,9 @@ get_ec_derive_indexes(PlannerInfo *root, EquivalenceClass *ec, Relids relids)
while ((i = bms_next_member(relids, i)) >= 0)
{
- RangeTblEntry *rte = root->simple_rte_array[i];
+ RelOptInfo *rel = root->simple_rel_array[i];
- rel_edis = bms_add_members(rel_edis, rte->eclass_derive_indexes);
+ rel_edis = bms_add_members(rel_edis, rel->eclass_derive_indexes);
}
#ifdef USE_ASSERT_CHECKING
@@ -3794,7 +3814,7 @@ get_ec_derive_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
if (i >= 0)
{
- RangeTblEntry *rte = root->simple_rte_array[i];
+ RelOptInfo *rel = root->simple_rel_array[i];
/*
* bms_intersect to the first relation to try to keep the resulting
@@ -3803,12 +3823,12 @@ get_ec_derive_indexes_strict(PlannerInfo *root, EquivalenceClass *ec,
* more words than the other.
*/
edis = bms_intersect(ec->ec_derive_indexes,
- rte->eclass_derive_indexes);
+ rel->eclass_derive_indexes);
while ((i = bms_next_member(relids, i)) >= 0)
{
- rte = root->simple_rte_array[i];
- edis = bms_int_members(edis, rte->eclass_derive_indexes);
+ rel = root->simple_rel_array[i];
+ edis = bms_int_members(edis, rel->eclass_derive_indexes);
}
}
diff --git a/src/backend/optimizer/util/inherit.c b/src/backend/optimizer/util/inherit.c
index b75e92b2e1..d826f072c7 100644
--- a/src/backend/optimizer/util/inherit.c
+++ b/src/backend/optimizer/util/inherit.c
@@ -483,13 +483,6 @@ expand_single_inheritance_child(PlannerInfo *root, RangeTblEntry *parentrte,
*/
childrte = makeNode(RangeTblEntry);
memcpy(childrte, parentrte, sizeof(RangeTblEntry));
- /*
- * We do not want to inherit the EquivalenceMember indexes of the parent
- * to its child
- */
- childrte->eclass_source_indexes = NULL;
- childrte->eclass_derive_indexes = NULL;
-
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 698ddfd67c..d3bd24bbb3 100644
--- a/src/backend/optimizer/util/relnode.c
+++ b/src/backend/optimizer/util/relnode.c
@@ -264,6 +264,8 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptInfo *parent)
rel->tuples = 0;
rel->allvisfrac = 0;
rel->eclass_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 */
@@ -757,6 +759,8 @@ build_join_rel(PlannerInfo *root,
joinrel->tuples = 0;
joinrel->allvisfrac = 0;
joinrel->eclass_indexes = NULL;
+ joinrel->eclass_source_indexes = NULL;
+ joinrel->eclass_derive_indexes = NULL;
joinrel->subroot = NULL;
joinrel->subplan_params = NIL;
joinrel->rel_parallel_workers = -1;
@@ -955,6 +959,8 @@ build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel,
joinrel->tuples = 0;
joinrel->allvisfrac = 0;
joinrel->eclass_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 475a65475e..e494309da8 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -1194,12 +1194,6 @@ typedef struct RangeTblEntry
bool inh; /* inheritance requested? */
bool inFromCl; /* present in FROM clause? */
List *securityQuals; /* security barrier quals to apply, if any */
- Bitmapset *eclass_source_indexes; /* Indexes in PlannerInfo's eq_sources
- * list for RestrictInfos that mention
- * this relation */
- Bitmapset *eclass_derive_indexes; /* Indexes in PlannerInfo's eq_derives
- * list for RestrictInfos that mention
- * this relation */
} RangeTblEntry;
/*
diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h
index 7c94ece332..5571585355 100644
--- a/src/include/nodes/pathnodes.h
+++ b/src/include/nodes/pathnodes.h
@@ -943,6 +943,19 @@ typedef struct RelOptInfo
double allvisfrac;
/* indexes in PlannerInfo's eq_classes list of ECs that mention this rel */
Bitmapset *eclass_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 */
diff --git a/src/include/nodes/readfuncs.h b/src/include/nodes/readfuncs.h
index 2fa68e59cd..cba6f0be75 100644
--- a/src/include/nodes/readfuncs.h
+++ b/src/include/nodes/readfuncs.h
@@ -29,8 +29,6 @@ extern PGDLLIMPORT bool restore_location_fields;
extern const char *pg_strtok(int *length);
extern char *debackslash(const char *token, int length);
extern void *nodeRead(const char *token, int tok_len);
-extern void pg_strtok_save_context(const char **pcontext);
-extern void pg_strtok_restore_context(const char *context);
/*
* prototypes for functions in readfuncs.c