Improve "out of range" error messages for GUCs.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 23 Apr 2024 15:52:40 +0000 (11:52 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 23 Apr 2024 15:52:44 +0000 (11:52 -0400)
If the GUC has a unit, label the minimum and maximum values
with the unit explicitly.  Per suggestion from Jian He.

Discussion: https://postgr.es/m/CACJufxFJo6FyVg9W8yvNAxbjP+EJ9wieE9d9vw5LpPzyLnLLOQ@mail.gmail.com

src/backend/utils/misc/guc.c
src/test/regress/expected/guc.out

index f51b3e0b507ec00a8f8e2bb3bd146eb3316994c0..3fb68039986f6a2f553cf456a2e8f7d93511455f 100644 (file)
@@ -3173,15 +3173,20 @@ parse_and_validate_value(struct config_generic *record,
                if (newval->intval < conf->min || newval->intval > conf->max)
                {
                    const char *unit = get_config_unit_name(conf->gen.flags);
+                   const char *unitspace;
+
+                   if (unit)
+                       unitspace = " ";
+                   else
+                       unit = unitspace = "";
 
                    ereport(elevel,
                            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                            errmsg("%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)",
-                                   newval->intval,
-                                   unit ? " " : "",
-                                   unit ? unit : "",
+                            errmsg("%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)",
+                                   newval->intval, unitspace, unit,
                                    name,
-                                   conf->min, conf->max)));
+                                   conf->min, unitspace, unit,
+                                   conf->max, unitspace, unit)));
                    return false;
                }
 
@@ -3209,15 +3214,20 @@ parse_and_validate_value(struct config_generic *record,
                if (newval->realval < conf->min || newval->realval > conf->max)
                {
                    const char *unit = get_config_unit_name(conf->gen.flags);
+                   const char *unitspace;
+
+                   if (unit)
+                       unitspace = " ";
+                   else
+                       unit = unitspace = "";
 
                    ereport(elevel,
                            (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                            errmsg("%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)",
-                                   newval->realval,
-                                   unit ? " " : "",
-                                   unit ? unit : "",
+                            errmsg("%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)",
+                                   newval->realval, unitspace, unit,
                                    name,
-                                   conf->min, conf->max)));
+                                   conf->min, unitspace, unit,
+                                   conf->max, unitspace, unit)));
                    return false;
                }
 
index 127c9532976c914c073caa32cb562aaebba65ac6..455b6d6c0ce54532002a1cda2682afdabb96b25c 100644 (file)
@@ -510,7 +510,7 @@ SELECT '2006-08-13 12:34:56'::timestamptz;
 SET seq_page_cost TO 'NaN';
 ERROR:  invalid value for parameter "seq_page_cost": "NaN"
 SET vacuum_cost_delay TO '10s';
-ERROR:  10000 ms is outside the valid range for parameter "vacuum_cost_delay" (0 .. 100)
+ERROR:  10000 ms is outside the valid range for parameter "vacuum_cost_delay" (0 ms .. 100 ms)
 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