Re: Order changes in PG16 since ICU introduction
Jeff Davis <pgsql@j-davis.com>
On Fri, 2023-04-21 at 16:00 -0400, Tom Lane wrote: > I think I might like this idea, except for one thing: you're > imagining > that the locale doesn't control anything except string comparisons. > What about to_upper/to_lower, character classifications in regexes, > etc? If provider='libc' and LC_CTYPE='C', str_toupper/str_tolower are handled with asc_tolower/asc_toupper. The regex character classification is done with pg_char_properties. In these cases neither ICU nor libc is used; it's just code in postgres. libc is special in that you can set LC_COLLATE and LC_CTYPE separately, so that different locales are used for sorting and character classification. That's potentially useful to set LC_COLLATE to C for performance reasons, while setting LC_CTYPE to a useful locale. We don't allow ICU to set collation and ctype separately (it would be possible to allow it, but I don't think there's a huge demand and it's arguably inconsistent to set them differently). > (I'm not sure whether those operations can get redirected to ICU > today > or whether they still always go to libc, but we'll surely want to fix > it eventually if the latter is still true.) Those operations do get redirected to ICU today. There are extensions that call locale-sensitive libc functions directly, and obviously those won't use ICU. > Aside from the user-surprise issues discussed up to now, pg_dump > scripts > emitted by pre-v15 pg_dump are not going to contain LOCALE_PROVIDER > clauses in CREATE DATABASE, and people are going to be very unhappy > if that means they suddenly get totally different locale semantics > after restoring into a new DB. Agreed. > I think we need some plan for mapping > libc-style locale specs into ICU locales so that we can make that > more nearly transparent. ICU does a reasonable job mapping libc-like locale names to ICU locales, e.g. en_US to en-US, etc. The ordering semantics aren't guaranteed to be the same, of course (because the libc-locales are platform-dependent), but it's at least conceptually the same locale. > > Maybe this means we are not ready to do ICU-by-default in v16. > It certainly feels like there might be more here than we want to > start designing post-feature-freeze. This thread is already on the Open Items list. As long as it's not too disruptive to others I'll leave it as-is for now to see how this sorts out. Right now it's not clear to me how much of this is a v15 issue vs a v16 issue. 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