v3-0004-Use-global_libc_locale-for-downcase_identifier-an.patch
text/x-patch
Filename: v3-0004-Use-global_libc_locale-for-downcase_identifier-an.patch
Type: text/x-patch
Part: 3
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v3-0004
Subject: Use global_libc_locale for downcase_identifier() and pg_strcasecmp().
| File | + | − |
|---|---|---|
| src/backend/parser/scansup.c | 2 | 1 |
| src/port/pgstrcasecmp.c | 14 | 6 |
From 9c454496624da63948641b19e4592e4fbb4f609f Mon Sep 17 00:00:00 2001 From: Jeff Davis <jeff@j-davis.com> Date: Tue, 10 Jun 2025 20:07:01 -0700 Subject: [PATCH v3 4/7] Use global_libc_locale for downcase_identifier() and pg_strcasecmp(). --- src/backend/parser/scansup.c | 3 ++- src/port/pgstrcasecmp.c | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/backend/parser/scansup.c b/src/backend/parser/scansup.c index 2feb2b6cf5a..d45bf275e42 100644 --- a/src/backend/parser/scansup.c +++ b/src/backend/parser/scansup.c @@ -18,6 +18,7 @@ #include "mb/pg_wchar.h" #include "parser/scansup.h" +#include "utils/pg_locale.h" /* @@ -68,7 +69,7 @@ downcase_identifier(const char *ident, int len, bool warn, bool truncate) if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A'; else if (enc_is_single_byte && IS_HIGHBIT_SET(ch) && isupper(ch)) - ch = tolower(ch); + ch = tolower_l(ch, global_libc_locale); result[i] = (char) ch; } result[i] = '\0'; diff --git a/src/port/pgstrcasecmp.c b/src/port/pgstrcasecmp.c index ec2b3a75c3d..812050598e7 100644 --- a/src/port/pgstrcasecmp.c +++ b/src/port/pgstrcasecmp.c @@ -28,6 +28,14 @@ #include <ctype.h> +#ifndef FRONTEND +extern PGDLLIMPORT locale_t global_libc_locale; +#define TOUPPER(x) toupper_l((unsigned char) (x), global_libc_locale) +#define TOLOWER(x) tolower_l((unsigned char) (x), global_libc_locale) +#else +#define TOUPPER(x) toupper(x) +#define TOLOWER(x) tolower(x) +#endif /* * Case-independent comparison of two null-terminated strings. @@ -45,12 +53,12 @@ pg_strcasecmp(const char *s1, const char *s2) if (ch1 >= 'A' && ch1 <= 'Z') ch1 += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch1) && isupper(ch1)) - ch1 = tolower(ch1); + ch1 = TOLOWER(ch1); if (ch2 >= 'A' && ch2 <= 'Z') ch2 += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch2) && isupper(ch2)) - ch2 = tolower(ch2); + ch2 = TOLOWER(ch2); if (ch1 != ch2) return (int) ch1 - (int) ch2; @@ -78,12 +86,12 @@ pg_strncasecmp(const char *s1, const char *s2, size_t n) if (ch1 >= 'A' && ch1 <= 'Z') ch1 += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch1) && isupper(ch1)) - ch1 = tolower(ch1); + ch1 = TOLOWER(ch1); if (ch2 >= 'A' && ch2 <= 'Z') ch2 += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch2) && isupper(ch2)) - ch2 = tolower(ch2); + ch2 = TOLOWER(ch2); if (ch1 != ch2) return (int) ch1 - (int) ch2; @@ -107,7 +115,7 @@ pg_toupper(unsigned char ch) if (ch >= 'a' && ch <= 'z') ch += 'A' - 'a'; else if (IS_HIGHBIT_SET(ch) && islower(ch)) - ch = toupper(ch); + ch = TOUPPER(ch); return ch; } @@ -124,7 +132,7 @@ pg_tolower(unsigned char ch) if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch) && isupper(ch)) - ch = tolower(ch); + ch = TOLOWER(ch); return ch; } -- 2.43.0