Re: [BUGS] BUG #8676: Bug Money JSON - Mailing list pgsql-hackers

From Andrew Dunstan
Subject Re: [BUGS] BUG #8676: Bug Money JSON
Date
Msg-id 52BC72A6.2040808@dunslane.net
Whole thread Raw
Responses Re: [BUGS] BUG #8676: Bug Money JSON  (Andrew Dunstan <andrew@dunslane.net>)
List pgsql-hackers
On 12/17/2013 11:16 AM, Andrew Dunstan wrote:
>
> On 12/17/2013 10:31 AM, Tom Lane wrote:
>> Andrew Dunstan <andrew@dunslane.net> writes:
>>>> On Wed, Dec 11, 2013 at 02:30:04PM +0000,
>>>> email@andersonloyola.com.br wrote:
>>>>> postgres=# SELECT to_json(a) FROM (VALUES(1000::money)) a(salario);
>>>>> to_json
>>>>> -----------------------
>>>>> {"salario":$1,000.00}
>>>>> (1 row)
>>> Yeah. I'll have a look. In fact this looks like it's possibly a couple
>>> of bugs. The JSON produced by the first query is not valid. It looks
>>> like we might need to force money to text unconditionally.
>> Isn't this simply failure to quote the string properly?  What drives
>> to_json's choice of whether to quote or not, anyway?
>>
>>
>
>
> If it's numeric, it only quotes if it sees a non-numeric character,
> defined thus:
>
>    /* letters appearing in numeric output that aren't valid in a JSON
>    number */
>    #define NON_NUMERIC_LETTER "NnAaIiFfTtYy"
>
>
> I forgot about money when I did that - some of this dates back to 9.2.
>
> I'm about to test the attached patch which should force money to be
> quoted always.
>
>


This turned out to be not such a good idea. Quite apart from anything
else it doesn't handle domains over money at all well.

The attached patch abandons the test described above, and instead passes
the string from the output function to the json number lexer to see if
it's a valid json number.  A small adjustment to the API of that
function was required to make it suitable for this use. This seems like
a much more robust approach.

cheers

andrew


Attachment

pgsql-hackers by date:

Previous
From: Vik Fearing
Date:
Subject: Re: CREATE TABLESPACE SET
Next
From: Peter Eisentraut
Date:
Subject: Re: BDR-project