aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bin/psql/print.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 0efb57f778b..167400bb240 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -2664,16 +2664,24 @@ setDecimalLocale(void)
extlconv = localeconv();
+ /* Don't accept an empty decimal_point string */
if (*extlconv->decimal_point)
decimal_point = pg_strdup(extlconv->decimal_point);
else
decimal_point = "."; /* SQL output standard */
- if (*extlconv->grouping && atoi(extlconv->grouping) > 0)
- groupdigits = atoi(extlconv->grouping);
- else
+ /*
+ * Although the Open Group standard allows locales to supply more than one
+ * group width, we consider only the first one, and we ignore any attempt
+ * to suppress grouping by specifying CHAR_MAX. As in the backend's
+ * cash.c, we must apply a range check to avoid being fooled by variant
+ * CHAR_MAX values.
+ */
+ groupdigits = *extlconv->grouping;
+ if (groupdigits <= 0 || groupdigits > 6)
groupdigits = 3; /* most common */
+ /* Don't accept an empty thousands_sep string, either */
/* similar code exists in formatting.c */
if (*extlconv->thousands_sep)
thousands_sep = pg_strdup(extlconv->thousands_sep);