Fix contrib/bloom to not fail under CLOBBER_CACHE_ALWAYS.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 3 Apr 2016 19:16:07 +0000 (15:16 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 3 Apr 2016 19:16:07 +0000 (15:16 -0400)
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
contrib/bloom/blscan.c
contrib/bloom/blutils.c

index 8f3881d844665b0ec1c60ca91a8b28e2574d8fd6..d5284f372536d1536abd6a4f437ffa1d4c01eb05 100644 (file)
@@ -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;
index 6e3cb84bb11d09935bba41c733221c3282f37fdc..ba13783549424b5947e9618d9e5c1fbf6bd60783 100644 (file)
@@ -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])
                                        {
index 92ab85811b842ba53118232e99dd00a3b07cc549..be056c33ba08b3fd451d6e843cda108660daa52a 100644 (file)
@@ -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);
        }
 }