51 #define STD_FUZZ_FACTOR 1.01 123 if (fraction <= 0.0 || fraction >= 1.0)
168 #define CONSIDER_PATH_STARTUP_COST(p) \ 169 ((p)->param_info == NULL ? (p)->parent->consider_startup : (p)->parent->consider_param_startup) 213 #undef CONSIDER_PATH_STARTUP_COST 246 Path *cheapest_startup_path;
247 Path *cheapest_total_path;
248 Path *best_param_path;
249 List *parameterized_paths;
255 elog(
ERROR,
"could not devise a query plan for the given query");
257 cheapest_startup_path = cheapest_total_path = best_param_path = NULL;
258 parameterized_paths =
NIL;
268 parameterized_paths =
lappend(parameterized_paths, path);
274 if (cheapest_total_path)
282 if (best_param_path == NULL)
283 best_param_path = path;
293 best_param_path = path;
297 best_param_path = path;
316 if (cheapest_total_path == NULL)
318 cheapest_startup_path = cheapest_total_path = path;
334 cheapest_startup_path = path;
341 cheapest_total_path = path;
346 if (cheapest_total_path)
347 parameterized_paths =
lcons(cheapest_total_path, parameterized_paths);
353 if (cheapest_total_path == NULL)
354 cheapest_total_path = best_param_path;
355 Assert(cheapest_total_path != NULL);
424 bool accept_new =
true;
426 List *new_path_pathkeys;
446 bool remove_old =
false;
471 List *old_path_pathkeys;
524 else if (new_path->
rows < old_path->
rows)
526 else if (new_path->
rows > old_path->
rows)
648 List *new_path_pathkeys;
649 bool consider_startup;
653 new_path_pathkeys = required_outer ?
NIL : pathkeys;
678 List *old_path_pathkeys;
751 bool accept_new =
true;
771 bool remove_old =
false;
930 Relids required_outer,
int parallel_workers)
1000 List *indexorderbys,
1001 List *indexorderbycols,
1028 cost_index(pathnode, root, loop_count, partial_path);
1051 int parallel_degree)
1069 bitmapqual, loop_count);
1084 Relids required_outer = NULL;
1096 foreach(lc, bitmapquals)
1136 Relids required_outer = NULL;
1148 foreach(lc, bitmapquals)
1217 List *subpaths,
List *partial_subpaths,
1219 int parallel_workers,
bool parallel_aware,
1220 List *partitioned_rels,
double rows)
1225 Assert(!parallel_aware || parallel_workers > 0);
1382 List *partitioned_rels)
1385 Cost input_startup_cost;
1386 Cost input_total_cost;
1414 input_startup_cost = 0;
1415 input_total_cost = 0;
1416 foreach(l, subpaths)
1465 input_startup_cost, input_total_cost,
1492 pathnode->
quals = havingqual;
1662 List *sub_tlist_colnos;
1667 if (sub_tlist_colnos &&
1725 if (hashentrysize * pathnode->
path.
rows > hash_mem * 1024L)
1789 Relids required_outer,
double *rows)
1792 Cost input_startup_cost = 0;
1793 Cost input_total_cost = 0;
1835 input_startup_cost, input_total_cost, rows);
1861 if (!var || !
IsA(var,
Var) ||
1862 var->
varno != relid)
2135 double rows,
Cost startup_cost,
Cost total_cost,
2138 Path *fdw_outerpath,
2179 double rows,
Cost startup_cost,
Cost total_cost,
2182 Path *fdw_outerpath,
2195 elog(
ERROR,
"parameterized foreign joins are not supported yet");
2229 double rows,
Cost startup_cost,
Cost total_cost,
2231 Path *fdw_outerpath,
2277 if (!inner_paramrels)
2280 required_outer =
bms_union(outer_paramrels, inner_paramrels);
2288 required_outer = NULL;
2290 return required_outer;
2310 required_outer =
bms_union(outer_paramrels, inner_paramrels);
2312 return required_outer;
2340 List *restrict_clauses,
2361 foreach(lc, restrict_clauses)
2368 jclauses =
lappend(jclauses, rinfo);
2370 restrict_clauses = jclauses;
2428 List *restrict_clauses,
2432 List *outersortkeys,
2433 List *innersortkeys)
2495 List *restrict_clauses,
2762 foreach(lc, target->
exprs)
2768 if (tlist_rows < itemrows)
2769 tlist_rows = itemrows;
2807 double limit_tuples)
2827 root, pathkeys, presorted_keys,
2855 double limit_tuples)
2920 pathnode->
qual = qual;
3039 pathnode->
qual = qual;
3042 aggstrategy, aggcosts,
3085 bool is_first =
true;
3086 bool is_first_sort =
true;
3124 pathnode->
qual = having_qual;
3131 foreach(lc, rollups)
3161 is_first_sort =
false;
3184 is_first_sort =
false;
3259 pathnode->
quals = quals;
3263 foreach(lc, mmaggregates)
3395 pathnode->
cmd = cmd;
3534 CmdType operation,
bool canSetTag,
3536 bool partColsUpdated,
3537 List *resultRelations,
List *subpaths,
3539 List *withCheckOptionLists,
List *returningLists,
3579 foreach(lc, subpaths)
3586 if (returningLists !=
NIL)
3640 Node *limitOffset,
Node *limitCount,
3642 int64 offset_est, int64 count_est)
3671 offset_est, count_est);
3699 double input_rows = *rows;
3700 Cost input_startup_cost = *startup_cost;
3701 Cost input_total_cost = *total_cost;
3703 if (offset_est != 0)
3708 offset_rows = (double) offset_est;
3711 if (offset_rows > *rows)
3712 offset_rows = *rows;
3715 (input_total_cost - input_startup_cost)
3716 * offset_rows / input_rows;
3717 *rows -= offset_rows;
3727 count_rows = (double) count_est;
3730 if (count_rows > *rows)
3733 *total_cost = *startup_cost +
3734 (input_total_cost - input_startup_cost)
3735 * count_rows / input_rows;
3789 memcpy(newpath, ipath,
sizeof(
IndexPath));
3792 cost_index(newpath, root, loop_count,
false);
3793 return (
Path *) newpath;
3840 if (i < apath->first_partial_path)
3841 childpaths =
lappend(childpaths, spath);
3843 partialpaths =
lappend(partialpaths, spath);
3883 #define FLAT_COPY_PATH(newnode, node, nodetype) \ 3884 ( (newnode) = makeNode(nodetype), \ 3885 memcpy((newnode), (node), sizeof(nodetype)) ) 3887 #define ADJUST_CHILD_ATTRS(node) \ 3889 (List *) adjust_appendrel_attrs_multilevel(root, (Node *) (node), \ 3890 child_rel->relids, \ 3891 child_rel->top_parent_relids)) 3893 #define REPARAMETERIZE_CHILD_PATH(path) \ 3895 (path) = reparameterize_path_by_child(root, (path), child_rel); \ 3896 if ((path) == NULL) \ 3900 #define REPARAMETERIZE_CHILD_PATH_LIST(pathlist) \ 3902 if ((pathlist) != NIL) \ 3904 (pathlist) = reparameterize_pathlist_by_child(root, (pathlist), \ 3906 if ((pathlist) == NIL) \ 3948 new_path = (
Path *) ipath;
3958 new_path = (
Path *) bhpath;
3968 new_path = (
Path *) bapath;
3978 new_path = (
Path *) bopath;
3997 new_path = (
Path *) fpath;
4013 new_path = (
Path *) cpath;
4026 new_path = (
Path *) jpath;
4042 new_path = (
Path *) mpath;
4058 new_path = (
Path *) hpath;
4068 new_path = (
Path *) apath;
4078 new_path = (
Path *) gpath;
4107 if (new_ppi == NULL)
4154 foreach(lc, pathlist)
4165 result =
lappend(result, path);
Path * apply_projection_to_path(PlannerInfo *root, RelOptInfo *rel, Path *path, PathTarget *target)
struct Path * cheapest_unique_path
PathTarget * copy_pathtarget(PathTarget *src)
void final_cost_hashjoin(PlannerInfo *root, HashPath *path, JoinCostWorkspace *workspace, JoinPathExtraData *extra)
void cost_incremental_sort(Path *path, PlannerInfo *root, List *pathkeys, int presorted_keys, Cost input_startup_cost, Cost input_total_cost, double input_tuples, int width, Cost comparison_cost, int sort_mem, double limit_tuples)
double expression_returns_set_rows(PlannerInfo *root, Node *clause)
ParamPathInfo * find_param_path_info(RelOptInfo *rel, Relids required_outer)
double estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, List **pgset)
MinMaxAggPath * create_minmaxagg_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, List *mmaggregates, List *quals)
GatherPath * create_gather_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, Relids required_outer, double *rows)
#define IsA(nodeptr, _type_)
ForeignPath * create_foreign_upper_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, double rows, Cost startup_cost, Cost total_cost, List *pathkeys, Path *fdw_outerpath, List *fdw_private)
bool query_is_distinct_for(Query *query, List *colnos, List *opids)
OnConflictExpr * onconflict
void cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info, Path *bitmapqual, double loop_count)
void add_path(RelOptInfo *parent_rel, Path *new_path)
SubqueryScanPath * create_subqueryscan_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *pathkeys, Relids required_outer)
Bitmapset * bms_copy(const Bitmapset *a)
ParamPathInfo * get_baserel_parampathinfo(PlannerInfo *root, RelOptInfo *baserel, Relids required_outer)
void cost_tidscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, List *tidquals, ParamPathInfo *param_info)
void cost_windowagg(Path *path, PlannerInfo *root, List *windowFuncs, int numPartCols, int numOrderCols, Cost input_startup_cost, Cost input_total_cost, double input_tuples)
LockRowsPath * create_lockrows_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *rowMarks, int epqParam)
int bms_compare(const Bitmapset *a, const Bitmapset *b)
void cost_gather_merge(GatherMergePath *path, PlannerInfo *root, RelOptInfo *rel, ParamPathInfo *param_info, Cost input_startup_cost, Cost input_total_cost, double *rows)
SetOpPath * create_setop_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, SetOpCmd cmd, SetOpStrategy strategy, List *distinctList, AttrNumber flagColIdx, int firstFlag, double numGroups, double outputRows)
ParamPathInfo * get_joinrel_parampathinfo(PlannerInfo *root, RelOptInfo *joinrel, Path *outer_path, Path *inner_path, SpecialJoinInfo *sjinfo, Relids required_outer, List **restrict_clauses)
bool equal(const void *a, const void *b)
UpperUniquePath * create_upper_unique_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, int numCols, double numGroups)
bool add_partial_path_precheck(RelOptInfo *parent_rel, Cost total_cost, List *pathkeys)
bool add_path_precheck(RelOptInfo *parent_rel, Cost startup_cost, Cost total_cost, List *pathkeys, Relids required_outer)
void cost_namedtuplestorescan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
struct Path * cheapest_startup_path
Path * create_resultscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
void cost_agg(Path *path, PlannerInfo *root, AggStrategy aggstrategy, const AggClauseCosts *aggcosts, int numGroupCols, double numGroups, List *quals, Cost input_startup_cost, Cost input_total_cost, double input_tuples, double input_width)
BitmapOrPath * create_bitmap_or_path(PlannerInfo *root, RelOptInfo *rel, List *bitmapquals)
bool consider_param_startup
void cost_bitmap_and_node(BitmapAndPath *path, PlannerInfo *root)
MaterialPath * create_material_path(RelOptInfo *rel, Path *subpath)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
struct List *(* ReparameterizeCustomPathByChild)(PlannerInfo *root, List *custom_private, RelOptInfo *child_rel)
ParamPathInfo * param_info
Relids calc_non_nestloop_required_outer(Path *outer_path, Path *inner_path)
List * list_copy(const List *oldlist)
ProjectionPath * create_projection_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target)
LimitPath * create_limit_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, Node *limitOffset, Node *limitCount, LimitOption limitOption, int64 offset_est, int64 count_est)
List * list_concat(List *list1, const List *list2)
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 cost_valuesscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_ctescan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
Relids adjust_child_relids_multilevel(PlannerInfo *root, Relids relids, Relids child_relids, Relids top_parent_relids)
List * cheapest_parameterized_paths
PathKeysComparison compare_pathkeys(List *keys1, List *keys2)
UniquePath * create_unique_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, SpecialJoinInfo *sjinfo)
IncrementalSortPath * create_incremental_sort_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *pathkeys, int presorted_keys, double limit_tuples)
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)
static int append_total_cost_compare(const ListCell *a, const ListCell *b)
Path * create_functionscan_path(PlannerInfo *root, RelOptInfo *rel, List *pathkeys, Relids required_outer)
#define ADJUST_CHILD_ATTRS(node)
#define IS_SIMPLE_REL(rel)
void adjust_limit_rows_costs(double *rows, Cost *startup_cost, Cost *total_cost, int64 offset_est, int64 count_est)
Path * create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
#define foreach_delete_current(lst, cell)
List * list_insert_nth(List *list, int pos, void *datum)
void final_cost_nestloop(PlannerInfo *root, NestPath *path, JoinCostWorkspace *workspace, JoinPathExtraData *extra)
static List * reparameterize_pathlist_by_child(PlannerInfo *root, List *pathlist, RelOptInfo *child_rel)
bool is_parallel_safe(PlannerInfo *root, Node *node)
void cost_seqscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
static int append_startup_cost_compare(const ListCell *a, const ListCell *b)
const struct CustomPathMethods * methods
void pfree(void *pointer)
ModifyTablePath * create_modifytable_path(PlannerInfo *root, RelOptInfo *rel, CmdType operation, bool canSetTag, Index nominalRelation, Index rootRelation, bool partColsUpdated, List *resultRelations, List *subpaths, List *subroots, List *withCheckOptionLists, List *returningLists, List *rowMarks, OnConflictExpr *onconflict, int epqParam)
static List * translate_sub_tlist(List *tlist, int relid)
void cost_qual_eval(QualCost *cost, List *quals, PlannerInfo *root)
RecursiveUnionPath * create_recursiveunion_path(PlannerInfo *root, RelOptInfo *rel, Path *leftpath, Path *rightpath, PathTarget *target, List *distinctList, int wtParam, double numGroups)
void cost_subqueryscan(SubqueryScanPath *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_group(Path *path, PlannerInfo *root, int numGroupCols, double numGroups, List *quals, Cost input_startup_cost, Cost input_total_cost, double input_tuples)
#define planner_rt_fetch(rti, root)
Path * reparameterize_path_by_child(PlannerInfo *root, Path *path, RelOptInfo *child_rel)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
int compare_path_costs(Path *path1, Path *path2, CostSelector criterion)
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)
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)
struct Path * cheapest_total_path
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)
#define PATH_REQ_OUTER(path)
ForeignPath * create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, double rows, Cost startup_cost, Cost total_cost, List *pathkeys, Relids required_outer, Path *fdw_outerpath, List *fdw_private)
ProjectSetPath * create_set_projection_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target)
struct FdwRoutine * fdwroutine
static PathCostComparison compare_path_costs_fuzzily(Path *path1, Path *path2, double fuzz_factor)
Datum sort(PG_FUNCTION_ARGS)
static ListCell * list_head(const List *l)
ForeignPath * create_foreign_join_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, double rows, Cost startup_cost, Cost total_cost, List *pathkeys, Relids required_outer, Path *fdw_outerpath, List *fdw_private)
MergeAppendPath * create_merge_append_path(PlannerInfo *root, RelOptInfo *rel, List *subpaths, List *pathkeys, Relids required_outer, List *partitioned_rels)
void cost_samplescan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
bool join_clause_is_movable_into(RestrictInfo *rinfo, Relids currentrelids, Relids current_and_outer)
AppendPath * create_append_path(PlannerInfo *root, RelOptInfo *rel, List *subpaths, List *partial_subpaths, List *pathkeys, Relids required_outer, int parallel_workers, bool parallel_aware, List *partitioned_rels, double rows)
List * lappend_int(List *list, int datum)
Path * create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
List * lappend(List *list, void *datum)
bool bms_is_empty(const Bitmapset *a)
#define FLAT_COPY_PATH(newnode, node, nodetype)
void set_cheapest(RelOptInfo *parent_rel)
#define REPARAMETERIZE_CHILD_PATH(path)
BitmapAndPath * create_bitmap_and_path(PlannerInfo *root, RelOptInfo *rel, List *bitmapquals)
bool pathkeys_contained_in(List *keys1, List *keys2)
void cost_index(IndexPath *path, PlannerInfo *root, double loop_count, bool partial_path)
void cost_recursive_union(Path *runion, Path *nrterm, Path *rterm)
Path * create_samplescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
Path * create_tablefuncscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
void cost_sort(Path *path, PlannerInfo *root, List *pathkeys, Cost input_cost, double tuples, int width, Cost comparison_cost, int sort_mem, double limit_tuples)
#define REPARAMETERIZE_CHILD_PATH_LIST(pathlist)
void cost_resultscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
GatherMergePath * create_gather_merge_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, List *pathkeys, Relids required_outer, double *rows)
SortPath * create_sort_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *pathkeys, double limit_tuples)
BMS_Comparison bms_subset_compare(const Bitmapset *a, const Bitmapset *b)
void cost_material(Path *path, Cost input_startup_cost, Cost input_total_cost, double tuples, int width)
List * lcons(void *datum, List *list)
WindowAggPath * create_windowagg_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, List *windowFuncs, WindowClause *winclause)
void bms_free(Bitmapset *a)
void cost_tablefuncscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void cost_merge_append(Path *path, PlannerInfo *root, List *pathkeys, int n_streams, Cost input_startup_cost, Cost input_total_cost, double tuples)
#define CONSIDER_PATH_STARTUP_COST(p)
#define Assert(condition)
void cost_append(AppendPath *apath)
int compare_fractional_path_costs(Path *path1, Path *path2, double fraction)
Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b)
static int list_length(const List *l)
Relids calc_nestloop_required_outer(Relids outerrelids, Relids outer_paramrels, Relids innerrelids, Relids inner_paramrels)
bool query_supports_distinctness(Query *query)
void cost_gather(GatherPath *path, PlannerInfo *root, RelOptInfo *rel, ParamPathInfo *param_info, double *rows)
List * withCheckOptionLists
Bitmapset * bms_del_members(Bitmapset *a, const Bitmapset *b)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
bool is_projection_capable_path(Path *path)
TidPath * create_tidscan_path(PlannerInfo *root, RelOptInfo *rel, List *tidquals, Relids required_outer)
Path * reparameterize_path(PlannerInfo *root, Path *path, Relids required_outer, double loop_count)
void cost_functionscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void list_sort(List *list, list_sort_comparator cmp)
void add_partial_path(RelOptInfo *parent_rel, Path *new_path)
ScanDirection indexscandir
void list_free(List *list)
void cost_bitmap_or_node(BitmapOrPath *path, PlannerInfo *root)
GroupResultPath * create_group_result_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, List *havingqual)
#define CHECK_FOR_INTERRUPTS()
List *(* ReparameterizeForeignPathByChild_function)(PlannerInfo *root, List *fdw_private, RelOptInfo *child_rel)
ParamPathInfo * get_appendrel_parampathinfo(RelOptInfo *appendrel, Relids required_outer)
bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel, List *restrictlist, List *exprlist, List *oprlist)
GroupPath * create_group_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *groupClause, List *qual, double numGroups)
double clamp_row_est(double nrows)
struct PathTarget * reltarget
Path * create_seqscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer, int parallel_workers)
GroupingSetsPath * create_groupingsets_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *having_qual, AggStrategy aggstrategy, List *rollups, const AggClauseCosts *agg_costs, double numGroups)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
Datum subpath(PG_FUNCTION_ARGS)
#define foreach_current_index(cell)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
static MemoryContext GetMemoryChunkContext(void *pointer)
void final_cost_mergejoin(PlannerInfo *root, MergePath *path, JoinCostWorkspace *workspace, JoinPathExtraData *extra)
static int cmp(const chr *x, const chr *y, size_t len)
BitmapHeapPath * create_bitmap_heap_path(PlannerInfo *root, RelOptInfo *rel, Path *bitmapqual, Relids required_outer, double loop_count, int parallel_degree)
Path * create_namedtuplestorescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
ReparameterizeForeignPathByChild_function ReparameterizeForeignPathByChild
Path * create_ctescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)