72 Node *testexpr,
bool adjust_testexpr,
163 Node *testexpr,
bool isTopQual)
166 bool simple_exists =
false;
167 double tuple_fraction;
209 tuple_fraction = 1.0;
212 tuple_fraction = 0.5;
214 tuple_fraction = 0.0;
222 false, tuple_fraction);
239 subLinkType, subLinkId,
240 testexpr,
true, isTopQual);
263 &newtestexpr, ¶mIds);
304 result = (
Node *) asplan;
322 Node *testexpr,
bool adjust_testexpr,
351 foreach(lc, plan_params)
391 result = (
Node *) prm;
406 result = (
Node *) prm;
418 elog(
ERROR,
"could not find array type for datatype %s",
426 result = (
Node *) prm;
481 result = (
Node *) splan;
490 if (testexpr && adjust_testexpr)
531 result = (
Node *) splan;
559 isInitPlan ?
"InitPlan" :
"SubPlan",
565 ptr +=
sprintf(ptr,
" (returns ");
606 result =
lappend(result, param);
718 double subquery_size;
728 if (subquery_size >
work_mem * 1024L)
789 if (opid == ARRAY_EQ_OP)
805 elog(
ERROR,
"cache lookup failed for operator %u", opid);
807 if (!optup->oprcanhash || !
func_strict(optup->oprcode))
928 elog(
ERROR,
"unexpected outer reference in CTE query");
1222 List *subquery_vars;
1279 rtr->rtindex = rtindex;
1285 subselect->targetList,
1299 result->
larg = NULL;
1302 result->
quals = quals;
1303 result->
alias = NULL;
1318 bool under_not,
Relids available_rels)
1424 upper_varnos = NULL;
1427 if (varno <= rtoffset)
1449 result->
larg = NULL;
1451 if (
list_length(subselect->jointree->fromlist) == 1)
1454 result->
rarg = (
Node *) subselect->jointree;
1456 result->
quals = whereClause;
1457 result->
alias = NULL;
1527 limit = (
Const *) node;
1647 leftargs = rightargs = opids = opcollations = newWhere =
NIL;
1648 foreach(lc, (
List *) whereClause)
1660 leftargs =
lappend(leftargs, leftarg);
1661 rightargs =
lappend(rightargs, rightarg);
1677 leftargs =
lappend(leftargs, rightarg);
1678 rightargs =
lappend(rightargs, leftarg);
1688 newWhere =
lappend(newWhere, expr);
1694 if (leftargs ==
NIL)
1747 tlist = testlist = paramids =
NIL;
1749 forfour(lc, leftargs, rc, rightargs, oc, opids, cc, opcollations)
1774 subselect->targetList = tlist;
1776 *paramIds = paramids;
1820 if (((
Var *) node)->varlevelsup > 0)
1831 if (((
Aggref *) node)->agglevelsup > 0)
1906 if (((
Aggref *) node)->agglevelsup > 0)
1949 newargs =
lappend(newargs, newarg);
1970 newargs =
lappend(newargs, newarg);
1983 (
void *) &locContext);
2018 outer_params = NULL;
2177 int locally_added_param;
2189 locally_added_param = -1;
2190 nestloop_params = NULL;
2197 initExtParam = initSetParam = NULL;
2213 valid_params =
bms_union(valid_params, initSetParam);
2232 if (gather_param < 0)
2233 elog(
ERROR,
"parallel-aware plan node is not below a Gather");
2313 if (gather_param >= 0)
2317 subquery_params, NULL);
2344 funccontext = context;
2387 int plan_id = ((
CteScan *) plan)->ctePlanId;
2392 elog(
ERROR,
"could not find plan for CteScan referencing plan ID %d",
2402 ((
CteScan *) plan)->cteParam);
2467 locally_added_param = mtplan->
epqParam;
2469 locally_added_param);
2471 locally_added_param);
2479 foreach(l, mtplan->
plans)
2496 foreach(l, ((
Append *) plan)->appendplans)
2530 foreach(l, ((
BitmapAnd *) plan)->bitmapplans)
2547 foreach(l, ((
BitmapOr *) plan)->bitmapplans)
2567 foreach(l, ((
NestLoop *) plan)->nestParams)
2602 locally_added_param);
2608 locally_added_param = ((
LockRows *) plan)->epqParam;
2610 locally_added_param);
2612 locally_added_param);
2647 locally_added_param = ((
Gather *) plan)->rescan_param;
2648 if (locally_added_param >= 0)
2651 locally_added_param);
2658 Assert(gather_param < 0);
2660 gather_param = locally_added_param;
2667 locally_added_param = ((
GatherMerge *) plan)->rescan_param;
2668 if (locally_added_param >= 0)
2671 locally_added_param);
2678 Assert(gather_param < 0);
2680 gather_param = locally_added_param;
2696 elog(
ERROR,
"unrecognized node type: %d",
2708 if (nestloop_params)
2714 bms_union(nestloop_params, valid_params),
2737 if (locally_added_param >= 0)
2740 locally_added_param);
2746 elog(
ERROR,
"plan should not reference subplan's variable");
2789 int paramid = ((
Param *) node)->paramid;
2874 Oid resulttype,
int32 resulttypmod,
2875 Oid resultcollation)
2878 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)
bool query_tree_walker(Query *query, bool(*walker)(), void *context, int flags)
#define SizeofHeapTupleHeader
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)
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)
JoinExpr * convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, Relids available_rels)
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)
static Node * build_subplan(PlannerInfo *root, Plan *plan, PlannerInfo *subroot, List *plan_params, SubLinkType subLinkType, int subLinkId, Node *testexpr, bool adjust_testexpr, bool unknownEqFalse)
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
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
Relids pull_varnos(Node *node)
List * lappend_int(List *list, int datum)
List * lappend(List *list, void *datum)
RangeTblEntry * addRangeTableEntryForSubquery(ParseState *pstate, Query *subquery, Alias *alias, bool lateral, bool inFromCl)
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 testexpr_is_hashable(Node *testexpr)
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)
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 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)