Commit 617dd33b authored by Tom Lane's avatar Tom Lane

Eliminate duplicate hasnulls bit testing in index tuple access, and

clean up itup.h a little bit.
parent 926e8a00
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -137,7 +137,7 @@ index_form_tuple(TupleDesc tupleDescriptor,
isnull, isnull,
(char *) tp + hoff, (char *) tp + hoff,
&tupmask, &tupmask,
(hasnull ? (bits8 *) tp + sizeof(*tuple) : NULL)); (hasnull ? (bits8 *) tp + sizeof(IndexTupleData) : NULL));
#ifdef TOAST_INDEX_HACK #ifdef TOAST_INDEX_HACK
for (i = 0; i < numberOfAttributes; i++) for (i = 0; i < numberOfAttributes; i++)
...@@ -230,8 +230,7 @@ nocache_index_getattr(IndexTuple tup, ...@@ -230,8 +230,7 @@ nocache_index_getattr(IndexTuple tup,
*isnull = false; *isnull = false;
#endif #endif
data_off = IndexTupleHasMinHeader(tup) ? sizeof *tup : data_off = IndexInfoFindDataOffset(tup->t_info);
IndexInfoFindDataOffset(tup->t_info);
attnum--; attnum--;
...@@ -256,7 +255,7 @@ nocache_index_getattr(IndexTuple tup, ...@@ -256,7 +255,7 @@ nocache_index_getattr(IndexTuple tup,
*/ */
/* XXX "knows" t_bits are just after fixed tuple header! */ /* 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 #ifdef IN_MACRO
/* This is handled in the macro */ /* This is handled in the macro */
......
/*-------------------------------------------------------------------------
*
* 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 */
...@@ -7,19 +7,31 @@ ...@@ -7,19 +7,31 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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 #ifndef ITUP_H
#define ITUP_H #define ITUP_H
#include "access/ibit.h"
#include "access/tupdesc.h" #include "access/tupdesc.h"
#include "access/tupmacs.h" #include "access/tupmacs.h"
#include "storage/itemptr.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 typedef struct IndexTupleData
{ {
ItemPointerData t_tid; /* reference TID to heap tuple */ ItemPointerData t_tid; /* reference TID to heap tuple */
...@@ -36,44 +48,40 @@ typedef struct IndexTupleData ...@@ -36,44 +48,40 @@ typedef struct IndexTupleData
unsigned short t_info; /* various info about tuple */ 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 */ } IndexTupleData; /* MORE DATA FOLLOWS AT END OF STRUCT */
typedef IndexTupleData *IndexTuple; 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_SIZE_MASK 0x1FFF
#define INDEX_NULL_MASK 0x8000 /* bit 0x2000 is not used at present */
#define INDEX_VAR_MASK 0x4000 #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 IndexTupleSize(itup) ((Size) (((IndexTuple) (itup))->t_info & INDEX_SIZE_MASK))
#define IndexTupleDSize(itup) ((Size) ((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 IndexTupleHasNulls(itup) ((((IndexTuple) (itup))->t_info & INDEX_NULL_MASK))
#define IndexTupleHasVarwidths(itup) ((((IndexTuple) (itup))->t_info & INDEX_VAR_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 * Takes an infomask as argument (primarily because this needs to be usable
* at index_form_tuple time so enough space is allocated). * at index_form_tuple time so enough space is allocated).
*
* Change me if adding an attribute to IndexTuples!!!!!!!!!!!
*/ */
#define IndexInfoFindDataOffset(t_info) \ #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; ...@@ -85,7 +93,7 @@ typedef IndexTupleData *IndexTuple;
* index_getattr * index_getattr
* *
* This gets called many times, so we macro the cacheable and NULL * 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; ...@@ -98,13 +106,7 @@ typedef IndexTupleData *IndexTuple;
(tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ? \ (tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ? \
( \ ( \
fetchatt((tupleDesc)->attrs[(attnum)-1], \ fetchatt((tupleDesc)->attrs[(attnum)-1], \
(char *) (tup) + \ (char *) (tup) + IndexInfoFindDataOffset((tup)->t_info) \
( \
IndexTupleHasMinHeader(tup) ? \
sizeof (*(tup)) \
: \
IndexInfoFindDataOffset((tup)->t_info) \
) \
+ (tupleDesc)->attrs[(attnum)-1]->attcacheoff) \ + (tupleDesc)->attrs[(attnum)-1]->attcacheoff) \
) \ ) \
: \ : \
...@@ -112,7 +114,7 @@ typedef IndexTupleData *IndexTuple; ...@@ -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, \ *(isnull) = true, \
(Datum)NULL \ (Datum)NULL \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment