• Tomas Vondra's avatar
    Check for tables with sql_identifier during pg_upgrade · 0ccfc282
    Tomas Vondra authored
    Commit 7c15cef8 changed sql_identifier data type to be based on name
    instead of varchar.  Unfortunately, this breaks on-disk format for this
    data type.  Luckily, that should be a very rare problem, as this data
    type is used only in information_schema views, so this only affects user
    objects (tables, materialized views and indexes).  One way to end in
    such situation is to do CTAS with a query on those system views.
    
    There are two options to deal with this - we can either abort pg_upgrade
    if there are user objects with sql_identifier columns in pg_upgrade, or
    we could replace the sql_identifier type with varchar.  Considering how
    rare the issue is expected to be, and the complexity of replacing the
    data type (e.g. in matviews), we've decided to go with the simple check.
    
    The query is somewhat complex - the sql_identifier data type may be used
    indirectly - through a domain, a composite type or both, possibly in
    multiple levels.  Detecting this requires a recursive CTE.
    
    Backpatch to 12, where the sql_identifier definition changed.
    
    Reported-by: Hans Buschmann
    Author: Tomas Vondra
    Reviewed-by: Tom Lane
    Backpatch-to: 12
    Discussion: https://postgr.es/m/16045-673e8fa6b5ace196%40postgresql.org
    0ccfc282
pg_upgrade.h 12.6 KB