]> granicus.if.org Git - postgresql/blob - src/include/optimizer/paths.h
Teach planner how to rearrange join order for some classes of OUTER JOIN.
[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-2005, 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.90 2005/12/20 02:30:36 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                                                  bool isjoininner,
48                                                  Relids outer_relids);
49 extern Path *best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel,
50                                          Relids outer_relids, JoinType jointype);
51 extern List *group_clauses_by_indexkey(IndexOptInfo *index,
52                                                   List *clauses, List *outer_clauses,
53                                                   Relids outer_relids,
54                                                   SaOpControl saop_control,
55                                                   bool *found_clause);
56 extern bool match_index_to_operand(Node *operand, int indexcol,
57                                            IndexOptInfo *index);
58 extern List *expand_indexqual_conditions(IndexOptInfo *index,
59                                                         List *clausegroups);
60 extern void check_partial_indexes(PlannerInfo *root, RelOptInfo *rel);
61 extern List *flatten_clausegroups_list(List *clausegroups);
62
63 /*
64  * orindxpath.c
65  *        additional routines for indexable OR clauses
66  */
67 extern bool create_or_index_quals(PlannerInfo *root, RelOptInfo *rel);
68
69 /*
70  * tidpath.h
71  *        routines to generate tid paths
72  */
73 extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel);
74
75 /*
76  * joinpath.c
77  *         routines to create join paths
78  */
79 extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel,
80                                          RelOptInfo *outerrel,
81                                          RelOptInfo *innerrel,
82                                          JoinType jointype,
83                                          List *restrictlist);
84
85 /*
86  * joinrels.c
87  *        routines to determine which relations to join
88  */
89 extern List *make_rels_by_joins(PlannerInfo *root, int level, List **joinrels);
90 extern RelOptInfo *make_join_rel(PlannerInfo *root,
91                           RelOptInfo *rel1, RelOptInfo *rel2);
92
93 /*
94  * pathkeys.c
95  *        utilities for matching and building path keys
96  */
97 typedef enum
98 {
99         PATHKEYS_EQUAL,                         /* pathkeys are identical */
100         PATHKEYS_BETTER1,                       /* pathkey 1 is a superset of pathkey 2 */
101         PATHKEYS_BETTER2,                       /* vice versa */
102         PATHKEYS_DIFFERENT                      /* neither pathkey includes the other */
103 } PathKeysComparison;
104
105 extern void add_equijoined_keys(PlannerInfo *root, RestrictInfo *restrictinfo);
106 extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2);
107 extern void generate_implied_equalities(PlannerInfo *root);
108 extern List *canonicalize_pathkeys(PlannerInfo *root, List *pathkeys);
109 extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2);
110 extern bool pathkeys_contained_in(List *keys1, List *keys2);
111 extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,
112                                                            CostSelector cost_criterion);
113 extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths,
114                                                                                   List *pathkeys,
115                                                                                   double fraction);
116 extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index,
117                                          ScanDirection scandir);
118 extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel,
119                                                   List *subquery_pathkeys);
120 extern List *build_join_pathkeys(PlannerInfo *root,
121                                         RelOptInfo *joinrel,
122                                         JoinType jointype,
123                                         List *outer_pathkeys);
124 extern List *make_pathkeys_for_sortclauses(List *sortclauses,
125                                                           List *tlist);
126 extern void cache_mergeclause_pathkeys(PlannerInfo *root,
127                                                    RestrictInfo *restrictinfo);
128 extern List *find_mergeclauses_for_pathkeys(PlannerInfo *root,
129                                                            List *pathkeys,
130                                                            List *restrictinfos);
131 extern List *make_pathkeys_for_mergeclauses(PlannerInfo *root,
132                                                            List *mergeclauses,
133                                                            RelOptInfo *rel);
134 extern int pathkeys_useful_for_merging(PlannerInfo *root,
135                                                         RelOptInfo *rel,
136                                                         List *pathkeys);
137 extern int      pathkeys_useful_for_ordering(PlannerInfo *root, List *pathkeys);
138 extern List *truncate_useless_pathkeys(PlannerInfo *root,
139                                                   RelOptInfo *rel,
140                                                   List *pathkeys);
141
142 #endif   /* PATHS_H */