]> granicus.if.org Git - postgresql/blob - src/include/optimizer/paths.h
Restructure code that is responsible for ensuring that clauseless joins are
[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-2007, 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.96 2007/02/16 00:14:01 tgl 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 extern RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist);
27
28 #ifdef OPTIMIZER_DEBUG
29 extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel);
30 #endif
31
32 /*
33  * indxpath.c
34  *        routines to generate index paths
35  */
36 typedef enum
37 {
38         /* Whether to use ScalarArrayOpExpr to build index qualifications */
39         SAOP_FORBID,                            /* Do not use ScalarArrayOpExpr */
40         SAOP_ALLOW,                                     /* OK to use ScalarArrayOpExpr */
41         SAOP_REQUIRE                            /* Require ScalarArrayOpExpr */
42 } SaOpControl;
43
44 extern void create_index_paths(PlannerInfo *root, RelOptInfo *rel);
45 extern List *generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel,
46                                                  List *clauses, List *outer_clauses,
47                                                  RelOptInfo *outer_rel);
48 extern Path *best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel,
49                                          RelOptInfo *outer_rel, JoinType jointype);
50 extern List *group_clauses_by_indexkey(IndexOptInfo *index,
51                                                   List *clauses, List *outer_clauses,
52                                                   Relids outer_relids,
53                                                   SaOpControl saop_control,
54                                                   bool *found_clause);
55 extern bool eclass_matches_any_index(EquivalenceClass *ec,
56                                                                          EquivalenceMember *em,
57                                                                          RelOptInfo *rel);
58 extern bool match_index_to_operand(Node *operand, int indexcol,
59                                            IndexOptInfo *index);
60 extern List *expand_indexqual_conditions(IndexOptInfo *index,
61                                                         List *clausegroups);
62 extern void check_partial_indexes(PlannerInfo *root, RelOptInfo *rel);
63 extern List *flatten_clausegroups_list(List *clausegroups);
64
65 /*
66  * orindxpath.c
67  *        additional routines for indexable OR clauses
68  */
69 extern bool create_or_index_quals(PlannerInfo *root, RelOptInfo *rel);
70
71 /*
72  * tidpath.h
73  *        routines to generate tid paths
74  */
75 extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel);
76
77 /*
78  * joinpath.c
79  *         routines to create join paths
80  */
81 extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel,
82                                          RelOptInfo *outerrel,
83                                          RelOptInfo *innerrel,
84                                          JoinType jointype,
85                                          List *restrictlist);
86
87 /*
88  * joinrels.c
89  *        routines to determine which relations to join
90  */
91 extern List *make_rels_by_joins(PlannerInfo *root, int level, List **joinrels);
92 extern RelOptInfo *make_join_rel(PlannerInfo *root,
93                           RelOptInfo *rel1, RelOptInfo *rel2);
94 extern bool have_join_order_restriction(PlannerInfo *root,
95                                                         RelOptInfo *rel1, RelOptInfo *rel2);
96
97 /*
98  * equivclass.c
99  *        routines for managing EquivalenceClasses
100  */
101 extern bool process_equivalence(PlannerInfo *root, RestrictInfo *restrictinfo,
102                                                                 bool below_outer_join);
103 extern void reconsider_outer_join_clauses(PlannerInfo *root);
104 extern EquivalenceClass *get_eclass_for_sort_expr(PlannerInfo *root,
105                                                  Expr *expr,
106                                                  Oid expr_datatype,
107                                                  List *opfamilies);
108 extern void generate_base_implied_equalities(PlannerInfo *root);
109 extern List *generate_join_implied_equalities(PlannerInfo *root,
110                                                                                           RelOptInfo *joinrel,
111                                                                                           RelOptInfo *outer_rel,
112                                                                                           RelOptInfo *inner_rel);
113 extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2);
114 extern void add_child_rel_equivalences(PlannerInfo *root,
115                                                                            AppendRelInfo *appinfo,
116                                                                            RelOptInfo *parent_rel,
117                                                                            RelOptInfo *child_rel);
118 extern List *find_eclass_clauses_for_index_join(PlannerInfo *root,
119                                                                                                 RelOptInfo *rel,
120                                                                                                 Relids outer_relids);
121 extern bool have_relevant_eclass_joinclause(PlannerInfo *root,
122                                                                 RelOptInfo *rel1, RelOptInfo *rel2);
123 extern bool has_relevant_eclass_joinclause(PlannerInfo *root,
124                                                                                    RelOptInfo *rel1);
125 extern bool eclass_useful_for_merging(EquivalenceClass *eclass,
126                                                                           RelOptInfo *rel);
127
128 /*
129  * pathkeys.c
130  *        utilities for matching and building path keys
131  */
132 typedef enum
133 {
134         PATHKEYS_EQUAL,                         /* pathkeys are identical */
135         PATHKEYS_BETTER1,                       /* pathkey 1 is a superset of pathkey 2 */
136         PATHKEYS_BETTER2,                       /* vice versa */
137         PATHKEYS_DIFFERENT                      /* neither pathkey includes the other */
138 } PathKeysComparison;
139
140 extern List *canonicalize_pathkeys(PlannerInfo *root, List *pathkeys);
141 extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2);
142 extern bool pathkeys_contained_in(List *keys1, List *keys2);
143 extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,
144                                                            CostSelector cost_criterion);
145 extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths,
146                                                                                   List *pathkeys,
147                                                                                   double fraction);
148 extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index,
149                                          ScanDirection scandir);
150 extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel,
151                                                   List *subquery_pathkeys);
152 extern List *build_join_pathkeys(PlannerInfo *root,
153                                         RelOptInfo *joinrel,
154                                         JoinType jointype,
155                                         List *outer_pathkeys);
156 extern List *make_pathkeys_for_sortclauses(PlannerInfo *root,
157                                                           List *sortclauses,
158                                                           List *tlist,
159                                                           bool canonicalize);
160 extern void cache_mergeclause_eclasses(PlannerInfo *root,
161                                                    RestrictInfo *restrictinfo);
162 extern List *find_mergeclauses_for_pathkeys(PlannerInfo *root,
163                                                            List *pathkeys,
164                                                            bool outer_keys,
165                                                            List *restrictinfos);
166 extern List *select_outer_pathkeys_for_merge(PlannerInfo *root,
167                                                                                          List *mergeclauses,
168                                                                                          RelOptInfo *joinrel);
169 extern List *make_inner_pathkeys_for_merge(PlannerInfo *root,
170                                                                                    List *mergeclauses,
171                                                                                    List *outer_pathkeys);
172 extern int pathkeys_useful_for_merging(PlannerInfo *root,
173                                                         RelOptInfo *rel,
174                                                         List *pathkeys);
175 extern int      pathkeys_useful_for_ordering(PlannerInfo *root, List *pathkeys);
176 extern List *truncate_useless_pathkeys(PlannerInfo *root,
177                                                   RelOptInfo *rel,
178                                                   List *pathkeys);
179
180 #endif   /* PATHS_H */