From 8f75fd1f402acbc30bc15dbf51eb6dec1bbec600 Mon Sep 17 00:00:00 2001 From: Tom Lane 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 8f3881d844..d5284f3725 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 6e3cb84bb1..ba13783549 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 92ab85811b..be056c33ba 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); } }