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