• Tom Lane's avatar
    Improve pg_dump's handling of "special" built-in objects. · 5955d934
    Tom Lane authored
    We had some pretty ad-hoc handling of the public schema and the plpgsql
    extension, which are both presumed to exist in template0 but might be
    modified or deleted in the database being dumped.
    
    Up to now, by default pg_dump would emit a CREATE EXTENSION IF NOT EXISTS
    command as well as a COMMENT command for plpgsql.  The usefulness of the
    former is questionable, and the latter caused annoying errors in
    non-superuser dump/restore scenarios.  Let's instead install a rule that
    built-in extensions (identified by having low-numbered OIDs) are not to be
    dumped.  We were doing it that way already in binary-upgrade mode, so this
    just makes regular mode behave the same.  It remains true that if someone
    has installed a non-default ACL on the plpgsql language, that will get
    dumped thanks to the pg_init_privs mechanism.  This is more consistent with
    the handling of built-in objects of other kinds.
    
    Also, change the very ad-hoc mechanism that was used to avoid dumping
    creation and comment commands for the public schema.  Instead of hardwiring
    a test in _printTocEntry(), make use of the DUMP_COMPONENT_ infrastructure
    to mark that schema up-front about what we want to do with it.  This has
    the visible effect that the public schema won't be mentioned in the output
    at all, except for updating its ACL if it has a non-default ACL.
    Previously, while it was normally not mentioned, --clean mode would drop
    and recreate it, again causing headaches for non-superuser usage.  This
    change likewise makes the public schema less special and more like other
    built-in objects.
    
    If plpgsql, or the public schema, has been removed entirely in the source
    DB, that situation won't be reproduced in the destination ... but that
    was true before.
    
    Discussion: https://postgr.es/m/29048.1516812451@sss.pgh.pa.us
    5955d934
pg_dump.c 550 KB