Re: Order changes in PG16 since ICU introduction
Jeff Davis <pgsql@j-davis.com>
On Fri, 2023-04-21 at 14:23 -0400, Tom Lane wrote: > postgres=# CREATE DATABASE test1 TEMPLATE=template0 ENCODING = 'UTF8' > LOCALE = 'C'; ... > test1 | postgres | UTF8 | icu | C | > C | en-US | | > (4 rows) > > Looks like the "pick en-US even when told not to" problem exists here > too. Both provider (ICU) and the icu locale (en-US) are inherited from template0. The LOCALE parameter to CREATE DATABASE doesn't affect either of those things, because there's a separate parameter ICU_LOCALE. This happens the same way in v15, and although it matches the documentation technically, it is not a great user experience. I have a couple ideas: 1. Introduce a "none" provider to separate the concept of C/POSIX locales from the libc provider. It's not really using a provider anyway, it's just using memcmp(), and I think it causes confusion to combine them. Saying "LOCALE_PROVIDER=none" is less error-prone than "LOCALE_PROVIDER=libc LOCALE='C'". 2. Change the CREATE DATABASE syntax to catch these errors better at the possible expense of backwards compatibility. I am also having second thoughts about accepting "C" or "POSIX" as an ICU locale and transforming it to "en-US-u-va-posix" in v16. It's not terribly useful (why not just use memcmp()?), it's not fast in my measurements (en-US is faster), so maybe it's better to just throw an error and tell the user to use C (or provider=none as I suggest above)? Obviously the user could manually type "en-US-u-va-posix" if that's the locale they want. Throwing an error would be a backwards-compatibility issue, but in v15 an ICU locale of "C" just gives the root locale anyway, which is probably not what they want. Regards, Jeff Davis
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