40 int relid,
int ojrelid);
42 int relid,
int ojrelid);
74 foreach(lc,
root->join_info_list)
97 elog(
ERROR,
"failed to find relation %d in joinlist", innerrelid);
155 if (innerrelid ==
root->parse->resultRelation)
189 if (!
bms_is_subset(innerrel->attr_needed[attroff], inputrelids))
202 foreach(l,
root->placeholder_list)
259 if (!restrictinfo->can_join ||
260 restrictinfo->mergeopfamilies ==
NIL)
272 clause_list =
lappend(clause_list, restrictinfo);
330 foreach(l,
root->join_info_list)
374 foreach(l,
root->placeholder_list)
385 root->placeholder_array[phinfo->
phid] = NULL;
422 join_plus_commute =
bms_union(joinrelids,
433 foreach(l, joininfos)
454#ifdef USE_ASSERT_CHECKING
471 foreach(l,
root->eq_classes)
490 root->simple_rel_array[relid] = NULL;
509 for (rti = 1; rti <
root->simple_rel_array_size; rti++)
515 if (otherrel == NULL)
527 otherrel->attr_needed[attroff] = NULL;
559 rinfo->clause_relids =
bms_copy(rinfo->clause_relids);
560 rinfo->clause_relids =
bms_del_member(rinfo->clause_relids, relid);
561 rinfo->clause_relids =
bms_del_member(rinfo->clause_relids, ojrelid);
573 foreach(lc, ((
BoolExpr *) rinfo->orclause)->args)
583 foreach(lc2, andargs)
669 foreach(jl, joinlist)
680 result =
lappend(result, jlnode);
691 result =
lappend(result, sublist);
695 elog(
ERROR,
"unrecognized joinlist node type: %d",
725 foreach(lc,
root->join_info_list)
814 if (
ind->unique &&
ind->immediate &&
ind->indpred ==
NIL)
871 Query *subquery =
root->simple_rte_array[relid]->subquery;
885 foreach(l, clause_list)
902 if (rinfo->outer_is_left)
919 if (!var || !
IsA(var,
Var) ||
1020 if (query->hasTargetSRFs)
1101 lg =
lnext(topop->groupClauses, lg);
1137 forboth(lc1, colnos, lc2, opids)
1184 if (restrictlist ==
NIL)
1223 jointype, restrictlist))
1261 if (force_cache ||
root->join_search_private)
1297 foreach(lc, restrictlist)
1310 if (!restrictinfo->can_join ||
1311 restrictinfo->mergeopfamilies ==
NIL)
1323 clause_list =
lappend(clause_list, restrictinfo);
static void remove_rel_from_query(PlannerInfo *root, int relid, SpecialJoinInfo *sjinfo)
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)
bool query_is_distinct_for(Query *query, List *colnos, List *opids)
List * remove_useless_joins(PlannerInfo *root, List *joinlist)
static Oid distinct_col_search(int colno, List *colnos, List *opids)
bool query_supports_distinctness(Query *query)
static bool rel_is_distinct_for(PlannerInfo *root, RelOptInfo *rel, List *clause_list)
static bool join_is_removable(PlannerInfo *root, SpecialJoinInfo *sjinfo)
void reduce_unique_semijoins(PlannerInfo *root)
static bool is_innerrel_unique_for(PlannerInfo *root, Relids joinrelids, Relids outerrelids, RelOptInfo *innerrel, JoinType jointype, List *restrictlist)
static void remove_rel_from_restrictinfo(RestrictInfo *rinfo, int relid, int ojrelid)
static bool rel_supports_distinctness(PlannerInfo *root, RelOptInfo *rel)
static void remove_rel_from_eclass(EquivalenceClass *ec, int relid, int ojrelid)
Bitmapset * bms_make_singleton(int x)
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)
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)
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)
void rebuild_eclass_attr_needed(PlannerInfo *root)
List * generate_join_implied_equalities(PlannerInfo *root, Relids join_relids, Relids outer_relids, RelOptInfo *inner_rel, SpecialJoinInfo *sjinfo)
bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel, List *restrictlist, List *exprlist, List *oprlist)
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 * 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)
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 Node * get_leftop(const void *clause)
#define IsA(nodeptr, _type_)
#define IS_OUTER_JOIN(jointype)
#define castNode(_type_, nodeptr)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#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 ListCell * list_head(const List *l)
static ListCell * lnext(const List *l, const ListCell *c)
void rebuild_placeholder_attr_needed(PlannerInfo *root)
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)
List * non_unique_for_rels
TargetEntry * get_sortgroupclause_tle(SortGroupClause *sgClause, List *targetList)
Relids pull_varnos(PlannerInfo *root, Node *node)