• Tom Lane's avatar
    Fix mishandling of quoted-list GUC values in pg_dump and ruleutils.c. · 74286994
    Tom Lane authored
    Code that prints out the contents of setconfig or proconfig arrays in
    SQL format needs to handle GUC_LIST_QUOTE variables differently from
    other ones, because for those variables, flatten_set_variable_args()
    already applied a layer of quoting.  The value can therefore safely
    be printed as-is, and indeed must be, or flatten_set_variable_args()
    will muck it up completely on reload.  For all other GUC variables,
    it's necessary and sufficient to quote the value as a SQL literal.
    
    We'd recognized the need for this long ago, but mis-analyzed the
    need slightly, thinking that all GUC_LIST_INPUT variables needed
    the special treatment.  That's actually wrong, since a valid value
    of a LIST variable might include characters that need quoting,
    although no existing variables accept such values.
    
    More to the point, we hadn't made any particular effort to keep the
    various places that deal with this up-to-date with the set of variables
    that actually need special treatment, meaning that we'd do the wrong
    thing with, for example, temp_tablespaces values.  This affects dumping
    of SET clauses attached to functions, as well as ALTER DATABASE/ROLE SET
    commands.
    
    In ruleutils.c we can fix it reasonably honestly by exporting a guc.c
    function that allows discovering the flags for a given GUC variable.
    But pg_dump doesn't have easy access to that, so continue the old method
    of having a hard-wired list of affected variable names.  At least we can
    fix it to have just one list not two, and update the list to match
    current reality.
    
    A remaining problem with this is that it only works for built-in
    GUC variables.  pg_dump's list obvious knows nothing of third-party
    extensions, and even the "ask guc.c" method isn't bulletproof since
    the relevant extension might not be loaded.  There's no obvious
    solution to that, so for now, we'll just have to discourage extension
    authors from inventing custom GUCs that need GUC_LIST_QUOTE.
    
    This has been busted for a long time, so back-patch to all supported
    branches.
    
    Michael Paquier and Tom Lane, reviewed by Kyotaro Horiguchi and
    Pavel Stehule
    
    Discussion: https://postgr.es/m/20180111064900.GA51030@paquier.xyz
    74286994
dumputils.h 2.38 KB