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-2019, 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
34typedef struct PlannerInfo PlannerInfo;
35#define HAVE_PLANNERINFO_TYPEDEF 1
36#endif
37
38/* Likewise for IndexOptInfo and SpecialJoinInfo. */
39#ifndef HAVE_INDEXOPTINFO_TYPEDEF
40typedef struct IndexOptInfo IndexOptInfo;
41#define HAVE_INDEXOPTINFO_TYPEDEF 1
42#endif
43#ifndef HAVE_SPECIALJOININFO_TYPEDEF
44typedef struct SpecialJoinInfo SpecialJoinInfo;
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 */
49struct PlannedStmt;
50struct ParamListInfoData;
51struct HeapTupleData;
52
53
54/* in path/clausesel.c: */
55
56extern Selectivity clause_selectivity(PlannerInfo *root,
57 Node *clause,
58 int varRelid,
59 JoinType jointype,
60 SpecialJoinInfo *sjinfo);
61extern Selectivity clauselist_selectivity_simple(PlannerInfo *root,
62 List *clauses,
63 int varRelid,
64 JoinType jointype,
65 SpecialJoinInfo *sjinfo,
66 Bitmapset *estimatedclauses);
67extern Selectivity clauselist_selectivity(PlannerInfo *root,
68 List *clauses,
69 int varRelid,
70 JoinType jointype,
71 SpecialJoinInfo *sjinfo);
72
73/* in path/costsize.c: */
74
75/* widely used cost parameters */
76extern PGDLLIMPORT double seq_page_cost;
77extern PGDLLIMPORT double random_page_cost;
78extern PGDLLIMPORT double cpu_tuple_cost;
79extern PGDLLIMPORT double cpu_index_tuple_cost;
80extern PGDLLIMPORT double cpu_operator_cost;
81extern PGDLLIMPORT double parallel_tuple_cost;
82extern PGDLLIMPORT double parallel_setup_cost;
83extern PGDLLIMPORT int effective_cache_size;
84
85extern double clamp_row_est(double nrows);
86
87/* in path/indxpath.c: */
88
89extern bool is_pseudo_constant_for_index(Node *expr, IndexOptInfo *index);
90
91/* in plan/planner.c: */
92
93/* possible values for force_parallel_mode */
94typedef enum
95{
96 FORCE_PARALLEL_OFF,
97 FORCE_PARALLEL_ON,
98 FORCE_PARALLEL_REGRESS
99} ForceParallelMode;
100
101/* GUC parameters */
102extern int force_parallel_mode;
103extern bool parallel_leader_participation;
104
105extern struct PlannedStmt *planner(Query *parse, int cursorOptions,
106 struct ParamListInfoData *boundParams);
107
108extern Expr *expression_planner(Expr *expr);
109extern Expr *expression_planner_with_deps(Expr *expr,
110 List **relationOids,
111 List **invalItems);
112
113extern bool plan_cluster_use_sort(Oid tableOid, Oid indexOid);
114extern int plan_create_index_workers(Oid tableOid, Oid indexOid);
115
116/* in plan/setrefs.c: */
117
118extern void extract_query_dependencies(Node *query,
119 List **relationOids,
120 List **invalItems,
121 bool *hasRowSecurity);
122
123/* in prep/prepqual.c: */
124
125extern Node *negate_clause(Node *node);
126extern Expr *canonicalize_qual(Expr *qual, bool is_check);
127
128/* in util/clauses.c: */
129
130extern bool contain_mutable_functions(Node *clause);
131extern bool contain_volatile_functions(Node *clause);
132extern bool contain_volatile_functions_not_nextval(Node *clause);
133
134extern Node *eval_const_expressions(PlannerInfo *root, Node *node);
135
136extern Node *estimate_expression_value(PlannerInfo *root, Node *node);
137
138extern Expr *evaluate_expr(Expr *expr, Oid result_type, int32 result_typmod,
139 Oid result_collation);
140
141extern List *expand_function_arguments(List *args, Oid result_type,
142 struct HeapTupleData *func_tuple);
143
144/* in util/predtest.c: */
145
146extern bool predicate_implied_by(List *predicate_list, List *clause_list,
147 bool weak);
148extern bool predicate_refuted_by(List *predicate_list, List *clause_list,
149 bool weak);
150
151/* in util/tlist.c: */
152
153extern int count_nonjunk_tlist_entries(List *tlist);
154extern TargetEntry *get_sortgroupref_tle(Index sortref,
155 List *targetList);
156extern TargetEntry *get_sortgroupclause_tle(SortGroupClause *sgClause,
157 List *targetList);
158extern Node *get_sortgroupclause_expr(SortGroupClause *sgClause,
159 List *targetList);
160extern List *get_sortgrouplist_exprs(List *sgClauses,
161 List *targetList);
162extern SortGroupClause *get_sortgroupref_clause(Index sortref,
163 List *clauses);
164extern SortGroupClause *get_sortgroupref_clause_noerr(Index sortref,
165 List *clauses);
166
167/* in util/var.c: */
168
169/* Bits that can be OR'd into the flags argument of pull_var_clause() */
170#define PVC_INCLUDE_AGGREGATES 0x0001 /* include Aggrefs in output list */
171#define PVC_RECURSE_AGGREGATES 0x0002 /* recurse into Aggref arguments */
172#define PVC_INCLUDE_WINDOWFUNCS 0x0004 /* include WindowFuncs in output list */
173#define PVC_RECURSE_WINDOWFUNCS 0x0008 /* recurse into WindowFunc arguments */
174#define PVC_INCLUDE_PLACEHOLDERS 0x0010 /* include PlaceHolderVars in
175 * output list */
176#define PVC_RECURSE_PLACEHOLDERS 0x0020 /* recurse into PlaceHolderVar
177 * arguments */
178
179extern Bitmapset *pull_varnos(Node *node);
180extern Bitmapset *pull_varnos_of_level(Node *node, int levelsup);
181extern void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos);
182extern List *pull_vars_of_level(Node *node, int levelsup);
183extern bool contain_var_clause(Node *node);
184extern bool contain_vars_of_level(Node *node, int levelsup);
185extern int locate_var_of_level(Node *node, int levelsup);
186extern List *pull_var_clause(Node *node, int flags);
187extern Node *flatten_join_alias_vars(Query *query, Node *node);
188
189#endif /* OPTIMIZER_H */
190