• Tom Lane's avatar
    Base information_schema.sql_identifier domain on name, not varchar. · 7c15cef8
    Tom Lane authored
    The SQL spec says that sql_identifier is a domain over varchar,
    but it also says that that domain is supposed to represent the set
    of valid identifiers for the implementation, in particular applying
    a length limit matching the implementation's identifier length limit.
    We were declaring sql_identifier as just "character varying", thus
    duplicating what the spec says about base type, but entirely failing
    at the rest of it.
    
    Instead, let's declare sql_identifier as a domain over type "name".
    (We can drop the COLLATE "C" added by commit 6b0faf72, since that's
    now implicit in "name".)  With the recent improvements to name's
    comparison support, there's not a lot of functional difference between
    name and varchar.  So although in principle this is a spec deviation,
    it's a pretty minor one.  And correctly enforcing PG's name length limit
    is a good thing; on balance this seems closer to the intent of the spec
    than what we had.
    
    But that's all just language-lawyering.  The *real* reason to do this is
    that it makes sql_identifier columns exposed by information_schema views
    be just direct representations of the underlying "name" catalog columns,
    eliminating a semantic mismatch that was disastrous for performance of
    typical queries on the information_schema.  In combination with the
    recent change to allow dropping no-op CoerceToDomain nodes, this allows
    (for example) queries such as
    
        select ... from information_schema.tables where table_name = 'foo';
    
    to produce an indexscan rather than a seqscan on pg_class.
    
    Discussion: https://postgr.es/m/CAFj8pRBUCX4LZ2rA2BbEkdD6NN59mgx+BLo1gO08Wod4RLtcTg@mail.gmail.com
    7c15cef8
information_schema.sql 108 KB