1
0
mirror of https://github.com/postgres/postgres.git synced 2025-10-25 13:17:41 +03:00

Inline fastgetattr and others so data access does not use function

calls.
This commit is contained in:
Bruce Momjian
1998-01-31 04:39:26 +00:00
parent 2df6bba3ca
commit 726c3854cb
35 changed files with 350 additions and 215 deletions

View File

@@ -6,15 +6,18 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: itup.h,v 1.9 1998/01/24 22:48:06 momjian Exp $
* $Id: itup.h,v 1.10 1998/01/31 04:39:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#ifndef ITUP_H
#define ITUP_H
#include <access/ibit.h>
#include <access/tupmacs.h>
#include <access/tupdesc.h>
#include <storage/itemptr.h>
#include <utils/memutils.h>
#define MaxIndexAttributeNumber 7
@@ -87,12 +90,87 @@ typedef struct PredInfo
#define IndexTupleHasMinHeader(itup) (IndexTupleNoNulls(itup))
/*
* Takes an infomask as argument (primarily because this needs to be usable
* at index_formtuple 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)) ? \
( \
(Size)sizeof(IndexTupleData) \
) \
: \
( \
(Size)DOUBLEALIGN(sizeof(IndexTupleData) + sizeof(IndexAttributeBitMapData)) \
) \
)
/* ----------------
* index_getattr
*
* This gets called many times, so we macro the cacheable and NULL
* lookups, and call noncachegetattr() for the rest.
*
* ----------------
*/
#define index_getattr(tup, attnum, tupleDesc, isnull) \
( \
AssertMacro(PointerIsValid(isnull) && (attnum) > 0) ? \
( \
*(isnull) = false, \
IndexTupleNoNulls(tup) ? \
( \
((tupleDesc)->attrs[(attnum)-1]->attcacheoff > 0) ? \
( \
(Datum)fetchatt(&((tupleDesc)->attrs[(attnum)-1]), \
(char *) (tup) + \
(IndexTupleHasMinHeader(tup) ? sizeof (*(tup)) : \
IndexInfoFindDataOffset((tup)->t_info)) + \
(tupleDesc)->attrs[(attnum)-1]->attcacheoff) \
) \
: \
( \
((attnum)-1 == 0) ? \
( \
(Datum)fetchatt(&((tupleDesc)->attrs[0]), \
(char *) (tup) + \
(IndexTupleHasMinHeader(tup) ? sizeof (*(tup)) : \
IndexInfoFindDataOffset((tup)->t_info))) \
) \
: \
( \
nocache_index_getattr((tup), (attnum), (tupleDesc), (isnull)) \
) \
) \
) \
: \
( \
(att_isnull((attnum)-1, (char *)(tup) + sizeof(*(tup)))) ? \
( \
*(isnull) = true, \
(Datum)NULL \
) \
: \
( \
nocache_index_getattr((tup), (attnum), (tupleDesc), (isnull)) \
) \
) \
) \
: \
( \
(Datum)NULL \
) \
)
/* indextuple.h */
extern IndexTuple index_formtuple(TupleDesc tupleDescriptor,
Datum value[], char null[]);
extern Datum index_getattr(IndexTuple tuple, AttrNumber attNum,
TupleDesc tupDesc, bool *isNullOutP);
extern Datum nocache_index_getattr(IndexTuple tup, int attnum,
TupleDesc tupleDesc, bool *isnull);
extern RetrieveIndexResult FormRetrieveIndexResult(ItemPointer indexItemPointer,
ItemPointer heapItemPointer);
extern void CopyIndexTuple(IndexTuple source, IndexTuple *target);