]> granicus.if.org Git - postgresql/blobdiff - src/include/optimizer/paths.h
pgindent run for 8.3.
[postgresql] / src / include / optimizer / paths.h
index f676e61d1f7ce6ed99a043e8ea20c2edb30be3c5..7d4607d95996b56dcc7110fc58beb6292233fb07 100644 (file)
@@ -1,14 +1,13 @@
 /*-------------------------------------------------------------------------
  *
  * paths.h
- *       prototypes for various files in optimizer/path (were separate
- *       header files)
+ *       prototypes for various files in optimizer/path
  *
  *
- * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: paths.h,v 1.54 2001/06/05 17:13:51 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.101 2007/11/15 21:14:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #include "nodes/relation.h"
 
-/* default GEQO threshold (default value for geqo_rels) */
-/* If you change this, update backend/utils/misc/postgresql.sample.conf */
-#define DEFAULT_GEQO_RELS 11
-
 
 /*
  * allpaths.c
  */
 extern bool enable_geqo;
-extern int     geqo_rels;
+extern int     geqo_threshold;
+
+/* Hook for plugins to replace standard_join_search() */
+typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root,
+                                                                                                                 int levels_needed,
+                                                                                                                 List *initial_rels);
+extern PGDLLIMPORT join_search_hook_type join_search_hook;
+
 
-extern RelOptInfo *make_one_rel(Query *root);
-extern RelOptInfo *make_fromexpr_rel(Query *root, FromExpr *from);
+extern RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist);
+extern RelOptInfo *standard_join_search(PlannerInfo *root, int levels_needed,
+                                        List *initial_rels);
+
+#ifdef OPTIMIZER_DEBUG
+extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel);
+#endif
 
 /*
  * indxpath.c
  *       routines to generate index paths
  */
-extern void create_index_paths(Query *root, RelOptInfo *rel);
-extern Oid indexable_operator(Expr *clause, Oid opclass, Oid relam,
-                                  bool indexkey_on_left);
-extern List *extract_or_indexqual_conditions(RelOptInfo *rel,
-                                                               IndexOptInfo *index,
-                                                               Expr *orsubclause);
-extern List *expand_indexqual_conditions(List *indexquals);
+typedef enum
+{
+       /* Whether to use ScalarArrayOpExpr to build index qualifications */
+       SAOP_FORBID,                            /* Do not use ScalarArrayOpExpr */
+       SAOP_ALLOW,                                     /* OK to use ScalarArrayOpExpr */
+       SAOP_REQUIRE                            /* Require ScalarArrayOpExpr */
+} SaOpControl;
+
+extern void create_index_paths(PlannerInfo *root, RelOptInfo *rel);
+extern List *generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel,
+                                                List *clauses, List *outer_clauses,
+                                                RelOptInfo *outer_rel);
+extern void best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel,
+                                        RelOptInfo *outer_rel, JoinType jointype,
+                                        Path **cheapest_startup, Path **cheapest_total);
+extern List *group_clauses_by_indexkey(IndexOptInfo *index,
+                                                 List *clauses, List *outer_clauses,
+                                                 Relids outer_relids,
+                                                 SaOpControl saop_control,
+                                                 bool *found_clause);
+extern bool eclass_matches_any_index(EquivalenceClass * ec,
+                                                EquivalenceMember * em,
+                                                RelOptInfo *rel);
+extern bool match_index_to_operand(Node *operand, int indexcol,
+                                          IndexOptInfo *index);
+extern List *expand_indexqual_conditions(IndexOptInfo *index,
+                                                       List *clausegroups);
+extern void check_partial_indexes(PlannerInfo *root, RelOptInfo *rel);
+extern List *flatten_clausegroups_list(List *clausegroups);
 
 /*
  * orindxpath.c
  *       additional routines for indexable OR clauses
  */
-extern void create_or_index_paths(Query *root, RelOptInfo *rel);
+extern bool create_or_index_quals(PlannerInfo *root, RelOptInfo *rel);
 
 /*
  * tidpath.h
  *       routines to generate tid paths
  */
-extern void create_tidscan_paths(Query *root, RelOptInfo *rel);
+extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel);
 
 /*
  * joinpath.c
  *        routines to create join paths
  */
-extern void add_paths_to_joinrel(Query *root, RelOptInfo *joinrel,
+extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel,
                                         RelOptInfo *outerrel,
                                         RelOptInfo *innerrel,
                                         JoinType jointype,
@@ -69,14 +98,44 @@ extern void add_paths_to_joinrel(Query *root, RelOptInfo *joinrel,
  * joinrels.c
  *       routines to determine which relations to join
  */
-extern List *make_rels_by_joins(Query *root, int level, List **joinrels);
-extern List *make_rels_by_clause_joins(Query *root,
-                                                 RelOptInfo *old_rel,
-                                                 List *other_rels);
-extern List *make_rels_by_clauseless_joins(Query *root,
-                                                         RelOptInfo *old_rel,
-                                                         List *other_rels);
-extern RelOptInfo *make_jointree_rel(Query *root, Node *jtnode);
+extern List *join_search_one_level(PlannerInfo *root, int level,
+                                         List **joinrels);
+extern RelOptInfo *make_join_rel(PlannerInfo *root,
+                         RelOptInfo *rel1, RelOptInfo *rel2);
+extern bool have_join_order_restriction(PlannerInfo *root,
+                                                       RelOptInfo *rel1, RelOptInfo *rel2);
+
+/*
+ * equivclass.c
+ *       routines for managing EquivalenceClasses
+ */
+extern bool process_equivalence(PlannerInfo *root, RestrictInfo *restrictinfo,
+                                       bool below_outer_join);
+extern void reconsider_outer_join_clauses(PlannerInfo *root);
+extern EquivalenceClass *get_eclass_for_sort_expr(PlannerInfo *root,
+                                                Expr *expr,
+                                                Oid expr_datatype,
+                                                List *opfamilies,
+                                                Index sortref);
+extern void generate_base_implied_equalities(PlannerInfo *root);
+extern List *generate_join_implied_equalities(PlannerInfo *root,
+                                                                RelOptInfo *joinrel,
+                                                                RelOptInfo *outer_rel,
+                                                                RelOptInfo *inner_rel);
+extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2);
+extern void add_child_rel_equivalences(PlannerInfo *root,
+                                                  AppendRelInfo *appinfo,
+                                                  RelOptInfo *parent_rel,
+                                                  RelOptInfo *child_rel);
+extern List *find_eclass_clauses_for_index_join(PlannerInfo *root,
+                                                                  RelOptInfo *rel,
+                                                                  Relids outer_relids);
+extern bool have_relevant_eclass_joinclause(PlannerInfo *root,
+                                                               RelOptInfo *rel1, RelOptInfo *rel2);
+extern bool has_relevant_eclass_joinclause(PlannerInfo *root,
+                                                          RelOptInfo *rel1);
+extern bool eclass_useful_for_merging(EquivalenceClass * eclass,
+                                                 RelOptInfo *rel);
 
 /*
  * pathkeys.c
@@ -90,39 +149,45 @@ typedef enum
        PATHKEYS_DIFFERENT                      /* neither pathkey includes the other */
 } PathKeysComparison;
 
-extern void add_equijoined_keys(Query *root, RestrictInfo *restrictinfo);
-extern void generate_implied_equalities(Query *root);
-extern List *canonicalize_pathkeys(Query *root, List *pathkeys);
+extern List *canonicalize_pathkeys(PlannerInfo *root, List *pathkeys);
 extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2);
 extern bool pathkeys_contained_in(List *keys1, List *keys2);
-extern PathKeysComparison compare_noncanonical_pathkeys(List *keys1,
-                                                         List *keys2);
-extern bool noncanonical_pathkeys_contained_in(List *keys1, List *keys2);
 extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,
                                                           CostSelector cost_criterion);
 extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths,
                                                                                  List *pathkeys,
                                                                                  double fraction);
-extern List *build_index_pathkeys(Query *root, RelOptInfo *rel,
-                                        IndexOptInfo *index,
+extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index,
                                         ScanDirection scandir);
-extern List *build_join_pathkeys(Query *root,
+extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel,
+                                                 List *subquery_pathkeys);
+extern List *build_join_pathkeys(PlannerInfo *root,
                                        RelOptInfo *joinrel,
+                                       JoinType jointype,
                                        List *outer_pathkeys);
-extern List *make_pathkeys_for_sortclauses(List *sortclauses,
-                                                         List *tlist);
-extern List *find_mergeclauses_for_pathkeys(Query *root,
+extern List *make_pathkeys_for_sortclauses(PlannerInfo *root,
+                                                         List *sortclauses,
+                                                         List *tlist,
+                                                         bool canonicalize);
+extern void cache_mergeclause_eclasses(PlannerInfo *root,
+                                                  RestrictInfo *restrictinfo);
+extern List *find_mergeclauses_for_pathkeys(PlannerInfo *root,
                                                           List *pathkeys,
+                                                          bool outer_keys,
                                                           List *restrictinfos);
-extern List *make_pathkeys_for_mergeclauses(Query *root,
-                                                          List *mergeclauses,
-                                                          RelOptInfo *rel);
-extern int pathkeys_useful_for_merging(Query *root,
+extern List *select_outer_pathkeys_for_merge(PlannerInfo *root,
+                                                               List *mergeclauses,
+                                                               RelOptInfo *joinrel);
+extern List *make_inner_pathkeys_for_merge(PlannerInfo *root,
+                                                         List *mergeclauses,
+                                                         List *outer_pathkeys);
+extern int pathkeys_useful_for_merging(PlannerInfo *root,
                                                        RelOptInfo *rel,
                                                        List *pathkeys);
-extern int     pathkeys_useful_for_ordering(Query *root, List *pathkeys);
-extern List *truncate_useless_pathkeys(Query *root,
+extern int     pathkeys_useful_for_ordering(PlannerInfo *root, List *pathkeys);
+extern List *truncate_useless_pathkeys(PlannerInfo *root,
                                                  RelOptInfo *rel,
                                                  List *pathkeys);
+extern bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel);
 
-#endif  /* PATHS_H */
+#endif   /* PATHS_H */