Re: More new SQL/JSON item methods
Andrew Dunstan <andrew@dunslane.net>
From: Andrew Dunstan <andrew@dunslane.net>
To: Jeevan Chalke <jeevan.chalke@enterprisedb.com>
Cc: Peter Eisentraut <peter@eisentraut.org>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2023-12-03T16:14:15Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Rationalize and improve error messages for some jsonpath items
- 92d2ab7554f9 17.0 landed
-
Clean up a bug in sql/json items commit 66ea94e8e6
- 06a66d87dbc7 17.0 landed
-
Implement various jsonpath methods
- 66ea94e8e606 17.0 cited
-
Reorganise jsonpath operators and methods
- 283a95da9236 17.0 landed
-
Add numeric_int8_opt_error() to optionally suppress errors
- c1b9e1e56d8c 17.0 landed
On 2023-11-06 Mo 08:23, Jeevan Chalke wrote:
>
>
> On Wed, Nov 1, 2023 at 3:49 PM Andrew Dunstan <andrew@dunslane.net> wrote:
>
>
> On 2023-11-01 We 03:00, Jeevan Chalke wrote:
>> Hello,
>>
>> On Tue, Oct 24, 2023 at 6:41 PM Andrew Dunstan
>> <andrew@dunslane.net> wrote:
>>
>>
>> On 2023-10-19 Th 02:06, Jeevan Chalke wrote:
>>> Thanks, Peter for the comments.
>>>
>>> On Fri, Oct 6, 2023 at 5:13 PM Peter Eisentraut
>>> <peter@eisentraut.org> wrote:
>>>
>>> On 29.08.23 09:05, Jeevan Chalke wrote:
>>> >
>>> v1-0001-Implement-jsonpath-.bigint-.integer-and-.number-m.patch
>>> >
>>> > This commit implements jsonpath .bigint(), .integer(),
>>> and .number()
>>> > methods. The JSON string or a numeric value is
>>> converted to the
>>> > bigint, int4, and numeric type representation.
>>>
>>> A comment that applies to all of these: These add
>>> various keywords,
>>> switch cases, documentation entries in some order. Are
>>> we happy with
>>> that? Should we try to reorder all of that for better
>>> maintainability
>>> or readability?
>>>
>>>
>>> Yeah, that's the better suggestion. While implementing these
>>> methods, I was confused about where to put them exactly and
>>> tried keeping them in some logical place.
>>> I think once these methods get in, we can have a follow-up
>>> patch reorganizing all of these.
>>
>>
>> I think it would be better to organize things how we want
>> them before adding in more stuff.
>>
>>
>> I have tried reordering all the jsonpath Operators and Methods
>> consistently. With this patch, they all appear in the same order
>> when together in the group.
>>
>> In some switch cases, they are still divided, like in
>> flattenJsonPathParseItem(), where 2-arg, 1-arg, and no-arg cases
>> are clubbed together. But I have tried to keep them in order in
>> those subgroups.
>>
>> I will rebase my patches for this task on this patch, but before
>> doing so, I would like to get your views on this reordering.
>>
>>
>
> This appears to be reasonable. Maybe we need to add a note in one
> or two places about maintaining the consistency?
>
> +1
> Added a note in jsonpath.h where enums are defined.
>
> I have rebased all three patches over this reordering patch making 4
> patches in the set.
>
> Let me know your views on the same.
>
> Thanks
>
>
Hi Jeevan,
I think these are in reasonably good shape, but there are a few things
that concern me:
andrew@~=# select jsonb_path_query_array('[1.2]', '$[*].bigint()');
ERROR: numeric argument of jsonpath item method .bigint() is out of
range for type bigint
I'm ok with this being an error, but I think the error message is wrong.
It should be the "invalid input" message.
andrew@~=# select jsonb_path_query_array('[1.0]', '$[*].bigint()');
ERROR: numeric argument of jsonpath item method .bigint() is out of
range for type bigint
Should we trim trailing dot+zeros from numeric values before trying to
convert to bigint/int? If not, this too should be an "invalid input" case.
andrew@~=# select jsonb_path_query_array('[1.0]', '$[*].boolean()');
ERROR: numeric argument of jsonpath item method .boolean() is out of
range for type boolean
It seems odd that any non-zero integer is true but not any non-zero
numeric. Is that in the spec? If not I'd avoid trying to convert it to
an integer first, and just check for infinity/nan before looking to see
if it's zero.
The code for integer() and bigint() seems a bit duplicative, but I'm not
sure there's a clean way of avoiding that.
The items for datetime types and string look OK.
cheers
andrew
--
Andrew Dunstan
EDB:https://www.enterprisedb.com