1 /*------------------------------------------------------------------------- 2 * 3 * paths.h 4 * prototypes for various files in optimizer/path 5 * 6 * 7 * Portions Copyright (c) 1996-2020, 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 void generate_useful_gather_paths(PlannerInfo *root, RelOptInfo *rel, 58 bool override_rows); 59 extern int compute_parallel_worker(RelOptInfo *rel, double heap_pages, 60 double index_pages, int max_workers); 61 extern void create_partial_bitmap_paths(PlannerInfo *root, RelOptInfo *rel, 62 Path *bitmapqual); 63 extern void generate_partitionwise_join_paths(PlannerInfo *root, 64 RelOptInfo *rel); 65 66 #ifdef OPTIMIZER_DEBUG 67 extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel); 68 #endif 69 70 /* 71 * indxpath.c 72 * routines to generate index paths 73 */ 74 extern void create_index_paths(PlannerInfo *root, RelOptInfo *rel); 75 extern bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel, 76 List *restrictlist, 77 List *exprlist, List *oprlist); 78 extern bool indexcol_is_bool_constant_for_query(PlannerInfo *root, 79 IndexOptInfo *index, 80 int indexcol); 81 extern bool match_index_to_operand(Node *operand, int indexcol, 82 IndexOptInfo *index); 83 extern void check_index_predicates(PlannerInfo *root, RelOptInfo *rel); 84 85 /* 86 * tidpath.h 87 * routines to generate tid paths 88 */ 89 extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel); 90 91 /* 92 * joinpath.c 93 * routines to create join paths 94 */ 95 extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel, 96 RelOptInfo *outerrel, RelOptInfo *innerrel, 97 JoinType jointype, SpecialJoinInfo *sjinfo, 98 List *restrictlist); 99 100 /* 101 * joinrels.c 102 * routines to determine which relations to join 103 */ 104 extern void join_search_one_level(PlannerInfo *root, int level); 105 extern RelOptInfo *make_join_rel(PlannerInfo *root, 106 RelOptInfo *rel1, RelOptInfo *rel2); 107 extern bool have_join_order_restriction(PlannerInfo *root, 108 RelOptInfo *rel1, RelOptInfo *rel2); 109 extern bool have_dangerous_phv(PlannerInfo *root, 110 Relids outer_relids, Relids inner_params); 111 extern void mark_dummy_rel(RelOptInfo *rel); 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 EquivalenceMember *find_ec_member_matching_expr(EquivalenceClass *ec, 139 Expr *expr, 140 Relids relids); 141 extern EquivalenceMember *find_computable_ec_member(PlannerInfo *root, 142 EquivalenceClass *ec, 143 List *exprs, 144 Relids relids, 145 bool require_parallel_safe); 146 extern Expr *find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel); 147 extern Expr *find_em_expr_usable_for_sorting_rel(PlannerInfo *root, 148 EquivalenceClass *ec, 149 RelOptInfo *rel, 150 bool require_parallel_safe); 151 extern void generate_base_implied_equalities(PlannerInfo *root); 152 extern List *generate_join_implied_equalities(PlannerInfo *root, 153 Relids join_relids, 154 Relids outer_relids, 155 RelOptInfo *inner_rel); 156 extern List *generate_join_implied_equalities_for_ecs(PlannerInfo *root, 157 List *eclasses, 158 Relids join_relids, 159 Relids outer_relids, 160 RelOptInfo *inner_rel); 161 extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2); 162 extern EquivalenceClass *match_eclasses_to_foreign_key_col(PlannerInfo *root, 163 ForeignKeyOptInfo *fkinfo, 164 int colno); 165 extern void add_child_rel_equivalences(PlannerInfo *root, 166 AppendRelInfo *appinfo, 167 RelOptInfo *parent_rel, 168 RelOptInfo *child_rel); 169 extern void add_child_join_rel_equivalences(PlannerInfo *root, 170 int nappinfos, 171 AppendRelInfo **appinfos, 172 RelOptInfo *parent_rel, 173 RelOptInfo *child_rel); 174 extern List *generate_implied_equalities_for_column(PlannerInfo *root, 175 RelOptInfo *rel, 176 ec_matches_callback_type callback, 177 void *callback_arg, 178 Relids prohibited_rels); 179 extern bool have_relevant_eclass_joinclause(PlannerInfo *root, 180 RelOptInfo *rel1, RelOptInfo *rel2); 181 extern bool has_relevant_eclass_joinclause(PlannerInfo *root, 182 RelOptInfo *rel1); 183 extern bool eclass_useful_for_merging(PlannerInfo *root, 184 EquivalenceClass *eclass, 185 RelOptInfo *rel); 186 extern bool is_redundant_derived_clause(RestrictInfo *rinfo, List *clauselist); 187 extern bool is_redundant_with_indexclauses(RestrictInfo *rinfo, 188 List *indexclauses); 189 190 /* 191 * pathkeys.c 192 * utilities for matching and building path keys 193 */ 194 typedef enum 195 { 196 PATHKEYS_EQUAL, /* pathkeys are identical */ 197 PATHKEYS_BETTER1, /* pathkey 1 is a superset of pathkey 2 */ 198 PATHKEYS_BETTER2, /* vice versa */ 199 PATHKEYS_DIFFERENT /* neither pathkey includes the other */ 200 } PathKeysComparison; 201 202 extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2); 203 extern bool pathkeys_contained_in(List *keys1, List *keys2); 204 extern bool pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common); 205 extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys, 206 Relids required_outer, 207 CostSelector cost_criterion, 208 bool require_parallel_safe); 209 extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths, 210 List *pathkeys, 211 Relids required_outer, 212 double fraction); 213 extern Path *get_cheapest_parallel_safe_total_inner(List *paths); 214 extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index, 215 ScanDirection scandir); 216 extern List *build_partition_pathkeys(PlannerInfo *root, RelOptInfo *partrel, 217 ScanDirection scandir, bool *partialkeys); 218 extern List *build_expression_pathkey(PlannerInfo *root, Expr *expr, 219 Relids nullable_relids, Oid opno, 220 Relids rel, bool create_it); 221 extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel, 222 List *subquery_pathkeys, 223 List *subquery_tlist); 224 extern List *build_join_pathkeys(PlannerInfo *root, 225 RelOptInfo *joinrel, 226 JoinType jointype, 227 List *outer_pathkeys); 228 extern List *make_pathkeys_for_sortclauses(PlannerInfo *root, 229 List *sortclauses, 230 List *tlist); 231 extern void initialize_mergeclause_eclasses(PlannerInfo *root, 232 RestrictInfo *restrictinfo); 233 extern void update_mergeclause_eclasses(PlannerInfo *root, 234 RestrictInfo *restrictinfo); 235 extern List *find_mergeclauses_for_outer_pathkeys(PlannerInfo *root, 236 List *pathkeys, 237 List *restrictinfos); 238 extern List *select_outer_pathkeys_for_merge(PlannerInfo *root, 239 List *mergeclauses, 240 RelOptInfo *joinrel); 241 extern List *make_inner_pathkeys_for_merge(PlannerInfo *root, 242 List *mergeclauses, 243 List *outer_pathkeys); 244 extern List *trim_mergeclauses_for_inner_pathkeys(PlannerInfo *root, 245 List *mergeclauses, 246 List *pathkeys); 247 extern List *truncate_useless_pathkeys(PlannerInfo *root, 248 RelOptInfo *rel, 249 List *pathkeys); 250 extern bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel); 251 extern PathKey *make_canonical_pathkey(PlannerInfo *root, 252 EquivalenceClass *eclass, Oid opfamily, 253 int strategy, bool nulls_first); 254 extern void add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, 255 List *live_childrels); 256 257 #endif /* PATHS_H */ 258