Re: BUG #13636: psql numericlocale adds comma where it ought not - Mailing list pgsql-bugs

From Tom Lane
Subject Re: BUG #13636: psql numericlocale adds comma where it ought not
Date
Msg-id 6391.1443194204@sss.pgh.pa.us
Whole thread Raw
In response to Re: BUG #13636: psql numericlocale adds comma where it ought not  (Thomas Munro <thomas.munro@enterprisedb.com>)
List pgsql-bugs
Thomas Munro <thomas.munro@enterprisedb.com> writes:
> About your follow-up commit 6325527d845b629243fb3f605af6747a7a4ac45f,
> I noticed that glibc localedata has some grouping values of 0 (no
> grouping at all), for example nl_NL, el_GR, hr_HR, it_IT, pl_PL,
> es_CU, pt_PT and we don't honour that, if it's 0 we use 3.  All the
> rest begin with 3, except for unm_US which uses 2;2;2;3 (apparently a
> Delaware language), and I confirmed that now produces strings like "12
> 34 56", so I guess that obscure locale may be the only case that the
> commit actually changes on a glibc system.

Yeah, the locales where grouping isn't just 3 are so obscure that
I don't particularly care.  If someone from one of those areas
wants to submit a feature patch to implement grouping more fully,
more power to 'em ...

However, I checked this morning and found that the MONEY case that
was niggling me yesterday is indeed a problem, for instance in de_DE:

$ LC_NUMERIC=de_DE psql regression
psql (9.6devel)
Type "help" for help.

regression=# set lc_monetary = 'de_DE';
SET
regression=# select '123456.78'::money;
       money
-------------------
 12.345.678,00 EUR
(1 row)

regression=# \pset numericlocale on
Locale-adjusted numeric output is on.
regression=# select '123456.78'::money;
       money
-------------------
 12,345.678,00 EUR
(1 row)

So we're gonna have to do something about that.  I considered
a few fixes:

* Remove CASHOID from the set of datatypes that printQuery will choose
to right-justify.  This seems likely to annoy people who are used to
having money amounts right-justified.

* Separate "use locale formatting" from "right justify", and apply only
the latter to CASHOID.  This would be the cleanest fix but by far the
most invasive.  I don't particularly want to do that much work and I
definitely wouldn't want to back-patch it.

* Put a hack into format_numeric_locale() so that it won't mess with
monetary output.  This seems feasible because cash_out() always insists
on using a non-empty currency symbol.  For example, we could check that
the string includes no characters outside "0123456789+-.eE" and feel
pretty safe that no money value would pass the check.

So I'm inclined to do the third one.  Objections, better ideas?

            regards, tom lane

pgsql-bugs by date:

Previous
From: lei@aswsyst.cz
Date:
Subject: BUG #13638: Exception texts from plperl has bad encoding
Next
From: Tom Lane
Date:
Subject: Re: BUG #13638: Exception texts from plperl has bad encoding