diff options
| author | Tom Lane | 2011-03-22 04:34:31 +0000 |
|---|---|---|
| committer | Tom Lane | 2011-03-22 04:34:31 +0000 |
| commit | 8df08c84894001d3d3f5d10b3290a1063a453316 (patch) | |
| tree | 138335fc92bf63822f93fd68203b1c97fa4db3c6 /src/include/optimizer | |
| parent | 6d8096e2f3f2c1296fa880f44f3fa5701b2f40c4 (diff) | |
Reimplement planner's handling of MIN/MAX aggregate optimization (again).
Instead of playing cute games with pathkeys, just build a direct
representation of the intended sub-select, and feed it through
query_planner to get a Path for the index access. This is a bit slower
than 9.1's previous method, since we'll duplicate most of the overhead of
query_planner; but since the whole optimization only applies to rather
simple single-table queries, that probably won't be much of a problem in
practice. The advantage is that we get to do the right thing when there's
a partial index that needs the implicit IS NOT NULL clause to be usable.
Also, although this makes planagg.c be a bit more closely tied to the
ordering of operations in grouping_planner, we can get rid of some coupling
to lower-level parts of the planner. Per complaint from Marti Raudsepp.
Diffstat (limited to 'src/include/optimizer')
| -rw-r--r-- | src/include/optimizer/paths.h | 16 |
1 files changed, 0 insertions, 16 deletions
diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index 06aed5f317..5ff951e67e 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -42,14 +42,6 @@ extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel); * indxpath.c * routines to generate index paths */ -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, @@ -59,11 +51,6 @@ extern void best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel, Path **cheapest_startup, Path **cheapest_total); extern bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel, List *restrictlist); -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); @@ -176,9 +163,6 @@ extern List *make_pathkeys_for_sortclauses(PlannerInfo *root, List *sortclauses, List *tlist, bool canonicalize); -extern List *make_pathkeys_for_aggregate(PlannerInfo *root, - Expr *aggtarget, - Oid aggsortop); extern void initialize_mergeclause_eclasses(PlannerInfo *root, RestrictInfo *restrictinfo); extern void update_mergeclause_eclasses(PlannerInfo *root, |
