• Tom Lane's avatar
    Fix some inappropriately-disallowed uses of ALTER ROLE/DATABASE SET. · 69d5ca48
    Tom Lane authored
    Most GUC check hooks that inspect database state have special checks
    that prevent them from throwing hard errors for state-dependent issues
    when source == PGC_S_TEST.  This allows, for example,
    "ALTER DATABASE d SET default_text_search_config = foo" when the "foo"
    configuration hasn't been created yet.  Without this, we have problems
    during dump/reload or pg_upgrade, because pg_dump has no idea about
    possible dependencies of GUC values and can't ensure a safe restore
    ordering.
    
    However, check_role() and check_session_authorization() hadn't gotten
    the memo about that, and would throw hard errors anyway.  It's not
    entirely clear what is the use-case for "ALTER ROLE x SET role = y",
    but we've now heard two independent complaints about that bollixing
    an upgrade, so apparently some people are doing it.
    
    Hence, fix these two functions to act more like other check hooks
    with similar needs.  (But I did not change their insistence on
    being inside a transaction, as it's still not apparent that setting
    either GUC from the configuration file would be wise.)
    
    Also fix check_temp_buffers, which had a different form of the disease
    of making state-dependent checks without any exception for PGC_S_TEST.
    A cursory survey of other GUC check hooks did not find any more issues
    of this ilk.  (There are a lot of interdependencies among
    PGC_POSTMASTER and PGC_SIGHUP GUCs, which may be a bad idea, but
    they're not relevant to the immediate concern because they can't be
    set via ALTER ROLE/DATABASE.)
    
    Per reports from Charlie Hornsby and Nathan Bossart.  Back-patch
    to all supported branches.
    
    Discussion: https://postgr.es/m/HE1P189MB0523B31598B0C772C908088DB7709@HE1P189MB0523.EURP189.PROD.OUTLOOK.COM
    Discussion: https://postgr.es/m/20160711223641.1426.86096@wrigleys.postgresql.org
    69d5ca48
variable.c 22.5 KB