Re: Remaining dependency on setlocale()
Chao Li <li.evan.chao@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
fuzzystrmatch: use pg_ascii_toupper().
- b96a9fd76f32 19 (unreleased) landed
-
Avoid global LC_CTYPE dependency in pg_locale_icu.c.
- 0a90df58cf38 19 (unreleased) landed
-
downcase_identifier(): use method table from locale provider.
- 87b2968df0f8 19 (unreleased) landed
-
ltree: fix case-insensitive matching.
- 806555e3000d 18.2 landed
- 7f007e4a044a 19 (unreleased) landed
-
Fix multibyte issue in ltree_strncasecmp().
- 898991966bc9 14.21 landed
- 335b2f30b468 15.16 landed
- b80227c0a54c 16.12 landed
- b8cfe9dc2e7f 17.8 landed
- f79e239e0bc6 18.2 landed
- 84d5efa7e3eb 19 (unreleased) landed
-
Use multibyte-aware extraction of pattern prefixes.
- 9c8de1596912 19 (unreleased) landed
-
Add pg_iswcased().
- 630706ced04e 19 (unreleased) landed
-
Remove char_tolower() API.
- 1e493158d3d2 19 (unreleased) landed
-
Make regex "max_chr" depend on encoding, not provider.
- 19b966243c38 19 (unreleased) landed
-
Change some callers to use pg_ascii_toupper().
- 99cd8890beca 19 (unreleased) landed
-
Allow pg_locale_t APIs to work when ctype_is_c.
- 147602822597 19 (unreleased) landed
-
Add #define for UNICODE_CASEMAP_BUFSZ.
- 8d299052fe58 19 (unreleased) landed
-
Inline pg_ascii_tolower() and pg_ascii_toupper().
- ec4997a9d733 19 (unreleased) landed
-
Avoid global LC_CTYPE dependency in pg_locale_libc.c.
- f81bf78ce12b 19 (unreleased) landed
-
Force LC_COLLATE to C in postmaster.
- 5e6e42e44fe1 19 (unreleased) landed
-
Change wchar2char() and char2wchar() to accept a locale_t.
- 53cd0b71ee2e 19 (unreleased) landed
-
Use pg_ascii_tolower()/pg_ascii_toupper() where appropriate.
- d81dcc8d6243 19 (unreleased) landed
-
inet_net_pton.c: use pg_ascii_tolower() rather than tolower().
- 8898082a5d3e 18.0 landed
-
isn.c: use pg_ascii_toupper() instead of toupper().
- 7a6880fadc17 18.0 landed
-
contrib/spi/refint.c: use pg_ascii_tolower() instead.
- 78bd364ee39c 18.0 landed
-
copyfromparse.c: use pg_ascii_tolower() rather than tolower().
- 4c787a24e7e2 18.0 landed
-
Revert "Tidy up locale thread safety in ECPG library."
- 3c8e463b0d88 18.0 cited
-
Tidy up locale thread safety in ECPG library.
- 8e993bff5326 18.0 cited
-
All supported systems have locale_t.
- 8d9a9f034e92 17.0 cited
> On Dec 16, 2025, at 03:34, Jeff Davis <pgsql@j-davis.com> wrote: > > On Sat, 2025-12-13 at 17:48 +0800, Chao Li wrote: >> 1 - 0001 >> ``` >> + int match_mblen pg_attribute_unused(); >> ``` >> >> Why this variable is marked unused? It’s actually used. > > Fixed and committed. > > I originally marked it unused because I just had an: > > Assert(match[match_mblen] == '\0'); > > but I changed it to just set it: > > match[match_mblen] = '\0'; > > for clarity, even though I think the underlying API guarantees NUL- > termination. > >> 2 - 0002 >> >> I did a search and found one place that you missed at line 181 in >> pg_locale.h >> ``` >> extern bool char_is_cased(char ch, pg_locale_t locale); >> ``` > > Thank you, fixed and committed. > > > I'll continue committing v12 0003-0005. Note that I'm planning to > backport 0003. I have re-reviewed 0003-0005 last week, they all look good to me. I have no comment on backport 0003. > > I'm also inclined to move forward with 0006. It's not a long-term > solution, but it solves an instance of the problem under discussion in > this thread (removes setlocale() dependency) and is a narrow fix. > > > After that, remaining loose ends: > > * 0007: Can we just rip out the non-ASCII support? If it's gone all > this time without UTF8 support, and there's no suggestion about what > the non-ASCII behavior should be (in docs or source code), then it's > probably not terribly important. > > * Use of pg_strncasecmp() in the backend, which uses tolower() to do > case-insensitive matching of command options, e.g. "if > (pg_strcasecmp(a, "plain") == 0)" to check for PLAIN storage in CREATE > TYPE. > > * strerror(): either consider an lc_ctype GUC, or the approach over > here[1]. > > * Daniel suggests that we need some way to set LC_COLLATE for > extensions/dependencies. > > * address calls to pg_tolower in datetime.c and tzparser.c -- can those > just be pg_ascii_tolower()? > > * examine remaining isalpha(), etc., calls in the backend > > Regards, > Jeff Davis > > [1] > https://www.postgresql.org/message-id/flat/90f176c5b85b9da26a3265b2630ece3552068566.camel@j-davis.com > I just reviewed 0006-0007. Only got one comment on 0006: ``` @@ -306,6 +342,7 @@ create_pg_locale_icu(Oid collid, MemoryContext context) result = MemoryContextAllocZero(context, sizeof(struct pg_locale_struct)); result->icu.locale = MemoryContextStrdup(context, iculocstr); result->icu.ucol = collator; + result->icu.lt = loc; ``` The old code didn’t create a locale object and store in result, thus it didn’t have a logic to free the created locale. This patch now dose that, but I don’t see where the created locale object is free-ed. I suppose newlocale() will allocate memory from the OS, so I guess the memory should be free-ed somewhere. Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/