From e898437460f55b49623d1aea435cd92e0011d54d Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Tue, 10 Jan 2017 08:26:52 -0500
Subject: [PATCH] Improve coding in _hash_addovflpage.

Instead of relying on the page contents to know whether we have
advanced from the primary bucket page to an overflow page, track
that explicitly.

Amit Kapila, per a complaint by me.
---
 src/backend/access/hash/hashovfl.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/backend/access/hash/hashovfl.c b/src/backend/access/hash/hashovfl.c
index d2e8f6486bb..e8928efc1aa 100644
--- a/src/backend/access/hash/hashovfl.c
+++ b/src/backend/access/hash/hashovfl.c
@@ -128,11 +128,17 @@ _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin)
 			break;
 
 		/* we assume we do not need to write the unmodified page */
-		if ((pageopaque->hasho_flag & LH_BUCKET_PAGE) && retain_pin)
+		if (retain_pin)
+		{
+			/* pin will be retained only for the primary bucket page */
+			Assert(pageopaque->hasho_flag & LH_BUCKET_PAGE);
 			LockBuffer(buf, BUFFER_LOCK_UNLOCK);
+		}
 		else
 			_hash_relbuf(rel, buf);
 
+		retain_pin = false;
+
 		buf = _hash_getbuf(rel, nextblkno, HASH_WRITE, LH_OVERFLOW_PAGE);
 	}
 
@@ -150,8 +156,12 @@ _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin)
 	/* logically chain overflow page to previous page */
 	pageopaque->hasho_nextblkno = BufferGetBlockNumber(ovflbuf);
 	MarkBufferDirty(buf);
-	if ((pageopaque->hasho_flag & LH_BUCKET_PAGE) && retain_pin)
+	if (retain_pin)
+	{
+		/* pin will be retained only for the primary bucket page */
+		Assert(pageopaque->hasho_flag & LH_BUCKET_PAGE);
 		LockBuffer(buf, BUFFER_LOCK_UNLOCK);
+	}
 	else
 		_hash_relbuf(rel, buf);
 
-- 
GitLab