summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2005-03-27 18:38:27 +0000
committerTom Lane2005-03-27 18:38:27 +0000
commit617dd33b6effe01852d6b4f71cd4c4e1f6eccbd6 (patch)
treedc39d13fbe3be6f7adad62ac958930e309207d7f
parent926e8a00d38e1873369ab9a24062440c82d7731c (diff)
Eliminate duplicate hasnulls bit testing in index tuple access, and
clean up itup.h a little bit.
-rw-r--r--src/backend/access/common/indextuple.c9
-rw-r--r--src/include/access/ibit.h32
-rw-r--r--src/include/access/itup.h56
3 files changed, 33 insertions, 64 deletions
diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c
index e52f61a2ad4..e5d19765e79 100644
--- a/src/backend/access/common/indextuple.c
+++ b/src/backend/access/common/indextuple.c
@@ -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
index f2881fe9824..00000000000
--- a/src/include/access/ibit.h
+++ /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 */
diff --git a/src/include/access/itup.h b/src/include/access/itup.h
index 68b7d94cf32..614ab440360 100644
--- a/src/include/access/itup.h
+++ b/src/include/access/itup.h
@@ -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 \