72 Node *testexpr,
List *testexpr_paramids,
165 Node *testexpr,
bool isTopQual)
168 bool simple_exists =
false;
169 double tuple_fraction;
211 tuple_fraction = 1.0;
214 tuple_fraction = 0.5;
216 tuple_fraction = 0.0;
224 false, tuple_fraction);
241 subLinkType, subLinkId,
242 testexpr,
NIL, isTopQual);
265 &newtestexpr, ¶mIds);
305 result = (
Node *) asplan;
324 Node *testexpr,
List *testexpr_paramids,
353 foreach(lc, plan_params)
393 result = (
Node *) prm;
408 result = (
Node *) prm;
420 elog(
ERROR,
"could not find array type for datatype %s",
428 result = (
Node *) prm;
483 result = (
Node *) splan;
492 if (testexpr && testexpr_paramids ==
NIL)
506 splan->
paramIds = testexpr_paramids;
536 result = (
Node *) splan;
564 isInitPlan ?
"InitPlan" :
"SubPlan",
570 ptr +=
sprintf(ptr,
" (returns ");
611 result =
lappend(result, param);
726 double subquery_size;
737 if (subquery_size > hash_mem * 1024L)
751 double subquery_size;
760 subquery_size = path->
rows *
762 if (subquery_size > hash_mem * 1024L)
853 if (opid == ARRAY_EQ_OP)
869 elog(
ERROR,
"cache lookup failed for operator %u", opid);
871 if (!optup->oprcanhash || !
func_strict(optup->oprcode))
992 elog(
ERROR,
"unexpected outer reference in CTE query");
1287 List *subquery_vars;
1337 rte = nsitem->p_rte;
1345 rtr->rtindex = rtindex;
1351 subselect->targetList,
1365 result->
larg = NULL;
1368 result->
quals = quals;
1369 result->
alias = NULL;
1384 bool under_not,
Relids available_rels)
1490 upper_varnos = NULL;
1493 if (varno <= rtoffset)
1515 result->
larg = NULL;
1517 if (
list_length(subselect->jointree->fromlist) == 1)
1520 result->
rarg = (
Node *) subselect->jointree;
1522 result->
quals = whereClause;
1523 result->
alias = NULL;
1593 limit = (
Const *) node;
1713 leftargs = rightargs = opids = opcollations = newWhere =
NIL;
1714 foreach(lc, (
List *) whereClause)
1726 leftargs =
lappend(leftargs, leftarg);
1727 rightargs =
lappend(rightargs, rightarg);
1743 leftargs =
lappend(leftargs, rightarg);
1744 rightargs =
lappend(rightargs, leftarg);
1754 newWhere =
lappend(newWhere, expr);
1760 if (leftargs ==
NIL)
1813 tlist = testlist = paramids =
NIL;
1815 forfour(lc, leftargs, rc, rightargs, oc, opids, cc, opcollations)
1840 subselect->targetList = tlist;
1842 *paramIds = paramids;
1886 if (((
Var *) node)->varlevelsup > 0)
1897 if (((
Aggref *) node)->agglevelsup > 0)
1972 if (((
Aggref *) node)->agglevelsup > 0)
2015 newargs =
lappend(newargs, newarg);
2036 newargs =
lappend(newargs, newarg);
2049 (
void *) &locContext);
2084 outer_params = NULL;
2243 int locally_added_param;
2255 locally_added_param = -1;
2256 nestloop_params = NULL;
2263 initExtParam = initSetParam = NULL;
2279 valid_params =
bms_union(valid_params, initSetParam);
2298 if (gather_param < 0)
2299 elog(
ERROR,
"parallel-aware plan node is not below a Gather");
2385 if (gather_param >= 0)
2389 subquery_params, NULL);
2416 funccontext = context;
2459 int plan_id = ((
CteScan *) plan)->ctePlanId;
2464 elog(
ERROR,
"could not find plan for CteScan referencing plan ID %d",
2474 ((
CteScan *) plan)->cteParam);
2539 locally_added_param = mtplan->
epqParam;
2541 locally_added_param);
2543 locally_added_param);
2551 foreach(l, mtplan->
plans)
2568 foreach(l, ((
Append *) plan)->appendplans)
2602 foreach(l, ((
BitmapAnd *) plan)->bitmapplans)
2619 foreach(l, ((
BitmapOr *) plan)->bitmapplans)
2639 foreach(l, ((
NestLoop *) plan)->nestParams)
2674 locally_added_param);
2680 locally_added_param = ((
LockRows *) plan)->epqParam;
2682 locally_added_param);
2684 locally_added_param);
2719 locally_added_param = ((
Gather *) plan)->rescan_param;
2720 if (locally_added_param >= 0)
2723 locally_added_param);
2730 Assert(gather_param < 0);
2732 gather_param = locally_added_param;
2739 locally_added_param = ((
GatherMerge *) plan)->rescan_param;
2740 if (locally_added_param >= 0)
2743 locally_added_param);
2750 Assert(gather_param < 0);
2752 gather_param = locally_added_param;
2769 elog(
ERROR,
"unrecognized node type: %d",
2781 if (nestloop_params)
2787 bms_union(nestloop_params, valid_params),
2810 if (locally_added_param >= 0)
2813 locally_added_param);
2819 elog(
ERROR,
"plan should not reference subplan's variable");
2862 int paramid = ((
Param *) node)->paramid;
2947 Oid resulttype,
int32 resulttypmod,
2948 Oid resultcollation)
2951 resulttypmod, resultcollation);
#define list_make2(x1, x2)
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)
Relids pull_varnos(PlannerInfo *root, Node *node)
bool query_tree_walker(Query *query, bool(*walker)(), void *context, int flags)
#define SizeofHeapTupleHeader
static Node * build_subplan(PlannerInfo *root, Plan *plan, PlannerInfo *subroot, List *plan_params, SubLinkType subLinkType, int subLinkId, Node *testexpr, List *testexpr_paramids, bool unknownEqFalse)
int bms_first_member(Bitmapset *a)
#define IsA(nodeptr, _type_)
static Node * convert_testexpr_mutator(Node *node, convert_testexpr_context *context)
void OffsetVarNodes(Node *node, int offset, int sublevels_up)
Oid get_commutator(Oid opno)
Node * expression_tree_mutator(Node *node, Node *(*mutator)(), void *context)
#define planner_subplan_get_plan(root, subplan)
Bitmapset * bms_copy(const Bitmapset *a)
Param * generate_new_exec_param(PlannerInfo *root, Oid paramtype, int32 paramtypmod, Oid paramcollation)
#define QTW_EXAMINE_RTES_AFTER
void IncrementVarSublevelsUp(Node *node, int delta_sublevels_up, int min_sublevels_up)
static bool contain_dml_walker(Node *node, void *context)
static ListCell * lnext(const List *l, const ListCell *c)
static ListCell * list_nth_cell(const List *list, int n)
bool contain_exec_param(Node *clause, List *param_ids)
static void get_first_col_type(Plan *plan, Oid *coltype, int32 *coltypmod, Oid *colcollation)
PlannerInfo * parent_root
static bool is_orclause(const void *clause)
#define QTW_EXAMINE_RTES_BEFORE
#define castNode(_type_, nodeptr)
static bool subplan_is_hashable(Plan *plan)
int32 exprTypmod(const Node *expr)
char * psprintf(const char *fmt,...)
static bool is_andclause(const void *clause)
Bitmapset * bms_difference(const Bitmapset *a, const Bitmapset *b)
void SS_charge_for_initplans(PlannerInfo *root, RelOptInfo *final_rel)
Var * makeVarFromTargetEntry(Index varno, TargetEntry *tle)
static List * generate_subquery_params(PlannerInfo *root, List *tlist, List **paramIds)
List * list_copy(const List *oldlist)
List * list_concat(List *list1, const List *list2)
Node * eval_const_expressions(PlannerInfo *root, Node *node)
Node * SS_process_sublinks(PlannerInfo *root, Node *expr, bool isQual)
static bool test_opexpr_is_hashable(OpExpr *testexpr, List *param_ids)
JoinExpr * convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, Relids available_rels)
bool contain_var_clause(Node *node)
bool contain_volatile_functions(Node *clause)
int assign_special_exec_param(PlannerInfo *root)
static bool hash_ok_operator(OpExpr *expr)
Expr * make_orclause(List *orclauses)
#define linitial_node(type, l)
static bool simplify_EXISTS_query(PlannerInfo *root, Query *query)
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)
void replace_empty_jointree(Query *parse)
struct inline_cte_walker_context inline_cte_walker_context
static Node * process_sublinks_mutator(Node *node, process_sublinks_context *context)
Const * makeNullConst(Oid consttype, int32 consttypmod, Oid constcollid)
JoinExpr * convert_EXISTS_sublink_to_join(PlannerInfo *root, SubLink *sublink, bool under_not, Relids available_rels)
ParseState * make_parsestate(ParseState *parentParseState)
Plan * create_plan(PlannerInfo *root, Path *best_path)
bool contain_subplans(Node *clause)
Alias * makeAlias(const char *aliasname, List *colnames)
Param * replace_outer_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv)
bool op_hashjoinable(Oid opno, Oid inputtype)
#define ObjectIdGetDatum(X)
Param * replace_outer_var(PlannerInfo *root, Var *var)
static void * list_nth(const List *list, int n)
Bitmapset * bms_join(Bitmapset *a, Bitmapset *b)
static bool finalize_primnode(Node *node, finalize_primnode_context *context)
Bitmapset * rewindPlanIDs
bool hasAlternativeSubPlans
static void inline_cte(PlannerInfo *root, CommonTableExpr *cte)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
RelOptInfo * fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind, Relids relids)
struct Path * cheapest_total_path
static List * generate_subquery_vars(PlannerInfo *root, List *tlist, Index varno)
Expr * make_andclause(List *andclauses)
Plan * materialize_finished_plan(Plan *subplan)
Expr * canonicalize_qual(Expr *qual, bool is_check)
static Bitmapset * finalize_plan(PlannerInfo *root, Plan *plan, int gather_param, Bitmapset *valid_params, Bitmapset *scan_params)
void SS_process_ctes(PlannerInfo *root)
#define list_make1_int(x1)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
struct convert_testexpr_context convert_testexpr_context
List * lappend_int(List *list, int datum)
List * lappend(List *list, void *datum)
bool bms_is_empty(const Bitmapset *a)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
static Query * convert_EXISTS_to_ANY(PlannerInfo *root, Query *subselect, Node **testexpr, List **paramIds)
Oid get_promoted_array_type(Oid typid)
static bool finalize_agg_primnode(Node *node, finalize_primnode_context *context)
void ReleaseSysCache(HeapTuple tuple)
Expr * make_ands_explicit(List *andclauses)
List * make_ands_implicit(Expr *clause)
static bool contain_dml(Node *node)
static bool contain_outer_selfref(Node *node)
void bms_free(Bitmapset *a)
struct process_sublinks_context process_sublinks_context
#define HeapTupleIsValid(tuple)
#define Assert(condition)
CTEMaterialize ctematerialized
void SS_identify_outer_params(PlannerInfo *root)
bool contain_vars_of_level(Node *node, int levelsup)
Param * SS_make_initplan_output_param(PlannerInfo *root, Oid resulttype, int32 resulttypmod, Oid resultcollation)
void cost_subplan(PlannerInfo *root, SubPlan *subplan, Plan *plan)
Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b)
Oid exprType(const Node *expr)
bool expression_tree_walker(Node *node, bool(*walker)(), void *context)
static int list_length(const List *l)
Node * SS_replace_correlation_vars(PlannerInfo *root, Node *expr)
Oid exprCollation(const Node *expr)
void SS_attach_initplans(PlannerInfo *root, Plan *plan)
Bitmapset * bms_add_member(Bitmapset *a, int x)
void SS_make_initplan_from_plan(PlannerInfo *root, PlannerInfo *subroot, Plan *plan, Param *prm)
FormData_pg_operator * Form_pg_operator
bool func_strict(Oid funcid)
bool contain_aggs_of_level(Node *node, int levelsup)
#define forfour(cell1, list1, cell2, list2, cell3, list3, cell4, list4)
Bitmapset * bms_del_members(Bitmapset *a, const Bitmapset *b)
static bool testexpr_is_hashable(Node *testexpr, List *param_ids)
ParseNamespaceItem * addRangeTableEntryForSubquery(ParseState *pstate, Query *subquery, Alias *alias, bool lateral, bool inFromCl)
bool ExecMaterializesOutput(NodeTag plantype)
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
void SS_finalize_plan(PlannerInfo *root, Plan *plan)
Bitmapset * bms_del_member(Bitmapset *a, int x)
Param * replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
struct finalize_primnode_context finalize_primnode_context
PlannerInfo * subquery_planner(PlannerGlobal *glob, Query *parse, PlannerInfo *parent_root, bool hasRecursion, double tuple_fraction)
static Node * replace_correlation_vars_mutator(Node *node, PlannerInfo *root)
static bool subpath_is_hashable(Path *path)
static bool inline_cte_walker(Node *node, inline_cte_walker_context *context)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
Path * get_cheapest_fractional_path(RelOptInfo *rel, double tuple_fraction)
static bool contain_outer_selfref_walker(Node *node, Index *depth)
static struct subre * parse(struct vars *, int, int, struct state *, struct state *)
Param * replace_outer_agg(PlannerInfo *root, Aggref *agg)