1 /*-------------------------------------------------------------------------
4 * prototypes for various files in optimizer/path (were separate
8 * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
9 * Portions Copyright (c) 1994, Regents of the University of California
11 * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.80 2005/03/27 06:29:49 tgl Exp $
13 *-------------------------------------------------------------------------
18 #include "nodes/relation.h"
24 extern bool enable_geqo;
25 extern int geqo_threshold;
27 extern RelOptInfo *make_one_rel(Query *root);
28 extern RelOptInfo *make_fromexpr_rel(Query *root, FromExpr *from);
30 #ifdef OPTIMIZER_DEBUG
31 extern void debug_print_rel(Query *root, RelOptInfo *rel);
36 * routines to generate index paths
38 extern void create_index_paths(Query *root, RelOptInfo *rel);
39 extern Path *best_inner_indexscan(Query *root, RelOptInfo *rel,
40 Relids outer_relids, JoinType jointype);
41 extern List *group_clauses_by_indexkey_for_or(IndexOptInfo *index,
43 extern List *expand_indexqual_conditions(IndexOptInfo *index,
45 extern void check_partial_indexes(Query *root, RelOptInfo *rel);
46 extern bool pred_test(List *predicate_list, List *restrictinfo_list);
47 extern List *flatten_clausegroups_list(List *clausegroups);
48 extern Expr *make_expr_from_indexclauses(List *indexclauses);
52 * additional routines for indexable OR clauses
54 extern bool create_or_index_quals(Query *root, RelOptInfo *rel);
55 extern void create_or_index_paths(Query *root, RelOptInfo *rel);
59 * routines to generate tid paths
61 extern void create_tidscan_paths(Query *root, RelOptInfo *rel);
65 * routines to create join paths
67 extern void add_paths_to_joinrel(Query *root, RelOptInfo *joinrel,
75 * routines to determine which relations to join
77 extern List *make_rels_by_joins(Query *root, int level, List **joinrels);
78 extern RelOptInfo *make_jointree_rel(Query *root, Node *jtnode);
79 extern RelOptInfo *make_join_rel(Query *root,
80 RelOptInfo *rel1, RelOptInfo *rel2,
85 * utilities for matching and building path keys
89 PATHKEYS_EQUAL, /* pathkeys are identical */
90 PATHKEYS_BETTER1, /* pathkey 1 is a superset of pathkey 2 */
91 PATHKEYS_BETTER2, /* vice versa */
92 PATHKEYS_DIFFERENT /* neither pathkey includes the other */
95 extern void add_equijoined_keys(Query *root, RestrictInfo *restrictinfo);
96 extern bool exprs_known_equal(Query *root, Node *item1, Node *item2);
97 extern void generate_implied_equalities(Query *root);
98 extern List *canonicalize_pathkeys(Query *root, List *pathkeys);
99 extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2);
100 extern bool pathkeys_contained_in(List *keys1, List *keys2);
101 extern PathKeysComparison compare_noncanonical_pathkeys(List *keys1,
103 extern bool noncanonical_pathkeys_contained_in(List *keys1, List *keys2);
104 extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,
105 CostSelector cost_criterion);
106 extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths,
109 extern List *build_index_pathkeys(Query *root, IndexOptInfo *index,
110 ScanDirection scandir);
111 extern List *build_subquery_pathkeys(Query *root, RelOptInfo *rel,
113 extern List *build_join_pathkeys(Query *root,
116 List *outer_pathkeys);
117 extern List *make_pathkeys_for_sortclauses(List *sortclauses,
119 extern void cache_mergeclause_pathkeys(Query *root,
120 RestrictInfo *restrictinfo);
121 extern List *find_mergeclauses_for_pathkeys(Query *root,
123 List *restrictinfos);
124 extern List *make_pathkeys_for_mergeclauses(Query *root,
127 extern int pathkeys_useful_for_merging(Query *root,
130 extern int pathkeys_useful_for_ordering(Query *root, List *pathkeys);
131 extern List *truncate_useless_pathkeys(Query *root,