Skip to content

Commit ed205b5

Browse files
committed
contrib/pgbench: Mark PRNG and random functions as PARALLEL RESTRICTED
In contrib/pgbench, the random distribution functions (random, random_gaussian, random_exponential, random_zipfian, and random_poisson) were previously marked PARALLEL SAFE, while setseed() was marked PARALLEL UNSAFE. Because these functions read and modify process-local PRNG state (pgbench_prng_state), they cannot safely run inside parallel worker processes without coordinating seed state. In particular, when running regression tests under debug_parallel_query = regress (which is enabled by default in PostgreSQL's macOS CI runner via PG_TEST_INITDB_EXTRA_OPTS), the query planner wraps PARALLEL SAFE queries in a Gather node and offloads evaluation to parallel workers. Those workers do not inherit the seed initialized by setseed in the parallel leader, leading to unseeded, divergent random values and regression test diff failures. Mark both setseed and all random functions as PARALLEL RESTRICTED, matching the parallel safety classification of core PostgreSQL's random() and setseed() in pg_proc.dat.
1 parent b152025 commit ed205b5

1 file changed

Lines changed: 7 additions & 7 deletions

File tree

‎contrib/pgbench/pgbench--1.0.sql‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,42 @@
77
CREATE FUNCTION setseed(seed double precision)
88
RETURNS void
99
AS 'MODULE_PATHNAME', 'pgbench_setseed_double'
10-
LANGUAGE C STRICT VOLATILE PARALLEL UNSAFE;
10+
LANGUAGE C STRICT VOLATILE PARALLEL RESTRICTED;
1111

1212
CREATE FUNCTION setseed(seed bigint)
1313
RETURNS void
1414
AS 'MODULE_PATHNAME', 'pgbench_setseed_int64'
15-
LANGUAGE C STRICT VOLATILE PARALLEL UNSAFE;
15+
LANGUAGE C STRICT VOLATILE PARALLEL RESTRICTED;
1616

1717
-- Uniform Random
1818
CREATE FUNCTION random(min bigint, max bigint)
1919
RETURNS bigint
2020
AS 'MODULE_PATHNAME', 'pgbench_random_int64'
21-
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
21+
LANGUAGE C STRICT VOLATILE PARALLEL RESTRICTED;
2222

2323
-- Gaussian (Normal) Random
2424
CREATE FUNCTION random_gaussian(min bigint, max bigint, parameter double precision)
2525
RETURNS bigint
2626
AS 'MODULE_PATHNAME', 'pgbench_random_gaussian_int64'
27-
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
27+
LANGUAGE C STRICT VOLATILE PARALLEL RESTRICTED;
2828

2929
-- Exponential Random
3030
CREATE FUNCTION random_exponential(min bigint, max bigint, parameter double precision)
3131
RETURNS bigint
3232
AS 'MODULE_PATHNAME', 'pgbench_random_exponential_int64'
33-
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
33+
LANGUAGE C STRICT VOLATILE PARALLEL RESTRICTED;
3434

3535
-- Zipfian Random
3636
CREATE FUNCTION random_zipfian(min bigint, max bigint, parameter double precision)
3737
RETURNS bigint
3838
AS 'MODULE_PATHNAME', 'pgbench_random_zipfian_int64'
39-
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
39+
LANGUAGE C STRICT VOLATILE PARALLEL RESTRICTED;
4040

4141
-- Poisson Random
4242
CREATE FUNCTION random_poisson(center double precision)
4343
RETURNS bigint
4444
AS 'MODULE_PATHNAME', 'pgbench_random_poisson_int64'
45-
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
45+
LANGUAGE C STRICT VOLATILE PARALLEL RESTRICTED;
4646

4747
-- MurmurHash2 (64-bit)
4848
CREATE FUNCTION hash_murmur2(val bigint, seed bigint DEFAULT 0)

0 commit comments

Comments
 (0)