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);