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