Re: BUG #19341: REPLACE() fails to match final character when using nondeterministic ICU collation

Laurenz Albe <laurenz.albe@cybertec.at>

From: Laurenz Albe <laurenz.albe@cybertec.at>
To: adam.warland@infor.com, pgsql-bugs@lists.postgresql.org
Date: 2025-12-02T16:24:54Z
Lists: pgsql-bugs
On Tue, 2025-12-02 at 10:03 +0000, PG Bug reporting form wrote:
> PostgreSQL version: 18.1
> 
> When using a nondeterministic ICU collation, the replace() function fails to
> replace a substring when that substring appears at the end of the input
> string.
> 
> Occurrences of the same substring earlier in the string are replaced
> normally.
> 
> Specific collation used:
> create collation test_nondeterministic (
>     provider = icu,
>     locale = 'und-u-ks-level2',
>     deterministic = false
> )
> 
> -- Replace final character under nondeterministic collation
> SELECT replace(
>     'testx' COLLATE "test_nondeterministic",
>     'x'     COLLATE "test_nondeterministic",
>     'y') AS res1;

I can reproduce the problem, and the attached patch fixes it for me.

I am not certain if it is safe to apply pg_mblen() to "haystack_end", though.

Yours,
Laurenz Albe