87#define EXPRKIND_QUAL 0
88#define EXPRKIND_TARGET 1
89#define EXPRKIND_RTFUNC 2
90#define EXPRKIND_RTFUNC_LATERAL 3
91#define EXPRKIND_VALUES 4
92#define EXPRKIND_VALUES_LATERAL 5
93#define EXPRKIND_LIMIT 6
94#define EXPRKIND_APPINFO 7
96#define EXPRKIND_TABLESAMPLE 9
97#define EXPRKIND_ARBITER_ELEM 10
98#define EXPRKIND_TABLEFUNC 11
99#define EXPRKIND_TABLEFUNC_LATERAL 12
100#define EXPRKIND_GROUPEXPR 13
144 int *tleref_to_colnum_map);
147 double tuple_fraction,
160 bool target_parallel_safe,
167 PathTarget *target,
bool target_parallel_safe,
190 List *activeWindows);
197 List *activeWindows);
214 bool target_parallel_safe,
215 double limit_tuples);
228 List *activeWindows);
253 double limit_tuples);
321 result = (*planner_hook) (
parse, query_string, cursorOptions,
338 double tuple_fraction;
354 glob->boundParams = boundParams;
357 glob->subroots =
NIL;
375 glob->partition_directory =
NULL;
376 glob->rel_notnullatts_hash =
NULL;
402 !
parse->hasModifyingCTE &&
454 if (tuple_fraction >= 1.0)
455 tuple_fraction = 0.0;
456 else if (tuple_fraction <= 0.0)
457 tuple_fraction = 1
e-10;
462 tuple_fraction = 0.0;
514 (*planner_setup_hook) (glob,
parse, query_string, &tuple_fraction, es);
562 gather->single_copy =
true;
573 gather->rescan_param = -1;
585 gather->plan.parallel_aware =
false;
586 gather->plan.parallel_safe =
false;
598 root->glob->parallelModeNeeded =
true;
697 (*planner_shutdown_hook) (glob,
parse, query_string, result);
699 if (glob->partition_directory !=
NULL)
757 root->plan_name = plan_name;
767 root->ec_merging_done =
false;
768 root->last_rinfo_serial = 0;
769 root->all_result_relids =
777 root->processed_groupClause =
NIL;
778 root->processed_distinctClause =
NIL;
783 root->qual_security_level = 0;
784 root->hasPseudoConstantQuals =
false;
785 root->hasAlternativeSubPlans =
false;
786 root->placeholdersFrozen =
false;
787 root->hasRecursion = hasRecursion;
788 root->assumeReplanning =
false;
792 root->wt_param_id = -1;
838 if (
parse->hasSubLinks)
861 if (
parse->setOperations)
874 root->hasJoinRTEs =
false;
875 root->hasLateralRTEs =
false;
876 root->group_rtindex = 0;
879 foreach(l,
parse->rtable)
883 switch (
rte->rtekind)
886 root->hasJoinRTEs =
true;
903 root->hasLateralRTEs =
true;
911 if (
rte->securityQuals)
912 root->qual_security_level =
Max(
root->qual_security_level,
920 if (
parse->resultRelation)
925 root->leaf_result_relids =
943 foreach(l,
parse->rtable)
947 if (
rte->perminfoindex != 0 &&
985 foreach(l,
parse->withCheckOptions)
1005 foreach(l,
parse->windowClause)
1021 if (
parse->onConflict)
1023 parse->onConflict->arbiterElems = (
List *)
1025 (
Node *)
parse->onConflict->arbiterElems,
1027 parse->onConflict->arbiterWhere =
1029 parse->onConflict->arbiterWhere,
1031 parse->onConflict->onConflictSet = (
List *)
1033 (
Node *)
parse->onConflict->onConflictSet,
1035 parse->onConflict->onConflictWhere =
1037 parse->onConflict->onConflictWhere,
1042 foreach(l,
parse->mergeActionList)
1046 action->targetList = (
List *)
1048 (
Node *) action->targetList,
1052 (
Node *) action->qual,
1056 parse->mergeJoinCondition =
1064 foreach(l,
parse->rtable)
1072 if (
rte->tablesample)
1087 if (
rte->lateral &&
root->hasJoinRTEs)
1127 foreach(
lcsq,
rte->securityQuals)
1146 if (
root->hasJoinRTEs)
1148 foreach(l,
parse->rtable)
1152 rte->joinaliasvars =
NIL;
1165 if (
parse->hasGroupRTE)
1174 if (
parse->hasTargetSRFs)
1183 if (
parse->groupingSets)
1185 parse->groupingSets =
1239 (
parse->groupClause &&
parse->groupingSets &&
1245 else if (
parse->groupClause &&
1351 if (
root->hasJoinRTEs &&
1387#ifdef OPTIMIZER_DEBUG
1388 printf(
"After canonicalize_qual()\n");
1404 if (
root->parse->hasSubLinks)
1413 if (
root->query_level > 1)
1462 elog(
ERROR,
"unrecognized node type: %d",
1515 int64 offset_est = 0;
1516 int64 count_est = 0;
1517 double limit_tuples = -1.0;
1532 &offset_est, &count_est);
1538 if (count_est > 0 && offset_est >= 0)
1539 limit_tuples = (
double) count_est + (
double) offset_est;
1543 root->tuple_fraction = tuple_fraction;
1545 if (
parse->setOperations)
1565 root->processed_tlist =
1584 if (
parse->rowMarks)
1589 errmsg(
"%s is not allowed with UNION/INTERSECT/EXCEPT",
1591 parse->rowMarks)->strength))));
1599 root->processed_tlist);
1627 if (
parse->groupingSets)
1631 else if (
parse->groupClause)
1665 if (
parse->hasWindowFuncs)
1669 if (
wflists->numWindowFuncs > 0)
1685 parse->hasWindowFuncs =
false;
1703 if (
parse->groupClause ||
1704 parse->groupingSets ||
1705 parse->distinctClause ||
1707 parse->hasWindowFuncs ||
1708 parse->hasTargetSRFs ||
1709 root->hasHavingQual)
1710 root->limit_tuples = -1.0;
1712 root->limit_tuples = limit_tuples;
1715 qp_extra.activeWindows = activeWindows;
1751 if (
parse->sortClause)
1809 if (
parse->hasTargetSRFs)
1882 if (
parse->hasTargetSRFs)
1902 if (
parse->hasTargetSRFs)
1912 if (
parse->distinctClause)
1927 if (
parse->sortClause)
1936 if (
parse->hasTargetSRFs)
1982 if (
parse->rowMarks)
1998 offset_est, count_est);
2008 List *updateColnosLists =
NIL;
2009 List *withCheckOptionLists =
NIL;
2012 List *mergeJoinConditions =
NIL;
2019 parse->resultRelation);
2020 int resultRelation = -1;
2023 rootRelation =
parse->resultRelation;
2027 resultRelation)) >= 0)
2045 List *update_colnos =
root->update_colnos;
2053 updateColnosLists =
lappend(updateColnosLists,
2056 if (
parse->withCheckOptions)
2066 withCheckOptionLists =
lappend(withCheckOptionLists,
2069 if (
parse->returningList)
2071 List *returningList =
parse->returningList;
2074 returningList = (
List *)
2076 (
Node *) returningList,
2079 returningLists =
lappend(returningLists,
2082 if (
parse->mergeActionList)
2091 foreach(l,
parse->mergeActionList)
2098 (
Node *) action->qual,
2103 (
Node *) action->targetList,
2109 action->updateColnos,
2112 mergeActionList =
lappend(mergeActionList,
2116 mergeActionLists =
lappend(mergeActionLists,
2121 Node *mergeJoinCondition =
parse->mergeJoinCondition;
2124 mergeJoinCondition =
2129 mergeJoinConditions =
lappend(mergeJoinConditions,
2130 mergeJoinCondition);
2134 if (resultRelations ==
NIL)
2150 if (
parse->withCheckOptions)
2152 if (
parse->returningList)
2154 if (
parse->mergeActionList)
2167 if (
parse->withCheckOptions)
2169 if (
parse->returningList)
2171 if (
parse->mergeActionList)
2182 if (
parse->rowMarks)
2185 rowMarks =
root->rowMarks;
2192 parse->resultRelation,
2196 withCheckOptionLists,
2201 mergeJoinConditions,
2213 if (
final_rel->consider_parallel &&
root->query_level > 1 &&
2235 final_rel->fdwroutine->GetForeignUpperPaths)
2270 root->processed_groupClause =
parse->groupClause;
2273 gd->any_hashable =
false;
2274 gd->unhashable_refs =
NULL;
2275 gd->unsortable_refs =
NULL;
2276 gd->unsortable_sets =
NIL;
2278 if (
parse->groupClause)
2282 foreach(
lc,
parse->groupClause)
2312 foreach(
lc,
parse->groupingSets)
2334 errmsg(
"could not implement GROUP BY"),
2335 errdetail(
"Some of the datatypes only support hashing, while others only support sorting.")));
2399 gd->any_hashable =
true;
2411 gd->tleref_to_colnum_map);
2417 if (
gd->unsortable_sets)
2425 gd->unsortable_sets,
2426 gd->tleref_to_colnum_map);
2427 gd->any_hashable =
true;
2440 int *tleref_to_colnum_map)
2446 foreach(
lc, groupClause)
2450 tleref_to_colnum_map[
gc->tleSortGroupRef] =
ref++;
2459 foreach(
lc2,
gs->set)
2464 result =
lappend(result, set);
2483 if (
parse->rowMarks)
2492 parse->rowMarks)->strength);
2512 if (
parse->resultRelation)
2519 foreach(l,
parse->rowMarks)
2545 newrc->rowmarkId = ++(
root->glob->lastRowMarkId);
2547 newrc->allMarkTypes = (1 <<
newrc->markType);
2550 newrc->isParent =
false;
2559 foreach(l,
parse->rtable)
2570 newrc->rowmarkId = ++(
root->glob->lastRowMarkId);
2572 newrc->allMarkTypes = (1 <<
newrc->markType);
2575 newrc->isParent =
false;
2630 elog(
ERROR,
"unrecognized LockClauseStrength %d", (
int) strength);
2667 if (
parse->limitCount)
2680 if (*count_est <= 0)
2690 if (
parse->limitOffset)
2703 if (*offset_est < 0)
2713 if (*count_est != 0)
2720 if (*count_est < 0 || *offset_est < 0)
2738 if (tuple_fraction >= 1.0)
2750 else if (tuple_fraction > 0.0)
2769 else if (*offset_est != 0 && tuple_fraction > 0.0)
2780 if (*offset_est < 0)
2791 if (tuple_fraction >= 1.0)
2814 if (tuple_fraction >= 1.0)
2815 tuple_fraction = 0.0;
2820 return tuple_fraction;
2842 node =
parse->limitCount;
2855 node =
parse->limitOffset;
2935 foreach(
sl,
parse->sortClause)
2939 foreach(
gl,
parse->groupClause)
2964 foreach(
gl,
parse->groupClause)
3079 for (k =
j; k <
i; ++k)
3109 for (k =
j - 1; k > 0; --k)
3122 adjacency[
i] =
NULL;
3145 int u =
state->pair_vu[
i];
3146 int v =
state->pair_uv[
i];
3150 else if (v > 0 && v <
i)
3170 results[1] =
lcons(
NIL, results[1]);
3174 result =
lappend(result, results[
i]);
3218 foreach(
lc, groupingSets)
3228 int ref =
sc->tleSortGroupRef;
3268 if (
pathkey->pk_eclass->ec_has_volatile)
3328 foreach(
lc,
root->agginfos)
3520 aggref->aggpresorted =
true;
3533 List *tlist =
root->processed_tlist;
3561 root->group_pathkeys =
3575 root->num_groupby_pathkeys = 0;
3578 else if (
parse->groupClause ||
root->numOrderedAggs > 0)
3594 root->group_pathkeys =
3596 &
root->processed_groupClause,
3606 root->num_groupby_pathkeys = 0;
3612 if (
root->numOrderedAggs > 0)
3619 root->num_groupby_pathkeys = 0;
3623 if (activeWindows !=
NIL)
3640 if (
parse->distinctClause)
3646 root->distinct_pathkeys =
3648 &
root->processed_distinctClause,
3655 root->distinct_pathkeys =
NIL;
3658 root->distinct_pathkeys =
NIL;
3660 root->sort_pathkeys =
3673 root->setop_pathkeys =
3707 if (
root->group_pathkeys)
3708 root->query_pathkeys =
root->group_pathkeys;
3709 else if (
root->window_pathkeys)
3710 root->query_pathkeys =
root->window_pathkeys;
3713 root->query_pathkeys =
root->distinct_pathkeys;
3714 else if (
root->sort_pathkeys)
3715 root->query_pathkeys =
root->sort_pathkeys;
3716 else if (
root->setop_pathkeys !=
NIL)
3717 root->query_pathkeys =
root->setop_pathkeys;
3742 if (
parse->groupClause)
3746 if (
parse->groupingSets)
3755 foreach(
lc,
gd->rollups)
3776 gs->numGroups = numGroups;
3777 rollup->numGroups += numGroups;
3783 if (
gd->hash_sets_idx)
3787 gd->dNumHashGroups = 0;
3802 gs->numGroups = numGroups;
3803 gd->dNumHashGroups += numGroups;
3819 else if (
parse->groupingSets)
3824 else if (
parse->hasAggs ||
root->hasHavingQual)
3859 bool target_parallel_safe,
3875 target_parallel_safe,
parse->havingQual);
3899 if ((
gd &&
gd->rollups !=
NIL)
3924 root->numOrderedAggs == 0 &&
3934 extra.
flags = flags;
3970 PathTarget *target,
bool target_parallel_safe,
3999 if (
input_rel->consider_parallel && target_parallel_safe &&
4012 grouped_rel->fdwroutine =
input_rel->fdwroutine;
4029 return (
root->hasHavingQual ||
parse->groupingSets) &&
4065 while (--nrows >= 0)
4144 root->parse->groupClause))
4214 errmsg(
"could not implement GROUP BY"),
4215 errdetail(
"Some of the datatypes only support hashing, while others only support sorting.")));
4221 if (grouped_rel->fdwroutine &&
4222 grouped_rel->fdwroutine->GetForeignUpperPaths)
4317 if (
hashsize > hash_mem_limit &&
gd->rollups)
4366 gd->tleref_to_colnum_map);
4369 rollup->is_hashed =
true;
4400 rollup->hashable =
false;
4401 rollup->is_hashed =
false;
4420 if (
gd->rollups ==
NIL)
4444 gd->dNumHashGroups);
4555 gd->tleref_to_colnum_map);
4558 rollup->is_hashed =
true;
4578 if (!
gd->unsortable_sets)
4609 List *activeWindows)
4644 if (path ==
input_rel->cheapest_total_path ||
4662 window_rel->fdwroutine->GetForeignUpperPaths)
4696 List *activeWindows)
4719 foreach(l, activeWindows)
4722 List *window_pathkeys;
4731 root->processed_tlist);
4764 if (
lnext(activeWindows, l))
4804 foreach(
lc3, wfunc->runCondition)
4831 runcondition =
lappend(runcondition, opexpr);
4895 errmsg(
"could not implement DISTINCT"),
4896 errdetail(
"Some of the datatypes only support hashing, while others only support sorting.")));
4948 if (
parse->hasDistinctOn)
4991 root->distinct_pathkeys,
5012 if (
root->distinct_pathkeys ==
NIL)
5067 root->processed_distinctClause,
5123 root->hasHavingQual)
5171 if (
parse->hasDistinctOn &&
5215 if (
root->distinct_pathkeys ==
NIL)
5275 root->processed_distinctClause,
5323 if (
root->parse->hasDistinctOn &&
5381 bool target_parallel_safe,
5382 double limit_tuples)
5396 if (
input_rel->consider_parallel && target_parallel_safe)
5444 root->sort_pathkeys,
5450 root->sort_pathkeys,
5519 root->sort_pathkeys,
5525 root->sort_pathkeys,
5623 if (
sgref &&
root->processed_groupClause &&
5625 root->processed_groupClause) !=
NULL)
5659 if (
parse->havingQual)
5732 if (
sgref &&
root->processed_groupClause &&
5734 root->processed_groupClause) !=
NULL)
5824 agg->aggsplit = aggsplit;
5836 agg->aggtype =
agg->aggtranstype;
5869 elog(
ERROR,
"resjunk output columns are not implemented");
5874 elog(
ERROR,
"resjunk output columns are not implemented");
5890 List *windowClause =
root->parse->windowClause;
5893 foreach(
lc, windowClause)
5919 req.window_clause = wc;
5920 req.window_func = wfunc;
5972 foreach(
lc3, windowClause)
6030 List *windowClause =
root->parse->windowClause;
6038 foreach(
lc, windowClause)
6117 foreach(
lc, activeWindows)
6131 foreach(
lc2, activeWindows)
6174 if (
sca->tleSortGroupRef >
scb->tleSortGroupRef)
6176 else if (
sca->tleSortGroupRef <
scb->tleSortGroupRef)
6178 else if (
sca->sortop >
scb->sortop)
6180 else if (
sca->sortop <
scb->sortop)
6182 else if (
sca->nulls_first && !
scb->nulls_first)
6184 else if (!
sca->nulls_first &&
scb->nulls_first)
6233 List *activeWindows)
6249 foreach(
lc, activeWindows)
6269 foreach(
lc,
root->processed_groupClause)
6360 errmsg(
"could not implement window PARTITION BY"),
6361 errdetail(
"Window partitioning columns must be of sortable datatypes.")));
6365 errmsg(
"could not implement window ORDER BY"),
6366 errdetail(
"Window ordering columns must be of sortable datatypes.")));
6403 if (window_pathkeys !=
NIL)
6409 return window_pathkeys;
6528 if (
parse->hasTargetSRFs &&
6568 parse->hasTargetSRFs &&
6586 (
parse->limitCount ||
root->tuple_fraction > 0))))
6661 if (tuple_fraction <= 0.0)
6665 if (tuple_fraction >= 1.0 &&
best_path->rows > 0)
6672 if (path->param_info)
6830 return (
Expr *) result;
6845 List **relationOids,
6853 MemSet(&glob, 0,
sizeof(glob));
6881 return (
Expr *) result;
6923 root->parse = query;
6925 root->query_level = 1;
6927 root->wt_param_id = -1;
6933 rte->relid = tableOid;
6936 rte->lateral =
false;
6938 rte->inFromCl =
true;
6953 if (indexInfo->
indexoid == indexOid)
7028 int parallel_workers;
7047 root->parse = query;
7049 root->query_level = 1;
7051 root->wt_param_id = -1;
7064 rte->relid = tableOid;
7067 rte->lateral =
false;
7069 rte->inFromCl =
true;
7094 parallel_workers = 0;
7135 while (parallel_workers > 0 &&
7143 return parallel_workers;
7229 if (
parse->groupingSets)
7235 else if (
parse->hasAggs)
7253 else if (
parse->groupClause)
7339 if (
parse->groupingSets)
7360 root->processed_groupClause,
7379 root->processed_groupClause,
7451 cheapest_total_path =
input_rel->cheapest_total_path;
7467 if (cheapest_total_path ==
NULL &&
7522 if (cheapest_total_path !=
NULL)
7525 cheapest_total_path->
rows,
7567 cheapest_total_path,
7667 cheapest_total_path,
7671 root->processed_groupClause,
7689 root->processed_groupClause,
7836 root->num_groupby_pathkeys);
7919 else if (
parse->groupingSets)
7924 else if (
root->hasNonPartialAggs ||
root->hasNonSerialAggs)
8037 subpath->pathtarget->sortgrouprefs =
8058 subpath->pathtarget->sortgrouprefs =
8076 if (
root->parse->hasTargetSRFs)
8132 nappinfos, appinfos);
8241 nappinfos, appinfos);
8247 nappinfos, appinfos);
8251 nappinfos, appinfos);
8342 partnatts =
input_rel->part_scheme->partnatts;
8344 for (cnt = 0; cnt < partnatts; cnt++)
8350 foreach(
lc, partexprs)
8356 foreach(
lg, groupexprs)
8423 foreach(lt, targetlist)
8618 elog(
ERROR,
"could not find equality operator for ordering operator %u",
8625 sortcl->reverse_sort =
false;
8626 sortcl->nulls_first =
false;
8627 sortcl->hashable =
false;
8653 elog(
ERROR,
"could not find ordering operator for equality operator %u",
8670 elog(
ERROR,
"could not find compatible hash operator for operator %u",
8677 groupcl->reverse_sort =
false;
8709 sjinfo, unique_rel);
8713 sjinfo, unique_rel);
9012 sjinfo, unique_rel);
9059 for (n = 1;
true; ++n)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
int compute_parallel_worker(RelOptInfo *rel, double heap_pages, double index_pages, int max_workers)
void generate_useful_gather_paths(PlannerInfo *root, RelOptInfo *rel, bool override_rows)
void add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, List *live_childrels)
AppendRelInfo ** find_appinfos_by_relids(PlannerInfo *root, Relids relids, int *nappinfos)
Node * adjust_appendrel_attrs(PlannerInfo *root, Node *node, int nappinfos, AppendRelInfo **appinfos)
List * adjust_inherited_attnums_multilevel(PlannerInfo *root, List *attnums, Index child_relid, Index top_parent_relid)
Node * adjust_appendrel_attrs_multilevel(PlannerInfo *root, Node *node, RelOptInfo *childrel, RelOptInfo *parentrel)
void pprint(const void *obj)
void pgstat_report_plan_id(int64 plan_id, bool force)
BipartiteMatchState * BipartiteMatch(int u_size, int v_size, short **adjacency)
void BipartiteMatchFree(BipartiteMatchState *state)
Bitmapset * bms_difference(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_make_singleton(int x)
bool bms_equal(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)
int bms_num_members(const Bitmapset *a)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
BMS_Membership bms_membership(const Bitmapset *a)
bool bms_overlap_list(const Bitmapset *a, const List *b)
#define Assert(condition)
#define MemSet(start, val, len)
#define OidIsValid(objectId)
bool contain_agg_clause(Node *clause)
Node * estimate_expression_value(PlannerInfo *root, Node *node)
WindowFuncLists * find_window_functions(Node *clause, Index maxWinRef)
Node * eval_const_expressions(PlannerInfo *root, Node *node)
void convert_saop_to_hashed_saop(Node *node)
char max_parallel_hazard(Query *parse)
bool is_parallel_safe(PlannerInfo *root, Node *node)
bool contain_subplans(Node *clause)
bool contain_volatile_functions(Node *clause)
bool enable_partitionwise_aggregate
int max_parallel_workers_per_gather
double parallel_setup_cost
double parallel_tuple_cost
void cost_sort(Path *path, PlannerInfo *root, List *pathkeys, int input_disabled_nodes, Cost input_cost, double tuples, int width, Cost comparison_cost, int sort_mem, double limit_tuples)
bool enable_indexonlyscan
double compute_gather_rows(Path *path)
void cost_qual_eval_node(QualCost *cost, Node *qual, PlannerInfo *root)
PathTarget * set_pathtarget_cost_width(PlannerInfo *root, PathTarget *target)
void cost_qual_eval(QualCost *cost, List *quals, PlannerInfo *root)
bool enable_presorted_aggregate
bool enable_partitionwise_join
int32 clamp_width_est(int64 tuple_width)
bool enable_incremental_sort
Plan * materialize_finished_plan(Plan *subplan)
Plan * create_plan(PlannerInfo *root, Path *best_path)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
bool equal(const void *a, const void *b)
bool ExecSupportsBackwardScan(Plan *node)
bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo)
#define palloc_array(type, count)
#define palloc0_object(type)
#define OidFunctionCall1(functionId, arg1)
FdwRoutine * GetFdwRoutineByRelId(Oid relid)
int max_parallel_maintenance_workers
#define IsParallelWorker()
void index_close(Relation relation, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
double jit_optimize_above_cost
double jit_inline_above_cost
Bitmapset * DiscreteKnapsack(int max_weight, int num_items, int *item_weights, double *item_values)
List * lappend(List *list, void *datum)
List * list_difference_int(const List *list1, const List *list2)
List * list_concat_unique_ptr(List *list1, const List *list2)
List * list_concat(List *list1, const List *list2)
List * list_copy(const List *oldlist)
List * lappend_int(List *list, int datum)
List * lcons(void *datum, List *list)
List * list_delete_int(List *list, int datum)
List * list_delete_last(List *list)
bool list_member_ptr(const List *list, const void *datum)
void list_free(List *list)
bool list_member_int(const List *list, int datum)
List * list_copy_head(const List *oldlist, int len)
List * list_concat_unique(List *list1, const List *list2)
char * get_rel_name(Oid relid)
bool get_compatible_hash_operators(Oid opno, Oid *lhs_opno, Oid *rhs_opno)
RegProcedure get_func_support(Oid funcid)
Oid get_equality_op_for_ordering_op(Oid opno, bool *reverse)
Oid get_ordering_op_for_equality_op(Oid opno, bool use_lhs_type)
int32 get_typavgwidth(Oid typid, int32 typmod)
Datum subpath(PG_FUNCTION_ARGS)
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)
Const * makeConst(Oid consttype, int32 consttypmod, Oid constcollid, int constlen, Datum constvalue, bool constisnull, bool constbyval)
List * make_ands_implicit(Expr *clause)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
MemoryContext GetMemoryChunkContext(void *pointer)
Oid exprType(const Node *expr)
Oid exprCollation(const Node *expr)
bool expression_returns_set(Node *clause)
void fix_opfuncids(Node *node)
size_t get_hash_memory_limit(void)
#define DO_AGGSPLIT_SKIPFINAL(as)
#define IsA(nodeptr, _type_)
#define IS_OUTER_JOIN(jointype)
#define DO_AGGSPLIT_SERIALIZE(as)
@ AGGSPLIT_FINAL_DESERIAL
@ AGGSPLIT_INITIAL_SERIAL
#define castNode(_type_, nodeptr)
#define PVC_RECURSE_AGGREGATES
#define PVC_RECURSE_WINDOWFUNCS
#define PVC_INCLUDE_WINDOWFUNCS
#define PVC_INCLUDE_PLACEHOLDERS
#define PVC_INCLUDE_AGGREGATES
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
int assign_special_exec_param(PlannerInfo *root)
List * expand_grouping_sets(List *groupingSets, bool groupDistinct, int limit)
Index assignSortGroupRef(TargetEntry *tle, List *tlist)
RTEPermissionInfo * getRTEPermissionInfo(List *rteperminfos, RangeTblEntry *rte)
RTEPermissionInfo * addRTEPermissionInfo(List **rteperminfos, RangeTblEntry *rte)
#define CURSOR_OPT_SCROLL
#define CURSOR_OPT_FAST_PLAN
#define CURSOR_OPT_PARALLEL_OK
void CheckSelectLocking(Query *qry, LockClauseStrength strength)
const char * LCS_asString(LockClauseStrength strength)
#define rt_fetch(rangetable_index, rangetable)
void DestroyPartitionDirectory(PartitionDirectory pdir)
List * append_pathkeys(List *target, List *source)
bool pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common)
List * make_pathkeys_for_sortclauses(PlannerInfo *root, List *sortclauses, List *tlist)
List * make_pathkeys_for_sortclauses_extended(PlannerInfo *root, List **sortclauses, List *tlist, bool remove_redundant, bool remove_group_rtindex, bool *sortable, bool set_ec_sortref)
bool pathkeys_contained_in(List *keys1, List *keys2)
PathKeysComparison compare_pathkeys(List *keys1, List *keys2)
List * get_useful_group_keys_orderings(PlannerInfo *root, Path *path)
ModifyTablePath * create_modifytable_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, CmdType operation, bool canSetTag, Index nominalRelation, Index rootRelation, List *resultRelations, List *updateColnosLists, List *withCheckOptionLists, List *returningLists, List *rowMarks, OnConflictExpr *onconflict, List *mergeActionLists, List *mergeJoinConditions, int epqParam)
IndexPath * create_index_path(PlannerInfo *root, IndexOptInfo *index, List *indexclauses, List *indexorderbys, List *indexorderbycols, List *pathkeys, ScanDirection indexscandir, bool indexonly, Relids required_outer, double loop_count, bool partial_path)
ProjectSetPath * create_set_projection_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target)
ProjectionPath * create_projection_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target)
WindowAggPath * create_windowagg_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, List *windowFuncs, List *runCondition, WindowClause *winclause, List *qual, bool topwindow)
LockRowsPath * create_lockrows_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *rowMarks, int epqParam)
Path * apply_projection_to_path(PlannerInfo *root, RelOptInfo *rel, Path *path, PathTarget *target)
Path * create_seqscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer, int parallel_workers)
GatherMergePath * create_gather_merge_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, List *pathkeys, Relids required_outer, double *rows)
void set_cheapest(RelOptInfo *parent_rel)
void add_partial_path(RelOptInfo *parent_rel, Path *new_path)
LimitPath * create_limit_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, Node *limitOffset, Node *limitCount, LimitOption limitOption, int64 offset_est, int64 count_est)
AppendPath * create_append_path(PlannerInfo *root, RelOptInfo *rel, List *subpaths, List *partial_subpaths, List *pathkeys, Relids required_outer, int parallel_workers, bool parallel_aware, double rows)
int compare_fractional_path_costs(Path *path1, Path *path2, double fraction)
IncrementalSortPath * create_incremental_sort_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *pathkeys, int presorted_keys, double limit_tuples)
GroupingSetsPath * create_groupingsets_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *having_qual, AggStrategy aggstrategy, List *rollups, const AggClauseCosts *agg_costs)
SortPath * create_sort_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *pathkeys, double limit_tuples)
GroupPath * create_group_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *groupClause, List *qual, double numGroups)
void add_path(RelOptInfo *parent_rel, Path *new_path)
UniquePath * create_unique_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, int numCols, double numGroups)
AggPath * create_agg_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, AggStrategy aggstrategy, AggSplit aggsplit, List *groupClause, List *qual, const AggClauseCosts *aggcosts, double numGroups)
GroupResultPath * create_group_result_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, List *havingqual)
#define PGS_NESTLOOP_MEMOIZE
PartitionwiseAggregateType
@ PARTITIONWISE_AGGREGATE_PARTIAL
@ PARTITIONWISE_AGGREGATE_FULL
@ PARTITIONWISE_AGGREGATE_NONE
#define IS_SIMPLE_REL(rel)
#define PGS_CONSIDER_INDEXONLY
#define PGS_NESTLOOP_MATERIALIZE
#define PGS_MERGEJOIN_PLAIN
#define GROUPING_CAN_USE_HASH
#define PGS_MERGEJOIN_MATERIALIZE
#define get_pathtarget_sortgroupref(target, colno)
#define IS_PARTITIONED_REL(rel)
#define PGS_CONSIDER_NONPARTIAL
#define GROUPING_CAN_USE_SORT
#define GROUPING_CAN_PARTIAL_AGG
#define PGS_CONSIDER_PARTITIONWISE
@ UPPERREL_PARTIAL_GROUP_AGG
@ UPPERREL_PARTIAL_DISTINCT
#define IS_OTHER_REL(rel)
#define PGS_INDEXONLYSCAN
#define PGS_NESTLOOP_PLAIN
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define linitial_node(type, l)
#define forboth(cell1, list1, cell2, list2)
#define foreach_current_index(var_or_cell)
#define foreach_ptr(type, var, lst)
#define for_each_cell(cell, lst, initcell)
#define for_each_from(cell, lst, N)
static void * list_nth(const List *list, int n)
#define foreach_node(type, var, lst)
static ListCell * list_head(const List *l)
#define list_nth_node(type, list, n)
static ListCell * lnext(const List *l, const ListCell *c)
#define list_make1_int(x1)
static int list_cell_number(const List *l, const ListCell *c)
#define llast_node(type, l)
void preprocess_minmax_aggregates(PlannerInfo *root)
void estimate_rel_size(Relation rel, int32 *attr_widths, BlockNumber *pages, double *tuples, double *allvisfrac)
int32 get_relation_data_width(Oid relid, int32 *attr_widths)
RelOptInfo * query_planner(PlannerInfo *root, query_pathkeys_callback qp_callback, void *qp_extra)
#define DEFAULT_CURSOR_TUPLE_FRACTION
#define EXPRKIND_TABLEFUNC_LATERAL
static RelOptInfo * create_final_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *distinct_rel)
static List * postprocess_setop_tlist(List *new_tlist, List *orig_tlist)
static PathTarget * make_partial_grouping_target(PlannerInfo *root, PathTarget *grouping_target, Node *havingQual)
Expr * expression_planner_with_deps(Expr *expr, List **relationOids, List **invalItems)
static void gather_grouping_paths(PlannerInfo *root, RelOptInfo *rel)
static void preprocess_rowmarks(PlannerInfo *root)
#define EXPRKIND_TABLESAMPLE
static void add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *grouped_rel, RelOptInfo *partially_grouped_rel, const AggClauseCosts *agg_costs, grouping_sets_data *gd, GroupPathExtraData *extra)
PlannedStmt * planner(Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams, ExplainState *es)
static void create_degenerate_grouping_paths(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *grouped_rel)
char * choose_plan_name(PlannerGlobal *glob, const char *name, bool always_number)
#define EXPRKIND_GROUPEXPR
planner_hook_type planner_hook
double cursor_tuple_fraction
static bool is_degenerate_grouping(PlannerInfo *root)
planner_shutdown_hook_type planner_shutdown_hook
bool plan_cluster_use_sort(Oid tableOid, Oid indexOid)
static void preprocess_qual_conditions(PlannerInfo *root, Node *jtnode)
int plan_create_index_workers(Oid tableOid, Oid indexOid)
#define EXPRKIND_RTFUNC_LATERAL
#define EXPRKIND_VALUES_LATERAL
static void create_ordinary_grouping_paths(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *grouped_rel, const AggClauseCosts *agg_costs, grouping_sets_data *gd, GroupPathExtraData *extra, RelOptInfo **partially_grouped_rel_p)
RelOptInfo * create_unique_paths(PlannerInfo *root, RelOptInfo *rel, SpecialJoinInfo *sjinfo)
PlannerInfo * subquery_planner(PlannerGlobal *glob, Query *parse, char *plan_name, PlannerInfo *parent_root, bool hasRecursion, double tuple_fraction, SetOperationStmt *setops)
static bool can_partial_agg(PlannerInfo *root)
static double preprocess_limit(PlannerInfo *root, double tuple_fraction, int64 *offset_est, int64 *count_est)
Path * get_cheapest_fractional_path(RelOptInfo *rel, double tuple_fraction)
Expr * preprocess_phv_expression(PlannerInfo *root, Expr *expr)
static List * get_useful_pathkeys_for_distinct(PlannerInfo *root, List *needed_pathkeys, List *path_pathkeys)
planner_setup_hook_type planner_setup_hook
bool parallel_leader_participation
static PathTarget * make_window_input_target(PlannerInfo *root, PathTarget *final_target, List *activeWindows)
static void apply_scanjoin_target_to_paths(PlannerInfo *root, RelOptInfo *rel, List *scanjoin_targets, List *scanjoin_targets_contain_srfs, bool scanjoin_target_parallel_safe, bool tlist_same_exprs)
static RelOptInfo * create_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, PathTarget *target)
static void optimize_window_clauses(PlannerInfo *root, WindowFuncLists *wflists)
RowMarkType select_rowmark_type(RangeTblEntry *rte, LockClauseStrength strength)
static void adjust_paths_for_srfs(PlannerInfo *root, RelOptInfo *rel, List *targets, List *targets_contain_srfs)
static void create_partial_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *final_distinct_rel, PathTarget *target)
static List * preprocess_groupclause(PlannerInfo *root, List *force)
static Node * preprocess_expression(PlannerInfo *root, Node *expr, int kind)
static Path * make_ordered_path(PlannerInfo *root, RelOptInfo *rel, Path *path, Path *cheapest_path, List *pathkeys, double limit_tuples)
static bool has_volatile_pathkey(List *keys)
static RelOptInfo * create_partial_grouping_paths(PlannerInfo *root, RelOptInfo *grouped_rel, RelOptInfo *input_rel, grouping_sets_data *gd, GroupPathExtraData *extra, bool force_rel_creation)
static void name_active_windows(List *activeWindows)
static void create_final_unique_paths(PlannerInfo *root, RelOptInfo *input_rel, List *sortPathkeys, List *groupClause, SpecialJoinInfo *sjinfo, RelOptInfo *unique_rel)
static PathTarget * make_sort_input_target(PlannerInfo *root, PathTarget *final_target, bool *have_postponed_srfs)
static void create_one_window_path(PlannerInfo *root, RelOptInfo *window_rel, Path *path, PathTarget *input_target, PathTarget *output_target, WindowFuncLists *wflists, List *activeWindows)
bool enable_distinct_reordering
void mark_partial_aggref(Aggref *agg, AggSplit aggsplit)
static grouping_sets_data * preprocess_grouping_sets(PlannerInfo *root)
static List * remap_to_groupclause_idx(List *groupClause, List *gsets, int *tleref_to_colnum_map)
static void adjust_group_pathkeys_for_groupagg(PlannerInfo *root)
static PathTarget * make_group_input_target(PlannerInfo *root, PathTarget *final_target)
static List * reorder_grouping_sets(List *groupingSets, List *sortclause)
static int common_prefix_cmp(const void *a, const void *b)
static void grouping_planner(PlannerInfo *root, double tuple_fraction, SetOperationStmt *setops)
static RelOptInfo * make_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, PathTarget *target, bool target_parallel_safe, Node *havingQual)
static List * generate_setop_child_grouplist(SetOperationStmt *op, List *targetlist)
PlannedStmt * standard_planner(Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams, ExplainState *es)
static List * select_active_windows(PlannerInfo *root, WindowFuncLists *wflists)
Expr * expression_planner(Expr *expr)
static void create_partial_unique_paths(PlannerInfo *root, RelOptInfo *input_rel, List *sortPathkeys, List *groupClause, SpecialJoinInfo *sjinfo, RelOptInfo *unique_rel)
bool limit_needed(Query *parse)
create_upper_paths_hook_type create_upper_paths_hook
#define EXPRKIND_TABLEFUNC
static void consider_groupingsets_paths(PlannerInfo *root, RelOptInfo *grouped_rel, Path *path, bool is_sorted, bool can_hash, grouping_sets_data *gd, const AggClauseCosts *agg_costs, double dNumGroups)
static List * make_pathkeys_for_window(PlannerInfo *root, WindowClause *wc, List *tlist)
static RelOptInfo * create_ordered_paths(PlannerInfo *root, RelOptInfo *input_rel, PathTarget *target, bool target_parallel_safe, double limit_tuples)
static double get_number_of_groups(PlannerInfo *root, double path_rows, grouping_sets_data *gd, List *target_list)
static List * extract_rollup_sets(List *groupingSets)
static RelOptInfo * create_grouping_paths(PlannerInfo *root, RelOptInfo *input_rel, PathTarget *target, bool target_parallel_safe, grouping_sets_data *gd)
static void create_partitionwise_grouping_paths(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *grouped_rel, RelOptInfo *partially_grouped_rel, const AggClauseCosts *agg_costs, grouping_sets_data *gd, PartitionwiseAggregateType patype, GroupPathExtraData *extra)
#define EXPRKIND_ARBITER_ELEM
static bool group_by_has_partkey(RelOptInfo *input_rel, List *targetList, List *groupClause)
static void standard_qp_callback(PlannerInfo *root, void *extra)
static RelOptInfo * create_window_paths(PlannerInfo *root, RelOptInfo *input_rel, PathTarget *input_target, PathTarget *output_target, bool output_target_parallel_safe, WindowFuncLists *wflists, List *activeWindows)
void(* planner_setup_hook_type)(PlannerGlobal *glob, Query *parse, const char *query_string, double *tuple_fraction, ExplainState *es)
PlannedStmt *(* planner_hook_type)(Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams, ExplainState *es)
void(* create_upper_paths_hook_type)(PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra)
void(* planner_shutdown_hook_type)(PlannerGlobal *glob, Query *parse, const char *query_string, PlannedStmt *pstmt)
@ ROW_MARK_NOKEYEXCLUSIVE
#define qsort(a, b, c, d)
static Datum Int64GetDatum(int64 X)
static int64 DatumGetInt64(Datum X)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
void get_agg_clause_costs(PlannerInfo *root, AggSplit aggsplit, AggClauseCosts *costs)
void preprocess_aggrefs(PlannerInfo *root, Node *clause)
void preprocess_function_rtes(PlannerInfo *root)
void flatten_simple_union_all(PlannerInfo *root)
void transform_MERGE_to_join(Query *parse)
void remove_useless_result_rtes(PlannerInfo *root)
void pull_up_sublinks(PlannerInfo *root)
void replace_empty_jointree(Query *parse)
void pull_up_subqueries(PlannerInfo *root)
Relids get_relids_in_jointree(Node *jtnode, bool include_outer_joins, bool include_inner_joins)
Query * preprocess_relation_rtes(PlannerInfo *root)
void reduce_outer_joins(PlannerInfo *root)
Expr * canonicalize_qual(Expr *qual, bool is_check)
void preprocess_targetlist(PlannerInfo *root)
RelOptInfo * plan_set_operations(PlannerInfo *root)
char * psprintf(const char *fmt,...)
List * RelationGetIndexPredicate(Relation relation)
List * RelationGetIndexExpressions(Relation relation)
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
void setup_simple_rel_arrays(PlannerInfo *root)
RelOptInfo * fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind, Relids relids)
RelOptInfo * build_simple_rel(PlannerInfo *root, int relid, RelOptInfo *parent)
Node * remove_nulling_relids(Node *node, const Bitmapset *removable_relids, const Bitmapset *except_relids)
double estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, List **pgset, EstimationInfo *estinfo)
double estimate_hashagg_tablesize(PlannerInfo *root, Path *path, const AggClauseCosts *agg_costs, double dNumGroups)
Plan * set_plan_references(PlannerInfo *root, Plan *plan)
bool extract_query_dependencies_walker(Node *node, PlannerInfo *context)
void check_stack_depth(void)
GetForeignRowMarkType_function GetForeignRowMarkType
GetForeignUpperPaths_function GetForeignUpperPaths
Bitmapset * rewindPlanIDs
PlannedStmtOrigin planOrigin
Bitmapset * unprunableRelids
Bitmapset * prunableRelids
Bitmapset * rewindPlanIDs
struct PathTarget * reltarget
List * cheapest_parameterized_paths
struct Path * cheapest_startup_path
struct Path * cheapest_total_path
List * unique_groupclause
struct RelOptInfo * unique_rel
LockClauseStrength strength
LockWaitPolicy waitPolicy
int * tleref_to_colnum_map
Bitmapset * unhashable_refs
Bitmapset * unsortable_refs
grouping_sets_data * gset_data
Node * SS_process_sublinks(PlannerInfo *root, Node *expr, bool isQual)
void SS_process_ctes(PlannerInfo *root)
void SS_identify_outer_params(PlannerInfo *root)
Node * SS_replace_correlation_vars(PlannerInfo *root, Node *expr)
void SS_finalize_plan(PlannerInfo *root, Plan *plan)
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)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
void split_pathtarget_at_srfs_grouping(PlannerInfo *root, PathTarget *target, PathTarget *input_target, List **targets, List **targets_contain_srfs)
TargetEntry * tlist_member(Expr *node, List *targetlist)
bool tlist_same_exprs(List *tlist1, List *tlist2)
SortGroupClause * get_sortgroupref_clause_noerr(Index sortref, List *clauses)
SortGroupClause * get_sortgroupref_clause(Index sortref, List *clauses)
bool grouping_is_sortable(List *groupClause)
List * make_tlist_from_pathtarget(PathTarget *target)
PathTarget * copy_pathtarget(PathTarget *src)
void add_new_columns_to_pathtarget(PathTarget *target, List *exprs)
PathTarget * create_empty_pathtarget(void)
List * get_sortgrouplist_exprs(List *sgClauses, List *targetList)
void split_pathtarget_at_srfs(PlannerInfo *root, PathTarget *target, PathTarget *input_target, List **targets, List **targets_contain_srfs)
bool grouping_is_hashable(List *groupClause)
void add_column_to_pathtarget(PathTarget *target, Expr *expr, Index sortgroupref)
#define create_pathtarget(root, tlist)
Node * flatten_group_exprs(PlannerInfo *root, Query *query, Node *node)
Relids pull_varnos(PlannerInfo *root, Node *node)
List * pull_var_clause(Node *node, int flags)
Node * flatten_join_alias_vars(PlannerInfo *root, Query *query, Node *node)