diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index c467e73c2f..2ca545b375 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1836,6 +1836,25 @@ repeat('Pg', 4) PgPgPgPg + + + + + random_string + + random_string ( + nbytes integer ) + bytea + + + Returns a bytea of the specified size, containing random values. + + + random_string(3) + \x78da35 + + + diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index d443aa985a..2b444a4129 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -2813,6 +2813,35 @@ drandom_normal(PG_FUNCTION_ARGS) PG_RETURN_FLOAT8(result); } +/* + * drandom_string - returns a bytea filled with random content + * + */ +Datum +drandom_string(PG_FUNCTION_ARGS) +{ + int32 nbytes = PG_GETARG_INT32(0);; + if (nbytes < 0) + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("return size must be non-negative"))); + } + else + { + size_t result_size = VARHDRSZ + nbytes; + bytea *result = palloc(result_size); + + if (nbytes > 0) + { + drandom_check_default_seed(); + pg_strong_random(VARDATA(result), nbytes); + } + SET_VARSIZE(result, result_size); + PG_RETURN_BYTEA_P(result); + } +} + /* * setseed - set seed for the random number generator */ diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index f1633d476c..c14780be94 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -3366,6 +3366,9 @@ proname => 'random_normal', provolatile => 'v', proparallel => 'r', prorettype => 'float8', proargtypes => 'float8 float8', proargnames => '{mean,stddev}', prosrc => 'drandom_normal' }, +{ oid => '5152', descr => 'fill bytea with random values', + proname => 'random_string', provolatile => 'v', proparallel => 'r', + prorettype => 'bytea', proargtypes => 'int4', prosrc => 'drandom_string' }, # OIDS 1600 - 1699 diff --git a/src/test/regress/expected/random.out b/src/test/regress/expected/random.out index eb31f93cf7..926e760af1 100644 --- a/src/test/regress/expected/random.out +++ b/src/test/regress/expected/random.out @@ -67,3 +67,11 @@ SELECT round(stddev(random_normal(2, 2))) 2 (1 row) +-- should practically never happen +SELECT bool_and(random_string(16) != random_string(16)) AS same + FROM generate_series(1,8); + same +------ + t +(1 row) + diff --git a/src/test/regress/sql/random.sql b/src/test/regress/sql/random.sql index 8ed737f3e5..3bf3db087e 100644 --- a/src/test/regress/sql/random.sql +++ b/src/test/regress/sql/random.sql @@ -50,3 +50,7 @@ SELECT round(avg(random_normal(2, 2))) -- normal values converge on stddev == 2.0 SELECT round(stddev(random_normal(2, 2))) FROM generate_series(1, 10000); + +-- should practically never happen +SELECT bool_and(random_string(16) != random_string(16)) AS same + FROM generate_series(1,8);