diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index cd0b4db07c..8e56faaf9f 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 36a9712b0e..1590546759 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -2785,6 +2785,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("string 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 b923db6fda..42ddb2f827 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 784001480b..34e42a9f66 100644
--- a/src/test/regress/expected/random.out
+++ b/src/test/regress/expected/random.out
@@ -79,3 +79,21 @@ SELECT AVG(random) FROM random_tbl
-----
(0 rows)
+-- not allowed
+SELECT random_string(-1);
+ERROR: string size must be non-negative
+-- zero length bytea
+SELECT random_string(0);
+ random_string
+---------------
+ \x
+(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 4e0a91c3e4..7be48d83ae 100644
--- a/src/test/regress/sql/random.sql
+++ b/src/test/regress/sql/random.sql
@@ -66,4 +66,12 @@ SELECT random, count(random) FROM random_tbl
SELECT AVG(random) FROM random_tbl
HAVING AVG(random) NOT BETWEEN 400 AND 600;
+-- not allowed
+SELECT random_string(-1);
+-- zero length bytea
+SELECT random_string(0);
+
+-- should practically never happen
+SELECT bool_and(random_string(16) != random_string(16)) AS same
+ FROM generate_series(1,8);