diff --git a/src/backend/lib/bloomfilter.c b/src/backend/lib/bloomfilter.c index 73b3768a172..b24c932ab8f 100644 --- a/src/backend/lib/bloomfilter.c +++ b/src/backend/lib/bloomfilter.c @@ -91,6 +91,9 @@ bloom_create(int64 total_elems, int bloom_work_mem, uint64 seed) uint64 bitset_bytes; uint64 bitset_bits; + if (total_elems <= 0) + elog(ERROR, "total number of elements must be greater than zero"); + /* * Aim for two bytes per element; this is sufficient to get a false * positive rate below 1%, independent of the size of the bitset or total @@ -98,7 +101,8 @@ bloom_create(int64 total_elems, int bloom_work_mem, uint64 seed) * the next lowest power of two turns out to be a significant drop, the * false positive rate still won't exceed 2% in almost all cases. */ - bitset_bytes = Min(bloom_work_mem * UINT64CONST(1024), total_elems * 2); + bitset_bytes = Min(bloom_work_mem * UINT64CONST(1024), + (uint64) total_elems * 2); bitset_bytes = Max(1024 * 1024, bitset_bytes); /* diff --git a/src/test/modules/test_bloomfilter/expected/test_bloomfilter.out b/src/test/modules/test_bloomfilter/expected/test_bloomfilter.out index 21c068867d6..137eb4f2140 100644 --- a/src/test/modules/test_bloomfilter/expected/test_bloomfilter.out +++ b/src/test/modules/test_bloomfilter/expected/test_bloomfilter.out @@ -9,6 +9,12 @@ SELECT test_bloomfilter(power => 23, (1 row) +-- A Bloom filter cannot be sized for an empty set. +SELECT test_bloomfilter(power => 23, + nelements => 0, + seed => 0, + tests => 1); +ERROR: total number of elements must be greater than zero -- Equivalent "10 bits per element" tests for all possible bitset sizes: -- -- SELECT test_bloomfilter(24, 1677722) diff --git a/src/test/modules/test_bloomfilter/sql/test_bloomfilter.sql b/src/test/modules/test_bloomfilter/sql/test_bloomfilter.sql index 9ec159ce404..5a94c95eb2a 100644 --- a/src/test/modules/test_bloomfilter/sql/test_bloomfilter.sql +++ b/src/test/modules/test_bloomfilter/sql/test_bloomfilter.sql @@ -6,6 +6,12 @@ SELECT test_bloomfilter(power => 23, seed => -1, tests => 1); +-- A Bloom filter cannot be sized for an empty set. +SELECT test_bloomfilter(power => 23, + nelements => 0, + seed => 0, + tests => 1); + -- Equivalent "10 bits per element" tests for all possible bitset sizes: -- -- SELECT test_bloomfilter(24, 1677722)