72 Node *testexpr,
List *testexpr_paramids,
124 if (
plan->targetlist)
166 Node *testexpr,
bool isTopQual)
169 bool simple_exists =
false;
170 double tuple_fraction;
213 tuple_fraction = 1.0;
216 tuple_fraction = 0.5;
218 tuple_fraction = 0.0;
226 root,
false, tuple_fraction, NULL);
229 plan_params =
root->plan_params;
243 subroot, plan_params,
244 subLinkType, subLinkId,
245 testexpr,
NIL, isTopQual);
268 &newtestexpr, ¶mIds);
276 root,
false, 0.0, NULL);
279 plan_params =
root->plan_params;
298 subroot, plan_params,
310 result = (
Node *) asplan;
311 root->hasAlternativeSubPlans =
true;
329 Node *testexpr,
List *testexpr_paramids,
359 foreach(lc, plan_params)
403 result = (
Node *) prm;
418 result = (
Node *) prm;
430 elog(
ERROR,
"could not find array type for datatype %s",
438 result = (
Node *) prm;
493 result = (
Node *) splan;
502 if (testexpr && testexpr_paramids ==
NIL)
516 splan->
paramIds = testexpr_paramids;
546 result = (
Node *) splan;
604 result =
lappend(result, param);
749 path->pathtarget->width,
842 if (opid == ARRAY_EQ_OP ||
843 opid == RECORD_EQ_OP)
858 elog(
ERROR,
"cache lookup failed for operator %u", opid);
860 if (!optup->oprcanhash || !
func_strict(optup->oprcode))
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 &&
1202 rte->security_barrier =
false;
1207 rte->self_reference =
false;
1208 rte->coltypes =
NIL;
1209 rte->coltypmods =
NIL;
1210 rte->colcollations =
NIL;
1246 values->limitCount != NULL ||
1247 values->limitOffset != NULL ||
1255 opno = ((
OpExpr *) testexpr)->opno;
1256 inputcollid = ((
OpExpr *) testexpr)->inputcollid;
1346 List *subquery_vars;
1349 Relids sub_ref_outer_relids;
1405 rte = nsitem->p_rte;
1413 rtr->rtindex = rtindex;
1433 result->
larg = NULL;
1435 result->usingClause =
NIL;
1436 result->join_using_alias = NULL;
1437 result->
quals = quals;
1438 result->alias = NULL;
1453 bool under_not,
Relids available_rels)
1537 MemSet(&subroot, 0,
sizeof(subroot));
1538 subroot.type = T_PlannerInfo;
1539 subroot.glob =
root->glob;
1540 subroot.parse = subselect;
1589 upper_varnos = NULL;
1593 if (varno <= rtoffset)
1611 subselect->
rtable, subselect->rteperminfos);
1619 result->
larg = NULL;
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;
1727 foreach(lc, query->
rtable)
1738 Assert(query->hasGroupRTE);
1740 query->hasGroupRTE =
false;
1831 MemSet(&subroot, 0,
sizeof(subroot));
1832 subroot.type = T_PlannerInfo;
1834 subroot.
parse = subselect;
1846 leftargs = rightargs = opids = opcollations = newWhere =
NIL;
1847 foreach(lc, (
List *) whereClause)
1859 leftargs =
lappend(leftargs, leftarg);
1860 rightargs =
lappend(rightargs, rightarg);
1862 opcollations =
lappend_oid(opcollations, expr->inputcollid);
1876 leftargs =
lappend(leftargs, rightarg);
1877 rightargs =
lappend(rightargs, leftarg);
1879 opcollations =
lappend_oid(opcollations, expr->inputcollid);
1887 newWhere =
lappend(newWhere, expr);
1893 if (leftargs ==
NIL)
1908 if (
root->parse->hasAggs &&
1946 tlist = testlist = paramids =
NIL;
1948 forfour(lc, leftargs, rc, rightargs, oc, opids, cc, opcollations)
1975 *paramIds = paramids;
2020 if (((
Var *) node)->varlevelsup > 0)
2031 if (((
Aggref *) node)->agglevelsup > 0)
2117 if (((
Aggref *) node)->agglevelsup > 0)
2170 newargs =
lappend(newargs, newarg);
2191 newargs =
lappend(newargs, newarg);
2230 if (
root->glob->paramExecTypes ==
NIL)
2239 outer_params = NULL;
2240 for (proot =
root->parent_root; proot != NULL; proot = proot->parent_root)
2266 root->outer_params = outer_params;
2287 bool unsafe_initplans;
2299 &initplan_cost, &unsafe_initplans);
2310 if (unsafe_initplans)
2318 if (unsafe_initplans)
2349 Cost *initplan_cost_p,
2350 bool *unsafe_initplans_p)
2353 bool unsafe_initplans;
2362 unsafe_initplans =
false;
2363 foreach(lc, init_plans)
2369 unsafe_initplans =
true;
2371 *initplan_cost_p = initplan_cost;
2372 *unsafe_initplans_p = unsafe_initplans;
2448 int locally_added_param;
2460 locally_added_param = -1;
2461 nestloop_params = NULL;
2468 initExtParam = initSetParam = NULL;
2469 foreach(l,
plan->initPlan)
2484 valid_params =
bms_union(valid_params, initSetParam);
2501 if (
plan->parallel_aware)
2503 if (gather_param < 0)
2504 elog(
ERROR,
"parallel-aware plan node is not below a Gather");
2541 case T_IndexOnlyScan:
2555 case T_BitmapIndexScan:
2565 case T_BitmapHeapScan:
2577 case T_TidRangeScan:
2583 case T_SubqueryScan:
2592 if (gather_param >= 0)
2596 subquery_params, NULL);
2607 case T_FunctionScan:
2623 funccontext = context;
2629 rtfunc->funcparams = funccontext.
paramids;
2641 case T_TableFuncScan:
2671 elog(
ERROR,
"could not find plan for CteScan referencing plan ID %d",
2689 case T_WorkTableScan:
2696 case T_NamedTuplestoreScan:
2745 locally_added_param = mtplan->
epqParam;
2747 locally_added_param);
2749 locally_added_param);
2861 case T_RecursiveUnion:
2865 locally_added_param);
2873 locally_added_param);
2875 locally_added_param);
2910 locally_added_param = ((
Gather *)
plan)->rescan_param;
2911 if (locally_added_param >= 0)
2914 locally_added_param);
2921 Assert(gather_param < 0);
2923 gather_param = locally_added_param;
2931 if (locally_added_param >= 0)
2934 locally_added_param);
2941 Assert(gather_param < 0);
2943 gather_param = locally_added_param;
2956 case T_IncrementalSort:
2964 elog(
ERROR,
"unrecognized node type: %d",
2976 if (nestloop_params)
2982 bms_union(nestloop_params, valid_params),
3005 if (locally_added_param >= 0)
3008 locally_added_param);
3014 elog(
ERROR,
"plan should not reference subplan's variable");
3032 return plan->allParam;
3048 int paramid = ((
Param *) node)->paramid;
3068 if (aggparam != NULL)
3150 Oid resulttype,
int32 resulttypmod,
3151 Oid resultcollation)
3154 resulttypmod, resultcollation);
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 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)
Assert(PointerIsAligned(start, uint64))
#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)
static struct subre * parse(struct vars *v, int stopper, int type, struct state *init, struct state *final)
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
struct Path * cheapest_total_path
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)
struct process_sublinks_context process_sublinks_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)
struct convert_testexpr_context convert_testexpr_context
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)
struct finalize_primnode_context finalize_primnode_context
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)
struct inline_cte_walker_context inline_cte_walker_context
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)