114#define LOG2(x) (log(x) / 0.693147180559945)
121#define APPEND_CPU_COST_MULTIPLIER 0.5
129#define MAXIMUM_ROWCOUNT 1e100
200 List **restrictlist);
202 int parallel_workers);
206static double page_size(
double tuples,
int width);
225 else if (nrows <= 1.0)
274 Cost startup_cost = 0;
309 startup_cost += path->pathtarget->cost.startup;
353 Cost startup_cost = 0;
359 spc_random_page_cost,
381 &spc_random_page_cost,
408 startup_cost += path->pathtarget->cost.startup;
409 run_cost += path->pathtarget->cost.per_tuple * path->
rows;
435 Cost startup_cost = 0;
477 Cost startup_cost = 0;
554 Cost startup_cost = 0;
557 Cost indexStartupCost;
560 double indexCorrelation,
563 spc_random_page_cost;
568 double tuples_fetched;
587 if (path->
path.param_info)
619 &indexStartupCost, &indexTotalCost,
620 &indexSelectivity, &indexCorrelation,
632 startup_cost += indexStartupCost;
633 run_cost += indexTotalCost - indexStartupCost;
640 &spc_random_page_cost,
682 (
double)
index->pages,
706 (
double)
index->pages,
722 (
double)
index->pages,
785 csquared = indexCorrelation * indexCorrelation;
803 startup_cost += path->
path.pathtarget->cost.startup;
849 if (rinfo->pseudoconstant)
907 T = (pages > 1) ? (
double) pages : 1.0;
927 (2.0 *
T * tuples_fetched) / (2.0 *
T + tuples_fetched);
937 lim = (2.0 *
T *
b) / (2.0 *
T -
b);
938 if (tuples_fetched <=
lim)
941 (2.0 *
T * tuples_fetched) / (2.0 *
T + tuples_fetched);
946 b + (tuples_fetched -
lim) * (
T -
b) /
T;
972 foreach(l,
apath->bitmapquals)
981 foreach(l,
opath->bitmapquals)
1017 Cost startup_cost = 0;
1019 Cost indexTotalCost;
1024 double tuples_fetched;
1027 spc_random_page_cost;
1046 startup_cost += indexTotalCost;
1051 &spc_random_page_cost,
1102 startup_cost += path->pathtarget->cost.startup;
1103 run_cost += path->pathtarget->cost.per_tuple * path->
rows;
1120 *cost = ((
IndexPath *) path)->indextotalcost;
1255 Cost startup_cost = 0;
1262 double spc_random_page_cost;
1278 foreach(l, tidquals)
1319 &spc_random_page_cost,
1323 run_cost += spc_random_page_cost * ntuples;
1335 startup_cost += path->pathtarget->cost.startup;
1336 run_cost += path->pathtarget->cost.per_tuple * path->
rows;
1376 double spc_random_page_cost;
1406 ntuples = selectivity *
baserel->tuples;
1417 &spc_random_page_cost,
1439 startup_cost += path->pathtarget->cost.startup;
1549 startup_cost += path->
path.pathtarget->cost.startup;
1550 run_cost += path->
path.pathtarget->cost.per_tuple * path->
path.
rows;
1567 Cost startup_cost = 0;
1611 startup_cost += path->pathtarget->cost.startup;
1612 run_cost += path->pathtarget->cost.per_tuple * path->
rows;
1633 Cost startup_cost = 0;
1672 startup_cost += path->pathtarget->cost.startup;
1673 run_cost += path->pathtarget->cost.per_tuple * path->
rows;
1694 Cost startup_cost = 0;
1724 startup_cost += path->pathtarget->cost.startup;
1725 run_cost += path->pathtarget->cost.per_tuple * path->
rows;
1749 Cost startup_cost = 0;
1776 startup_cost += path->pathtarget->cost.startup;
1777 run_cost += path->pathtarget->cost.per_tuple * path->
rows;
1795 Cost startup_cost = 0;
1837 Cost startup_cost = 0;
1884 startup_cost =
nrterm->startup_cost;
1885 total_cost =
nrterm->total_cost;
1894 total_cost += 10 *
rterm->total_cost;
1904 if (
runion->parallel_workers == 0)
1908 runion->startup_cost = startup_cost;
1909 runion->total_cost = total_cost;
1912 rterm->pathtarget->width);
1953 double tuples,
int width,
1955 double limit_tuples)
1973 if (limit_tuples > 0 && limit_tuples < tuples)
2059 double limit_tuples)
2079 if (input_tuples < 2.0)
2107 foreach(l, pathkeys)
2111 linitial(key->pk_eclass->ec_members);
2175 path->
rows = input_tuples;
2206 double limit_tuples)
2223 path->
rows = tuples;
2258 foreach(cell, subpaths)
2318 if (
apath->path.parallel_workers == 0)
2321 apath->path.disabled_nodes =
2323 apath->path.startup_cost = 0;
2324 apath->path.total_cost = 0;
2325 apath->path.rows = 0;
2330 if (!
apath->path.parallel_aware)
2334 if (pathkeys ==
NIL)
2348 foreach(l,
apath->subpaths)
2377 foreach(l,
apath->subpaths)
2410 apath->limit_tuples);
2423 apath->limit_tuples);
2445 foreach(l,
apath->subpaths)
2486 apath->path.total_cost +=
2488 apath->first_partial_path,
2489 apath->path.parallel_workers);
2496 apath->path.total_cost +=
2533 Cost startup_cost = 0;
2587 double tuples,
int width)
2594 path->
rows = tuples;
2649 double tuples =
mpath->subpath->rows;
2651 int width =
mpath->subpath->pathtarget->width;
2675 foreach(
lc,
mpath->param_exprs)
2694 ndistinct = est_calls;
2697 mpath->est_unique_keys = ndistinct;
2725 hit_ratio = ((est_calls - ndistinct) / est_calls) *
2834 startup_cost +=
aggcosts->transCost.startup;
2835 startup_cost +=
aggcosts->transCost.per_tuple * input_tuples;
2836 startup_cost +=
aggcosts->finalCost.startup;
2837 startup_cost +=
aggcosts->finalCost.per_tuple;
2850 total_cost +=
aggcosts->transCost.startup;
2851 total_cost +=
aggcosts->transCost.per_tuple * input_tuples;
2853 total_cost +=
aggcosts->finalCost.startup;
2854 total_cost +=
aggcosts->finalCost.per_tuple * numGroups;
2882 startup_cost +=
aggcosts->transCost.startup;
2883 startup_cost +=
aggcosts->transCost.per_tuple * input_tuples;
2886 startup_cost +=
aggcosts->finalCost.startup;
2888 total_cost = startup_cost;
2889 total_cost +=
aggcosts->finalCost.per_tuple * numGroups;
2918 double hashentrysize;
2936 nbatches =
Max((numGroups * hashentrysize) / mem_limit,
2940 num_partitions =
Max(num_partitions, 2);
3014 double input_tuples)
3027 double num_partitions;
3029 root->parse->targetList);
3050 root->parse->targetList);
3117 if (endOffset->constisnull)
3231 double input_tuples)
3255 foreach(
lc, windowFuncs)
3294 path->
rows = input_tuples;
3311 path->
startup_cost += (total_cost - startup_cost) / input_tuples *
3329 double input_tuples)
3402 Cost startup_cost = 0;
3407 Cost inner_run_cost;
3408 Cost inner_rescan_run_cost;
3412 disabled_nodes +=
inner_path->disabled_nodes;
3413 disabled_nodes +=
outer_path->disabled_nodes;
3454 run_cost += inner_run_cost;
3464 workspace->
total_cost = startup_cost + run_cost;
3501 if (path->
jpath.path.param_info)
3502 path->
jpath.path.rows = path->
jpath.path.param_info->ppi_rows;
3504 path->
jpath.path.rows = path->
jpath.path.parent->rows;
3507 if (path->
jpath.path.parallel_workers > 0)
3511 path->
jpath.path.rows =
3611 run_cost += inner_run_cost;
3641 startup_cost += path->
jpath.path.pathtarget->cost.startup;
3642 run_cost += path->
jpath.path.pathtarget->cost.per_tuple * path->
jpath.path.rows;
3644 path->
jpath.path.startup_cost = startup_cost;
3645 path->
jpath.path.total_cost = startup_cost + run_cost;
3685 List *outersortkeys,
List *innersortkeys,
3686 int outer_presorted_keys,
3690 Cost startup_cost = 0;
3694 Cost inner_run_cost;
3723 if (mergeclauses && jointype !=
JOIN_FULL)
3744 elog(
ERROR,
"left and right pathkeys do not match in mergejoin");
3795 Assert(outer_skip_rows <= outer_rows);
3796 Assert(inner_skip_rows <= inner_rows);
3845 outer_presorted_keys,
3869 disabled_nodes +=
sort_path.disabled_nodes;
3878 disabled_nodes +=
outer_path->disabled_nodes;
3910 disabled_nodes +=
sort_path.disabled_nodes;
3919 disabled_nodes +=
inner_path->disabled_nodes;
3940 workspace->
total_cost = startup_cost + run_cost + inner_run_cost;
4009 if (path->
jpath.path.param_info)
4010 path->
jpath.path.rows = path->
jpath.path.param_info->ppi_rows;
4012 path->
jpath.path.rows = path->
jpath.path.parent->rows;
4015 if (path->
jpath.path.parallel_workers > 0)
4019 path->
jpath.path.rows =
4154 else if (innersortkeys ==
NIL &&
4170 innersortkeys !=
NIL &&
4197 if (path->
jpath.path.parallel_workers == 0)
4200 ++path->
jpath.path.disabled_nodes;
4211 (outer_skip_rows + inner_skip_rows *
rescanratio);
4213 ((outer_rows - outer_skip_rows) +
4230 startup_cost += path->
jpath.path.pathtarget->cost.startup;
4231 run_cost += path->
jpath.path.pathtarget->cost.per_tuple * path->
jpath.path.rows;
4233 path->
jpath.path.startup_cost = startup_cost;
4234 path->
jpath.path.total_cost = startup_cost + run_cost;
4252 foreach(
lc, rinfo->scansel_cache)
4286 rinfo->scansel_cache =
lappend(rinfo->scansel_cache, cache);
4328 Cost startup_cost = 0;
4337 size_t space_allowed;
4345 disabled_nodes +=
inner_path->disabled_nodes;
4346 disabled_nodes +=
outer_path->disabled_nodes;
4419 workspace->
total_cost = startup_cost + run_cost;
4466 if (path->
jpath.path.param_info)
4467 path->
jpath.path.rows = path->
jpath.path.param_info->ppi_rows;
4469 path->
jpath.path.rows = path->
jpath.path.parent->rows;
4472 if (path->
jpath.path.parallel_workers > 0)
4476 path->
jpath.path.rows =
4684 startup_cost += path->
jpath.path.pathtarget->cost.startup;
4685 run_cost += path->
jpath.path.pathtarget->cost.per_tuple * path->
jpath.path.rows;
4687 path->
jpath.path.startup_cost = startup_cost;
4688 path->
jpath.path.total_cost = startup_cost + run_cost;
4832 if (((
HashPath *) path)->num_batches == 1)
4856 path->pathtarget->width);
4883 path->pathtarget->width);
4941 *cost = context.
total;
4959 *cost = context.
total;
4978 if (rinfo->eval_cost.startup < 0)
4990 if (rinfo->orclause)
4999 if (rinfo->pseudoconstant)
5173 elog(
ERROR,
"cannot handle unplanned sub-select");
5307 foreach(l, restrictlist)
5496 tuples =
selec * outer_tuples * inner_tuples;
5567 if (nrows > rel->
rows)
5653 if (nrows > rel->
rows)
5716 foreach(l, restrictlist)
5772 if (nrows < outer_rows)
5778 if (nrows < outer_rows)
5780 if (nrows < inner_rows)
5794 elog(
ERROR,
"unrecognized join type: %d", (
int) jointype);
5822 List **restrictlist)
5830 foreach(
lc,
root->fkey_list)
5885 if (rinfo->parent_ec)
5900 if (
fkinfo->eclass[
i] == rinfo->parent_ec)
6024 if (
fkinfo->nconst_ec > 0)
6165 foreach(
lc,
rte->functions)
6251 if (
rte->self_reference)
6399 ((
Var *) node)->varno == rel->
relid)
6424 if (rel->attr_widths[
ndx] > 0)
6578 const Var *var = (
const Var *) expr;
6585 var->
varno <
root->simple_rel_array_size)
6595 if (rel->attr_widths[
ndx] > 0)
6596 return rel->attr_widths[
ndx];
6685 Cost indexTotalCost;
6689 double tuples_fetched;
6711 pages_fetched = (2.0 *
T * tuples_fetched) / (2.0 *
T + tuples_fetched);
6766 if (lossy_pages > 0)
6774 *
cost_p = indexTotalCost;
int compute_parallel_worker(RelOptInfo *rel, double heap_pages, double index_pages, int max_workers)
void(* amcostestimate_function)(PlannerInfo *root, IndexPath *path, double loop_count, Cost *indexStartupCost, Cost *indexTotalCost, Selectivity *indexSelectivity, double *indexCorrelation, double *indexPages)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
bool bms_is_member(int x, const Bitmapset *a)
BMS_Membership bms_membership(const Bitmapset *a)
#define Assert(condition)
#define OidIsValid(objectId)
double expression_returns_set_rows(PlannerInfo *root, Node *clause)
Selectivity clauselist_selectivity(PlannerInfo *root, List *clauses, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
Selectivity clause_selectivity(PlannerInfo *root, Node *clause, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
#define DEFAULT_PARALLEL_TUPLE_COST
#define DEFAULT_PARALLEL_SETUP_COST
#define DEFAULT_CPU_INDEX_TUPLE_COST
#define DEFAULT_CPU_TUPLE_COST
#define DEFAULT_RANDOM_PAGE_COST
#define DEFAULT_RECURSIVE_WORKTABLE_FACTOR
#define DEFAULT_EFFECTIVE_CACHE_SIZE
#define DEFAULT_SEQ_PAGE_COST
#define DEFAULT_CPU_OPERATOR_COST
#define APPEND_CPU_COST_MULTIPLIER
void set_namedtuplestore_size_estimates(PlannerInfo *root, RelOptInfo *rel)
static double get_windowclause_startup_tuples(PlannerInfo *root, WindowClause *wc, double input_tuples)
bool enable_partitionwise_aggregate
void final_cost_hashjoin(PlannerInfo *root, HashPath *path, JoinCostWorkspace *workspace, JoinPathExtraData *extra)
double index_pages_fetched(double tuples_fetched, BlockNumber pages, double index_pages, PlannerInfo *root)
void cost_bitmap_tree_node(Path *path, Cost *cost, Selectivity *selec)
double get_parameterized_baserel_size(PlannerInfo *root, RelOptInfo *rel, List *param_clauses)
static void get_restriction_qual_cost(PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info, QualCost *qpqual_cost)
static double page_size(double tuples, int width)
int max_parallel_workers_per_gather
double get_parameterized_joinrel_size(PlannerInfo *root, RelOptInfo *rel, Path *outer_path, Path *inner_path, SpecialJoinInfo *sjinfo, List *restrict_clauses)
void final_cost_mergejoin(PlannerInfo *root, MergePath *path, JoinCostWorkspace *workspace, JoinPathExtraData *extra)
static List * extract_nonindex_conditions(List *qual_clauses, List *indexclauses)
void cost_material(Path *path, bool enabled, int input_disabled_nodes, Cost input_startup_cost, Cost input_total_cost, double tuples, int width)
static void set_rel_width(PlannerInfo *root, RelOptInfo *rel)
void compute_semi_anti_join_factors(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, SpecialJoinInfo *sjinfo, List *restrictlist, SemiAntiJoinFactors *semifactors)
static double get_indexpath_pages(Path *bitmapqual)
double parallel_setup_cost
static bool cost_qual_eval_walker(Node *node, cost_qual_eval_context *context)
void set_baserel_size_estimates(PlannerInfo *root, RelOptInfo *rel)
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)
double recursive_worktable_factor
void cost_functionscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void initial_cost_nestloop(PlannerInfo *root, JoinCostWorkspace *workspace, JoinType jointype, uint64 enable_mask, Path *outer_path, Path *inner_path, JoinPathExtraData *extra)
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)
static double relation_byte_size(double tuples, int width)
double parallel_tuple_cost
void set_function_size_estimates(PlannerInfo *root, RelOptInfo *rel)
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)
static double calc_joinrel_size_estimate(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outer_rel, RelOptInfo *inner_rel, double outer_rows, double inner_rows, SpecialJoinInfo *sjinfo, List *restrictlist)
static MergeScanSelCache * cached_scansel(PlannerInfo *root, RestrictInfo *rinfo, PathKey *pathkey)
static void cost_rescan(PlannerInfo *root, Path *path, Cost *rescan_startup_cost, Cost *rescan_total_cost)
bool enable_indexonlyscan
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)
static void cost_tuplesort(Cost *startup_cost, Cost *run_cost, double tuples, int width, Cost comparison_cost, int sort_mem, double limit_tuples)
void cost_tablefuncscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info)
void initial_cost_hashjoin(PlannerInfo *root, JoinCostWorkspace *workspace, JoinType jointype, List *hashclauses, Path *outer_path, Path *inner_path, JoinPathExtraData *extra, bool parallel_hash)
void initial_cost_mergejoin(PlannerInfo *root, JoinCostWorkspace *workspace, JoinType jointype, List *mergeclauses, Path *outer_path, Path *inner_path, List *outersortkeys, List *innersortkeys, int outer_presorted_keys, JoinPathExtraData *extra)
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 set_cte_size_estimates(PlannerInfo *root, RelOptInfo *rel, double cte_rows)
void set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel, RelOptInfo *outer_rel, RelOptInfo *inner_rel, SpecialJoinInfo *sjinfo, List *restrictlist)
void cost_append(AppendPath *apath, PlannerInfo *root)
double compute_gather_rows(Path *path)
void cost_qual_eval_node(QualCost *cost, Node *qual, 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)
PathTarget * set_pathtarget_cost_width(PlannerInfo *root, PathTarget *target)
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)
bool enable_presorted_aggregate
void set_result_size_estimates(PlannerInfo *root, RelOptInfo *rel)
static bool has_indexed_join_quals(NestPath *path)
bool enable_parallel_hash
bool enable_partitionwise_join
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)
static Cost append_nonpartial_cost(List *subpaths, int numpaths, int parallel_workers)
double compute_bitmap_pages(PlannerInfo *root, RelOptInfo *baserel, Path *bitmapqual, double loop_count, Cost *cost_p, double *tuples_p)
void cost_bitmap_and_node(BitmapAndPath *path, PlannerInfo *root)
void set_subquery_size_estimates(PlannerInfo *root, RelOptInfo *rel)
bool enable_parallel_append
void set_foreign_size_estimates(PlannerInfo *root, RelOptInfo *rel)
void cost_tidscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, List *tidquals, ParamPathInfo *param_info)
static double approx_tuple_count(PlannerInfo *root, JoinPath *path, List *quals)
void cost_subplan(PlannerInfo *root, SubPlan *subplan, Plan *plan)
static void cost_memoize_rescan(PlannerInfo *root, MemoizePath *mpath, Cost *rescan_startup_cost, Cost *rescan_total_cost)
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)
static double get_parallel_divisor(Path *path)
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)
bool enable_partition_pruning
int32 clamp_width_est(int64 tuple_width)
double cpu_index_tuple_cost
void set_tablefunc_size_estimates(PlannerInfo *root, RelOptInfo *rel)
void cost_index(IndexPath *path, PlannerInfo *root, double loop_count, bool partial_path)
void set_values_size_estimates(PlannerInfo *root, RelOptInfo *rel)
static Selectivity get_foreign_key_join_selectivity(PlannerInfo *root, Relids outer_relids, Relids inner_relids, SpecialJoinInfo *sjinfo, List **restrictlist)
bool enable_incremental_sort
static int32 get_expr_width(PlannerInfo *root, const Node *expr)
bool is_redundant_with_indexclauses(RestrictInfo *rinfo, List *indexclauses)
RestrictInfo * find_derived_clause_for_ec_member(PlannerInfo *root, EquivalenceClass *ec, EquivalenceMember *em)
bool ExecSupportsMarkRestore(Path *pathnode)
bool ExecMaterializesOutput(NodeTag plantype)
#define palloc_object(type)
#define palloc_array(type, count)
#define SizeofHeapTupleHeader
void init_dummy_sjinfo(SpecialJoinInfo *sjinfo, Relids left_relids, Relids right_relids)
List * lappend(List *list, void *datum)
List * list_concat(List *list1, const List *list2)
List * list_concat_copy(const List *list1, const List *list2)
List * list_copy(const List *oldlist)
bool list_member_ptr(const List *list, const void *datum)
void list_free(List *list)
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
int32 get_attavgwidth(Oid relid, AttrNumber attnum)
RegProcedure get_opcode(Oid opno)
void getTypeInputInfo(Oid type, Oid *typInput, Oid *typIOParam)
int32 get_typavgwidth(Oid typid, int32 typmod)
Datum subpath(PG_FUNCTION_ARGS)
List * make_ands_implicit(Expr *clause)
static const uint32 T[65]
Size hash_agg_entry_size(int numTrans, Size tupleWidth, Size transitionSpace)
void hash_agg_set_limits(double hashentrysize, double input_groups, int used_bits, Size *mem_limit, uint64 *ngroups_limit, int *num_partitions)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
void set_sa_opfuncid(ScalarArrayOpExpr *opexpr)
void set_opfuncid(OpExpr *opexpr)
static Node * get_rightop(const void *clause)
#define expression_tree_walker(n, w, c)
static Node * get_leftop(const void *clause)
void ExecChooseHashTableSize(double ntuples, int tupwidth, bool useskew, bool try_combined_hash_mem, int parallel_workers, size_t *space_allowed, int *numbuckets, int *numbatches, int *num_skew_mcvs)
size_t get_hash_memory_limit(void)
double ExecEstimateCacheEntryOverheadBytes(double ntuples)
#define IsA(nodeptr, _type_)
#define IS_OUTER_JOIN(jointype)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define FRAMEOPTION_END_CURRENT_ROW
#define FRAMEOPTION_END_OFFSET_PRECEDING
#define FRAMEOPTION_END_OFFSET_FOLLOWING
#define FRAMEOPTION_RANGE
#define FRAMEOPTION_GROUPS
#define FRAMEOPTION_END_UNBOUNDED_FOLLOWING
bool pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common)
bool pathkeys_contained_in(List *keys1, List *keys2)
#define RINFO_IS_PUSHED_DOWN(rinfo, joinrelids)
#define PGS_MERGEJOIN_PLAIN
#define PGS_MERGEJOIN_MATERIALIZE
#define PGS_CONSIDER_NONPARTIAL
#define planner_rt_fetch(rti, root)
#define RELATION_WAS_MADE_UNIQUE(rel, sjinfo, nominal_jointype)
#define PGS_INDEXONLYSCAN
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define foreach_current_index(var_or_cell)
#define foreach_delete_current(lst, var_or_cell)
#define for_each_cell(cell, lst, initcell)
static ListCell * list_head(const List *l)
PlaceHolderInfo * find_placeholder_info(PlannerInfo *root, PlaceHolderVar *phv)
void add_function_cost(PlannerInfo *root, Oid funcid, Node *node, QualCost *cost)
int32 get_relation_data_width(Oid relid, int32 *attr_widths)
bool parallel_leader_participation
static int64 DatumGetInt64(Datum X)
static int16 DatumGetInt16(Datum X)
static int32 DatumGetInt32(Datum X)
#define IS_SPECIAL_VARNO(varno)
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
RelOptInfo * fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind, Relids relids)
bool join_clause_is_movable_into(RestrictInfo *rinfo, Relids currentrelids, Relids current_and_outer)
void mergejoinscansel(PlannerInfo *root, Node *clause, Oid opfamily, CompareType cmptype, bool nulls_first, Selectivity *leftstart, Selectivity *leftend, Selectivity *rightstart, Selectivity *rightend)
double estimate_array_length(PlannerInfo *root, Node *arrayexpr)
double estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, List **pgset, EstimationInfo *estinfo)
List * estimate_multivariate_bucketsize(PlannerInfo *root, RelOptInfo *inner, List *hashclauses, Selectivity *innerbucketsize)
void estimate_hash_bucket_stats(PlannerInfo *root, Node *hashkey, double nbuckets, Selectivity *mcv_freq, Selectivity *bucketsize_frac)
#define CLAMP_PROBABILITY(p)
#define DEFAULT_NUM_DISTINCT
#define SELFLAG_USED_DEFAULT
void get_tablespace_page_costs(Oid spcid, double *spc_random_page_cost, double *spc_seq_page_cost)
Selectivity bitmapselectivity
Selectivity bitmapselectivity
Cardinality inner_rows_total
Selectivity indexselectivity
Cost inner_rescan_run_cost
Cardinality inner_skip_rows
Cardinality inner_rows_total
Cardinality outer_skip_rows
Selectivity rightstartsel
struct PathTarget * reltarget
QualCost baserestrictcost
Selectivity outer_match_frac
TsmRoutine * GetTsmRoutine(Oid tsmhandler)
int tbm_calculate_entries(Size maxbytes)
List * get_sortgrouplist_exprs(List *sgClauses, List *targetList)
int tuplesort_merge_order(int64 allowedMem)
Relids pull_varnos(PlannerInfo *root, Node *node)