*
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
 PageGetTempPage(Page page, Size specialSize)
 {
    Size        pageSize;
-   Size        size;
    Page        temp;
    PageHeader  thdr;
 
    /* 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;
 }
 
 
  *
  * 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 $
  *--------------------------------------------------------------------------
  */
 
 /*
  * 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
 
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
 /*
  * 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