52 "all ones",
"1111111111",
56 "alternating bits",
"0101010101",
60 "clusters of ten",
"1111111111",
64 "clusters of hundred",
65 "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
73 "sparse",
"100000000000000000000000000000001",
77 "single values, distance > 2^32",
"1",
81 "clusters, distance > 2^32",
"10101010",
85 "clusters, distance > 2^60",
"10101010",
142 uint64 pattern_num_values;
146 fprintf(stderr,
"-----\ntesting intset with pattern \"%s\"\n", spec->
test_name);
151 pattern_num_values = 0;
152 for (
int i = 0;
i < patternlen;
i++)
155 pattern_values[pattern_num_values++] =
i;
181 while (n < spec->num_values)
185 for (
int i = 0;
i < pattern_num_values && n < spec->
num_values;
i++)
187 x = last_int + pattern_values[
i];
199 spec->
num_values, (
int) (endtime - starttime) / 1000);
220 mem_usage, (
double) mem_usage / spec->
num_values);
235 for (n = 0; n < 100000; n++)
257 if (
idx >= patternlen)
274 n, (
int) (endtime - starttime) / 1000);
284 while (n < spec->num_values)
286 for (
int i = 0;
i < pattern_num_values && n < spec->
num_values;
i++)
288 uint64 expected = last_int + pattern_values[
i];
303 n, (
int) (endtime - starttime) / 1000);
305 if (n < spec->num_values)
332 if (num_entries != 1)
340 elog(
ERROR,
"intset_is_member failed for 0");
342 elog(
ERROR,
"intset_is_member failed for 1");
344 elog(
ERROR,
"intset_is_member failed for PG_UINT64_MAX");
346 elog(
ERROR,
"intset_is_member failed for the tested value");
384 value, filler_min, filler_max);
388 iter_expected =
palloc(
sizeof(
uint64) * (filler_max - filler_min + 1));
389 if (
value < filler_min)
392 iter_expected[n++] =
value;
395 for (
x = filler_min;
x < filler_max;
x++)
398 iter_expected[n++] =
x;
401 if (
value >= filler_max)
404 iter_expected[n++] =
value;
409 if (num_entries != n)
417 value, filler_min, filler_max);
419 value, filler_min, filler_max);
421 value, filler_min, filler_max);
423 value, filler_min, filler_max);
425 value, filler_min, filler_max);
427 value, filler_min, filler_max);
429 value, filler_min, filler_max);
431 value, filler_min, filler_max);
433 value, filler_min, filler_max);
435 value, filler_min, filler_max);
437 value, filler_min, filler_max);
439 value, filler_min, filler_max);
441 value, filler_min, filler_max);
447 if (!found ||
x != iter_expected[
i])
455 if (mem_usage < 5000 || mem_usage > 500000000)
472 expected = (
x ==
value || (filler_min <=
x &&
x < filler_max));
476 if (actual != expected)
489 elog(
NOTICE,
"testing intset with empty set");
495 elog(
ERROR,
"intset_is_member on empty set returned true");
497 elog(
ERROR,
"intset_is_member on empty set returned true");
499 elog(
ERROR,
"intset_is_member on empty set returned true");
524 elog(
NOTICE,
"testing intset with distances > 2^60 between values");
568 while (num_values < 1000)
576 for (
int i = 0;
i < num_values;
i++)
582 for (
int i = 0;
i < num_values;
i++)
590 expected = (
values[
i - 1] ==
y - 1);
592 if (result != expected)
600 expected = (
i != num_values - 1) ? (
values[
i + 1] ==
y + 1) :
false;
602 if (result != expected)
610 for (
int i = 0;
i < num_values;
i++)
Datum intset(PG_FUNCTION_ARGS)
Datum idx(PG_FUNCTION_ARGS)
TimestampTz GetCurrentTimestamp(void)
static Datum values[MAXATTR]
#define fprintf(file, fmt, msg)
uint64 intset_memory_usage(IntegerSet *intset)
uint64 intset_num_entries(IntegerSet *intset)
bool intset_is_member(IntegerSet *intset, uint64 x)
void intset_begin_iterate(IntegerSet *intset)
bool intset_iterate_next(IntegerSet *intset, uint64 *next)
IntegerSet * intset_create(void)
void intset_add_member(IntegerSet *intset, uint64 x)
MemoryContext CurrentMemoryContext
void MemoryContextStats(MemoryContext context)
void MemoryContextDelete(MemoryContext context)
void MemoryContextSetIdentifier(MemoryContext context, const char *id)
#define AllocSetContextCreate
#define ALLOCSET_SMALL_SIZES
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
uint64 pg_prng_uint64_range(pg_prng_state *state, uint64 rmin, uint64 rmax)
uint32 pg_prng_uint32(pg_prng_state *state)
pg_prng_state pg_global_prng_state
static void test_pattern(const test_spec *spec)
static const bool intset_test_stats
Datum test_integerset(PG_FUNCTION_ARGS)
static void test_single_value(uint64 value)
PG_FUNCTION_INFO_V1(test_integerset)
static void test_empty(void)
static const test_spec test_specs[]
static void test_single_value_and_filler(uint64 value, uint64 filler_min, uint64 filler_max)
static void check_with_filler(IntegerSet *intset, uint64 x, uint64 value, uint64 filler_min, uint64 filler_max)
static void test_huge_distances(void)