31 #ifdef OPTIMIZER_DEBUG
102 List *live_childrels,
103 List *all_child_pathkeys);
109 List **special_subpaths);
218 total_pages += (double) brel->
pages;
393 if (rte->
relkind == RELKIND_FOREIGN_TABLE)
398 else if (rte->
relkind == RELKIND_PARTITIONED_TABLE)
490 if (rte->
relkind == RELKIND_FOREIGN_TABLE)
543 (*set_rel_pathlist_hook) (root, rel, rti, rte);
567 #ifdef OPTIMIZER_DEBUG
568 debug_print_rel(root, rel);
635 if (proparallel != PROPARALLEL_SAFE)
649 if (rte->
relkind == RELKIND_FOREIGN_TABLE)
801 int parallel_workers;
807 if (parallel_workers <= 0)
952 int parentRTindex = rti;
953 bool has_live_children;
956 double *parent_attrsizes;
972 rte->
relkind == RELKIND_PARTITIONED_TABLE &&
990 has_live_children =
false;
994 parent_attrsizes = (
double *)
palloc0(nattrs *
sizeof(
double));
1118 has_live_children =
true;
1137 parent_rows += childrel->
rows;
1154 if (
IsA(parentvar,
Var) && parentvar->
varno == parentRTindex)
1157 int32 child_width = 0;
1159 if (
IsA(childvar,
Var) &&
1160 ((
Var *) childvar)->varno == childrel->
relid)
1162 int cndx = ((
Var *) childvar)->varattno - childrel->
min_attr;
1166 if (child_width <= 0)
1170 parent_attrsizes[pndx] += child_width * childrel->
rows;
1175 if (has_live_children)
1183 rel->
rows = parent_rows;
1185 for (
i = 0;
i < nattrs;
i++)
1186 rel->
attr_widths[
i] = rint(parent_attrsizes[
i] / parent_rows);
1192 rel->
tuples = parent_rows;
1209 pfree(parent_attrsizes);
1220 int parentRTindex = rti;
1267 live_childrels =
lappend(live_childrels, childrel);
1288 List *live_childrels)
1291 bool subpaths_valid =
true;
1293 List *pa_partial_subpaths =
NIL;
1294 List *pa_nonpartial_subpaths =
NIL;
1295 bool partial_subpaths_valid =
true;
1296 bool pa_subpaths_valid;
1297 List *all_child_pathkeys =
NIL;
1300 double partial_rows = -1;
1310 foreach(l, live_childrels)
1314 Path *cheapest_partial_path = NULL;
1329 subpaths_valid =
false;
1336 &partial_subpaths, NULL);
1339 partial_subpaths_valid =
false;
1345 if (pa_subpaths_valid)
1347 Path *nppath = NULL;
1352 if (cheapest_partial_path == NULL && nppath == NULL)
1355 pa_subpaths_valid =
false;
1357 else if (nppath == NULL ||
1358 (cheapest_partial_path != NULL &&
1362 Assert(cheapest_partial_path != NULL);
1364 &pa_partial_subpaths,
1365 &pa_nonpartial_subpaths);
1383 &pa_nonpartial_subpaths,
1401 if (childkeys !=
NIL)
1407 foreach(lpk, all_child_pathkeys)
1421 all_child_pathkeys =
lappend(all_child_pathkeys,
1433 foreach(lco, all_child_outers)
1437 if (
bms_equal(existing_outers, childouter))
1446 all_child_outers =
lappend(all_child_outers,
1460 NIL, NULL, 0,
false,
1467 if (partial_subpaths_valid && partial_subpaths !=
NIL)
1471 int parallel_workers = 0;
1474 foreach(lc, partial_subpaths)
1480 Assert(parallel_workers > 0);
1493 parallel_workers =
Max(parallel_workers,
1495 parallel_workers =
Min(parallel_workers,
1498 Assert(parallel_workers > 0);
1502 NIL, NULL, parallel_workers,
1510 partial_rows = appendpath->
path.
rows;
1522 if (pa_subpaths_valid && pa_nonpartial_subpaths !=
NIL)
1526 int parallel_workers = 0;
1532 foreach(lc, pa_partial_subpaths)
1544 parallel_workers =
Max(parallel_workers,
1546 parallel_workers =
Min(parallel_workers,
1548 Assert(parallel_workers > 0);
1551 pa_partial_subpaths,
1552 NIL, NULL, parallel_workers,
true,
1563 all_child_pathkeys);
1578 foreach(l, all_child_outers)
1585 subpaths_valid =
true;
1586 foreach(lcr, live_childrels)
1594 subpaths_valid =
false;
1604 subpaths_valid =
false;
1613 NIL, required_outer, 0,
false,
1676 List *live_childrels,
1677 List *all_child_pathkeys)
1680 List *partition_pathkeys =
NIL;
1681 List *partition_pathkeys_desc =
NIL;
1682 bool partition_pathkeys_partial =
true;
1683 bool partition_pathkeys_desc_partial =
true;
1698 &partition_pathkeys_partial);
1702 &partition_pathkeys_desc_partial);
1716 foreach(lcp, all_child_pathkeys)
1721 List *fractional_subpaths =
NIL;
1722 bool startup_neq_total =
false;
1724 bool match_partition_order;
1725 bool match_partition_order_desc;
1736 match_partition_order =
1738 (!partition_pathkeys_partial &&
1741 match_partition_order_desc = !match_partition_order &&
1743 (!partition_pathkeys_desc_partial &&
1747 foreach(lcr, live_childrels)
1750 Path *cheapest_startup,
1752 *cheapest_fractional = NULL;
1772 if (cheapest_startup == NULL || cheapest_total == NULL)
1774 cheapest_startup = cheapest_total =
1794 cheapest_fractional =
1808 if (!cheapest_fractional)
1809 cheapest_fractional = cheapest_total;
1817 if (cheapest_startup != cheapest_total)
1818 startup_neq_total =
true;
1824 if (match_partition_order)
1836 startup_subpaths =
lappend(startup_subpaths, cheapest_startup);
1837 total_subpaths =
lappend(total_subpaths, cheapest_total);
1839 if (cheapest_fractional)
1842 fractional_subpaths =
lappend(fractional_subpaths, cheapest_fractional);
1845 else if (match_partition_order_desc)
1855 startup_subpaths =
lcons(cheapest_startup, startup_subpaths);
1856 total_subpaths =
lcons(cheapest_total, total_subpaths);
1858 if (cheapest_fractional)
1861 fractional_subpaths =
lcons(cheapest_fractional, fractional_subpaths);
1871 &startup_subpaths, NULL);
1873 &total_subpaths, NULL);
1875 if (cheapest_fractional)
1877 &fractional_subpaths, NULL);
1882 if (match_partition_order || match_partition_order_desc)
1894 if (startup_neq_total)
1905 if (fractional_subpaths)
1908 fractional_subpaths,
1924 if (startup_neq_total)
1931 if (fractional_subpaths)
1934 fractional_subpaths,
1965 Assert(cheapest != NULL);
1990 if (cheapest != NULL &&
2002 if (cheapest != NULL &&
2048 else if (special_subpaths != NULL)
2050 List *new_special_subpaths;
2056 new_special_subpaths =
2059 *special_subpaths =
list_concat(*special_subpaths,
2060 new_special_subpaths);
2072 *subpaths =
lappend(*subpaths, path);
2145 int num_base_rels = 0;
2157 if (++num_base_rels > 1)
2189 bool wfunc_left,
bool *keep_original,
2202 *keep_original =
true;
2254 foreach(lc, opinfos)
2271 *keep_original =
false;
2273 runoperator = opexpr->
opno;
2289 *keep_original =
false;
2291 runoperator = opexpr->
opno;
2308 *keep_original =
false;
2326 *keep_original =
true;
2338 if (runopexpr != NULL)
2356 otherexpr, (
Expr *) wfunc,
2391 bool keep_original =
true;
2416 opexpr,
true, &keep_original,
2418 return keep_original;
2429 opexpr,
false, &keep_original,
2431 return keep_original;
2457 double tuple_fraction;
2483 memset(&safetyInfo, 0,
sizeof(safetyInfo));
2520 List *upperrestrictlist =
NIL;
2550 upperrestrictlist =
lappend(upperrestrictlist, rinfo);
2574 if (
parse->hasAggs ||
2575 parse->groupClause ||
2576 parse->groupingSets ||
2577 parse->havingQual ||
2578 parse->distinctClause ||
2579 parse->sortClause ||
2581 tuple_fraction = 0.0;
2591 false, tuple_fraction);
2621 foreach(lc, sub_final_rel->
pathlist)
2635 pathkeys, required_outer));
2731 pathkeys, required_outer));
2798 while (levelsup-- > 0)
2927 while (levelsup-- > 0)
2971 Path *cheapest_partial_path;
2972 Path *simple_gather_path;
2975 double *rowsp = NULL;
2993 simple_gather_path = (
Path *)
3012 subpath->pathkeys, NULL, rowsp);
3040 bool require_parallel_safe)
3042 List *useful_pathkeys_list =
NIL;
3073 require_parallel_safe))
3085 useful_pathkeys_list =
lappend(useful_pathkeys_list,
3087 else if (npathkeys > 0)
3088 useful_pathkeys_list =
lappend(useful_pathkeys_list,
3093 return useful_pathkeys_list;
3111 double *rowsp = NULL;
3112 List *useful_pathkeys_list =
NIL;
3113 Path *cheapest_partial_path = NULL;
3136 foreach(lc, useful_pathkeys_list)
3174 if (cheapest_partial_path ==
subpath)
3254 if (levels_needed <= 0)
3263 foreach(jl, joinlist)
3281 elog(
ERROR,
"unrecognized joinlist node type: %d",
3286 initial_rels =
lappend(initial_rels, thisrel);
3289 if (levels_needed == 1)
3310 return geqo(root, levels_needed, initial_rels);
3372 for (lev = 2; lev <= levels_needed; lev++)
3405 if (lev < levels_needed)
3411 #ifdef OPTIMIZER_DEBUG
3412 debug_print_rel(root, rel);
3421 elog(
ERROR,
"failed to build any %d-way joins", levels_needed);
3545 if (subquery == topquery)
3581 Assert(subquery != NULL);
3599 elog(
ERROR,
"unrecognized node type: %d",
3719 if (colType == NULL)
3720 elog(
ERROR,
"wrong number of tlist entries");
3723 colType =
lnext(colTypes, colType);
3725 if (colType != NULL)
3726 elog(
ERROR,
"wrong number of tlist entries");
3842 if (var->
varno != rti)
3931 Assert(subquery != NULL);
3943 elog(
ERROR,
"unrecognized node type: %d",
3984 attrs_used = extra_used_attrs;
4089 int parallel_workers;
4090 double pages_fetched;
4099 if (parallel_workers <= 0)
4125 int parallel_workers = 0;
4148 if (heap_pages >= 0)
4150 int heap_parallel_threshold;
4151 int heap_parallel_workers = 1;
4161 while (heap_pages >= (
BlockNumber) (heap_parallel_threshold * 3))
4163 heap_parallel_workers++;
4164 heap_parallel_threshold *= 3;
4165 if (heap_parallel_threshold > INT_MAX / 3)
4169 parallel_workers = heap_parallel_workers;
4172 if (index_pages >= 0)
4174 int index_parallel_workers = 1;
4175 int index_parallel_threshold;
4179 while (index_pages >= (
BlockNumber) (index_parallel_threshold * 3))
4181 index_parallel_workers++;
4182 index_parallel_threshold *= 3;
4183 if (index_parallel_threshold > INT_MAX / 3)
4187 if (parallel_workers > 0)
4188 parallel_workers =
Min(parallel_workers, index_parallel_workers);
4190 parallel_workers = index_parallel_workers;
4195 parallel_workers =
Min(parallel_workers, max_workers);
4197 return parallel_workers;
4235 for (cnt_parts = 0; cnt_parts < num_parts; cnt_parts++)
4237 RelOptInfo *child_rel = part_rels[cnt_parts];
4240 if (child_rel == NULL)
4252 #ifdef OPTIMIZER_DEBUG
4253 debug_print_rel(root, child_rel);
4256 live_children =
lappend(live_children, child_rel);
4276 #ifdef OPTIMIZER_DEBUG
4289 if (x < root->simple_rel_array_size &&
4308 if (
lnext(clauses, l))
4330 ptype =
"SampleScan";
4333 ptype =
"FunctionScan";
4336 ptype =
"TableFuncScan";
4339 ptype =
"ValuesScan";
4345 ptype =
"NamedTuplestoreScan";
4351 ptype =
"WorkTableScan";
4362 ptype =
"BitmapHeapScan";
4365 ptype =
"BitmapAndPath";
4368 ptype =
"BitmapOrPath";
4374 ptype =
"SubqueryScan";
4377 ptype =
"ForeignScan";
4380 ptype =
"CustomScan";
4387 ptype =
"MergeJoin";
4398 ptype =
"MergeAppend";
4401 ptype =
"GroupResult";
4420 ptype =
"GatherMerge";
4424 ptype =
"Projection";
4428 ptype =
"ProjectSet";
4436 ptype =
"IncrementalSort";
4444 ptype =
"UpperUnique";
4452 ptype =
"GroupingSets";
4456 ptype =
"MinMaxAgg";
4459 ptype =
"WindowAgg";
4467 ptype =
"RecursiveUnion";
4474 ptype =
"ModifyTable";
4485 for (
i = 0;
i < indent;
i++)
4497 printf(
" required_outer (");
4501 printf(
" rows=%.0f cost=%.2f..%.2f\n",
4506 for (
i = 0;
i < indent;
i++)
4516 for (
i = 0;
i < indent;
i++)
4526 for (
i = 0;
i < indent;
i++)
4528 printf(
" sortouter=%d sortinner=%d materializeinner=%d\n",
4539 print_path(root,
subpath, indent + 1);
4548 print_relids(root, rel->
relids);
4553 printf(
"\tbaserestrictinfo: ");
4561 print_restrictclauses(root, rel->
joininfo);
4565 printf(
"\tpath list:\n");
4567 print_path(root,
lfirst(l), 1);
4570 printf(
"\n\tcheapest parameterized paths:\n");
4572 print_path(root,
lfirst(l), 1);
4576 printf(
"\n\tcheapest startup path:\n");
4581 printf(
"\n\tcheapest total path:\n");
static void set_base_rel_sizes(PlannerInfo *root)
static void set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
static bool find_window_run_conditions(Query *subquery, RangeTblEntry *rte, Index rti, AttrNumber attno, WindowFunc *wfunc, OpExpr *opexpr, bool wfunc_left, bool *keep_original, Bitmapset **run_cond_attrs)
static Path * get_cheapest_parameterized_child_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
static void set_namedtuplestore_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static void subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual)
void generate_partitionwise_join_paths(PlannerInfo *root, RelOptInfo *rel)
RelOptInfo * standard_join_search(PlannerInfo *root, int levels_needed, List *initial_rels)
static void set_base_rel_consider_startup(PlannerInfo *root)
static bool qual_is_pushdown_safe(Query *subquery, Index rti, RestrictInfo *rinfo, pushdown_safety_info *safetyInfo)
static void set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
static Path * get_singleton_append_subpath(Path *path)
static void set_tablesample_rel_size(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static void set_tablesample_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static void set_foreign_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static void set_base_rel_pathlists(PlannerInfo *root)
static void set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
static void set_result_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
int compute_parallel_worker(RelOptInfo *rel, double heap_pages, double index_pages, int max_workers)
void generate_gather_paths(PlannerInfo *root, RelOptInfo *rel, bool override_rows)
static void set_dummy_rel_pathlist(RelOptInfo *rel)
static void compare_tlist_datatypes(List *tlist, List *colTypes, pushdown_safety_info *safetyInfo)
static void set_worktable_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static bool targetIsInAllPartitionLists(TargetEntry *tle, Query *query)
static void create_plain_partial_paths(PlannerInfo *root, RelOptInfo *rel)
static bool subquery_is_pushdown_safe(Query *subquery, Query *topquery, pushdown_safety_info *safetyInfo)
join_search_hook_type join_search_hook
static bool check_and_push_window_quals(Query *subquery, RangeTblEntry *rte, Index rti, Node *clause, Bitmapset **run_cond_attrs)
void generate_useful_gather_paths(PlannerInfo *root, RelOptInfo *rel, bool override_rows)
static RelOptInfo * make_rel_from_joinlist(PlannerInfo *root, List *joinlist)
static void set_function_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static void recurse_push_qual(Node *setOp, Query *topquery, RangeTblEntry *rte, Index rti, Node *qual)
static void set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static List * get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel, bool require_parallel_safe)
static void remove_unused_subquery_outputs(Query *subquery, RelOptInfo *rel, Bitmapset *extra_used_attrs)
static void check_output_expressions(Query *subquery, pushdown_safety_info *safetyInfo)
static void set_tablefunc_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static void set_foreign_size(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
set_rel_pathlist_hook_type set_rel_pathlist_hook
static void set_values_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
struct pushdown_safety_info pushdown_safety_info
static void set_cte_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static void set_rel_consider_parallel(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
static void set_append_rel_size(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
void create_partial_bitmap_paths(PlannerInfo *root, RelOptInfo *rel, Path *bitmapqual)
static void set_plain_rel_size(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
void add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, List *live_childrels)
static void set_rel_size(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
static void generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel, List *live_childrels, List *all_child_pathkeys)
RelOptInfo * make_one_rel(PlannerInfo *root, List *joinlist)
static bool recurse_pushdown_safe(Node *setOp, Query *topquery, pushdown_safety_info *safetyInfo)
static bool has_multiple_baserels(PlannerInfo *root)
static void accumulate_append_subpath(Path *path, List **subpaths, List **special_subpaths)
int min_parallel_index_scan_size
int min_parallel_table_scan_size
Node * adjust_appendrel_attrs(PlannerInfo *root, Node *node, int nappinfos, AppendRelInfo **appinfos)
#define InvalidAttrNumber
void print_pathkeys(const List *pathkeys, const List *rtable)
void print_expr(const Node *expr, const List *rtable)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
int bms_next_member(const Bitmapset *a, int prevbit)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
bool bms_is_empty(const Bitmapset *a)
BMS_Membership bms_membership(const Bitmapset *a)
bool bms_get_singleton_member(const Bitmapset *a, int *member)
#define OidIsValid(objectId)
bool is_pseudo_constant_clause(Node *clause)
bool contain_window_function(Node *clause)
bool contain_leaked_vars(Node *clause)
bool is_parallel_safe(PlannerInfo *root, Node *node)
bool contain_subplans(Node *clause)
bool contain_volatile_functions(Node *clause)
void set_namedtuplestore_size_estimates(PlannerInfo *root, RelOptInfo *rel)
int max_parallel_workers_per_gather
void set_baserel_size_estimates(PlannerInfo *root, RelOptInfo *rel)
void set_function_size_estimates(PlannerInfo *root, RelOptInfo *rel)
double compute_bitmap_pages(PlannerInfo *root, RelOptInfo *baserel, Path *bitmapqual, int loop_count, Cost *cost, double *tuple)
void set_cte_size_estimates(PlannerInfo *root, RelOptInfo *rel, double cte_rows)
void set_result_size_estimates(PlannerInfo *root, RelOptInfo *rel)
bool enable_partitionwise_join
void set_subquery_size_estimates(PlannerInfo *root, RelOptInfo *rel)
bool enable_parallel_append
void set_foreign_size_estimates(PlannerInfo *root, RelOptInfo *rel)
double clamp_row_est(double nrows)
void set_tablefunc_size_estimates(PlannerInfo *root, RelOptInfo *rel)
void set_values_size_estimates(PlannerInfo *root, RelOptInfo *rel)
bool enable_incremental_sort
static void PGresult * res
void add_child_rel_equivalences(PlannerInfo *root, AppendRelInfo *appinfo, RelOptInfo *parent_rel, RelOptInfo *child_rel)
bool relation_can_be_sorted_early(PlannerInfo *root, RelOptInfo *rel, EquivalenceClass *ec, bool require_parallel_safe)
#define OidFunctionCall1(functionId, arg1)
RelOptInfo * geqo(PlannerInfo *root, int number_of_rels, List *initial_rels)
void check_index_predicates(PlannerInfo *root, RelOptInfo *rel)
void create_index_paths(PlannerInfo *root, RelOptInfo *rel)
void join_search_one_level(PlannerInfo *root, int level)
void mark_dummy_rel(RelOptInfo *rel)
static void const char fflush(stdout)
Assert(fmt[strlen(fmt) - 1] !='\n')
List * list_truncate(List *list, int new_size)
List * lappend(List *list, void *datum)
List * list_copy(const List *oldlist)
void list_free(List *list)
List * list_copy_tail(const List *oldlist, int nskip)
List * list_concat(List *list1, const List *list2)
List * lcons(void *datum, List *list)
char get_rel_persistence(Oid relid)
char func_parallel(Oid funcid)
RegProcedure get_func_support(Oid funcid)
Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy)
List * get_op_btree_interpretation(Oid opno)
int32 get_typavgwidth(Oid typid, int32 typmod)
Datum subpath(PG_FUNCTION_ARGS)
Expr * make_opclause(Oid opno, Oid opresulttype, bool opretset, Expr *leftop, Expr *rightop, Oid opcollid, Oid inputcollid)
Const * makeNullConst(Oid consttype, int32 consttypmod, Oid constcollid)
Node * make_and_qual(Node *qual1, Node *qual2)
void pfree(void *pointer)
void * palloc0(Size size)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
Oid exprCollation(const Node *expr)
bool expression_returns_set(Node *clause)
#define IsA(nodeptr, _type_)
@ T_SupportRequestWFuncMonotonic
#define castNode(_type_, nodeptr)
#define PVC_INCLUDE_PLACEHOLDERS
bool targetIsInSortList(TargetEntry *tle, Oid sortop, List *sortList)
#define rt_fetch(rangetable_index, rangetable)
bool partitions_are_ordered(PartitionBoundInfo boundinfo, Bitmapset *live_parts)
Path * get_cheapest_path_for_pathkeys(List *paths, List *pathkeys, Relids required_outer, CostSelector cost_criterion, bool require_parallel_safe)
bool pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common)
bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel)
List * build_expression_pathkey(PlannerInfo *root, Expr *expr, Relids nullable_relids, Oid opno, Relids rel, bool create_it)
Path * get_cheapest_parallel_safe_total_inner(List *paths)
List * convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel, List *subquery_pathkeys, List *subquery_tlist)
Path * get_cheapest_fractional_path_for_pathkeys(List *paths, List *pathkeys, Relids required_outer, double fraction)
bool pathkeys_contained_in(List *keys1, List *keys2)
PathKeysComparison compare_pathkeys(List *keys1, List *keys2)
List * build_partition_pathkeys(PlannerInfo *root, RelOptInfo *partrel, ScanDirection scandir, bool *partialkeys)
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)
SortPath * create_sort_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *pathkeys, double limit_tuples)
GatherMergePath * create_gather_merge_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, List *pathkeys, Relids required_outer, double *rows)
Path * create_tablefuncscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
Path * create_namedtuplestorescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
GatherPath * create_gather_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, PathTarget *target, Relids required_outer, double *rows)
Path * create_resultscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
Path * create_samplescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
MergeAppendPath * create_merge_append_path(PlannerInfo *root, RelOptInfo *rel, List *subpaths, List *pathkeys, Relids required_outer)
void set_cheapest(RelOptInfo *parent_rel)
Path * reparameterize_path(PlannerInfo *root, Path *path, Relids required_outer, double loop_count)
Path * create_ctescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
void add_partial_path(RelOptInfo *parent_rel, Path *new_path)
MaterialPath * create_material_path(RelOptInfo *rel, Path *subpath)
Path * create_functionscan_path(PlannerInfo *root, RelOptInfo *rel, List *pathkeys, Relids required_outer)
SubqueryScanPath * create_subqueryscan_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *pathkeys, Relids required_outer)
IncrementalSortPath * create_incremental_sort_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, List *pathkeys, int presorted_keys, double limit_tuples)
Path * create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
void add_path(RelOptInfo *parent_rel, Path *new_path)
Path * create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer)
int compare_path_costs(Path *path1, Path *path2, CostSelector criterion)
Path * create_seqscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer, int parallel_workers)
BitmapHeapPath * create_bitmap_heap_path(PlannerInfo *root, RelOptInfo *rel, Path *bitmapqual, Relids required_outer, double loop_count, int parallel_degree)
#define IS_SIMPLE_REL(rel)
#define IS_PARTITIONED_REL(rel)
#define PATH_REQ_OUTER(path)
@ RELOPT_OTHER_MEMBER_REL
RelOptInfo *(* join_search_hook_type)(PlannerInfo *root, int levels_needed, List *initial_rels)
void(* set_rel_pathlist_hook_type)(PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte)
static int list_length(const List *l)
#define forboth(cell1, list1, cell2, list2)
static ListCell * list_head(const List *l)
#define for_each_from(cell, lst, N)
static void * list_nth(const List *list, int n)
static ListCell * lnext(const List *l, const ListCell *c)
static int list_nth_int(const List *list, int n)
bool relation_excluded_by_constraints(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
PlannerInfo * subquery_planner(PlannerGlobal *glob, Query *parse, PlannerInfo *parent_root, bool hasRecursion, double tuple_fraction)
bool limit_needed(Query *parse)
@ MONOTONICFUNC_DECREASING
@ MONOTONICFUNC_INCREASING
void check_stack_depth(void)
#define DatumGetPointer(X)
#define PointerGetDatum(X)
static struct subre * parse(struct vars *, int, int, struct state *, struct state *)
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
RelOptInfo * fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind, Relids relids)
Node * ReplaceVarsFromTargetList(Node *node, int target_varno, int sublevels_up, RangeTblEntry *target_rte, List *targetlist, ReplaceVarsNoMatchOption nomatch_option, int nomatch_varno, bool *outer_hasSubLinks)
@ REPLACEVARS_REPORT_ERROR
#define BTGreaterStrategyNumber
#define BTLessStrategyNumber
#define BTEqualStrategyNumber
#define BTLessEqualStrategyNumber
#define BTGreaterEqualStrategyNumber
IsForeignScanParallelSafe_function IsForeignScanParallelSafe
GetForeignPaths_function GetForeignPaths
GetForeignRelSize_function GetForeignRelSize
EquivalenceClass * pk_eclass
ParamPathInfo * param_info
int simple_rel_array_size
struct Path * non_recursive_path
struct RelOptInfo ** simple_rel_array
RangeTblEntry ** simple_rte_array
PlannerInfo * parent_root
Cardinality total_table_pages
Selectivity tuple_fraction
struct TableSampleClause * tablesample
bool consider_param_startup
struct PathTarget * reltarget
struct FdwRoutine * fdwroutine
struct PartitionBoundInfoData * boundinfo
PartitionScheme part_scheme
List * cheapest_parameterized_paths
struct Path * cheapest_startup_path
struct Path * cheapest_total_path
struct RelOptInfo ** part_rels
bool consider_partitionwise_join
struct WindowClause * window_clause
bool repeatable_across_scans
SampleScanGetSampleSize_function SampleScanGetSampleSize
#define FirstLowInvalidHeapAttributeNumber
TsmRoutine * GetTsmRoutine(Oid tsmhandler)
void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel)
List * make_tlist_from_pathtarget(PathTarget *target)
List * pull_var_clause(Node *node, int flags)
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)