Re: Order changes in PG16 since ICU introduction
Jeff Davis <pgsql@j-davis.com>
Attachments
- v5-0001-For-user-defined-collations-never-set-collencodin.patch (text/x-patch) patch v5-0001
- v5-0002-ICU-fix-up-old-libc-style-locale-strings.patch (text/x-patch) patch v5-0002
- v5-0003-Reduce-icu_validation_level-default-to-WARNING.patch (text/x-patch) patch v5-0003
- v5-0004-Introduce-collation-provider-none.patch (text/x-patch) patch v5-0004
- v5-0005-ICU-for-locale-C-automatically-use-none-provider-.patch (text/x-patch) patch v5-0005
- v5-0006-Make-LOCALE-apply-to-ICU_LOCALE-for-CREATE-DATABA.patch (text/x-patch) patch v5-0006
- v5-0007-Add-default_collation_provider-GUC.patch (text/x-patch) patch v5-0007
New patch series attached. === 0001: fix bug that allows creating hidden collations Bug: https://www.postgresql.org/message-id/051c9395cf880307865ee8b17acdbf7f838c1e39.camel@j-davis.com === 0002: handle some kinds of libc-stlye locale strings ICU used to handle libc locale strings like 'fr_FR@euro', but doesn't in later versions. Handle them in postgres for consistency. === 0003: reduce icu_validation_level to WARNING Given that we've seen some inconsistency in which locale names are accepted in different ICU versions, it seems best not to be too strict. Peter Eisentraut suggested that it be set to ERROR originally, but a WARNING should be sufficient to see problems without introducing risks migrating to version 16. I don't expect objections to 0003, so I may commit this soon, but I'll give it a little time in case someone has an opinion. === 0004-0006: To solve the issues that have come up in this thread, we need CREATE DATABASE (and createdb and initdb) to use LOCALE to mean the collation locale regardless of which provider is in use (which is what 0006 does). 0006 depends on ICU handling libc locale names. It already does a good job for most libc locale names (though patch 0002 fixes a few cases where it doesn't). There may be more cases, but for the most part libc names are interpreted in a reasonable way. But one important case is missing: ICU does not handle the "C" locale as we expect (that is, using memcmp()). We've already allowed users to create ICU collations with the C locale in the past, which uses the root collation (not memcmp()), and we need to keep supporting that for upgraded clusters. So that leaves us with a catalog representation problem. I mentioned upthread that we can solve that by: 1. Using iculocale=NULL to mean "C-as-in-memcmp", or having some other catalog hack (like another field). That's not desirable because the catalog representation is already complex and it may be hard for users to tell what's happening. 2. When provider=icu and locale=C, switch to provider=libc locale=C. This is very messy, because currently the syntax allows specifying a database with LOCALE_PROVIDER='icu' ICU_LOCALE='C' LC_COLLATE='en_US' - - if the provider gets changed to libc, what would we set datcollate to? I don't think this is workable without some breakage. We can't simply override datcollate to be C in that case, because there are some things other than the default collation that might need it set to en_US as the user specified. 3. Introduce collation provider "none", which is always memcmp-based (patch 0004). It's equivalent to the libc locale=C, but it allows specifying the LC_COLLATE and LC_CTYPE independently. A command like CREATE DATABASE ... LOCALE_PROVIDER='icu' ICU_LOCALE='C' LC_COLLATE='en_US' would get changed (with a NOTICE) to provider "none" (patch 0005), so you'd have datlocprovider=none, datcollate=en_US. For the database default collation, that would always use memcmp(), but the server environment LC_COLLATE would be set to en_US as the user specified. For this patch series, I chose approach #3. I think it works out nicely -- it provides a better place to document the "no locale" behavior (including a warning that it depends on the database encoding), and I think it's more clear to the user that locale=C is not actually using a provider at all. It's more invasive, but feels like a better solution. If others don't like it I can implement approach #1 instead. === 0007: Add a GUC to control the default collation provider Having a GUC would make it easier to migrate to ICU without surprises. This only affects the default for CREATE COLLATION, not CREATE DATABASE (and obviously not initdb). -- Jeff Davis PostgreSQL Contributor Team - AWS
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