Re: ICU locale validation / canonicalization
Peter Eisentraut <peter.eisentraut@enterprisedb.com>
On 17.03.23 18:55, Jeff Davis wrote: > On Wed, 2023-03-15 at 15:18 -0700, Jeff Davis wrote: >> I left out the validation patch for now, and I'm evaluating a >> different >> approach that will attempt to match to the locales retrieved with >> uloc_countAvailable()/uloc_getAvailable(). > > I like this approach, attached new patch series with that included as > 0006. I have looked at the first three patches. I think we want what those patches do. [PATCH v6 1/6] Support language tags in older ICU versions (53 and earlier). In pg_import_system_collations(), this is now redundant and can be simplified: - if (!pg_is_ascii(langtag) || !pg_is_ascii(iculocstr)) + if (!pg_is_ascii(langtag) || !pg_is_ascii(langtag)) icu_set_collation_attributes() needs more commenting about what is going on. My guess is that uloc_canonicalize() converts from language tag to ICU locale ID, and then the existing logic to parse that apart would apply. Is that how it works? [PATCH v6 2/6] Wrap ICU ucol_open(). It makes sense to try to unify some of this. But I find the naming confusing. If I see pg_ucol_open(), then I would expect that all calls to ucol_open() would be replaced by this. But here it's only a few, without explanation. (pg_ucol_open() has no explanation at all AFAICT.) I have in my notes that check_icu_locale() and make_icu_collator() should be combined into a single function. I think that would be a better way to slice it. Btw., I had intentionally not written code like this +#if U_ICU_VERSION_MAJOR_NUM < 54 + icu_set_collation_attributes(collator, loc_str); +#endif The disadvantage of doing it that way is that you then need to dig out an old version of ICU in order to check whether the code compiles at all. With the current code, you can be sure that that code compiles if you make changes elsewhere. [PATCH v6 3/6] Handle the "und" locale in ICU versions 54 and older. This makes sense, but the same comment about not #if'ing out code for old ICU versions applies here. The +#ifdef USE_ICU + before pg_ucol_open() probably belongs in patch 2.
Commits
-
Add missing source file to nls.mk
- b8c3f6df85e7 16.0 cited
-
Fix MSVC warning introduced in ea1db8ae70.
- 36320cbc164a 16.0 landed
-
Canonicalize ICU locale names to language tags.
- ea1db8ae70e5 16.0 landed
-
Validate ICU locales.
- 1671f990dd66 16.0 landed
-
initdb: emit message when using default ICU locale.
- c1f1c1f87fd6 16.0 landed
-
initdb: replace check_icu_locale() with default_icu_locale().
- f8ca22295e99 16.0 landed
-
Fix error inconsistency in older ICU versions.
- 8b3eb0c584be 16.0 landed
-
Avoid potential UCollator leak for older ICU versions.
- a03b3b6b4a72 16.0 landed
-
pg_locale.c: change ereport() to elog().
- 9a242899158c 16.0 landed
-
Handle the "und" locale in ICU versions 54 and older.
- 3b50275b1295 16.0 landed
-
Wrap ICU ucol_open().
- a326aac8f171 16.0 landed
-
Support language tags in older ICU versions (53 and earlier).
- 869650fa86ad 16.0 landed
-
Improve support for UNICODE collation on older ICU
- d72900bdedc6 16.0 cited
-
Use ICU by default at initdb time.
- 27b62377b47f 16.0 cited