Don't try to run clauseless index scans on index types that don't support
authorTom Lane
Wed, 20 Apr 2005 21:48:04 +0000 (21:48 +0000)
committerTom Lane
Wed, 20 Apr 2005 21:48:04 +0000 (21:48 +0000)
it.  Per report from Marinos Yannikos.

src/backend/optimizer/path/indxpath.c

index 21cf27745a4ff31530ad1e546a2bf583abc4d78b..937e2aed80eb9e000b8ea891694493ffca6035bd 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.173 2005/04/11 23:06:55 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.174 2005/04/20 21:48:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -146,11 +146,16 @@ create_index_paths(Query *root, RelOptInfo *rel)
         * 2. 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, 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, index,
+                                                 ForwardScanDirection);
+           useful_pathkeys = truncate_useless_pathkeys(root, rel,
+                                                       index_pathkeys);
+       }
+       else
+           useful_pathkeys = NIL;
 
        /*
         * 3. Generate an indexscan path if there are relevant restriction
@@ -160,10 +165,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, index,
                                       restrictclauses,