From e31efecb3d29087c8f4f985b86936106ef075a69 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Wed, 25 Jun 2025 10:54:33 -0500 Subject: [PATCH v2 1/1] Allow resetting unknown custom GUCs with reserved prefixes. --- src/backend/utils/misc/guc.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 667df448732..a75960d2b0b 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -6711,6 +6711,7 @@ validate_option_array_item(const char *name, const char *value, { struct config_generic *gconf; + bool reset_custom; /* * There are three cases to consider: @@ -6729,16 +6730,28 @@ validate_option_array_item(const char *name, const char *value, * it's assumed to be fully validated.) * * name is not known and can't be created as a placeholder. Throw error, - * unless skipIfNoPermissions is true, in which case return false. + * unless skipIfNoPermissions or reset_custom is true. If find_option() + * returns false and reset_custom is true, this is a RESET or RESET ALL + * operation for an unknown custom GUC with a reserved prefix, in which + * case we want to fall through to the placeholder check described in the + * preceding paragraph (else there'd be no way for users to remove them). + * Otherwise, if find_option() returns false, return false here, too. */ - gconf = find_option(name, true, skipIfNoPermissions, ERROR); - if (!gconf) + reset_custom = (!value && valid_custom_variable_name(name)); + gconf = find_option(name, true, skipIfNoPermissions || reset_custom, ERROR); + if (!gconf && !reset_custom) { /* not known, failed to make a placeholder */ return false; } - if (gconf->flags & GUC_CUSTOM_PLACEHOLDER) + /* + * If we reach this point and gconf is NULL, we know we're dealing with a + * RESET or RESET ALL command for an unknown custom GUC with a reserved + * prefix. We treat that the same as if a placeholder was created, else + * there'd be no way for users to remove them. + */ + if (!gconf || gconf->flags & GUC_CUSTOM_PLACEHOLDER) { /* * We cannot do any meaningful check on the value, so only permissions -- 2.39.5 (Apple Git-154)