114#define NUM_EXEC_TLIST(parentplan) ((parentplan)->plan_rows)
115#define NUM_EXEC_QUAL(parentplan) ((parentplan)->plan_rows * 2.0)
124#define ISREGCLASSCONST(con) \
125 (((con)->consttype == REGCLASSOID || (con)->consttype == OIDOID) && \
128#define fix_scan_list(root, lst, rtoffset, num_exec) \
129 ((List *) fix_scan_expr(root, (Node *) (lst), rtoffset, num_exec))
159 int rtoffset,
double num_exec);
188 Index acceptable_rel,
205 Index resultRelation,
305 foreach(
lc,
root->rowMarks)
319 newrc->rti += rtoffset;
320 newrc->prti += rtoffset;
330 foreach(
lc,
root->append_rel_list)
335 appinfo->parent_relid += rtoffset;
336 appinfo->child_relid += rtoffset;
348 if (
root->hasAlternativeSubPlans)
350 root->isAltSubplan = (
bool *)
352 root->isUsedSubplan = (
bool *)
367 if (
root->hasAlternativeSubPlans)
409 if (
root->glob->finalrtable !=
NIL)
417 rtinfo->dummy = recursing;
430 foreach(
lc,
root->parse->rtable)
450 foreach(
lc,
root->parse->rtable)
490 else if (recursing ||
615 if (
rte->perminfoindex > 0)
629 newrte->perminfoindex = 0;
647 plan->plan_node_id =
root->glob->lastPlanNodeId++;
659 splan->scan.plan.targetlist =
662 splan->scan.plan.qual =
672 splan->scan.plan.targetlist =
675 splan->scan.plan.qual =
688 splan->scan.plan.targetlist =
691 splan->scan.plan.qual =
697 splan->indexqualorig =
700 splan->indexorderby =
703 splan->indexorderbyorig =
725 splan->indexqualorig =
735 splan->scan.plan.targetlist =
738 splan->scan.plan.qual =
741 splan->bitmapqualorig =
751 splan->scan.plan.targetlist =
754 splan->scan.plan.qual =
767 splan->scan.plan.targetlist =
770 splan->scan.plan.qual =
773 splan->tidrangequals =
788 splan->scan.plan.targetlist =
791 splan->scan.plan.qual =
803 splan->scan.plan.targetlist =
806 splan->scan.plan.qual =
819 splan->scan.plan.targetlist =
822 splan->scan.plan.qual =
825 splan->values_lists =
835 splan->scan.plan.targetlist =
838 splan->scan.plan.qual =
848 splan->scan.plan.targetlist =
851 splan->scan.plan.qual =
861 splan->scan.plan.targetlist =
864 splan->scan.plan.qual =
943 foreach(l,
splan->rowMarks)
948 rc->
prti += rtoffset;
1010 wplan->runCondition,
1020 wplan->startOffset =
1025 wplan->runCondition,
1029 wplan->runConditionOrig,
1067 foreach(l,
splan->plan.targetlist)
1072 if (var &&
IsA(var,
Var))
1078 else if (var->
varno == 0)
1088 splan->plan.targetlist =
1096 splan->resconstantqual =
1113 splan->withCheckOptionLists =
1117 if (
splan->returningLists)
1170 splan->onConflictSet =
1184 splan->exclRelTlist =
1198 if (
splan->mergeActionLists !=
NIL)
1231 foreach(l, mergeActionList)
1246 (
List *) action->qual,
1255 mergeJoinCondition = (
Node *)
1257 (
List *) mergeJoinCondition,
1268 splan->nominalRelation += rtoffset;
1269 if (
splan->rootRelation)
1270 splan->rootRelation += rtoffset;
1271 splan->exclRelRTI += rtoffset;
1273 foreach(l,
splan->resultRelations)
1277 foreach(l,
splan->rowMarks)
1281 rc->
rti += rtoffset;
1282 rc->
prti += rtoffset;
1289 root->glob->resultRelations =
1291 splan->resultRelations);
1292 if (
splan->rootRelation)
1294 root->glob->resultRelations =
1296 splan->rootRelation);
1322 foreach(l,
splan->bitmapplans)
1337 foreach(l,
splan->bitmapplans)
1346 elog(
ERROR,
"unrecognized node type: %d",
1391 foreach(
lc,
plan->indextlist)
1401 plan->scan.scanrelid += rtoffset;
1402 plan->scan.plan.targetlist = (
List *)
1404 (
Node *)
plan->scan.plan.targetlist,
1469 scanrelid =
plan->scan.scanrelid + rtoffset;
1482 plan->scan.scanrelid += rtoffset;
1483 plan->scan.plan.targetlist =
1486 plan->scan.plan.qual =
1537 if (
plan->scan.plan.qual !=
NIL)
1550 if (
ptle->resjunk !=
ctle->resjunk)
1641 if (
fscan->scan.scanrelid > 0)
1642 fscan->scan.scanrelid += rtoffset;
1644 if (
fscan->fdw_scan_tlist !=
NIL ||
fscan->scan.scanrelid == 0)
1682 fscan->fdw_scan_tlist =
1692 fscan->scan.plan.targetlist =
1695 fscan->scan.plan.qual =
1701 fscan->fdw_recheck_quals =
1710 if (
fscan->resultRelation > 0)
1711 fscan->resultRelation += rtoffset;
1726 if (
cscan->scan.scanrelid > 0)
1727 cscan->scan.scanrelid += rtoffset;
1729 if (
cscan->custom_scan_tlist !=
NIL ||
cscan->scan.scanrelid == 0)
1757 cscan->custom_scan_tlist =
1764 cscan->scan.plan.targetlist =
1767 cscan->scan.plan.qual =
1770 cscan->custom_exprs =
1776 foreach(
lc,
cscan->custom_plans)
1805 Assert(part_prune_index >= 0 &&
1816 foreach(l2, prune_infos)
1838 prelinfo->leafpart_rti_map[
i] += rtoffset;
1839 if (
prelinfo->initial_pruning_steps)
1874 foreach(l,
aplan->appendplans)
1918 if (
aplan->part_prune_index >= 0)
1919 aplan->part_prune_index =
1951 foreach(l,
mplan->mergeplans)
1996 if (
mplan->part_prune_index >= 0)
1997 mplan->part_prune_index =
2088 ((
Aggref *) node)->aggfnoid);
2137 root->glob->relationOids =
2155 foreach(
lc, g->refs)
2182 int colno = p->
paramid & 0xFFFF;
2278 if (rtoffset != 0 ||
2279 root->multiexpr_params !=
NIL ||
2280 root->glob->lastPHId != 0 ||
2282 root->hasAlternativeSubPlans)
2324 if (var->varnosyn > 0)
2325 var->varnosyn += context->
rtoffset;
2326 return (
Node *) var;
2350 return (
Node *) cexpr;
2392 Plan *outer_plan = join->plan.lefttree;
2393 Plan *inner_plan = join->plan.righttree;
2422 foreach(
lc,
nl->nestParams)
2443 elog(
ERROR,
"NestLoopParam was not reduced to a simple Var");
2495 join->plan.targetlist,
2511 pfree(outer_itlist);
2512 pfree(inner_itlist);
2552 root->group_rtindex > 0 &&
2566 foreach(l,
plan->targetlist)
2572 if (
tle->ressortgroupref != 0)
2576 tle->ressortgroupref,
2608 pfree(subplan_itlist);
2623 if (
plan->lefttree->extParam)
2631 foreach(l,
proot->init_plans)
2748 foreach(l,
plan->targetlist)
2821 itlist->has_ph_vars =
false;
2822 itlist->has_non_vars =
false;
2837 vinfo->varnullingrels = var->varnullingrels;
2841 itlist->has_ph_vars =
true;
2843 itlist->has_non_vars =
true;
2872 itlist->has_ph_vars =
false;
2873 itlist->has_non_vars =
false;
2890 vinfo->varnullingrels = var->varnullingrels;
2895 itlist->has_ph_vars =
true;
2918 int newvarno,
int rtoffset,
2921 int varno = var->
varno;
2930 if (
vinfo->varno == varno &&
vinfo->varattno == varattno)
2949 if (!(varattno <= 0 ||
2953 elog(
ERROR,
"wrong varnullingrels %s (expected %s) for Var %d/%d",
2958 newvar->varno = newvarno;
2960 if (
newvar->varnosyn > 0)
2961 newvar->varnosyn += rtoffset;
3007 elog(
ERROR,
"wrong phnullingrels %s (expected %s) for PlaceHolderVar %d",
3090 if (
tle->ressortgroupref == sortgroupref &&
3153 Index acceptable_rel,
3190 elog(
ERROR,
"variable returning old/new found outside RETURNING list");
3192 elog(
ERROR,
"wrong varno %d (expected %d) for variable returning old/new",
3225 if (var->varnosyn > 0)
3226 var->varnosyn += context->
rtoffset;
3227 return (
Node *) var;
3231 elog(
ERROR,
"variable not found in subplan target lists");
3359 elog(
ERROR,
"variable not found in subplan target list");
3447 Index resultRelation,
3503 elog(
ERROR,
"WindowFunc not found in subplan target lists");
3568 if (
root->minmax_aggs !=
NIL &&
3574 foreach(
lc,
root->minmax_aggs)
3681 List **relationOids,
3683 bool *hasRowSecurity)
3689 MemSet(&glob, 0,
sizeof(glob));
3757 if (query->hasRowSecurity)
Bitmapset * bms_make_singleton(int x)
Bitmapset * bms_intersect(const Bitmapset *a, const Bitmapset *b)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_add_member(Bitmapset *a, int x)
Bitmapset * bms_offset_members(const Bitmapset *a, int offset)
#define Assert(condition)
#define FLEXIBLE_ARRAY_MEMBER
#define MemSet(start, val, len)
#define OidIsValid(objectId)
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
bool equal(const void *a, const void *b)
#define palloc_object(type)
List * lappend(List *list, void *datum)
List * list_concat(List *list1, const List *list2)
List * lappend_int(List *list, int datum)
List * lappend_oid(List *list, Oid datum)
Datum lca(PG_FUNCTION_ARGS)
Var * makeVarFromTargetEntry(int varno, TargetEntry *tle)
Var * makeVar(int varno, AttrNumber varattno, Oid vartype, int32 vartypmod, Oid varcollid, Index varlevelsup)
Const * makeNullConst(Oid consttype, int32 consttypmod, Oid constcollid)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
TargetEntry * flatCopyTargetEntry(TargetEntry *src_tle)
void pfree(void *pointer)
void * palloc0(Size size)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
Oid exprCollation(const Node *expr)
void set_sa_opfuncid(ScalarArrayOpExpr *opexpr)
void set_opfuncid(OpExpr *opexpr)
#define expression_tree_mutator(n, m, c)
#define query_tree_walker(q, w, c, f)
#define expression_tree_walker(n, w, c)
#define QTW_EXAMINE_RTES_BEFORE
#define IsA(nodeptr, _type_)
#define DO_AGGSPLIT_COMBINE(as)
@ AGGSPLIT_FINAL_DESERIAL
@ AGGSPLIT_INITIAL_SERIAL
char * bmsToString(const Bitmapset *bms)
RTEPermissionInfo * getRTEPermissionInfo(List *rteperminfos, RangeTblEntry *rte)
RTEPermissionInfo * addRTEPermissionInfo(List **rteperminfos, RangeTblEntry *rte)
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define forboth(cell1, list1, cell2, list2)
#define foreach_current_index(var_or_cell)
#define forthree(cell1, list1, cell2, list2, cell3, list3)
static void * list_nth(const List *list, int n)
#define list_nth_node(type, list, n)
void mark_partial_aggref(Aggref *agg, AggSplit aggsplit)
@ SUBQUERY_SCAN_NONTRIVIAL
static Oid DatumGetObjectId(Datum X)
static Datum ObjectIdGetDatum(Oid X)
#define IS_SPECIAL_VARNO(varno)
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
RelOptInfo * fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind, Relids relids)
Node * remove_nulling_relids(Node *node, const Bitmapset *removable_relids, const Bitmapset *except_relids)
void record_plan_type_dependency(PlannerInfo *root, Oid typid)
#define NUM_EXEC_QUAL(parentplan)
static void set_hash_references(PlannerInfo *root, Plan *plan, int rtoffset)
static void fix_expr_common(PlannerInfo *root, Node *node)
static void record_elided_node(PlannerGlobal *glob, int plan_node_id, NodeTag elided_type, Bitmapset *relids)
static void add_rtes_to_flat_rtable(PlannerInfo *root, bool recursing)
static Node * fix_join_expr_mutator(Node *node, fix_join_expr_context *context)
static void add_rte_to_flat_rtable(PlannerGlobal *glob, List *rteperminfos, RangeTblEntry *rte)
static Plan * set_append_references(PlannerInfo *root, Append *aplan, int rtoffset)
Plan * set_plan_references(PlannerInfo *root, Plan *plan)
static Plan * set_mergeappend_references(PlannerInfo *root, MergeAppend *mplan, int rtoffset)
static List * set_returning_clause_references(PlannerInfo *root, List *rlist, Plan *topplan, Index resultRelation, int rtoffset)
static Node * fix_param_node(PlannerInfo *root, Param *p)
void record_plan_function_dependency(PlannerInfo *root, Oid funcid)
static Relids offset_relid_set(Relids relids, int rtoffset)
static bool flatten_rtes_walker(Node *node, flatten_rtes_walker_context *cxt)
static indexed_tlist * build_tlist_index(List *tlist)
static List * set_windowagg_runcondition_references(PlannerInfo *root, List *runcondition, Plan *plan)
bool trivial_subqueryscan(SubqueryScan *plan)
static void set_upper_references(PlannerInfo *root, Plan *plan, int rtoffset)
static Node * fix_upper_expr(PlannerInfo *root, Node *node, indexed_tlist *subplan_itlist, int newvarno, int rtoffset, double num_exec)
static Var * search_indexed_tlist_for_sortgroupref(Expr *node, Index sortgroupref, indexed_tlist *itlist, int newvarno)
static void flatten_unplanned_rtes(PlannerGlobal *glob, RangeTblEntry *rte)
static void set_param_references(PlannerInfo *root, Plan *plan)
static Var * search_indexed_tlist_for_non_var(Expr *node, indexed_tlist *itlist, int newvarno)
static Node * fix_upper_expr_mutator(Node *node, fix_upper_expr_context *context)
Param * find_minmax_agg_replacement_param(PlannerInfo *root, Aggref *aggref)
static Node * fix_scan_expr_mutator(Node *node, fix_scan_expr_context *context)
static void set_foreignscan_references(PlannerInfo *root, ForeignScan *fscan, int rtoffset)
static Plan * set_subqueryscan_references(PlannerInfo *root, SubqueryScan *plan, int rtoffset)
static Var * search_indexed_tlist_for_phv(PlaceHolderVar *phv, indexed_tlist *itlist, int newvarno, NullingRelsMatch nrm_match)
static Plan * set_indexonlyscan_references(PlannerInfo *root, IndexOnlyScan *plan, int rtoffset)
static List * fix_join_expr(PlannerInfo *root, List *clauses, indexed_tlist *outer_itlist, indexed_tlist *inner_itlist, Index acceptable_rel, int rtoffset, NullingRelsMatch nrm_match, double num_exec)
static Node * convert_combining_aggrefs(Node *node, void *context)
static void set_dummy_tlist_references(Plan *plan, int rtoffset)
static int register_partpruneinfo(PlannerInfo *root, int part_prune_index, int rtoffset)
static void set_customscan_references(PlannerInfo *root, CustomScan *cscan, int rtoffset)
#define ISREGCLASSCONST(con)
void extract_query_dependencies(Node *query, List **relationOids, List **invalItems, bool *hasRowSecurity)
static Node * fix_windowagg_condition_expr_mutator(Node *node, fix_windowagg_cond_context *context)
static Var * copyVar(Var *var)
bool extract_query_dependencies_walker(Node *node, PlannerInfo *context)
static List * fix_windowagg_condition_expr(PlannerInfo *root, List *runcondition, indexed_tlist *subplan_itlist)
#define NUM_EXEC_TLIST(parentplan)
static Node * fix_alternative_subplan(PlannerInfo *root, AlternativeSubPlan *asplan, double num_exec)
static void set_join_references(PlannerInfo *root, Join *join, int rtoffset)
static indexed_tlist * build_tlist_index_other_vars(List *tlist, int ignore_rel)
static Plan * clean_up_removed_plan_level(Plan *parent, Plan *child)
static Node * fix_scan_expr(PlannerInfo *root, Node *node, int rtoffset, double num_exec)
static Plan * set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset)
static bool fix_scan_expr_walker(Node *node, fix_scan_expr_context *context)
static Var * search_indexed_tlist_for_var(Var *var, indexed_tlist *itlist, int newvarno, int rtoffset, NullingRelsMatch nrm_match)
#define fix_scan_list(root, lst, rtoffset, num_exec)
Bitmapset * prunableRelids
VarReturningType varreturningtype
NullingRelsMatch nrm_match
indexed_tlist * outer_itlist
indexed_tlist * inner_itlist
indexed_tlist * subplan_itlist
indexed_tlist * subplan_itlist
Bitmapset * varnullingrels
void SS_compute_initplan_cost(List *init_plans, Cost *initplan_cost_p, bool *unsafe_initplans_p)
#define GetSysCacheHashValue1(cacheId, key1)
TargetEntry * tlist_member(Expr *node, List *targetlist)
void apply_tlist_labeling(List *dest_tlist, List *src_tlist)
#define FirstUnpinnedObjectId
Query * UtilityContainsQuery(Node *parsetree)