OSDN Git Service

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 e52f61a..e5d1976 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 68b7d94..614ab44 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 \