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-2022, 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 /* Test if an expression node represents a SRF call. Beware multiple eval! */
28 #define IS_SRF_CALL(node) \
29  ((IsA(node, FuncExpr) && ((FuncExpr *) (node))->funcretset) || \
30  (IsA(node, OpExpr) && ((OpExpr *) (node))->opretset))
31 
32 /*
33  * We don't want to include nodes/pathnodes.h here, because non-planner
34  * code should generally treat PlannerInfo as an opaque typedef.
35  * But we'd like such code to use that typedef name, so define the
36  * typedef either here or in pathnodes.h, whichever is read first.
37  */
38 #ifndef HAVE_PLANNERINFO_TYPEDEF
39 typedef struct PlannerInfo PlannerInfo;
40 #define HAVE_PLANNERINFO_TYPEDEF 1
41 #endif
42 
43 /* Likewise for IndexOptInfo and SpecialJoinInfo. */
44 #ifndef HAVE_INDEXOPTINFO_TYPEDEF
45 typedef struct IndexOptInfo IndexOptInfo;
46 #define HAVE_INDEXOPTINFO_TYPEDEF 1
47 #endif
48 #ifndef HAVE_SPECIALJOININFO_TYPEDEF
49 typedef struct SpecialJoinInfo SpecialJoinInfo;
50 #define HAVE_SPECIALJOININFO_TYPEDEF 1
51 #endif
52 
53 /* It also seems best not to include plannodes.h, params.h, or htup.h here */
54 struct PlannedStmt;
55 struct ParamListInfoData;
56 struct HeapTupleData;
57 
58 
59 /* in path/clausesel.c: */
60 
62  Node *clause,
63  int varRelid,
64  JoinType jointype,
65  SpecialJoinInfo *sjinfo);
67  Node *clause,
68  int varRelid,
69  JoinType jointype,
70  SpecialJoinInfo *sjinfo,
71  bool use_extended_stats);
73  List *clauses,
74  int varRelid,
75  JoinType jointype,
76  SpecialJoinInfo *sjinfo);
78  List *clauses,
79  int varRelid,
80  JoinType jointype,
81  SpecialJoinInfo *sjinfo,
82  bool use_extended_stats);
83 
84 /* in path/costsize.c: */
85 
86 /* widely used cost parameters */
87 extern PGDLLIMPORT double seq_page_cost;
88 extern PGDLLIMPORT double random_page_cost;
89 extern PGDLLIMPORT double cpu_tuple_cost;
90 extern PGDLLIMPORT double cpu_index_tuple_cost;
91 extern PGDLLIMPORT double cpu_operator_cost;
92 extern PGDLLIMPORT double parallel_tuple_cost;
93 extern PGDLLIMPORT double parallel_setup_cost;
96 
97 extern double clamp_row_est(double nrows);
98 
99 /* in path/indxpath.c: */
100 
101 extern bool is_pseudo_constant_for_index(PlannerInfo *root, Node *expr,
103 
104 /* in plan/planner.c: */
105 
106 /* possible values for force_parallel_mode */
107 typedef enum
108 {
113 
114 /* GUC parameters */
117 
118 extern struct PlannedStmt *planner(Query *parse, const char *query_string,
119  int cursorOptions,
120  struct ParamListInfoData *boundParams);
121 
122 extern Expr *expression_planner(Expr *expr);
124  List **relationOids,
125  List **invalItems);
126 
127 extern bool plan_cluster_use_sort(Oid tableOid, Oid indexOid);
128 extern int plan_create_index_workers(Oid tableOid, Oid indexOid);
129 
130 /* in plan/setrefs.c: */
131 
132 extern void extract_query_dependencies(Node *query,
133  List **relationOids,
134  List **invalItems,
135  bool *hasRowSecurity);
136 
137 /* in prep/prepqual.c: */
138 
139 extern Node *negate_clause(Node *node);
140 extern Expr *canonicalize_qual(Expr *qual, bool is_check);
141 
142 /* in util/clauses.c: */
143 
144 extern bool contain_mutable_functions(Node *clause);
145 extern bool contain_volatile_functions(Node *clause);
146 extern bool contain_volatile_functions_not_nextval(Node *clause);
147 
148 extern Node *eval_const_expressions(PlannerInfo *root, Node *node);
149 
150 extern void convert_saop_to_hashed_saop(Node *node);
151 
152 extern Node *estimate_expression_value(PlannerInfo *root, Node *node);
153 
154 extern Expr *evaluate_expr(Expr *expr, Oid result_type, int32 result_typmod,
155  Oid result_collation);
156 
157 extern List *expand_function_arguments(List *args, bool include_out_arguments,
158  Oid result_type,
159  struct HeapTupleData *func_tuple);
160 
161 /* in util/predtest.c: */
162 
163 extern bool predicate_implied_by(List *predicate_list, List *clause_list,
164  bool weak);
165 extern bool predicate_refuted_by(List *predicate_list, List *clause_list,
166  bool weak);
167 
168 /* in util/tlist.c: */
169 
170 extern int count_nonjunk_tlist_entries(List *tlist);
171 extern TargetEntry *get_sortgroupref_tle(Index sortref,
172  List *targetList);
174  List *targetList);
176  List *targetList);
177 extern List *get_sortgrouplist_exprs(List *sgClauses,
178  List *targetList);
180  List *clauses);
182  List *clauses);
183 
184 /* in util/var.c: */
185 
186 /* Bits that can be OR'd into the flags argument of pull_var_clause() */
187 #define PVC_INCLUDE_AGGREGATES 0x0001 /* include Aggrefs in output list */
188 #define PVC_RECURSE_AGGREGATES 0x0002 /* recurse into Aggref arguments */
189 #define PVC_INCLUDE_WINDOWFUNCS 0x0004 /* include WindowFuncs in output list */
190 #define PVC_RECURSE_WINDOWFUNCS 0x0008 /* recurse into WindowFunc arguments */
191 #define PVC_INCLUDE_PLACEHOLDERS 0x0010 /* include PlaceHolderVars in
192  * output list */
193 #define PVC_RECURSE_PLACEHOLDERS 0x0020 /* recurse into PlaceHolderVar
194  * arguments */
195 
196 extern Bitmapset *pull_varnos(PlannerInfo *root, Node *node);
197 extern Bitmapset *pull_varnos_of_level(PlannerInfo *root, Node *node, int levelsup);
198 extern void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos);
199 extern List *pull_vars_of_level(Node *node, int levelsup);
200 extern bool contain_var_clause(Node *node);
201 extern bool contain_vars_of_level(Node *node, int levelsup);
202 extern int locate_var_of_level(Node *node, int levelsup);
203 extern List *pull_var_clause(Node *node, int flags);
204 extern Node *flatten_join_alias_vars(Query *query, Node *node);
205 
206 #endif /* OPTIMIZER_H */
#define PGDLLIMPORT
Definition: c.h:1331
signed int int32
Definition: c.h:429
unsigned int Index
Definition: c.h:549
double Selectivity
Definition: nodes.h:706
JoinType
Definition: nodes.h:744
PGDLLIMPORT double cpu_operator_cost
Definition: costsize.c:123
bool contain_volatile_functions_not_nextval(Node *clause)
Definition: clauses.c:603
PGDLLIMPORT bool parallel_leader_participation
Definition: planner.c:71
Expr * expression_planner(Expr *expr)
Definition: planner.c:5882
struct PlannedStmt * planner(Query *parse, const char *query_string, int cursorOptions, struct ParamListInfoData *boundParams)
List * get_sortgrouplist_exprs(List *sgClauses, List *targetList)
Definition: tlist.c:381
List * pull_vars_of_level(Node *node, int levelsup)
Definition: var.c:332
TargetEntry * get_sortgroupref_tle(Index sortref, List *targetList)
Definition: tlist.c:334
Expr * evaluate_expr(Expr *expr, Oid result_type, int32 result_typmod, Oid result_collation)
Definition: clauses.c:4864
Selectivity clause_selectivity_ext(PlannerInfo *root, Node *clause, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo, bool use_extended_stats)
Definition: clausesel.c:707
bool predicate_refuted_by(List *predicate_list, List *clause_list, bool weak)
Definition: predtest.c:221
bool contain_vars_of_level(Node *node, int levelsup)
Definition: var.c:438
List * pull_var_clause(Node *node, int flags)
Definition: var.c:604
bool contain_var_clause(Node *node)
Definition: var.c:400
bool is_pseudo_constant_for_index(PlannerInfo *root, Node *expr, IndexOptInfo *index)
Definition: indxpath.c:3805
bool plan_cluster_use_sort(Oid tableOid, Oid indexOid)
Definition: planner.c:5962
PGDLLIMPORT double parallel_tuple_cost
Definition: costsize.c:124
bool contain_mutable_functions(Node *clause)
Definition: clauses.c:368
SortGroupClause * get_sortgroupref_clause_noerr(Index sortref, List *clauses)
Definition: tlist.c:432
int plan_create_index_workers(Oid tableOid, Oid indexOid)
Definition: planner.c:6080
PGDLLIMPORT double parallel_setup_cost
Definition: costsize.c:125
Selectivity clauselist_selectivity(PlannerInfo *root, List *clauses, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
Definition: clausesel.c:102
ForceParallelMode
Definition: optimizer.h:108
@ FORCE_PARALLEL_ON
Definition: optimizer.h:110
@ FORCE_PARALLEL_OFF
Definition: optimizer.h:109
@ FORCE_PARALLEL_REGRESS
Definition: optimizer.h:111
Node * negate_clause(Node *node)
Definition: prepqual.c:74
Selectivity clauselist_selectivity_ext(PlannerInfo *root, List *clauses, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo, bool use_extended_stats)
Definition: clausesel.c:119
Bitmapset * pull_varnos_of_level(PlannerInfo *root, Node *node, int levelsup)
Definition: var.c:126
Node * get_sortgroupclause_expr(SortGroupClause *sgClause, List *targetList)
Definition: tlist.c:368
Bitmapset * pull_varnos(PlannerInfo *root, Node *node)
Definition: var.c:100
void convert_saop_to_hashed_saop(Node *node)
Definition: clauses.c:2182
PGDLLIMPORT double cpu_tuple_cost
Definition: costsize.c:121
TargetEntry * get_sortgroupclause_tle(SortGroupClause *sgClause, List *targetList)
Definition: tlist.c:356
bool predicate_implied_by(List *predicate_list, List *clause_list, bool weak)
Definition: predtest.c:151
PGDLLIMPORT double recursive_worktable_factor
Definition: costsize.c:126
List * expand_function_arguments(List *args, bool include_out_arguments, Oid result_type, struct HeapTupleData *func_tuple)
void extract_query_dependencies(Node *query, List **relationOids, List **invalItems, bool *hasRowSecurity)
Definition: setrefs.c:3268
PGDLLIMPORT double cpu_index_tuple_cost
Definition: costsize.c:122
int count_nonjunk_tlist_entries(List *tlist)
Definition: tlist.c:175
PGDLLIMPORT int force_parallel_mode
Definition: planner.c:70
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
Definition: var.c:288
PGDLLIMPORT double seq_page_cost
Definition: costsize.c:119
Expr * expression_planner_with_deps(Expr *expr, List **relationOids, List **invalItems)
Definition: planner.c:5909
Node * eval_const_expressions(PlannerInfo *root, Node *node)
Definition: clauses.c:2150
int locate_var_of_level(Node *node, int levelsup)
Definition: var.c:506
SortGroupClause * get_sortgroupref_clause(Index sortref, List *clauses)
Definition: tlist.c:411
double clamp_row_est(double nrows)
Definition: costsize.c:200
Node * flatten_join_alias_vars(Query *query, Node *node)
Definition: var.c:733
PGDLLIMPORT int effective_cache_size
Definition: costsize.c:128
PGDLLIMPORT double random_page_cost
Definition: costsize.c:120
Expr * canonicalize_qual(Expr *qual, bool is_check)
Definition: prepqual.c:294
bool contain_volatile_functions(Node *clause)
Definition: clauses.c:496
Selectivity clause_selectivity(PlannerInfo *root, Node *clause, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
Definition: clausesel.c:690
Node * estimate_expression_value(PlannerInfo *root, Node *node)
Definition: clauses.c:2290
unsigned int Oid
Definition: postgres_ext.h:31
static struct subre * parse(struct vars *, int, int, struct state *, struct state *)
Definition: regcomp.c:673
Definition: pg_list.h:51
Definition: nodes.h:574
List * invalItems
Definition: plannodes.h:83
List * relationOids
Definition: plannodes.h:81
Definition: type.h:90