81 int parentRTindex,
Query *setOpQuery,
100 Node *jtnode,
bool restricted,
101 Relids safe_upper_varnos);
104 JoinExpr *lowest_nulling_outer_join,
108 JoinExpr *lowest_nulling_outer_join);
120 List *nonnullable_vars,
121 List *forced_null_vars);
127 Node *node,
int varno);
129 int varno,
Relids subrelids);
159 if (
parse->mergeUseOuterJoin)
174 joinrte->
alias = NULL;
177 joinrte->
inh =
false;
207 joinexpr->
alias = NULL;
212 parse->jointree->quals = NULL;
237 if (
parse->jointree->fromlist !=
NIL)
241 if (
parse->setOperations)
347 newfromlist =
lappend(newfromlist, newchild);
348 frelids =
bms_join(frelids, childrelids);
353 jtlink = (
Node *) newf;
429 elog(
ERROR,
"unrecognized join type: %d",
442 *relids =
bms_join(leftrelids, rightrelids);
448 elog(
ERROR,
"unrecognized node type: %d",
485 available_rels1)) != NULL)
489 *jtlink1 = (
Node *)
j;
509 if (available_rels2 != NULL &&
511 available_rels2)) != NULL)
515 *jtlink2 = (
Node *)
j;
539 available_rels1)) != NULL)
543 *jtlink1 = (
Node *)
j;
563 if (available_rels2 != NULL &&
565 available_rels2)) != NULL)
569 *jtlink2 = (
Node *)
j;
605 available_rels1)) != NULL)
609 *jtlink1 = (
Node *)
j;
629 if (available_rels2 != NULL &&
631 available_rels2)) != NULL)
635 *jtlink2 = (
Node *)
j;
678 newclauses =
lappend(newclauses, newclause);
681 if (newclauses ==
NIL)
812 JoinExpr *lowest_nulling_outer_join,
830 (containing_appendrel == NULL ||
834 lowest_nulling_outer_join,
835 containing_appendrel);
857 lowest_outer_join == NULL &&
858 containing_appendrel == NULL &&
867 lowest_nulling_outer_join,
868 containing_appendrel);
877 Assert(containing_appendrel == NULL);
883 lowest_nulling_outer_join,
891 Assert(containing_appendrel == NULL);
898 lowest_nulling_outer_join,
902 lowest_nulling_outer_join,
910 lowest_nulling_outer_join,
934 lowest_nulling_outer_join,
938 elog(
ERROR,
"unrecognized join type: %d",
944 elog(
ERROR,
"unrecognized node type: %d",
964 JoinExpr *lowest_nulling_outer_join,
990 subroot->
parse = subquery;
1111 rvcontext.
root = root;
1120 rvcontext.
varno = varno;
1132 if (lowest_nulling_outer_join != NULL)
1142 if (containing_appendrel != NULL)
1157 if (
parse->groupingSets)
1169 lowest_nulling_outer_join,
1170 containing_appendrel);
1181 foreach(lc, subquery->
rtable)
1389 Query *setOpQuery,
int childRToffset)
1400 childRTindex = childRToffset + rtr->
rtindex;
1427 NULL, NULL, appinfo);
1441 elog(
ERROR,
"unrecognized node type: %d",
1549 Relids safe_upper_varnos;
1560 if (lowest_outer_join != NULL)
1569 safe_upper_varnos = NULL;
1574 restricted, safe_upper_varnos))
1590 if (lowest_outer_join != NULL)
1661 foreach(lc, values_list)
1670 rvcontext.
root = root;
1675 rvcontext.
varno = varno;
1787 JoinExpr *lowest_nulling_outer_join,
1823 rvcontext.
root = root;
1850 if (lowest_nulling_outer_join != NULL)
1858 if (containing_appendrel != NULL)
1868 if (
parse->groupingSets)
1880 lowest_nulling_outer_join,
1881 containing_appendrel);
1950 Assert(subquery != NULL);
1970 elog(
ERROR,
"unrecognized node type: %d",
2007 if (jtnode->
quals != NULL)
2032 Relids safe_upper_varnos)
2070 safe_upper_varnos = NULL;
2092 elog(
ERROR,
"unrecognized node type: %d",
2108 JoinExpr *lowest_nulling_outer_join,
2127 if (
parse->onConflict)
2129 parse->onConflict->onConflictSet = (
List *)
2132 parse->onConflict->onConflictWhere =
2141 if (
parse->mergeActionList)
2143 foreach(lc,
parse->mergeActionList)
2153 lowest_nulling_outer_join);
2167 bool save_need_phvs = rvcontext->
need_phvs;
2169 if (appinfo == containing_appendrel)
2185 foreach(lc,
parse->rtable)
2207 JoinExpr *lowest_nulling_outer_join)
2224 if (varno != context->
varno)
2278 lowest_nulling_outer_join);
2284 bool save_need_phvs = context->
need_phvs;
2286 if (
j == lowest_nulling_outer_join)
2290 lowest_nulling_outer_join = NULL;
2315 elog(
ERROR,
"unrecognized node type: %d",
2382 &colnames, &fields);
2392 rowexpr->
args = fields;
2397 newnode = (
Node *) rowexpr;
2423 elog(
ERROR,
"could not find attribute %d in subquery targetlist",
2434 if (newnode &&
IsA(newnode,
Var) &&
2435 ((
Var *) newnode)->varlevelsup == 0)
2561 Node *leftmostjtnode;
2587 leftmostjtnode = topop->
larg;
2591 leftmostRTI = ((
RangeTblRef *) leftmostjtnode)->rtindex;
2607 ((
RangeTblRef *) leftmostjtnode)->rtindex = childRTI;
2610 leftmostRTE->
inh =
true;
2625 parse->setOperations = NULL;
2692 elog(
ERROR,
"so where are the outer joins?");
2760 elog(
ERROR,
"unrecognized node type: %d",
2780 List *nonnullable_vars,
2781 List *forced_null_vars)
2796 Relids pass_nonnullable_rels;
2797 List *pass_nonnullable_vars;
2798 List *pass_forced_null_vars;
2805 pass_nonnullable_vars =
list_concat(pass_nonnullable_vars,
2808 pass_forced_null_vars =
list_concat(pass_forced_null_vars,
2818 pass_nonnullable_rels,
2819 pass_nonnullable_vars,
2820 pass_forced_null_vars);
2828 int rtindex =
j->rtindex;
2832 List *local_nonnullable_vars =
NIL;
2833 bool computed_local_nonnullable_vars =
false;
2872 elog(
ERROR,
"unrecognized join type: %d",
2911 computed_local_nonnullable_vars =
true;
2920 if (overlap !=
NIL &&
2927 if (rtindex && jointype !=
j->jointype)
2935 j->jointype = jointype;
2940 Relids local_nonnullable_rels;
2941 List *local_forced_null_vars;
2942 Relids pass_nonnullable_rels;
2943 List *pass_nonnullable_vars;
2944 List *pass_forced_null_vars;
2970 if (!computed_local_nonnullable_vars)
2978 local_nonnullable_vars =
list_concat(local_nonnullable_vars,
2980 local_forced_null_vars =
list_concat(local_forced_null_vars,
2987 local_nonnullable_rels = NULL;
2988 local_forced_null_vars =
NIL;
2996 pass_nonnullable_rels = local_nonnullable_rels;
2997 pass_nonnullable_vars = local_nonnullable_vars;
2998 pass_forced_null_vars = local_forced_null_vars;
3003 pass_nonnullable_rels = nonnullable_rels;
3004 pass_nonnullable_vars = nonnullable_vars;
3005 pass_forced_null_vars = forced_null_vars;
3010 pass_nonnullable_rels = NULL;
3011 pass_nonnullable_vars =
NIL;
3012 pass_forced_null_vars =
NIL;
3015 pass_nonnullable_rels,
3016 pass_nonnullable_vars,
3017 pass_forced_null_vars);
3025 pass_nonnullable_rels = local_nonnullable_rels;
3026 pass_nonnullable_vars = local_nonnullable_vars;
3027 pass_forced_null_vars = local_forced_null_vars;
3032 pass_nonnullable_rels = NULL;
3033 pass_nonnullable_vars =
NIL;
3034 pass_forced_null_vars =
NIL;
3037 pass_nonnullable_rels,
3038 pass_nonnullable_vars,
3039 pass_forced_null_vars);
3045 elog(
ERROR,
"unrecognized node type: %d",
3137 Relids result_relids = NULL;
3208 switch (
j->jointype)
3269 (
j->quals == NULL ||
3279 (
j->quals == NULL ||
3315 elog(
ERROR,
"unrecognized join type: %d",
3321 elog(
ERROR,
"unrecognized node type: %d",
3423 (
void *) context, 0);
3424 context->sublevels_up--;
3549 (
void *) context, 0);
3550 context->sublevels_up--;
3568 context.
varno = varno;
3603 foreach(l, append_rel_list)
3661 if (include_joins &&
j->rtindex)
3665 elog(
ERROR,
"unrecognized node type: %d",
3681 elog(
ERROR,
"could not find join node %d", joinrelid);
3718 if (relid ==
j->rtindex)
3728 elog(
ERROR,
"unrecognized node type: %d",
#define InvalidAttrNumber
Bitmapset * bms_join(Bitmapset *a, Bitmapset *b)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
int bms_next_member(const Bitmapset *a, int prevbit)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
int bms_singleton_member(const Bitmapset *a)
void bms_free(Bitmapset *a)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_make_singleton(int x)
Bitmapset * bms_add_member(Bitmapset *a, int x)
Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_del_member(Bitmapset *a, int x)
bool bms_is_empty(const Bitmapset *a)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
List * find_forced_null_vars(Node *node)
Query * inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte)
Relids find_nonnullable_rels(Node *clause)
List * find_nonnullable_vars(Node *clause)
bool contain_nonstrict_functions(Node *clause)
Node * eval_const_expressions(PlannerInfo *root, Node *node)
bool contain_volatile_functions(Node *clause)
TypeFuncClass get_expr_result_type(Node *expr, Oid *resultTypeId, TupleDesc *resultTupleDesc)
Assert(fmt[strlen(fmt) - 1] !='\n')
List * lappend(List *list, void *datum)
List * list_intersection(const List *list1, const List *list2)
List * list_concat(List *list1, const List *list2)
Alias * makeAlias(const char *aliasname, List *colnames)
Var * makeVarFromTargetEntry(int varno, TargetEntry *tle)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
Expr * make_andclause(List *andclauses)
FromExpr * makeFromExpr(List *fromlist, Node *quals)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
bool query_or_expression_tree_walker(Node *node, bool(*walker)(), void *context, int flags)
bool query_tree_walker(Query *query, bool(*walker)(), void *context, int flags)
bool expression_tree_walker(Node *node, bool(*walker)(), void *context)
bool expression_returns_set(Node *clause)
bool range_table_entry_walker(RangeTblEntry *rte, bool(*walker)(), void *context, int flags)
static bool is_andclause(const void *clause)
static Expr * get_notclausearg(const void *notclause)
static bool is_notclause(const void *clause)
#define IsA(nodeptr, _type_)
#define IS_OUTER_JOIN(jointype)
#define castNode(_type_, nodeptr)
TargetEntry * get_tle_by_resno(List *tlist, AttrNumber resno)
void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up, int location, bool include_dropped, List **colnames, List **colvars)
#define rt_fetch(rangetable_index, rangetable)
static int list_length(const List *l)
#define linitial_node(type, l)
#define forboth(cell1, list1, cell2, list2)
#define foreach_delete_current(lst, cell)
PlaceHolderVar * make_placeholder_expr(PlannerInfo *root, Expr *expr, Relids phrels)
static void remove_result_refs(PlannerInfo *root, int varno, Node *newjtloc)
void preprocess_function_rtes(PlannerInfo *root)
static bool find_dependent_phvs_walker(Node *node, find_dependent_phvs_context *context)
static Node * find_jointree_node_for_rel(Node *jtnode, int relid)
static Node * pull_up_simple_union_all(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte)
static Node * pull_up_subqueries_recurse(PlannerInfo *root, Node *jtnode, JoinExpr *lowest_outer_join, JoinExpr *lowest_nulling_outer_join, AppendRelInfo *containing_appendrel)
static void pull_up_union_leaf_queries(Node *setOp, PlannerInfo *root, int parentRTindex, Query *setOpQuery, int childRToffset)
static bool is_simple_values(PlannerInfo *root, RangeTblEntry *rte)
static void make_setop_translation_list(Query *query, int newvarno, AppendRelInfo *appinfo)
void flatten_simple_union_all(PlannerInfo *root)
void transform_MERGE_to_join(Query *parse)
static Node * remove_useless_results_recurse(PlannerInfo *root, Node *jtnode)
static void perform_pullup_replace_vars(PlannerInfo *root, pullup_replace_vars_context *rvcontext, JoinExpr *lowest_nulling_outer_join, AppendRelInfo *containing_appendrel)
void remove_useless_result_rtes(PlannerInfo *root)
static Node * pull_up_sublinks_jointree_recurse(PlannerInfo *root, Node *jtnode, Relids *relids)
static bool is_simple_subquery(PlannerInfo *root, Query *subquery, RangeTblEntry *rte, JoinExpr *lowest_outer_join)
static Node * pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, JoinExpr *lowest_outer_join, JoinExpr *lowest_nulling_outer_join, AppendRelInfo *containing_appendrel)
static void substitute_phv_relids(Node *node, int varno, Relids subrelids)
void pull_up_sublinks(PlannerInfo *root)
static Node * pullup_replace_vars_callback(Var *var, replace_rte_variables_context *context)
void replace_empty_jointree(Query *parse)
static bool is_simple_union_all_recurse(Node *setOp, Query *setOpQuery, List *colTypes)
static Node * pull_up_constant_function(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, JoinExpr *lowest_nulling_outer_join, AppendRelInfo *containing_appendrel)
static void reduce_outer_joins_pass2(Node *jtnode, reduce_outer_joins_state *state, PlannerInfo *root, Relids nonnullable_rels, List *nonnullable_vars, List *forced_null_vars)
static bool substitute_phv_relids_walker(Node *node, substitute_phv_relids_context *context)
static Query * pullup_replace_vars_subquery(Query *query, pullup_replace_vars_context *context)
Relids get_relids_for_join(Query *query, int joinrelid)
void pull_up_subqueries(PlannerInfo *root)
static int get_result_relid(PlannerInfo *root, Node *jtnode)
static void fix_append_rel_relids(List *append_rel_list, int varno, Relids subrelids)
static Node * pull_up_simple_values(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte)
static bool is_safe_append_member(Query *subquery)
struct pullup_replace_vars_context pullup_replace_vars_context
static void replace_vars_in_jointree(Node *jtnode, pullup_replace_vars_context *context, JoinExpr *lowest_nulling_outer_join)
static Node * pull_up_sublinks_qual_recurse(PlannerInfo *root, Node *node, Node **jtlink1, Relids available_rels1, Node **jtlink2, Relids available_rels2)
void reduce_outer_joins(PlannerInfo *root)
static bool find_dependent_phvs(PlannerInfo *root, int varno)
static bool jointree_contains_lateral_outer_refs(PlannerInfo *root, Node *jtnode, bool restricted, Relids safe_upper_varnos)
Relids get_relids_in_jointree(Node *jtnode, bool include_joins)
struct reduce_outer_joins_state reduce_outer_joins_state
static Node * pullup_replace_vars(Node *expr, pullup_replace_vars_context *context)
static reduce_outer_joins_state * reduce_outer_joins_pass1(Node *jtnode)
static bool is_simple_union_all(Query *subquery)
static bool find_dependent_phvs_in_jointree(PlannerInfo *root, Node *node, int varno)
static struct subre * parse(struct vars *, int, int, struct state *, struct state *)
void IncrementVarSublevelsUp_rtable(List *rtable, int delta_sublevels_up, int min_sublevels_up)
Node * replace_rte_variables_mutator(Node *node, replace_rte_variables_context *context)
void OffsetVarNodes(Node *node, int offset, int sublevels_up)
Node * replace_rte_variables(Node *node, int target_varno, int sublevels_up, replace_rte_variables_callback callback, void *callback_arg, bool *outer_hasSubLinks)
void IncrementVarSublevelsUp(Node *node, int delta_sublevels_up, int min_sublevels_up)
AttrNumber * parent_colnos
MemoryContext planner_cxt
struct PathTarget * upper_targets[UPPERREL_FINAL+1]
Index qual_security_level
AttrNumber * grouping_map
struct Path * non_recursive_path
List * upper_rels[UPPERREL_FINAL+1]
PlannerInfo * parent_root
Relids leaf_result_relids
Bitmapset * extraUpdatedCols
struct TableSampleClause * tablesample
RangeTblEntry * target_rte
JoinExpr * convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, Relids available_rels)
JoinExpr * convert_EXISTS_sublink_to_join(PlannerInfo *root, SubLink *sublink, bool under_not, Relids available_rels)
bool tlist_same_datatypes(List *tlist, List *colTypes, bool junkOK)
bool contain_vars_of_level(Node *node, int levelsup)
Relids pull_varnos_of_level(PlannerInfo *root, Node *node, int levelsup)
Relids pull_varnos(PlannerInfo *root, Node *node)
Node * flatten_join_alias_vars(Query *query, Node *node)