From 724b2f218446f9bc4eb6c9d2e012aad3fc3b723a Mon Sep 17 00:00:00 2001 From: ChenHui Mo 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