aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/storage/page/bufpage.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c
index 1a970a13751..dd1b44d334c 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
{