From db26e9d41843c6837f3c4ce77c4667bac5c00644 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Wed, 23 Sep 2026 11:47:02 -0500 Subject: [PATCH v2 1/2] Factor the padding loop out of lpad() and rpad(). lpad() and rpad() each carry an identical copy of the loop that writes the padding characters. This commit moves it into a helper function that both call. No functional change. This is preparatory work for a follow-up commit that will teach the helper to write long padding with a few large memcpy() calls instead of one per character. --- src/backend/utils/adt/oracle_compat.c | 60 ++++++++++++--------------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c index 7422a454397..2adc3874bc2 100644 --- a/src/backend/utils/adt/oracle_compat.c +++ b/src/backend/utils/adt/oracle_compat.c @@ -143,6 +143,31 @@ casefold(PG_FUNCTION_ARGS) } +/* + * Append m characters of the padding string s2 (s2len bytes) to dst, + * cycling through s2 as needed, and return a pointer past the last byte + * written. + */ +static char * +append_padding(char *dst, const char *s2, int s2len, int m) +{ + const char *ptr2 = s2; + const char *ptr2end = s2 + s2len; + + while (m--) + { + int mlen = pg_mblen_range(ptr2, ptr2end); + + memcpy(dst, ptr2, mlen); + dst += mlen; + ptr2 += mlen; + if (ptr2 == ptr2end) /* wrap around at end of s2 */ + ptr2 = s2; + } + + return dst; +} + /******************************************************************** * * lpad @@ -167,10 +192,7 @@ lpad(PG_FUNCTION_ARGS) text *string2 = PG_GETARG_TEXT_PP(2); text *ret; char *ptr1, - *ptr2, - *ptr2start, *ptr_ret; - const char *ptr2end; int m, s1len, s2len; @@ -209,20 +231,7 @@ lpad(PG_FUNCTION_ARGS) m = len - s1len; - ptr2 = ptr2start = VARDATA_ANY(string2); - ptr2end = ptr2 + s2len; - ptr_ret = VARDATA(ret); - - while (m--) - { - int mlen = pg_mblen_range(ptr2, ptr2end); - - memcpy(ptr_ret, ptr2, mlen); - ptr_ret += mlen; - ptr2 += mlen; - if (ptr2 == ptr2end) /* wrap around at end of s2 */ - ptr2 = ptr2start; - } + ptr_ret = append_padding(VARDATA(ret), VARDATA_ANY(string2), s2len, m); ptr1 = VARDATA_ANY(string1); @@ -265,10 +274,7 @@ rpad(PG_FUNCTION_ARGS) text *string2 = PG_GETARG_TEXT_PP(2); text *ret; char *ptr1, - *ptr2, - *ptr2start, *ptr_ret; - const char *ptr2end; int m, s1len, s2len; @@ -320,19 +326,7 @@ rpad(PG_FUNCTION_ARGS) ptr1 += mlen; } - ptr2 = ptr2start = VARDATA_ANY(string2); - ptr2end = ptr2 + s2len; - - while (m--) - { - int mlen = pg_mblen_range(ptr2, ptr2end); - - memcpy(ptr_ret, ptr2, mlen); - ptr_ret += mlen; - ptr2 += mlen; - if (ptr2 == ptr2end) /* wrap around at end of s2 */ - ptr2 = ptr2start; - } + ptr_ret = append_padding(ptr_ret, VARDATA_ANY(string2), s2len, m); SET_VARSIZE(ret, ptr_ret - (char *) ret); -- 2.55.0