1 /*-------------------------------------------------------------------------
2  *
3  * pathnode.h
4  *	  prototypes for pathnode.c, relnode.c.
5  *
6  *
7  * Portions Copyright (c) 1996-2018, 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/relation.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 *indexclausecols,
45 				  List *indexorderbys,
46 				  List *indexorderbycols,
47 				  List *pathkeys,
48 				  ScanDirection indexscandir,
49 				  bool indexonly,
50 				  Relids required_outer,
51 				  double loop_count,
52 				  bool partial_path);
53 extern BitmapHeapPath *create_bitmap_heap_path(PlannerInfo *root,
54 						RelOptInfo *rel,
55 						Path *bitmapqual,
56 						Relids required_outer,
57 						double loop_count,
58 						int parallel_degree);
59 extern BitmapAndPath *create_bitmap_and_path(PlannerInfo *root,
60 					   RelOptInfo *rel,
61 					   List *bitmapquals);
62 extern BitmapOrPath *create_bitmap_or_path(PlannerInfo *root,
63 					  RelOptInfo *rel,
64 					  List *bitmapquals);
65 extern TidPath *create_tidscan_path(PlannerInfo *root, RelOptInfo *rel,
66 					List *tidquals, Relids required_outer);
67 extern AppendPath *create_append_path(PlannerInfo *root, RelOptInfo *rel,
68 				   List *subpaths, List *partial_subpaths,
69 				   Relids required_outer,
70 				   int parallel_workers, bool parallel_aware,
71 				   List *partitioned_rels, double rows);
72 extern MergeAppendPath *create_merge_append_path(PlannerInfo *root,
73 						 RelOptInfo *rel,
74 						 List *subpaths,
75 						 List *pathkeys,
76 						 Relids required_outer,
77 						 List *partitioned_rels);
78 extern ResultPath *create_result_path(PlannerInfo *root, RelOptInfo *rel,
79 				   PathTarget *target, List *resconstantqual);
80 extern MaterialPath *create_material_path(RelOptInfo *rel, Path *subpath);
81 extern UniquePath *create_unique_path(PlannerInfo *root, RelOptInfo *rel,
82 				   Path *subpath, SpecialJoinInfo *sjinfo);
83 extern GatherPath *create_gather_path(PlannerInfo *root,
84 				   RelOptInfo *rel, Path *subpath, PathTarget *target,
85 				   Relids required_outer, double *rows);
86 extern GatherMergePath *create_gather_merge_path(PlannerInfo *root,
87 						 RelOptInfo *rel,
88 						 Path *subpath,
89 						 PathTarget *target,
90 						 List *pathkeys,
91 						 Relids required_outer,
92 						 double *rows);
93 extern SubqueryScanPath *create_subqueryscan_path(PlannerInfo *root,
94 						 RelOptInfo *rel, Path *subpath,
95 						 List *pathkeys, Relids required_outer);
96 extern Path *create_functionscan_path(PlannerInfo *root, RelOptInfo *rel,
97 						 List *pathkeys, Relids required_outer);
98 extern Path *create_tablexprscan_path(PlannerInfo *root, RelOptInfo *rel,
99 						 List *pathkeys, Relids required_outer);
100 extern Path *create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel,
101 					   Relids required_outer);
102 extern Path *create_tablefuncscan_path(PlannerInfo *root, RelOptInfo *rel,
103 						  Relids required_outer);
104 extern Path *create_ctescan_path(PlannerInfo *root, RelOptInfo *rel,
105 					Relids required_outer);
106 extern Path *create_namedtuplestorescan_path(PlannerInfo *root, RelOptInfo *rel,
107 								Relids required_outer);
108 extern Path *create_worktablescan_path(PlannerInfo *root, RelOptInfo *rel,
109 						  Relids required_outer);
110 extern ForeignPath *create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel,
111 						PathTarget *target,
112 						double rows, Cost startup_cost, Cost total_cost,
113 						List *pathkeys,
114 						Relids required_outer,
115 						Path *fdw_outerpath,
116 						List *fdw_private);
117 
118 extern Relids calc_nestloop_required_outer(Relids outerrelids,
119 							 Relids outer_paramrels,
120 							 Relids innerrelids,
121 							 Relids inner_paramrels);
122 extern Relids calc_non_nestloop_required_outer(Path *outer_path, Path *inner_path);
123 
124 extern NestPath *create_nestloop_path(PlannerInfo *root,
125 					 RelOptInfo *joinrel,
126 					 JoinType jointype,
127 					 JoinCostWorkspace *workspace,
128 					 JoinPathExtraData *extra,
129 					 Path *outer_path,
130 					 Path *inner_path,
131 					 List *restrict_clauses,
132 					 List *pathkeys,
133 					 Relids required_outer);
134 
135 extern MergePath *create_mergejoin_path(PlannerInfo *root,
136 					  RelOptInfo *joinrel,
137 					  JoinType jointype,
138 					  JoinCostWorkspace *workspace,
139 					  JoinPathExtraData *extra,
140 					  Path *outer_path,
141 					  Path *inner_path,
142 					  List *restrict_clauses,
143 					  List *pathkeys,
144 					  Relids required_outer,
145 					  List *mergeclauses,
146 					  List *outersortkeys,
147 					  List *innersortkeys);
148 
149 extern HashPath *create_hashjoin_path(PlannerInfo *root,
150 					 RelOptInfo *joinrel,
151 					 JoinType jointype,
152 					 JoinCostWorkspace *workspace,
153 					 JoinPathExtraData *extra,
154 					 Path *outer_path,
155 					 Path *inner_path,
156 					 bool parallel_hash,
157 					 List *restrict_clauses,
158 					 Relids required_outer,
159 					 List *hashclauses);
160 
161 extern ProjectionPath *create_projection_path(PlannerInfo *root,
162 					   RelOptInfo *rel,
163 					   Path *subpath,
164 					   PathTarget *target);
165 extern Path *apply_projection_to_path(PlannerInfo *root,
166 						 RelOptInfo *rel,
167 						 Path *path,
168 						 PathTarget *target);
169 extern ProjectSetPath *create_set_projection_path(PlannerInfo *root,
170 						   RelOptInfo *rel,
171 						   Path *subpath,
172 						   PathTarget *target);
173 extern SortPath *create_sort_path(PlannerInfo *root,
174 				 RelOptInfo *rel,
175 				 Path *subpath,
176 				 List *pathkeys,
177 				 double limit_tuples);
178 extern GroupPath *create_group_path(PlannerInfo *root,
179 				  RelOptInfo *rel,
180 				  Path *subpath,
181 				  List *groupClause,
182 				  List *qual,
183 				  double numGroups);
184 extern UpperUniquePath *create_upper_unique_path(PlannerInfo *root,
185 						 RelOptInfo *rel,
186 						 Path *subpath,
187 						 int numCols,
188 						 double numGroups);
189 extern AggPath *create_agg_path(PlannerInfo *root,
190 				RelOptInfo *rel,
191 				Path *subpath,
192 				PathTarget *target,
193 				AggStrategy aggstrategy,
194 				AggSplit aggsplit,
195 				List *groupClause,
196 				List *qual,
197 				const AggClauseCosts *aggcosts,
198 				double numGroups);
199 extern GroupingSetsPath *create_groupingsets_path(PlannerInfo *root,
200 						 RelOptInfo *rel,
201 						 Path *subpath,
202 						 List *having_qual,
203 						 AggStrategy aggstrategy,
204 						 List *rollups,
205 						 const AggClauseCosts *agg_costs,
206 						 double numGroups);
207 extern MinMaxAggPath *create_minmaxagg_path(PlannerInfo *root,
208 					  RelOptInfo *rel,
209 					  PathTarget *target,
210 					  List *mmaggregates,
211 					  List *quals);
212 extern WindowAggPath *create_windowagg_path(PlannerInfo *root,
213 					  RelOptInfo *rel,
214 					  Path *subpath,
215 					  PathTarget *target,
216 					  List *windowFuncs,
217 					  WindowClause *winclause);
218 extern SetOpPath *create_setop_path(PlannerInfo *root,
219 				  RelOptInfo *rel,
220 				  Path *subpath,
221 				  SetOpCmd cmd,
222 				  SetOpStrategy strategy,
223 				  List *distinctList,
224 				  AttrNumber flagColIdx,
225 				  int firstFlag,
226 				  double numGroups,
227 				  double outputRows);
228 extern RecursiveUnionPath *create_recursiveunion_path(PlannerInfo *root,
229 						   RelOptInfo *rel,
230 						   Path *leftpath,
231 						   Path *rightpath,
232 						   PathTarget *target,
233 						   List *distinctList,
234 						   int wtParam,
235 						   double numGroups);
236 extern LockRowsPath *create_lockrows_path(PlannerInfo *root, RelOptInfo *rel,
237 					 Path *subpath, List *rowMarks, int epqParam);
238 extern ModifyTablePath *create_modifytable_path(PlannerInfo *root,
239 						RelOptInfo *rel,
240 						CmdType operation, bool canSetTag,
241 						Index nominalRelation, List *partitioned_rels,
242 						bool partColsUpdated,
243 						List *resultRelations, List *subpaths,
244 						List *subroots,
245 						List *withCheckOptionLists, List *returningLists,
246 						List *rowMarks, OnConflictExpr *onconflict,
247 						int epqParam);
248 extern LimitPath *create_limit_path(PlannerInfo *root, RelOptInfo *rel,
249 				  Path *subpath,
250 				  Node *limitOffset, Node *limitCount,
251 				  int64 offset_est, int64 count_est);
252 
253 extern Path *reparameterize_path(PlannerInfo *root, Path *path,
254 					Relids required_outer,
255 					double loop_count);
256 extern Path *reparameterize_path_by_child(PlannerInfo *root, Path *path,
257 							 RelOptInfo *child_rel);
258 
259 /*
260  * prototypes for relnode.c
261  */
262 extern void setup_simple_rel_arrays(PlannerInfo *root);
263 extern void setup_append_rel_array(PlannerInfo *root);
264 extern RelOptInfo *build_simple_rel(PlannerInfo *root, int relid,
265 				 RelOptInfo *parent);
266 extern RelOptInfo *find_base_rel(PlannerInfo *root, int relid);
267 extern RelOptInfo *find_join_rel(PlannerInfo *root, Relids relids);
268 extern RelOptInfo *build_join_rel(PlannerInfo *root,
269 			   Relids joinrelids,
270 			   RelOptInfo *outer_rel,
271 			   RelOptInfo *inner_rel,
272 			   SpecialJoinInfo *sjinfo,
273 			   List **restrictlist_ptr);
274 extern Relids min_join_parameterization(PlannerInfo *root,
275 						  Relids joinrelids,
276 						  RelOptInfo *outer_rel,
277 						  RelOptInfo *inner_rel);
278 extern RelOptInfo *build_empty_join_rel(PlannerInfo *root);
279 extern RelOptInfo *fetch_upper_rel(PlannerInfo *root, UpperRelationKind kind,
280 				Relids relids);
281 extern Relids find_childrel_parents(PlannerInfo *root, RelOptInfo *rel);
282 extern ParamPathInfo *get_baserel_parampathinfo(PlannerInfo *root,
283 						  RelOptInfo *baserel,
284 						  Relids required_outer);
285 extern ParamPathInfo *get_joinrel_parampathinfo(PlannerInfo *root,
286 						  RelOptInfo *joinrel,
287 						  Path *outer_path,
288 						  Path *inner_path,
289 						  SpecialJoinInfo *sjinfo,
290 						  Relids required_outer,
291 						  List **restrict_clauses);
292 extern ParamPathInfo *get_appendrel_parampathinfo(RelOptInfo *appendrel,
293 							Relids required_outer);
294 extern ParamPathInfo *find_param_path_info(RelOptInfo *rel,
295 					 Relids required_outer);
296 extern RelOptInfo *build_child_join_rel(PlannerInfo *root,
297 					 RelOptInfo *outer_rel, RelOptInfo *inner_rel,
298 					 RelOptInfo *parent_joinrel, List *restrictlist,
299 					 SpecialJoinInfo *sjinfo, JoinType jointype);
300 
301 #endif							/* PATHNODE_H */
302