Thread

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Support LIKE with nondeterministic collations

  1. BUG #19474: LIKE with nondeterministic collations mis-handle literal backslashes in patterns containing escape

    PG Bug reporting form <noreply@postgresql.org> — 2026-05-09T02:22:23Z

    The following bug has been logged on the website:
    
    Bug reference:      19474
    Logged by:          Bowen Shi
    Email address:      zxwsbg12138@gmail.com
    PostgreSQL version: 18.3
    Operating system:   centos
    Description:        
    
    After commit 85b7efa1cdd63c2fe2b70b725b8285743ee5787f ("Support LIKE with
    nondeterministic collations"), LIKE on a nondeterministic collation can
    return an incorrect result when the pattern contains a literal backslash.
    
    The problem appears to be in MatchText() in
    src/backend/utils/adt/like_match.c. In the nondeterministic-collation path,
    when a pattern substring contains escape processing, the code builds an
    unescaped copy of the substring. In that logic, a backslash that should
    remain as a literal character can be dropped, so the substring compared by
    pg_strncoll() is not the same as the original SQL pattern semantics.
    
    As a result, a LIKE pattern that should match a string containing a literal
    backslash can incorrectly return false.
    
    SQL reproduction:
    
    CREATE COLLATION ignore_accents (
        provider = icu,
        locale = 'und-u-ks-level1',
        deterministic = false
    );
    
    SELECT 'back\slash' COLLATE ignore_accents LIKE 'back\slash%' ESCAPE '#';
    
    Expected result:
     t
    
    Actual result:
     f
    
    The same pattern works as expected without the nondeterministic collation
    semantics.
    
    A table-based reproduction:
    
    CREATE COLLATION ignore_accents (
        provider = icu,
        locale = 'und-u-ks-level1',
        deterministic = false
    );
    
    CREATE TABLE like_test (val text);
    INSERT INTO like_test VALUES ('back\slash');
    
    SELECT val
    FROM like_test
    WHERE val COLLATE ignore_accents LIKE 'back\slash%' ESCAPE '#';
    
    Expected result:
     one row: back\slash
    
    Actual result:
     zero rows
    
    This seems to be caused by the unescape logic in like_match.c for
    nondeterministic collations, where a pattern fragment containing backslashes
    is copied incorrectly before calling pg_strncoll().
    
    
    
    
    
    
  2. Re: BUG #19474: LIKE with nondeterministic collations mis-handle literal backslashes in patterns containing escape

    Nitin Motiani <nitinmotiani@google.com> — 2026-05-14T11:15:45Z

    Hi,
    
    I have proposed a fix for this on pgsql-hackers[1]. Please take a look
    and let me know what you think.
    
    Thanks & Regards,
    Nitin Motiani
    Google
    
    [1] https://www.postgresql.org/message-id/CAH5HC94yU%2BK8Gcdy12M5BS8gwD_SXLSHzc9k5tNk7JDnpBiFMA%40mail.gmail.com
    
    On Sat, May 9, 2026 at 8:02 AM PG Bug reporting form
    <noreply@postgresql.org> wrote:
    >
    > The following bug has been logged on the website:
    >
    > Bug reference:      19474
    > Logged by:          Bowen Shi
    > Email address:      zxwsbg12138@gmail.com
    > PostgreSQL version: 18.3
    > Operating system:   centos
    > Description:
    >
    > After commit 85b7efa1cdd63c2fe2b70b725b8285743ee5787f ("Support LIKE with
    > nondeterministic collations"), LIKE on a nondeterministic collation can
    > return an incorrect result when the pattern contains a literal backslash.
    >
    > The problem appears to be in MatchText() in
    > src/backend/utils/adt/like_match.c. In the nondeterministic-collation path,
    > when a pattern substring contains escape processing, the code builds an
    > unescaped copy of the substring. In that logic, a backslash that should
    > remain as a literal character can be dropped, so the substring compared by
    > pg_strncoll() is not the same as the original SQL pattern semantics.
    >
    > As a result, a LIKE pattern that should match a string containing a literal
    > backslash can incorrectly return false.
    >
    > SQL reproduction:
    >
    > CREATE COLLATION ignore_accents (
    >     provider = icu,
    >     locale = 'und-u-ks-level1',
    >     deterministic = false
    > );
    >
    > SELECT 'back\slash' COLLATE ignore_accents LIKE 'back\slash%' ESCAPE '#';
    >
    > Expected result:
    >  t
    >
    > Actual result:
    >  f
    >
    > The same pattern works as expected without the nondeterministic collation
    > semantics.
    >
    > A table-based reproduction:
    >
    > CREATE COLLATION ignore_accents (
    >     provider = icu,
    >     locale = 'und-u-ks-level1',
    >     deterministic = false
    > );
    >
    > CREATE TABLE like_test (val text);
    > INSERT INTO like_test VALUES ('back\slash');
    >
    > SELECT val
    > FROM like_test
    > WHERE val COLLATE ignore_accents LIKE 'back\slash%' ESCAPE '#';
    >
    > Expected result:
    >  one row: back\slash
    >
    > Actual result:
    >  zero rows
    >
    > This seems to be caused by the unescape logic in like_match.c for
    > nondeterministic collations, where a pattern fragment containing backslashes
    > is copied incorrectly before calling pg_strncoll().
    >
    >
    >
    >