diff --git a/contrib/bloom/blinsert.c b/contrib/bloom/blinsert.c index 9e6678087ca8140a99012ada00d18811e9f38497..6eecb12187dc09f7c6564cc82baa95d07f38e02f 100644 --- a/contrib/bloom/blinsert.c +++ b/contrib/bloom/blinsert.c @@ -96,10 +96,10 @@ bloomBuildCallback(Relation index, HeapTuple htup, Datum *values, initCachedPage(buildstate); - if (BloomPageAddItem(&buildstate->blstate, buildstate->data, itup) == false) + if (!BloomPageAddItem(&buildstate->blstate, buildstate->data, itup)) { /* We shouldn't be here since we're inserting to the empty page */ - elog(ERROR, "can not add new tuple"); + elog(ERROR, "could not add new bloom tuple to empty page"); } } @@ -298,7 +298,12 @@ blinsert(Relation index, Datum *values, bool *isnull, metaData = BloomPageGetMeta(metaPage); page = GenericXLogRegister(state, buffer, true); BloomInitPage(page, 0); - BloomPageAddItem(&blstate, page, itup); + + if (!BloomPageAddItem(&blstate, page, itup)) + { + /* We shouldn't be here since we're inserting to the empty page */ + elog(ERROR, "could not add new bloom tuple to empty page"); + } metaData->nStart = 0; metaData->nEnd = 1; diff --git a/contrib/bloom/bloom.h b/contrib/bloom/bloom.h index fb0bc07f2846d9b58b70f23ac7cea8c708985ffa..8f3881d844665b0ec1c60ca91a8b28e2574d8fd6 100644 --- a/contrib/bloom/bloom.h +++ b/contrib/bloom/bloom.h @@ -118,7 +118,7 @@ typedef struct BloomState * sizeOfBloomTuple is index's specific, and it depends on reloptions, so * precompute it */ - int32 sizeOfBloomTuple; + Size sizeOfBloomTuple; } BloomState; #define BloomPageGetFreeSpace(state, page) \ @@ -134,7 +134,7 @@ typedef uint16 SignType; typedef struct BloomTuple { ItemPointerData heapPtr; - SignType sign[1]; + SignType sign[FLEXIBLE_ARRAY_MEMBER]; } BloomTuple; #define BLOOMTUPLEHDRSZ offsetof(BloomTuple, sign) diff --git a/contrib/bloom/blscan.c b/contrib/bloom/blscan.c index d156e88669ab14af3b2b08aaaedd5deb2beb9b52..6e3cb84bb11d09935bba41c733221c3282f37fdc 100644 --- a/contrib/bloom/blscan.c +++ b/contrib/bloom/blscan.c @@ -94,7 +94,7 @@ blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm) BufferAccessStrategy bas; BloomScanOpaque so = (BloomScanOpaque) scan->opaque; - if (so->sign == NULL && scan->numberOfKeys > 0) + if (so->sign == NULL) { /* New search: have to calculate search signature */ ScanKey skey = scan->keyData; @@ -151,10 +151,13 @@ blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm) bool res = true; /* Check index signature with scan signature */ - for (i = 0; res && 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]) + { res = false; + break; + } } /* Add matching tuples to bitmap */