From 617dd33b6effe01852d6b4f71cd4c4e1f6eccbd6 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 27 Mar 2005 18:38:27 +0000 Subject: [PATCH] Eliminate duplicate hasnulls bit testing in index tuple access, and clean up itup.h a little bit. --- src/backend/access/common/indextuple.c | 9 ++--- src/include/access/ibit.h | 32 --------------- src/include/access/itup.h | 56 +++++++++++++------------- 3 files changed, 33 insertions(+), 64 deletions(-) delete mode 100644 src/include/access/ibit.h diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c index e52f61a2ad..e5d19765e7 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 f2881fe982..0000000000 --- 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 68b7d94cf3..614ab44036 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 \ -- 2.40.0