diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-01-04 00:07:32 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-01-04 00:07:32 +0000 |
| commit | 6cb1c0238b2503f485e3491902bfc294b7beeed1 (patch) | |
| tree | 0cb4104e7027805adb1420ed182e4ff908fd0b0e /src/include | |
| parent | 037e2fcf8fb4f5af00a5eceb26f4a2170e99b343 (diff) | |
Rewrite OR indexscan processing to be more flexible. We can now for the
first time generate an OR indexscan for a two-column index when the WHERE
condition is like 'col1 = foo AND (col2 = bar OR col2 = baz)' --- before,
the OR had to be on the first column of the index or we'd not notice the
possibility of using it. Some progress towards extracting OR indexscans
from subclauses of an OR that references multiple relations, too, although
this code is #ifdef'd out because it needs more work.
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/nodes/relation.h | 21 | ||||
| -rw-r--r-- | src/include/optimizer/paths.h | 8 | ||||
| -rw-r--r-- | src/include/optimizer/restrictinfo.h | 3 |
3 files changed, 20 insertions, 12 deletions
diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h index 0d129f38ea1..af852725737 100644 --- a/src/include/nodes/relation.h +++ b/src/include/nodes/relation.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/nodes/relation.h,v 1.88 2003/12/30 23:53:15 tgl Exp $ + * $PostgreSQL: pgsql/src/include/nodes/relation.h,v 1.89 2004/01/04 00:07:32 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -271,6 +271,8 @@ typedef struct IndexOptInfo List *indexprs; /* expressions for non-simple index * columns */ List *indpred; /* predicate if a partial index, else NIL */ + + bool predOK; /* true if predicate matches query */ bool unique; /* true if a unique index */ /* cached info about inner indexscan paths for index */ @@ -410,6 +412,8 @@ typedef struct AppendPath * variable-free targetlist or to gate execution of a subplan with a * one-time (variable-free) qual condition. Note that in the former case * path.parent will be NULL; in the latter case it is copied from the subpath. + * + * Note that constantqual is a list of bare clauses, not RestrictInfos. */ typedef struct ResultPath { @@ -478,9 +482,7 @@ typedef JoinPath NestPath; * A mergejoin path has these fields. * * path_mergeclauses lists the clauses (in the form of RestrictInfos) - * that will be used in the merge. (Before 7.0, this was a list of bare - * clause expressions, but we can save on list memory and cost_qual_eval - * work by leaving it in the form of a RestrictInfo list.) + * that will be used in the merge. * * Note that the mergeclauses are a subset of the parent relation's * restriction-clause list. Any join clauses that are not mergejoinable @@ -586,6 +588,12 @@ typedef struct HashPath * qual-expression-evaluation code. (But we are still entitled to count * their selectivity when estimating the result tuple count, if we * can guess what it is...) + * + * When the referenced clause is an OR clause, we generate a modified copy + * in which additional RestrictInfo nodes are inserted below the top-level + * OR/AND structure. This is a convenience for OR indexscan processing: + * indexquals taken from either the top level or an OR subclause will have + * associated RestrictInfo nodes. */ typedef struct RestrictInfo @@ -609,9 +617,8 @@ typedef struct RestrictInfo Relids left_relids; /* relids in left side of clause */ Relids right_relids; /* relids in right side of clause */ - /* only used if clause is an OR clause: */ - List *subclauseindices; /* indexes matching subclauses */ - /* subclauseindices is a List of Lists of IndexOptInfos */ + /* This field is NULL unless clause is an OR clause: */ + Expr *orclause; /* modified clause with RestrictInfos */ /* cache space for costs (currently only used for join clauses) */ QualCost eval_cost; /* eval cost of clause; -1 if not yet set */ diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index 6e5ea0551f2..3e60d608020 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -8,7 +8,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.70 2003/11/29 22:41:07 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.71 2004/01/04 00:07:32 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -38,9 +38,9 @@ extern void debug_print_rel(Query *root, RelOptInfo *rel); extern void create_index_paths(Query *root, RelOptInfo *rel); extern Path *best_inner_indexscan(Query *root, RelOptInfo *rel, Relids outer_relids, JoinType jointype); -extern List *extract_or_indexqual_conditions(RelOptInfo *rel, - IndexOptInfo *index, - Expr *orsubclause); +extern List *group_clauses_by_indexkey_for_or(RelOptInfo *rel, + IndexOptInfo *index, + Expr *orsubclause); extern List *expand_indexqual_conditions(IndexOptInfo *index, List *clausegroups); diff --git a/src/include/optimizer/restrictinfo.h b/src/include/optimizer/restrictinfo.h index 640e5e16aa9..362ed26a61b 100644 --- a/src/include/optimizer/restrictinfo.h +++ b/src/include/optimizer/restrictinfo.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/restrictinfo.h,v 1.20 2003/11/29 22:41:07 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/restrictinfo.h,v 1.21 2004/01/04 00:07:32 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -16,6 +16,7 @@ #include "nodes/relation.h" +extern RestrictInfo *make_restrictinfo(Expr *clause, bool ispusheddown); extern bool restriction_is_or_clause(RestrictInfo *restrictinfo); extern List *get_actual_clauses(List *restrictinfo_list); extern void get_actual_join_clauses(List *restrictinfo_list, |
