paths.h 9.8 KB

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