PostgreSQL Source Code  git master
optimizer.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * optimizer.h
4  * External API for the Postgres planner.
5  *
6  * This header is meant to define everything that the core planner
7  * exposes for use by non-planner modules.
8  *
9  * Note that there are files outside src/backend/optimizer/ that are
10  * considered planner modules, because they're too much in bed with
11  * planner operations to be treated otherwise. FDW planning code is an
12  * example. For the most part, however, code outside the core planner
13  * should not need to include any optimizer/ header except this one.
14  *
15  * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
16  * Portions Copyright (c) 1994, Regents of the University of California
17  *
18  * src/include/optimizer/optimizer.h
19  *
20  *-------------------------------------------------------------------------
21  */
22 #ifndef OPTIMIZER_H
23 #define OPTIMIZER_H
24 
25 #include "nodes/parsenodes.h"
26 
27 /*
28  * We don't want to include nodes/pathnodes.h here, because non-planner
29  * code should generally treat PlannerInfo as an opaque typedef.
30  * But we'd like such code to use that typedef name, so define the
31  * typedef either here or in pathnodes.h, whichever is read first.
32  */
33 #ifndef HAVE_PLANNERINFO_TYPEDEF
34 typedef struct PlannerInfo PlannerInfo;
35 #define HAVE_PLANNERINFO_TYPEDEF 1
36 #endif
37 
38 /* Likewise for IndexOptInfo and SpecialJoinInfo. */
39 #ifndef HAVE_INDEXOPTINFO_TYPEDEF
40 typedef struct IndexOptInfo IndexOptInfo;
41 #define HAVE_INDEXOPTINFO_TYPEDEF 1
42 #endif
43 #ifndef HAVE_SPECIALJOININFO_TYPEDEF
45 #define HAVE_SPECIALJOININFO_TYPEDEF 1
46 #endif
47 
48 /* It also seems best not to include plannodes.h, params.h, or htup.h here */
49 struct PlannedStmt;
50 struct ParamListInfoData;
51 struct HeapTupleData;
52 
53 
54 /* in path/clausesel.c: */
55 
57  Node *clause,
58  int varRelid,
59  JoinType jointype,
60  SpecialJoinInfo *sjinfo);
62  List *clauses,
63  int varRelid,
64  JoinType jointype,
65  SpecialJoinInfo *sjinfo,
66  Bitmapset *estimatedclauses);
68  List *clauses,
69  int varRelid,
70  JoinType jointype,
71  SpecialJoinInfo *sjinfo);
72 
73 /* in path/costsize.c: */
74 
75 /* widely used cost parameters */
76 extern PGDLLIMPORT double seq_page_cost;
77 extern PGDLLIMPORT double random_page_cost;
78 extern PGDLLIMPORT double cpu_tuple_cost;
79 extern PGDLLIMPORT double cpu_index_tuple_cost;
80 extern PGDLLIMPORT double cpu_operator_cost;
81 extern PGDLLIMPORT double parallel_tuple_cost;
82 extern PGDLLIMPORT double parallel_setup_cost;
84 
85 extern double clamp_row_est(double nrows);
86 
87 /* in path/indxpath.c: */
88 
90 
91 /* in plan/planner.c: */
92 
93 /* possible values for force_parallel_mode */
94 typedef enum
95 {
100 
101 /* GUC parameters */
102 extern int force_parallel_mode;
104 
105 extern struct PlannedStmt *planner(Query *parse, const char *query_string,
106  int cursorOptions,
107  struct ParamListInfoData *boundParams);
108 
109 extern Expr *expression_planner(Expr *expr);
111  List **relationOids,
112  List **invalItems);
113 
114 extern bool plan_cluster_use_sort(Oid tableOid, Oid indexOid);
115 extern int plan_create_index_workers(Oid tableOid, Oid indexOid);
116 
117 /* in plan/setrefs.c: */
118 
119 extern void extract_query_dependencies(Node *query,
120  List **relationOids,
121  List **invalItems,
122  bool *hasRowSecurity);
123 
124 /* in prep/prepqual.c: */
125 
126 extern Node *negate_clause(Node *node);
127 extern Expr *canonicalize_qual(Expr *qual, bool is_check);
128 
129 /* in util/clauses.c: */
130 
131 extern bool contain_mutable_functions(Node *clause);
132 extern bool contain_volatile_functions(Node *clause);
133 extern bool contain_volatile_functions_not_nextval(Node *clause);
134 
135 extern Node *eval_const_expressions(PlannerInfo *root, Node *node);
136 
137 extern Node *estimate_expression_value(PlannerInfo *root, Node *node);
138 
139 extern Expr *evaluate_expr(Expr *expr, Oid result_type, int32 result_typmod,
140  Oid result_collation);
141 
142 extern List *expand_function_arguments(List *args, Oid result_type,
143  struct HeapTupleData *func_tuple);
144 
145 /* in util/predtest.c: */
146 
147 extern bool predicate_implied_by(List *predicate_list, List *clause_list,
148  bool weak);
149 extern bool predicate_refuted_by(List *predicate_list, List *clause_list,
150  bool weak);
151 
152 /* in util/tlist.c: */
153 
154 extern int count_nonjunk_tlist_entries(List *tlist);
155 extern TargetEntry *get_sortgroupref_tle(Index sortref,
156  List *targetList);
158  List *targetList);
160  List *targetList);
161 extern List *get_sortgrouplist_exprs(List *sgClauses,
162  List *targetList);
164  List *clauses);
166  List *clauses);
167 
168 /* in util/var.c: */
169 
170 /* Bits that can be OR'd into the flags argument of pull_var_clause() */
171 #define PVC_INCLUDE_AGGREGATES 0x0001 /* include Aggrefs in output list */
172 #define PVC_RECURSE_AGGREGATES 0x0002 /* recurse into Aggref arguments */
173 #define PVC_INCLUDE_WINDOWFUNCS 0x0004 /* include WindowFuncs in output list */
174 #define PVC_RECURSE_WINDOWFUNCS 0x0008 /* recurse into WindowFunc arguments */
175 #define PVC_INCLUDE_PLACEHOLDERS 0x0010 /* include PlaceHolderVars in
176  * output list */
177 #define PVC_RECURSE_PLACEHOLDERS 0x0020 /* recurse into PlaceHolderVar
178  * arguments */
179 
180 extern Bitmapset *pull_varnos(Node *node);
181 extern Bitmapset *pull_varnos_of_level(Node *node, int levelsup);
182 extern void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos);
183 extern List *pull_vars_of_level(Node *node, int levelsup);
184 extern bool contain_var_clause(Node *node);
185 extern bool contain_vars_of_level(Node *node, int levelsup);
186 extern int locate_var_of_level(Node *node, int levelsup);
187 extern List *pull_var_clause(Node *node, int flags);
188 extern Node *flatten_join_alias_vars(Query *query, Node *node);
189 
190 #endif /* OPTIMIZER_H */
bool parallel_leader_participation
Definition: planner.c:71
bool is_pseudo_constant_for_index(Node *expr, IndexOptInfo *index)
Definition: indxpath.c:3804
Node * eval_const_expressions(PlannerInfo *root, Node *node)
Definition: clauses.c:2287
PGDLLIMPORT double cpu_index_tuple_cost
Definition: costsize.c:114
struct PlannedStmt * planner(Query *parse, const char *query_string, int cursorOptions, struct ParamListInfoData *boundParams)
Expr * expression_planner(Expr *expr)
Definition: planner.c:6178
List * expand_function_arguments(List *args, Oid result_type, struct HeapTupleData *func_tuple)
PGDLLIMPORT double parallel_setup_cost
Definition: costsize.c:117
Bitmapset * pull_varnos(Node *node)
Definition: var.c:95
TargetEntry * get_sortgroupref_tle(Index sortref, List *targetList)
Definition: tlist.c:367
int plan_create_index_workers(Oid tableOid, Oid indexOid)
Definition: planner.c:6376
Expr * evaluate_expr(Expr *expr, Oid result_type, int32 result_typmod, Oid result_collation)
Definition: clauses.c:4756
List * relationOids
Definition: plannodes.h:86
int force_parallel_mode
Definition: planner.c:70
Definition: nodes.h:529
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
Definition: var.c:219
PGDLLIMPORT double cpu_tuple_cost
Definition: costsize.c:113
SortGroupClause * get_sortgroupref_clause_noerr(Index sortref, List *clauses)
Definition: tlist.c:465
double Selectivity
Definition: nodes.h:662
unsigned int Oid
Definition: postgres_ext.h:31
Node * get_sortgroupclause_expr(SortGroupClause *sgClause, List *targetList)
Definition: tlist.c:401
#define PGDLLIMPORT
Definition: c.h:1257
PGDLLIMPORT double cpu_operator_cost
Definition: costsize.c:115
signed int int32
Definition: c.h:362
JoinType
Definition: nodes.h:696
List * invalItems
Definition: plannodes.h:88
Definition: type.h:89
bool predicate_implied_by(List *predicate_list, List *clause_list, bool weak)
Definition: predtest.c:151
Node * estimate_expression_value(PlannerInfo *root, Node *node)
Definition: clauses.c:2320
double clamp_row_est(double nrows)
Definition: costsize.c:189
Node * flatten_join_alias_vars(Query *query, Node *node)
Definition: var.c:670
int locate_var_of_level(Node *node, int levelsup)
Definition: var.c:437
bool contain_volatile_functions_not_nextval(Node *clause)
Definition: clauses.c:774
int count_nonjunk_tlist_entries(List *tlist)
Definition: tlist.c:208
TargetEntry * get_sortgroupclause_tle(SortGroupClause *sgClause, List *targetList)
Definition: tlist.c:389
bool contain_volatile_functions(Node *clause)
Definition: clauses.c:724
void extract_query_dependencies(Node *query, List **relationOids, List **invalItems, bool *hasRowSecurity)
Definition: setrefs.c:2791
PGDLLIMPORT int effective_cache_size
Definition: costsize.c:119
Selectivity clauselist_selectivity(PlannerInfo *root, List *clauses, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
Definition: clausesel.c:69
ForceParallelMode
Definition: optimizer.h:94
Expr * canonicalize_qual(Expr *qual, bool is_check)
Definition: prepqual.c:292
List * get_sortgrouplist_exprs(List *sgClauses, List *targetList)
Definition: tlist.c:414
PGDLLIMPORT double random_page_cost
Definition: costsize.c:112
bool contain_var_clause(Node *node)
Definition: var.c:331
unsigned int Index
Definition: c.h:482
List * pull_var_clause(Node *node, int flags)
Definition: var.c:535
Expr * expression_planner_with_deps(Expr *expr, List **relationOids, List **invalItems)
Definition: planner.c:6205
Selectivity clauselist_selectivity_simple(PlannerInfo *root, List *clauses, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo, Bitmapset *estimatedclauses)
Definition: clausesel.c:150
List * pull_vars_of_level(Node *node, int levelsup)
Definition: var.c:263
bool plan_cluster_use_sort(Oid tableOid, Oid indexOid)
Definition: planner.c:6258
PGDLLIMPORT double seq_page_cost
Definition: costsize.c:111
Bitmapset * pull_varnos_of_level(Node *node, int levelsup)
Definition: var.c:120
SortGroupClause * get_sortgroupref_clause(Index sortref, List *clauses)
Definition: tlist.c:444
bool contain_mutable_functions(Node *clause)
Definition: clauses.c:645
Selectivity clause_selectivity(PlannerInfo *root, Node *clause, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
Definition: clausesel.c:599
bool contain_vars_of_level(Node *node, int levelsup)
Definition: var.c:369
bool predicate_refuted_by(List *predicate_list, List *clause_list, bool weak)
Definition: predtest.c:221
PGDLLIMPORT double parallel_tuple_cost
Definition: costsize.c:116
Node * negate_clause(Node *node)
Definition: prepqual.c:74
Definition: pg_list.h:50
static struct subre * parse(struct vars *, int, int, struct state *, struct state *)
Definition: regcomp.c:648