From 4fb35e379c884b85614ba0b07a8f0f745b8a19fe Mon Sep 17 00:00:00 2001
From: x4m <amborodin@acm.org>
Date: Mon, 25 Jul 2016 13:52:55 +0500
Subject: [PATCH] brinpatch

mend
---
 src/backend/access/brin/brin_pageops.c | 7 +++----
 src/backend/access/brin/brin_xlog.c    | 5 +----
 src/backend/access/gist/gist.c         | 2 +-
 src/backend/access/gist/gistxlog.c     | 2 +-
 src/backend/storage/page/bufpage.c     | 6 ++----
 src/include/storage/bufpage.h          | 2 +-
 6 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/src/backend/access/brin/brin_pageops.c b/src/backend/access/brin/brin_pageops.c
index d0ca485..63c252a 100644
--- a/src/backend/access/brin/brin_pageops.c
+++ b/src/backend/access/brin/brin_pageops.c
@@ -178,10 +178,9 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
 		}
 
 		START_CRIT_SECTION();
-		PageIndexDeleteNoCompact(oldpage, &oldoff, 1);
-		if (PageAddItem(oldpage, (Item) newtup, newsz, oldoff, true,
-						false) == InvalidOffsetNumber)
-			elog(ERROR, "failed to add BRIN tuple");
+
+		PageIndexTupleOverwrite(oldpage,oldoff,(Item)newtup,newsz);
+
 		MarkBufferDirty(oldbuf);
 
 		/* XLOG stuff */
diff --git a/src/backend/access/brin/brin_xlog.c b/src/backend/access/brin/brin_xlog.c
index deb7af4..87c7894 100644
--- a/src/backend/access/brin/brin_xlog.c
+++ b/src/backend/access/brin/brin_xlog.c
@@ -192,10 +192,7 @@ brin_xlog_samepage_update(XLogReaderState *record)
 		if (PageGetMaxOffsetNumber(page) + 1 < offnum)
 			elog(PANIC, "brin_xlog_samepage_update: invalid max offset number");
 
-		PageIndexDeleteNoCompact(page, &offnum, 1);
-		offnum = PageAddItem(page, (Item) brintuple, tuplen, offnum, true, false);
-		if (offnum == InvalidOffsetNumber)
-			elog(PANIC, "brin_xlog_samepage_update: failed to add tuple");
+		PageIndexTupleOverwrite(page,offnum,(Item)brintuple, tuplen);
 
 		PageSetLSN(page, lsn);
 		MarkBufferDirty(buffer);
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index 5ac1211..6e2ac2a 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -508,7 +508,7 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate,
 			/* if we have just one tuple to update we replace it in-place on page */
 			if(ntup == 1)
 			{
-				PageIndexTupleOverwrite(page, oldoffnum, *itup);
+				PageIndexTupleOverwrite(page, oldoffnum, *itup,IndexTupleSize(*itup));
 			}
 			else
 			{
diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c
index 934d50d..67461d9 100644
--- a/src/backend/access/gist/gistxlog.c
+++ b/src/backend/access/gist/gistxlog.c
@@ -90,7 +90,7 @@ gistRedoPageUpdateRecord(XLogReaderState *record)
 			OffsetNumber	offnum = *((OffsetNumber *) data);
 			data += sizeof(OffsetNumber);
 			itup = (IndexTuple) data;
-			PageIndexTupleOverwrite(page,offnum,itup);
+			PageIndexTupleOverwrite(page,offnum,itup,IndexTupleSize(itup));
 			/* set up data pointer to skip PageAddItem loop */
 			data +=IndexTupleSize(itup);
 			Assert(data - begin == datalen);
diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c
index cfbd7f0..842f050 100644
--- a/src/backend/storage/page/bufpage.c
+++ b/src/backend/storage/page/bufpage.c
@@ -682,7 +682,7 @@ PageGetHeapFreeSpace(Page page)
  * Unlike heap pages, we keep compacted line pointers.
  */
 void
-PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup)
+PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup, Size newsize)
 {
 	PageHeader	phdr = (PageHeader) page;
 	char		*addr;
@@ -690,7 +690,6 @@ PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup)
 	int			size_diff;
 	int			oldsize;
 	unsigned	offset;
-	int			newsize;
 	unsigned	alignednewsize;
 	int			itemcount;
 
@@ -718,7 +717,6 @@ PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup)
 
 	Assert(ItemIdHasStorage(tupid));
 
-	newsize = IndexTupleSize(newtup);
 	alignednewsize = MAXALIGN(newsize);
 	oldsize = ItemIdGetLength(tupid);
 	/* may have negative size here if new tuple is larger */
@@ -765,7 +763,7 @@ PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup)
 		{
 			ItemId		ii = PageGetItemId(phdr, i);
 
-			Assert(ItemIdHasStorage(ii));
+			//Assert(ItemIdHasStorage(ii));
 			if (ItemIdGetOffset(ii) <= offset)
 				ii->lp_off += size_diff;
 		}
diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
index eee708b..ef08e7f 100644
--- a/src/include/storage/bufpage.h
+++ b/src/include/storage/bufpage.h
@@ -404,7 +404,7 @@ extern Size PageGetFreeSpace(Page page);
 extern Size PageGetExactFreeSpace(Page page);
 extern Size PageGetHeapFreeSpace(Page page);
 extern void PageIndexTupleDelete(Page page, OffsetNumber offset);
-extern void PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup);
+extern void PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup, Size newsize);
 extern void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems);
 extern void PageIndexDeleteNoCompact(Page page, OffsetNumber *itemnos,
 						 int nitems);
