mirror of
https://github.com/postgres/postgres.git
synced 2025-09-11 00:12:06 +03:00
Allow ALTER SYSTEM to set unrecognized custom GUCs.
Previously, ALTER SYSTEM failed if the target GUC wasn't present in the session's GUC hashtable. That is a reasonable behavior for core (single-part) GUC names, and for custom GUCs for which we have loaded an extension that's reserved the prefix. But it's unnecessarily restrictive otherwise, and it also causes inconsistent behavior: you can "ALTER SYSTEM SET foo.bar" only if you did "SET foo.bar" earlier in the session. That's fairly silly. Hence, refactor things so that we can execute ALTER SYSTEM even if the variable doesn't have a GUC hashtable entry, as long as the name meets the custom-variable naming requirements and does not have a reserved prefix. (It's safe to do this even if the variable belongs to an extension we currently don't have loaded. A bad value will at worst cause a WARNING when the extension does get loaded.) Also, adjust GRANT ON PARAMETER to have the same opinions about whether to allow an unrecognized GUC name, and to throw the same errors if not (it previously used a one-size-fits-all message for several distinguishable conditions). By default, only a superuser will be allowed to do ALTER SYSTEM SET on an unrecognized name, but it's possible to GRANT the ability to do it. Patch by me, pursuant to a documentation complaint from Gavin Panella. Arguably this is a bug fix, but given the lack of other complaints I'll refrain from back-patching. Discussion: https://postgr.es/m/2617358.1697501956@sss.pgh.pa.us Discussion: https://postgr.es/m/169746329791.169914.16613647309012285391@wrigleys.postgresql.org
This commit is contained in:
@@ -363,7 +363,7 @@ extern const char *GetConfigOptionResetString(const char *name);
|
||||
extern int GetConfigOptionFlags(const char *name, bool missing_ok);
|
||||
extern void ProcessConfigFile(GucContext context);
|
||||
extern char *convert_GUC_name_for_parameter_acl(const char *name);
|
||||
extern bool check_GUC_name_for_parameter_acl(const char *name);
|
||||
extern void check_GUC_name_for_parameter_acl(const char *name);
|
||||
extern void InitializeGUCOptions(void);
|
||||
extern bool SelectConfigFiles(const char *userDoption, const char *progname);
|
||||
extern void ResetAllOptions(void);
|
||||
|
Reference in New Issue
Block a user