From 700489384fd9bba44588ee65bc892bd1a8c25a88 Mon Sep 17 00:00:00 2001
From: ChenHui Mo <chenhuimo.mch@qq.com>
Date: Tue, 15 Sep 2026 16:00:49 +0800
Subject: [PATCH v2 2/2] Use memset() in repeat() for single-byte strings

When the source string is one byte long, fill the result with memset()
instead of issuing one memcpy() call per repetition.
---
 src/backend/utils/adt/oracle_compat.c | 7 +++++++
 src/test/regress/expected/strings.out | 6 ++++++
 src/test/regress/sql/strings.sql      | 1 +
 3 files changed, 14 insertions(+)

diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c
index fe33a0729e4..d797dbcd3c4 100644
--- a/src/backend/utils/adt/oracle_compat.c
+++ b/src/backend/utils/adt/oracle_compat.c
@@ -1190,6 +1190,13 @@ repeat(PG_FUNCTION_ARGS)
 	if (count == 0 || slen == 0)
 		PG_RETURN_TEXT_P(result);
 
+	/* Use memset() instead of the loop below for single-byte strings. */
+	if (slen == 1)
+	{
+		memset(cp, *sp, count);
+		PG_RETURN_TEXT_P(result);
+	}
+
 	for (i = 0; i < count; i++)
 	{
 		memcpy(cp, sp, slen);
diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expected/strings.out
index 0ccf02537e1..91146012b6c 100644
--- a/src/test/regress/expected/strings.out
+++ b/src/test/regress/expected/strings.out
@@ -3189,6 +3189,12 @@ SELECT repeat('x', 0);
  
 (1 row)
 
+SELECT repeat('x', 4);
+ repeat 
+--------
+ xxxx
+(1 row)
+
 SELECT SUBSTRING('1234567890'::bytea FROM 3) "34567890";
  34567890 
 ----------
diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/strings.sql
index 23972c01e24..39f2642bec5 100644
--- a/src/test/regress/sql/strings.sql
+++ b/src/test/regress/sql/strings.sql
@@ -1022,6 +1022,7 @@ SELECT repeat('Pg', 4);
 SELECT repeat('Pg', -4);
 SELECT repeat('', 10);
 SELECT repeat('x', 0);
+SELECT repeat('x', 4);
 
 SELECT SUBSTRING('1234567890'::bytea FROM 3) "34567890";
 SELECT SUBSTRING('1234567890'::bytea FROM 4 FOR 3) AS "456";
-- 
2.34.1

