From 724b2f218446f9bc4eb6c9d2e012aad3fc3b723a Mon Sep 17 00:00:00 2001
From: ChenHui Mo <chenhuimo.mch@qq.com>
Date: Tue, 15 Sep 2026 15:51:53 +0800
Subject: [PATCH v2 1/2] Return early from repeat() for empty results

Avoid entering the copy loop when the repeat count is zero or the source
string is empty.
---
 src/backend/utils/adt/oracle_compat.c |  4 ++++
 src/test/regress/expected/strings.out | 12 ++++++++++++
 src/test/regress/sql/strings.sql      |  2 ++
 3 files changed, 18 insertions(+)

diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c
index 7422a454397..fe33a0729e4 100644
--- a/src/backend/utils/adt/oracle_compat.c
+++ b/src/backend/utils/adt/oracle_compat.c
@@ -1186,6 +1186,10 @@ repeat(PG_FUNCTION_ARGS)
 	SET_VARSIZE(result, tlen);
 	cp = VARDATA(result);
 	sp = VARDATA_ANY(string);
+
+	if (count == 0 || slen == 0)
+		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 313c5039465..0ccf02537e1 100644
--- a/src/test/regress/expected/strings.out
+++ b/src/test/regress/expected/strings.out
@@ -3177,6 +3177,18 @@ SELECT repeat('Pg', -4);
  
 (1 row)
 
+SELECT repeat('', 10);
+ repeat 
+--------
+ 
+(1 row)
+
+SELECT repeat('x', 0);
+ repeat 
+--------
+ 
+(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 38946e8954d..23972c01e24 100644
--- a/src/test/regress/sql/strings.sql
+++ b/src/test/regress/sql/strings.sql
@@ -1020,6 +1020,8 @@ SELECT chr(0);
 
 SELECT repeat('Pg', 4);
 SELECT repeat('Pg', -4);
+SELECT repeat('', 10);
+SELECT repeat('x', 0);
 
 SELECT SUBSTRING('1234567890'::bytea FROM 3) "34567890";
 SELECT SUBSTRING('1234567890'::bytea FROM 4 FOR 3) AS "456";
-- 
2.34.1

