]> granicus.if.org Git - postgresql/blob - src/include/optimizer/paths.h
Update copyright for the year 2010.
[postgresql] / src / include / optimizer / paths.h
1 /*-------------------------------------------------------------------------
2  *
3  * paths.h
4  *        prototypes for various files in optimizer/path
5  *
6  *
7  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.110 2010/01/02 16:58:07 momjian Exp $
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef PATHS_H
15 #define PATHS_H
16
17 #include "nodes/relation.h"
18
19
20 /*
21  * allpaths.c
22  */
23 extern bool enable_geqo;
24 extern int      geqo_threshold;
25
26 /* Hook for plugins to replace standard_join_search() */
27 typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root,
28                                                                                                                   int levels_needed,
29                                                                                                                   List *initial_rels);
30 extern PGDLLIMPORT join_search_hook_type join_search_hook;
31
32
33 extern RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist);
34 extern RelOptInfo *standard_join_search(PlannerInfo *root, int levels_needed,
35                                          List *initial_rels);
36
37 #ifdef OPTIMIZER_DEBUG
38 extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel);
39 #endif
40
41 /*
42  * indxpath.c
43  *        routines to generate index paths
44  */
45 typedef enum
46 {
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 */
51 } SaOpControl;
52
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 bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel,
61                                                           List *restrictlist);
62 extern List *group_clauses_by_indexkey(IndexOptInfo *index,
63                                                   List *clauses, List *outer_clauses,
64                                                   Relids outer_relids,
65                                                   SaOpControl saop_control,
66                                                   bool *found_clause);
67 extern bool eclass_matches_any_index(EquivalenceClass *ec,
68                                                  EquivalenceMember *em,
69                                                  RelOptInfo *rel);
70 extern bool match_index_to_operand(Node *operand, int indexcol,
71                                            IndexOptInfo *index);
72 extern List *expand_indexqual_conditions(IndexOptInfo *index,
73                                                         List *clausegroups);
74 extern void check_partial_indexes(PlannerInfo *root, RelOptInfo *rel);
75 extern List *flatten_clausegroups_list(List *clausegroups);
76
77 /*
78  * orindxpath.c
79  *        additional routines for indexable OR clauses
80  */
81 extern bool create_or_index_quals(PlannerInfo *root, RelOptInfo *rel);
82
83 /*
84  * tidpath.h
85  *        routines to generate tid paths
86  */
87 extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel);
88
89 /*
90  * joinpath.c
91  *         routines to create join paths
92  */
93 extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel,
94                                          RelOptInfo *outerrel, RelOptInfo *innerrel,
95                                          JoinType jointype, SpecialJoinInfo *sjinfo,
96                                          List *restrictlist);
97
98 /*
99  * joinrels.c
100  *        routines to determine which relations to join
101  */
102 extern void 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);
107
108 /*
109  * equivclass.c
110  *        routines for managing EquivalenceClasses
111  */
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,
116                                                  Expr *expr,
117                                                  Oid expr_datatype,
118                                                  List *opfamilies,
119                                                  Index sortref);
120 extern void generate_base_implied_equalities(PlannerInfo *root);
121 extern List *generate_join_implied_equalities(PlannerInfo *root,
122                                                                  RelOptInfo *joinrel,
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,
131                                                   Node *(*mutator) (),
132                                                   void *context);
133 extern List *find_eclass_clauses_for_index_join(PlannerInfo *root,
134                                                                    RelOptInfo *rel,
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,
139                                                            RelOptInfo *rel1);
140 extern bool eclass_useful_for_merging(EquivalenceClass *eclass,
141                                                   RelOptInfo *rel);
142
143 /*
144  * pathkeys.c
145  *        utilities for matching and building path keys
146  */
147 typedef enum
148 {
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;
154
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,
161                                                                                   List *pathkeys,
162                                                                                   double fraction);
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,
168                                         RelOptInfo *joinrel,
169                                         JoinType jointype,
170                                         List *outer_pathkeys);
171 extern List *make_pathkeys_for_sortclauses(PlannerInfo *root,
172                                                           List *sortclauses,
173                                                           List *tlist,
174                                                           bool canonicalize);
175 extern void cache_mergeclause_eclasses(PlannerInfo *root,
176                                                    RestrictInfo *restrictinfo);
177 extern List *find_mergeclauses_for_pathkeys(PlannerInfo *root,
178                                                            List *pathkeys,
179                                                            bool outer_keys,
180                                                            List *restrictinfos);
181 extern List *select_outer_pathkeys_for_merge(PlannerInfo *root,
182                                                                 List *mergeclauses,
183                                                                 RelOptInfo *joinrel);
184 extern List *make_inner_pathkeys_for_merge(PlannerInfo *root,
185                                                           List *mergeclauses,
186                                                           List *outer_pathkeys);
187 extern int pathkeys_useful_for_merging(PlannerInfo *root,
188                                                         RelOptInfo *rel,
189                                                         List *pathkeys);
190 extern int      pathkeys_useful_for_ordering(PlannerInfo *root, List *pathkeys);
191 extern List *truncate_useless_pathkeys(PlannerInfo *root,
192                                                   RelOptInfo *rel,
193                                                   List *pathkeys);
194 extern bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel);
195
196 #endif   /* PATHS_H */