WAL need in overwrite mode - restored in new way
authorVadim B. Mikheev <vadim4o@yahoo.com>
Fri, 20 Oct 2000 11:28:39 +0000 (11:28 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Fri, 20 Oct 2000 11:28:39 +0000 (11:28 +0000)
(without PageManagetSetMode -:))
Safe shuffle mode behaviour retained.

src/backend/storage/page/bufpage.c

index 1a970a137514a3bf5c8ae010ed837e25bef32030..dd1b44d334cd32deb9d78ee49eac5586aee6a9a2 100644 (file)
@@ -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
    {