• Tom Lane's avatar
    Use a blacklist to distinguish original from add-on enum values. · 1635e80d
    Tom Lane authored
    Commit 15bc038f allowed ALTER TYPE ADD VALUE to be executed inside
    transaction blocks, by disallowing the use of the added value later
    in the same transaction, except under limited circumstances.  However,
    the test for "limited circumstances" was heuristic and could reject
    references to enum values that were created during CREATE TYPE AS ENUM,
    not just later.  This breaks the use-case of restoring pg_dump scripts
    in a single transaction, as reported in bug #14825 from Balazs Szilfai.
    
    We can improve this by keeping a "blacklist" table of enum value OIDs
    created by ALTER TYPE ADD VALUE during the current transaction.  Any
    visible-but-uncommitted value whose OID is not in the blacklist must
    have been created by CREATE TYPE AS ENUM, and can be used safely
    because it could not have a lifespan shorter than its parent enum type.
    
    This change also removes the restriction that a renamed enum value
    can't be used before being committed (unless it was on the blacklist).
    
    Andrew Dunstan, with cosmetic improvements by me.
    Back-patch to v10.
    
    Discussion: https://postgr.es/m/20170922185904.1448.16585@wrigleys.postgresql.org
    1635e80d
enum.out 15.1 KB