1 /*-------------------------------------------------------------------------
4 * prototypes for various files in optimizer/path
7 * Portions Copyright (c) 1996-2005, 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.90 2005/12/20 02:30:36 tgl Exp $
12 *-------------------------------------------------------------------------
17 #include "nodes/relation.h"
23 extern bool enable_geqo;
24 extern int geqo_threshold;
26 extern RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist);
28 #ifdef OPTIMIZER_DEBUG
29 extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel);
34 * routines to generate index paths
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 */
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,
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,
54 SaOpControl saop_control,
56 extern bool match_index_to_operand(Node *operand, int indexcol,
58 extern List *expand_indexqual_conditions(IndexOptInfo *index,
60 extern void check_partial_indexes(PlannerInfo *root, RelOptInfo *rel);
61 extern List *flatten_clausegroups_list(List *clausegroups);
65 * additional routines for indexable OR clauses
67 extern bool create_or_index_quals(PlannerInfo *root, RelOptInfo *rel);
71 * routines to generate tid paths
73 extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel);
77 * routines to create join paths
79 extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel,
87 * routines to determine which relations to join
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);
95 * utilities for matching and building path keys
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;
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,
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,
123 List *outer_pathkeys);
124 extern List *make_pathkeys_for_sortclauses(List *sortclauses,
126 extern void cache_mergeclause_pathkeys(PlannerInfo *root,
127 RestrictInfo *restrictinfo);
128 extern List *find_mergeclauses_for_pathkeys(PlannerInfo *root,
130 List *restrictinfos);
131 extern List *make_pathkeys_for_mergeclauses(PlannerInfo *root,
134 extern int pathkeys_useful_for_merging(PlannerInfo *root,
137 extern int pathkeys_useful_for_ordering(PlannerInfo *root, List *pathkeys);
138 extern List *truncate_useless_pathkeys(PlannerInfo *root,