54 Relids nominal_join_relids,
56 Relids nominal_inner_relids,
59 Oid lefttype,
Oid righttype);
140 Assert(restrictinfo->left_ec == NULL);
141 Assert(restrictinfo->right_ec == NULL);
149 opno = ((
OpExpr *) clause)->opno;
150 collation = ((
OpExpr *) clause)->inputcollid;
153 item1_relids = restrictinfo->left_relids;
154 item2_relids = restrictinfo->right_relids;
173 if (
equal(item1, item2))
192 ntest->argisrow =
false;
201 restrictinfo->pseudoconstant,
220 opfamilies = restrictinfo->mergeopfamilies;
243 foreach(lc1,
root->eq_classes)
319 restrictinfo->left_ec = ec1;
320 restrictinfo->right_ec = ec1;
322 restrictinfo->left_em = em1;
323 restrictinfo->right_em = em2;
333 if (
root->ec_merging_done)
334 elog(
ERROR,
"too late to merge equivalence classes");
366 restrictinfo->left_ec = ec1;
367 restrictinfo->right_ec = ec1;
369 restrictinfo->left_em = em1;
370 restrictinfo->right_em = em2;
376 jdomain, NULL, item2_type);
383 restrictinfo->left_ec = ec1;
384 restrictinfo->right_ec = ec1;
386 restrictinfo->left_em = em1;
387 restrictinfo->right_em = em2;
393 jdomain, NULL, item1_type);
400 restrictinfo->left_ec = ec2;
401 restrictinfo->right_ec = ec2;
403 restrictinfo->left_em = em1;
404 restrictinfo->right_em = em2;
425 jdomain, NULL, item1_type);
427 jdomain, NULL, item2_type);
432 restrictinfo->left_ec = ec;
433 restrictinfo->right_ec = ec;
435 restrictinfo->left_em = em1;
436 restrictinfo->right_em = em2;
479 if (IsPolymorphicType(req_type) || req_type == RECORDOID)
480 req_type = expr_type;
485 if (expr_type != req_type ||
495 if (expr_type != req_type)
505 req_type, req_typmod, req_collation,
527 em->em_parent = parent;
616 foreach(lc1,
root->eq_classes)
626 (sortref == 0 || sortref != cur_ec->
ec_sortref))
685 elog(
ERROR,
"volatile EquivalenceClass has no sortref");
693 jdomain, NULL, opcintype);
719 if (
root->ec_merging_done)
729 if (
i ==
root->group_rtindex)
799 if (
equal(emexpr, expr))
841 bool require_parallel_safe)
898 if (require_parallel_safe &&
938 foreach(lc, target->
exprs)
959 if (require_parallel_safe &&
970 require_parallel_safe);
1045 root->ec_merging_done =
true;
1048 foreach(lc,
root->eq_classes)
1051 bool can_generate_joinclause =
false;
1074 can_generate_joinclause =
1091 if (
i ==
root->group_rtindex)
1105 if (can_generate_joinclause)
1156 Assert(const_em != NULL);
1166 if (cur_em == const_em)
1197 if (rinfo && rinfo->mergeopfamilies)
1200 rinfo->left_ec = rinfo->right_ec = ec;
1201 rinfo->left_em = cur_em;
1202 rinfo->right_em = const_em;
1237 Assert(relid < root->simple_rel_array_size);
1239 if (prev_ems[relid] != NULL)
1273 if (rinfo && rinfo->mergeopfamilies)
1276 rinfo->left_ec = rinfo->right_ec = ec;
1277 rinfo->left_em = prev_em;
1278 rinfo->right_em = cur_em;
1281 prev_ems[relid] = cur_em;
1394 Relids nominal_inner_relids;
1395 Relids nominal_join_relids;
1407 nominal_join_relids =
bms_union(outer_relids, nominal_inner_relids);
1409 nominal_join_relids,
1415 nominal_inner_relids = inner_relids;
1416 nominal_join_relids = join_relids;
1432 if (sjinfo && sjinfo->
ojrelid != 0)
1466 nominal_join_relids,
1468 nominal_inner_relids,
1494 Relids nominal_inner_relids;
1495 Relids nominal_join_relids;
1506 nominal_join_relids =
bms_union(outer_relids, nominal_inner_relids);
1510 nominal_inner_relids = inner_relids;
1511 nominal_join_relids = join_relids;
1514 foreach(lc, eclasses)
1542 nominal_join_relids,
1544 nominal_inner_relids,
1591 outer_members =
lappend(outer_members, cur_em);
1593 inner_members =
lappend(inner_members, cur_em);
1595 new_members =
lappend(new_members, cur_em);
1607 if (outer_members && inner_members)
1612 int best_score = -1;
1615 foreach(lc1, outer_members)
1620 foreach(lc2, inner_members)
1643 if (score > best_score)
1645 best_outer_em = outer_em;
1646 best_inner_em = inner_em;
1649 if (best_score == 3)
1653 if (best_score == 3)
1668 best_outer_em, best_inner_em,
1671 result =
lappend(result, rinfo);
1693 foreach(lc1, new_members)
1697 if (prev_em != NULL)
1715 result =
lappend(result, rinfo);
1735 Relids nominal_join_relids,
1737 Relids nominal_inner_relids,
1751 result =
lappend(result, restrictinfo);
1769 inner_rel->top_parent);
1841 if (rinfo->left_em == leftem &&
1842 rinfo->right_em == rightem &&
1843 rinfo->parent_ec == parent_ec)
1845 if (rinfo->left_em == rightem &&
1846 rinfo->right_em == leftem &&
1847 rinfo->parent_ec == parent_ec)
1854 if (rinfo->left_em == leftem &&
1855 rinfo->right_em == rightem &&
1856 rinfo->parent_ec == parent_ec)
1858 if (rinfo->left_em == rightem &&
1859 rinfo->right_em == leftem &&
1860 rinfo->parent_ec == parent_ec)
1913 rinfo->parent_ec = parent_ec;
1919 rinfo->left_ec = ec;
1920 rinfo->right_ec = ec;
1923 rinfo->left_em = leftem;
1924 rinfo->right_em = rightem;
2013 foreach(cell,
root->left_join_clauses)
2023 root->left_join_clauses =
2041 foreach(cell,
root->right_join_clauses)
2051 root->right_join_clauses =
2069 foreach(cell,
root->full_join_clauses)
2079 root->full_join_clauses =
2098 foreach(cell,
root->left_join_clauses)
2104 foreach(cell,
root->right_join_clauses)
2110 foreach(cell,
root->full_join_clauses)
2149 inner_datatype = right_type;
2150 inner_relids = rinfo->right_relids;
2156 inner_datatype = left_type;
2157 inner_relids = rinfo->left_relids;
2161 foreach(lc1,
root->eq_classes)
2269 left_relids = rinfo->left_relids;
2270 right_relids = rinfo->right_relids;
2272 foreach(lc1,
root->eq_classes)
2335 if (
equal(leftvar, cfirst) &&
equal(rightvar, csecond))
2352 matchleft = matchright =
false;
2405 if (matchleft && matchright)
2436 foreach(lc,
root->eq_classes)
2472 foreach(lc,
root->join_domains)
2479 elog(
ERROR,
"failed to find appropriate JoinDomain");
2503 foreach(lc1,
root->eq_classes)
2506 bool item1member =
false;
2507 bool item2member =
false;
2536 if (item1member && item2member)
2565 AttrNumber var1attno = fkinfo->conkey[colno];
2567 AttrNumber var2attno = fkinfo->confkey[colno];
2568 Oid eqop = fkinfo->conpfeqop[colno];
2608 if (!(var &&
IsA(var,
Var)))
2614 else if (var->
varno == var2varno && var->
varattno == var2attno)
2618 if (item1_em && item2_em)
2625 if (opfamilies ==
NIL)
2629 fkinfo->
eclass[colno] = ec;
2666 if (rinfo->left_em == em)
2730 for (
int pos = 0; pos < num_members; pos++)
2766 child_expr = (
Expr *)
2774 child_expr = (
Expr *)
2778 child_rel->top_parent);
2862 for (
int pos = 0; pos < num_members; pos++)
2893 child_expr = (
Expr *)
2896 nappinfos, appinfos);
2902 child_expr = (
Expr *)
2906 child_joinrel->top_parent);
2944 List *child_tlist,
List *setop_pathkeys)
2949 foreach(lc, child_tlist)
2959 elog(
ERROR,
"too few pathkeys for set operation");
2962 parent_em =
linitial(pk->pk_eclass->ec_members);
2977 lc2 =
lnext(setop_pathkeys, lc2);
3036 parent_relids = NULL;
3092 if (other_em == cur_em ||
3119 result =
lappend(result, rinfo);
3303 foreach(lc,
eclass->ec_members)
3331 if (parent_ec == NULL)
3334 foreach(lc, clauselist)
3338 if (otherrinfo->parent_ec == parent_ec)
3357 foreach(lc, indexclauses)
3367 if (rinfo == otherrinfo)
3370 if (parent_ec && otherrinfo->parent_ec == parent_ec)
3401 if (
i ==
root->group_rtindex)
3435 rel2ecs =
root->simple_rel_array[relid]->eclass_indexes;
Node * adjust_appendrel_attrs(PlannerInfo *root, Node *node, int nappinfos, AppendRelInfo **appinfos)
Node * adjust_appendrel_attrs_multilevel(PlannerInfo *root, Node *node, RelOptInfo *childrel, RelOptInfo *parentrel)
Bitmapset * bms_difference(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_make_singleton(int x)
Bitmapset * bms_int_members(Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_intersect(const Bitmapset *a, const Bitmapset *b)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
int bms_next_member(const Bitmapset *a, int prevbit)
Bitmapset * bms_add_range(Bitmapset *a, int lower, int upper)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
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_join(Bitmapset *a, Bitmapset *b)
Bitmapset * bms_copy(const Bitmapset *a)
#define OidIsValid(objectId)
bool contain_agg_clause(Node *clause)
bool contain_window_function(Node *clause)
bool is_parallel_safe(PlannerInfo *root, Node *node)
bool contain_volatile_functions(Node *clause)
bool equal(const void *a, const void *b)
void rebuild_eclass_attr_needed(PlannerInfo *root)
EquivalenceClass * get_eclass_for_sort_expr(PlannerInfo *root, Expr *expr, List *opfamilies, Oid opcintype, Oid collation, Index sortref, Relids rel, bool create_it)
void add_child_rel_equivalences(PlannerInfo *root, AppendRelInfo *appinfo, RelOptInfo *parent_rel, RelOptInfo *child_rel)
bool is_redundant_with_indexclauses(RestrictInfo *rinfo, List *indexclauses)
void generate_base_implied_equalities(PlannerInfo *root)
bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2, Oid opfamily)
RestrictInfo * find_derived_clause_for_ec_member(EquivalenceClass *ec, EquivalenceMember *em)
static List * generate_join_implied_equalities_normal(PlannerInfo *root, EquivalenceClass *ec, Relids join_relids, Relids outer_relids, Relids inner_relids)
Expr * canonicalize_ec_expression(Expr *expr, Oid req_type, Oid req_collation)
EquivalenceMember * find_ec_member_matching_expr(EquivalenceClass *ec, Expr *expr, Relids relids)
static JoinDomain * find_join_domain(PlannerInfo *root, Relids relids)
bool relation_can_be_sorted_early(PlannerInfo *root, RelOptInfo *rel, EquivalenceClass *ec, bool require_parallel_safe)
static void generate_base_implied_equalities_broken(PlannerInfo *root, EquivalenceClass *ec)
bool process_equivalence(PlannerInfo *root, RestrictInfo **p_restrictinfo, JoinDomain *jdomain)
List * generate_implied_equalities_for_column(PlannerInfo *root, RelOptInfo *rel, ec_matches_callback_type callback, void *callback_arg, Relids prohibited_rels)
static EquivalenceMember * add_eq_member(EquivalenceClass *ec, Expr *expr, Relids relids, JoinDomain *jdomain, EquivalenceMember *parent, Oid datatype)
bool have_relevant_eclass_joinclause(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
EquivalenceMember * find_computable_ec_member(PlannerInfo *root, EquivalenceClass *ec, List *exprs, Relids relids, bool require_parallel_safe)
static Bitmapset * get_common_eclass_indexes(PlannerInfo *root, Relids relids1, Relids relids2)
List * generate_join_implied_equalities_for_ecs(PlannerInfo *root, List *eclasses, Relids join_relids, Relids outer_relids, RelOptInfo *inner_rel)
void add_setop_child_rel_equivalences(PlannerInfo *root, RelOptInfo *child_rel, List *child_tlist, List *setop_pathkeys)
void reconsider_outer_join_clauses(PlannerInfo *root)
bool eclass_useful_for_merging(PlannerInfo *root, EquivalenceClass *eclass, RelOptInfo *rel)
void add_child_join_rel_equivalences(PlannerInfo *root, int nappinfos, AppendRelInfo **appinfos, RelOptInfo *parent_joinrel, RelOptInfo *child_joinrel)
static RestrictInfo * create_join_clause(PlannerInfo *root, EquivalenceClass *ec, Oid opno, EquivalenceMember *leftem, EquivalenceMember *rightem, EquivalenceClass *parent_ec)
static Bitmapset * get_eclass_indexes_for_relids(PlannerInfo *root, Relids relids)
bool is_redundant_derived_clause(RestrictInfo *rinfo, List *clauselist)
static void generate_base_implied_equalities_no_const(PlannerInfo *root, EquivalenceClass *ec)
static void generate_base_implied_equalities_const(PlannerInfo *root, EquivalenceClass *ec)
static Oid select_equality_operator(EquivalenceClass *ec, Oid lefttype, Oid righttype)
EquivalenceClass * match_eclasses_to_foreign_key_col(PlannerInfo *root, ForeignKeyOptInfo *fkinfo, int colno)
static bool reconsider_outer_join_clause(PlannerInfo *root, OuterJoinClauseInfo *ojcinfo, bool outer_on_left)
List * generate_join_implied_equalities(PlannerInfo *root, Relids join_relids, Relids outer_relids, RelOptInfo *inner_rel, SpecialJoinInfo *sjinfo)
bool has_relevant_eclass_joinclause(PlannerInfo *root, RelOptInfo *rel1)
static bool reconsider_full_join_clause(PlannerInfo *root, OuterJoinClauseInfo *ojcinfo)
static List * generate_join_implied_equalities_broken(PlannerInfo *root, EquivalenceClass *ec, Relids nominal_join_relids, Relids outer_relids, Relids nominal_inner_relids, RelOptInfo *inner_rel)
Assert(PointerIsAligned(start, uint64))
void distribute_restrictinfo_to_rels(PlannerInfo *root, RestrictInfo *restrictinfo)
RestrictInfo * build_implied_join_equality(PlannerInfo *root, Oid opno, Oid collation, Expr *item1, Expr *item2, Relids qualscope, Index security_level)
void add_vars_to_targetlist(PlannerInfo *root, List *vars, Relids where_needed)
RestrictInfo * process_implied_equality(PlannerInfo *root, Oid opno, Oid collation, Expr *item1, Expr *item2, Relids qualscope, Index security_level, bool both_const)
void add_vars_to_attr_needed(PlannerInfo *root, List *vars, Relids where_needed)
if(TABLE==NULL||TABLE_index==NULL)
Relids add_outer_joins_to_relids(PlannerInfo *root, Relids input_relids, SpecialJoinInfo *sjinfo, List **pushed_down_joins)
List * lappend(List *list, void *datum)
List * list_delete_nth_cell(List *list, int n)
List * list_concat(List *list1, const List *list2)
List * list_copy(const List *oldlist)
void list_free(List *list)
bool list_member_oid(const List *list, Oid datum)
bool list_member(const List *list, const void *datum)
bool op_hashjoinable(Oid opno, Oid inputtype)
RegProcedure get_opcode(Oid opno)
Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy)
bool func_strict(Oid funcid)
bool get_func_leakproof(Oid funcid)
List * get_mergejoin_opfamilies(Oid opno)
void op_input_types(Oid opno, Oid *lefttype, Oid *righttype)
Node * makeBoolConst(bool value, bool isnull)
void pfree(void *pointer)
void * palloc0(Size size)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
Oid exprCollation(const Node *expr)
Node * applyRelabelType(Node *arg, Oid rtype, int32 rtypmod, Oid rcollid, CoercionForm rformat, int rlocation, bool overwrite_ok)
bool expression_returns_set(Node *clause)
void set_opfuncid(OpExpr *opexpr)
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 PVC_RECURSE_AGGREGATES
#define PVC_RECURSE_WINDOWFUNCS
#define PVC_INCLUDE_WINDOWFUNCS
#define PVC_INCLUDE_PLACEHOLDERS
#define PVC_INCLUDE_CONVERTROWTYPES
#define PVC_INCLUDE_AGGREGATES
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define IS_SIMPLE_REL(rel)
@ RELOPT_OTHER_MEMBER_REL
#define IS_OTHER_REL(rel)
bool(* ec_matches_callback_type)(PlannerInfo *root, RelOptInfo *rel, EquivalenceClass *ec, EquivalenceMember *em, void *arg)
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define linitial_node(type, l)
#define foreach_current_index(var_or_cell)
#define foreach_delete_current(lst, var_or_cell)
static void * list_nth(const List *list, int n)
static ListCell * list_head(const List *l)
static ListCell * lnext(const List *l, const ListCell *c)
static struct cvec * eclass(struct vars *v, chr c, int cases)
Relids find_childrel_parents(PlannerInfo *root, RelOptInfo *rel)
RestrictInfo * make_restrictinfo(PlannerInfo *root, Expr *clause, bool is_pushed_down, bool has_clone, bool is_clone, bool pseudoconstant, Index security_level, Relids required_relids, Relids incompatible_relids, Relids outer_relids)
Node * remove_nulling_relids(Node *node, const Bitmapset *removable_relids, const Bitmapset *except_relids)
#define BTEqualStrategyNumber
struct EquivalenceClass * ec_merged
struct EquivalenceClass * eclass[INDEX_MAX_KEYS]
struct EquivalenceMember * fk_eclass_member[INDEX_MAX_KEYS]
struct RestrictInfo * rinfo
NullTestType nulltesttype
struct PathTarget * reltarget
Bitmapset * eclass_indexes
Relids incompatible_relids
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
Relids pull_varnos(PlannerInfo *root, Node *node)
List * pull_var_clause(Node *node, int flags)