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