124 if (
plan->targetlist)
166 Node *testexpr,
bool isTopQual)
170 double tuple_fraction;
213 tuple_fraction = 1.0;
216 tuple_fraction = 0.5;
218 tuple_fraction = 0.0;
229 plan_params =
root->plan_params;
243 subroot, plan_params,
244 subLinkType, subLinkId,
245 testexpr,
NIL, isTopQual);
279 plan_params =
root->plan_params;
298 subroot, plan_params,
311 root->hasAlternativeSubPlans =
true;
359 foreach(
lc, plan_params)
430 elog(
ERROR,
"could not find array type for datatype %s",
493 result = (
Node *) splan;
546 result = (
Node *) splan;
604 result =
lappend(result, param);
749 path->pathtarget->width,
779 foreach(l, ((
BoolExpr *) testexpr)->args)
889 foreach(
lc,
root->parse->cteList)
904 if (cte->cterefcount == 0 && cmdType ==
CMD_SELECT)
944 cte->cterefcount == 1)) &&
945 !cte->cterecursive &&
948 (cte->cterefcount <= 1 ||
973 root, cte->cterecursive, 0.0,
NULL);
980 if (
root->plan_params)
981 elog(
ERROR,
"unexpected outer reference in CTE query");
1112 rte->self_reference &&
1113 rte->ctelevelsup >= *depth)
1202 rte->security_barrier =
false;
1206 rte->ctelevelsup = 0;
1207 rte->self_reference =
false;
1210 rte->colcollations =
NIL;
1255 opno = ((
OpExpr *) testexpr)->opno;
1256 inputcollid = ((
OpExpr *) testexpr)->inputcollid;
1267 foreach(
lc,
rte->values_lists)
1413 rtr->rtindex = rtindex;
1435 result->usingClause =
NIL;
1436 result->join_using_alias =
NULL;
1437 result->
quals = quals;
1438 result->alias =
NULL;
1537 MemSet(&subroot, 0,
sizeof(subroot));
1540 subroot.
parse = subselect;
1593 if (varno <= rtoffset)
1611 subselect->
rtable, subselect->rteperminfos);
1625 result->usingClause =
NIL;
1626 result->join_using_alias =
NULL;
1627 result->
quals = whereClause;
1628 result->alias =
NULL;
1667 query->hasWindowFuncs ||
1668 query->hasTargetSRFs ||
1669 query->hasModifyingCTE ||
1700 limit = (
Const *) node;
1702 if (!limit->constisnull &&
DatumGetInt64(limit->constvalue) <= 0)
1721 query->hasDistinctOn =
false;
1738 Assert(query->hasGroupRTE);
1740 query->hasGroupRTE =
false;
1831 MemSet(&subroot, 0,
sizeof(subroot));
1834 subroot.
parse = subselect;
1847 foreach(
lc, (
List *) whereClause)
1908 if (
root->parse->hasAggs &&
1975 *paramIds = paramids;
2020 if (((
Var *) node)->varlevelsup > 0)
2031 if (((
Aggref *) node)->agglevelsup > 0)
2117 if (((
Aggref *) node)->agglevelsup > 0)
2162 foreach(l, ((
BoolExpr *) node)->args)
2183 foreach(l, ((
BoolExpr *) node)->args)
2230 if (
root->glob->paramExecTypes ==
NIL)
2239 outer_params =
NULL;
2245 foreach(l,
proot->plan_params)
2252 foreach(l,
proot->init_plans)
2263 if (
proot->wt_param_id >= 0)
2266 root->outer_params = outer_params;
2363 foreach(
lc, init_plans)
2469 foreach(l,
plan->initPlan)
2501 if (
plan->parallel_aware)
2504 elog(
ERROR,
"parallel-aware plan node is not below a Gather");
2600 sscan->subplan->extParam);
2671 elog(
ERROR,
"could not find plan for CteScan referencing plan ID %d",
2727 foreach(
lc,
cscan->custom_plans)
2964 elog(
ERROR,
"unrecognized node type: %d",
3014 elog(
ERROR,
"plan should not reference subplan's variable");
3032 return plan->allParam;
3048 int paramid = ((
Param *) node)->paramid;
3214 switch (subLinkType)
3223 return "rowcompare";
Bitmapset * bms_difference(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)
void bms_free(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)
Bitmapset * bms_join(Bitmapset *a, Bitmapset *b)
Bitmapset * bms_copy(const Bitmapset *a)
static Datum values[MAXATTR]
#define Assert(condition)
#define MemSet(start, val, len)
#define OidIsValid(objectId)
Node * eval_const_expressions(PlannerInfo *root, Node *node)
bool contain_subplans(Node *clause)
ScalarArrayOpExpr * make_SAOP_expr(Oid oper, Node *leftexpr, Oid coltype, Oid arraycollid, Oid inputcollid, List *exprs, bool haveNonConst)
bool contain_volatile_functions(Node *clause)
bool contain_exec_param(Node *clause, List *param_ids)
void cost_subplan(PlannerInfo *root, SubPlan *subplan, Plan *plan)
Plan * materialize_finished_plan(Plan *subplan)
Plan * create_plan(PlannerInfo *root, Path *best_path)
bool ExecMaterializesOutput(NodeTag plantype)
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
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 op_hashjoinable(Oid opno, Oid inputtype)
bool func_strict(Oid funcid)
Oid get_promoted_array_type(Oid typid)
Oid get_commutator(Oid opno)
Expr * make_orclause(List *orclauses)
Expr * make_ands_explicit(List *andclauses)
Var * makeVarFromTargetEntry(int varno, TargetEntry *tle)
Const * makeNullConst(Oid consttype, int32 consttypmod, Oid constcollid)
Expr * make_andclause(List *andclauses)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
Expr * make_opclause(Oid opno, Oid opresulttype, bool opretset, Expr *leftop, Expr *rightop, Oid opcollid, Oid inputcollid)
List * make_ands_implicit(Expr *clause)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
Oid exprCollation(const Node *expr)
#define expression_tree_mutator(n, m, c)
static bool is_andclause(const void *clause)
static bool is_orclause(const void *clause)
#define query_tree_walker(q, w, c, f)
#define QTW_EXAMINE_RTES_AFTER
#define expression_tree_walker(n, w, c)
#define QTW_EXAMINE_RTES_BEFORE
size_t get_hash_memory_limit(void)
Size EstimateSubplanHashTableSpace(double nentries, Size tupleWidth, bool unknownEqFalse)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
Param * replace_outer_merge_support(PlannerInfo *root, MergeSupportFunc *msf)
Param * generate_new_exec_param(PlannerInfo *root, Oid paramtype, int32 paramtypmod, Oid paramcollation)
Param * replace_outer_agg(PlannerInfo *root, Aggref *agg)
Param * replace_outer_returning(PlannerInfo *root, ReturningExpr *rexpr)
Param * replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
Param * replace_outer_var(PlannerInfo *root, Var *var)
Param * replace_outer_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv)
int assign_special_exec_param(PlannerInfo *root)
ParseState * make_parsestate(ParseState *parentParseState)
ParseNamespaceItem * addRangeTableEntryForSubquery(ParseState *pstate, Query *subquery, Alias *alias, bool lateral, bool inFromCl)
#define planner_subplan_get_plan(root, subplan)
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define linitial_node(type, l)
static void * list_nth(const List *list, int n)
static ListCell * list_nth_cell(const List *list, int n)
#define forfour(cell1, list1, cell2, list2, cell3, list3, cell4, list4)
#define list_make1_int(x1)
#define list_make2(x1, x2)
FormData_pg_operator * Form_pg_operator
char * choose_plan_name(PlannerGlobal *glob, const char *name, bool always_number)
PlannerInfo * subquery_planner(PlannerGlobal *glob, Query *parse, char *plan_name, PlannerInfo *parent_root, bool hasRecursion, double tuple_fraction, SetOperationStmt *setops)
Path * get_cheapest_fractional_path(RelOptInfo *rel, double tuple_fraction)
static int64 DatumGetInt64(Datum X)
static Datum ObjectIdGetDatum(Oid X)
void replace_empty_jointree(Query *parse)
Query * preprocess_relation_rtes(PlannerInfo *root)
Expr * canonicalize_qual(Expr *qual, bool is_check)
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
RelOptInfo * fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind, Relids relids)
void OffsetVarNodes(Node *node, int offset, int sublevels_up)
void CombineRangeTables(List **dst_rtable, List **dst_perminfos, List *src_rtable, List *src_perminfos)
bool contain_aggs_of_level(Node *node, int levelsup)
void IncrementVarSublevelsUp(Node *node, int delta_sublevels_up, int min_sublevels_up)
Param * find_minmax_agg_replacement_param(PlannerInfo *root, Aggref *aggref)
CTEMaterialize ctematerialized
JoinExpr * convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, Relids available_rels)
static bool contain_dml_walker(Node *node, void *context)
static bool subpath_is_hashable(Path *path, bool unknownEqFalse)
static bool subplan_is_hashable(Plan *plan, bool unknownEqFalse)
static bool testexpr_is_hashable(Node *testexpr, List *param_ids)
Node * SS_process_sublinks(PlannerInfo *root, Node *expr, bool isQual)
void SS_process_ctes(PlannerInfo *root)
static const char * sublinktype_to_string(SubLinkType subLinkType)
void SS_identify_outer_params(PlannerInfo *root)
static bool finalize_agg_primnode(Node *node, finalize_primnode_context *context)
static bool contain_outer_selfref(Node *node)
static List * generate_subquery_vars(PlannerInfo *root, List *tlist, Index varno)
Node * SS_replace_correlation_vars(PlannerInfo *root, Node *expr)
static bool contain_dml(Node *node)
void SS_finalize_plan(PlannerInfo *root, Plan *plan)
static Query * convert_EXISTS_to_ANY(PlannerInfo *root, Query *subselect, Node **testexpr, List **paramIds)
static Node * process_sublinks_mutator(Node *node, process_sublinks_context *context)
static Node * replace_correlation_vars_mutator(Node *node, PlannerInfo *root)
static bool test_opexpr_is_hashable(OpExpr *testexpr, List *param_ids)
static List * generate_subquery_params(PlannerInfo *root, List *tlist, List **paramIds)
static Node * convert_testexpr(PlannerInfo *root, Node *testexpr, List *subst_nodes)
static Node * make_subplan(PlannerInfo *root, Query *orig_subquery, SubLinkType subLinkType, int subLinkId, Node *testexpr, bool isTopQual)
static bool contain_outer_selfref_walker(Node *node, Index *depth)
static bool hash_ok_operator(OpExpr *expr)
ScalarArrayOpExpr * convert_VALUES_to_ANY(PlannerInfo *root, Node *testexpr, Query *values)
static void inline_cte(PlannerInfo *root, CommonTableExpr *cte)
static bool simplify_EXISTS_query(PlannerInfo *root, Query *query)
static bool finalize_primnode(Node *node, finalize_primnode_context *context)
static void get_first_col_type(Plan *plan, Oid *coltype, int32 *coltypmod, Oid *colcollation)
static bool inline_cte_walker(Node *node, inline_cte_walker_context *context)
void SS_attach_initplans(PlannerInfo *root, Plan *plan)
JoinExpr * convert_EXISTS_sublink_to_join(PlannerInfo *root, SubLink *sublink, bool under_not, Relids available_rels)
void SS_compute_initplan_cost(List *init_plans, Cost *initplan_cost_p, bool *unsafe_initplans_p)
void SS_charge_for_initplans(PlannerInfo *root, RelOptInfo *final_rel)
static Node * convert_testexpr_mutator(Node *node, convert_testexpr_context *context)
Param * SS_make_initplan_output_param(PlannerInfo *root, Oid resulttype, int32 resulttypmod, Oid resultcollation)
static Node * build_subplan(PlannerInfo *root, Plan *plan, Path *path, PlannerInfo *subroot, List *plan_params, SubLinkType subLinkType, int subLinkId, Node *testexpr, List *testexpr_paramids, bool unknownEqFalse)
void SS_make_initplan_from_plan(PlannerInfo *root, PlannerInfo *subroot, Plan *plan, Param *prm)
static Bitmapset * finalize_plan(PlannerInfo *root, Plan *plan, int gather_param, Bitmapset *valid_params, Bitmapset *scan_params)
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
bool contain_vars_of_level(Node *node, int levelsup)
bool contain_var_clause(Node *node)
Relids pull_varnos_of_level(PlannerInfo *root, Node *node, int levelsup)
Relids pull_varnos(PlannerInfo *root, Node *node)