From f81bf78ce12b9fd3e50eb00dd875440007262ec4 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Mon, 24 Nov 2025 14:55:09 -0800 Subject: Avoid global LC_CTYPE dependency in pg_locale_libc.c. Call tolower_l() directly instead of through pg_tolower(), because the latter depends on the global LC_CTYPE. Discussion: https://postgr.es/m/8186b28a1a39e61a0d833a4c25a8909ebbbabd48.camel@j-davis.com --- src/backend/utils/adt/pg_locale_libc.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/backend/utils/adt/pg_locale_libc.c b/src/backend/utils/adt/pg_locale_libc.c index 9c7fcd1fc7a..716f005066a 100644 --- a/src/backend/utils/adt/pg_locale_libc.c +++ b/src/backend/utils/adt/pg_locale_libc.c @@ -450,7 +450,12 @@ strlower_libc_sb(char *dest, size_t destsize, const char *src, ssize_t srclen, for (p = dest; *p; p++) { if (locale->is_default) - *p = pg_tolower((unsigned char) *p); + { + if (*p >= 'A' && *p <= 'Z') + *p += 'a' - 'A'; + else if (IS_HIGHBIT_SET(*p) && isupper_l(*p, loc)) + *p = tolower_l((unsigned char) *p, loc); + } else *p = tolower_l((unsigned char) *p, loc); } @@ -535,9 +540,19 @@ strtitle_libc_sb(char *dest, size_t destsize, const char *src, ssize_t srclen, if (locale->is_default) { if (wasalnum) - *p = pg_tolower((unsigned char) *p); + { + if (*p >= 'A' && *p <= 'Z') + *p += 'a' - 'A'; + else if (IS_HIGHBIT_SET(*p) && isupper_l(*p, loc)) + *p = tolower_l((unsigned char) *p, loc); + } else - *p = pg_toupper((unsigned char) *p); + { + if (*p >= 'a' && *p <= 'z') + *p -= 'a' - 'A'; + else if (IS_HIGHBIT_SET(*p) && islower_l(*p, loc)) + *p = toupper_l((unsigned char) *p, loc); + } } else { @@ -633,7 +648,12 @@ strupper_libc_sb(char *dest, size_t destsize, const char *src, ssize_t srclen, for (p = dest; *p; p++) { if (locale->is_default) - *p = pg_toupper((unsigned char) *p); + { + if (*p >= 'a' && *p <= 'z') + *p -= 'a' - 'A'; + else if (IS_HIGHBIT_SET(*p) && islower_l(*p, loc)) + *p = toupper_l((unsigned char) *p, loc); + } else *p = toupper_l((unsigned char) *p, loc); } -- cgit v1.2.3