From f48cd2fa44095e81d358323b758c4686e4324546 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
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 <dgrowleyml@gmail.com>
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

