| 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 |
| 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 |
| 44 | typedef 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 */ |
| 49 | struct PlannedStmt; |
| 50 | struct ParamListInfoData; |
| 51 | struct HeapTupleData; |
| 52 | |
| 53 | |
| 54 | /* in path/clausesel.c: */ |
| 55 | |
| 56 | extern Selectivity clause_selectivity(PlannerInfo *root, |
| 57 | Node *clause, |
| 58 | int varRelid, |
| 59 | JoinType jointype, |
| 60 | SpecialJoinInfo *sjinfo); |
| 61 | extern Selectivity clauselist_selectivity_simple(PlannerInfo *root, |
| 62 | List *clauses, |
| 63 | int varRelid, |
| 64 | JoinType jointype, |
| 65 | SpecialJoinInfo *sjinfo, |
| 66 | Bitmapset *estimatedclauses); |
| 67 | extern 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 */ |
| 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; |
| 83 | extern PGDLLIMPORT int effective_cache_size; |
| 84 | |
| 85 | extern double clamp_row_est(double nrows); |
| 86 | |
| 87 | /* in path/indxpath.c: */ |
| 88 | |
| 89 | extern bool is_pseudo_constant_for_index(Node *expr, IndexOptInfo *index); |
| 90 | |
| 91 | /* in plan/planner.c: */ |
| 92 | |
| 93 | /* possible values for force_parallel_mode */ |
| 94 | typedef enum |
| 95 | { |
| 96 | FORCE_PARALLEL_OFF, |
| 97 | FORCE_PARALLEL_ON, |
| 98 | FORCE_PARALLEL_REGRESS |
| 99 | } ForceParallelMode; |
| 100 | |
| 101 | /* GUC parameters */ |
| 102 | extern int force_parallel_mode; |
| 103 | extern bool parallel_leader_participation; |
| 104 | |
| 105 | extern struct PlannedStmt *planner(Query *parse, int cursorOptions, |
| 106 | struct ParamListInfoData *boundParams); |
| 107 | |
| 108 | extern Expr *expression_planner(Expr *expr); |
| 109 | extern Expr *expression_planner_with_deps(Expr *expr, |
| 110 | List **relationOids, |
| 111 | List **invalItems); |
| 112 | |
| 113 | extern bool plan_cluster_use_sort(Oid tableOid, Oid indexOid); |
| 114 | extern int plan_create_index_workers(Oid tableOid, Oid indexOid); |
| 115 | |
| 116 | /* in plan/setrefs.c: */ |
| 117 | |
| 118 | extern void (Node *query, |
| 119 | List **relationOids, |
| 120 | List **invalItems, |
| 121 | bool *hasRowSecurity); |
| 122 | |
| 123 | /* in prep/prepqual.c: */ |
| 124 | |
| 125 | extern Node *negate_clause(Node *node); |
| 126 | extern Expr *canonicalize_qual(Expr *qual, bool is_check); |
| 127 | |
| 128 | /* in util/clauses.c: */ |
| 129 | |
| 130 | extern bool contain_mutable_functions(Node *clause); |
| 131 | extern bool contain_volatile_functions(Node *clause); |
| 132 | extern bool contain_volatile_functions_not_nextval(Node *clause); |
| 133 | |
| 134 | extern Node *eval_const_expressions(PlannerInfo *root, Node *node); |
| 135 | |
| 136 | extern Node *estimate_expression_value(PlannerInfo *root, Node *node); |
| 137 | |
| 138 | extern Expr *evaluate_expr(Expr *expr, Oid result_type, int32 result_typmod, |
| 139 | Oid result_collation); |
| 140 | |
| 141 | extern List *expand_function_arguments(List *args, Oid result_type, |
| 142 | struct HeapTupleData *func_tuple); |
| 143 | |
| 144 | /* in util/predtest.c: */ |
| 145 | |
| 146 | extern bool predicate_implied_by(List *predicate_list, List *clause_list, |
| 147 | bool weak); |
| 148 | extern bool predicate_refuted_by(List *predicate_list, List *clause_list, |
| 149 | bool weak); |
| 150 | |
| 151 | /* in util/tlist.c: */ |
| 152 | |
| 153 | extern int count_nonjunk_tlist_entries(List *tlist); |
| 154 | extern TargetEntry *get_sortgroupref_tle(Index sortref, |
| 155 | List *targetList); |
| 156 | extern TargetEntry *get_sortgroupclause_tle(SortGroupClause *sgClause, |
| 157 | List *targetList); |
| 158 | extern Node *get_sortgroupclause_expr(SortGroupClause *sgClause, |
| 159 | List *targetList); |
| 160 | extern List *get_sortgrouplist_exprs(List *sgClauses, |
| 161 | List *targetList); |
| 162 | extern SortGroupClause *get_sortgroupref_clause(Index sortref, |
| 163 | List *clauses); |
| 164 | extern 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 | |
| 179 | extern Bitmapset *pull_varnos(Node *node); |
| 180 | extern Bitmapset *pull_varnos_of_level(Node *node, int levelsup); |
| 181 | extern void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos); |
| 182 | extern List *pull_vars_of_level(Node *node, int levelsup); |
| 183 | extern bool contain_var_clause(Node *node); |
| 184 | extern bool contain_vars_of_level(Node *node, int levelsup); |
| 185 | extern int locate_var_of_level(Node *node, int levelsup); |
| 186 | extern List *pull_var_clause(Node *node, int flags); |
| 187 | extern Node *flatten_join_alias_vars(Query *query, Node *node); |
| 188 | |
| 189 | #endif /* OPTIMIZER_H */ |
| 190 | |