generate_random_offsets.patch

application/octet-stream

Filename: generate_random_offsets.patch
Type: application/octet-stream
Part: 0
Message: Re: TRAP: failed Assert("offsets[i] > offsets[i - 1]"), File: "tidstore.c"

Patch

Format: unified
File+
src/test/modules/test_tidstore/expected/test_tidstore.out 10 7
src/test/modules/test_tidstore/sql/test_tidstore.sql 11 7
diff --git a/src/test/modules/test_tidstore/expected/test_tidstore.out b/src/test/modules/test_tidstore/expected/test_tidstore.out
index cbcacfd26e1..ad92041bf35 100644
--- a/src/test/modules/test_tidstore/expected/test_tidstore.out
+++ b/src/test/modules/test_tidstore/expected/test_tidstore.out
@@ -6,6 +6,11 @@ CREATE TEMP TABLE hideblocks(blockno bigint);
 -- The maximum number of heap tuples (MaxHeapTuplesPerPage) in 8kB block is 291.
 -- We use a higher number to test tidstore.
 \set maxoffset 512
+CREATE FUNCTION generate_random_offsets(noffs int) RETURNS int2[]
+BEGIN ATOMIC
+  SELECT array_agg(DISTINCT val ORDER BY val)
+  FROM (SELECT ((random() * :maxoffset)::int + 1) as val FROM generate_series(1, noffs));
+END;
 SELECT test_create(false);
  test_create 
 -------------
@@ -39,8 +44,7 @@ SELECT do_set_block_offsets(501, array[greatest((random() * :maxoffset)::int, 1)
                   501
 (1 row)
 
-SELECT do_set_block_offsets(502, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[])
-  FROM generate_series(1, 3);
+SELECT do_set_block_offsets(502, generate_random_offsets(3));
  do_set_block_offsets 
 ----------------------
                   502
@@ -202,8 +206,7 @@ SELECT do_set_block_offsets(501, array[greatest((random() * :maxoffset)::int, 1)
                   501
 (1 row)
 
-SELECT do_set_block_offsets(502, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[])
-  FROM generate_series(1, 3);
+SELECT do_set_block_offsets(502, generate_random_offsets(3));
  do_set_block_offsets 
 ----------------------
                   502
@@ -212,9 +215,8 @@ SELECT do_set_block_offsets(502, array_agg(DISTINCT greatest((random() * :maxoff
 -- Random TIDs test. The offset numbers are randomized and must be
 -- unique and ordered.
 INSERT INTO hideblocks (blockno)
-SELECT do_set_block_offsets(blkno, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[])
-  FROM generate_series(1, 100) num_offsets,
-  generate_series(1000, 1100, 1) blkno
+SELECT do_set_block_offsets(blkno, generate_random_offsets(100))
+  FROM generate_series(1000, 1100, 1) blkno
 GROUP BY blkno;
 -- Check TIDs we've added to the store.
 SELECT check_set_block_offsets();
@@ -231,3 +233,4 @@ SELECT test_destroy();
 (1 row)
 
 DROP TABLE hideblocks;
+DROP FUNCTION generate_random_offsets(integer);
diff --git a/src/test/modules/test_tidstore/sql/test_tidstore.sql b/src/test/modules/test_tidstore/sql/test_tidstore.sql
index a29e4ec1c55..38f08d23501 100644
--- a/src/test/modules/test_tidstore/sql/test_tidstore.sql
+++ b/src/test/modules/test_tidstore/sql/test_tidstore.sql
@@ -9,6 +9,12 @@ CREATE TEMP TABLE hideblocks(blockno bigint);
 -- We use a higher number to test tidstore.
 \set maxoffset 512
 
+CREATE FUNCTION generate_random_offsets(noffs int) RETURNS int2[]
+BEGIN ATOMIC
+  SELECT array_agg(DISTINCT val ORDER BY val)
+  FROM (SELECT ((random() * :maxoffset)::int + 1) as val FROM generate_series(1, noffs));
+END;
+
 SELECT test_create(false);
 
 -- Test on empty tidstore.
@@ -25,8 +31,7 @@ SELECT do_set_block_offsets(blk, array_agg(off)::int2[])
 
 -- Test offsets embedded in the bitmap header.
 SELECT do_set_block_offsets(501, array[greatest((random() * :maxoffset)::int, 1)]::int2[]);
-SELECT do_set_block_offsets(502, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[])
-  FROM generate_series(1, 3);
+SELECT do_set_block_offsets(502, generate_random_offsets(3));
 
 -- Add enough TIDs to cause the store to appear "full", compared
 -- to the allocated memory it started out with. This is easier
@@ -67,15 +72,13 @@ SELECT test_create(true);
 
 -- Test offsets embedded in the bitmap header.
 SELECT do_set_block_offsets(501, array[greatest((random() * :maxoffset)::int, 1)]::int2[]);
-SELECT do_set_block_offsets(502, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[])
-  FROM generate_series(1, 3);
+SELECT do_set_block_offsets(502, generate_random_offsets(3));
 
 -- Random TIDs test. The offset numbers are randomized and must be
 -- unique and ordered.
 INSERT INTO hideblocks (blockno)
-SELECT do_set_block_offsets(blkno, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[])
-  FROM generate_series(1, 100) num_offsets,
-  generate_series(1000, 1100, 1) blkno
+SELECT do_set_block_offsets(blkno, generate_random_offsets(100))
+  FROM generate_series(1000, 1100, 1) blkno
 GROUP BY blkno;
 
 -- Check TIDs we've added to the store.
@@ -84,3 +87,4 @@ SELECT check_set_block_offsets();
 -- cleanup
 SELECT test_destroy();
 DROP TABLE hideblocks;
+DROP FUNCTION generate_random_offsets(integer);