diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-04-20 21:48:39 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-04-20 21:48:39 +0000 |
commit | 6fbda165183f9164d111f2562c7d2ae480049c23 (patch) | |
tree | cdba43b1b514e5b415c87eb8f9ef2f83da5ce9f6 | |
parent | bdb2d697a73886af5a2b8e4529ba868bfa6c1634 (diff) | |
download | postgresql-6fbda165183f9164d111f2562c7d2ae480049c23.tar.gz postgresql-6fbda165183f9164d111f2562c7d2ae480049c23.zip |
Don't try to run clauseless index scans on index types that don't support
it. Per report from Marinos Yannikos.
-rw-r--r-- | src/backend/optimizer/path/indxpath.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index e45209a309a..e0dd72f1e1d 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.112.2.1 2002/08/22 16:20:38 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.112.2.2 2005/04/20 21:48:39 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -187,11 +187,16 @@ create_index_paths(Query *root, RelOptInfo *rel) * 3. Compute pathkeys describing index's ordering, if any, then * see how many of them are actually useful for this query. */ - index_pathkeys = build_index_pathkeys(root, rel, index, - ForwardScanDirection); - index_is_ordered = (index_pathkeys != NIL); - useful_pathkeys = truncate_useless_pathkeys(root, rel, - index_pathkeys); + index_is_ordered = OidIsValid(index->ordering[0]); + if (index_is_ordered) + { + index_pathkeys = build_index_pathkeys(root, rel, index, + ForwardScanDirection); + useful_pathkeys = truncate_useless_pathkeys(root, rel, + index_pathkeys); + } + else + useful_pathkeys = NIL; /* * 4. Generate an indexscan path if there are relevant restriction @@ -201,10 +206,15 @@ create_index_paths(Query *root, RelOptInfo *rel) * If there is a predicate, consider it anyway since the index * predicate has already been found to match the query. The * selectivity of the predicate might alone make the index useful. + * + * Note: not all index AMs support scans with no restriction clauses. + * We assume here that the AM does so if and only if it supports + * ordered scans. (It would probably be better if there were a + * specific flag for this in pg_am, but there's not.) */ if (restrictclauses != NIL || useful_pathkeys != NIL || - index->indpred != NIL) + (index->indpred != NIL && index_is_ordered)) add_path(rel, (Path *) create_index_path(root, rel, index, restrictclauses, |