From 8f75fd1f402acbc30bc15dbf51eb6dec1bbec600 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sun, 3 Apr 2016 15:16:07 -0400
Subject: [PATCH] Fix contrib/bloom to not fail under CLOBBER_CACHE_ALWAYS.

The code was supposing that rd_amcache wouldn't disappear from under it
during a scan; which is wrong.  Copy the data out of the relcache rather
than trying to reference it there.
---
 contrib/bloom/bloom.h   | 5 ++---
 contrib/bloom/blscan.c  | 4 ++--
 contrib/bloom/blutils.c | 8 ++++----
 3 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/contrib/bloom/bloom.h b/contrib/bloom/bloom.h
index 8f3881d8446..d5284f37253 100644
--- a/contrib/bloom/bloom.h
+++ b/contrib/bloom/bloom.h
@@ -110,12 +110,11 @@ typedef struct BloomMetaPageData
 typedef struct BloomState
 {
 	FmgrInfo	hashFn[INDEX_MAX_KEYS];
-	BloomOptions *opts;			/* stored in rd_amcache and defined at
-								 * creation time */
+	BloomOptions opts;			/* copy of options on index's metapage */
 	int32		nColumns;
 
 	/*
-	 * sizeOfBloomTuple is index's specific, and it depends on reloptions, so
+	 * sizeOfBloomTuple is index-specific, and it depends on reloptions, so
 	 * precompute it
 	 */
 	Size		sizeOfBloomTuple;
diff --git a/contrib/bloom/blscan.c b/contrib/bloom/blscan.c
index 6e3cb84bb11..ba137835494 100644
--- a/contrib/bloom/blscan.c
+++ b/contrib/bloom/blscan.c
@@ -99,7 +99,7 @@ blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm)
 		/* New search: have to calculate search signature */
 		ScanKey		skey = scan->keyData;
 
-		so->sign = palloc0(sizeof(SignType) * so->state.opts->bloomLength);
+		so->sign = palloc0(sizeof(SignType) * so->state.opts.bloomLength);
 
 		for (i = 0; i < scan->numberOfKeys; i++)
 		{
@@ -151,7 +151,7 @@ blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm)
 				bool		res = true;
 
 				/* Check index signature with scan signature */
-				for (i = 0; i < so->state.opts->bloomLength; i++)
+				for (i = 0; i < so->state.opts.bloomLength; i++)
 				{
 					if ((itup->sign[i] & so->sign[i]) != so->sign[i])
 					{
diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c
index 92ab85811b8..be056c33ba0 100644
--- a/contrib/bloom/blutils.c
+++ b/contrib/bloom/blutils.c
@@ -155,9 +155,9 @@ initBloomState(BloomState *state, Relation index)
 		index->rd_amcache = (void *) opts;
 	}
 
-	state->opts = (BloomOptions *) index->rd_amcache;
+	memcpy(&state->opts, index->rd_amcache, sizeof(state->opts));
 	state->sizeOfBloomTuple = BLOOMTUPLEHDRSZ +
-		sizeof(SignType) * state->opts->bloomLength;
+		sizeof(SignType) * state->opts.bloomLength;
 }
 
 /*
@@ -228,10 +228,10 @@ signValue(BloomState *state, SignType *sign, Datum value, int attno)
 	hashVal = DatumGetInt32(FunctionCall1(&state->hashFn[attno], value));
 	mySrand(hashVal ^ myRand());
 
-	for (j = 0; j < state->opts->bitSize[attno]; j++)
+	for (j = 0; j < state->opts.bitSize[attno]; j++)
 	{
 		/* prevent mutiple evaluation */
-		nBit = myRand() % (state->opts->bloomLength * BITSIGNTYPE);
+		nBit = myRand() % (state->opts.bloomLength * BITSIGNTYPE);
 		SETBIT(sign, nBit);
 	}
 }
-- 
GitLab