Re: Order changes in PG16 since ICU introduction
Daniel Verite <daniel@manitou-mail.org>
Jeff Davis wrote: > 2) Automatically change the provider to libc when locale=C. > > Almost works, but it's not clear how we handle the case "provider=icu > lc_collate='fr_FR.utf8' locale=C". > > If we change it to "provider=libc lc_collate=C", we've overridden the > specified lc_collate. If we ignore the locale=C, that would be > surprising to users. If we throw an error, that would be a backwards > compatibility issue. This thread started with a report illustrating that when users mention the locale "C", they implicitly mean "C" from the libc provider, as when libc was the default. The problem is that as soon as ICU is the default, any reference to a libc collation should mention explicitly that the provider is libc. It seems what we're set on the idea to create an exception for "C" (and I assume also "POSIX") to avoid too much confusion, and because "C" is quite special anyway, and has no equivalent in ICU (the switch in v16 to ICU as the default provider is based on the premise that the locales with the same name will behave pretty much the same with ICU as they did with libc, but it's absolutely not the case with "C"). ISTM that if we want to go that route, we need the make the minimum changes at the user interface level and not any deeper, so that when (locale="C" OR locale="POSIX") AND the provider has not been specified, then the command (initdb and create database) act as if the user had specified provider=libc. > (3) Support iculocale=C in the ICU provider using the memcmp() path. > In other words, if provider=icu and iculocale=C, lc_collate_is_c() and > lc_ctpye_is_c() would both return true. ICU does not provide a locale that behaves like that, and it doesn't feel right to pretend it does. It feels like attacking the problem at the wrong level. > (4) Create a new "none" provider (which has no locale and always memcmp > semantics), and automatically change the provider to "none" if > provider=icu and iculocale=C. It still uses libc/C for character classification and case changing, so "no locale" is technically not true. Personally I don't see the benefit of adding a "none" provider. C is a libc locale and libc is not disappearing. I also think that when users explicitly indicate provider=icu, they should get icu. Best regards, -- Daniel Vérité https://postgresql.verite.pro/ Twitter: @DanielVerite
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Introduce "builtin" collation provider.
- 2d819a08a1cb 17.0 landed
-
ICU: do not convert locale 'C' to 'en-US-u-va-posix'.
- f3a01af29b19 16.0 landed
- f7faa9976cc0 16.0 landed
-
initdb: change default --locale-provider back to libc.
- 2535c74b1a61 16.0 landed
-
CREATE DATABASE: make LOCALE apply to all collation providers.
- a14e75eb0b6a 16.0 landed
-
Remove read-only server settings lc_collate and lc_ctype
- b0f6c437160d 16.0 landed
-
ICU: use uloc_getDefault() for initdb.
- ec1264f01e37 16.0 landed
-
Doc fixes for commit 1e16af8ab5.
- f4a9422c0c37 16.0 landed
-
Doc: fix some rendering problems in the PDF docs build.
- b62381d9a23b 16.0 landed
-
Doc improvements for language tags and custom ICU collations.
- 1e16af8ab5d7 16.0 landed
-
ICU: check for U_STRING_NOT_TERMINATED_WARNING.
- 1c634f6647c2 16.0 landed
-
Reduce icu_validation_level default to WARNING.
- 6de31ce446e5 16.0 landed
-
Revert "ICU: do not convert locale 'C' to 'en-US-u-va-posix'."
- 455f948b0d03 16.0 landed
-
Fix initdb --no-locale.
- 5cd1a5af4d17 16.0 landed
-
Avoid character classification in regex escape parsing.
- c04c6c5d6f5f 16.0 cited