Re: json generation enhancements - Mailing list pgsql-hackers

From Andrew Dunstan
Subject Re: json generation enhancements
Date
Msg-id 512BE78F.2000209@dunslane.net
Whole thread Raw
In response to Re: json generation enhancements  (Steve Singer <steve@ssinger.info>)
Responses Re: json generation enhancements  (Steve Singer <steve@ssinger.info>)
List pgsql-hackers
On 02/24/2013 01:09 AM, Steve Singer wrote:
> On 13-01-11 11:03 AM, Andrew Dunstan wrote:
>>
>> On 01/11/2013 11:00 AM, Andrew Dunstan wrote:
>>>
>>> I have not had anyone follow up on this, so I have added docs and
>>> will add this to the commitfest.
>>>
>>> Recap:
>>>
>>> This adds the following:
>>>
>>>     json_agg(anyrecord) -> json
>>>     to_json(any) -> json
>>>     hstore_to_json(hstore) -> json (also used as a cast)
>>>     hstore_to_json_loose(hstore) -> json
>>>
>>> Also, in json generation, if any non-builtin type has a cast to
>>> json, that function is used instead of the type's output function.
>>>
>>>
>>
>> This time with a patch.
>>
>
> Here is a review of this patch.,
>
> Overview
> ---------------------
> This patch adds a set of functions to convert types to json. Specifically
>
> * An aggregate that take the elements and builds up a json array.
> * Conversions from an hstore to json
>
> For non-builtin types the text conversion is used unless a cast has
> specifically been defined from the type to json.
>
> There was some discussion last year on this patch that raised three
> issues
>
> a) Robert was concerned that if someone added a cast from a non-core
> type like citext to json that it would change the behaviour of this
> function. No one else offered an opinion on this at the time.  I don't
> see this as a problem, if I add a cast between citext (or any other
> non-core datatype) to json I would expect it to effect how that
> datatype is generated as a json object in any functions that generate
> json.   I don't see why this would be surprising behaviour.  If I add
> a cast between my datatype and json to generate a json representation
> that differs from the textout representation then I would expect that
> representation to be used in the json_agg function as well.
>
> b) There was some talk in the json bikeshedding thread that json_agg()
> should be renamed to collect_json() but more people preferred json_agg().
>
> c) Should an aggregate of an empty result produce NULL or an empty
> json element. Most people who commented on the thread seemed to feel
> that NULL is preferred because it is  consistent with other aggregates
>
> I feel that the functionality of this patch is fine.
>
> Testing
> -------------------
>
> When I try running the regression tests with this patch I get:
> creating template1 database in
> /usr/local/src/postgresql/src/test/regress/./tmp_check/data/base/1 ...
> FATAL:  could not create unique index "pg_proc_oid_index"
> DETAIL:  Key (oid)=(3171) is duplicated.
> child process exited with exit code 1
>
> oid 3170, 3171 and 3172 appears to be used by lo_tell64 and lo_lseek64
>
> If I fix those up the regression tests pass.
>
> I tried using the new functions in a few different ways and everything
> worked as expected.
>
> Code Review
> -----------
> in contrib/hstore/hstore_io.c
> +                                       /* not an int - try a double */
> +                                       double doubleres =
> strtod(src->data,&endptr);
> +                                       if (*endptr == '\0')
> +                                               is_number = true;
> +                                       else if (false)
> +                                       {
> +                                               /* shut the compiler
> up about unused variables */
> +                                               longres = (long)
> doubleres;
> +                                               longres = longres / 2;
>
>
> I dislike that we have to do this to avoid compiler warnings.  I am
> also worried the some other compiler might decide that the else if
> (false) is worthy of a warning.  Does anyone have  cleaner way of
> getting rid of the warning we get if we don't store the strtol/strtod
> result?
>
> Should we do something like:
>
> (void) ( strtol(src->data,&endptr,10)+1);
>
> Other than that I don't see any issues.
>
>

Thanks for the review. Revised patch attached with fresh OIDs and
numeric detection code cleaned up along the lines you suggest.

cheers

andrew

Attachment

pgsql-hackers by date:

Previous
From: "Erik Rijkers"
Date:
Subject: Re: Materialized views WIP patch
Next
From: Peter Eisentraut
Date:
Subject: Re: pg_xlogdump