1/*-------------------------------------------------------------------------
4 * POSTGRES disk item pointer definitions.
7 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
10 * src/include/storage/itemptr.h
12 *-------------------------------------------------------------------------
23 * This is a pointer to an item within a disk page of a known file
24 * (for example, a cross-link from an index to its parent table).
25 * ip_blkid tells us which block, ip_posid tells us which entry in
26 * the linp (ItemIdData) array we want.
28 * Note: because there is an item pointer in each tuple header and index
29 * tuple header on disk, it's very important not to waste space with
30 * structure padding bytes. The struct is designed to be six bytes long
31 * (it contains three int16 fields) but a few compilers will pad it to
32 * eight bytes unless coerced. We apply appropriate persuasion where
33 * possible. If your compiler can't be made to play along, you'll waste
42/* If compiler understands packed and aligned pragmas, use those */
43#if defined(pg_attribute_packed) && defined(pg_attribute_aligned)
52 * special values used in heap tuples (t_ctid)
57 * If a heap tuple holds a speculative insertion token rather than a real
58 * TID, ip_posid is set to SpecTokenOffsetNumber, and the token is stored in
59 * ip_blkid. SpecTokenOffsetNumber must be higher than MaxOffsetNumber, so
60 * that it can be distinguished from a valid offset number in a regular item
63 #define SpecTokenOffsetNumber 0xfffe
66 * When a tuple is moved to a different partition by UPDATE, the t_ctid of
67 * the old tuple version is set to this magic value.
69 #define MovedPartitionsOffsetNumber 0xfffd
70 #define MovedPartitionsBlockNumber InvalidBlockNumber
80 * True iff the disk item pointer is not NULL.
85 return pointer && pointer->
ip_posid != 0;
89 * ItemPointerGetBlockNumberNoCheck
90 * Returns the block number of a disk item pointer.
99 * ItemPointerGetBlockNumber
100 * As above, but verifies that the item pointer looks valid.
110 * ItemPointerGetOffsetNumberNoCheck
111 * Returns the offset number of a disk item pointer.
120 * ItemPointerGetOffsetNumber
121 * As above, but verifies that the item pointer looks valid.
132 * Sets a disk item pointer to the specified block and offset.
143 * ItemPointerSetBlockNumber
144 * Sets a disk item pointer to the specified block.
154 * ItemPointerSetOffsetNumber
155 * Sets a disk item pointer to the specified offset.
166 * Copies the contents of one disk item pointer to another.
168 * Should there ever be padding in an ItemPointer this would need to be handled
169 * differently as it's used as hash key.
176 *toPointer = *fromPointer;
180 * ItemPointerSetInvalid
181 * Sets a disk item pointer to be invalid.
192 * ItemPointerIndicatesMovedPartitions
193 * True iff the block number indicates the tuple has moved to another
205 * ItemPointerSetMovedPartitions
206 * Indicate that the item referenced by the itempointer has moved into a
207 * different partition.
226 * Datum conversion functions
242 #define PG_GETARG_ITEMPOINTER(n) DatumGetItemPointer(PG_GETARG_DATUM(n))
243 #define PG_RETURN_ITEMPOINTER(x) return ItemPointerGetDatum(x)
245#endif /* ITEMPTR_H */
#define InvalidBlockNumber
static void BlockIdSet(BlockIdData *blockId, BlockNumber blockNumber)
static BlockNumber BlockIdGetBlockNumber(const BlockIdData *blockId)
struct pg_attribute_aligned(8) pg_atomic_uint64
Assert(PointerIsAligned(start, uint64))
void ItemPointerDec(ItemPointer pointer)
static void ItemPointerSet(ItemPointerData *pointer, BlockNumber blockNumber, OffsetNumber offNum)
static void ItemPointerSetInvalid(ItemPointerData *pointer)
static Datum ItemPointerGetDatum(const ItemPointerData *X)
static void ItemPointerSetOffsetNumber(ItemPointerData *pointer, OffsetNumber offsetNumber)
static void ItemPointerSetBlockNumber(ItemPointerData *pointer, BlockNumber blockNumber)
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
static bool ItemPointerIndicatesMovedPartitions(const ItemPointerData *pointer)
#define MovedPartitionsOffsetNumber
static void ItemPointerSetMovedPartitions(ItemPointerData *pointer)
static OffsetNumber ItemPointerGetOffsetNumberNoCheck(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumberNoCheck(const ItemPointerData *pointer)
void ItemPointerInc(ItemPointer pointer)
ItemPointerData * ItemPointer
int32 ItemPointerCompare(ItemPointer arg1, ItemPointer arg2)
struct ItemPointerData ItemPointerData
#define MovedPartitionsBlockNumber
bool ItemPointerEquals(ItemPointer pointer1, ItemPointer pointer2)
static ItemPointer DatumGetItemPointer(Datum X)
static void ItemPointerCopy(const ItemPointerData *fromPointer, ItemPointerData *toPointer)
static bool ItemPointerIsValid(const ItemPointerData *pointer)
#define InvalidOffsetNumber
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)