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 *extra); 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(PlannerInfo *root, 77 IndexOptInfo *index, 78 int indexcol); 79 extern bool match_index_to_operand(Node *operand, int indexcol, 80 IndexOptInfo *index); 81 extern void check_index_predicates(PlannerInfo *root, RelOptInfo *rel); 82 83 /* 84 * tidpath.h 85 * routines to generate tid paths 86 */ 87 extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel); 88 89 /* 90 * joinpath.c 91 * routines to create join paths 92 */ 93 extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel, 94 RelOptInfo *outerrel, RelOptInfo *innerrel, 95 JoinType jointype, SpecialJoinInfo *sjinfo, 96 List *restrictlist); 97 98 /* 99 * joinrels.c 100 * routines to determine which relations to join 101 */ 102 extern void join_search_one_level(PlannerInfo *root, int level); 103 extern RelOptInfo *make_join_rel(PlannerInfo *root, 104 RelOptInfo *rel1, RelOptInfo *rel2); 105 extern bool have_join_order_restriction(PlannerInfo *root, 106 RelOptInfo *rel1, RelOptInfo *rel2); 107 extern bool have_dangerous_phv(PlannerInfo *root, 108 Relids outer_relids, Relids inner_params); 109 extern void mark_dummy_rel(RelOptInfo *rel); 110 extern bool have_partkey_equi_join(RelOptInfo *joinrel, 111 RelOptInfo *rel1, RelOptInfo *rel2, 112 JoinType jointype, List *restrictlist); 113 114 /* 115 * equivclass.c 116 * routines for managing EquivalenceClasses 117 */ 118 typedef bool (*ec_matches_callback_type) (PlannerInfo *root, 119 RelOptInfo *rel, 120 EquivalenceClass *ec, 121 EquivalenceMember *em, 122 void *arg); 123 124 extern bool process_equivalence(PlannerInfo *root, 125 RestrictInfo **p_restrictinfo, 126 bool below_outer_join); 127 extern Expr *canonicalize_ec_expression(Expr *expr, 128 Oid req_type, Oid req_collation); 129 extern void reconsider_outer_join_clauses(PlannerInfo *root); 130 extern EquivalenceClass *get_eclass_for_sort_expr(PlannerInfo *root, 131 Expr *expr, 132 Relids nullable_relids, 133 List *opfamilies, 134 Oid opcintype, 135 Oid collation, 136 Index sortref, 137 Relids rel, 138 bool create_it); 139 extern void generate_base_implied_equalities(PlannerInfo *root); 140 extern List *generate_join_implied_equalities(PlannerInfo *root, 141 Relids join_relids, 142 Relids outer_relids, 143 RelOptInfo *inner_rel); 144 extern List *generate_join_implied_equalities_for_ecs(PlannerInfo *root, 145 List *eclasses, 146 Relids join_relids, 147 Relids outer_relids, 148 RelOptInfo *inner_rel); 149 extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2); 150 extern EquivalenceClass *match_eclasses_to_foreign_key_col(PlannerInfo *root, 151 ForeignKeyOptInfo *fkinfo, 152 int colno); 153 extern void add_child_rel_equivalences(PlannerInfo *root, 154 AppendRelInfo *appinfo, 155 RelOptInfo *parent_rel, 156 RelOptInfo *child_rel); 157 extern void add_child_join_rel_equivalences(PlannerInfo *root, 158 int nappinfos, 159 AppendRelInfo **appinfos, 160 RelOptInfo *parent_rel, 161 RelOptInfo *child_rel); 162 extern List *generate_implied_equalities_for_column(PlannerInfo *root, 163 RelOptInfo *rel, 164 ec_matches_callback_type callback, 165 void *callback_arg, 166 Relids prohibited_rels); 167 extern bool have_relevant_eclass_joinclause(PlannerInfo *root, 168 RelOptInfo *rel1, RelOptInfo *rel2); 169 extern bool has_relevant_eclass_joinclause(PlannerInfo *root, 170 RelOptInfo *rel1); 171 extern bool eclass_useful_for_merging(PlannerInfo *root, 172 EquivalenceClass *eclass, 173 RelOptInfo *rel); 174 extern bool is_redundant_derived_clause(RestrictInfo *rinfo, List *clauselist); 175 extern bool is_redundant_with_indexclauses(RestrictInfo *rinfo, 176 List *indexclauses); 177 178 /* 179 * pathkeys.c 180 * utilities for matching and building path keys 181 */ 182 typedef enum 183 { 184 PATHKEYS_EQUAL, /* pathkeys are identical */ 185 PATHKEYS_BETTER1, /* pathkey 1 is a superset of pathkey 2 */ 186 PATHKEYS_BETTER2, /* vice versa */ 187 PATHKEYS_DIFFERENT /* neither pathkey includes the other */ 188 } PathKeysComparison; 189 190 extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2); 191 extern bool pathkeys_contained_in(List *keys1, List *keys2); 192 extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys, 193 Relids required_outer, 194 CostSelector cost_criterion, 195 bool require_parallel_safe); 196 extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths, 197 List *pathkeys, 198 Relids required_outer, 199 double fraction); 200 extern Path *get_cheapest_parallel_safe_total_inner(List *paths); 201 extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index, 202 ScanDirection scandir); 203 extern List *build_partition_pathkeys(PlannerInfo *root, RelOptInfo *partrel, 204 ScanDirection scandir, bool *partialkeys); 205 extern List *build_expression_pathkey(PlannerInfo *root, Expr *expr, 206 Relids nullable_relids, Oid opno, 207 Relids rel, bool create_it); 208 extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel, 209 List *subquery_pathkeys, 210 List *subquery_tlist); 211 extern List *build_join_pathkeys(PlannerInfo *root, 212 RelOptInfo *joinrel, 213 JoinType jointype, 214 List *outer_pathkeys); 215 extern List *make_pathkeys_for_sortclauses(PlannerInfo *root, 216 List *sortclauses, 217 List *tlist); 218 extern void initialize_mergeclause_eclasses(PlannerInfo *root, 219 RestrictInfo *restrictinfo); 220 extern void update_mergeclause_eclasses(PlannerInfo *root, 221 RestrictInfo *restrictinfo); 222 extern List *find_mergeclauses_for_outer_pathkeys(PlannerInfo *root, 223 List *pathkeys, 224 List *restrictinfos); 225 extern List *select_outer_pathkeys_for_merge(PlannerInfo *root, 226 List *mergeclauses, 227 RelOptInfo *joinrel); 228 extern List *make_inner_pathkeys_for_merge(PlannerInfo *root, 229 List *mergeclauses, 230 List *outer_pathkeys); 231 extern List *trim_mergeclauses_for_inner_pathkeys(PlannerInfo *root, 232 List *mergeclauses, 233 List *pathkeys); 234 extern List *truncate_useless_pathkeys(PlannerInfo *root, 235 RelOptInfo *rel, 236 List *pathkeys); 237 extern bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel); 238 extern PathKey *make_canonical_pathkey(PlannerInfo *root, 239 EquivalenceClass *eclass, Oid opfamily, 240 int strategy, bool nulls_first); 241 extern void add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, 242 List *live_childrels); 243 244 #endif /* PATHS_H */ 245