1 /*-------------------------------------------------------------------------
4 * prototypes for various files in optimizer/path
7 * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
10 * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.104 2008/03/31 16:59:26 tgl Exp $
12 *-------------------------------------------------------------------------
17 #include "nodes/relation.h"
23 extern bool enable_geqo;
24 extern int geqo_threshold;
26 /* Hook for plugins to replace standard_join_search() */
27 typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root,
30 extern PGDLLIMPORT join_search_hook_type join_search_hook;
33 extern RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist);
34 extern RelOptInfo *standard_join_search(PlannerInfo *root, int levels_needed,
37 #ifdef OPTIMIZER_DEBUG
38 extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel);
43 * routines to generate index paths
47 /* Whether to use ScalarArrayOpExpr to build index qualifications */
48 SAOP_FORBID, /* Do not use ScalarArrayOpExpr */
49 SAOP_ALLOW, /* OK to use ScalarArrayOpExpr */
50 SAOP_REQUIRE /* Require ScalarArrayOpExpr */
53 extern void create_index_paths(PlannerInfo *root, RelOptInfo *rel);
54 extern List *generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel,
55 List *clauses, List *outer_clauses,
56 RelOptInfo *outer_rel);
57 extern void best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel,
58 RelOptInfo *outer_rel, JoinType jointype,
59 Path **cheapest_startup, Path **cheapest_total);
60 extern List *group_clauses_by_indexkey(IndexOptInfo *index,
61 List *clauses, List *outer_clauses,
63 SaOpControl saop_control,
65 extern bool eclass_matches_any_index(EquivalenceClass *ec,
66 EquivalenceMember *em,
68 extern bool match_index_to_operand(Node *operand, int indexcol,
70 extern List *expand_indexqual_conditions(IndexOptInfo *index,
72 extern void check_partial_indexes(PlannerInfo *root, RelOptInfo *rel);
73 extern List *flatten_clausegroups_list(List *clausegroups);
77 * additional routines for indexable OR clauses
79 extern bool create_or_index_quals(PlannerInfo *root, RelOptInfo *rel);
83 * routines to generate tid paths
85 extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel);
89 * routines to create join paths
91 extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel,
99 * routines to determine which relations to join
101 extern List *join_search_one_level(PlannerInfo *root, int level,
103 extern RelOptInfo *make_join_rel(PlannerInfo *root,
104 RelOptInfo *rel1, RelOptInfo *rel2);
105 extern bool have_join_order_restriction(PlannerInfo *root,
106 RelOptInfo *rel1, RelOptInfo *rel2);
110 * routines for managing EquivalenceClasses
112 extern bool process_equivalence(PlannerInfo *root, RestrictInfo *restrictinfo,
113 bool below_outer_join);
114 extern void reconsider_outer_join_clauses(PlannerInfo *root);
115 extern EquivalenceClass *get_eclass_for_sort_expr(PlannerInfo *root,
120 extern void generate_base_implied_equalities(PlannerInfo *root);
121 extern List *generate_join_implied_equalities(PlannerInfo *root,
123 RelOptInfo *outer_rel,
124 RelOptInfo *inner_rel);
125 extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2);
126 extern void add_child_rel_equivalences(PlannerInfo *root,
127 AppendRelInfo *appinfo,
128 RelOptInfo *parent_rel,
129 RelOptInfo *child_rel);
130 extern void mutate_eclass_expressions(PlannerInfo *root,
133 extern List *find_eclass_clauses_for_index_join(PlannerInfo *root,
135 Relids outer_relids);
136 extern bool have_relevant_eclass_joinclause(PlannerInfo *root,
137 RelOptInfo *rel1, RelOptInfo *rel2);
138 extern bool has_relevant_eclass_joinclause(PlannerInfo *root,
140 extern bool eclass_useful_for_merging(EquivalenceClass *eclass,
145 * utilities for matching and building path keys
149 PATHKEYS_EQUAL, /* pathkeys are identical */
150 PATHKEYS_BETTER1, /* pathkey 1 is a superset of pathkey 2 */
151 PATHKEYS_BETTER2, /* vice versa */
152 PATHKEYS_DIFFERENT /* neither pathkey includes the other */
153 } PathKeysComparison;
155 extern List *canonicalize_pathkeys(PlannerInfo *root, List *pathkeys);
156 extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2);
157 extern bool pathkeys_contained_in(List *keys1, List *keys2);
158 extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,
159 CostSelector cost_criterion);
160 extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths,
163 extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index,
164 ScanDirection scandir);
165 extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel,
166 List *subquery_pathkeys);
167 extern List *build_join_pathkeys(PlannerInfo *root,
170 List *outer_pathkeys);
171 extern List *make_pathkeys_for_sortclauses(PlannerInfo *root,
175 extern void cache_mergeclause_eclasses(PlannerInfo *root,
176 RestrictInfo *restrictinfo);
177 extern List *find_mergeclauses_for_pathkeys(PlannerInfo *root,
180 List *restrictinfos);
181 extern List *select_outer_pathkeys_for_merge(PlannerInfo *root,
183 RelOptInfo *joinrel);
184 extern List *make_inner_pathkeys_for_merge(PlannerInfo *root,
186 List *outer_pathkeys);
187 extern int pathkeys_useful_for_merging(PlannerInfo *root,
190 extern int pathkeys_useful_for_ordering(PlannerInfo *root, List *pathkeys);
191 extern List *truncate_useless_pathkeys(PlannerInfo *root,
194 extern bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel);