On Tue, 2024-03-26 at 08:04 +0100, Peter Eisentraut wrote: > The patch set v27 is ok with me, modulo (a) discussion about initcap > semantics, and (b) what collation to assign to ucs_basic, which can > be > revisited later.
I held off on the refactoring patch for lc_{ctype|collate}_is_c(). There's an explicit "NB: pg_newlocale_from_collation is only supposed to be called on non-C-equivalent locales" comment in DefineCollation(). What I'd like to do is make it possible to create valid pg_locale_t objects out of C locales, which can be used anywhere a real locale can be used. Callers can still check lc_{collate|ctype}_is_c() for various reasons; but if they did call pg_newlocale_from_collation on a C locale it would at least work for the pg_locale.h APIs. That would be a slightly simpler and safer API, and make it easier to do the collation version check consistently. That's not very complicated, but it's a bit invasive and probably out of scope for v17. It might be part of another change I had intended for a while, which is to make NULL an invalid pg_locale_t, and use a different representation to mean "use the server environment". That would clean up a lot of checks for NULL. For now, we'd still like to add the version number to the builtin collations, so that leaves us with two options: (a) Perform the version check in lc_{collate|ctype}_is_c(), which duplicates some code and creates some inconsistency in how the version is checked for different providers. (b) Don't worry about it and just commit the version change in v27- 0001. The version check is already performed correctly on the database without changes, even if the locale is "C". And there are already three built-in "C" collations: "C", "POSIX", and UCS_BASIC; so it's not clear why someone would create even more of them. And even if they did, there would be no reason to give them a warning because we haven't incremented the version, so there's no chance of a mismatch. I'm inclined toward (b). Thoughts? Regards, Jeff Davis