summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2016-04-03 19:16:07 +0000
committerTom Lane2016-04-03 19:16:07 +0000
commit8f75fd1f402acbc30bc15dbf51eb6dec1bbec600 (patch)
treed7c56b357ba1a302fdf86321491db4685a154945
parenta9284849b48b04fa2836aaf704659974c13e610d (diff)
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.
-rw-r--r--contrib/bloom/bloom.h5
-rw-r--r--contrib/bloom/blscan.c4
-rw-r--r--contrib/bloom/blutils.c8
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);
}
}