]> granicus.if.org Git - postgresql/commitdiff
Change the PageGetContents() macro to guarantee its result is maxalign'd,
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 13 Jul 2008 21:50:04 +0000 (21:50 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 13 Jul 2008 21:50:04 +0000 (21:50 +0000)
thereby forestalling any problems with alignment of the data structure placed
there.  Since SizeOfPageHeaderData is maxalign'd anyway in 8.3 and HEAD, this
does not actually change anything right now, but it is foreseeable that the
header size will change again someday.  I had to fix a couple of places that
were assuming that the content offset is just SizeOfPageHeaderData rather than
MAXALIGN(SizeOfPageHeaderData).  Per discussion of Zdenek's page-macros patch.

src/backend/storage/page/bufpage.c
src/include/access/gin.h
src/include/storage/bufpage.h

index c4af3b193fca00a71a472de427b54254aa0461c3..abfc569399ebd1990094ae00a869ac78f52e33b5 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/storage/page/bufpage.c,v 1.79 2008/05/13 15:44:08 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/storage/page/bufpage.c,v 1.80 2008/07/13 21:50:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -260,7 +260,6 @@ Page
 PageGetTempPage(Page page, Size specialSize)
 {
        Size            pageSize;
-       Size            size;
        Page            temp;
        PageHeader      thdr;
 
@@ -271,15 +270,13 @@ PageGetTempPage(Page page, Size specialSize)
        /* copy old page in */
        memcpy(temp, page, pageSize);
 
-       /* clear out the middle */
-       size = pageSize - SizeOfPageHeaderData;
-       size -= MAXALIGN(specialSize);
-       MemSet(PageGetContents(thdr), 0, size);
-
        /* set high, low water marks */
        thdr->pd_lower = SizeOfPageHeaderData;
        thdr->pd_upper = pageSize - MAXALIGN(specialSize);
 
+       /* clear out the middle */
+       MemSet((char *) temp + thdr->pd_lower, 0, thdr->pd_upper - thdr->pd_lower);
+
        return temp;
 }
 
index f6a786d3db0765fa301cd50d916e424abd4d1f67..de29cff86ba5333daae20beb52b741f285e1352e 100644 (file)
@@ -4,7 +4,7 @@
  *
  *     Copyright (c) 2006-2008, PostgreSQL Global Development Group
  *
- *     $PostgreSQL: pgsql/src/include/access/gin.h,v 1.23 2008/07/11 21:06:29 tgl Exp $
+ *     $PostgreSQL: pgsql/src/include/access/gin.h,v 1.24 2008/07/13 21:50:04 tgl Exp $
  *--------------------------------------------------------------------------
  */
 
@@ -121,17 +121,19 @@ typedef struct
 /*
  * Data (posting tree) pages
  */
+#define GinDataPageGetRightBound(page) ((ItemPointer) PageGetContents(page))
 #define GinDataPageGetData(page)       \
-       (PageGetContents(page)+MAXALIGN(sizeof(ItemPointerData)))
-#define GinDataPageGetRightBound(page) ((ItemPointer)PageGetContents(page))
-#define GinSizeOfItem(page) ( (GinPageIsLeaf(page)) ? sizeof(ItemPointerData) : sizeof(PostingItem) )
-#define GinDataPageGetItem(page,i) ( GinDataPageGetData(page) + ((i)-1) * GinSizeOfItem(page) )
+       (PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData)))
+#define GinSizeOfItem(page)    \
+       (GinPageIsLeaf(page) ? sizeof(ItemPointerData) : sizeof(PostingItem))
+#define GinDataPageGetItem(page,i)     \
+       (GinDataPageGetData(page) + ((i)-1) * GinSizeOfItem(page))
 
 #define GinDataPageGetFreeSpace(page)  \
-       ( BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(GinPageOpaqueData)) - \
-               GinPageGetOpaque(page)->maxoff * GinSizeOfItem(page) - \
-               MAXALIGN(sizeof(ItemPointerData)))
-
+       (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
+        - MAXALIGN(sizeof(ItemPointerData)) \
+        - GinPageGetOpaque(page)->maxoff * GinSizeOfItem(page) \
+        - MAXALIGN(sizeof(GinPageOpaqueData)))
 
 
 #define GIN_UNLOCK     BUFFER_LOCK_UNLOCK
index a52fb62a9fb46c9cdd28a9afdb46665f8fbc0db7..9a09121a697c172df524c71855ed25d15a8122b0 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/bufpage.h,v 1.81 2008/06/08 22:00:48 alvherre Exp $
+ * $PostgreSQL: pgsql/src/include/storage/bufpage.h,v 1.82 2008/07/13 21:50:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -206,9 +206,13 @@ typedef PageHeaderData *PageHeader;
 /*
  * PageGetContents
  *             To be used in case the page does not contain item pointers.
+ *
+ * Note: prior to 8.3 this was not guaranteed to yield a MAXALIGN'd result.
+ * Now it is.  Beware of old code that might think the offset to the contents
+ * is just SizeOfPageHeaderData rather than MAXALIGN(SizeOfPageHeaderData).
  */
 #define PageGetContents(page) \
-       ((char *) (&((PageHeader) (page))->pd_linp[0]))
+       ((char *) (page) + MAXALIGN(SizeOfPageHeaderData))
 
 /* ----------------
  *             macros to access page size info