1 /*-------------------------------------------------------------------------
2  *
3  * pathnode.h
4  *	  prototypes for pathnode.c, relnode.c.
5  *
6  *
7  * Portions Copyright (c) 1996-2020, 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 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 									  List *partitioned_rels, 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 												 List *partitioned_rels);
77 extern GroupResultPath *create_group_result_path(PlannerInfo *root,
78 												 RelOptInfo *rel,
79 												 PathTarget *target,
80 												 List *havingqual);
81 extern MaterialPath *create_material_path(RelOptInfo *rel, Path *subpath);
82 extern UniquePath *create_unique_path(PlannerInfo *root, RelOptInfo *rel,
83 									  Path *subpath, SpecialJoinInfo *sjinfo);
84 extern GatherPath *create_gather_path(PlannerInfo *root,
85 									  RelOptInfo *rel, Path *subpath, PathTarget *target,
86 									  Relids required_outer, double *rows);
87 extern GatherMergePath *create_gather_merge_path(PlannerInfo *root,
88 												 RelOptInfo *rel,
89 												 Path *subpath,
90 												 PathTarget *target,
91 												 List *pathkeys,
92 												 Relids required_outer,
93 												 double *rows);
94 extern SubqueryScanPath *create_subqueryscan_path(PlannerInfo *root,
95 												  RelOptInfo *rel, Path *subpath,
96 												  List *pathkeys, Relids required_outer);
97 extern Path *create_functionscan_path(PlannerInfo *root, RelOptInfo *rel,
98 									  List *pathkeys, Relids required_outer);
99 extern Path *create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel,
100 									Relids required_outer);
101 extern Path *create_tablefuncscan_path(PlannerInfo *root, RelOptInfo *rel,
102 									   Relids required_outer);
103 extern Path *create_ctescan_path(PlannerInfo *root, RelOptInfo *rel,
104 								 Relids required_outer);
105 extern Path *create_namedtuplestorescan_path(PlannerInfo *root, RelOptInfo *rel,
106 											 Relids required_outer);
107 extern Path *create_resultscan_path(PlannerInfo *root, RelOptInfo *rel,
108 									Relids required_outer);
109 extern Path *create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel,
110 									   Relids required_outer);
111 extern ForeignPath *create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
112 											PathTarget *target,
113 											double rows, Cost startup_cost, Cost total_cost,
114 											List *pathkeys,
115 											Relids required_outer,
116 											Path *fdw_outerpath,
117 											List *fdw_private);
118 extern ForeignPath *create_foreign_join_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_upper_path(PlannerInfo *root, RelOptInfo *rel,
126 											  PathTarget *target,
127 											  double rows, Cost startup_cost, Cost total_cost,
128 											  List *pathkeys,
129 											  Path *fdw_outerpath,
130 											  List *fdw_private);
131 
132 extern Relids calc_nestloop_required_outer(Relids outerrelids,
133 										   Relids outer_paramrels,
134 										   Relids innerrelids,
135 										   Relids inner_paramrels);
136 extern Relids calc_non_nestloop_required_outer(Path *outer_path, Path *inner_path);
137 
138 extern NestPath *create_nestloop_path(PlannerInfo *root,
139 									  RelOptInfo *joinrel,
140 									  JoinType jointype,
141 									  JoinCostWorkspace *workspace,
142 									  JoinPathExtraData *extra,
143 									  Path *outer_path,
144 									  Path *inner_path,
145 									  List *restrict_clauses,
146 									  List *pathkeys,
147 									  Relids required_outer);
148 
149 extern MergePath *create_mergejoin_path(PlannerInfo *root,
150 										RelOptInfo *joinrel,
151 										JoinType jointype,
152 										JoinCostWorkspace *workspace,
153 										JoinPathExtraData *extra,
154 										Path *outer_path,
155 										Path *inner_path,
156 										List *restrict_clauses,
157 										List *pathkeys,
158 										Relids required_outer,
159 										List *mergeclauses,
160 										List *outersortkeys,
161 										List *innersortkeys);
162 
163 extern HashPath *create_hashjoin_path(PlannerInfo *root,
164 									  RelOptInfo *joinrel,
165 									  JoinType jointype,
166 									  JoinCostWorkspace *workspace,
167 									  JoinPathExtraData *extra,
168 									  Path *outer_path,
169 									  Path *inner_path,
170 									  bool parallel_hash,
171 									  List *restrict_clauses,
172 									  Relids required_outer,
173 									  List *hashclauses);
174 
175 extern ProjectionPath *create_projection_path(PlannerInfo *root,
176 											  RelOptInfo *rel,
177 											  Path *subpath,
178 											  PathTarget *target);
179 extern Path *apply_projection_to_path(PlannerInfo *root,
180 									  RelOptInfo *rel,
181 									  Path *path,
182 									  PathTarget *target);
183 extern ProjectSetPath *create_set_projection_path(PlannerInfo *root,
184 												  RelOptInfo *rel,
185 												  Path *subpath,
186 												  PathTarget *target);
187 extern SortPath *create_sort_path(PlannerInfo *root,
188 								  RelOptInfo *rel,
189 								  Path *subpath,
190 								  List *pathkeys,
191 								  double limit_tuples);
192 extern IncrementalSortPath *create_incremental_sort_path(PlannerInfo *root,
193 														 RelOptInfo *rel,
194 														 Path *subpath,
195 														 List *pathkeys,
196 														 int presorted_keys,
197 														 double limit_tuples);
198 extern GroupPath *create_group_path(PlannerInfo *root,
199 									RelOptInfo *rel,
200 									Path *subpath,
201 									List *groupClause,
202 									List *qual,
203 									double numGroups);
204 extern UpperUniquePath *create_upper_unique_path(PlannerInfo *root,
205 												 RelOptInfo *rel,
206 												 Path *subpath,
207 												 int numCols,
208 												 double numGroups);
209 extern AggPath *create_agg_path(PlannerInfo *root,
210 								RelOptInfo *rel,
211 								Path *subpath,
212 								PathTarget *target,
213 								AggStrategy aggstrategy,
214 								AggSplit aggsplit,
215 								List *groupClause,
216 								List *qual,
217 								const AggClauseCosts *aggcosts,
218 								double numGroups);
219 extern GroupingSetsPath *create_groupingsets_path(PlannerInfo *root,
220 												  RelOptInfo *rel,
221 												  Path *subpath,
222 												  List *having_qual,
223 												  AggStrategy aggstrategy,
224 												  List *rollups,
225 												  const AggClauseCosts *agg_costs,
226 												  double numGroups);
227 extern MinMaxAggPath *create_minmaxagg_path(PlannerInfo *root,
228 											RelOptInfo *rel,
229 											PathTarget *target,
230 											List *mmaggregates,
231 											List *quals);
232 extern WindowAggPath *create_windowagg_path(PlannerInfo *root,
233 											RelOptInfo *rel,
234 											Path *subpath,
235 											PathTarget *target,
236 											List *windowFuncs,
237 											WindowClause *winclause);
238 extern SetOpPath *create_setop_path(PlannerInfo *root,
239 									RelOptInfo *rel,
240 									Path *subpath,
241 									SetOpCmd cmd,
242 									SetOpStrategy strategy,
243 									List *distinctList,
244 									AttrNumber flagColIdx,
245 									int firstFlag,
246 									double numGroups,
247 									double outputRows);
248 extern RecursiveUnionPath *create_recursiveunion_path(PlannerInfo *root,
249 													  RelOptInfo *rel,
250 													  Path *leftpath,
251 													  Path *rightpath,
252 													  PathTarget *target,
253 													  List *distinctList,
254 													  int wtParam,
255 													  double numGroups);
256 extern LockRowsPath *create_lockrows_path(PlannerInfo *root, RelOptInfo *rel,
257 										  Path *subpath, List *rowMarks, int epqParam);
258 extern ModifyTablePath *create_modifytable_path(PlannerInfo *root,
259 												RelOptInfo *rel,
260 												CmdType operation, bool canSetTag,
261 												Index nominalRelation, Index rootRelation,
262 												bool partColsUpdated,
263 												List *resultRelations, List *subpaths,
264 												List *subroots,
265 												List *withCheckOptionLists, List *returningLists,
266 												List *rowMarks, OnConflictExpr *onconflict,
267 												int epqParam);
268 extern LimitPath *create_limit_path(PlannerInfo *root, RelOptInfo *rel,
269 									Path *subpath,
270 									Node *limitOffset, Node *limitCount,
271 									LimitOption limitOption,
272 									int64 offset_est, int64 count_est);
273 extern void adjust_limit_rows_costs(double *rows,
274 									Cost *startup_cost, Cost *total_cost,
275 									int64 offset_est, int64 count_est);
276 
277 extern Path *reparameterize_path(PlannerInfo *root, Path *path,
278 								 Relids required_outer,
279 								 double loop_count);
280 extern Path *reparameterize_path_by_child(PlannerInfo *root, Path *path,
281 										  RelOptInfo *child_rel);
282 
283 /*
284  * prototypes for relnode.c
285  */
286 extern void setup_simple_rel_arrays(PlannerInfo *root);
287 extern void expand_planner_arrays(PlannerInfo *root, int add_size);
288 extern RelOptInfo *build_simple_rel(PlannerInfo *root, int relid,
289 									RelOptInfo *parent);
290 extern RelOptInfo *find_base_rel(PlannerInfo *root, int relid);
291 extern RelOptInfo *find_join_rel(PlannerInfo *root, Relids relids);
292 extern RelOptInfo *build_join_rel(PlannerInfo *root,
293 								  Relids joinrelids,
294 								  RelOptInfo *outer_rel,
295 								  RelOptInfo *inner_rel,
296 								  SpecialJoinInfo *sjinfo,
297 								  List **restrictlist_ptr);
298 extern Relids min_join_parameterization(PlannerInfo *root,
299 										Relids joinrelids,
300 										RelOptInfo *outer_rel,
301 										RelOptInfo *inner_rel);
302 extern RelOptInfo *fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind,
303 								   Relids relids);
304 extern Relids find_childrel_parents(PlannerInfo *root, RelOptInfo *rel);
305 extern ParamPathInfo *get_baserel_parampathinfo(PlannerInfo *root,
306 												RelOptInfo *baserel,
307 												Relids required_outer);
308 extern ParamPathInfo *get_joinrel_parampathinfo(PlannerInfo *root,
309 												RelOptInfo *joinrel,
310 												Path *outer_path,
311 												Path *inner_path,
312 												SpecialJoinInfo *sjinfo,
313 												Relids required_outer,
314 												List **restrict_clauses);
315 extern ParamPathInfo *get_appendrel_parampathinfo(RelOptInfo *appendrel,
316 												  Relids required_outer);
317 extern ParamPathInfo *find_param_path_info(RelOptInfo *rel,
318 										   Relids required_outer);
319 extern RelOptInfo *build_child_join_rel(PlannerInfo *root,
320 										RelOptInfo *outer_rel, RelOptInfo *inner_rel,
321 										RelOptInfo *parent_joinrel, List *restrictlist,
322 										SpecialJoinInfo *sjinfo, JoinType jointype);
323 
324 #endif							/* PATHNODE_H */
325