aboutsummaryrefslogtreecommitdiff
path: root/src/include/storage/bufpage.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/storage/bufpage.h')
-rw-r--r--src/include/storage/bufpage.h60
1 files changed, 46 insertions, 14 deletions
diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
index a9fc0f7a2a2..7a6080a1bcd 100644
--- a/src/include/storage/bufpage.h
+++ b/src/include/storage/bufpage.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: bufpage.h,v 1.51 2002/08/06 19:37:10 tgl Exp $
+ * $Id: bufpage.h,v 1.52 2002/09/02 01:05:06 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -97,12 +97,20 @@ typedef uint16 LocationIndex;
* pd_lower - offset to start of free space.
* pd_upper - offset to end of free space.
* pd_special - offset to start of special space.
- * pd_pagesize - size in bytes.
- * Minimum possible page size is perhaps 64B to fit
- * page header, opaque space and a minimal tuple;
- * of course, in reality you want it much bigger.
- * On the high end, we can only support pages up
- * to 32KB because lp_off/lp_len are 15 bits.
+ * pd_pagesize_version - size in bytes and page layout version number.
+ *
+ * The page version number and page size are packed together into a single
+ * uint16 field. This is for historical reasons: before PostgreSQL 7.3,
+ * there was no concept of a page version number, and doing it this way
+ * lets us pretend that pre-7.3 databases have page version number zero.
+ * We constrain page sizes to be multiples of 256, leaving the low eight
+ * bytes available for a version number.
+ *
+ * Minimum possible page size is perhaps 64B to fit page header, opaque space
+ * and a minimal tuple; of course, in reality you want it much bigger, so
+ * the constraint on pagesize mod 256 is not an important restriction.
+ * On the high end, we can only support pages up to 32KB because lp_off/lp_len
+ * are 15 bits.
*/
typedef struct PageHeaderData
{
@@ -116,12 +124,18 @@ typedef struct PageHeaderData
LocationIndex pd_lower; /* offset to start of free space */
LocationIndex pd_upper; /* offset to end of free space */
LocationIndex pd_special; /* offset to start of special space */
- uint16 pd_pagesize;
+ uint16 pd_pagesize_version;
ItemIdData pd_linp[1]; /* beginning of line pointer array */
} PageHeaderData;
typedef PageHeaderData *PageHeader;
+/*
+ * Page layout version number 0 is for pre-7.3 Postgres releases. The
+ * current version number is 1, denoting a new HeapTupleHeader layout.
+ */
+#define PG_PAGE_LAYOUT_VERSION 1
+
/* ----------------------------------------------------------------
* page support macros
@@ -178,7 +192,7 @@ typedef PageHeaderData *PageHeader;
((char *) (&((PageHeader) (page))->pd_linp[0]))
/* ----------------
- * macros to access opaque space
+ * macros to access page size info
* ----------------
*/
@@ -203,14 +217,32 @@ typedef PageHeaderData *PageHeader;
* however, it can be called on a page for which there is no buffer.
*/
#define PageGetPageSize(page) \
- ((Size) ((PageHeader) (page))->pd_pagesize)
+ ((Size) (((PageHeader) (page))->pd_pagesize_version & (uint16) 0xFF00))
/*
- * PageSetPageSize
- * Sets the page size of a page.
+ * PageGetPageLayoutVersion
+ * Returns the page layout version of a page.
+ *
+ * this can only be called on a formatted page (unlike
+ * BufferGetPageSize, which can be called on an unformatted page).
+ * however, it can be called on a page for which there is no buffer.
*/
-#define PageSetPageSize(page, size) \
- (((PageHeader) (page))->pd_pagesize = (size))
+#define PageGetPageLayoutVersion(page) \
+ (((PageHeader) (page))->pd_pagesize_version & 0x00FF)
+
+/*
+ * PageSetPageSizeAndVersion
+ * Sets the page size and page layout version number of a page.
+ *
+ * We could support setting these two values separately, but there's
+ * no real need for it at the moment.
+ */
+#define PageSetPageSizeAndVersion(page, size, version) \
+( \
+ AssertMacro(((size) & 0xFF00) == (size)), \
+ AssertMacro(((version) & 0x00FF) == (version)), \
+ ((PageHeader) (page))->pd_pagesize_version = (size) | (version) \
+)
/* ----------------
* page special data macros