blob: 999eed7672cb5be04665eaa954696cb8f4cc18fd [file] [log] [blame]
/*-------------------------------------------------------------------------
*
* itemid.h
* Standard POSTGRES buffer page item identifier definitions.
*
*
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/include/storage/itemid.h,v 1.26 2006/03/05 15:58:59 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#ifndef ITEMID_H
#define ITEMID_H
/*
* An item pointer (also called line pointer) on a buffer page
*
* In some cases an item pointer is "in use" but does not have any associated
* storage on the page. By convention, lp_len == 0 in every item pointer
* that does not have storage, independently of its lp_flags state.
*/
typedef struct ItemIdData
{ /* line pointers */
unsigned lp_off:15, /* offset to start of tuple */
lp_flags:2, /* flags for tuple */
lp_len:15; /* length of tuple */
} ItemIdData;
typedef ItemIdData *ItemId;
/*
* lp_flags has these possible states. An UNUSED line pointer is available
* for immediate re-use, the other states are not.
*/
#define LP_UNUSED 0 /* unused (should always have lp_len=0) */
#define LP_USED 0x01 /* this line pointer is being used */
#define LP_DELETE 0x02 /* item is to be deleted */
#define LP_DEAD 3 /* dead, may or may not have storage */
#define ItemIdDeleted(itemId) \
(((itemId)->lp_flags & LP_DELETE) != 0)
#define ItemIdIsNormal(itemid) \
(((itemid)->lp_flags == LP_USED))
#define ItemIdIsDead(itemid) \
(((itemid)->lp_flags == LP_DEAD))
/*
* This bit may be passed to PageAddItem together with
* LP_USED & LP_DELETE bits to specify overwrite mode
*/
#define OverwritePageMode 0x10
/*
* Item offsets, lengths, and flags are represented by these types when
* they're not actually stored in an ItemIdData.
*/
typedef uint16 ItemOffset;
typedef uint16 ItemLength;
typedef bits16 ItemIdFlags;
/* ----------------
* support macros
* ----------------
*/
/*
* ItemIdGetLength
*/
#define ItemIdGetLength(itemId) \
((itemId)->lp_len)
/*
* ItemIdGetOffset
*/
#define ItemIdGetOffset(itemId) \
((itemId)->lp_off)
/*
* ItemIdGetFlags
*/
#define ItemIdGetFlags(itemId) \
((itemId)->lp_flags)
/*
* ItemIdIsValid
* True iff item identifier is valid.
* This is a pretty weak test, probably useful only in Asserts.
*/
#define ItemIdIsValid(itemId) PointerIsValid(itemId)
/*
* ItemIdIsUsed
* True iff disk item identifier is in use.
*
* Note:
* Assumes disk item identifier is valid.
*/
#define ItemIdIsUsed(itemId) \
( \
AssertMacro(ItemIdIsValid(itemId)), \
(bool) (((itemId)->lp_flags & LP_USED) != 0) \
)
#endif /* ITEMID_H */