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