Структура кортежа PostgreSQL
Кортежи имеют два типа: обычные кортежи данных и TOAST кортежи. Данный подраздел посвящен исключительно обычным кортежам.
Кортеж состоит из трех частей: заголовка (HeapTupleHeaderData) размером 23 байта, битовой маски NULL (null bitmap) и значений атрибутов.
Примечание:
Заголовок (HeapTupleHeaderData) подробно описан в src/include/access/htup_details.h.
Заголовок содержит 7 частей:
t_xmin - идентификатор транзакции (XID), создавшей кортеж;
t_xmax - XID транзакции, удалившей кортеж;
t_cid - идентификатор команды внутри транзакции (CID), создавшей и/или удалившей кортеж;
t_ctid [— ItemPointer на более новую версию кортежа;
t_infomask2 — 11 бит занимает количество атрибутов в кортеже, остальные биты используются под флаги;
t_infomask— флаги. Например, если в кортеже содержатся NULL-элементы, проставляется флаг HEAP_HASNULL
t_hoff— размер заголовка вместе с null bitmap и с учетом выравнивания;
Первые три поля необходимы для реализации MVCC. По ним СУБД может понять, видит ли транзакция заданный кортеж или не видит.
Например, предположим, что мы выполняем три команды INSERT в рамках одной транзакции: 'BEGIN; INSERT; INSERT; INSERT; COMMIT;'. Если первая команда вставит этот кортеж, t_cid будет установлен в 0. Если вторая команда вставит этот кортеж, t_cid будет установлен в 1, и так далее.
HeapTupleHeaderData
typedef struct HeapTupleFields
{
TransactionId t_xmin; /* inserting xact ID */
TransactionId t_xmax; /* deleting or locking xact ID */
union
{
CommandId t_cid; /* inserting or deleting command ID, or both */
TransactionId t_xvac; /* old-style VACUUM FULL xact ID */
} t_field3;
} HeapTupleFields;
typedef struct DatumTupleFields
{
int32 datum_len_; /* varlena header (do not touch directly!) */
int32 datum_typmod; /* -1, or identifier of a record type */
Oid datum_typeid; /* composite type OID, or RECORDOID */
/*
* Note: field ordering is chosen with thought that Oid might someday
* widen to 64 bits.
*/
} DatumTupleFields;
typedef struct HeapTupleHeaderData
{
union
{
HeapTupleFields t_heap;
DatumTupleFields t_datum;
} t_choice;
ItemPointerData t_ctid; /* current TID of this or newer tuple */
/* Fields below here must match MinimalTupleData! */
uint16 t_infomask2; /* number of attributes + various flags */
uint16 t_infomask; /* various flag bits, see below */
uint8 t_hoff; /* sizeof header incl. bitmap, padding */
/* ^ - 23 bytes - ^ */
bits8 t_bits[1]; /* bitmap of NULLs -- VARIABLE LENGTH */
/* MORE DATA FOLLOWS AT END OF STRUCT */
} HeapTupleHeaderData;
typedef HeapTupleHeaderData *HeapTupleHeader;




