From ee2b02e09bb4de148c8967bced924730750de744 Mon Sep 17 00:00:00 2001
From: Andrey <amborodin@acm.org>
Date: Thu, 3 Jan 2019 22:29:10 +0500
Subject: [PATCH 2/2] Test left jumps v18

---
 insert.sql                           |  1 +
 rescantest.sh                        | 23 +++++++++++++++++++++++
 src/backend/access/gist/gist.c       |  2 +-
 src/backend/access/gist/gistutil.c   |  2 ++
 src/backend/access/gist/gistvacuum.c |  4 ++++
 vacuum.sql                           |  2 ++
 6 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 insert.sql
 create mode 100755 rescantest.sh
 create mode 100644 vacuum.sql

diff --git a/insert.sql b/insert.sql
new file mode 100644
index 0000000000..3028aa336c
--- /dev/null
+++ b/insert.sql
@@ -0,0 +1 @@
+insert into x select cube(random()) c from generate_series(1,10000) y;
diff --git a/rescantest.sh b/rescantest.sh
new file mode 100755
index 0000000000..2478599c70
--- /dev/null
+++ b/rescantest.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+set -e
+pkill -9 postgres || true
+make -j 16 && make install
+
+DB=~/DemoDb
+BINDIR=~/project/bin
+
+rm -rf $DB
+cp *.sql $BINDIR
+cd $BINDIR
+./initdb $DB
+./pg_ctl -D $DB start
+./psql postgres -c "create extension cube;"
+
+
+./psql postgres -c "create table x as select cube(random()) c from generate_series(1,10000) y; create index on x using gist(c);"
+./psql postgres -c "delete from x where (c~>1)>0.1;"
+./pgbench -f insert.sql postgres -T 30 &
+./pgbench -f vacuum.sql postgres -T 30
+
+./pg_ctl -D $DB stop
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index 3f52b8f4dc..e034906e42 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -585,7 +585,7 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate,
 	 * the child pages first, we wouldn't know the recptr of the WAL record
 	 * we're about to write.
 	 */
-	if (BufferIsValid(leftchildbuf))
+	if (BufferIsValid(leftchildbuf) && ((random()%20) != 0)) // REMOVE THIS LINE randoms
 	{
 		Page		leftpg = BufferGetPage(leftchildbuf);
 
diff --git a/src/backend/access/gist/gistutil.c b/src/backend/access/gist/gistutil.c
index 8d3dfad27b..f34dd03434 100644
--- a/src/backend/access/gist/gistutil.c
+++ b/src/backend/access/gist/gistutil.c
@@ -829,6 +829,8 @@ gistNewBuffer(Relation r)
 	if (needLock)
 		UnlockRelationForExtension(r, ExclusiveLock);
 
+	ReleaseBuffer(ReadBuffer(r, P_NEW));// REMOVE THIS LINE
+
 	return buffer;
 }
 
diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c
index c4ed1b5402..7ce1099b62 100644
--- a/src/backend/access/gist/gistvacuum.c
+++ b/src/backend/access/gist/gistvacuum.c
@@ -256,6 +256,10 @@ restart:
 			(opaque->rightlink != InvalidBlockNumber) &&
 			(opaque->rightlink < orig_blkno))
 		{
+			if (GistFollowRight(page)) // REMOVE THIS LINE
+				elog(WARNING,"RESCAN TRIGGERED BY FollowRight"); // REMOVE THIS LINE
+			if (vstate->startNSN < GistPageGetNSN(page)) // REMOVE THIS LINE
+				elog(WARNING,"RESCAN TRIGGERED BY NSN"); // REMOVE THIS LINE
 			recurse_to = opaque->rightlink;
 		}
 
diff --git a/vacuum.sql b/vacuum.sql
new file mode 100644
index 0000000000..f30150bf01
--- /dev/null
+++ b/vacuum.sql
@@ -0,0 +1,2 @@
+delete from x where (c~>1)>0.1;
+vacuum x;
-- 
2.19.2

