Re: Built-in CTYPE provider
Jeff Davis <pgsql@j-davis.com>
Attachments
- v25-0001-Address-more-review-comments-on-commit-2d819a08a.patch (text/x-patch) patch v25-0001
- v25-0002-Support-C.UTF-8-locale-in-the-new-builtin-collat.patch (text/x-patch) patch v25-0002
- v25-0003-Inline-basic-UTF-8-functions.patch (text/x-patch) patch v25-0003
- v25-0004-Use-version-for-builtin-collations.patch (text/x-patch) patch v25-0004
- v25-0005-Add-unicode_strtitle-for-Unicode-Default-Case-Co.patch (text/x-patch) patch v25-0005
- v25-0006-Support-Unicode-full-case-mapping-and-conversion.patch (text/x-patch) patch v25-0006
- v25-0007-Support-PG_UNICODE_FAST-locale-in-the-builtin-co.patch (text/x-patch) patch v25-0007
On Thu, 2024-03-14 at 09:54 +0100, Peter Eisentraut wrote:
> * doc/src/sgml/charset.sgml
>
> I don't understand the purpose of this sentence:
>
> "When using this locale, the behavior may depend on the database
> encoding."
The "C" locale (in either the builtin or libc provider) can sort
differently in different encodings, because it's based on memcmp. For
instance:
select U&'\20AC' > U&'\201A' collate "C";
Returns true in UTF-8 and false in WIN1252. That's why UCS_BASIC is
only available in UTF-8, because (at least for some encodings) we'd
have to decode before comparison to get the code-point-order semantics
right.
In other words, the "C" collation is not a well-defined order, but
UCS_BASIC and C.UTF-8 are well-defined.
Suggestions for better wording are welcome.
> * doc/src/sgml/ref/create_database.sgml
>
> The new parameter builtin_locale is not documented.
Thank you, fixed in 0001 (review fixup).
> * src/backend/commands/collationcmds.c
>
> I think DefineCollation() should set collencoding = -1 for the
> COLLPROVIDER_BUILTIN case. -1 stands for any encoding. Or at least
> explain why not?
In the attached v25-0001 (review fixup) I have made it the
responsibility of a function, and then extended that for the C.UTF-8
(0002) and PG_UNICODE_FAST locales (0007).
> * src/backend/utils/adt/pg_locale.c
>
> This part is a bit confusing:
>
> + cache_entry->collate_is_c = true;
> + cache_entry->ctype_is_c = (strcmp(colllocale, "C") == 0);
>
> Is collate always C but ctype only sometimes? Does this anticipate
> future patches in this series? Maybe in this patch it should always
> be true?
Made it a constant in v25-0001, and changed it in 0002
>
> * src/bin/initdb/initdb.c
>
> + printf(_(" --builtin-locale=LOCALE set builtin locale name
> for new databases\n"));
>
> Put in a line break so that the right "column" lines up.
Fixed in 0001
> This output should line up better:
>
> The database cluster will be initialized with this locale
> configuration:
> default collation provider: icu
> default collation locale: en
> LC_COLLATE: C
> LC_CTYPE: C
> ...
>
> Also, why are there two spaces after "provider: "?
>
> Also we call these locale provider on input, why are they collation
> providers on output? What is a "collation locale"?
I tried to fix these things in 0001.
> * src/bin/pg_upgrade/t/002_pg_upgrade.pl
>
> +if ($oldnode->pg_version >= '17devel')
>
> This is weird. >= is a numeric comparison, so providing a string
> with
> non-digits is misleading at best.
It's actually not a numeric comparison, it's an overloaded comparison
op for the Version class.
See 32dd2c1eff and:
https://www.postgresql.org/message-id/1738174.1710274577%40sss.pgh.pa.us
> * src/test/icu/t/010_database.pl
>
> -# Test that LOCALE works for ICU locales if LC_COLLATE and LC_CTYPE
> -# are specified
>
> Why remove this test?
It must have been lost during a rebase, fixed in 0001.
> Change the name of the new database to be different from the name of
> the template database.
Fixed in 0001.
New series attached.
Regards,
Jeff Davis
Commits
-
Support PG_UNICODE_FAST locale in the builtin collation provider.
- d3d098316913 18.0 landed
-
Support Unicode full case mapping and conversion.
- 286a365b9c25 18.0 landed
-
Fix test failures when language environment is not UTF-8.
- e2a235767180 17.0 landed
-
Add unicode_strtitle() for Unicode Default Case Conversion.
- 46e5441fa536 17.0 landed
-
Use version for builtin collations.
- 46a44dc37203 17.0 landed
-
Fix convert_case(), introduced in 5c40364dd6.
- 503c0ad976f5 17.0 landed
-
Inline basic UTF-8 functions.
- 9acae56ce0b0 17.0 landed
-
Support C.UTF-8 locale in the new builtin collation provider.
- f69319f2f1fb 17.0 landed
-
Fix another warning, introduced by 846311051e.
- 60769c62dc85 17.0 landed
-
Address more review comments on commit 2d819a08a1.
- 846311051e8f 17.0 landed
-
Fix unreachable code warning from commit 2d819a08a1.
- 61f352ece9e7 17.0 landed
-
Introduce "builtin" collation provider.
- 2d819a08a1cb 17.0 landed
-
Catalog changes preparing for builtin collation provider.
- f696c0cd5f29 17.0 landed
-
Unicode case mapping tables and functions.
- 5c40364dd6d9 17.0 landed
-
Add Unicode property tables.
- ad49994538c5 17.0 landed
-
Documentation update for Standard Collations.
- 875e46a0a246 17.0 landed
-
Cleanup for unicode-update build target and test.
- cf64d4e99f64 17.0 landed
-
Shrink Unicode category table.
- 719b342d36ce 17.0 landed
-
Make some error strings more generic
- 36a14afc0760 17.0 cited
-
pg_upgrade: copy locale and encoding information to new cluster.
- 9637badd9f92 16.0 cited
-
Update Unicode data to Unicode 15.0.0
- 1091b48cd761 16.0 cited
-
Create a new type category for "internal use" types.
- 07eee5a0dc64 15.0 cited