paths.h 7.8 KB

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