47#define STD_FUZZ_FACTOR 1.01
73 if (
path1->disabled_nodes <
path2->disabled_nodes)
105 if (
path1->startup_cost <
path2->startup_cost)
107 if (
path1->startup_cost >
path2->startup_cost)
132 if (
path1->disabled_nodes <
path2->disabled_nodes)
183#define CONSIDER_PATH_STARTUP_COST(p) \
184 ((p)->param_info == NULL ? (p)->parent->consider_startup : (p)->parent->consider_param_startup)
189 if (
path1->disabled_nodes <
path2->disabled_nodes)
237#undef CONSIDER_PATH_STARTUP_COST
270 Path *cheapest_startup_path;
271 Path *cheapest_total_path;
279 elog(
ERROR,
"could not devise a query plan for the given query");
289 if (path->param_info)
298 if (cheapest_total_path)
340 if (cheapest_total_path ==
NULL)
342 cheapest_startup_path = cheapest_total_path = path;
358 cheapest_startup_path = path;
365 cheapest_total_path = path;
370 if (cheapest_total_path)
377 if (cheapest_total_path ==
NULL)
381 parent_rel->cheapest_startup_path = cheapest_startup_path;
382 parent_rel->cheapest_total_path = cheapest_total_path;
691 bool consider_startup;
915 bool consider_startup =
parent_rel->consider_startup;
951 if (consider_startup &&
959 if (consider_startup &&
1009 total_cost, pathkeys,
NULL))
1036 pathnode->parallel_aware = (parallel_workers > 0);
1038 pathnode->parallel_workers = parallel_workers;
1095 List *indexorderbys,
1096 List *indexorderbycols,
1112 pathnode->path.parallel_aware =
false;
1114 pathnode->path.parallel_workers = 0;
1115 pathnode->path.pathkeys = pathkeys;
1118 pathnode->indexclauses = indexclauses;
1119 pathnode->indexorderbys = indexorderbys;
1120 pathnode->indexorderbycols = indexorderbycols;
1121 pathnode->indexscandir = indexscandir;
1130 if (
index->disabled)
1199 foreach(
lc, bitmapquals)
1215 pathnode->path.parallel_aware =
false;
1217 pathnode->path.parallel_workers = 0;
1221 pathnode->bitmapquals = bitmapquals;
1251 foreach(
lc, bitmapquals)
1267 pathnode->path.parallel_aware =
false;
1269 pathnode->path.parallel_workers = 0;
1273 pathnode->bitmapquals = bitmapquals;
1296 pathnode->path.parallel_aware =
false;
1298 pathnode->path.parallel_workers = 0;
1317 int parallel_workers)
1326 pathnode->path.parallel_aware = (parallel_workers > 0);
1328 pathnode->path.parallel_workers = parallel_workers;
1331 pathnode->tidrangequals = tidrangequals;
1356 int parallel_workers,
bool parallel_aware,
1362 Assert(!parallel_aware || parallel_workers > 0);
1364 pathnode->child_append_relid_sets =
input.child_append_relid_sets;
1388 pathnode->path.parallel_aware = parallel_aware;
1390 pathnode->path.parallel_workers = parallel_workers;
1391 pathnode->path.pathkeys = pathkeys;
1527 List *child_append_relid_sets,
1543 pathnode->child_append_relid_sets = child_append_relid_sets;
1548 pathnode->path.parallel_aware =
false;
1550 pathnode->path.parallel_workers = 0;
1551 pathnode->path.pathkeys = pathkeys;
1570 foreach(l, subpaths)
1671 pathnode->path.pathtarget = target;
1673 pathnode->path.parallel_aware =
false;
1675 pathnode->path.parallel_workers = 0;
1722 pathnode->path.parallel_aware =
false;
1747 List *param_exprs,
List *hash_operators,
1748 bool singlerow,
bool binary_mode,
Cardinality est_calls)
1758 pathnode->path.parallel_aware =
false;
1765 pathnode->hash_operators = hash_operators;
1766 pathnode->param_exprs = param_exprs;
1768 pathnode->binary_mode = binary_mode;
1833 elog(
ERROR,
"gather merge input not sufficiently sorted");
1839 pathnode->path.parallel_aware =
false;
1843 pathnode->path.pathkeys = pathkeys;
1874 pathnode->path.pathtarget = target;
1877 pathnode->path.parallel_aware =
false;
1878 pathnode->path.parallel_safe =
false;
1879 pathnode->path.parallel_workers = 0;
1920 pathnode->path.parallel_aware =
false;
1924 pathnode->path.pathkeys = pathkeys;
2130 double rows,
int disabled_nodes,
2131 Cost startup_cost,
Cost total_cost,
2134 Path *fdw_outerpath,
2135 List *fdw_restrictinfo,
2148 pathnode->path.parallel_aware =
false;
2150 pathnode->path.parallel_workers = 0;
2152 pathnode->path.disabled_nodes = disabled_nodes;
2153 pathnode->path.startup_cost = startup_cost;
2154 pathnode->path.total_cost = total_cost;
2155 pathnode->path.pathkeys = pathkeys;
2157 pathnode->fdw_outerpath = fdw_outerpath;
2158 pathnode->fdw_restrictinfo = fdw_restrictinfo;
2159 pathnode->fdw_private = fdw_private;
2178 double rows,
int disabled_nodes,
2179 Cost startup_cost,
Cost total_cost,
2182 Path *fdw_outerpath,
2183 List *fdw_restrictinfo,
2196 elog(
ERROR,
"parameterized foreign joins are not supported yet");
2202 pathnode->path.parallel_aware =
false;
2204 pathnode->path.parallel_workers = 0;
2206 pathnode->path.disabled_nodes = disabled_nodes;
2207 pathnode->path.startup_cost = startup_cost;
2208 pathnode->path.total_cost = total_cost;
2209 pathnode->path.pathkeys = pathkeys;
2211 pathnode->fdw_outerpath = fdw_outerpath;
2212 pathnode->fdw_restrictinfo = fdw_restrictinfo;
2213 pathnode->fdw_private = fdw_private;
2232 double rows,
int disabled_nodes,
2233 Cost startup_cost,
Cost total_cost,
2235 Path *fdw_outerpath,
2236 List *fdw_restrictinfo,
2251 pathnode->path.parallel_aware =
false;
2253 pathnode->path.parallel_workers = 0;
2255 pathnode->path.disabled_nodes = disabled_nodes;
2256 pathnode->path.startup_cost = startup_cost;
2257 pathnode->path.total_cost = total_cost;
2258 pathnode->path.pathkeys = pathkeys;
2260 pathnode->fdw_outerpath = fdw_outerpath;
2261 pathnode->fdw_restrictinfo = fdw_restrictinfo;
2262 pathnode->fdw_private = fdw_private;
2325 outerrelids =
outer_path->parent->top_parent_relids;
2376 outerrelids =
outer_path->parent->top_parent_relids;
2405 pathnode->jpath.path.parent = joinrel;
2415 pathnode->jpath.path.parallel_aware =
false;
2420 pathnode->jpath.path.pathkeys = pathkeys;
2421 pathnode->jpath.jointype = jointype;
2464 List *outersortkeys,
2465 List *innersortkeys,
2466 int outer_presorted_keys)
2471 pathnode->jpath.path.parent = joinrel;
2481 pathnode->jpath.path.parallel_aware =
false;
2486 pathnode->jpath.path.pathkeys = pathkeys;
2487 pathnode->jpath.jointype = jointype;
2492 pathnode->path_mergeclauses = mergeclauses;
2493 pathnode->outersortkeys = outersortkeys;
2494 pathnode->innersortkeys = innersortkeys;
2495 pathnode->outer_presorted_keys = outer_presorted_keys;
2536 pathnode->jpath.path.parent = joinrel;
2546 pathnode->jpath.path.parallel_aware =
2565 pathnode->jpath.jointype = jointype;
2570 pathnode->path_hashclauses = hashclauses;
2613 pathnode->path.pathtarget = target;
2615 pathnode->path.parallel_aware =
false;
2714 oldcost = path->pathtarget->cost;
2715 path->pathtarget = target;
2746 gpath->subpath->parent,
2796 pathnode->path.pathtarget = target;
2799 pathnode->path.parallel_aware =
false;
2860 double limit_tuples)
2870 pathnode->path.parallel_aware =
false;
2874 pathnode->path.pathkeys = pathkeys;
2879 root, pathkeys, presorted_keys,
2888 sort->nPresortedCols = presorted_keys;
2908 double limit_tuples)
2917 pathnode->path.parallel_aware =
false;
2921 pathnode->path.pathkeys = pathkeys;
2960 pathnode->path.pathtarget = target;
2963 pathnode->path.parallel_aware =
false;
2972 pathnode->groupClause = groupClause;
3018 pathnode->path.parallel_aware =
false;
3072 pathnode->path.pathtarget = target;
3074 pathnode->path.parallel_aware =
false;
3091 root->num_groupby_pathkeys);
3100 pathnode->aggstrategy = aggstrategy;
3104 pathnode->groupClause = groupClause;
3156 pathnode->path.pathtarget = target;
3158 pathnode->path.parallel_aware =
false;
3187 pathnode->aggstrategy = aggstrategy;
3196 foreach(
lc, rollups)
3316 pathnode->path.pathtarget = target;
3319 pathnode->path.parallel_aware =
false;
3320 pathnode->path.parallel_safe =
true;
3321 pathnode->path.parallel_workers = 0;
3326 pathnode->mmaggregates = mmaggregates;
3331 foreach(
lc, mmaggregates)
3337 if (!
mminfo->path->parallel_safe)
3338 pathnode->path.parallel_safe =
false;
3410 pathnode->path.pathtarget = target;
3413 pathnode->path.parallel_aware =
false;
3423 pathnode->runCondition = runCondition;
3483 pathnode->path.parallel_aware =
false;
3561 leftpath->pathtarget->width);
3598 pathnode->path.pathtarget = target;
3601 pathnode->path.parallel_aware =
false;
3611 pathnode->distinctList = distinctList;
3641 pathnode->path.parallel_aware =
false;
3642 pathnode->path.parallel_safe =
false;
3643 pathnode->path.parallel_workers = 0;
3694 CmdType operation,
bool canSetTag,
3696 List *resultRelations,
3697 List *updateColnosLists,
3698 List *withCheckOptionLists,
List *returningLists,
3700 List *mergeActionLists,
List *mergeJoinConditions,
3708 updateColnosLists ==
NIL));
3720 pathnode->path.parallel_aware =
false;
3721 pathnode->path.parallel_safe =
false;
3722 pathnode->path.parallel_workers = 0;
3738 if (returningLists !=
NIL)
3753 pathnode->path.pathtarget->width = 0;
3759 pathnode->nominalRelation = nominalRelation;
3760 pathnode->rootRelation = rootRelation;
3761 pathnode->resultRelations = resultRelations;
3762 pathnode->updateColnosLists = updateColnosLists;
3763 pathnode->withCheckOptionLists = withCheckOptionLists;
3764 pathnode->returningLists = returningLists;
3768 pathnode->mergeActionLists = mergeActionLists;
3769 pathnode->mergeJoinConditions = mergeJoinConditions;
3794 Node *limitOffset,
Node *limitCount,
3806 pathnode->path.parallel_aware =
false;
3816 pathnode->limitOffset = limitOffset;
3818 pathnode->limitOption = limitOption;
3826 offset_est, count_est);
3858 if (offset_est != 0)
3888 *total_cost = *startup_cost +
4018 apath->path.parallel_workers,
4019 apath->path.parallel_aware,
4050 mpath->hash_operators,
4094#define ADJUST_CHILD_ATTRS(node) \
4095 ((node) = (void *) adjust_appendrel_attrs_multilevel(root, \
4098 child_rel->top_parent))
4100#define REPARAMETERIZE_CHILD_PATH(path) \
4102 (path) = reparameterize_path_by_child(root, (path), child_rel); \
4103 if ((path) == NULL) \
4107#define REPARAMETERIZE_CHILD_PATH_LIST(pathlist) \
4109 if ((pathlist) != NIL) \
4111 (pathlist) = reparameterize_pathlist_by_child(root, (pathlist), \
4113 if ((pathlist) == NIL) \
4122 if (!path->param_info ||
4202 if (
fpath->fdw_outerpath)
4204 if (
fpath->fdw_restrictinfo)
4209 path->parent->fdwroutine->ReparameterizeForeignPathByChild;
4223 if (
cpath->custom_restrictinfo)
4225 if (
cpath->methods &&
4226 cpath->methods->ReparameterizeCustomPathByChild)
4227 cpath->custom_private =
4228 cpath->methods->ReparameterizeCustomPathByChild(
root,
4229 cpath->custom_private,
4384#define REJECT_IF_PATH_NOT_REPARAMETERIZABLE(path) \
4386 if (!path_is_reparameterizable_by_child(path, child_rel)) \
4390#define REJECT_IF_PATH_LIST_NOT_REPARAMETERIZABLE(pathlist) \
4392 if (!pathlist_is_reparameterizable_by_child(pathlist, child_rel)) \
4400 if (!path->param_info ||
4442 if (
fpath->fdw_outerpath)
4520 foreach(
lc, pathlist)
4531 result =
lappend(result, path);
4546 foreach(
lc, pathlist)
Datum sort(PG_FUNCTION_ARGS)
Relids adjust_child_relids_multilevel(PlannerInfo *root, Relids relids, RelOptInfo *childrel, RelOptInfo *parentrel)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
BMS_Comparison bms_subset_compare(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_del_members(Bitmapset *a, const Bitmapset *b)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
void bms_free(Bitmapset *a)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
int bms_compare(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_copy(const Bitmapset *a)
#define PG_USED_FOR_ASSERTS_ONLY
#define Assert(condition)
bool is_parallel_safe(PlannerInfo *root, Node *node)
double expression_returns_set_rows(PlannerInfo *root, Node *clause)
void final_cost_hashjoin(PlannerInfo *root, HashPath *path, JoinCostWorkspace *workspace, JoinPathExtraData *extra)
void final_cost_mergejoin(PlannerInfo *root, MergePath *path, JoinCostWorkspace *workspace, JoinPathExtraData *extra)
void cost_material(Path *path, bool enabled, int input_disabled_nodes, Cost input_startup_cost, Cost input_total_cost, double tuples, int width)
void cost_windowagg(Path *path, PlannerInfo *root, List *windowFuncs, WindowClause *winclause, int input_disabled_nodes, Cost input_startup_cost, Cost input_total_cost, double input_tuples)
void cost_functionscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info, Path *bitmapqual, double loop_count)
void cost_tidrangescan(Path *path, PlannerInfo *root, RelOptInfo *baserel, List *tidrangequals, ParamPathInfo *param_info)
void cost_agg(Path *path, PlannerInfo *root, AggStrategy aggstrategy, const AggClauseCosts *aggcosts, int numGroupCols, double numGroups, List *quals, int disabled_nodes, Cost input_startup_cost, Cost input_total_cost, double input_tuples, double input_width)
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)
void final_cost_nestloop(PlannerInfo *root, NestPath *path, JoinCostWorkspace *workspace, JoinPathExtraData *extra)
void cost_gather_merge(GatherMergePath *path, PlannerInfo *root, RelOptInfo *rel, ParamPathInfo *param_info, int input_disabled_nodes, Cost input_startup_cost, Cost input_total_cost, double *rows)
void cost_recursive_union(Path *runion, Path *nrterm, Path *rterm)
void cost_tablefuncscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_samplescan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_gather(GatherPath *path, PlannerInfo *root, RelOptInfo *rel, ParamPathInfo *param_info, double *rows)
void cost_append(AppendPath *apath, PlannerInfo *root)
void cost_namedtuplestorescan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_seqscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_valuesscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_incremental_sort(Path *path, PlannerInfo *root, List *pathkeys, int presorted_keys, int input_disabled_nodes, Cost input_startup_cost, Cost input_total_cost, double input_tuples, int width, Cost comparison_cost, int sort_mem, double limit_tuples)
void cost_qual_eval(QualCost *cost, List *quals, PlannerInfo *root)
void cost_group(Path *path, PlannerInfo *root, int numGroupCols, double numGroups, List *quals, int input_disabled_nodes, Cost input_startup_cost, Cost input_total_cost, double input_tuples)
void cost_resultscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_bitmap_and_node(BitmapAndPath *path, PlannerInfo *root)
void cost_tidscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, List *tidquals, ParamPathInfo *param_info)
void cost_merge_append(Path *path, PlannerInfo *root, List *pathkeys, int n_streams, int input_disabled_nodes, Cost input_startup_cost, Cost input_total_cost, double tuples)
double clamp_row_est(double nrows)
void cost_subqueryscan(SubqueryScanPath *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info, bool trivial_pathtarget)
void cost_ctescan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_bitmap_or_node(BitmapOrPath *path, PlannerInfo *root)
void cost_index(IndexPath *path, PlannerInfo *root, double loop_count, bool partial_path)
bool enable_incremental_sort
bool is_projection_capable_path(Path *path)
bool equal(const void *a, const void *b)
List *(* ReparameterizeForeignPathByChild_function)(PlannerInfo *root, List *fdw_private, RelOptInfo *child_rel)
List * lappend(List *list, void *datum)
void list_sort(List *list, list_sort_comparator cmp)
List * list_concat(List *list1, const List *list2)
List * lcons(void *datum, List *list)
void list_free(List *list)
List * list_copy_head(const List *oldlist, int len)
List * list_insert_nth(List *list, int pos, void *datum)
Datum subpath(PG_FUNCTION_ARGS)
void pfree(void *pointer)
MemoryContext GetMemoryChunkContext(void *pointer)
#define CHECK_FOR_INTERRUPTS()
size_t get_hash_memory_limit(void)
Size EstimateSetOpHashTableSpace(double nentries, Size tupleWidth)
#define IsA(nodeptr, _type_)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
bool pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common)
bool pathkeys_contained_in(List *keys1, List *keys2)
PathKeysComparison compare_pathkeys(List *keys1, List *keys2)
#define REPARAMETERIZE_CHILD_PATH_LIST(pathlist)
static int append_startup_cost_compare(const ListCell *a, const ListCell *b)
#define REPARAMETERIZE_CHILD_PATH(path)
Relids calc_non_nestloop_required_outer(Path *outer_path, Path *inner_path)
static PathCostComparison compare_path_costs_fuzzily(Path *path1, Path *path2, double fuzz_factor)
ForeignPath * create_foreign_upper_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, double rows, int disabled_nodes, Cost startup_cost, Cost total_cost, List *pathkeys, Path *fdw_outerpath, List *fdw_restrictinfo, List *fdw_private)
BitmapAndPath * create_bitmap_and_path(PlannerInfo *root, RelOptInfo *rel, List *bitmapquals)
Path * create_functionscan_path(PlannerInfo *root, RelOptInfo *rel, List *pathkeys, Relids required_outer)
bool path_is_reparameterizable_by_child(Path *path, RelOptInfo *child_rel)
MemoizePath * create_memoize_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *param_exprs, List *hash_operators, bool singlerow, bool binary_mode, Cardinality est_calls)
Path * create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
MaterialPath * create_material_path(RelOptInfo *rel, Path *subpath, bool enabled)
MinMaxAggPath * create_minmaxagg_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, List *mmaggregates, List *quals)
bool add_partial_path_precheck(RelOptInfo *parent_rel, int disabled_nodes, Cost startup_cost, Cost total_cost, List *pathkeys)
Path * create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
static bool pathlist_is_reparameterizable_by_child(List *pathlist, RelOptInfo *child_rel)
SetOpPath * create_setop_path(PlannerInfo *root, RelOptInfo *rel, Path *leftpath, Path *rightpath, SetOpCmd cmd, SetOpStrategy strategy, List *groupList, double numGroups, double outputRows)
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)
Relids calc_nestloop_required_outer(Relids outerrelids, Relids outer_paramrels, Relids innerrelids, Relids inner_paramrels)
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)
#define REJECT_IF_PATH_LIST_NOT_REPARAMETERIZABLE(pathlist)
TidRangePath * create_tidrangescan_path(PlannerInfo *root, RelOptInfo *rel, List *tidrangequals, Relids required_outer, int parallel_workers)
static List * reparameterize_pathlist_by_child(PlannerInfo *root, List *pathlist, RelOptInfo *child_rel)
WindowAggPath * create_windowagg_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, List *windowFuncs, List *runCondition, WindowClause *winclause, List *qual, bool topwindow)
Path * reparameterize_path_by_child(PlannerInfo *root, Path *path, RelOptInfo *child_rel)
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)
HashPath * create_hashjoin_path(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, JoinCostWorkspace *workspace, JoinPathExtraData *extra, Path *outer_path, Path *inner_path, bool parallel_hash, List *restrict_clauses, Relids required_outer, List *hashclauses)
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)
Path * create_namedtuplestorescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
SubqueryScanPath * create_subqueryscan_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, bool trivial_pathtarget, List *pathkeys, Relids required_outer)
#define ADJUST_CHILD_ATTRS(node)
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)
BitmapOrPath * create_bitmap_or_path(PlannerInfo *root, RelOptInfo *rel, List *bitmapquals)
GroupingSetsPath * create_groupingsets_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *having_qual, AggStrategy aggstrategy, List *rollups, const AggClauseCosts *agg_costs)
BitmapHeapPath * create_bitmap_heap_path(PlannerInfo *root, RelOptInfo *rel, Path *bitmapqual, Relids required_outer, double loop_count, int parallel_degree)
Path * create_tablefuncscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
#define REJECT_IF_PATH_NOT_REPARAMETERIZABLE(path)
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)
ForeignPath * create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, double rows, int disabled_nodes, Cost startup_cost, Cost total_cost, List *pathkeys, Relids required_outer, Path *fdw_outerpath, List *fdw_restrictinfo, List *fdw_private)
MergeAppendPath * create_merge_append_path(PlannerInfo *root, RelOptInfo *rel, List *subpaths, List *child_append_relid_sets, List *pathkeys, Relids required_outer)
TidPath * create_tidscan_path(PlannerInfo *root, RelOptInfo *rel, List *tidquals, Relids required_outer)
#define CONSIDER_PATH_STARTUP_COST(p)
GatherPath * create_gather_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, Relids required_outer, double *rows)
Path * create_samplescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
ForeignPath * create_foreign_join_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, double rows, int disabled_nodes, Cost startup_cost, Cost total_cost, List *pathkeys, Relids required_outer, Path *fdw_outerpath, List *fdw_restrictinfo, List *fdw_private)
void add_path(RelOptInfo *parent_rel, Path *new_path)
int compare_path_costs(Path *path1, Path *path2, CostSelector criterion)
bool add_path_precheck(RelOptInfo *parent_rel, int disabled_nodes, Cost startup_cost, Cost total_cost, List *pathkeys, Relids required_outer)
static int append_total_cost_compare(const ListCell *a, const ListCell *b)
Path * create_resultscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
AppendPath * create_append_path(PlannerInfo *root, RelOptInfo *rel, AppendPathInput input, List *pathkeys, Relids required_outer, int parallel_workers, bool parallel_aware, double rows)
void adjust_limit_rows_costs(double *rows, Cost *startup_cost, Cost *total_cost, int64 offset_est, int64 count_est)
Path * create_ctescan_path(PlannerInfo *root, RelOptInfo *rel, List *pathkeys, Relids required_outer)
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)
MergePath * create_mergejoin_path(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, JoinCostWorkspace *workspace, JoinPathExtraData *extra, Path *outer_path, Path *inner_path, List *restrict_clauses, List *pathkeys, Relids required_outer, List *mergeclauses, List *outersortkeys, List *innersortkeys, int outer_presorted_keys)
RecursiveUnionPath * create_recursiveunion_path(PlannerInfo *root, RelOptInfo *rel, Path *leftpath, Path *rightpath, PathTarget *target, List *distinctList, int wtParam, double numGroups)
GroupResultPath * create_group_result_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, List *havingqual)
Path * reparameterize_path(PlannerInfo *root, Path *path, Relids required_outer, double loop_count)
NestPath * create_nestloop_path(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, JoinCostWorkspace *workspace, JoinPathExtraData *extra, Path *outer_path, Path *inner_path, List *restrict_clauses, List *pathkeys, Relids required_outer)
#define IS_SIMPLE_REL(rel)
#define PATH_REQ_OUTER(path)
#define planner_rt_fetch(rti, root)
static int list_length(const List *l)
#define foreach_current_index(var_or_cell)
#define foreach_delete_current(lst, var_or_cell)
static int cmp(const chr *x, const chr *y, size_t len)
ParamPathInfo * get_appendrel_parampathinfo(RelOptInfo *appendrel, Relids required_outer)
ParamPathInfo * get_joinrel_parampathinfo(PlannerInfo *root, RelOptInfo *joinrel, Path *outer_path, Path *inner_path, SpecialJoinInfo *sjinfo, Relids required_outer, List **restrict_clauses)
ParamPathInfo * get_baserel_parampathinfo(PlannerInfo *root, RelOptInfo *baserel, Relids required_outer)
ParamPathInfo * find_param_path_info(RelOptInfo *rel, Relids required_outer)
Bitmapset * get_param_path_clause_serials(Path *path)
struct PathTarget * reltarget
PathTarget * copy_pathtarget(PathTarget *src)