codekingpro/portable-devtools
115k
1/*-------------------------------------------------------------------------2 *3 * paths.h4 * prototypes for various files in optimizer/path5 *6 *7 * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group8 * Portions Copyright (c) 1994, Regents of the University of California9 *10 * src/include/optimizer/paths.h11 *12 *-------------------------------------------------------------------------13 */14#ifndef PATHS_H15#define PATHS_H16 17#include "nodes/pathnodes.h"18 19 20/*21 * allpaths.c22 */23extern PGDLLIMPORT bool enable_geqo;24extern PGDLLIMPORT int geqo_threshold;25extern PGDLLIMPORT int min_parallel_table_scan_size;26extern PGDLLIMPORT int min_parallel_index_scan_size;27 28/* Hook for plugins to get control in set_rel_pathlist() */29typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root,30 RelOptInfo *rel,31 Index rti,32 RangeTblEntry *rte);33extern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;34 35/* Hook for plugins to get control in add_paths_to_joinrel() */36typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root,37 RelOptInfo *joinrel,38 RelOptInfo *outerrel,39 RelOptInfo *innerrel,40 JoinType jointype,41 JoinPathExtraData *extra);42extern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;43 44/* Hook for plugins to replace standard_join_search() */45typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root,46 int levels_needed,47 List *initial_rels);48extern PGDLLIMPORT join_search_hook_type join_search_hook;49 50 51extern RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist);52extern RelOptInfo *standard_join_search(PlannerInfo *root, int levels_needed,53 List *initial_rels);54 55extern void generate_gather_paths(PlannerInfo *root, RelOptInfo *rel,56 bool override_rows);57extern void generate_useful_gather_paths(PlannerInfo *root, RelOptInfo *rel,58 bool override_rows);59extern int compute_parallel_worker(RelOptInfo *rel, double heap_pages,60 double index_pages, int max_workers);61extern void create_partial_bitmap_paths(PlannerInfo *root, RelOptInfo *rel,62 Path *bitmapqual);63extern void generate_partitionwise_join_paths(PlannerInfo *root,64 RelOptInfo *rel);65 66#ifdef OPTIMIZER_DEBUG67extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel);68#endif69 70/*71 * indxpath.c72 * routines to generate index paths73 */74extern void create_index_paths(PlannerInfo *root, RelOptInfo *rel);75extern bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel,76 List *restrictlist,77 List *exprlist, List *oprlist);78extern bool indexcol_is_bool_constant_for_query(PlannerInfo *root,79 IndexOptInfo *index,80 int indexcol);81extern bool match_index_to_operand(Node *operand, int indexcol,82 IndexOptInfo *index);83extern void check_index_predicates(PlannerInfo *root, RelOptInfo *rel);84 85/*86 * tidpath.h87 * routines to generate tid paths88 */89extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel);90 91/*92 * joinpath.c93 * routines to create join paths94 */95extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel,96 RelOptInfo *outerrel, RelOptInfo *innerrel,97 JoinType jointype, SpecialJoinInfo *sjinfo,98 List *restrictlist);99 100/*101 * joinrels.c102 * routines to determine which relations to join103 */104extern void join_search_one_level(PlannerInfo *root, int level);105extern RelOptInfo *make_join_rel(PlannerInfo *root,106 RelOptInfo *rel1, RelOptInfo *rel2);107extern Relids add_outer_joins_to_relids(PlannerInfo *root, Relids input_relids,108 SpecialJoinInfo *sjinfo,109 List **pushed_down_joins);110extern bool have_join_order_restriction(PlannerInfo *root,111 RelOptInfo *rel1, RelOptInfo *rel2);112extern bool have_dangerous_phv(PlannerInfo *root,113 Relids outer_relids, Relids inner_params);114extern void mark_dummy_rel(RelOptInfo *rel);115 116/*117 * equivclass.c118 * routines for managing EquivalenceClasses119 */120typedef bool (*ec_matches_callback_type) (PlannerInfo *root,121 RelOptInfo *rel,122 EquivalenceClass *ec,123 EquivalenceMember *em,124 void *arg);125 126extern bool process_equivalence(PlannerInfo *root,127 RestrictInfo **p_restrictinfo,128 JoinDomain *jdomain);129extern Expr *canonicalize_ec_expression(Expr *expr,130 Oid req_type, Oid req_collation);131extern void reconsider_outer_join_clauses(PlannerInfo *root);132extern EquivalenceClass *get_eclass_for_sort_expr(PlannerInfo *root,133 Expr *expr,134 List *opfamilies,135 Oid opcintype,136 Oid collation,137 Index sortref,138 Relids rel,139 bool create_it);140extern EquivalenceMember *find_ec_member_matching_expr(EquivalenceClass *ec,141 Expr *expr,142 Relids relids);143extern EquivalenceMember *find_computable_ec_member(PlannerInfo *root,144 EquivalenceClass *ec,145 List *exprs,146 Relids relids,147 bool require_parallel_safe);148extern bool relation_can_be_sorted_early(PlannerInfo *root, RelOptInfo *rel,149 EquivalenceClass *ec,150 bool require_parallel_safe);151extern void generate_base_implied_equalities(PlannerInfo *root);152extern List *generate_join_implied_equalities(PlannerInfo *root,153 Relids join_relids,154 Relids outer_relids,155 RelOptInfo *inner_rel,156 SpecialJoinInfo *sjinfo);157extern List *generate_join_implied_equalities_for_ecs(PlannerInfo *root,158 List *eclasses,159 Relids join_relids,160 Relids outer_relids,161 RelOptInfo *inner_rel);162extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2);163extern EquivalenceClass *match_eclasses_to_foreign_key_col(PlannerInfo *root,164 ForeignKeyOptInfo *fkinfo,165 int colno);166extern RestrictInfo *find_derived_clause_for_ec_member(EquivalenceClass *ec,167 EquivalenceMember *em);168extern void add_child_rel_equivalences(PlannerInfo *root,169 AppendRelInfo *appinfo,170 RelOptInfo *parent_rel,171 RelOptInfo *child_rel);172extern void add_child_join_rel_equivalences(PlannerInfo *root,173 int nappinfos,174 AppendRelInfo **appinfos,175 RelOptInfo *parent_joinrel,176 RelOptInfo *child_joinrel);177extern List *generate_implied_equalities_for_column(PlannerInfo *root,178 RelOptInfo *rel,179 ec_matches_callback_type callback,180 void *callback_arg,181 Relids prohibited_rels);182extern bool have_relevant_eclass_joinclause(PlannerInfo *root,183 RelOptInfo *rel1, RelOptInfo *rel2);184extern bool has_relevant_eclass_joinclause(PlannerInfo *root,185 RelOptInfo *rel1);186extern bool eclass_useful_for_merging(PlannerInfo *root,187 EquivalenceClass *eclass,188 RelOptInfo *rel);189extern bool is_redundant_derived_clause(RestrictInfo *rinfo, List *clauselist);190extern bool is_redundant_with_indexclauses(RestrictInfo *rinfo,191 List *indexclauses);192 193/*194 * pathkeys.c195 * utilities for matching and building path keys196 */197typedef enum198{199 PATHKEYS_EQUAL, /* pathkeys are identical */200 PATHKEYS_BETTER1, /* pathkey 1 is a superset of pathkey 2 */201 PATHKEYS_BETTER2, /* vice versa */202 PATHKEYS_DIFFERENT /* neither pathkey includes the other */203} PathKeysComparison;204 205extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2);206extern bool pathkeys_contained_in(List *keys1, List *keys2);207extern bool pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common);208extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,209 Relids required_outer,210 CostSelector cost_criterion,211 bool require_parallel_safe);212extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths,213 List *pathkeys,214 Relids required_outer,215 double fraction);216extern Path *get_cheapest_parallel_safe_total_inner(List *paths);217extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index,218 ScanDirection scandir);219extern List *build_partition_pathkeys(PlannerInfo *root, RelOptInfo *partrel,220 ScanDirection scandir, bool *partialkeys);221extern List *build_expression_pathkey(PlannerInfo *root, Expr *expr,222 Oid opno,223 Relids rel, bool create_it);224extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel,225 List *subquery_pathkeys,226 List *subquery_tlist);227extern List *build_join_pathkeys(PlannerInfo *root,228 RelOptInfo *joinrel,229 JoinType jointype,230 List *outer_pathkeys);231extern List *make_pathkeys_for_sortclauses(PlannerInfo *root,232 List *sortclauses,233 List *tlist);234extern List *make_pathkeys_for_sortclauses_extended(PlannerInfo *root,235 List **sortclauses,236 List *tlist,237 bool remove_redundant,238 bool *sortable);239extern void initialize_mergeclause_eclasses(PlannerInfo *root,240 RestrictInfo *restrictinfo);241extern void update_mergeclause_eclasses(PlannerInfo *root,242 RestrictInfo *restrictinfo);243extern List *find_mergeclauses_for_outer_pathkeys(PlannerInfo *root,244 List *pathkeys,245 List *restrictinfos);246extern List *select_outer_pathkeys_for_merge(PlannerInfo *root,247 List *mergeclauses,248 RelOptInfo *joinrel);249extern List *make_inner_pathkeys_for_merge(PlannerInfo *root,250 List *mergeclauses,251 List *outer_pathkeys);252extern List *trim_mergeclauses_for_inner_pathkeys(PlannerInfo *root,253 List *mergeclauses,254 List *pathkeys);255extern List *truncate_useless_pathkeys(PlannerInfo *root,256 RelOptInfo *rel,257 List *pathkeys);258extern bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel);259extern List *append_pathkeys(List *target, List *source);260extern PathKey *make_canonical_pathkey(PlannerInfo *root,261 EquivalenceClass *eclass, Oid opfamily,262 int strategy, bool nulls_first);263extern void add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel,264 List *live_childrels);265 266#endif /* PATHS_H */267 