pathnode.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. /*-------------------------------------------------------------------------
  2. *
  3. * pathnode.h
  4. * prototypes for pathnode.c, relnode.c.
  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/pathnode.h
  11. *
  12. *-------------------------------------------------------------------------
  13. */
  14. #ifndef PATHNODE_H
  15. #define PATHNODE_H
  16. #include "nodes/bitmapset.h"
  17. #include "nodes/pathnodes.h"
  18. /*
  19. * prototypes for pathnode.c
  20. */
  21. extern int compare_path_costs(Path *path1, Path *path2,
  22. CostSelector criterion);
  23. extern int compare_fractional_path_costs(Path *path1, Path *path2,
  24. double fraction);
  25. extern void set_cheapest(RelOptInfo *parent_rel);
  26. extern void add_path(RelOptInfo *parent_rel, Path *new_path);
  27. extern bool add_path_precheck(RelOptInfo *parent_rel,
  28. Cost startup_cost, Cost total_cost,
  29. List *pathkeys, Relids required_outer);
  30. extern void add_partial_path(RelOptInfo *parent_rel, Path *new_path);
  31. extern bool add_partial_path_precheck(RelOptInfo *parent_rel,
  32. Cost total_cost, List *pathkeys);
  33. extern Path *create_seqscan_path(PlannerInfo *root, RelOptInfo *rel,
  34. Relids required_outer, int parallel_workers);
  35. extern Path *create_samplescan_path(PlannerInfo *root, RelOptInfo *rel,
  36. Relids required_outer);
  37. extern IndexPath *create_index_path(PlannerInfo *root,
  38. IndexOptInfo *index,
  39. List *indexclauses,
  40. List *indexorderbys,
  41. List *indexorderbycols,
  42. List *pathkeys,
  43. ScanDirection indexscandir,
  44. bool indexonly,
  45. Relids required_outer,
  46. double loop_count,
  47. bool partial_path);
  48. extern BitmapHeapPath *create_bitmap_heap_path(PlannerInfo *root,
  49. RelOptInfo *rel,
  50. Path *bitmapqual,
  51. Relids required_outer,
  52. double loop_count,
  53. int parallel_degree);
  54. extern BitmapAndPath *create_bitmap_and_path(PlannerInfo *root,
  55. RelOptInfo *rel,
  56. List *bitmapquals);
  57. extern BitmapOrPath *create_bitmap_or_path(PlannerInfo *root,
  58. RelOptInfo *rel,
  59. List *bitmapquals);
  60. extern TidPath *create_tidscan_path(PlannerInfo *root, RelOptInfo *rel,
  61. List *tidquals, Relids required_outer);
  62. extern TidRangePath *create_tidrangescan_path(PlannerInfo *root,
  63. RelOptInfo *rel,
  64. List *tidrangequals,
  65. Relids required_outer);
  66. extern AppendPath *create_append_path(PlannerInfo *root, RelOptInfo *rel,
  67. List *subpaths, List *partial_subpaths,
  68. List *pathkeys, Relids required_outer,
  69. int parallel_workers, bool parallel_aware,
  70. double rows);
  71. extern MergeAppendPath *create_merge_append_path(PlannerInfo *root,
  72. RelOptInfo *rel,
  73. List *subpaths,
  74. List *pathkeys,
  75. Relids required_outer);
  76. extern GroupResultPath *create_group_result_path(PlannerInfo *root,
  77. RelOptInfo *rel,
  78. PathTarget *target,
  79. List *havingqual);
  80. extern MaterialPath *create_material_path(RelOptInfo *rel, Path *subpath);
  81. extern MemoizePath *create_memoize_path(PlannerInfo *root,
  82. RelOptInfo *rel,
  83. Path *subpath,
  84. List *param_exprs,
  85. List *hash_operators,
  86. bool singlerow,
  87. bool binary_mode,
  88. double calls);
  89. extern UniquePath *create_unique_path(PlannerInfo *root, RelOptInfo *rel,
  90. Path *subpath, SpecialJoinInfo *sjinfo);
  91. extern GatherPath *create_gather_path(PlannerInfo *root,
  92. RelOptInfo *rel, Path *subpath, PathTarget *target,
  93. Relids required_outer, double *rows);
  94. extern GatherMergePath *create_gather_merge_path(PlannerInfo *root,
  95. RelOptInfo *rel,
  96. Path *subpath,
  97. PathTarget *target,
  98. List *pathkeys,
  99. Relids required_outer,
  100. double *rows);
  101. extern SubqueryScanPath *create_subqueryscan_path(PlannerInfo *root,
  102. RelOptInfo *rel, Path *subpath,
  103. List *pathkeys, Relids required_outer);
  104. extern Path *create_functionscan_path(PlannerInfo *root, RelOptInfo *rel,
  105. List *pathkeys, Relids required_outer);
  106. extern Path *create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel,
  107. Relids required_outer);
  108. extern Path *create_tablefuncscan_path(PlannerInfo *root, RelOptInfo *rel,
  109. Relids required_outer);
  110. extern Path *create_ctescan_path(PlannerInfo *root, RelOptInfo *rel,
  111. Relids required_outer);
  112. extern Path *create_namedtuplestorescan_path(PlannerInfo *root, RelOptInfo *rel,
  113. Relids required_outer);
  114. extern Path *create_resultscan_path(PlannerInfo *root, RelOptInfo *rel,
  115. Relids required_outer);
  116. extern Path *create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel,
  117. Relids required_outer);
  118. extern ForeignPath *create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
  119. PathTarget *target,
  120. double rows, Cost startup_cost, Cost total_cost,
  121. List *pathkeys,
  122. Relids required_outer,
  123. Path *fdw_outerpath,
  124. List *fdw_private);
  125. extern ForeignPath *create_foreign_join_path(PlannerInfo *root, RelOptInfo *rel,
  126. PathTarget *target,
  127. double rows, Cost startup_cost, Cost total_cost,
  128. List *pathkeys,
  129. Relids required_outer,
  130. Path *fdw_outerpath,
  131. List *fdw_private);
  132. extern ForeignPath *create_foreign_upper_path(PlannerInfo *root, RelOptInfo *rel,
  133. PathTarget *target,
  134. double rows, Cost startup_cost, Cost total_cost,
  135. List *pathkeys,
  136. Path *fdw_outerpath,
  137. List *fdw_private);
  138. extern Relids calc_nestloop_required_outer(Relids outerrelids,
  139. Relids outer_paramrels,
  140. Relids innerrelids,
  141. Relids inner_paramrels);
  142. extern Relids calc_non_nestloop_required_outer(Path *outer_path, Path *inner_path);
  143. extern NestPath *create_nestloop_path(PlannerInfo *root,
  144. RelOptInfo *joinrel,
  145. JoinType jointype,
  146. JoinCostWorkspace *workspace,
  147. JoinPathExtraData *extra,
  148. Path *outer_path,
  149. Path *inner_path,
  150. List *restrict_clauses,
  151. List *pathkeys,
  152. Relids required_outer);
  153. extern MergePath *create_mergejoin_path(PlannerInfo *root,
  154. RelOptInfo *joinrel,
  155. JoinType jointype,
  156. JoinCostWorkspace *workspace,
  157. JoinPathExtraData *extra,
  158. Path *outer_path,
  159. Path *inner_path,
  160. List *restrict_clauses,
  161. List *pathkeys,
  162. Relids required_outer,
  163. List *mergeclauses,
  164. List *outersortkeys,
  165. List *innersortkeys);
  166. extern HashPath *create_hashjoin_path(PlannerInfo *root,
  167. RelOptInfo *joinrel,
  168. JoinType jointype,
  169. JoinCostWorkspace *workspace,
  170. JoinPathExtraData *extra,
  171. Path *outer_path,
  172. Path *inner_path,
  173. bool parallel_hash,
  174. List *restrict_clauses,
  175. Relids required_outer,
  176. List *hashclauses);
  177. extern ProjectionPath *create_projection_path(PlannerInfo *root,
  178. RelOptInfo *rel,
  179. Path *subpath,
  180. PathTarget *target);
  181. extern Path *apply_projection_to_path(PlannerInfo *root,
  182. RelOptInfo *rel,
  183. Path *path,
  184. PathTarget *target);
  185. extern ProjectSetPath *create_set_projection_path(PlannerInfo *root,
  186. RelOptInfo *rel,
  187. Path *subpath,
  188. PathTarget *target);
  189. extern SortPath *create_sort_path(PlannerInfo *root,
  190. RelOptInfo *rel,
  191. Path *subpath,
  192. List *pathkeys,
  193. double limit_tuples);
  194. extern IncrementalSortPath *create_incremental_sort_path(PlannerInfo *root,
  195. RelOptInfo *rel,
  196. Path *subpath,
  197. List *pathkeys,
  198. int presorted_keys,
  199. double limit_tuples);
  200. extern GroupPath *create_group_path(PlannerInfo *root,
  201. RelOptInfo *rel,
  202. Path *subpath,
  203. List *groupClause,
  204. List *qual,
  205. double numGroups);
  206. extern UpperUniquePath *create_upper_unique_path(PlannerInfo *root,
  207. RelOptInfo *rel,
  208. Path *subpath,
  209. int numCols,
  210. double numGroups);
  211. extern AggPath *create_agg_path(PlannerInfo *root,
  212. RelOptInfo *rel,
  213. Path *subpath,
  214. PathTarget *target,
  215. AggStrategy aggstrategy,
  216. AggSplit aggsplit,
  217. List *groupClause,
  218. List *qual,
  219. const AggClauseCosts *aggcosts,
  220. double numGroups);
  221. extern GroupingSetsPath *create_groupingsets_path(PlannerInfo *root,
  222. RelOptInfo *rel,
  223. Path *subpath,
  224. List *having_qual,
  225. AggStrategy aggstrategy,
  226. List *rollups,
  227. const AggClauseCosts *agg_costs,
  228. double numGroups);
  229. extern MinMaxAggPath *create_minmaxagg_path(PlannerInfo *root,
  230. RelOptInfo *rel,
  231. PathTarget *target,
  232. List *mmaggregates,
  233. List *quals);
  234. extern WindowAggPath *create_windowagg_path(PlannerInfo *root,
  235. RelOptInfo *rel,
  236. Path *subpath,
  237. PathTarget *target,
  238. List *windowFuncs,
  239. WindowClause *winclause,
  240. List *qual,
  241. bool topwindow);
  242. extern SetOpPath *create_setop_path(PlannerInfo *root,
  243. RelOptInfo *rel,
  244. Path *subpath,
  245. SetOpCmd cmd,
  246. SetOpStrategy strategy,
  247. List *distinctList,
  248. AttrNumber flagColIdx,
  249. int firstFlag,
  250. double numGroups,
  251. double outputRows);
  252. extern RecursiveUnionPath *create_recursiveunion_path(PlannerInfo *root,
  253. RelOptInfo *rel,
  254. Path *leftpath,
  255. Path *rightpath,
  256. PathTarget *target,
  257. List *distinctList,
  258. int wtParam,
  259. double numGroups);
  260. extern LockRowsPath *create_lockrows_path(PlannerInfo *root, RelOptInfo *rel,
  261. Path *subpath, List *rowMarks, int epqParam);
  262. extern ModifyTablePath *create_modifytable_path(PlannerInfo *root,
  263. RelOptInfo *rel,
  264. Path *subpath,
  265. CmdType operation, bool canSetTag,
  266. Index nominalRelation, Index rootRelation,
  267. bool partColsUpdated,
  268. List *resultRelations,
  269. List *updateColnosLists,
  270. List *withCheckOptionLists, List *returningLists,
  271. List *rowMarks, OnConflictExpr *onconflict,
  272. List *mergeActionLists, int epqParam);
  273. extern LimitPath *create_limit_path(PlannerInfo *root, RelOptInfo *rel,
  274. Path *subpath,
  275. Node *limitOffset, Node *limitCount,
  276. LimitOption limitOption,
  277. int64 offset_est, int64 count_est);
  278. extern void adjust_limit_rows_costs(double *rows,
  279. Cost *startup_cost, Cost *total_cost,
  280. int64 offset_est, int64 count_est);
  281. extern Path *reparameterize_path(PlannerInfo *root, Path *path,
  282. Relids required_outer,
  283. double loop_count);
  284. extern Path *reparameterize_path_by_child(PlannerInfo *root, Path *path,
  285. RelOptInfo *child_rel);
  286. /*
  287. * prototypes for relnode.c
  288. */
  289. extern void setup_simple_rel_arrays(PlannerInfo *root);
  290. extern void expand_planner_arrays(PlannerInfo *root, int add_size);
  291. extern RelOptInfo *build_simple_rel(PlannerInfo *root, int relid,
  292. RelOptInfo *parent);
  293. extern RelOptInfo *find_base_rel(PlannerInfo *root, int relid);
  294. extern RelOptInfo *find_join_rel(PlannerInfo *root, Relids relids);
  295. extern RelOptInfo *build_join_rel(PlannerInfo *root,
  296. Relids joinrelids,
  297. RelOptInfo *outer_rel,
  298. RelOptInfo *inner_rel,
  299. SpecialJoinInfo *sjinfo,
  300. List **restrictlist_ptr);
  301. extern Relids min_join_parameterization(PlannerInfo *root,
  302. Relids joinrelids,
  303. RelOptInfo *outer_rel,
  304. RelOptInfo *inner_rel);
  305. extern RelOptInfo *fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind,
  306. Relids relids);
  307. extern Relids find_childrel_parents(PlannerInfo *root, RelOptInfo *rel);
  308. extern ParamPathInfo *get_baserel_parampathinfo(PlannerInfo *root,
  309. RelOptInfo *baserel,
  310. Relids required_outer);
  311. extern ParamPathInfo *get_joinrel_parampathinfo(PlannerInfo *root,
  312. RelOptInfo *joinrel,
  313. Path *outer_path,
  314. Path *inner_path,
  315. SpecialJoinInfo *sjinfo,
  316. Relids required_outer,
  317. List **restrict_clauses);
  318. extern ParamPathInfo *get_appendrel_parampathinfo(RelOptInfo *appendrel,
  319. Relids required_outer);
  320. extern ParamPathInfo *find_param_path_info(RelOptInfo *rel,
  321. Relids required_outer);
  322. extern RelOptInfo *build_child_join_rel(PlannerInfo *root,
  323. RelOptInfo *outer_rel, RelOptInfo *inner_rel,
  324. RelOptInfo *parent_joinrel, List *restrictlist,
  325. SpecialJoinInfo *sjinfo, JoinType jointype);
  326. #endif /* PATHNODE_H */