Simplify pg_am representation of ordering-capable access methods:
authorTom Lane
Sat, 20 Jan 2007 23:13:01 +0000 (23:13 +0000)
committerTom Lane
Sat, 20 Jan 2007 23:13:01 +0000 (23:13 +0000)
provide just a boolean 'amcanorder', instead of fields that specify the
sort operator strategy numbers.  We have decided to require ordering-capable
AMs to use btree-compatible strategy numbers, so the old fields are
overkill (and indeed misleading about what's allowed).

doc/src/sgml/catalogs.sgml
doc/src/sgml/indexam.sgml
doc/src/sgml/xindex.sgml
src/backend/commands/indexcmds.c
src/backend/optimizer/util/plancat.c
src/backend/utils/adt/ruleutils.c
src/include/catalog/catversion.h
src/include/catalog/pg_am.h

index 8a22a7b81249d10923626bb3b7da9faf6ef9c936..0911ae15b46b6a18c6c183c422635a507c99a35f 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
      
 
      
-      amorderstrategy
-      int2
-      
-      Zero if the index offers no sort order, otherwise the strategy
-      number of the strategy operator that describes the default
-      (ASC) sort order
-     
-
-     
-      amdescorder
-      int2
+      amcanorder
+      bool
       
-      Zero if the index offers no sort order, otherwise the strategy
-      number of the strategy operator that describes the DESC
-      sort order
+      Does the access method support ordered scans?
      
 
      
index 658cdd709666270dd7e9adc72de613ab3cf4a847..f8f3f1cc76cb57ef286bb1ae7c78f3f75d22cec1 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  Index Access Method Interface Definition
@@ -442,6 +442,15 @@ amrestrpos (IndexScanDesc scan);
    the scan keys to a normalized form.
   
 
+  
+   Some access methods return index entries in a well-defined order, others
+   do not.  If entries are returned in sorted order, the access method should
+   set pg_am.amcanorder true to indicate that
+   it supports ordered scans.
+   All such access methods must use btree-compatible strategy numbers for
+   their equality and ordering operators.
+  
+
   
    The amgettuple function has a direction argument,
    which can be either ForwardScanDirection (the normal case)
@@ -451,8 +460,7 @@ amrestrpos (IndexScanDesc scan);
    the normal front-to-back direction, so amgettuple must return
    the last matching tuple in the index, rather than the first one as it
    normally would.  (This will only occur for access
-   methods that advertise they support ordered scans by setting
-   pg_am.amorderstrategy nonzero.)  After the
+   methods that advertise they support ordered scans.)  After the
    first call, amgettuple must be prepared to advance the scan in
    either direction from the most recently returned entry.
   
index a95c8e7ac04881492b25b10852bb1a8275212dbc..8fbea2cf7c0e24b35f90b5ac1ccd143cd319717c 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  Interfacing Extensions To Indexes
    return type boolean, since they must appear at the top
    level of a WHERE clause to be used with an index.
   
-
-  
-   By the way, the amorderstrategy and
-   amdescorder columns in pg_am tell
-   whether the index method supports ordered scans.  Zeroes mean it doesn't;
-   if it does, amorderstrategy is the strategy
-   number that corresponds to the default ordering operator, and
-   amdescorder is the strategy number for the
-   ordering operator of an index column that has the DESC option.
-   For example, B-tree has amorderstrategy = 1,
-   which is its less than strategy number, and
-   amdescorder = 5, which is its
-   greater than strategy number.
-  
  
 
  
index bbaa34f758a5d818f3191bed83eb99fa9c6b4701..2d51dfb11febd2e88a3d8d87943c92d87b65f889 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.152 2007/01/09 02:14:11 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.153 2007/01/20 23:13:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -295,8 +295,7 @@ DefineIndex(RangeVar *heapRelation,
          errmsg("access method \"%s\" does not support multicolumn indexes",
                 accessMethodName)));
 
-   amcanorder = (accessMethodForm->amorderstrategy > 0);
-
+   amcanorder = accessMethodForm->amcanorder;
    amoptions = accessMethodForm->amoptions;
 
    ReleaseSysCache(tuple);
index 9150f1d936f657019613b089c7da6a1e57570583..e52943a675e08ef36ce7f32bc52471fc9392b114 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.131 2007/01/09 02:14:13 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.132 2007/01/20 23:13:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -190,8 +190,10 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
 
            /*
             * Fetch the ordering operators associated with the index, if any.
+            * We expect that all ordering-capable indexes use btree's
+            * strategy numbers for the ordering operators.
             */
-           if (indexRelation->rd_am->amorderstrategy > 0)
+           if (indexRelation->rd_am->amcanorder)
            {
                int         nstrat = indexRelation->rd_am->amstrategies;
 
@@ -203,17 +205,17 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
 
                    if (opt & INDOPTION_DESC)
                    {
-                       fwdstrat = indexRelation->rd_am->amdescorder;
-                       revstrat = indexRelation->rd_am->amorderstrategy;
+                       fwdstrat = BTGreaterStrategyNumber;
+                       revstrat = BTLessStrategyNumber;
                    }
                    else
                    {
-                       fwdstrat = indexRelation->rd_am->amorderstrategy;
-                       revstrat = indexRelation->rd_am->amdescorder;
+                       fwdstrat = BTLessStrategyNumber;
+                       revstrat = BTGreaterStrategyNumber;
                    }
                    /*
                     * Index AM must have a fixed set of strategies for it
-                    * to make sense to specify amorderstrategy, so we
+                    * to make sense to specify amcanorder, so we
                     * need not allow the case amstrategies == 0.
                     */
                    if (fwdstrat > 0)
index 757077afe47b245c498253c9730cf323b232dcba..baef0100073a6902edf09caa6b473ae1fd02ec06 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.244 2007/01/20 01:08:42 neilc Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.245 2007/01/20 23:13:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -767,7 +767,7 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, int prettyFlags)
                             &buf);
 
        /* Add options if relevant */
-       if (amrec->amorderstrategy > 0)
+       if (amrec->amcanorder)
        {
            /* if it supports sort ordering, report DESC and NULLS opts */
            if (opt & INDOPTION_DESC)
index 7e2b19cc9e895d2f50bacd80c7b003f4c45f21f2..0a561ac5dd60d3dbe4889c1d313c1eacc1d06e00 100644 (file)
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.374 2007/01/20 21:47:10 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.375 2007/01/20 23:13:01 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 200701202
+#define CATALOG_VERSION_NO 200701203
 
 #endif
index 80aad73130281a6eb95cd719b4792c84f38c7ca5..76f940a351641a5794df9da9b0e8f7601bc75b6e 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_am.h,v 1.49 2007/01/09 02:14:15 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_am.h,v 1.50 2007/01/20 23:13:01 tgl Exp $
  *
  * NOTES
  *     the genbki.sh script reads this file and generates .bki
@@ -45,12 +45,7 @@ CATALOG(pg_am,2601)
                                 * strategy assignments. */
    int2        amsupport;      /* total number of support functions that this
                                 * AM uses */
-   int2        amorderstrategy;/* if this AM has a sort order, the strategy
-                                * number of the default (ASC) sort operator.
-                                * Zero if AM is not ordered. */
-   int2        amdescorder;    /* if this AM has a sort order, the strategy
-                                * number of the DESC sort operator.
-                                * Zero if AM is not ordered. */
+   bool        amcanorder;     /* does AM support ordered scan results? */
    bool        amcanunique;    /* does AM support UNIQUE indexes? */
    bool        amcanmulticol;  /* does AM support multi-column indexes? */
    bool        amoptionalkey;  /* can query omit key for the first column? */
@@ -83,47 +78,46 @@ typedef FormData_pg_am *Form_pg_am;
  *     compiler constants for pg_am
  * ----------------
  */
-#define Natts_pg_am                        24
+#define Natts_pg_am                        23
 #define Anum_pg_am_amname              1
 #define Anum_pg_am_amstrategies            2
 #define Anum_pg_am_amsupport           3
-#define Anum_pg_am_amorderstrategy     4
-#define Anum_pg_am_amdescorder         5
-#define Anum_pg_am_amcanunique         6
-#define Anum_pg_am_amcanmulticol       7
-#define Anum_pg_am_amoptionalkey       8
-#define Anum_pg_am_amindexnulls            9
-#define Anum_pg_am_amstorage           10
-#define Anum_pg_am_amclusterable       11
-#define Anum_pg_am_aminsert                12
-#define Anum_pg_am_ambeginscan         13
-#define Anum_pg_am_amgettuple          14
-#define Anum_pg_am_amgetmulti          15
-#define Anum_pg_am_amrescan                16
-#define Anum_pg_am_amendscan           17
-#define Anum_pg_am_ammarkpos           18
-#define Anum_pg_am_amrestrpos          19
-#define Anum_pg_am_ambuild             20
-#define Anum_pg_am_ambulkdelete            21
-#define Anum_pg_am_amvacuumcleanup     22
-#define Anum_pg_am_amcostestimate      23
-#define Anum_pg_am_amoptions           24
+#define Anum_pg_am_amcanorder          4
+#define Anum_pg_am_amcanunique         5
+#define Anum_pg_am_amcanmulticol       6
+#define Anum_pg_am_amoptionalkey       7
+#define Anum_pg_am_amindexnulls            8
+#define Anum_pg_am_amstorage           9
+#define Anum_pg_am_amclusterable       10
+#define Anum_pg_am_aminsert                11
+#define Anum_pg_am_ambeginscan         12
+#define Anum_pg_am_amgettuple          13
+#define Anum_pg_am_amgetmulti          14
+#define Anum_pg_am_amrescan                15
+#define Anum_pg_am_amendscan           16
+#define Anum_pg_am_ammarkpos           17
+#define Anum_pg_am_amrestrpos          18
+#define Anum_pg_am_ambuild             19
+#define Anum_pg_am_ambulkdelete            20
+#define Anum_pg_am_amvacuumcleanup     21
+#define Anum_pg_am_amcostestimate      22
+#define Anum_pg_am_amoptions           23
 
 /* ----------------
  *     initial contents of pg_am
  * ----------------
  */
 
-DATA(insert OID = 403 (  btree 5 1 1 5 t t t t f t btinsert btbeginscan btgettuple btgetmulti btrescan btendscan btmarkpos btrestrpos btbuild btbulkdelete btvacuumcleanup btcostestimate btoptions ));
+DATA(insert OID = 403 (  btree 5 1 t t t t t f t btinsert btbeginscan btgettuple btgetmulti btrescan btendscan btmarkpos btrestrpos btbuild btbulkdelete btvacuumcleanup btcostestimate btoptions ));
 DESCR("b-tree index access method");
 #define BTREE_AM_OID 403
-DATA(insert OID = 405 (  hash  1 1 0 0 f f f f f f hashinsert hashbeginscan hashgettuple hashgetmulti hashrescan hashendscan hashmarkpos hashrestrpos hashbuild hashbulkdelete hashvacuumcleanup hashcostestimate hashoptions ));
+DATA(insert OID = 405 (  hash  1 1 f f f f f f f hashinsert hashbeginscan hashgettuple hashgetmulti hashrescan hashendscan hashmarkpos hashrestrpos hashbuild hashbulkdelete hashvacuumcleanup hashcostestimate hashoptions ));
 DESCR("hash index access method");
 #define HASH_AM_OID 405
-DATA(insert OID = 783 (  gist  0 7 0 0 f t t t t t gistinsert gistbeginscan gistgettuple gistgetmulti gistrescan gistendscan gistmarkpos gistrestrpos gistbuild gistbulkdelete gistvacuumcleanup gistcostestimate gistoptions ));
+DATA(insert OID = 783 (  gist  0 7 f f t t t t t gistinsert gistbeginscan gistgettuple gistgetmulti gistrescan gistendscan gistmarkpos gistrestrpos gistbuild gistbulkdelete gistvacuumcleanup gistcostestimate gistoptions ));
 DESCR("GiST index access method");
 #define GIST_AM_OID 783
-DATA(insert OID = 2742 (  gin  0 4 0 0 f f f f t f gininsert ginbeginscan gingettuple gingetmulti ginrescan ginendscan ginmarkpos ginrestrpos ginbuild ginbulkdelete ginvacuumcleanup gincostestimate ginoptions ));
+DATA(insert OID = 2742 (  gin  0 4 f f f f f t f gininsert ginbeginscan gingettuple gingetmulti ginrescan ginendscan ginmarkpos ginrestrpos ginbuild ginbulkdelete ginvacuumcleanup gincostestimate ginoptions ));
 DESCR("GIN index access method");
 #define GIN_AM_OID 2742