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