Re: SQL:2023 JSON simplified accessor support - Mailing list pgsql-hackers
From | jian he |
---|---|
Subject | Re: SQL:2023 JSON simplified accessor support |
Date | |
Msg-id | CACJufxHqiKbh1RN4-rquYdnS8qK9kEQq=bpt6ED_yo1+OkU8jg@mail.gmail.com Whole thread Raw |
In response to | Re: SQL:2023 JSON simplified accessor support (Alexandra Wang <alexandra.wang.oss@gmail.com>) |
Responses |
Re: SQL:2023 JSON simplified accessor support
|
List | pgsql-hackers |
On Wed, Jul 9, 2025 at 4:02 PM Alexandra Wang <alexandra.wang.oss@gmail.com> wrote: > > Thanks again for the patch! It was really helpful! I didn't directly > apply it as I made a few different choices, but I think I have > addressed all the points you covered in it. > > Let me know your thoughts! > hi. in v12-0001 and v12-0002. in transformIndirection if (!newresult) { /* * generic subscripting failed; falling back to function call or * field selection for a composite type. */ Node *n; /* try to find function for field selection */ newresult = ParseFuncOrColumn(pstate, list_make1(n), list_make1(result), last_srf, NULL, false, location); } the above comments mentioning "function call" is wrong? you passed NULL for (FuncCall *fn) in ParseFuncOrColumn. and ParseFuncOrColumn comments says ```If fn is null, we're dealing with column syntax not function syntax.`` I think coerce_jsonpath_subscript can be further simplified. we already have message like: errhint("jsonb subscript must be coercible to either integer or text."), no need to pass the third argument a constant (INT4OID). also ``Oid targetType = UNKNOWNOID;`` set it as InvalidOid would be better. attached is a minor refactoring of coerce_jsonpath_subscript based on (v12-0001 to v12-0004). after applied v12-0001 to v12-0006 + /* emit warning conditionally to minimize duplicate warnings */ + if (list_length(*indirection) > 0) + ereport(WARNING, + errcode(ERRCODE_WARNING), + errmsg("mixed usage of jsonb simplified accessor syntax and jsonb subscripting."), + errhint("use dot-notation for member access, or use non-null integer constants subscripting for array access."), + parser_errposition(pstate, warning_location)); src7=# select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb).d['1'::int8]; WARNING: mixed usage of jsonb simplified accessor syntax and jsonb subscripting. LINE 1: ...t ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb).d['1'::int8]... ^ HINT: use dot-notation for member access, or use non-null integer constants subscripting for array access. ERROR: subscript type bigint is not supported LINE 1: ...t ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb).d['1'::int8]... ^ HINT: jsonb subscript must be coercible to either integer or text. The above example looks very bad. location printed twice, hint message is different. two messages level (ERROR, WARNING). also "or use non-null integer constants subscripting for array access." seems wrong? as you can see the below hint message saying it could be text or integer. select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['1'::int8]; ERROR: subscript type bigint is not supported LINE 1: ...ect ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)['1'::int8]... ^ HINT: jsonb subscript must be coercible to either integer or text. also select ('{"a": 1, "b": "c", "d": [1, 2, 3]}'::jsonb)[NULL::int4]; return NULL, so "use non-null integer constants" is wrong.
Attachment
pgsql-hackers by date: