• Tom Lane's avatar
    Make collation-aware system catalog columns use "C" collation. · 6b0faf72
    Tom Lane authored
    Up to now we allowed text columns in system catalogs to use collation
    "default", but that isn't really safe because it might mean something
    different in template0 than it means in a database cloned from template0.
    In particular, this could mean that cloned pg_statistic entries for such
    columns weren't entirely valid, possibly leading to bogus planner
    estimates, though (probably) not any outright failures.
    
    In the wake of commit 5e092800, a better solution is available: if we
    label such columns with "C" collation, then their pg_statistic entries
    will also use that collation and hence will be valid independently of
    the database collation.
    
    This also provides a cleaner solution for indexes on such columns than
    the hack added by commit 0b28ea79: the indexes will naturally inherit
    "C" collation and don't have to be forced to use text_pattern_ops.
    
    Also, with the planned improvement of type "name" to be collation-aware,
    this policy will apply cleanly to both text and name columns.
    
    Because of the pg_statistic angle, we should also apply this policy
    to the tables in information_schema.  This patch does that by adjusting
    information_schema's textual domain types to specify "C" collation.
    That has the user-visible effect that order-sensitive comparisons to
    textual information_schema view columns will now use "C" collation
    by default.  The SQL standard says that the collation of those view
    columns is implementation-defined, so I think this is legal per spec.
    At some point this might allow for translation of such comparisons
    into indexable conditions on the underlying "name" columns, although
    additional work will be needed before that can happen.
    
    Discussion: https://postgr.es/m/19346.1544895309@sss.pgh.pa.us
    6b0faf72
bootstrap.c 29.2 KB