61 int relid,
int ojrelid);
64 int relid,
int subst);
76 List **extra_clauses);
100 foreach(
lc,
root->join_info_list)
228 foreach(l,
root->placeholder_list)
330 int relid = rel->
relid;
356 foreach(l,
root->join_info_list)
427 foreach(l,
root->placeholder_list)
432 if (sjinfo !=
NULL &&
486 foreach(l,
root->eq_classes)
509 for (rti = 1; rti <
root->simple_rel_array_size; rti++)
610#ifdef USE_ASSERT_CHECKING
634 root->simple_rel_array[relid] =
NULL;
635 root->simple_rte_array[relid] =
NULL;
668 rinfo->clause_relids =
bms_copy(rinfo->clause_relids);
669 rinfo->clause_relids =
bms_del_member(rinfo->clause_relids, relid);
670 rinfo->clause_relids =
bms_del_member(rinfo->clause_relids, ojrelid);
682 foreach(
lc, ((
BoolExpr *) rinfo->orclause)->args)
721 int relid,
int subst)
822 elog(
ERROR,
"unrecognized joinlist node type: %d",
852 foreach(
lc,
root->join_info_list)
941 if (
ind->unique &&
ind->immediate &&
ind->indpred ==
NIL)
982 List **extra_clauses)
1004 Query *subquery =
root->simple_rte_array[relid]->subquery;
1035 if (rinfo->outer_is_left)
1052 if (!var || !
IsA(var,
Var) ||
1154 if (query->hasTargetSRFs)
1339 List **extra_clauses)
1345 bool self_join = (extra_clauses !=
NULL);
1348 if (restrictlist ==
NIL)
1398 jointype, restrictlist,
1465 List **extra_clauses)
1477 foreach(
lc, restrictlist)
1604 if (!
equal(rinfo->clause_relids,
other->clause_relids))
1638 a->rinfo_serial =
b->rinfo_serial;
1672 if (!
bms_equal(src->clause_relids, rinfo->clause_relids))
1677 (rinfo->parent_ec !=
NULL &&
1678 src->parent_ec == rinfo->parent_ec) ||
1746 rinfo->left_relids =
1748 rinfo->right_relids =
1763 if (rinfo->mergeopfamilies &&
1787 ntest->argisrow =
false;
1788 ntest->location = -1;
1790 rinfo->mergeopfamilies =
NIL;
1791 rinfo->left_em =
NULL;
1792 rinfo->right_em =
NULL;
1920 int attno =
i -
toKeep->min_attr;
2023 if (!rinfo->mergeopfamilies ||
2032 expr = (
OpExpr *) rinfo->clause;
2083 bool matched =
false;
2168 root->simple_rte_array[r]->relid);
2175 foreach(
lc,
root->join_info_list)
2197 foreach(
lc,
root->rowMarks)
2238 if (restrictlist ==
NIL)
2338 varno !=
root->parse->resultRelation &&
2339 varno !=
root->parse->mergeTargetRelation)
2352 elog(
ERROR,
"unrecognized joinlist node type: %d",
2447 return (
ca->reloid < cb->
reloid ? -1 : 1);
2512 elog(
ERROR,
"failed to find relation %d in joinlist", relid);
static int self_join_candidates_cmp(const void *a, const void *b)
static bool match_unique_clauses(PlannerInfo *root, RelOptInfo *outer, List *uclauses, Index relid)
static bool replace_relid_callback(Node *node, ChangeVarNodes_context *context)
static void split_selfjoin_quals(PlannerInfo *root, List *joinquals, List **selfjoinquals, List **otherjoinquals, int from, int to)
static void add_non_redundant_clauses(PlannerInfo *root, List *rinfo_candidates, List **keep_rinfo_list, Index removed_relid)
static void remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel, int subst, SpecialJoinInfo *sjinfo, Relids joinrelids)
bool innerrel_is_unique(PlannerInfo *root, Relids joinrelids, Relids outerrelids, RelOptInfo *innerrel, JoinType jointype, List *restrictlist, bool force_cache)
static List * remove_rel_from_joinlist(List *joinlist, int relid, int *nremoved)
static void remove_leftjoinrel_from_query(PlannerInfo *root, int relid, SpecialJoinInfo *sjinfo)
bool query_is_distinct_for(Query *query, List *colnos, List *opids)
static Relids remove_self_joins_one_group(PlannerInfo *root, Relids relids)
List * remove_useless_joins(PlannerInfo *root, List *joinlist)
static Oid distinct_col_search(int colno, List *colnos, List *opids)
static bool is_innerrel_unique_for(PlannerInfo *root, Relids joinrelids, Relids outerrelids, RelOptInfo *innerrel, JoinType jointype, List *restrictlist, List **extra_clauses)
static bool rel_is_distinct_for(PlannerInfo *root, RelOptInfo *rel, List *clause_list, List **extra_clauses)
bool innerrel_is_unique_ext(PlannerInfo *root, Relids joinrelids, Relids outerrelids, RelOptInfo *innerrel, JoinType jointype, List *restrictlist, bool force_cache, List **extra_clauses)
static void remove_rel_from_eclass(EquivalenceClass *ec, SpecialJoinInfo *sjinfo, int relid, int subst)
List * remove_useless_self_joins(PlannerInfo *root, List *joinlist)
bool query_supports_distinctness(Query *query)
static void update_eclasses(EquivalenceClass *ec, int from, int to)
static bool restrict_infos_logically_equal(RestrictInfo *a, RestrictInfo *b)
static Relids remove_self_joins_recurse(PlannerInfo *root, List *joinlist, Relids toRemove)
static bool join_is_removable(PlannerInfo *root, SpecialJoinInfo *sjinfo)
void reduce_unique_semijoins(PlannerInfo *root)
bool enable_self_join_elimination
static void remove_rel_from_restrictinfo(RestrictInfo *rinfo, int relid, int ojrelid)
static bool rel_supports_distinctness(PlannerInfo *root, RelOptInfo *rel)
static void remove_self_join_rel(PlannerInfo *root, PlanRowMark *kmark, PlanRowMark *rmark, RelOptInfo *toKeep, RelOptInfo *toRemove, List *restrictlist)
Bitmapset * bms_difference(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_make_singleton(int x)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
int bms_next_member(const Bitmapset *a, int prevbit)
Bitmapset * bms_del_members(Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_del_member(Bitmapset *a, int x)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
int bms_singleton_member(const Bitmapset *a)
void bms_free(Bitmapset *a)
int bms_num_members(const Bitmapset *a)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b)
BMS_Membership bms_membership(const Bitmapset *a)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
bool bms_get_singleton_member(const Bitmapset *a, int *member)
Bitmapset * bms_copy(const Bitmapset *a)
#define Assert(condition)
#define OidIsValid(objectId)
bool equal(const void *a, const void *b)
void rebuild_eclass_attr_needed(PlannerInfo *root)
void ec_clear_derived_clauses(EquivalenceClass *ec)
List * generate_join_implied_equalities(PlannerInfo *root, Relids join_relids, Relids outer_relids, RelOptInfo *inner_rel, SpecialJoinInfo *sjinfo)
#define palloc_array(type, count)
bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel, List *restrictlist, List **extra_clauses)
void rebuild_lateral_attr_needed(PlannerInfo *root)
void distribute_restrictinfo_to_rels(PlannerInfo *root, RestrictInfo *restrictinfo)
void rebuild_joinclause_attr_needed(PlannerInfo *root)
void remove_join_clause_from_rels(PlannerInfo *root, RestrictInfo *restrictinfo, Relids join_relids)
List * list_delete_ptr(List *list, void *datum)
List * lappend(List *list, void *datum)
List * list_concat(List *list1, const List *list2)
List * list_delete_cell(List *list, ListCell *cell)
List * list_copy(const List *oldlist)
List * lappend_int(List *list, int datum)
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
bool list_member(const List *list, const void *datum)
bool equality_ops_are_compatible(Oid opno1, Oid opno2)
void pfree(void *pointer)
static bool is_andclause(const void *clause)
static bool is_orclause(const void *clause)
static Node * get_rightop(const void *clause)
static bool is_opclause(const void *clause)
static Node * get_leftop(const void *clause)
#define IsA(nodeptr, _type_)
#define IS_OUTER_JOIN(jointype)
#define castNode(_type_, nodeptr)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
List * expand_grouping_sets(List *groupingSets, bool groupDistinct, int limit)
#define RINFO_IS_PUSHED_DOWN(rinfo, joinrelids)
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define forboth(cell1, list1, cell2, list2)
#define foreach_delete_current(lst, var_or_cell)
static void * list_nth(const List *list, int n)
#define foreach_node(type, var, lst)
static ListCell * list_head(const List *l)
static ListCell * lnext(const List *l, const ListCell *c)
void rebuild_placeholder_attr_needed(PlannerInfo *root)
#define qsort(a, b, c, d)
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
bool restriction_is_or_clause(RestrictInfo *restrictinfo)
static bool clause_sides_match_join(RestrictInfo *rinfo, Relids outerrelids, Relids innerrelids)
bool ChangeVarNodesWalkExpression(Node *node, ChangeVarNodes_context *context)
Relids adjust_relid_set(Relids relids, int oldrelid, int newrelid)
void ChangeVarNodesExtended(Node *node, int rt_index, int new_index, int sublevels_up, ChangeVarNodes_callback callback)
List * non_unique_for_rels
Relids incompatible_relids
TargetEntry * get_sortgroupclause_tle(SortGroupClause *sgClause, List *targetList)
Relids pull_varnos(PlannerInfo *root, Node *node)