From 5da3089fa72ac87e8e9ccaf0fc9ccfbbfb2c22d5 Mon Sep 17 00:00:00 2001
From: x4m <amborodin@acm.org>
Date: Sun, 3 Jul 2016 12:51:55 +0500
Subject: [PATCH] fix

---
 src/backend/access/gist/gist.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index 996363c..49c4560 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -503,9 +503,44 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate,
 		 * PageIndexTupleDelete() here and PageIndexMultiDelete() in
 		 * gistRedoPageUpdateRecord()
 		 */
+
+#ifdef OLDBEHAVIOR
 		if (OffsetNumberIsValid(oldoffnum))
 			PageIndexTupleDelete(page, oldoffnum);
 		gistfillbuffer(page, itup, ntup, InvalidOffsetNumber);
+#else
+		if (OffsetNumberIsValid(oldoffnum))
+		{
+			if(ntup==1)
+			{
+				ItemId		itemId;
+				Size		newsz;
+				Item		pageItem;
+				newsz = IndexTupleSize(*itup);
+				itemId = PageGetItemId(page,oldoffnum);
+				pageItem = PageGetItem(page,itemId);
+				if(IndexTupleSize(pageItem)==newsz)
+				{
+					memmove(pageItem,*itup,newsz);
+				}
+				else
+				{
+					PageIndexTupleDelete(page, oldoffnum);
+					gistfillbuffer(page, itup, ntup, InvalidOffsetNumber);
+				}
+			}
+			else
+			{
+				PageIndexTupleDelete(page, oldoffnum);
+				gistfillbuffer(page, itup, ntup, InvalidOffsetNumber);
+			}
+		}
+		else
+		{
+			gistfillbuffer(page, itup, ntup, InvalidOffsetNumber);
+		}
+#endif
+
 
 		MarkBufferDirty(buffer);
 
