diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 87bc688704..68b62d523d 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -5368,13 +5368,14 @@ add_guc_variable(struct config_generic *var, int elevel) /* * Decide whether a proposed custom variable name is allowed. * - * It must be "identifier.identifier", where the rules for what is an - * identifier agree with scan.l. + * It must be two or more identifiers separated by dots, where the rules + * for what is an identifier agree with scan.l. (If you change this rule, + * adjust the errdetail in find_option().) */ static bool valid_custom_variable_name(const char *name) { - int num_sep = 0; + bool saw_sep = false; bool name_start = true; for (const char *p = name; *p; p++) @@ -5383,7 +5384,7 @@ valid_custom_variable_name(const char *name) { if (name_start) return false; /* empty name component */ - num_sep++; + saw_sep = true; name_start = true; } else if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -5400,8 +5401,8 @@ valid_custom_variable_name(const char *name) } if (name_start) return false; /* empty name component */ - /* OK if we had exactly one separator */ - return (num_sep == 1); + /* OK if we found at least one separator */ + return saw_sep; } /* @@ -5516,7 +5517,7 @@ find_option(const char *name, bool create_placeholders, bool skip_errors, (errcode(ERRCODE_INVALID_NAME), errmsg("invalid configuration parameter name \"%s\"", name), - errdetail("Custom parameter names must be of the form \"identifier.identifier\"."))); + errdetail("Custom parameter names must be two or more simple identifiers separated by dots."))); return NULL; } } diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out index c55871a972..59da91ff04 100644 --- a/src/test/regress/expected/guc.out +++ b/src/test/regress/expected/guc.out @@ -515,6 +515,8 @@ SET no_such_variable TO 42; ERROR: unrecognized configuration parameter "no_such_variable" -- Test "custom" GUCs created on the fly (which aren't really an -- intended feature, but many people use them). +SHOW custom.my_guc; -- error, not known yet +ERROR: unrecognized configuration parameter "custom.my_guc" SET custom.my_guc = 42; SHOW custom.my_guc; custom.my_guc @@ -522,14 +524,28 @@ SHOW custom.my_guc; 42 (1 row) +RESET custom.my_guc; -- this makes it go to empty, not become unknown again +SHOW custom.my_guc; + custom.my_guc +--------------- + +(1 row) + +SET custom.my.qualified.guc = 'foo'; +SHOW custom.my.qualified.guc; + custom.my.qualified.guc +------------------------- + foo +(1 row) + SET custom."bad-guc" = 42; -- disallowed because -c cannot set this name ERROR: invalid configuration parameter name "custom.bad-guc" -DETAIL: Custom parameter names must be of the form "identifier.identifier". +DETAIL: Custom parameter names must be two or more simple identifiers separated by dots. SHOW custom."bad-guc"; ERROR: unrecognized configuration parameter "custom.bad-guc" SET special."weird name" = 'foo'; -- could be allowed, but we choose not to ERROR: invalid configuration parameter name "special.weird name" -DETAIL: Custom parameter names must be of the form "identifier.identifier". +DETAIL: Custom parameter names must be two or more simple identifiers separated by dots. SHOW special."weird name"; ERROR: unrecognized configuration parameter "special.weird name" -- diff --git a/src/test/regress/sql/guc.sql b/src/test/regress/sql/guc.sql index 3650188d9d..c39c11388d 100644 --- a/src/test/regress/sql/guc.sql +++ b/src/test/regress/sql/guc.sql @@ -151,8 +151,13 @@ SET no_such_variable TO 42; -- Test "custom" GUCs created on the fly (which aren't really an -- intended feature, but many people use them). +SHOW custom.my_guc; -- error, not known yet SET custom.my_guc = 42; SHOW custom.my_guc; +RESET custom.my_guc; -- this makes it go to empty, not become unknown again +SHOW custom.my_guc; +SET custom.my.qualified.guc = 'foo'; +SHOW custom.my.qualified.guc; SET custom."bad-guc" = 42; -- disallowed because -c cannot set this name SHOW custom."bad-guc"; SET special."weird name" = 'foo'; -- could be allowed, but we choose not to