53 bool below_outer_join,
55 List **postponed_qual_list);
58 bool below_outer_join);
65 bool below_outer_join,
70 Relids outerjoin_nonnullable,
71 List **postponed_qual_list);
73 Relids *nullable_relids_p,
bool is_pushed_down);
129 elog(
ERROR,
"unrecognized node type: %d",
187 if (tlist_vars !=
NIL)
203 if (having_vars !=
NIL)
228 Relids where_needed,
bool create_new_ph)
414 newvars =
lappend(newvars, node);
449 bool found_laterals =
false;
475 lateral_relids = NULL;
486 found_laterals =
true;
496 found_laterals =
true;
531 found_laterals =
true;
583 Relids outer_lateral_relids;
591 if (outer_lateral_relids == NULL)
605 outer_lateral_relids);
625 if (lateral_relids == NULL)
689 List *postponed_qual_list =
NIL;
699 &qualscope, &inner_join_rels,
700 &postponed_qual_list);
732 List **postponed_qual_list)
739 *inner_join_rels = NULL;
755 *inner_join_rels = NULL;
761 List *child_postponed_quals =
NIL;
772 *inner_join_rels = NULL;
785 &child_postponed_quals);
789 if (sub_members <= 1 ||
793 joinlist =
lappend(joinlist, sub_joinlist);
804 *inner_join_rels = *qualscope;
810 foreach(l, child_postponed_quals)
818 *qualscope, NULL, NULL,
821 *postponed_qual_list =
lappend(*postponed_qual_list, pq);
834 *qualscope, NULL, NULL,
835 postponed_qual_list);
841 List *child_postponed_quals =
NIL;
872 &leftids, &left_inners,
873 &child_postponed_quals);
876 &rightids, &right_inners,
877 &child_postponed_quals);
878 *qualscope =
bms_union(leftids, rightids);
879 *inner_join_rels = *qualscope;
881 nonnullable_rels = NULL;
883 nullable_rels = NULL;
889 &leftids, &left_inners,
890 &child_postponed_quals);
893 &rightids, &right_inners,
894 &child_postponed_quals);
895 *qualscope =
bms_union(leftids, rightids);
896 *inner_join_rels =
bms_union(left_inners, right_inners);
897 nonnullable_rels = leftids;
898 nullable_rels = rightids;
903 &leftids, &left_inners,
904 &child_postponed_quals);
907 &rightids, &right_inners,
908 &child_postponed_quals);
909 *qualscope =
bms_union(leftids, rightids);
910 *inner_join_rels =
bms_union(left_inners, right_inners);
912 nonnullable_rels = NULL;
919 nullable_rels = NULL;
924 &leftids, &left_inners,
925 &child_postponed_quals);
928 &rightids, &right_inners,
929 &child_postponed_quals);
930 *qualscope =
bms_union(leftids, rightids);
931 *inner_join_rels =
bms_union(left_inners, right_inners);
933 nonnullable_rels = *qualscope;
934 nullable_rels = *qualscope;
938 elog(
ERROR,
"unrecognized join type: %d",
940 nonnullable_rels = NULL;
941 nullable_rels = NULL;
942 leftjoinlist = rightjoinlist =
NIL;
957 foreach(l, child_postponed_quals)
970 *postponed_qual_list =
lappend(*postponed_qual_list, pq);
1004 foreach(l, my_quals)
1012 ojscope, nonnullable_rels,
1013 postponed_qual_list);
1038 joinlist =
list_concat(leftjoinlist, rightjoinlist);
1050 leftpart = (
Node *) leftjoinlist;
1054 rightpart = (
Node *) rightjoinlist;
1060 elog(
ERROR,
"unrecognized node type: %d",
1082 int rti,
Relids qualscope,
1083 bool below_outer_join)
1086 Index security_level = 0;
1100 foreach(lc2, qualset)
1123 Assert(security_level <= root->qual_security_level);
1186 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1189 errmsg(
"%s cannot be applied to the nullable side of an outer join",
1369 min_lefthand =
bms_copy(left_rels);
1371 min_righthand =
bms_copy(right_rels);
1395 List *semi_operators;
1396 List *semi_rhs_exprs;
1437 semi_operators =
NIL;
1438 semi_rhs_exprs =
NIL;
1480 all_varnos =
bms_union(left_varnos, right_varnos);
1511 right_expr = left_expr;
1533 if (!(all_btree || all_hash))
1537 semi_operators =
lappend_oid(semi_operators, opno);
1542 if (semi_rhs_exprs ==
NIL)
1604 bool below_outer_join,
1606 Index security_level,
1609 Relids outerjoin_nonnullable,
1610 List **postponed_qual_list)
1613 bool is_pushed_down;
1614 bool outerjoin_delayed;
1615 bool pseudoconstant =
false;
1616 bool maybe_equivalence;
1617 bool maybe_outer_join;
1645 *postponed_qual_list =
lappend(*postponed_qual_list, pq);
1654 elog(
ERROR,
"JOIN qualification cannot refer to other relations");
1696 pseudoconstant =
true;
1700 if (!below_outer_join)
1755 is_pushed_down =
false;
1756 maybe_equivalence =
false;
1757 maybe_outer_join =
true;
1785 is_pushed_down =
true;
1793 if (outerjoin_delayed)
1803 maybe_equivalence =
false;
1823 maybe_equivalence =
true;
1824 if (outerjoin_nonnullable != NULL)
1825 below_outer_join =
true;
1832 maybe_outer_join =
false;
1844 outerjoin_nonnullable,
1910 if (maybe_equivalence)
1920 else if (maybe_outer_join && restrictinfo->
can_join)
1926 outerjoin_nonnullable) &&
1928 outerjoin_nonnullable))
1936 outerjoin_nonnullable) &&
1938 outerjoin_nonnullable))
2018 Relids *nullable_relids_p,
2019 bool is_pushed_down)
2023 bool outerjoin_delayed;
2029 *nullable_relids_p = NULL;
2035 nullable_relids = NULL;
2036 outerjoin_delayed =
false;
2058 outerjoin_delayed =
true;
2074 }
while (found_some);
2082 *nullable_relids_p = nullable_relids;
2083 return outerjoin_delayed;
2137 Var *forced_null_var;
2138 Index forced_null_rel;
2143 if (forced_null_var == NULL)
2145 forced_null_rel = forced_null_var->
varno;
2220 elog(
ERROR,
"cannot cope with variable-free clause");
2268 Index security_level,
2269 bool below_outer_join,
2275 bool pseudoconstant =
false;
2328 pseudoconstant =
true;
2332 if (!below_outer_join)
2393 return restrictinfo;
2416 Index security_level)
2449 return restrictinfo;
2489 if (con_rel == NULL)
2492 if (ref_rel == NULL)
2513 for (colno = 0; colno < fkinfo->
nkeys; colno++)
2535 con_attno = fkinfo->
conkey[colno];
2536 ref_attno = fkinfo->
confkey[colno];
2560 if (!(leftvar &&
IsA(leftvar,
Var)))
2564 if (!(rightvar &&
IsA(rightvar,
Var)))
2568 if (fkinfo->
ref_relid == leftvar->varno &&
2569 ref_attno == leftvar->varattno &&
2571 con_attno == rightvar->varattno)
2581 else if (fkinfo->
ref_relid == rightvar->varno &&
2582 ref_attno == rightvar->varattno &&
2584 con_attno == leftvar->varattno)
2595 if (clause->
opno == fpeqop)
2604 if (fkinfo->
rinfos[colno])
2615 newlist =
lappend(newlist, fkinfo);
2651 opno = ((
OpExpr *) clause)->opno;
2688 opno = ((
OpExpr *) clause)->opno;
List * pull_vars_of_level(Node *node, int levelsup)
#define list_make2(x1, x2)
static bool check_outerjoin_delay(PlannerInfo *root, Relids *relids_p, Relids *nullable_relids_p, bool is_pushed_down)
#define IsA(nodeptr, _type_)
Expr * preprocess_phv_expression(PlannerInfo *root, Expr *expr)
const char * LCS_asString(LockClauseStrength strength)
Oid get_commutator(Oid opno)
Bitmapset * bms_copy(const Bitmapset *a)
void initialize_mergeclause_eclasses(PlannerInfo *root, RestrictInfo *restrictinfo)
RestrictInfo * make_restrictinfo(Expr *clause, bool is_pushed_down, bool outerjoin_delayed, bool pseudoconstant, Index security_level, Relids required_relids, Relids outer_relids, Relids nullable_relids)
void add_base_rels_to_query(PlannerInfo *root, Node *jtnode)
void IncrementVarSublevelsUp(Node *node, int delta_sublevels_up, int min_sublevels_up)
static void process_security_barrier_quals(PlannerInfo *root, int rti, Relids qualscope, bool below_outer_join)
List * get_mergejoin_opfamilies(Oid opno)
int bms_next_member(const Bitmapset *a, int prevbit)
List * deconstruct_jointree(PlannerInfo *root)
List * list_concat(List *list1, const List *list2)
int errcode(int sqlerrcode)
bool bms_get_singleton_member(const Bitmapset *a, int *member)
Node * eval_const_expressions(PlannerInfo *root, Node *node)
Index baserestrict_min_security
List * pull_var_clause(Node *node, int flags)
bool contain_volatile_functions(Node *clause)
bool op_mergejoinable(Oid opno, Oid inputtype)
List * lappend_oid(List *list, Oid datum)
#define OidIsValid(objectId)
Expr * make_opclause(Oid opno, Oid opresulttype, bool opretset, Expr *leftop, Expr *rightop, Oid opcollid, Oid inputcollid)
static void distribute_qual_to_rels(PlannerInfo *root, Node *clause, bool below_outer_join, JoinType jointype, Index security_level, Relids qualscope, Relids ojscope, Relids outerjoin_nonnullable, List **postponed_qual_list)
LockClauseStrength strength
struct RelOptInfo ** simple_rel_array
void add_vars_to_targetlist(PlannerInfo *root, List *vars, Relids where_needed, bool create_new_ph)
void add_other_rels_to_query(PlannerInfo *root)
void distribute_restrictinfo_to_rels(PlannerInfo *root, RestrictInfo *restrictinfo)
bool op_hashjoinable(Oid opno, Oid inputtype)
bool process_equivalence(PlannerInfo *root, RestrictInfo **p_restrictinfo, bool below_outer_join)
static SpecialJoinInfo * make_outerjoininfo(PlannerInfo *root, Relids left_rels, Relids right_rels, Relids inner_join_rels, JoinType jointype, List *clause)
Oid conpfeqop[INDEX_MAX_KEYS]
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
Relids get_relids_in_jointree(Node *jtnode, bool include_joins)
Relids find_nonnullable_rels(Node *clause)
Bitmapset * bms_make_singleton(int x)
PlaceHolderInfo * find_placeholder_info(PlannerInfo *root, PlaceHolderVar *phv, bool create_new_ph)
RelOptInfo * build_simple_rel(PlannerInfo *root, int relid, RelOptInfo *parent)
static Node * get_leftop(const void *clause)
int simple_rel_array_size
Relids pull_varnos(Node *node)
List * lappend(List *list, void *datum)
RangeTblEntry ** simple_rte_array
Relids lateral_referencers
bool bms_is_empty(const Bitmapset *a)
#define PVC_INCLUDE_PLACEHOLDERS
Relids direct_lateral_relids
BMS_Membership bms_membership(const Bitmapset *a)
AttrNumber conkey[INDEX_MAX_KEYS]
int bms_singleton_member(const Bitmapset *a)
Bitmapset * bms_intersect(const Bitmapset *a, const Bitmapset *b)
void add_join_clause_to_rels(PlannerInfo *root, RestrictInfo *restrictinfo, Relids join_relids)
EquivalenceClass * match_eclasses_to_foreign_key_col(PlannerInfo *root, ForeignKeyOptInfo *fkinfo, int colno)
static Node * get_rightop(const void *clause)
bool hasPseudoConstantQuals
#define ereport(elevel,...)
void expand_inherited_rtentry(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte, Index rti)
void bms_free(Bitmapset *a)
static bool check_redundant_nullability_qual(PlannerInfo *root, Node *clause)
#define Assert(condition)
static bool check_equivalence_delay(PlannerInfo *root, RestrictInfo *restrictinfo)
Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b)
Oid exprType(const Node *expr)
static void check_mergejoinable(RestrictInfo *restrictinfo)
static int list_length(const List *l)
static List * deconstruct_recurse(PlannerInfo *root, Node *jtnode, bool below_outer_join, Relids *qualscope, Relids *inner_join_rels, List **postponed_qual_list)
RestrictInfo * build_implied_join_equality(Oid opno, Oid collation, Expr *item1, Expr *item2, Relids qualscope, Relids nullable_relids, Index security_level)
void build_base_rel_tlists(PlannerInfo *root, List *final_tlist)
Index qual_security_level
Bitmapset * bms_add_member(Bitmapset *a, int x)
void update_placeholder_eval_levels(PlannerInfo *root, SpecialJoinInfo *new_sjinfo)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
static void check_hashjoinable(RestrictInfo *restrictinfo)
int errmsg(const char *fmt,...)
void match_foreign_keys_to_quals(PlannerInfo *root)
#define PVC_RECURSE_WINDOWFUNCS
void list_free(List *list)
static void extract_lateral_references(PlannerInfo *root, RelOptInfo *brel, Index rtindex)
List * right_join_clauses
static bool is_opclause(const void *clause)
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
Bitmapset * bms_int_members(Bitmapset *a, const Bitmapset *b)
AttrNumber confkey[INDEX_MAX_KEYS]
bool bms_is_member(int x, const Bitmapset *a)
struct PathTarget * reltarget
struct TableSampleClause * tablesample
#define PVC_RECURSE_AGGREGATES
List * rinfos[INDEX_MAX_KEYS]
void create_lateral_join_info(PlannerInfo *root)
void find_lateral_references(PlannerInfo *root)
Var * find_forced_null_var(Node *node)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
struct PostponedQual PostponedQual
RestrictInfo * process_implied_equality(PlannerInfo *root, Oid opno, Oid collation, Expr *item1, Expr *item2, Relids qualscope, Relids nullable_relids, Index security_level, bool below_outer_join, bool both_const)
static void compute_semijoin_info(SpecialJoinInfo *sjinfo, List *clause)