pathnode.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /*-------------------------------------------------------------------------
  2. *
  3. * pathnode.h
  4. * prototypes for pathnode.c, relnode.c.
  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/pathnode.h
  11. *
  12. *-------------------------------------------------------------------------
  13. */
  14. #ifndef PATHNODE_H
  15. #define PATHNODE_H
  16. #include "nodes/relation.h"
  17. /*
  18. * prototypes for pathnode.c
  19. */
  20. extern int compare_path_costs(Path *path1, Path *path2,
  21. CostSelector criterion);
  22. extern int compare_fractional_path_costs(Path *path1, Path *path2,
  23. double fraction);
  24. extern void set_cheapest(RelOptInfo *parent_rel);
  25. extern void add_path(RelOptInfo *parent_rel, Path *new_path);
  26. extern bool add_path_precheck(RelOptInfo *parent_rel,
  27. Cost startup_cost, Cost total_cost,
  28. List *pathkeys, Relids required_outer);
  29. extern void add_partial_path(RelOptInfo *parent_rel, Path *new_path);
  30. extern bool add_partial_path_precheck(RelOptInfo *parent_rel,
  31. Cost total_cost, List *pathkeys);
  32. extern Path *create_seqscan_path(PlannerInfo *root, RelOptInfo *rel,
  33. Relids required_outer, int parallel_workers);
  34. extern Path *create_samplescan_path(PlannerInfo *root, RelOptInfo *rel,
  35. Relids required_outer);
  36. extern IndexPath *create_index_path(PlannerInfo *root,
  37. IndexOptInfo *index,
  38. List *indexclauses,
  39. List *indexclausecols,
  40. List *indexorderbys,
  41. List *indexorderbycols,
  42. List *pathkeys,
  43. ScanDirection indexscandir,
  44. bool indexonly,
  45. Relids required_outer,
  46. double loop_count);
  47. extern BitmapHeapPath *create_bitmap_heap_path(PlannerInfo *root,
  48. RelOptInfo *rel,
  49. Path *bitmapqual,
  50. Relids required_outer,
  51. double loop_count);
  52. extern BitmapAndPath *create_bitmap_and_path(PlannerInfo *root,
  53. RelOptInfo *rel,
  54. List *bitmapquals);
  55. extern BitmapOrPath *create_bitmap_or_path(PlannerInfo *root,
  56. RelOptInfo *rel,
  57. List *bitmapquals);
  58. extern TidPath *create_tidscan_path(PlannerInfo *root, RelOptInfo *rel,
  59. List *tidquals, Relids required_outer);
  60. extern AppendPath *create_append_path(RelOptInfo *rel, List *subpaths,
  61. Relids required_outer, int parallel_workers);
  62. extern MergeAppendPath *create_merge_append_path(PlannerInfo *root,
  63. RelOptInfo *rel,
  64. List *subpaths,
  65. List *pathkeys,
  66. Relids required_outer);
  67. extern ResultPath *create_result_path(PlannerInfo *root, RelOptInfo *rel,
  68. PathTarget *target, List *resconstantqual);
  69. extern MaterialPath *create_material_path(RelOptInfo *rel, Path *subpath);
  70. extern UniquePath *create_unique_path(PlannerInfo *root, RelOptInfo *rel,
  71. Path *subpath, SpecialJoinInfo *sjinfo);
  72. extern GatherPath *create_gather_path(PlannerInfo *root,
  73. RelOptInfo *rel, Path *subpath, PathTarget *target,
  74. Relids required_outer, double *rows);
  75. extern SubqueryScanPath *create_subqueryscan_path(PlannerInfo *root,
  76. RelOptInfo *rel, Path *subpath,
  77. List *pathkeys, Relids required_outer);
  78. extern Path *create_functionscan_path(PlannerInfo *root, RelOptInfo *rel,
  79. List *pathkeys, Relids required_outer);
  80. extern Path *create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel,
  81. Relids required_outer);
  82. extern Path *create_ctescan_path(PlannerInfo *root, RelOptInfo *rel,
  83. Relids required_outer);
  84. extern Path *create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel,
  85. Relids required_outer);
  86. extern ForeignPath *create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
  87. PathTarget *target,
  88. double rows, Cost startup_cost, Cost total_cost,
  89. List *pathkeys,
  90. Relids required_outer,
  91. Path *fdw_outerpath,
  92. List *fdw_private);
  93. extern Relids calc_nestloop_required_outer(Path *outer_path, Path *inner_path);
  94. extern Relids calc_non_nestloop_required_outer(Path *outer_path, Path *inner_path);
  95. extern NestPath *create_nestloop_path(PlannerInfo *root,
  96. RelOptInfo *joinrel,
  97. JoinType jointype,
  98. JoinCostWorkspace *workspace,
  99. SpecialJoinInfo *sjinfo,
  100. SemiAntiJoinFactors *semifactors,
  101. Path *outer_path,
  102. Path *inner_path,
  103. List *restrict_clauses,
  104. List *pathkeys,
  105. Relids required_outer);
  106. extern MergePath *create_mergejoin_path(PlannerInfo *root,
  107. RelOptInfo *joinrel,
  108. JoinType jointype,
  109. JoinCostWorkspace *workspace,
  110. SpecialJoinInfo *sjinfo,
  111. Path *outer_path,
  112. Path *inner_path,
  113. List *restrict_clauses,
  114. List *pathkeys,
  115. Relids required_outer,
  116. List *mergeclauses,
  117. List *outersortkeys,
  118. List *innersortkeys);
  119. extern HashPath *create_hashjoin_path(PlannerInfo *root,
  120. RelOptInfo *joinrel,
  121. JoinType jointype,
  122. JoinCostWorkspace *workspace,
  123. SpecialJoinInfo *sjinfo,
  124. SemiAntiJoinFactors *semifactors,
  125. Path *outer_path,
  126. Path *inner_path,
  127. List *restrict_clauses,
  128. Relids required_outer,
  129. List *hashclauses);
  130. extern ProjectionPath *create_projection_path(PlannerInfo *root,
  131. RelOptInfo *rel,
  132. Path *subpath,
  133. PathTarget *target);
  134. extern Path *apply_projection_to_path(PlannerInfo *root,
  135. RelOptInfo *rel,
  136. Path *path,
  137. PathTarget *target);
  138. extern SortPath *create_sort_path(PlannerInfo *root,
  139. RelOptInfo *rel,
  140. Path *subpath,
  141. List *pathkeys,
  142. double limit_tuples);
  143. extern GroupPath *create_group_path(PlannerInfo *root,
  144. RelOptInfo *rel,
  145. Path *subpath,
  146. PathTarget *target,
  147. List *groupClause,
  148. List *qual,
  149. double numGroups);
  150. extern UpperUniquePath *create_upper_unique_path(PlannerInfo *root,
  151. RelOptInfo *rel,
  152. Path *subpath,
  153. int numCols,
  154. double numGroups);
  155. extern AggPath *create_agg_path(PlannerInfo *root,
  156. RelOptInfo *rel,
  157. Path *subpath,
  158. PathTarget *target,
  159. AggStrategy aggstrategy,
  160. AggSplit aggsplit,
  161. List *groupClause,
  162. List *qual,
  163. const AggClauseCosts *aggcosts,
  164. double numGroups);
  165. extern GroupingSetsPath *create_groupingsets_path(PlannerInfo *root,
  166. RelOptInfo *rel,
  167. Path *subpath,
  168. PathTarget *target,
  169. List *having_qual,
  170. List *rollup_lists,
  171. List *rollup_groupclauses,
  172. const AggClauseCosts *agg_costs,
  173. double numGroups);
  174. extern MinMaxAggPath *create_minmaxagg_path(PlannerInfo *root,
  175. RelOptInfo *rel,
  176. PathTarget *target,
  177. List *mmaggregates,
  178. List *quals);
  179. extern WindowAggPath *create_windowagg_path(PlannerInfo *root,
  180. RelOptInfo *rel,
  181. Path *subpath,
  182. PathTarget *target,
  183. List *windowFuncs,
  184. WindowClause *winclause,
  185. List *winpathkeys);
  186. extern SetOpPath *create_setop_path(PlannerInfo *root,
  187. RelOptInfo *rel,
  188. Path *subpath,
  189. SetOpCmd cmd,
  190. SetOpStrategy strategy,
  191. List *distinctList,
  192. AttrNumber flagColIdx,
  193. int firstFlag,
  194. double numGroups,
  195. double outputRows);
  196. extern RecursiveUnionPath *create_recursiveunion_path(PlannerInfo *root,
  197. RelOptInfo *rel,
  198. Path *leftpath,
  199. Path *rightpath,
  200. PathTarget *target,
  201. List *distinctList,
  202. int wtParam,
  203. double numGroups);
  204. extern LockRowsPath *create_lockrows_path(PlannerInfo *root, RelOptInfo *rel,
  205. Path *subpath, List *rowMarks, int epqParam);
  206. extern ModifyTablePath *create_modifytable_path(PlannerInfo *root,
  207. RelOptInfo *rel,
  208. CmdType operation, bool canSetTag,
  209. Index nominalRelation,
  210. List *resultRelations, List *subpaths,
  211. List *subroots,
  212. List *withCheckOptionLists, List *returningLists,
  213. List *rowMarks, OnConflictExpr *onconflict,
  214. int epqParam);
  215. extern LimitPath *create_limit_path(PlannerInfo *root, RelOptInfo *rel,
  216. Path *subpath,
  217. Node *limitOffset, Node *limitCount,
  218. int64 offset_est, int64 count_est);
  219. extern Path *reparameterize_path(PlannerInfo *root, Path *path,
  220. Relids required_outer,
  221. double loop_count);
  222. /*
  223. * prototypes for relnode.c
  224. */
  225. extern void setup_simple_rel_arrays(PlannerInfo *root);
  226. extern RelOptInfo *build_simple_rel(PlannerInfo *root, int relid,
  227. RelOptKind reloptkind);
  228. extern RelOptInfo *find_base_rel(PlannerInfo *root, int relid);
  229. extern RelOptInfo *find_join_rel(PlannerInfo *root, Relids relids);
  230. extern RelOptInfo *build_join_rel(PlannerInfo *root,
  231. Relids joinrelids,
  232. RelOptInfo *outer_rel,
  233. RelOptInfo *inner_rel,
  234. SpecialJoinInfo *sjinfo,
  235. List **restrictlist_ptr);
  236. extern Relids min_join_parameterization(PlannerInfo *root,
  237. Relids joinrelids,
  238. RelOptInfo *outer_rel,
  239. RelOptInfo *inner_rel);
  240. extern RelOptInfo *build_empty_join_rel(PlannerInfo *root);
  241. extern RelOptInfo *fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind,
  242. Relids relids);
  243. extern AppendRelInfo *find_childrel_appendrelinfo(PlannerInfo *root,
  244. RelOptInfo *rel);
  245. extern RelOptInfo *find_childrel_top_parent(PlannerInfo *root, RelOptInfo *rel);
  246. extern Relids find_childrel_parents(PlannerInfo *root, RelOptInfo *rel);
  247. extern ParamPathInfo *get_baserel_parampathinfo(PlannerInfo *root,
  248. RelOptInfo *baserel,
  249. Relids required_outer);
  250. extern ParamPathInfo *get_joinrel_parampathinfo(PlannerInfo *root,
  251. RelOptInfo *joinrel,
  252. Path *outer_path,
  253. Path *inner_path,
  254. SpecialJoinInfo *sjinfo,
  255. Relids required_outer,
  256. List **restrict_clauses);
  257. extern ParamPathInfo *get_appendrel_parampathinfo(RelOptInfo *appendrel,
  258. Relids required_outer);
  259. #endif /* PATHNODE_H */