| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * paths.h |
| 4 | * prototypes for various files in optimizer/path |
| 5 | * |
| 6 | * |
| 7 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
| 8 | * Portions Copyright (c) 1994, Regents of the University of California |
| 9 | * |
| 10 | * src/include/optimizer/paths.h |
| 11 | * |
| 12 | *------------------------------------------------------------------------- |
| 13 | */ |
| 14 | #ifndef PATHS_H |
| 15 | #define PATHS_H |
| 16 | |
| 17 | #include "nodes/pathnodes.h" |
| 18 | |
| 19 | |
| 20 | /* |
| 21 | * allpaths.c |
| 22 | */ |
| 23 | extern PGDLLIMPORT bool enable_geqo; |
| 24 | extern PGDLLIMPORT int geqo_threshold; |
| 25 | extern PGDLLIMPORT int min_parallel_table_scan_size; |
| 26 | extern PGDLLIMPORT int min_parallel_index_scan_size; |
| 27 | |
| 28 | /* Hook for plugins to get control in set_rel_pathlist() */ |
| 29 | typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, |
| 30 | RelOptInfo *rel, |
| 31 | Index rti, |
| 32 | RangeTblEntry *rte); |
| 33 | extern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook; |
| 34 | |
| 35 | /* Hook for plugins to get control in add_paths_to_joinrel() */ |
| 36 | typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, |
| 37 | RelOptInfo *joinrel, |
| 38 | RelOptInfo *outerrel, |
| 39 | RelOptInfo *innerrel, |
| 40 | JoinType jointype, |
| 41 | JoinPathExtraData *); |
| 42 | extern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook; |
| 43 | |
| 44 | /* Hook for plugins to replace standard_join_search() */ |
| 45 | typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, |
| 46 | int levels_needed, |
| 47 | List *initial_rels); |
| 48 | extern PGDLLIMPORT join_search_hook_type join_search_hook; |
| 49 | |
| 50 | |
| 51 | extern RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist); |
| 52 | extern RelOptInfo *standard_join_search(PlannerInfo *root, int levels_needed, |
| 53 | List *initial_rels); |
| 54 | |
| 55 | extern void generate_gather_paths(PlannerInfo *root, RelOptInfo *rel, |
| 56 | bool override_rows); |
| 57 | extern int compute_parallel_worker(RelOptInfo *rel, double heap_pages, |
| 58 | double index_pages, int max_workers); |
| 59 | extern void create_partial_bitmap_paths(PlannerInfo *root, RelOptInfo *rel, |
| 60 | Path *bitmapqual); |
| 61 | extern void generate_partitionwise_join_paths(PlannerInfo *root, |
| 62 | RelOptInfo *rel); |
| 63 | |
| 64 | #ifdef OPTIMIZER_DEBUG |
| 65 | extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel); |
| 66 | #endif |
| 67 | |
| 68 | /* |
| 69 | * indxpath.c |
| 70 | * routines to generate index paths |
| 71 | */ |
| 72 | extern void create_index_paths(PlannerInfo *root, RelOptInfo *rel); |
| 73 | extern bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel, |
| 74 | List *restrictlist, |
| 75 | List *exprlist, List *oprlist); |
| 76 | extern bool indexcol_is_bool_constant_for_query(IndexOptInfo *index, |
| 77 | int indexcol); |
| 78 | extern bool match_index_to_operand(Node *operand, int indexcol, |
| 79 | IndexOptInfo *index); |
| 80 | extern void check_index_predicates(PlannerInfo *root, RelOptInfo *rel); |
| 81 | |
| 82 | /* |
| 83 | * tidpath.h |
| 84 | * routines to generate tid paths |
| 85 | */ |
| 86 | extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel); |
| 87 | |
| 88 | /* |
| 89 | * joinpath.c |
| 90 | * routines to create join paths |
| 91 | */ |
| 92 | extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel, |
| 93 | RelOptInfo *outerrel, RelOptInfo *innerrel, |
| 94 | JoinType jointype, SpecialJoinInfo *sjinfo, |
| 95 | List *restrictlist); |
| 96 | |
| 97 | /* |
| 98 | * joinrels.c |
| 99 | * routines to determine which relations to join |
| 100 | */ |
| 101 | extern void join_search_one_level(PlannerInfo *root, int level); |
| 102 | extern RelOptInfo *make_join_rel(PlannerInfo *root, |
| 103 | RelOptInfo *rel1, RelOptInfo *rel2); |
| 104 | extern bool have_join_order_restriction(PlannerInfo *root, |
| 105 | RelOptInfo *rel1, RelOptInfo *rel2); |
| 106 | extern bool have_dangerous_phv(PlannerInfo *root, |
| 107 | Relids outer_relids, Relids inner_params); |
| 108 | extern void mark_dummy_rel(RelOptInfo *rel); |
| 109 | extern bool have_partkey_equi_join(RelOptInfo *joinrel, |
| 110 | RelOptInfo *rel1, RelOptInfo *rel2, |
| 111 | JoinType jointype, List *restrictlist); |
| 112 | |
| 113 | /* |
| 114 | * equivclass.c |
| 115 | * routines for managing EquivalenceClasses |
| 116 | */ |
| 117 | typedef bool (*ec_matches_callback_type) (PlannerInfo *root, |
| 118 | RelOptInfo *rel, |
| 119 | EquivalenceClass *ec, |
| 120 | EquivalenceMember *em, |
| 121 | void *arg); |
| 122 | |
| 123 | extern bool process_equivalence(PlannerInfo *root, |
| 124 | RestrictInfo **p_restrictinfo, |
| 125 | bool below_outer_join); |
| 126 | extern Expr *canonicalize_ec_expression(Expr *expr, |
| 127 | Oid req_type, Oid req_collation); |
| 128 | extern void reconsider_outer_join_clauses(PlannerInfo *root); |
| 129 | extern EquivalenceClass *get_eclass_for_sort_expr(PlannerInfo *root, |
| 130 | Expr *expr, |
| 131 | Relids nullable_relids, |
| 132 | List *opfamilies, |
| 133 | Oid opcintype, |
| 134 | Oid collation, |
| 135 | Index sortref, |
| 136 | Relids rel, |
| 137 | bool create_it); |
| 138 | extern void generate_base_implied_equalities(PlannerInfo *root); |
| 139 | extern List *generate_join_implied_equalities(PlannerInfo *root, |
| 140 | Relids join_relids, |
| 141 | Relids outer_relids, |
| 142 | RelOptInfo *inner_rel); |
| 143 | extern List *generate_join_implied_equalities_for_ecs(PlannerInfo *root, |
| 144 | List *eclasses, |
| 145 | Relids join_relids, |
| 146 | Relids outer_relids, |
| 147 | RelOptInfo *inner_rel); |
| 148 | extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2); |
| 149 | extern EquivalenceClass *match_eclasses_to_foreign_key_col(PlannerInfo *root, |
| 150 | ForeignKeyOptInfo *fkinfo, |
| 151 | int colno); |
| 152 | extern void add_child_rel_equivalences(PlannerInfo *root, |
| 153 | AppendRelInfo *appinfo, |
| 154 | RelOptInfo *parent_rel, |
| 155 | RelOptInfo *child_rel); |
| 156 | extern List *generate_implied_equalities_for_column(PlannerInfo *root, |
| 157 | RelOptInfo *rel, |
| 158 | ec_matches_callback_type callback, |
| 159 | void *callback_arg, |
| 160 | Relids prohibited_rels); |
| 161 | extern bool have_relevant_eclass_joinclause(PlannerInfo *root, |
| 162 | RelOptInfo *rel1, RelOptInfo *rel2); |
| 163 | extern bool has_relevant_eclass_joinclause(PlannerInfo *root, |
| 164 | RelOptInfo *rel1); |
| 165 | extern bool eclass_useful_for_merging(PlannerInfo *root, |
| 166 | EquivalenceClass *eclass, |
| 167 | RelOptInfo *rel); |
| 168 | extern bool is_redundant_derived_clause(RestrictInfo *rinfo, List *clauselist); |
| 169 | extern bool is_redundant_with_indexclauses(RestrictInfo *rinfo, |
| 170 | List *indexclauses); |
| 171 | |
| 172 | /* |
| 173 | * pathkeys.c |
| 174 | * utilities for matching and building path keys |
| 175 | */ |
| 176 | typedef enum |
| 177 | { |
| 178 | PATHKEYS_EQUAL, /* pathkeys are identical */ |
| 179 | PATHKEYS_BETTER1, /* pathkey 1 is a superset of pathkey 2 */ |
| 180 | PATHKEYS_BETTER2, /* vice versa */ |
| 181 | PATHKEYS_DIFFERENT /* neither pathkey includes the other */ |
| 182 | } PathKeysComparison; |
| 183 | |
| 184 | extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2); |
| 185 | extern bool pathkeys_contained_in(List *keys1, List *keys2); |
| 186 | extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys, |
| 187 | Relids required_outer, |
| 188 | CostSelector cost_criterion, |
| 189 | bool require_parallel_safe); |
| 190 | extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths, |
| 191 | List *pathkeys, |
| 192 | Relids required_outer, |
| 193 | double fraction); |
| 194 | extern Path *get_cheapest_parallel_safe_total_inner(List *paths); |
| 195 | extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index, |
| 196 | ScanDirection scandir); |
| 197 | extern List *build_partition_pathkeys(PlannerInfo *root, RelOptInfo *partrel, |
| 198 | ScanDirection scandir, bool *partialkeys); |
| 199 | extern List *build_expression_pathkey(PlannerInfo *root, Expr *expr, |
| 200 | Relids nullable_relids, Oid opno, |
| 201 | Relids rel, bool create_it); |
| 202 | extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel, |
| 203 | List *subquery_pathkeys, |
| 204 | List *subquery_tlist); |
| 205 | extern List *build_join_pathkeys(PlannerInfo *root, |
| 206 | RelOptInfo *joinrel, |
| 207 | JoinType jointype, |
| 208 | List *outer_pathkeys); |
| 209 | extern List *make_pathkeys_for_sortclauses(PlannerInfo *root, |
| 210 | List *sortclauses, |
| 211 | List *tlist); |
| 212 | extern void initialize_mergeclause_eclasses(PlannerInfo *root, |
| 213 | RestrictInfo *restrictinfo); |
| 214 | extern void update_mergeclause_eclasses(PlannerInfo *root, |
| 215 | RestrictInfo *restrictinfo); |
| 216 | extern List *find_mergeclauses_for_outer_pathkeys(PlannerInfo *root, |
| 217 | List *pathkeys, |
| 218 | List *restrictinfos); |
| 219 | extern List *select_outer_pathkeys_for_merge(PlannerInfo *root, |
| 220 | List *mergeclauses, |
| 221 | RelOptInfo *joinrel); |
| 222 | extern List *make_inner_pathkeys_for_merge(PlannerInfo *root, |
| 223 | List *mergeclauses, |
| 224 | List *outer_pathkeys); |
| 225 | extern List *trim_mergeclauses_for_inner_pathkeys(PlannerInfo *root, |
| 226 | List *mergeclauses, |
| 227 | List *pathkeys); |
| 228 | extern List *truncate_useless_pathkeys(PlannerInfo *root, |
| 229 | RelOptInfo *rel, |
| 230 | List *pathkeys); |
| 231 | extern bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel); |
| 232 | extern PathKey *make_canonical_pathkey(PlannerInfo *root, |
| 233 | EquivalenceClass *eclass, Oid opfamily, |
| 234 | int strategy, bool nulls_first); |
| 235 | extern void add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, |
| 236 | List *live_childrels); |
| 237 | |
| 238 | #endif /* PATHS_H */ |
| 239 | |