]> granicus.if.org Git - postgresql/commitdiff
This patch, which is built upon the "HeapTupleHeader accessor macros"
authorBruce Momjian <bruce@momjian.us>
Tue, 2 Jul 2002 05:46:14 +0000 (05:46 +0000)
committerBruce Momjian <bruce@momjian.us>
Tue, 2 Jul 2002 05:46:14 +0000 (05:46 +0000)
patch from 2002-06-10, is supposed to reduce the heap tuple header size
by four bytes on most architectures.  Of course it changes the on-disk
tuple format and therefore requires initdb.

This overlays cmin/cmax/xmax fields into only two fields.

Manfred Koizar

src/backend/access/heap/heapam.c
src/include/access/htup.h
src/include/catalog/catversion.h

index ada50e2730f26d39ad29a852289baac3b41b8c79..ebafcffd28158d7ed8bf0a3adc378843033ceefd 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.139 2002/06/20 20:29:24 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.140 2002/07/02 05:46:14 momjian Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -2204,7 +2204,7 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
                htup->t_infomask = HEAP_XMAX_INVALID | xlhdr.mask;
                HeapTupleHeaderSetXmin(htup, record->xl_xid);
                HeapTupleHeaderSetCmin(htup, FirstCommandId);
-               HeapTupleHeaderSetXmax(htup, InvalidTransactionId);
+               HeapTupleHeaderSetXmaxInvalid(htup);
                HeapTupleHeaderSetCmax(htup, FirstCommandId);
 
                offnum = PageAddItem(page, (Item) htup, newlen, offnum,
index b749fffb8c02c11f97a91695fcced762cb02c172..00bd69b89d81f2b9e42a76b5ec281d5c753c8dc8 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: htup.h,v 1.54 2002/06/20 20:29:43 momjian Exp $
+ * $Id: htup.h,v 1.55 2002/07/02 05:46:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
  * Also note that we omit the nulls bitmap if t_infomask shows that there
  * are no nulls in the tuple.
  */
+/*
+** We store five "virtual" fields Xmin, Cmin, Xmax, Cmax, and Xvac
+** in three physical fields t_xmin, t_cid, t_xmax:
+** CommandId     Cmin;         insert CID stamp
+** CommandId     Cmax;         delete CommandId stamp
+** TransactionId Xmin;         insert XID stamp
+** TransactionId Xmax;         delete XID stamp
+** TransactionId Xvac;         used by VACCUUM
+**
+** This assumes, that a CommandId can be stored in a TransactionId.
+*/
 typedef struct HeapTupleHeaderData
 {
        Oid                     t_oid;                  /* OID of this tuple -- 4 bytes */
 
-       CommandId       t_cmin;                 /* insert CID stamp -- 4 bytes each */
-       CommandId       t_cmax;                 /* delete CommandId stamp */
-
-       TransactionId t_xmin;           /* insert XID stamp -- 4 bytes each */
-       TransactionId t_xmax;           /* delete XID stamp */
+       TransactionId t_xmin;           /* Xmin -- 4 bytes each */
+       TransactionId t_cid;            /* Cmin, Cmax, Xvac */
+       TransactionId t_xmax;           /* Xmax, Cmax */
 
        ItemPointerData t_ctid;         /* current TID of this or newer tuple */
 
@@ -75,7 +84,7 @@ typedef struct HeapTupleHeaderData
 
        uint8           t_hoff;                 /* sizeof header incl. bitmap, padding */
 
-       /* ^ - 31 bytes - ^ */
+       /* ^ - 27 bytes - ^ */
 
        bits8           t_bits[1];              /* bitmap of NULLs -- VARIABLE LENGTH */
 
@@ -96,6 +105,8 @@ typedef HeapTupleHeaderData *HeapTupleHeader;
                                                                                 * attribute(s) */
 #define HEAP_HASEXTENDED               0x000C  /* the two above combined */
 
+#define HEAP_XMIN_IS_XMAX              0x0040  /* created and deleted in the */
+                                                                               /* same transaction */
 #define HEAP_XMAX_UNLOGGED             0x0080  /* to lock tuple for update */
                                                                                /* without logging */
 #define HEAP_XMIN_COMMITTED            0x0100  /* t_xmin committed */
@@ -108,6 +119,7 @@ typedef HeapTupleHeaderData *HeapTupleHeader;
                                                                                 * vacuum */
 #define HEAP_MOVED_IN                  0x8000  /* moved from another place by
                                                                                 * vacuum */
+#define HEAP_MOVED (HEAP_MOVED_OFF | HEAP_MOVED_IN)
 
 #define HEAP_XACT_MASK                 0xFFF0  /* visibility-related bits */
 
@@ -116,53 +128,100 @@ typedef HeapTupleHeaderData *HeapTupleHeader;
 /* HeapTupleHeader accessor macros */
 
 #define HeapTupleHeaderGetXmin(tup) \
-       ((tup)->t_xmin)
+( \
+       (tup)->t_xmin \
+)
 
 #define HeapTupleHeaderGetXmax(tup) \
-       ((tup)->t_xmax)
+( \
+       ((tup)->t_infomask & HEAP_XMIN_IS_XMAX) ? \
+               (tup)->t_xmin \
+       : \
+               (tup)->t_xmax \
+)
 
-/* no AssertMacro, because this is read as a system-defined attribute also */
+/* no AssertMacro, because this is read as a system-defined attribute */
 #define HeapTupleHeaderGetCmin(tup) \
 ( \
-       (tup)->t_cmin \
+       ((tup)->t_infomask & HEAP_MOVED) ? \
+               FirstCommandId \
+       : \
+       ( \
+               ((tup)->t_infomask & (HEAP_XMIN_IS_XMAX | HEAP_XMAX_INVALID)) ? \
+                       (CommandId) (tup)->t_cid \
+               : \
+                       FirstCommandId \
+       ) \
 )
 
 #define HeapTupleHeaderGetCmax(tup) \
-       ((tup)->t_cmax)
+( \
+       ((tup)->t_infomask & HEAP_MOVED) ? \
+               FirstCommandId \
+       : \
+       ( \
+               ((tup)->t_infomask & (HEAP_XMIN_IS_XMAX | HEAP_XMAX_INVALID)) ? \
+                       (CommandId) (tup)->t_xmax \
+               : \
+                       (CommandId) (tup)->t_cid \
+       ) \
+)
 
 #define HeapTupleHeaderGetXvac(tup) \
 ( \
-       AssertMacro((tup)->t_infomask & (HEAP_MOVED_IN | HEAP_MOVED_OFF)), \
-       (TransactionId) (tup)->t_cmin \
+       AssertMacro((tup)->t_infomask & HEAP_MOVED), \
+       (tup)->t_cid \
 )
 
 
 #define HeapTupleHeaderSetXmin(tup, xid) \
-       (TransactionIdStore((xid), &(tup)->t_xmin))
+( \
+       TransactionIdStore((xid), &(tup)->t_xmin) \
+)
 
 #define HeapTupleHeaderSetXminInvalid(tup) \
-       (StoreInvalidTransactionId(&(tup)->t_xmin))
+do { \
+       (tup)->t_infomask &= ~HEAP_XMIN_IS_XMAX; \
+       StoreInvalidTransactionId(&(tup)->t_xmin); \
+} while (0)
 
 #define HeapTupleHeaderSetXmax(tup, xid) \
-       (TransactionIdStore((xid), &(tup)->t_xmax))
+do { \
+       if (TransactionIdEquals((tup)->t_xmin, (xid))) \
+               (tup)->t_infomask |= HEAP_XMIN_IS_XMAX; \
+       else \
+       { \
+               (tup)->t_infomask &= ~HEAP_XMIN_IS_XMAX; \
+               TransactionIdStore((xid), &(tup)->t_xmax); \
+       } \
+} while (0)
 
 #define HeapTupleHeaderSetXmaxInvalid(tup) \
-       (StoreInvalidTransactionId(&(tup)->t_xmax))
+do { \
+       (tup)->t_infomask &= ~HEAP_XMIN_IS_XMAX; \
+       StoreInvalidTransactionId(&(tup)->t_xmax); \
+} while (0)
 
 #define HeapTupleHeaderSetCmin(tup, cid) \
-( \
-       AssertMacro(!((tup)->t_infomask & (HEAP_MOVED_IN | HEAP_MOVED_OFF))), \
-       (tup)->t_cmin = (cid) \
-)
+do { \
+       Assert(!((tup)->t_infomask & HEAP_MOVED)); \
+       TransactionIdStore((TransactionId) (cid), &(tup)->t_cid); \
+} while (0)
 
 #define HeapTupleHeaderSetCmax(tup, cid) \
-       ((tup)->t_cmax = (cid))
+do { \
+       Assert(!((tup)->t_infomask & HEAP_MOVED)); \
+       if ((tup)->t_infomask & HEAP_XMIN_IS_XMAX) \
+               TransactionIdStore((TransactionId) (cid), &(tup)->t_xmax); \
+       else \
+               TransactionIdStore((TransactionId) (cid), &(tup)->t_cid); \
+} while (0)
 
 #define HeapTupleHeaderSetXvac(tup, xid) \
-( \
-       AssertMacro((tup)->t_infomask & (HEAP_MOVED_IN | HEAP_MOVED_OFF)), \
-       TransactionIdStore((xid), (TransactionId *) &((tup)->t_cmin)) \
-)
+do { \
+       Assert((tup)->t_infomask & HEAP_MOVED); \
+       TransactionIdStore((xid), &(tup)->t_cid); \
+} while (0)
 
 
 /*
index 8f4f491473cf9844fe8961dc9be1a6036ae83329..d4d04d6db96d185432b6fdb75659093181a92af9 100644 (file)
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: catversion.h,v 1.136 2002/06/20 20:29:43 momjian Exp $
+ * $Id: catversion.h,v 1.137 2002/07/02 05:46:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     200206151
+#define CATALOG_VERSION_NO     200207021
 
 #endif