PostgreSQL infomask/infomask2 学习记录

原文链接: https://my.oschina.net/zaclu/blog/1796831

1. infomask

/* 元组包含NULL值字段 */
#define HEAP_HASNULL			0x0001	/* has null attribute(s) */
/* 元组包含可变长度的字段 */
#define HEAP_HASVARWIDTH		0x0002	/* has variable-width attribute(s)  */
/* 元组包含外部存储的字段 */
#define HEAP_HASEXTERNAL		0x0004	/* has external stored attribute(s) */

/* 由函数 heap_fill_tuple 赋值 */
/* 元组包含OID系统字段 */
#define HEAP_HASOID				0x0008	/* has an object-id field */

/* 由函数 heap_form_tuple, heap_form_minimal_tuple 赋值 */
/*
 * 元组的t_cid是组合command id
 * 这个标记,常用来标记本事务内的老记录。具体可参看函数:heap_delete, heap_update
 */
#define HEAP_COMBOCID			0x0020	/* t_cid is a combo cid */
/* 元组的xmax用来标志key-shared锁拥有者 */
#define HEAP_XMAX_KEYSHR_LOCK	0x0010	/* xmax is a key-shared locker */
/* 元组的xmax用来标志独占锁拥有者 */
#define HEAP_XMAX_EXCL_LOCK		0x0040	/* xmax is exclusive locker */
/* 元组的xmax如果有效,仅仅是个锁拥有者 */
#define HEAP_XMAX_LOCK_ONLY		0x0080	/* xmax, if valid, is only a locker */
 /* 元组的xmax用来标记共享锁拥有者,xmax is a shared locker */
#define HEAP_XMAX_SHR_LOCK	(HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)

#define HEAP_LOCK_MASK	(HEAP_XMAX_SHR_LOCK | HEAP_XMAX_EXCL_LOCK | \
						 HEAP_XMAX_KEYSHR_LOCK)

/* ------------------------------------------------------------------
 * 通过以下代码,可以看出以上关于锁的infomask,是在哪种情况下需要赋值的
 * ------------------------------------------------------------------ */

/*
 * Possible lock modes for a tuple.
 */
typedef enum LockTupleMode
{
	/* SELECT FOR KEY SHARE */
	LockTupleKeyShare,
	/* SELECT FOR SHARE */
	LockTupleShare,
	/* SELECT FOR NO KEY UPDATE, and UPDATEs that don't modify key columns */
	LockTupleNoKeyExclusive,
	/* SELECT FOR UPDATE, UPDATEs that modify key columns, and DELETE */
	LockTupleExclusive
} LockTupleMode;

new_infomask |= HEAP_XMAX_LOCK_ONLY;
switch (mode)
{
    case LockTupleKeyShare:
        new_xmax = add_to_xmax;
        new_infomask |= HEAP_XMAX_KEYSHR_LOCK;
        break;
    case LockTupleShare:
        new_xmax = add_to_xmax;
        new_infomask |= HEAP_XMAX_SHR_LOCK;
        break;
    case LockTupleNoKeyExclusive:
        new_xmax = add_to_xmax;
        new_infomask |= HEAP_XMAX_EXCL_LOCK;
        break;
    case LockTupleExclusive:
        new_xmax = add_to_xmax;
        new_infomask |= HEAP_XMAX_EXCL_LOCK;
        new_infomask2 |= HEAP_KEYS_UPDATED;
        break;
    default:
        new_xmax = InvalidTransactionId;	/* silence compiler */
        elog(ERROR, "invalid lock mode");
}
/* 元组的xmin是提交的 */
#define HEAP_XMIN_COMMITTED		0x0100	/* t_xmin committed */
/* 元组的xmin是无效的或回滚的 */
#define HEAP_XMIN_INVALID		0x0200	/* t_xmin invalid/aborted */
#define HEAP_XMIN_FROZEN		(HEAP_XMIN_COMMITTED|HEAP_XMIN_INVALID)
/* 元组的xmax是提交的 */
#define HEAP_XMAX_COMMITTED		0x0400	/* t_xmax committed */
/* 元组的xmax是无效的或回滚的 */
#define HEAP_XMAX_INVALID		0x0800	/* t_xmax invalid/aborted */

/*
 * 以上infomask,通常通过clog判定。
 */
/* 没找到是怎么赋值的 */
#define HEAP_XMAX_IS_MULTI		0x1000	/* t_xmax is a MultiXactId */
/* 元组是更新版本 */
#define HEAP_UPDATED			0x2000	/* this is UPDATEd version of row */

/* 该infomask的赋值,发生在函数:heap_update */
#define HEAP_MOVED_OFF			0x4000	/* moved to another place by pre-9.0
										 * VACUUM FULL; kept for binary
										 * upgrade support */
#define HEAP_MOVED_IN			0x8000	/* moved from another place by pre-9.0
										 * VACUUM FULL; kept for binary
										 * upgrade support */
#define HEAP_MOVED (HEAP_MOVED_OFF | HEAP_MOVED_IN)

/* 以上infomask,用于9.0以前的vacuum full操作 */
#define HEAP_XACT_MASK			0xFFF0	/* visibility-related bits */

2. infomask2

/* 用11个bits表示表的字段个数 */
#define HEAP_NATTS_MASK			0x07FF	/* 11 bits for number of attributes */

/* 赋值操作见函数 HeapTupleHeaderSetNatts */

#define MaxTupleAttributeNumber 1664	/* 8 * 208 */
#define MaxHeapAttributeNumber	1600	/* 8 * 200 */
/* bits 0x1800 are available */
#define HEAP_KEYS_UPDATED		0x2000	/* tuple was updated and key cols
										 * modified, or tuple deleted */
/* 赋值操作见函数 compute_new_xmax_infomask */

#define HEAP_HOT_UPDATED		0x4000	/* tuple was HOT-updated */
/* 赋值操作减函数:heap_update => HeapTupleSetHotUpdated => HeapTupleHeaderSetHotUpdated */

#define HEAP_ONLY_TUPLE			0x8000	/* this is heap-only tuple */
/* 赋值操作减函数:heap_update => HeapTupleSetHeapOnly => HeapTupleHeaderSetHeapOnly */

#define HEAP2_XACT_MASK			0xE000	/* visibility-related bits */

转载于:https://my.oschina.net/zaclu/blog/1796831

你可能感兴趣的:(PostgreSQL infomask/infomask2 学习记录)