Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Data Bases > Pgsql Patches > Re: page macros...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 20 of 26 Topic 3804 of 4098
Post > Topic >>

Re: page macros cleanup (ver 04)

by heikki@[EMAIL PROTECTED] ("Heikki Linnakangas") Jul 9, 2008 at 02:54 PM

This is a multi-part message in MIME format.

--------------000802030406030900030201
Content-Type: text/plain;
	format=flowed;
	charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit

Zdenek Kotala wrote:
> Pavan Deolasee napsal(a):
>> On Fri, Jul 4, 2008 at 4:25 PM, Heikki Lin****angas
>> <heikki@[EMAIL PROTECTED]
> wrote:
>>>
>>> No, there's a itemsz = MAXALIGN(itemsz) call before the check against
>>> HashMaxItemSize.
>>>
>>
>> Ah, right. Still should we just not MAXALIGN_DOWN the Max size to
>> reflect the practical limit on the itemsz ? It's more academical
>> though, so not a big deal.
> 
> Finally I use following formula:
> 
> #define HashMaxItemSize(page) \
>      MAXALIGN_DOWN(PageGetPageSize(page) - \
>        ( SizeOfPageHeaderData + sizeof(ItemIdData) ) - \
>         MAXALIGN(sizeof(HashPageOpaqueData)) )
> 
> 
> I did not replace PageGetPageSize(page), because other *MaxItemSize has 
> same interface.

Ok, fair enough.

There's another academical discrepancy between these two hunks:

> *** src/backend/access/hash/hashpage.c  12 May 2008 00:00:44 -0000     
1.75
> --- src/backend/access/hash/hashpage.c  9 Jul 2008 11:30:09 -0000
> ***************
> *** 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;
>         }

and

> *** src/include/access/hash.h   19 Jun 2008 00:46:05 -0000      1.88
> --- src/include/access/hash.h   9 Jul 2008 11:30:10 -0000
> ***************
> *** 192,198 ****
>   #define BMPG_****FT(metap)             ((metap)->hashm_bm****ft)
>   #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.
> --- 191,197 ----
>   #define BMPG_****FT(metap)             ((metap)->hashm_bm****ft)
>   #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.

I admit I don't understand what that bitmap is, it looks like we're 
assuming it can take up all the space between page header and the 
special ****tion, without any line pointers, but in HashPageGetBitmap, 
we're reserving space for one pointer. It looks like the actual size of 
the bitmap is only the largest power of 2 below the maximum size, so 
that won't be an issue in practice. That macro is actually doing the 
same thing as PageGetContents, so I switched to using that. As that 
moves the data sligthly on those bitmap pages, I guess we'll need a 
catversion bump.

Attached is an updated patch. I also fixed some whitespace and comments 
that were no longer valid. How does it look to you now?

-- 
   Heikki Lin****angas
   EnterpriseDB   http://www.enterprisedb.com

--------------000802030406030900030201
Content-Type: text/x-diff;
	name="page_04-heikki-1.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
	filename="page_04-heikki-1.patch"

? DEADJOE
? GNUmakefile
? buildlog
? config.log
? config.status
? page_04-heikki-1.patch
? contrib/pg_standby/.deps
? contrib/pg_standby/pg_standby
? contrib/spi/.deps
? doc/src/sgml/cvsmsg
? src/Makefile.global
? src/backend/postgres
? src/backend/access/common/.deps
? src/backend/access/gin/.deps
? src/backend/access/gist/.deps
? src/backend/access/hash/.deps
? src/backend/access/heap/.deps
? src/backend/access/index/.deps
? src/backend/access/nbtree/.deps
? src/backend/access/transam/.deps
? src/backend/bootstrap/.deps
? src/backend/catalog/.deps
? src/backend/catalog/postgres.bki
? src/backend/catalog/postgres.description
? src/backend/catalog/postgres.shdescription
? src/backend/commands/.deps
? src/backend/executor/.deps
? src/backend/lib/.deps
? src/backend/libpq/.deps
? src/backend/main/.deps
? src/backend/nodes/.deps
? src/backend/optimizer/geqo/.deps
? src/backend/optimizer/path/.deps
? src/backend/optimizer/plan/.deps
? src/backend/optimizer/prep/.deps
? src/backend/optimizer/util/.deps
? src/backend/parser/.deps
? src/backend/****t/.deps
? src/backend/postmaster/.deps
? src/backend/regex/.deps
? src/backend/rewrite/.deps
? src/backend/snowball/.deps
? src/backend/snowball/snowball_create.sql
? src/backend/storage/buffer/.deps
? src/backend/storage/file/.deps
? src/backend/storage/freespace/.deps
? src/backend/storage/ipc/.deps
? src/backend/storage/large_object/.deps
? src/backend/storage/lmgr/.deps
? src/backend/storage/page/.deps
? src/backend/storage/smgr/.deps
? src/backend/tcop/.deps
? src/backend/tsearch/.deps
? src/backend/utils/.deps
? src/backend/utils/probes.h
? src/backend/utils/adt/.deps
? src/backend/utils/cache/.deps
? src/backend/utils/error/.deps
? src/backend/utils/fmgr/.deps
? src/backend/utils/hash/.deps
? src/backend/utils/init/.deps
? src/backend/utils/mb/.deps
? src/backend/utils/mb/conversion_procs/conversion_create.sql
? src/backend/utils/mb/conversion_procs/ascii_and_mic/.deps
? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/.deps
? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/.deps
?
src/backend/utils/mb/conversion_procs/euc_jis_2004_and_****ft_jis_2004/.deps
? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/.deps
? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/.deps
? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/.deps
? src/backend/utils/mb/conversion_procs/latin2_and_win1250/.deps
? src/backend/utils/mb/conversion_procs/latin_and_mic/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_ascii/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_big5/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_jis_2004/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_gbk/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_johab/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_****ft_jis_2004/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_sjis/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_uhc/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win/.deps
? src/backend/utils/misc/.deps
? src/backend/utils/mmgr/.deps
? src/backend/utils/resowner/.deps
? src/backend/utils/sort/.deps
? src/backend/utils/time/.deps
? src/bin/initdb/.deps
? src/bin/initdb/initdb
? src/bin/pg_config/.deps
? src/bin/pg_config/pg_config
? src/bin/pg_controldata/.deps
? src/bin/pg_controldata/pg_controldata
? src/bin/pg_ctl/.deps
? src/bin/pg_ctl/pg_ctl
? src/bin/pg_dump/.deps
? src/bin/pg_dump/pg_dump
? src/bin/pg_dump/pg_dumpall
? src/bin/pg_dump/pg_restore
? src/bin/pg_resetxlog/.deps
? src/bin/pg_resetxlog/pg_resetxlog
? src/bin/psql/.deps
? src/bin/psql/d.c
? src/bin/psql/psql
? src/bin/scripts/.deps
? src/bin/scripts/clusterdb
? src/bin/scripts/createdb
? src/bin/scripts/createlang
? src/bin/scripts/createuser
? src/bin/scripts/dropdb
? src/bin/scripts/droplang
? src/bin/scripts/dropuser
? src/bin/scripts/reindexdb
? src/bin/scripts/vacuumdb
? src/include/pg_config.h
? src/include/stamp-h
? src/interfaces/ecpg/compatlib/.deps
? src/interfaces/ecpg/compatlib/ex****ts.list
? src/interfaces/ecpg/compatlib/libecpg_compat.so.3.1
? src/interfaces/ecpg/ecpglib/.deps
? src/interfaces/ecpg/ecpglib/ex****ts.list
? src/interfaces/ecpg/ecpglib/libecpg.so.6.1
? src/interfaces/ecpg/include/ecpg_config.h
? src/interfaces/ecpg/pgtypeslib/.deps
? src/interfaces/ecpg/pgtypeslib/ex****ts.list
? src/interfaces/ecpg/pgtypeslib/libpgtypes.so.3.1
? src/interfaces/ecpg/preproc/.deps
? src/interfaces/ecpg/preproc/ecpg
? src/interfaces/libpq/.deps
? src/interfaces/libpq/ex****ts.list
? src/interfaces/libpq/libpq.so.5.2
? src/pl/plpgsql/src/.deps
? src/****t/.deps
? src/****t/pg_config_paths.h
? src/test/regress/.deps
? src/test/regress/log
? src/test/regress/pg_regress
? src/test/regress/results
? src/test/regress/testtablespace
? src/test/regress/expected/constraints.out
? src/test/regress/expected/copy.out
? src/test/regress/expected/create_function_1.out
? src/test/regress/expected/create_function_2.out
? src/test/regress/expected/largeobject.out
? src/test/regress/expected/largeobject_1.out
? src/test/regress/expected/misc.out
? src/test/regress/expected/tablespace.out
? src/test/regress/sql/constraints.sql
? src/test/regress/sql/copy.sql
? src/test/regress/sql/create_function_1.sql
? src/test/regress/sql/create_function_2.sql
? src/test/regress/sql/largeobject.sql
? src/test/regress/sql/misc.sql
? src/test/regress/sql/tablespace.sql
? src/timezone/.deps
? src/timezone/zic
Index: src/backend/access/gist/gistutil.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/gist/gistutil.c,v
retrieving revision 1.29
diff -c -r1.29 gistutil.c
*** src/backend/access/gist/gistutil.c	19 Jun 2008 00:46:03 -0000	1.29
--- src/backend/access/gist/gistutil.c	9 Jul 2008 11:49:34 -0000
***************
*** 591,598 ****
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if (((PageHeader) (page))->pd_special !=
! 		(BLCKSZ - MAXALIGN(sizeof(GISTPageOpaqueData))))
  		ere****t(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
--- 591,597 ----
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GISTPageOpaqueData)))
  		ere****t(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
Index: src/backend/access/hash/hashpage.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/hash/hashpage.c,v
retrieving revision 1.75
diff -c -r1.75 hashpage.c
*** src/backend/access/hash/hashpage.c	12 May 2008 00:00:44 -0000	1.75
--- src/backend/access/hash/hashpage.c	9 Jul 2008 11:49:34 -0000
***************
*** 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;
  	}
Index: src/backend/access/hash/hashutil.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/hash/hashutil.c,v
retrieving revision 1.55
diff -c -r1.55 hashutil.c
*** src/backend/access/hash/hashutil.c	19 Jun 2008 00:46:03 -0000	1.55
--- src/backend/access/hash/hashutil.c	9 Jul 2008 11:49:34 -0000
***************
*** 164,171 ****
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if (((PageHeader) (page))->pd_special !=
! 		(BLCKSZ - MAXALIGN(sizeof(HashPageOpaqueData))))
  		ere****t(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)))
  		ere****t(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
Index: src/backend/access/heap/heapam.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v
retrieving revision 1.260
diff -c -r1.260 heapam.c
*** src/backend/access/heap/heapam.c	19 Jun 2008 00:46:03 -0000	1.260
--- src/backend/access/heap/heapam.c	9 Jul 2008 11:49:34 -0000
***************
*** 1343,1349 ****
  	ItemPointer tid = &(tuple->t_self);
  	ItemId		lp;
  	Buffer		buffer;
! 	PageHeader	dp;
  	OffsetNumber offnum;
  	bool		valid;
  
--- 1343,1349 ----
  	ItemPointer tid = &(tuple->t_self);
  	ItemId		lp;
  	Buffer		buffer;
! 	Page		page;
  	OffsetNumber offnum;
  	bool		valid;
  
***************
*** 1356,1369 ****
  	 * 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
  	 * TID was obtained.
  	 */
  	offnum = ItemPointerGetOffsetNumber(tid);
! 	if (offnum < FirstOffsetNumber || offnum > PageGetMaxOffsetNumber(dp))
  	{
  		LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
  		if (keep_buf)
--- 1356,1369 ----
  	 * 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
  	 * TID was obtained.
  	 */
  	offnum = ItemPointerGetOffsetNumber(tid);
! 	if (offnum < FirstOffsetNumber || offnum >
PageGetMaxOffsetNumber(page))
  	{
  		LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
  		if (keep_buf)
***************
*** 1380,1386 ****
  	/*
  	 * get the item line pointer corresponding to the requested tid
  	 */
! 	lp = PageGetItemId(dp, offnum);
  
  	/*
  	 * Must check for deleted tuple.
--- 1380,1386 ----
  	/*
  	 * get the item line pointer corresponding to the requested tid
  	 */
! 	lp = PageGetItemId(page, offnum);
  
  	/*
  	 * Must check for deleted tuple.
***************
*** 1402,1408 ****
  	/*
  	 * fill in *tuple fields
  	 */
! 	tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
  	tuple->t_len = ItemIdGetLength(lp);
  	tuple->t_tableOid = RelationGetRelid(relation);
  
--- 1402,1408 ----
  	/*
  	 * fill in *tuple fields
  	 */
! 	tuple->t_data = (HeapTupleHeader) PageGetItem(page, lp);
  	tuple->t_len = ItemIdGetLength(lp);
  	tuple->t_tableOid = RelationGetRelid(relation);
  
***************
*** 1627,1633 ****
  	for (;;)
  	{
  		Buffer		buffer;
! 		PageHeader	dp;
  		OffsetNumber offnum;
  		ItemId		lp;
  		HeapTupleData tp;
--- 1627,1633 ----
  	for (;;)
  	{
  		Buffer		buffer;
! 		Page		page;
  		OffsetNumber offnum;
  		ItemId		lp;
  		HeapTupleData tp;
***************
*** 1638,1644 ****
  		 */
  		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
--- 1638,1644 ----
  		 */
  		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
***************
*** 1646,1657 ****
  		 * 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);
--- 1646,1657 ----
  		 * 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);
***************
*** 1660,1666 ****
  
  		/* OK to access the tuple */
  		tp.t_self = ctid;
! 		tp.t_data = (HeapTupleHeader) PageGetItem(dp, lp);
  		tp.t_len = ItemIdGetLength(lp);
  
  		/*
--- 1660,1666 ----
  
  		/* OK to access the tuple */
  		tp.t_self = ctid;
! 		tp.t_data = (HeapTupleHeader) PageGetItem(page, lp);
  		tp.t_len = ItemIdGetLength(lp);
  
  		/*
***************
*** 1964,1970 ****
  	TransactionId xid = GetCurrentTransactionId();
  	ItemId		lp;
  	HeapTupleData tp;
! 	PageHeader	dp;
  	Buffer		buffer;
  	bool		have_tuple_lock = false;
  	bool		iscombo;
--- 1964,1970 ----
  	TransactionId xid = GetCurrentTransactionId();
  	ItemId		lp;
  	HeapTupleData tp;
! 	Page		page;
  	Buffer		buffer;
  	bool		have_tuple_lock = false;
  	bool		iscombo;
***************
*** 1974,1984 ****
  	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;
  
--- 1974,1984 ----
  	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;
  
***************
*** 2112,2118 ****
  	 * 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 |
--- 2112,2118 ----
  	 * 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 |
***************
*** 2150,2157 ****
  
  		recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_DELETE, rdata);
  
! 		PageSetLSN(dp, recptr);
! 		PageSetTLI(dp, ThisTimeLineID);
  	}
  
  	END_CRIT_SECTION();
--- 2150,2157 ----
  
  		recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_DELETE, rdata);
  
! 		PageSetLSN(page, recptr);
! 		PageSetTLI(page, ThisTimeLineID);
  	}
  
  	END_CRIT_SECTION();
***************
*** 2276,2282 ****
  	ItemId		lp;
  	HeapTupleData oldtup;
  	HeapTuple	heaptup;
! 	PageHeader	dp;
  	Buffer		buffer,
  				newbuf;
  	bool		need_toast,
--- 2276,2282 ----
  	ItemId		lp;
  	HeapTupleData oldtup;
  	HeapTuple	heaptup;
! 	Page		page;
  	Buffer		buffer,
  				newbuf;
  	bool		need_toast,
***************
*** 2306,2316 ****
  	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;
  
--- 2306,2316 ----
  	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;
  
***************
*** 2491,2497 ****
  					  HeapTupleHa***ternal(newtup) ||
  					  newtup->t_len > TOAST_TUPLE_THRESHOLD);
  
! 	pagefree = PageGetHeapFreeSpace((Page) dp);
  
  	newtupsize = MAXALIGN(newtup->t_len);
  
--- 2491,2497 ----
  					  HeapTupleHa***ternal(newtup) ||
  					  newtup->t_len > TOAST_TUPLE_THRESHOLD);
  
! 	pagefree = PageGetHeapFreeSpace(page);
  
  	newtupsize = MAXALIGN(newtup->t_len);
  
***************
*** 2557,2563 ****
  			/* 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)
  			{
  				/*
--- 2557,2563 ----
  			/* 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)
  			{
  				/*
***************
*** 2603,2609 ****
  	else
  	{
  		/* Set a hint that the old page could use prune/defrag */
! 		PageSetFull(dp);
  	}
  
  	/* NO ERE****T(ERROR) from here till changes are logged */
--- 2603,2609 ----
  	else
  	{
  		/* Set a hint that the old page could use prune/defrag */
! 		PageSetFull(page);
  	}
  
  	/* NO ERE****T(ERROR) from here till changes are logged */
***************
*** 2621,2627 ****
  	 * 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)
  	{
--- 2621,2627 ----
  	 * 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)
  	{
***************
*** 2946,2952 ****
  	HTSU_Result result;
  	ItemPointer tid = &(tuple->t_self);
  	ItemId		lp;
! 	PageHeader	dp;
  	TransactionId xid;
  	TransactionId xmax;
  	uint16		old_infomask;
--- 2946,2952 ----
  	HTSU_Result result;
  	ItemPointer tid = &(tuple->t_self);
  	ItemId		lp;
! 	Page		page;
  	TransactionId xid;
  	TransactionId xmax;
  	uint16		old_infomask;
***************
*** 2959,2969 ****
  	*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);
  
--- 2959,2969 ----
  	*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);
  
***************
*** 3302,3309 ****
  
  		recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_LOCK, rdata);
  
! 		PageSetLSN(dp, recptr);
! 		PageSetTLI(dp, ThisTimeLineID);
  	}
  
  	END_CRIT_SECTION();
--- 3302,3309 ----
  
  		recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_LOCK, rdata);
  
! 		PageSetLSN(page, recptr);
! 		PageSetTLI(page, ThisTimeLineID);
  	}
  
  	END_CRIT_SECTION();
Index: src/backend/access/heap/hio.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/heap/hio.c,v
retrieving revision 1.71
diff -c -r1.71 hio.c
*** src/backend/access/heap/hio.c	8 Jun 2008 22:00:47 -0000	1.71
--- src/backend/access/heap/hio.c	9 Jul 2008 11:49:34 -0000
***************
*** 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);
Index: src/backend/access/heap/pruneheap.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/heap/pruneheap.c,v
retrieving revision 1.15
diff -c -r1.15 pruneheap.c
*** src/backend/access/heap/pruneheap.c	19 Jun 2008 00:46:03 -0000	1.15
--- src/backend/access/heap/pruneheap.c	9 Jul 2008 11:49:34 -0000
***************
*** 72,78 ****
  void
  heap_page_prune_opt(Relation relation, Buffer buffer, TransactionId
OldestXmin)
  {
! 	PageHeader	dp = (PageHeader) BufferGetPage(buffer);
  	Size		minfree;
  
  	/*
--- 72,78 ----
  void
  heap_page_prune_opt(Relation relation, Buffer buffer, TransactionId
OldestXmin)
  {
! 	Page		page = BufferGetPage(buffer);
  	Size		minfree;
  
  	/*
***************
*** 81,87 ****
  	 * Forget it if page is not hinted to contain something prunable that's
  	 * older than OldestXmin.
  	 */
! 	if (!PageIsPrunable(dp, OldestXmin))
  		return;
  
  	/*
--- 81,87 ----
  	 * Forget it if page is not hinted to contain something prunable that's
  	 * older than OldestXmin.
  	 */
! 	if (!PageIsPrunable(page, OldestXmin))
  		return;
  
  	/*
***************
*** 100,106 ****
  											 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))
--- 100,106 ----
  											 HEAP_DEFAULT_FILLFACTOR);
  	minfree = Max(minfree, BLCKSZ / 10);
  
! 	if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree)
  	{
  		/* OK, try to get exclusive buffer lock */
  		if (!ConditionalLockBufferForCleanup(buffer))
***************
*** 112,118 ****
  		 * 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);
--- 112,118 ----
  		 * 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);
Index: src/backend/access/nbtree/nbtpage.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v
retrieving revision 1.109
diff -c -r1.109 nbtpage.c
*** src/backend/access/nbtree/nbtpage.c	12 May 2008 00:00:45 -0000	1.109
--- src/backend/access/nbtree/nbtpage.c	9 Jul 2008 11:49:34 -0000
***************
*** 436,443 ****
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if (((PageHeader) (page))->pd_special !=
! 		(BLCKSZ - MAXALIGN(sizeof(BTPageOpaqueData))))
  		ere****t(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
--- 436,442 ----
  	/*
  	 * Additionally check that the special area looks sane.
  	 */
! 	if ( (PageGetSpecialSize(page)) != MAXALIGN(sizeof(BTPageOpaqueData)))
  		ere****t(ERROR,
  				(errcode(ERRCODE_INDEX_CORRUPTED),
  				 errmsg("index \"%s\" contains corrupted page at block %u",
***************
*** 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));
  	}
  
Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v
retrieving revision 1.315
diff -c -r1.315 xlog.c
*** src/backend/access/transam/xlog.c	30 Jun 2008 22:10:43 -0000	1.315
--- src/backend/access/transam/xlog.c	9 Jul 2008 11:49:34 -0000
***************
*** 1017,1035 ****
  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
  	 * 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
--- 1017,1035 ----
  XLogCheckBuffer(XLogRecData *rdata, bool doPageWrites,
  				XLogRecPtr *lsn, BkpBlock *bkpb)
  {
! 	Page	page;
  
! 	page = BufferGetPage(rdata->buffer);
  
  	/*
  	 * XXX We assume page LSN is first data on *every* page that can be
passed
  	 * 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
Index: src/backend/access/transam/xlogutils.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/transam/xlogutils.c,v
retrieving revision 1.56
diff -c -r1.56 xlogutils.c
*** src/backend/access/transam/xlogutils.c	19 Jun 2008 00:46:03 -0000	1.56
--- src/backend/access/transam/xlogutils.c	9 Jul 2008 11:49:34 -0000
***************
*** 279,285 ****
  		/* check that page has been initialized */
  		Page		page = (Page) BufferGetPage(buffer);
  
! 		if (PageIsNew((PageHeader) page))
  		{
  			UnlockReleaseBuffer(buffer);
  			log_invalid_page(rnode, blkno, true);
--- 279,285 ----
  		/* check that page has been initialized */
  		Page		page = (Page) BufferGetPage(buffer);
  
! 		if (PageIsNew(page))
  		{
  			UnlockReleaseBuffer(buffer);
  			log_invalid_page(rnode, blkno, true);
Index: src/backend/commands/sequence.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/sequence.c,v
retrieving revision 1.153
diff -c -r1.153 sequence.c
*** src/backend/commands/sequence.c	12 Jun 2008 09:12:30 -0000	1.153
--- src/backend/commands/sequence.c	9 Jul 2008 11:49:34 -0000
***************
*** 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);
  
Index: src/backend/commands/trigger.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/trigger.c,v
retrieving revision 1.234
diff -c -r1.234 trigger.c
*** src/backend/commands/trigger.c	15 May 2008 00:17:39 -0000	1.234
--- src/backend/commands/trigger.c	9 Jul 2008 11:49:34 -0000
***************
*** 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);
Index: src/backend/optimizer/util/plancat.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v
retrieving revision 1.147
diff -c -r1.147 plancat.c
*** src/backend/optimizer/util/plancat.c	19 Jun 2008 00:46:04 -0000	1.147
--- src/backend/optimizer/util/plancat.c	9 Jul 2008 11:49:34 -0000
***************
*** 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;
Index: src/backend/storage/buffer/bufmgr.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v
retrieving revision 1.233
diff -c -r1.233 bufmgr.c
*** src/backend/storage/buffer/bufmgr.c	19 Jun 2008 00:46:05 -0000	1.233
--- src/backend/storage/buffer/bufmgr.c	9 Jul 2008 11:49:34 -0000
***************
*** 263,269 ****
  		 * always have left a zero-filled buffer, complain if not PageIsNew.
  		 */
  		bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) :
BufHdrGetBlock(bufHdr);
! 		if (!PageIsNew((PageHeader) bufBlock))
  			ere****t(ERROR,
  					(errmsg("unexpected data beyond EOF in block %u of relation
%u/%u/%u",
  							blockNum, smgr->smgr_rnode.spcNode, smgr->smgr_rnode.dbNode,
smgr->smgr_rnode.relNode),
--- 263,269 ----
  		 * always have left a zero-filled buffer, complain if not PageIsNew.
  		 */
  		bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) :
BufHdrGetBlock(bufHdr);
! 		if (!PageIsNew((Page) bufBlock))
  			ere****t(ERROR,
  					(errmsg("unexpected data beyond EOF in block %u of relation
%u/%u/%u",
  							blockNum, smgr->smgr_rnode.spcNode, smgr->smgr_rnode.dbNode,
smgr->smgr_rnode.relNode),
Index: src/include/access/hash.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/access/hash.h,v
retrieving revision 1.88
diff -c -r1.88 hash.h
*** src/include/access/hash.h	19 Jun 2008 00:46:05 -0000	1.88
--- src/include/access/hash.h	9 Jul 2008 11:49:35 -0000
***************
*** 166,175 ****
   * Maximum size of a hash index item (it's okay to have only one per
page)
   */
  #define HashMaxItemSize(page) \
! 	(PageGetPageSize(page) - \
! 	 sizeof(PageHeaderData) - \
! 	 MAXALIGN(sizeof(HashPageOpaqueData)) - \
! 	 sizeof(ItemIdData))
  
  #define HASH_MIN_FILLFACTOR			10
  #define HASH_DEFAULT_FILLFACTOR		75
--- 166,175 ----
   * Maximum size of a hash index item (it's okay to have only one per
page)
   */
  #define HashMaxItemSize(page) \
! 	MAXALIGN_DOWN(PageGetPageSize(page) - \
! 				  SizeOfPageHeaderData - \
! 				  sizeof(ItemIdData) - \
! 				  MAXALIGN(sizeof(HashPageOpaqueData)))
  
  #define HASH_MIN_FILLFACTOR			10
  #define HASH_DEFAULT_FILLFACTOR		75
***************
*** 191,198 ****
  #define BMPGSZ_BIT(metap)		((metap)->hashm_bmsize << BYTE_TO_BIT)
  #define BMPG_****FT(metap)		((metap)->hashm_bm****ft)
  #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.
--- 191,197 ----
  #define BMPGSZ_BIT(metap)		((metap)->hashm_bmsize << BYTE_TO_BIT)
  #define BMPG_****FT(metap)		((metap)->hashm_bm****ft)
  #define BMPG_MASK(metap)		(BMPGSZ_BIT(metap) - 1)
! #define HashPageGetBitmap(pg)	((uint32 *) PageGetContents(pg))
  
  /*
   * The number of bits in an ovflpage bitmap word.
Index: src/include/access/htup.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/access/htup.h,v
retrieving revision 1.99
diff -c -r1.99 htup.h
*** src/include/access/htup.h	12 May 2008 00:00:53 -0000	1.99
--- src/include/access/htup.h	9 Jul 2008 11:49:35 -0000
***************
*** 362,373 ****
   * other stuff that has to be on a disk page.  Since heap pages use no
   * "special space", there's no deduction for that.
   *
!  * NOTE: we do not need to count an ItemId for the tuple because
!  * sizeof(PageHeaderData) includes the first ItemId on the page.  But
beware
!  * 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
--- 362,371 ----
   * other stuff that has to be on a disk page.  Since heap pages use no
   * "special space", there's no deduction for that.
   *
!  * NOTE: we include the size of the ItemId for the tuple, so don't
assume that
!  * you can, say, 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))))
  
  /*
--- 379,385 ----
   * require increases in the size of work arrays.
   */
  #define MaxHeapTuplesPerPage	\
! 	((int) ((BLCKSZ - SizeOfPageHeaderData) / \
  			(MAXALIGN(offsetof(HeapTupleHeaderData, t_bits)) +
sizeof(ItemIdData))))
  
  /*
Index: src/include/access/itup.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/access/itup.h,v
retrieving revision 1.49
diff -c -r1.49 itup.h
*** src/include/access/itup.h	1 Jan 2008 19:45:56 -0000	1.49
--- src/include/access/itup.h	9 Jul 2008 11:49:35 -0000
***************
*** 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))))
  
  
Index: src/include/access/nbtree.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/access/nbtree.h,v
retrieving revision 1.120
diff -c -r1.120 nbtree.h
*** src/include/access/nbtree.h	19 Jun 2008 00:46:06 -0000	1.120
--- src/include/access/nbtree.h	9 Jul 2008 11:49:35 -0000
***************
*** 113,125 ****
   *
   * We actually need to be able to fit three items on every page,
   * so restrict any one item to 1/3 the per-page available space.
-  *
-  * Note: sizeof(PageHeaderData) includes the first ItemId, but we have
-  * to allow for 2 more, as well as the end-of-page special space.
   */
  #define BTMaxItemSize(page) \
  	MAXALIGN_DOWN((PageGetPageSize(page) - \
! 				   MAXALIGN(sizeof(PageHeaderData) + 2*sizeof(ItemIdData)) - \
  				   MAXALIGN(sizeof(BTPageOpaqueData))) / 3)
  
  /*
--- 113,122 ----
   *
   * We actually need to be able to fit three items on every page,
   * so restrict any one item to 1/3 the per-page available space.
   */
  #define BTMaxItemSize(page) \
  	MAXALIGN_DOWN((PageGetPageSize(page) - \
! 				   MAXALIGN(SizeOfPageHeaderData + 3*sizeof(ItemIdData)) - \
  				   MAXALIGN(sizeof(BTPageOpaqueData))) / 3)
  
  /*
Index: src/include/access/tuptoaster.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/access/tuptoaster.h,v
retrieving revision 1.40
diff -c -r1.40 tuptoaster.h
*** src/include/access/tuptoaster.h	19 Jun 2008 00:46:06 -0000	1.40
--- src/include/access/tuptoaster.h	9 Jul 2008 11:49:35 -0000
***************
*** 46,55 ****
   */
  #define TOAST_TUPLES_PER_PAGE	4
  
- /* 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
--- 46,54 ----
   */
  #define TOAST_TUPLES_PER_PAGE	4
  
  #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
***************
*** 73,82 ****
   */
  #define EXTERN_TUPLES_PER_PAGE	4		/* tweak only this */
  
- /* 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	\
--- 72,80 ----
   */
  #define EXTERN_TUPLES_PER_PAGE	4		/* tweak only this */
  
  #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	\

--------------000802030406030900030201
Content-Type: text/plain
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0


-- 
Sent via pgsql-patches mailing list (pgsql-patches@[EMAIL PROTECTED]
)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

--------------000802030406030900030201--
 




 26 Posts in Topic:
page macros cleanup
Zdenek.Kotala@[EMAIL PROT  2008-06-13 18:08:35 
Re: page macros cleanup
pavan.deolasee@[EMAIL PRO  2008-07-03 17:20:52 
Re: page macros cleanup
heikki@[EMAIL PROTECTED]   2008-07-03 17:04:51 
Re: page macros cleanup
Zdenek.Kotala@[EMAIL PROT  2008-07-04 10:38:04 
Re: page macros cleanup
pavan.deolasee@[EMAIL PRO  2008-07-04 14:33:41 
Re: page macros cleanup (ver 03)
Zdenek.Kotala@[EMAIL PROT  2008-07-04 11:57:47 
Re: page macros cleanup
Zdenek.Kotala@[EMAIL PROT  2008-07-04 09:31:29 
Re: page macros cleanup
pavan.deolasee@[EMAIL PRO  2008-07-04 14:20:12 
Re: page macros cleanup
heikki@[EMAIL PROTECTED]   2008-07-04 13:07:00 
Re: page macros cleanup
pavan.deolasee@[EMAIL PRO  2008-07-04 16:20:03 
Re: page macros cleanup
heikki@[EMAIL PROTECTED]   2008-07-04 13:55:44 
Re: page macros cleanup
Zdenek.Kotala@[EMAIL PROT  2008-07-04 12:50:55 
Re: page macros cleanup
heikki@[EMAIL PROTECTED]   2008-07-04 14:18:37 
Re: page macros cleanup
pavan.deolasee@[EMAIL PRO  2008-07-04 16:34:15 
Re: page macros cleanup
pavan.deolasee@[EMAIL PRO  2008-07-04 16:35:36 
Re: page macros cleanup
Zdenek.Kotala@[EMAIL PROT  2008-07-04 13:04:15 
Re: page macros cleanup
Zdenek.Kotala@[EMAIL PROT  2008-07-04 13:13:03 
Re: page macros cleanup
Zdenek.Kotala@[EMAIL PROT  2008-07-04 13:47:00 
Re: page macros cleanup (ver 04)
Zdenek.Kotala@[EMAIL PROT  2008-07-04 14:11:59 
Re: page macros cleanup (ver 04)
heikki@[EMAIL PROTECTED]   2008-07-09 14:54:08 
Re: page macros cleanup (ver 04)
tgl@[EMAIL PROTECTED] (T  2008-07-13 15:02:19 
Re: page macros cleanup (ver 04)
Zdenek.Kotala@[EMAIL PROT  2008-07-08 21:28:27 
Re: page macros cleanup (ver 04)
Zdenek.Kotala@[EMAIL PROT  2008-07-09 15:43:59 
Re: page macros cleanup (ver 04)
tgl@[EMAIL PROTECTED] (T  2008-07-13 14:05:44 
Re: page macros cleanup (ver 04)
Zdenek.Kotala@[EMAIL PROT  2008-07-21 21:19:25 
Re: page macros cleanup (ver 04)
tgl@[EMAIL PROTECTED] (T  2008-07-21 16:16:13 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Wed Oct 15 20:38:28 CDT 2008.