/* *Astructtodefineapatternofintegers,forusewiththetest_pattern() *function.
*/ typedefstruct
{ char *test_name; /* short name of the test, for humans */ char *pattern_str; /* a bit pattern */
uint64 spacing; /* pattern repeats at this interval */
uint64 num_values; /* number of integers to set in total */
} test_spec;
elog(NOTICE, "testing intset with pattern \"%s\"", spec->test_name); if (intset_test_stats)
fprintf(stderr, "-----\ntesting intset with pattern \"%s\"\n", spec->test_name);
/* Pre-process the pattern, creating an array of integers from it. */
patternlen = strlen(spec->pattern_str);
pattern_values = palloc(patternlen * sizeof(uint64));
pattern_num_values = 0; for (int i = 0; i < patternlen; i++)
{ if (spec->pattern_str[i] == '1')
pattern_values[pattern_num_values++] = i;
}
/* Check that intset_get_num_entries works */
n = intset_num_entries(intset); if (n != spec->num_values)
elog(ERROR, "intset_num_entries returned " UINT64_FORMAT ", expected " UINT64_FORMAT, n, spec->num_values);
intset_begin_iterate(intset);
n = 0;
last_int = 0; while (n < spec->num_values)
{ for (int i = 0; i < pattern_num_values && n < spec->num_values; i++)
{
uint64 expected = last_int + pattern_values[i];
uint64 x;
if (!intset_iterate_next(intset, &x)) break;
if (x != expected)
elog(ERROR, "iterate returned wrong value; got " UINT64_FORMAT ", expected " UINT64_FORMAT, x, expected);
n++;
}
last_int += spec->spacing;
}
endtime = GetCurrentTimestamp(); if (intset_test_stats)
fprintf(stderr, "iterated " UINT64_FORMAT " values in %d ms\n",
n, (int) (endtime - starttime) / 1000);
if (n < spec->num_values)
elog(ERROR, "iterator stopped short after " UINT64_FORMAT " entries, expected " UINT64_FORMAT, n, spec->num_values); if (n > spec->num_values)
elog(ERROR, "iterator returned " UINT64_FORMAT " entries, " UINT64_FORMAT " was expected", n, spec->num_values);
intset_begin_iterate(intset); for (uint64 i = 0; i < n; i++)
{
found = intset_iterate_next(intset, &x); if (!found || x != iter_expected[i])
elog(ERROR, "intset_iterate_next failed for " UINT64_FORMAT, x);
}
found = intset_iterate_next(intset, &x); if (found)
elog(ERROR, "intset_iterate_next failed " UINT64_FORMAT, x);
/* Test intset_is_member() */ if (intset_is_member(intset, 0) != false)
elog(ERROR, "intset_is_member on empty set returned true"); if (intset_is_member(intset, 1) != false)
elog(ERROR, "intset_is_member on empty set returned true"); if (intset_is_member(intset, PG_UINT64_MAX) != false)
elog(ERROR, "intset_is_member on empty set returned true");
/* Test iterator */
intset_begin_iterate(intset); if (intset_iterate_next(intset, &x))
elog(ERROR, "intset_iterate_next on empty set returned a value (" UINT64_FORMAT ")", x);
}
val += UINT64CONST(1152921504606846976); /* 2^60 */
values[num_values++] = val;
/* *We'renowverycloseto2^64,socan'taddlargevaluesanymore.But *addmoresmallervaluestotheend,tomakesurethatalltheabove *valuesgetflushedandpackedintothetreestructure.
*/ while (num_values < 1000)
{
val += pg_prng_uint32(&pg_global_prng_state);
values[num_values++] = val;
}
/* Create an IntegerSet using these values */
intset = intset_create(); for (int i = 0; i < num_values; i++)
intset_add_member(intset, values[i]);
/* *Testintset_is_member()aroundeachofthesevalues
*/ for (int i = 0; i < num_values; i++)
{
uint64 y = values[i]; bool expected; bool result;
if (y > 0)
{
expected = (values[i - 1] == y - 1);
result = intset_is_member(intset, y - 1); if (result != expected)
elog(ERROR, "intset_is_member failed for " UINT64_FORMAT, y - 1);
}
result = intset_is_member(intset, y); if (result != true)
elog(ERROR, "intset_is_member failed for " UINT64_FORMAT, y);
expected = (i != num_values - 1) ? (values[i + 1] == y + 1) : false;
result = intset_is_member(intset, y + 1); if (result != expected)
elog(ERROR, "intset_is_member failed for " UINT64_FORMAT, y + 1);
}
/* *Testiterator
*/
intset_begin_iterate(intset); for (int i = 0; i < num_values; i++)
{
found = intset_iterate_next(intset, &x); if (!found || x != values[i])
elog(ERROR, "intset_iterate_next failed for " UINT64_FORMAT, x);
}
found = intset_iterate_next(intset, &x); if (found)
elog(ERROR, "intset_iterate_next failed " UINT64_FORMAT, x);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.