Re: page macros cleanup (ver 03)

Zdenek Kotala <[email protected]>
Newsgroups gmane.comp.db.postgresql.devel.patches
Message-ID <[email protected]>
Pavan Deolasee napsal(a):
> On Fri, Jul 4, 2008 at 2:08 PM, Zdenek Kotala <[email protected]> wrote:
>>  Patch
>> modifies HashMaxItemSize. It should require reindex on all hash indexes.
>> Should we bump catalog version?
>>
> 
> Do we really need that ? Even if the new HashMaxItemSize comes out to
> be lower than the current limit (because of MAXALIGN), I don't see how
> existing hash indexes can have a larger item than the new limit.

Yeah, I performed calculation and situation is following (for MAXALIGN 4 and 8):
	
	 4		 8
Orig	8144		8144
New	8148		8144

It should be OK for all cases.

I fixed also one typo (ItemId -> ItemIdData) and new revision is attached.

		Zdenek


-- 
Zdenek Kotala              Sun Microsystems
Prague, Czech Republic     http://sun.com/postgresql


-- 
Sent via pgsql-patches mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches
page_03.patch (text/x-patch, 33.2 KB)
diff -cr pgsql.orig.da8c485e0e2a/src/backend/access/gist/gistutil.c pgsql.orig/src/backend/access/gist/gistutil.c
*** pgsql.orig.da8c485e0e2a/src/backend/access/gist/gistutil.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/access/gist/gistutil.c	pá črc  4 10:23:41 2008
***************
*** 592,599 ****
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if (((PageHeader) (page))->pd_special !=
! 		(BLCKSZ - MAXALIGN(sizeof(GISTPageOpaqueData))))
  		ereport(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
--- 592,598 ----
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if ( PageGetSpecialSize(page) != MAXALIGN(sizeof(GISTPageOpaqueData)))
  		ereport(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
diff -cr pgsql.orig.da8c485e0e2a/src/backend/access/hash/hashpage.c pgsql.orig/src/backend/access/hash/hashpage.c
*** pgsql.orig.da8c485e0e2a/src/backend/access/hash/hashpage.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/access/hash/hashpage.c	pá črc  4 10:23:41 2008
***************
*** 407,413 ****
  	for (i = _hash_log2(metap->hashm_bsize); i > 0; --i)
  	{
  		if ((1 << i) <= (metap->hashm_bsize -
! 						 (MAXALIGN(sizeof(PageHeaderData)) +
  						  MAXALIGN(sizeof(HashPageOpaqueData)))))
  			break;
  	}
--- 407,413 ----
  	for (i = _hash_log2(metap->hashm_bsize); i > 0; --i)
  	{
  		if ((1 << i) <= (metap->hashm_bsize -
! 						 (MAXALIGN(SizeOfPageHeaderData) +
  						  MAXALIGN(sizeof(HashPageOpaqueData)))))
  			break;
  	}
diff -cr pgsql.orig.da8c485e0e2a/src/backend/access/hash/hashutil.c pgsql.orig/src/backend/access/hash/hashutil.c
*** pgsql.orig.da8c485e0e2a/src/backend/access/hash/hashutil.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/access/hash/hashutil.c	pá črc  4 10:23:41 2008
***************
*** 164,171 ****
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if (((PageHeader) (page))->pd_special !=
! 		(BLCKSZ - MAXALIGN(sizeof(HashPageOpaqueData))))
  		ereport(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
--- 164,170 ----
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if ( PageGetSpecialSize(page) != MAXALIGN(sizeof(HashPageOpaqueData)))
  		ereport(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
diff -cr pgsql.orig.da8c485e0e2a/src/backend/access/heap/heapam.c pgsql.orig/src/backend/access/heap/heapam.c
*** pgsql.orig.da8c485e0e2a/src/backend/access/heap/heapam.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/access/heap/heapam.c	pá črc  4 10:23:41 2008
***************
*** 1342,1348 ****
  	ItemPointer tid = &(tuple->t_self);
  	ItemId		lp;
  	Buffer		buffer;
! 	PageHeader	dp;
  	OffsetNumber offnum;
  	bool		valid;
  
--- 1342,1348 ----
  	ItemPointer tid = &(tuple->t_self);
  	ItemId		lp;
  	Buffer		buffer;
! 	Page		page;
  	OffsetNumber offnum;
  	bool		valid;
  
***************
*** 1355,1361 ****
  	 * Need share lock on buffer to examine tuple commit status.
  	 */
  	LockBuffer(buffer, BUFFER_LOCK_SHARE);
! 	dp = (PageHeader) BufferGetPage(buffer);
  
  	/*
  	 * We'd better check for out-of-range offnum in case of VACUUM since the
--- 1355,1361 ----
  	 * Need share lock on buffer to examine tuple commit status.
  	 */
  	LockBuffer(buffer, BUFFER_LOCK_SHARE);
! 	page = BufferGetPage(buffer);
  
  	/*
  	 * We'd better check for out-of-range offnum in case of VACUUM since the
***************
*** 1362,1368 ****
  	 * TID was obtained.
  	 */
  	offnum = ItemPointerGetOffsetNumber(tid);
! 	if (offnum < FirstOffsetNumber || offnum > PageGetMaxOffsetNumber(dp))
  	{
  		LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
  		if (keep_buf)
--- 1362,1368 ----
  	 * TID was obtained.
  	 */
  	offnum = ItemPointerGetOffsetNumber(tid);
! 	if (offnum < FirstOffsetNumber || offnum > PageGetMaxOffsetNumber(page))
  	{
  		LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
  		if (keep_buf)
***************
*** 1379,1385 ****
  	/*
  	 * get the item line pointer corresponding to the requested tid
  	 */
! 	lp = PageGetItemId(dp, offnum);
  
  	/*
  	 * Must check for deleted tuple.
--- 1379,1385 ----
  	/*
  	 * get the item line pointer corresponding to the requested tid
  	 */
! 	lp = PageGetItemId(page, offnum);
  
  	/*
  	 * Must check for deleted tuple.
***************
*** 1401,1407 ****
  	/*
  	 * fill in *tuple fields
  	 */
! 	tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
  	tuple->t_len = ItemIdGetLength(lp);
  	tuple->t_tableOid = RelationGetRelid(relation);
  
--- 1401,1407 ----
  	/*
  	 * fill in *tuple fields
  	 */
! 	tuple->t_data = (HeapTupleHeader) PageGetItem(page, lp);
  	tuple->t_len = ItemIdGetLength(lp);
  	tuple->t_tableOid = RelationGetRelid(relation);
  
***************
*** 1626,1632 ****
  	for (;;)
  	{
  		Buffer		buffer;
! 		PageHeader	dp;
  		OffsetNumber offnum;
  		ItemId		lp;
  		HeapTupleData tp;
--- 1626,1632 ----
  	for (;;)
  	{
  		Buffer		buffer;
! 		Page		page;
  		OffsetNumber offnum;
  		ItemId		lp;
  		HeapTupleData tp;
***************
*** 1637,1643 ****
  		 */
  		buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(&ctid));
  		LockBuffer(buffer, BUFFER_LOCK_SHARE);
! 		dp = (PageHeader) BufferGetPage(buffer);
  
  		/*
  		 * Check for bogus item number.  This is not treated as an error
--- 1637,1643 ----
  		 */
  		buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(&ctid));
  		LockBuffer(buffer, BUFFER_LOCK_SHARE);
! 		page = BufferGetPage(buffer);
  
  		/*
  		 * Check for bogus item number.  This is not treated as an error
***************
*** 1645,1656 ****
  		 * just assume that the prior tid is OK and return it unchanged.
  		 */
  		offnum = ItemPointerGetOffsetNumber(&ctid);
! 		if (offnum < FirstOffsetNumber || offnum > PageGetMaxOffsetNumber(dp))
  		{
  			UnlockReleaseBuffer(buffer);
  			break;
  		}
! 		lp = PageGetItemId(dp, offnum);
  		if (!ItemIdIsNormal(lp))
  		{
  			UnlockReleaseBuffer(buffer);
--- 1645,1656 ----
  		 * just assume that the prior tid is OK and return it unchanged.
  		 */
  		offnum = ItemPointerGetOffsetNumber(&ctid);
! 		if (offnum < FirstOffsetNumber || offnum > PageGetMaxOffsetNumber(page))
  		{
  			UnlockReleaseBuffer(buffer);
  			break;
  		}
! 		lp = PageGetItemId(page, offnum);
  		if (!ItemIdIsNormal(lp))
  		{
  			UnlockReleaseBuffer(buffer);
***************
*** 1659,1665 ****
  
  		/* OK to access the tuple */
  		tp.t_self = ctid;
! 		tp.t_data = (HeapTupleHeader) PageGetItem(dp, lp);
  		tp.t_len = ItemIdGetLength(lp);
  
  		/*
--- 1659,1665 ----
  
  		/* OK to access the tuple */
  		tp.t_self = ctid;
! 		tp.t_data = (HeapTupleHeader) PageGetItem(page, lp);
  		tp.t_len = ItemIdGetLength(lp);
  
  		/*
***************
*** 1963,1969 ****
  	TransactionId xid = GetCurrentTransactionId();
  	ItemId		lp;
  	HeapTupleData tp;
! 	PageHeader	dp;
  	Buffer		buffer;
  	bool		have_tuple_lock = false;
  	bool		iscombo;
--- 1963,1969 ----
  	TransactionId xid = GetCurrentTransactionId();
  	ItemId		lp;
  	HeapTupleData tp;
! 	Page		page;
  	Buffer		buffer;
  	bool		have_tuple_lock = false;
  	bool		iscombo;
***************
*** 1973,1983 ****
  	buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(tid));
  	LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
  
! 	dp = (PageHeader) BufferGetPage(buffer);
! 	lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(tid));
  	Assert(ItemIdIsNormal(lp));
  
! 	tp.t_data = (HeapTupleHeader) PageGetItem(dp, lp);
  	tp.t_len = ItemIdGetLength(lp);
  	tp.t_self = *tid;
  
--- 1973,1983 ----
  	buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(tid));
  	LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
  
! 	page = BufferGetPage(buffer);
! 	lp = PageGetItemId(page, ItemPointerGetOffsetNumber(tid));
  	Assert(ItemIdIsNormal(lp));
  
! 	tp.t_data = (HeapTupleHeader) PageGetItem(page, lp);
  	tp.t_len = ItemIdGetLength(lp);
  	tp.t_self = *tid;
  
***************
*** 2111,2117 ****
  	 * the subsequent page pruning will be a no-op and the hint will be
  	 * cleared.
  	 */
! 	PageSetPrunable(dp, xid);
  
  	/* store transaction information of xact deleting the tuple */
  	tp.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
--- 2111,2117 ----
  	 * the subsequent page pruning will be a no-op and the hint will be
  	 * cleared.
  	 */
! 	PageSetPrunable(page, xid);
  
  	/* store transaction information of xact deleting the tuple */
  	tp.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
***************
*** 2149,2156 ****
  
  		recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_DELETE, rdata);
  
! 		PageSetLSN(dp, recptr);
! 		PageSetTLI(dp, ThisTimeLineID);
  	}
  
  	END_CRIT_SECTION();
--- 2149,2156 ----
  
  		recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_DELETE, rdata);
  
! 		PageSetLSN(page, recptr);
! 		PageSetTLI(page, ThisTimeLineID);
  	}
  
  	END_CRIT_SECTION();
***************
*** 2275,2281 ****
  	ItemId		lp;
  	HeapTupleData oldtup;
  	HeapTuple	heaptup;
! 	PageHeader	dp;
  	Buffer		buffer,
  				newbuf;
  	bool		need_toast,
--- 2275,2281 ----
  	ItemId		lp;
  	HeapTupleData oldtup;
  	HeapTuple	heaptup;
! 	Page		page;
  	Buffer		buffer,
  				newbuf;
  	bool		need_toast,
***************
*** 2305,2315 ****
  	buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(otid));
  	LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
  
! 	dp = (PageHeader) BufferGetPage(buffer);
! 	lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(otid));
  	Assert(ItemIdIsNormal(lp));
  
! 	oldtup.t_data = (HeapTupleHeader) PageGetItem(dp, lp);
  	oldtup.t_len = ItemIdGetLength(lp);
  	oldtup.t_self = *otid;
  
--- 2305,2315 ----
  	buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(otid));
  	LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
  
! 	page = BufferGetPage(buffer);
! 	lp = PageGetItemId(page, ItemPointerGetOffsetNumber(otid));
  	Assert(ItemIdIsNormal(lp));
  
! 	oldtup.t_data = (HeapTupleHeader) PageGetItem(page, lp);
  	oldtup.t_len = ItemIdGetLength(lp);
  	oldtup.t_self = *otid;
  
***************
*** 2490,2496 ****
  					  HeapTupleHasExternal(newtup) ||
  					  newtup->t_len > TOAST_TUPLE_THRESHOLD);
  
! 	pagefree = PageGetHeapFreeSpace((Page) dp);
  
  	newtupsize = MAXALIGN(newtup->t_len);
  
--- 2490,2496 ----
  					  HeapTupleHasExternal(newtup) ||
  					  newtup->t_len > TOAST_TUPLE_THRESHOLD);
  
! 	pagefree = PageGetHeapFreeSpace(page);
  
  	newtupsize = MAXALIGN(newtup->t_len);
  
***************
*** 2556,2562 ****
  			/* Re-acquire the lock on the old tuple's page. */
  			LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
  			/* Re-check using the up-to-date free space */
! 			pagefree = PageGetHeapFreeSpace((Page) dp);
  			if (newtupsize > pagefree)
  			{
  				/*
--- 2556,2562 ----
  			/* Re-acquire the lock on the old tuple's page. */
  			LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE);
  			/* Re-check using the up-to-date free space */
! 			pagefree = PageGetHeapFreeSpace(page);
  			if (newtupsize > pagefree)
  			{
  				/*
***************
*** 2602,2608 ****
  	else
  	{
  		/* Set a hint that the old page could use prune/defrag */
! 		PageSetFull(dp);
  	}
  
  	/* NO EREPORT(ERROR) from here till changes are logged */
--- 2602,2608 ----
  	else
  	{
  		/* Set a hint that the old page could use prune/defrag */
! 		PageSetFull(page);
  	}
  
  	/* NO EREPORT(ERROR) from here till changes are logged */
***************
*** 2620,2626 ****
  	 * not to optimize for aborts.	Note that heap_xlog_update must be kept in
  	 * sync if this decision changes.
  	 */
! 	PageSetPrunable(dp, xid);
  
  	if (use_hot_update)
  	{
--- 2620,2626 ----
  	 * not to optimize for aborts.	Note that heap_xlog_update must be kept in
  	 * sync if this decision changes.
  	 */
! 	PageSetPrunable(page, xid);
  
  	if (use_hot_update)
  	{
***************
*** 2945,2951 ****
  	HTSU_Result result;
  	ItemPointer tid = &(tuple->t_self);
  	ItemId		lp;
! 	PageHeader	dp;
  	TransactionId xid;
  	TransactionId xmax;
  	uint16		old_infomask;
--- 2945,2951 ----
  	HTSU_Result result;
  	ItemPointer tid = &(tuple->t_self);
  	ItemId		lp;
! 	Page		page;
  	TransactionId xid;
  	TransactionId xmax;
  	uint16		old_infomask;
***************
*** 2958,2968 ****
  	*buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(tid));
  	LockBuffer(*buffer, BUFFER_LOCK_EXCLUSIVE);
  
! 	dp = (PageHeader) BufferGetPage(*buffer);
! 	lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(tid));
  	Assert(ItemIdIsNormal(lp));
  
! 	tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
  	tuple->t_len = ItemIdGetLength(lp);
  	tuple->t_tableOid = RelationGetRelid(relation);
  
--- 2958,2968 ----
  	*buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(tid));
  	LockBuffer(*buffer, BUFFER_LOCK_EXCLUSIVE);
  
! 	page = BufferGetPage(*buffer);
! 	lp = PageGetItemId(page, ItemPointerGetOffsetNumber(tid));
  	Assert(ItemIdIsNormal(lp));
  
! 	tuple->t_data = (HeapTupleHeader) PageGetItem(page, lp);
  	tuple->t_len = ItemIdGetLength(lp);
  	tuple->t_tableOid = RelationGetRelid(relation);
  
***************
*** 3301,3308 ****
  
  		recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_LOCK, rdata);
  
! 		PageSetLSN(dp, recptr);
! 		PageSetTLI(dp, ThisTimeLineID);
  	}
  
  	END_CRIT_SECTION();
--- 3301,3308 ----
  
  		recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_LOCK, rdata);
  
! 		PageSetLSN(page, recptr);
! 		PageSetTLI(page, ThisTimeLineID);
  	}
  
  	END_CRIT_SECTION();
diff -cr pgsql.orig.da8c485e0e2a/src/backend/access/heap/hio.c pgsql.orig/src/backend/access/heap/hio.c
*** pgsql.orig.da8c485e0e2a/src/backend/access/heap/hio.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/access/heap/hio.c	pá črc  4 10:23:41 2008
***************
*** 107,113 ****
  						  Buffer otherBuffer, bool use_fsm)
  {
  	Buffer		buffer = InvalidBuffer;
! 	Page		pageHeader;
  	Size		pageFreeSpace,
  				saveFreeSpace;
  	BlockNumber targetBlock,
--- 107,113 ----
  						  Buffer otherBuffer, bool use_fsm)
  {
  	Buffer		buffer = InvalidBuffer;
! 	Page		page;
  	Size		pageFreeSpace,
  				saveFreeSpace;
  	BlockNumber targetBlock,
***************
*** 218,225 ****
  		 * Now we can check to see if there's enough free space here. If so,
  		 * we're done.
  		 */
! 		pageHeader = (Page) BufferGetPage(buffer);
! 		pageFreeSpace = PageGetHeapFreeSpace(pageHeader);
  		if (len + saveFreeSpace <= pageFreeSpace)
  		{
  			/* use this page as future insert target, too */
--- 218,225 ----
  		 * Now we can check to see if there's enough free space here. If so,
  		 * we're done.
  		 */
! 		page = BufferGetPage(buffer);
! 		pageFreeSpace = PageGetHeapFreeSpace(page);
  		if (len + saveFreeSpace <= pageFreeSpace)
  		{
  			/* use this page as future insert target, too */
***************
*** 303,318 ****
  	 * is empty (this should never happen, but if it does we don't want to
  	 * risk wiping out valid data).
  	 */
! 	pageHeader = (Page) BufferGetPage(buffer);
  
! 	if (!PageIsNew((PageHeader) pageHeader))
  		elog(ERROR, "page %u of relation \"%s\" should be empty but is not",
  			 BufferGetBlockNumber(buffer),
  			 RelationGetRelationName(relation));
  
! 	PageInit(pageHeader, BufferGetPageSize(buffer), 0);
  
! 	if (len > PageGetHeapFreeSpace(pageHeader))
  	{
  		/* We should not get here given the test at the top */
  		elog(PANIC, "tuple is too big: size %lu", (unsigned long) len);
--- 303,318 ----
  	 * is empty (this should never happen, but if it does we don't want to
  	 * risk wiping out valid data).
  	 */
! 	page = BufferGetPage(buffer);
  
! 	if (!PageIsNew(page))
  		elog(ERROR, "page %u of relation \"%s\" should be empty but is not",
  			 BufferGetBlockNumber(buffer),
  			 RelationGetRelationName(relation));
  
! 	PageInit(page, BufferGetPageSize(buffer), 0);
  
! 	if (len > PageGetHeapFreeSpace(page))
  	{
  		/* We should not get here given the test at the top */
  		elog(PANIC, "tuple is too big: size %lu", (unsigned long) len);
diff -cr pgsql.orig.da8c485e0e2a/src/backend/access/heap/pruneheap.c pgsql.orig/src/backend/access/heap/pruneheap.c
*** pgsql.orig.da8c485e0e2a/src/backend/access/heap/pruneheap.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/access/heap/pruneheap.c	pá črc  4 10:23:41 2008
***************
*** 71,77 ****
  void
  heap_page_prune_opt(Relation relation, Buffer buffer, TransactionId OldestXmin)
  {
! 	PageHeader	dp = (PageHeader) BufferGetPage(buffer);
  	Size		minfree;
  
  	/*
--- 71,77 ----
  void
  heap_page_prune_opt(Relation relation, Buffer buffer, TransactionId OldestXmin)
  {
! 	Page		page = BufferGetPage(buffer);
  	Size		minfree;
  
  	/*
***************
*** 80,86 ****
  	 * Forget it if page is not hinted to contain something prunable that's
  	 * older than OldestXmin.
  	 */
! 	if (!PageIsPrunable(dp, OldestXmin))
  		return;
  
  	/*
--- 80,86 ----
  	 * Forget it if page is not hinted to contain something prunable that's
  	 * older than OldestXmin.
  	 */
! 	if (!PageIsPrunable(page, OldestXmin))
  		return;
  
  	/*
***************
*** 99,105 ****
  											 HEAP_DEFAULT_FILLFACTOR);
  	minfree = Max(minfree, BLCKSZ / 10);
  
! 	if (PageIsFull(dp) || PageGetHeapFreeSpace((Page) dp) < minfree)
  	{
  		/* OK, try to get exclusive buffer lock */
  		if (!ConditionalLockBufferForCleanup(buffer))
--- 99,105 ----
  											 HEAP_DEFAULT_FILLFACTOR);
  	minfree = Max(minfree, BLCKSZ / 10);
  
! 	if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree)
  	{
  		/* OK, try to get exclusive buffer lock */
  		if (!ConditionalLockBufferForCleanup(buffer))
***************
*** 111,117 ****
  		 * prune. (We needn't recheck PageIsPrunable, since no one else could
  		 * have pruned while we hold pin.)
  		 */
! 		if (PageIsFull(dp) || PageGetHeapFreeSpace((Page) dp) < minfree)
  		{
  			/* OK to prune (though not to remove redirects) */
  			(void) heap_page_prune(relation, buffer, OldestXmin, false, true);
--- 111,117 ----
  		 * prune. (We needn't recheck PageIsPrunable, since no one else could
  		 * have pruned while we hold pin.)
  		 */
! 		if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree)
  		{
  			/* OK to prune (though not to remove redirects) */
  			(void) heap_page_prune(relation, buffer, OldestXmin, false, true);
diff -cr pgsql.orig.da8c485e0e2a/src/backend/access/nbtree/nbtpage.c pgsql.orig/src/backend/access/nbtree/nbtpage.c
*** pgsql.orig.da8c485e0e2a/src/backend/access/nbtree/nbtpage.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/access/nbtree/nbtpage.c	pá črc  4 10:23:41 2008
***************
*** 436,448 ****
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if (((PageHeader) (page))->pd_special !=
! 		(BLCKSZ - MAXALIGN(sizeof(BTPageOpaqueData))))
  		ereport(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
  						RelationGetRelationName(rel),
! 						BufferGetBlockNumber(buf)),
  				 errhint("Please REINDEX it.")));
  }
  
--- 436,447 ----
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if ( (PageGetSpecialSize(page)) != MAXALIGN(sizeof(BTPageOpaqueData)))
  		ereport(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
  						RelationGetRelationName(rel),
! 						BufferGetBlockNumber(buf)), 
  				 errhint("Please REINDEX it.")));
  }
  
***************
*** 555,561 ****
  
  		/* Initialize the new page before returning it */
  		page = BufferGetPage(buf);
! 		Assert(PageIsNew((PageHeader) page));
  		_bt_pageinit(page, BufferGetPageSize(buf));
  	}
  
--- 554,560 ----
  
  		/* Initialize the new page before returning it */
  		page = BufferGetPage(buf);
! 		Assert(PageIsNew(page));
  		_bt_pageinit(page, BufferGetPageSize(buf));
  	}
  
diff -cr pgsql.orig.da8c485e0e2a/src/backend/access/transam/xlog.c pgsql.orig/src/backend/access/transam/xlog.c
*** pgsql.orig.da8c485e0e2a/src/backend/access/transam/xlog.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/access/transam/xlog.c	pá črc  4 10:23:41 2008
***************
*** 1017,1025 ****
  XLogCheckBuffer(XLogRecData *rdata, bool doPageWrites,
  				XLogRecPtr *lsn, BkpBlock *bkpb)
  {
! 	PageHeader	page;
  
! 	page = (PageHeader) BufferGetBlock(rdata->buffer);
  
  	/*
  	 * XXX We assume page LSN is first data on *every* page that can be passed
--- 1017,1025 ----
  XLogCheckBuffer(XLogRecData *rdata, bool doPageWrites,
  				XLogRecPtr *lsn, BkpBlock *bkpb)
  {
! 	Page	page;
  
! 	page = BufferGetBlock(rdata->buffer);
  
  	/*
  	 * XXX We assume page LSN is first data on *every* page that can be passed
***************
*** 1026,1035 ****
  	 * to XLogInsert, whether it otherwise has the standard page layout or
  	 * not.
  	 */
! 	*lsn = page->pd_lsn;
  
  	if (doPageWrites &&
! 		XLByteLE(page->pd_lsn, RedoRecPtr))
  	{
  		/*
  		 * The page needs to be backed up, so set up *bkpb
--- 1026,1035 ----
  	 * to XLogInsert, whether it otherwise has the standard page layout or
  	 * not.
  	 */
! 	*lsn = PageGetLSN(page);
  
  	if (doPageWrites &&
! 		XLByteLE(PageGetLSN(page), RedoRecPtr))
  	{
  		/*
  		 * The page needs to be backed up, so set up *bkpb
diff -cr pgsql.orig.da8c485e0e2a/src/backend/access/transam/xlogutils.c pgsql.orig/src/backend/access/transam/xlogutils.c
*** pgsql.orig.da8c485e0e2a/src/backend/access/transam/xlogutils.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/access/transam/xlogutils.c	pá črc  4 10:23:41 2008
***************
*** 262,268 ****
  		/* check that page has been initialized */
  		Page		page = (Page) BufferGetPage(buffer);
  
! 		if (PageIsNew((PageHeader) page))
  		{
  			UnlockReleaseBuffer(buffer);
  			log_invalid_page(reln->rd_node, blkno, true);
--- 262,268 ----
  		/* check that page has been initialized */
  		Page		page = (Page) BufferGetPage(buffer);
  
! 		if (PageIsNew(page))
  		{
  			UnlockReleaseBuffer(buffer);
  			log_invalid_page(reln->rd_node, blkno, true);
diff -cr pgsql.orig.da8c485e0e2a/src/backend/commands/sequence.c pgsql.orig/src/backend/commands/sequence.c
*** pgsql.orig.da8c485e0e2a/src/backend/commands/sequence.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/commands/sequence.c	pá črc  4 10:23:41 2008
***************
*** 109,115 ****
  	Oid			seqoid;
  	Relation	rel;
  	Buffer		buf;
! 	PageHeader	page;
  	sequence_magic *sm;
  	HeapTuple	tuple;
  	TupleDesc	tupDesc;
--- 109,115 ----
  	Oid			seqoid;
  	Relation	rel;
  	Buffer		buf;
! 	Page		page;
  	sequence_magic *sm;
  	HeapTuple	tuple;
  	TupleDesc	tupDesc;
***************
*** 212,220 ****
  	buf = ReadBuffer(rel, P_NEW);
  	Assert(BufferGetBlockNumber(buf) == 0);
  
! 	page = (PageHeader) BufferGetPage(buf);
  
! 	PageInit((Page) page, BufferGetPageSize(buf), sizeof(sequence_magic));
  	sm = (sequence_magic *) PageGetSpecialPointer(page);
  	sm->magic = SEQ_MAGIC;
  
--- 212,220 ----
  	buf = ReadBuffer(rel, P_NEW);
  	Assert(BufferGetBlockNumber(buf) == 0);
  
! 	page = BufferGetPage(buf);
  
! 	PageInit(page, BufferGetPageSize(buf), sizeof(sequence_magic));
  	sm = (sequence_magic *) PageGetSpecialPointer(page);
  	sm->magic = SEQ_MAGIC;
  
***************
*** 954,960 ****
  static Form_pg_sequence
  read_info(SeqTable elm, Relation rel, Buffer *buf)
  {
! 	PageHeader	page;
  	ItemId		lp;
  	HeapTupleData tuple;
  	sequence_magic *sm;
--- 954,960 ----
  static Form_pg_sequence
  read_info(SeqTable elm, Relation rel, Buffer *buf)
  {
! 	Page	page;
  	ItemId		lp;
  	HeapTupleData tuple;
  	sequence_magic *sm;
***************
*** 963,969 ****
  	*buf = ReadBuffer(rel, 0);
  	LockBuffer(*buf, BUFFER_LOCK_EXCLUSIVE);
  
! 	page = (PageHeader) BufferGetPage(*buf);
  	sm = (sequence_magic *) PageGetSpecialPointer(page);
  
  	if (sm->magic != SEQ_MAGIC)
--- 963,969 ----
  	*buf = ReadBuffer(rel, 0);
  	LockBuffer(*buf, BUFFER_LOCK_EXCLUSIVE);
  
! 	page = BufferGetPage(*buf);
  	sm = (sequence_magic *) PageGetSpecialPointer(page);
  
  	if (sm->magic != SEQ_MAGIC)
***************
*** 972,978 ****
  
  	lp = PageGetItemId(page, FirstOffsetNumber);
  	Assert(ItemIdIsNormal(lp));
! 	tuple.t_data = (HeapTupleHeader) PageGetItem((Page) page, lp);
  
  	seq = (Form_pg_sequence) GETSTRUCT(&tuple);
  
--- 972,978 ----
  
  	lp = PageGetItemId(page, FirstOffsetNumber);
  	Assert(ItemIdIsNormal(lp));
! 	tuple.t_data = (HeapTupleHeader) PageGetItem(page, lp);
  
  	seq = (Form_pg_sequence) GETSTRUCT(&tuple);
  
diff -cr pgsql.orig.da8c485e0e2a/src/backend/commands/trigger.c pgsql.orig/src/backend/commands/trigger.c
*** pgsql.orig.da8c485e0e2a/src/backend/commands/trigger.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/commands/trigger.c	pá črc  4 10:23:41 2008
***************
*** 2203,2219 ****
  	}
  	else
  	{
! 		PageHeader	dp;
  		ItemId		lp;
  
  		buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(tid));
  
! 		dp = (PageHeader) BufferGetPage(buffer);
! 		lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(tid));
  
  		Assert(ItemIdIsNormal(lp));
  
! 		tuple.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
  		tuple.t_len = ItemIdGetLength(lp);
  		tuple.t_self = *tid;
  		tuple.t_tableOid = RelationGetRelid(relation);
--- 2203,2219 ----
  	}
  	else
  	{
! 		Page		page;
  		ItemId		lp;
  
  		buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(tid));
  
! 		page = BufferGetPage(buffer);
! 		lp = PageGetItemId(page, ItemPointerGetOffsetNumber(tid));
  
  		Assert(ItemIdIsNormal(lp));
  
! 		tuple.t_data = (HeapTupleHeader) PageGetItem(page, lp);
  		tuple.t_len = ItemIdGetLength(lp);
  		tuple.t_self = *tid;
  		tuple.t_tableOid = RelationGetRelid(relation);
diff -cr pgsql.orig.da8c485e0e2a/src/backend/optimizer/util/plancat.c pgsql.orig/src/backend/optimizer/util/plancat.c
*** pgsql.orig.da8c485e0e2a/src/backend/optimizer/util/plancat.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/optimizer/util/plancat.c	pá črc  4 10:23:41 2008
***************
*** 429,435 ****
  				tuple_width += sizeof(HeapTupleHeaderData);
  				tuple_width += sizeof(ItemPointerData);
  				/* note: integer division is intentional here */
! 				density = (BLCKSZ - sizeof(PageHeaderData)) / tuple_width;
  			}
  			*tuples = rint(density * (double) curpages);
  			break;
--- 429,435 ----
  				tuple_width += sizeof(HeapTupleHeaderData);
  				tuple_width += sizeof(ItemPointerData);
  				/* note: integer division is intentional here */
! 				density = (BLCKSZ - SizeOfPageHeaderData) / tuple_width;
  			}
  			*tuples = rint(density * (double) curpages);
  			break;
diff -cr pgsql.orig.da8c485e0e2a/src/backend/storage/buffer/bufmgr.c pgsql.orig/src/backend/storage/buffer/bufmgr.c
*** pgsql.orig.da8c485e0e2a/src/backend/storage/buffer/bufmgr.c	pá črc  4 10:23:41 2008
--- pgsql.orig/src/backend/storage/buffer/bufmgr.c	pá črc  4 10:23:41 2008
***************
*** 223,229 ****
  		 * always have left a zero-filled buffer, complain if not PageIsNew.
  		 */
  		bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr);
! 		if (!PageIsNew((PageHeader) bufBlock))
  			ereport(ERROR,
  					(errmsg("unexpected data beyond EOF in block %u of relation \"%s\"",
  							blockNum, RelationGetRelationName(reln)),
--- 223,229 ----
  		 * always have left a zero-filled buffer, complain if not PageIsNew.
  		 */
  		bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr);
! 		if (!PageIsNew((Page) bufBlock))
  			ereport(ERROR,
  					(errmsg("unexpected data beyond EOF in block %u of relation \"%s\"",
  							blockNum, RelationGetRelationName(reln)),
***************
*** 292,298 ****
  		else
  			smgrread(reln->rd_smgr, blockNum, (char *) bufBlock);
  		/* check for garbage data */
! 		if (!PageHeaderIsValid((PageHeader) bufBlock))
  		{
  			if (zero_damaged_pages)
  			{
--- 292,298 ----
  		else
  			smgrread(reln->rd_smgr, blockNum, (char *) bufBlock);
  		/* check for garbage data */
! 		if (!PageHeaderIsValid((Page) bufBlock))
  		{
  			if (zero_damaged_pages)
  			{
diff -cr pgsql.orig.da8c485e0e2a/src/include/access/hash.h pgsql.orig/src/include/access/hash.h
*** pgsql.orig.da8c485e0e2a/src/include/access/hash.h	pá črc  4 10:23:41 2008
--- pgsql.orig/src/include/access/hash.h	pá črc  4 10:23:41 2008
***************
*** 166,174 ****
   */
  #define HashMaxItemSize(page) \
  	(PageGetPageSize(page) - \
! 	 sizeof(PageHeaderData) - \
! 	 MAXALIGN(sizeof(HashPageOpaqueData)) - \
! 	 sizeof(ItemIdData))
  
  #define HASH_MIN_FILLFACTOR			10
  #define HASH_DEFAULT_FILLFACTOR		75
--- 166,173 ----
   */
  #define HashMaxItemSize(page) \
  	(PageGetPageSize(page) - \
! 	 ( MAXALIGN(SizeOfPageHeaderData + sizeof(ItemIdData)) + \
! 	   MAXALIGN(sizeof(HashPageOpaqueData)) ))
  
  #define HASH_MIN_FILLFACTOR			10
  #define HASH_DEFAULT_FILLFACTOR		75
***************
*** 191,197 ****
  #define BMPG_SHIFT(metap)		((metap)->hashm_bmshift)
  #define BMPG_MASK(metap)		(BMPGSZ_BIT(metap) - 1)
  #define HashPageGetBitmap(pg) \
! 	((uint32 *) (((char *) (pg)) + MAXALIGN(sizeof(PageHeaderData))))
  
  /*
   * The number of bits in an ovflpage bitmap word.
--- 190,196 ----
  #define BMPG_SHIFT(metap)		((metap)->hashm_bmshift)
  #define BMPG_MASK(metap)		(BMPGSZ_BIT(metap) - 1)
  #define HashPageGetBitmap(pg) \
! 	((uint32 *) (((char *) (pg)) + MAXALIGN(SizeOfPageHeaderData + sizeof(ItemIdData)))) 
  
  /*
   * The number of bits in an ovflpage bitmap word.
diff -cr pgsql.orig.da8c485e0e2a/src/include/access/htup.h pgsql.orig/src/include/access/htup.h
*** pgsql.orig.da8c485e0e2a/src/include/access/htup.h	pá črc  4 10:23:41 2008
--- pgsql.orig/src/include/access/htup.h	pá črc  4 10:23:41 2008
***************
*** 367,373 ****
   * of assuming that, say, you can fit 2 tuples of size MaxHeapTupleSize/2
   * on the same page.
   */
! #define MaxHeapTupleSize  (BLCKSZ - MAXALIGN(sizeof(PageHeaderData)))
  
  /*
   * MaxHeapTuplesPerPage is an upper bound on the number of tuples that can
--- 367,373 ----
   * of assuming that, say, you can fit 2 tuples of size MaxHeapTupleSize/2
   * on the same page.
   */
! #define MaxHeapTupleSize  (BLCKSZ - MAXALIGN( (SizeOfPageHeaderData) + sizeof(ItemIdData)))
  
  /*
   * MaxHeapTuplesPerPage is an upper bound on the number of tuples that can
***************
*** 381,387 ****
   * require increases in the size of work arrays.
   */
  #define MaxHeapTuplesPerPage	\
! 	((int) ((BLCKSZ - offsetof(PageHeaderData, pd_linp)) / \
  			(MAXALIGN(offsetof(HeapTupleHeaderData, t_bits)) + sizeof(ItemIdData))))
  
  /*
--- 381,387 ----
   * require increases in the size of work arrays.
   */
  #define MaxHeapTuplesPerPage	\
! 	((int) ((BLCKSZ - SizeOfPageHeaderData) / \
  			(MAXALIGN(offsetof(HeapTupleHeaderData, t_bits)) + sizeof(ItemIdData))))
  
  /*
diff -cr pgsql.orig.da8c485e0e2a/src/include/access/itup.h pgsql.orig/src/include/access/itup.h
*** pgsql.orig.da8c485e0e2a/src/include/access/itup.h	pá črc  4 10:23:41 2008
--- pgsql.orig/src/include/access/itup.h	pá črc  4 10:23:41 2008
***************
*** 134,140 ****
   * must be maxaligned, and it must have an associated item pointer.
   */
  #define MaxIndexTuplesPerPage	\
! 	((int) ((BLCKSZ - offsetof(PageHeaderData, pd_linp)) / \
  			(MAXALIGN(sizeof(IndexTupleData) + 1) + sizeof(ItemIdData))))
  
  
--- 134,140 ----
   * must be maxaligned, and it must have an associated item pointer.
   */
  #define MaxIndexTuplesPerPage	\
! 	((int) ((BLCKSZ - SizeOfPageHeaderData) / \
  			(MAXALIGN(sizeof(IndexTupleData) + 1) + sizeof(ItemIdData))))
  
  
diff -cr pgsql.orig.da8c485e0e2a/src/include/access/nbtree.h pgsql.orig/src/include/access/nbtree.h
*** pgsql.orig.da8c485e0e2a/src/include/access/nbtree.h	pá črc  4 10:23:41 2008
--- pgsql.orig/src/include/access/nbtree.h	pá črc  4 10:23:41 2008
***************
*** 119,125 ****
   */
  #define BTMaxItemSize(page) \
  	MAXALIGN_DOWN((PageGetPageSize(page) - \
! 				   MAXALIGN(sizeof(PageHeaderData) + 2*sizeof(ItemIdData)) - \
  				   MAXALIGN(sizeof(BTPageOpaqueData))) / 3)
  
  /*
--- 119,125 ----
   */
  #define BTMaxItemSize(page) \
  	MAXALIGN_DOWN((PageGetPageSize(page) - \
! 				   MAXALIGN(SizeOfPageHeaderData + 3*sizeof(ItemIdData)) - \
  				   MAXALIGN(sizeof(BTPageOpaqueData))) / 3)
  
  /*
diff -cr pgsql.orig.da8c485e0e2a/src/include/access/tuptoaster.h pgsql.orig/src/include/access/tuptoaster.h
*** pgsql.orig.da8c485e0e2a/src/include/access/tuptoaster.h	pá črc  4 10:23:41 2008
--- pgsql.orig/src/include/access/tuptoaster.h	pá črc  4 10:23:41 2008
***************
*** 49,55 ****
  /* Note: sizeof(PageHeaderData) includes the first ItemId on the page */
  #define TOAST_TUPLE_THRESHOLD	\
  	MAXALIGN_DOWN((BLCKSZ - \
! 				   MAXALIGN(sizeof(PageHeaderData) + (TOAST_TUPLES_PER_PAGE-1) * sizeof(ItemIdData))) \
  				  / TOAST_TUPLES_PER_PAGE)
  
  #define TOAST_TUPLE_TARGET		TOAST_TUPLE_THRESHOLD
--- 49,55 ----
  /* Note: sizeof(PageHeaderData) includes the first ItemId on the page */
  #define TOAST_TUPLE_THRESHOLD	\
  	MAXALIGN_DOWN((BLCKSZ - \
! 				   MAXALIGN(SizeOfPageHeaderData + (TOAST_TUPLES_PER_PAGE) * sizeof(ItemIdData))) \
  				  / TOAST_TUPLES_PER_PAGE)
  
  #define TOAST_TUPLE_TARGET		TOAST_TUPLE_THRESHOLD
***************
*** 76,82 ****
  /* Note: sizeof(PageHeaderData) includes the first ItemId on the page */
  #define EXTERN_TUPLE_MAX_SIZE	\
  	MAXALIGN_DOWN((BLCKSZ - \
! 				   MAXALIGN(sizeof(PageHeaderData) + (EXTERN_TUPLES_PER_PAGE-1) * sizeof(ItemIdData))) \
  				  / EXTERN_TUPLES_PER_PAGE)
  
  #define TOAST_MAX_CHUNK_SIZE	\
--- 76,82 ----
  /* Note: sizeof(PageHeaderData) includes the first ItemId on the page */
  #define EXTERN_TUPLE_MAX_SIZE	\
  	MAXALIGN_DOWN((BLCKSZ - \
! 				   MAXALIGN(SizeOfPageHeaderData + (EXTERN_TUPLES_PER_PAGE) * sizeof(ItemIdData))) \
  				  / EXTERN_TUPLES_PER_PAGE)
  
  #define TOAST_MAX_CHUNK_SIZE	\
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.