From f48cd2fa44095e81d358323b758c4686e4324546 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Tue, 25 Aug 2026 02:47:15 +1200 Subject: [PATCH v1] Align random test function parameters in test_bitmapset 53a981ed5 adjusted test_random_offset_operations() so that the minimum value parameter came before the maximum value parameter. Here we adjust test_random_operations() so that it accepts absolute numbers for the minimum and maximum values. Previously the maximum value to put in the random Bitmapset was the minimum value plus the range. Backpatch to v19 as test_random_operations() is new there. Author: David Rowley Discussion: https://postgr.es/m/66d041b4-32f4-4097-bb2c-0e7147337a5e@app.fastmail.com Backpatch-through: 19 --- .../expected/test_bitmapset.out | 2 +- .../test_bitmapset/sql/test_bitmapset.sql | 2 +- .../modules/test_bitmapset/test_bitmapset.c | 38 +++++++++++-------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/test/modules/test_bitmapset/expected/test_bitmapset.out b/src/test/modules/test_bitmapset/expected/test_bitmapset.out index 106898d09d5..f8f5cf5e7f0 100644 --- a/src/test/modules/test_bitmapset/expected/test_bitmapset.out +++ b/src/test/modules/test_bitmapset/expected/test_bitmapset.out @@ -1643,7 +1643,7 @@ SELECT test_bms_nonempty_difference('(b 1 2)', '(b 50 100)') AS result; (1 row) -- random operations -SELECT test_random_operations(NULL, 10000, 81920, 0) > 0 AS result; +SELECT test_random_operations(NULL, 10000, 0, 81920) > 0 AS result; result -------- t diff --git a/src/test/modules/test_bitmapset/sql/test_bitmapset.sql b/src/test/modules/test_bitmapset/sql/test_bitmapset.sql index 67ad57cf956..d44cda114a4 100644 --- a/src/test/modules/test_bitmapset/sql/test_bitmapset.sql +++ b/src/test/modules/test_bitmapset/sql/test_bitmapset.sql @@ -421,7 +421,7 @@ SELECT test_bms_nonempty_difference('(b 100)', '(b 5)') AS result; SELECT test_bms_nonempty_difference('(b 1 2)', '(b 50 100)') AS result; -- random operations -SELECT test_random_operations(NULL, 10000, 81920, 0) > 0 AS result; +SELECT test_random_operations(NULL, 10000, 0, 81920) > 0 AS result; -- perform some random tests on bms_offset_members() SELECT test_random_offset_operations(NULL, 1000, 0, 1024) AS result; diff --git a/src/test/modules/test_bitmapset/test_bitmapset.c b/src/test/modules/test_bitmapset/test_bitmapset.c index f7de9e7757e..dde3875281d 100644 --- a/src/test/modules/test_bitmapset/test_bitmapset.c +++ b/src/test/modules/test_bitmapset/test_bitmapset.c @@ -598,10 +598,11 @@ test_bitmap_match(PG_FUNCTION_ARGS) * equivalent C functions, this stresses Bitmapsets in a random fashion for * various operations. * - * "min_value" is the minimal value used for the members, that will stand - * up to a range of "max_range". "num_ops" defines the number of time each - * operation is done. "seed" is a random seed used to calculate the member - * values. When "seed" is NULL, a random seed will be chosen automatically. + * Arguments: + * arg1: optional random seed. NULL means use a random seed. + * arg2: defines the number of time each operation is done. + * arg3: the minimum bitmapset member number to use in the random set. + * arg4: the maximum bitmapset member number to use in the random set. * * The return value is the number of times all operations have been executed. */ @@ -615,9 +616,10 @@ test_random_operations(PG_FUNCTION_ARGS) pg_prng_state state; uint64 seed = GetCurrentTimestamp(); int num_ops; - int max_range; int min_value; + int max_value; int member; + uint32 range; int *members; int num_members = 0; int total_ops = 0; @@ -625,18 +627,22 @@ test_random_operations(PG_FUNCTION_ARGS) if (!PG_ARGISNULL(0)) seed = PG_GETARG_INT64(0); - num_ops = PG_GETARG_INT32(1); - max_range = PG_GETARG_INT32(2); - min_value = PG_GETARG_INT32(3); - - if (PG_ARGISNULL(1) || num_ops <= 0) + if (PG_ARGISNULL(1) || PG_GETARG_INT32(1) <= 0) elog(ERROR, "invalid number of operations"); - if (PG_ARGISNULL(2) || max_range <= 0) - elog(ERROR, "invalid maximum range"); - if (PG_ARGISNULL(3) || min_value < 0) + if (PG_ARGISNULL(2) || PG_GETARG_INT32(2) < 0) elog(ERROR, "invalid minimum value"); + if (PG_ARGISNULL(3) || PG_GETARG_INT32(3) < 0) + elog(ERROR, "invalid maximum value"); + + num_ops = PG_GETARG_INT32(1); + min_value = PG_GETARG_INT32(2); + max_value = PG_GETARG_INT32(3); + + if (max_value < min_value) + elog(ERROR, "maximum value must be greater than or equal to minimum value"); pg_prng_seed(&state, seed); + range = (uint32) max_value - (uint32) min_value + 1; /* * There can be up to "num_ops" members added. This is very unlikely, @@ -650,7 +656,7 @@ test_random_operations(PG_FUNCTION_ARGS) { CHECK_FOR_INTERRUPTS(); - member = pg_prng_uint32(&state) % max_range + min_value; + member = min_value + (pg_prng_uint32(&state) % range); if (!bms_is_member(member, bms1)) members[num_members++] = member; @@ -662,7 +668,7 @@ test_random_operations(PG_FUNCTION_ARGS) { CHECK_FOR_INTERRUPTS(); - member = pg_prng_uint32(&state) % max_range + min_value; + member = min_value + (pg_prng_uint32(&state) % range); if (!bms_is_member(member, bms2)) members[num_members++] = member; @@ -737,7 +743,7 @@ test_random_operations(PG_FUNCTION_ARGS) switch (pg_prng_uint32(&state) % 3) { case 0: /* add */ - member = pg_prng_uint32(&state) % max_range + min_value; + member = min_value + (pg_prng_uint32(&state) % range); if (!bms_is_member(member, bms)) members[num_members++] = member; bms = bms_add_member(bms, member); -- 2.53.0