Eliminate duplicate hasnulls bit testing in index tuple access, and
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 27 Mar 2005 18:38:27 +0000 (18:38 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 27 Mar 2005 18:38:27 +0000 (18:38 +0000)
clean up itup.h a little bit.

src/backend/access/common/indextuple.c
src/include/access/ibit.h [deleted file]
src/include/access/itup.h

index e52f61a2ad40c5bb85590d1d2ba5d29e0ead9578..e5d19765e79d04e73e1ff8155fdd6a404fe4ca63 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/common/indextuple.c,v 1.73 2005/03/21 01:23:55 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/common/indextuple.c,v 1.74 2005/03/27 18:38:26 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -137,7 +137,7 @@ index_form_tuple(TupleDesc tupleDescriptor,
                    isnull,
                    (char *) tp + hoff,
                    &tupmask,
-                   (hasnull ? (bits8 *) tp + sizeof(*tuple) : NULL));
+                   (hasnull ? (bits8 *) tp + sizeof(IndexTupleData) : NULL));
 
 #ifdef TOAST_INDEX_HACK
    for (i = 0; i < numberOfAttributes; i++)
@@ -230,8 +230,7 @@ nocache_index_getattr(IndexTuple tup,
    *isnull = false;
 #endif
 
-   data_off = IndexTupleHasMinHeader(tup) ? sizeof *tup :
-       IndexInfoFindDataOffset(tup->t_info);
+   data_off = IndexInfoFindDataOffset(tup->t_info);
 
    attnum--;
 
@@ -256,7 +255,7 @@ nocache_index_getattr(IndexTuple tup,
         */
 
        /* XXX "knows" t_bits are just after fixed tuple header! */
-       bp = (bits8 *) ((char *) tup + sizeof(*tup));
+       bp = (bits8 *) ((char *) tup + sizeof(IndexTupleData));
 
 #ifdef IN_MACRO
 /* This is handled in the macro */
diff --git a/src/include/access/ibit.h b/src/include/access/ibit.h
deleted file mode 100644 (file)
index f2881fe..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * ibit.h
- *   POSTGRES index valid attribute bit map definitions.
- *
- *
- * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * $PostgreSQL: pgsql/src/include/access/ibit.h,v 1.23 2004/12/31 22:03:21 pgsql Exp $
- *
- *-------------------------------------------------------------------------
- */
-#ifndef IBIT_H
-#define IBIT_H
-
-typedef struct IndexAttributeBitMapData
-{
-   bits8       bits[(INDEX_MAX_KEYS + 8 - 1) / 8];
-} IndexAttributeBitMapData;
-
-typedef IndexAttributeBitMapData *IndexAttributeBitMap;
-
-#define IndexAttributeBitMapSize       sizeof(IndexAttributeBitMapData)
-
-/*
- * IndexAttributeBitMapIsValid
- *     True iff attribute bit map is valid.
- */
-#define IndexAttributeBitMapIsValid(bits) PointerIsValid(bits)
-
-#endif   /* IBIT_H */
index 68b7d94cf3200d98375ce092e16f88f777f7e640..614ab440360a67da58e923871c82e234c7e91085 100644 (file)
@@ -7,19 +7,31 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/itup.h,v 1.42 2005/03/21 01:24:04 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/access/itup.h,v 1.43 2005/03/27 18:38:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #ifndef ITUP_H
 #define ITUP_H
 
-#include "access/ibit.h"
 #include "access/tupdesc.h"
 #include "access/tupmacs.h"
 #include "storage/itemptr.h"
 
 
+/*
+ * Index tuple header structure
+ *
+ * All index tuples start with IndexTupleData.  If the HasNulls bit is set,
+ * this is followed by an IndexAttributeBitMapData.  The index attribute
+ * values follow, beginning at a MAXALIGN boundary.
+ *
+ * Note that the space allocated for the bitmap does not vary with the number
+ * of attributes; that is because we don't have room to store the number of
+ * attributes in the header.  Given the MAXALIGN constraint there's no space
+ * savings to be had anyway, for usual values of INDEX_MAX_KEYS.
+ */
+
 typedef struct IndexTupleData
 {
    ItemPointerData t_tid;      /* reference TID to heap tuple */
@@ -36,44 +48,40 @@ typedef struct IndexTupleData
 
    unsigned short t_info;      /* various info about tuple */
 
-   /*
-    * please make sure sizeof(IndexTupleData) is MAXALIGN'ed. See
-    * IndexInfoFindDataOffset() for the reason.
-    */
-
 } IndexTupleData;              /* MORE DATA FOLLOWS AT END OF STRUCT */
 
 typedef IndexTupleData *IndexTuple;
 
+typedef struct IndexAttributeBitMapData
+{
+   bits8       bits[(INDEX_MAX_KEYS + 8 - 1) / 8];
+} IndexAttributeBitMapData;
+
+typedef IndexAttributeBitMapData *IndexAttributeBitMap;
 
-/* ----------------
- *     externs
- * ----------------
+/*
+ * t_info manipulation macros
  */
-
 #define INDEX_SIZE_MASK 0x1FFF
-#define INDEX_NULL_MASK 0x8000
+/* bit 0x2000 is not used at present */
 #define INDEX_VAR_MASK 0x4000
-/* bit 0x2000 is not used */
+#define INDEX_NULL_MASK 0x8000
 
 #define IndexTupleSize(itup)       ((Size) (((IndexTuple) (itup))->t_info & INDEX_SIZE_MASK))
 #define IndexTupleDSize(itup)      ((Size) ((itup).t_info & INDEX_SIZE_MASK))
 #define IndexTupleHasNulls(itup)   ((((IndexTuple) (itup))->t_info & INDEX_NULL_MASK))
 #define IndexTupleHasVarwidths(itup) ((((IndexTuple) (itup))->t_info & INDEX_VAR_MASK))
 
-#define IndexTupleHasMinHeader(itup) (!IndexTupleHasNulls(itup))
 
 /*
  * Takes an infomask as argument (primarily because this needs to be usable
  * at index_form_tuple time so enough space is allocated).
- *
- * Change me if adding an attribute to IndexTuples!!!!!!!!!!!
  */
 #define IndexInfoFindDataOffset(t_info) \
 ( \
-   (!((unsigned short)(t_info) & INDEX_NULL_MASK)) ? \
+   (!((t_info) & INDEX_NULL_MASK)) ? \
    ( \
-       (Size)sizeof(IndexTupleData) \
+       (Size)MAXALIGN(sizeof(IndexTupleData)) \
    ) \
    : \
    ( \
@@ -85,7 +93,7 @@ typedef IndexTupleData *IndexTuple;
  *     index_getattr
  *
  *     This gets called many times, so we macro the cacheable and NULL
- *     lookups, and call noncachegetattr() for the rest.
+ *     lookups, and call nocache_index_getattr() for the rest.
  *
  * ----------------
  */
@@ -98,13 +106,7 @@ typedef IndexTupleData *IndexTuple;
        (tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ? \
        ( \
            fetchatt((tupleDesc)->attrs[(attnum)-1], \
-           (char *) (tup) + \
-           ( \
-               IndexTupleHasMinHeader(tup) ? \
-                       sizeof (*(tup)) \
-                   : \
-                       IndexInfoFindDataOffset((tup)->t_info) \
-           ) \
+           (char *) (tup) + IndexInfoFindDataOffset((tup)->t_info) \
            + (tupleDesc)->attrs[(attnum)-1]->attcacheoff) \
        ) \
        : \
@@ -112,7 +114,7 @@ typedef IndexTupleData *IndexTuple;
    ) \
    : \
    ( \
-       (att_isnull((attnum)-1, (char *)(tup) + sizeof(*(tup)))) ? \
+       (att_isnull((attnum)-1, (char *)(tup) + sizeof(IndexTupleData))) ? \
        ( \
            *(isnull) = true, \
            (Datum)NULL \