postgres-github.git / summary / log / commit / refs

commit    dbf217c1c7c2744a18db489c255255e07cfbb110
Author:   Jeff Davis <jdavis@postgresql.org>
Date:     Wed Apr 22 17:22:44 2026 +0000

    catcache.c: use C_COLLATION_OID for texteqfast/texthashfast.
    
    The problem report was about setting GUCs in the startup packet for a
    physical replication connection. Setting the GUC required an ACL
    check, which performed a lookup on pg_parameter_acl.parname. The
    catalog cache was hardwired to use DEFAULT_COLLATION_OID for
    texteqfast() and texthashfast(), but the database default collation
    was uninitialized because it's a physical walsender and never connects
    to a database. In versions 18 and later, this resulted in a NULL
    pointer dereference, while in version 17 it resulted in an ERROR.
    
    As the comments stated, using DEFAULT_COLLATION_OID was arbitrary
    anyway: if the collation actually mattered, it should have used the
    column's actual collation. (In the catalog, some text columns are the
    default collation and some are "C".)
    
    Fix by using C_COLLATION_OID, which doesn't require any initialization
    and is always available. When any deterministic collation will do,
    it's best to consistently use the simplest and fastest one, so this is
    a good idea anyway.
    
    Another problem was raised in the thread, which this commit doesn't
    fix (see second discussion link).
    
    Reported-by: Andrey Borodin <x4mmm@yandex-team.ru>
    Discussion: https://postgr.es/m/D18AD72A-5004-4EF8-AF80-10732AF677FA@yandex-team.ru
    Discussion: https://postgr.es/m/4524ed61a015d3496fc008644dcb999bb31916a7.camel%40j-davis.com
    Backpatch-through: 17

[parent: e471dc591219]