• Tomas Vondra's avatar
    Improve the check for pg_catalog.line data type in pg_upgrade · 8d48e6a7
    Tomas Vondra authored
    The pg_upgrade check for pg_catalog.line data type when upgrading from
    9.3 had a couple of issues with domains and composite types. Firstly, it
    triggered false positives for composite types unused in objects with
    storage. This was enough to trigger an unnecessary pg_upgrade failure:
    
      CREATE TYPE line_composite AS (l pg_catalog.line)
    
    On the other hand, this only happened with composite types directly on
    the pg_catalog.line data type, but not with a domain. So this was not
    detected
    
      CREATE DOMAIN line_domain AS pg_catalog.line;
      CREATE TYPE line_composite_2 AS (l line_domain);
    
    unlike the first example. These false positives and inconsistencies are
    unfortunate, but what's worse we've failed to detected objects using the
    pg_catalog.line data type through a domain. So we missed cases like this
    
      CREATE TABLE t (l line_composite_2);
    
    The consequence is clusters broken after a pg_upgrade.
    
    This fixes these false positives and false negatives by using the same
    recursive CTE introduced by eaf900e842 for sql_identifier. 9.3 did not
    support domains on composite types, but we can still have multi-level
    composite types.
    
    Backpatch all the way to 9.4, where the format for pg_catalog.line data
    type changed.
    
    Author: Tomas Vondra
    Backpatch-to: 9.4-
    Discussion: https://postgr.es/m/16045-673e8fa6b5ace196%40postgresql.org
    8d48e6a7
version.c 16.6 KB