Re: Collation & ctype method table, and extension hooks

Jeff Davis <pgsql@j-davis.com>

From: Jeff Davis <pgsql@j-davis.com>
To: Noah Misch <noah@leadboat.com>
Cc: Andreas Karlsson <andreas@proxel.se>, pgsql-hackers@postgresql.org, Peter Eisentraut <peter@eisentraut.org>
Date: 2026-07-06T21:31:06Z
Lists: pgsql-hackers

Attachments

On Mon, 2026-06-29 at 18:29 -0700, Noah Misch wrote:
> This became refactor commit 5a38104.  In a UTF8 database, the commit
> changed
> the behavior of:
> 
>   SELECT 'café' ILIKE 'caf_' COLLATE "C";
> 
> That query reports true in v18, false in v19.

Thank you for the report! Fixed in 0001, with test.

>   I've copied Claude's whole
> review for the commit to
> https://docs.google.com/document/d/19_xKpKUQlY5N51qbfXyipXs3rqIYEC3qk5oaUDJ48YA/edit?tab=t.0
> .
> Two of its other findings sound potentially important, but I didn't
> verify
> them.

I'll refer to the issue numbers below (NB: the doc's summary uses
different numbering, which is confusing):

Issue 1: Real issue for windows and code points > 0xFFFF. Other cases
are just defensive, I believe. Fixed in 0003.

Issue 2: I don't see an issue here, though sort of related to the fix
in 0003.

Issue 3: I don't see an issue here.

Issue 4: The issue you raised above; fixed in 0001.

Issue 5: I don't see an issue here.

I also addressed summary item 4, the comment block fix, in 0002. And I
added some missing casts in 0004.

Does that cover the two other findings you were concerned about?


In the future, if practical, can you please include reports like this
as text attachments for the sake of the archives?

Regards,
	Jeff Davis

Commits

  1. Remove provider field from pg_locale_t.

  2. Control ctype behavior internally with a method table.

  3. Control collation behavior with a method table.

  4. Move code for collation version into provider-specific files.

  5. Refactor string case conversion into provider-specific files.

  6. Move check for ucol_strcollUTF8 to pg_locale_icu.c

  7. Perform provider-specific initialization in new functions.

  8. Refactor the code to create a pg_locale_t into new function.