gooderp18绿色标准版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 line
9.1KB

  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. #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 int compute_parallel_worker(RelOptInfo *rel, double heap_pages,
  49. double index_pages, int max_workers);
  50. extern void create_partial_bitmap_paths(PlannerInfo *root, RelOptInfo *rel,
  51. Path *bitmapqual);
  52. extern void generate_partitionwise_join_paths(PlannerInfo *root,
  53. RelOptInfo *rel);
  54. #ifdef OPTIMIZER_DEBUG
  55. extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel);
  56. #endif
  57. /*
  58. * indxpath.c
  59. * routines to generate index paths
  60. */
  61. extern void create_index_paths(PlannerInfo *root, RelOptInfo *rel);
  62. extern bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel,
  63. List *restrictlist,
  64. List *exprlist, List *oprlist);
  65. extern bool indexcol_is_bool_constant_for_query(IndexOptInfo *index,
  66. int indexcol);
  67. extern bool match_index_to_operand(Node *operand, int indexcol,
  68. IndexOptInfo *index);
  69. extern void check_index_predicates(PlannerInfo *root, RelOptInfo *rel);
  70. /*
  71. * tidpath.h
  72. * routines to generate tid paths
  73. */
  74. extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel);
  75. /*
  76. * joinpath.c
  77. * routines to create join paths
  78. */
  79. extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel,
  80. RelOptInfo *outerrel, RelOptInfo *innerrel,
  81. JoinType jointype, SpecialJoinInfo *sjinfo,
  82. List *restrictlist);
  83. /*
  84. * joinrels.c
  85. * routines to determine which relations to join
  86. */
  87. extern void join_search_one_level(PlannerInfo *root, int level);
  88. extern RelOptInfo *make_join_rel(PlannerInfo *root,
  89. RelOptInfo *rel1, RelOptInfo *rel2);
  90. extern bool have_join_order_restriction(PlannerInfo *root,
  91. RelOptInfo *rel1, RelOptInfo *rel2);
  92. extern bool have_dangerous_phv(PlannerInfo *root,
  93. Relids outer_relids, Relids inner_params);
  94. extern void mark_dummy_rel(RelOptInfo *rel);
  95. extern bool have_partkey_equi_join(RelOptInfo *joinrel,
  96. RelOptInfo *rel1, RelOptInfo *rel2,
  97. JoinType jointype, List *restrictlist);
  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 void generate_base_implied_equalities(PlannerInfo *root);
  123. extern List *generate_join_implied_equalities(PlannerInfo *root,
  124. Relids join_relids,
  125. Relids outer_relids,
  126. RelOptInfo *inner_rel);
  127. extern List *generate_join_implied_equalities_for_ecs(PlannerInfo *root,
  128. List *eclasses,
  129. Relids join_relids,
  130. Relids outer_relids,
  131. RelOptInfo *inner_rel);
  132. extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2);
  133. extern EquivalenceClass *match_eclasses_to_foreign_key_col(PlannerInfo *root,
  134. ForeignKeyOptInfo *fkinfo,
  135. int colno);
  136. extern void add_child_rel_equivalences(PlannerInfo *root,
  137. AppendRelInfo *appinfo,
  138. RelOptInfo *parent_rel,
  139. RelOptInfo *child_rel);
  140. extern void add_child_join_rel_equivalences(PlannerInfo *root,
  141. int nappinfos,
  142. AppendRelInfo **appinfos,
  143. RelOptInfo *parent_rel,
  144. RelOptInfo *child_rel);
  145. extern List *generate_implied_equalities_for_column(PlannerInfo *root,
  146. RelOptInfo *rel,
  147. ec_matches_callback_type callback,
  148. void *callback_arg,
  149. Relids prohibited_rels);
  150. extern bool have_relevant_eclass_joinclause(PlannerInfo *root,
  151. RelOptInfo *rel1, RelOptInfo *rel2);
  152. extern bool has_relevant_eclass_joinclause(PlannerInfo *root,
  153. RelOptInfo *rel1);
  154. extern bool eclass_useful_for_merging(PlannerInfo *root,
  155. EquivalenceClass *eclass,
  156. RelOptInfo *rel);
  157. extern bool is_redundant_derived_clause(RestrictInfo *rinfo, List *clauselist);
  158. extern bool is_redundant_with_indexclauses(RestrictInfo *rinfo,
  159. List *indexclauses);
  160. /*
  161. * pathkeys.c
  162. * utilities for matching and building path keys
  163. */
  164. typedef enum
  165. {
  166. PATHKEYS_EQUAL, /* pathkeys are identical */
  167. PATHKEYS_BETTER1, /* pathkey 1 is a superset of pathkey 2 */
  168. PATHKEYS_BETTER2, /* vice versa */
  169. PATHKEYS_DIFFERENT /* neither pathkey includes the other */
  170. } PathKeysComparison;
  171. extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2);
  172. extern bool pathkeys_contained_in(List *keys1, List *keys2);
  173. extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,
  174. Relids required_outer,
  175. CostSelector cost_criterion,
  176. bool require_parallel_safe);
  177. extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths,
  178. List *pathkeys,
  179. Relids required_outer,
  180. double fraction);
  181. extern Path *get_cheapest_parallel_safe_total_inner(List *paths);
  182. extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index,
  183. ScanDirection scandir);
  184. extern List *build_partition_pathkeys(PlannerInfo *root, RelOptInfo *partrel,
  185. ScanDirection scandir, bool *partialkeys);
  186. extern List *build_expression_pathkey(PlannerInfo *root, Expr *expr,
  187. Relids nullable_relids, Oid opno,
  188. Relids rel, bool create_it);
  189. extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel,
  190. List *subquery_pathkeys,
  191. List *subquery_tlist);
  192. extern List *build_join_pathkeys(PlannerInfo *root,
  193. RelOptInfo *joinrel,
  194. JoinType jointype,
  195. List *outer_pathkeys);
  196. extern List *make_pathkeys_for_sortclauses(PlannerInfo *root,
  197. List *sortclauses,
  198. List *tlist);
  199. extern void initialize_mergeclause_eclasses(PlannerInfo *root,
  200. RestrictInfo *restrictinfo);
  201. extern void update_mergeclause_eclasses(PlannerInfo *root,
  202. RestrictInfo *restrictinfo);
  203. extern List *find_mergeclauses_for_outer_pathkeys(PlannerInfo *root,
  204. List *pathkeys,
  205. List *restrictinfos);
  206. extern List *select_outer_pathkeys_for_merge(PlannerInfo *root,
  207. List *mergeclauses,
  208. RelOptInfo *joinrel);
  209. extern List *make_inner_pathkeys_for_merge(PlannerInfo *root,
  210. List *mergeclauses,
  211. List *outer_pathkeys);
  212. extern List *trim_mergeclauses_for_inner_pathkeys(PlannerInfo *root,
  213. List *mergeclauses,
  214. List *pathkeys);
  215. extern List *truncate_useless_pathkeys(PlannerInfo *root,
  216. RelOptInfo *rel,
  217. List *pathkeys);
  218. extern bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel);
  219. extern PathKey *make_canonical_pathkey(PlannerInfo *root,
  220. EquivalenceClass *eclass, Oid opfamily,
  221. int strategy, bool nulls_first);
  222. extern void add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel,
  223. List *live_childrels);
  224. #endif /* PATHS_H */
上海开阖软件有限公司 沪ICP备12045867号-1