diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c
index 1a970a137514a3bf5c8ae010ed837e25bef32030..dd1b44d334cd32deb9d78ee49eac5586aee6a9a2 100644
--- a/src/backend/storage/page/bufpage.c
+++ b/src/backend/storage/page/bufpage.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.31 2000/07/21 06:42:33 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.32 2000/10/20 11:28:39 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -80,6 +80,9 @@ PageAddItem(Page page,
 	ItemId		itemId;
 	OffsetNumber limit;
 	bool		needshuffle = false;
+	bool		overwritemode = flags & OverwritePageMode;
+
+	flags &= ~OverwritePageMode;
 
 	/*
 	 * Find first unallocated offsetNumber
@@ -89,8 +92,28 @@ PageAddItem(Page page,
 	/* was offsetNumber passed in? */
 	if (OffsetNumberIsValid(offsetNumber))
 	{
-		needshuffle = true;		/* need to increase "lower" */
-		/* don't actually do the shuffle till we've checked free space! */
+		if (overwritemode)
+		{
+			if (offsetNumber > limit)
+			{
+				elog(NOTICE, "PageAddItem: tried overwrite after maxoff");
+				return InvalidOffsetNumber;
+			}
+			itemId = &((PageHeader) page)->pd_linp[offsetNumber - 1];
+			if (((*itemId).lp_flags & LP_USED) ||
+				((*itemId).lp_len != 0))
+			{
+				elog(NOTICE, "PageAddItem: tried overwrite of used ItemId");
+				return InvalidOffsetNumber;
+			}
+		}
+		else
+		{
+			/*
+			 * Don't actually do the shuffle till we've checked free space!
+			 */
+			needshuffle = true;		/* need to increase "lower" */
+		}
 	}
 	else
 	{