Re: SQL/JSON: functions
Andrew Dunstan <andrew@dunslane.net>
Attachments
- 0001-Common-SQL-JSON-clauses-v62.patch (text/x-patch) patch v62-0001
- 0002-SQL-JSON-constructors-v62.patch (text/x-patch) patch v62-0002
- 0003-IS-JSON-predicate-v62.patch (text/x-patch) patch v62-0003
- 0004-SQL-JSON-query-functions-v62.patch (text/x-patch) patch v62-0004
- 0005-SQL-JSON-functions-for-json-type-v62.patch (text/x-patch) patch v62-0005
- 0006-GUC-sql_json-v62.patch (text/x-patch) patch v62-0006
On 1/12/22 15:49, Andrew Dunstan wrote:
> On 12/9/21 09:04, Himanshu Upadhyaya wrote:
>>
>>
>> Few comments For 0002-SQL-JSON-constructors-v59.patch:
>> 1)
>> + if (IsA(node, JsonConstructorExpr))
>> + {
>> + JsonConstructorExpr *ctor = (JsonConstructorExpr *) node;
>> + ListCell *lc;
>> + bool is_jsonb =
>> + ctor->returning->format->format ==
>> JS_FORMAT_JSONB;
>> +
>> + /* Check argument_type => json[b] conversions */
>> + foreach(lc, ctor->args)
>> + {
>> + Oid typid =
>> exprType(lfirst(lc));
>> +
>> + if (is_jsonb ?
>> + !to_jsonb_is_immutable(typid) :
>> + !to_json_is_immutable(typid))
>> + return true;
>> + }
>> +
>> + /* Check all subnodes */
>> + }
>> can have ctor as const pointer?
>
> I guess we could, although I'm not sure it's an important advance.
>
>
>> 2)
>> +typedef struct JsonFormat
>> +{
>> + NodeTag type;
>> + JsonFormatType format; /* format type */
>> + JsonEncoding encoding; /* JSON encoding */
>> + int location; /* token
>> location, or -1 if unknown */
>> +} JsonFormat;
>>
>> I think it will be good if we can have a JsonformatType(defined in
>> patch 0001-Common-SQL-JSON-clauses-v59.patch) member named as
>> format_type or formatType instead of format?
>> There are places in the patch where we access it as "if
>> (format->format == JS_FORMAT_DEFAULT)". "format->format" looks little
>> difficult to understand.
>> "format->format_type == JS_FORMAT_DEFAULT" will be easy to follow.
>
> That's a fair criticism.
>
>
>
>> 3)
>> + if (have_jsonb)
>> + {
>> + returning->typid = JSONBOID;
>> + returning->format->format = JS_FORMAT_JSONB;
>> + }
>> + else if (have_json)
>> + {
>> + returning->typid = JSONOID;
>> + returning->format->format = JS_FORMAT_JSON;
>> + }
>> + else
>> + {
>> + /* XXX TEXT is default by the standard, but we
>> return JSON */
>> + returning->typid = JSONOID;
>> + returning->format->format = JS_FORMAT_JSON;
>> + }
>>
>> why we need a separate "else if (have_json)" statement in the below
>> code, "else" is also doing the same thing?
>
>
> I imagine it's more or less a placeholder in case we want to do
> something else in the default case. But I agree it's confusing.
>
>
>> 4)
>> -test: json jsonb json_encoding jsonpath jsonpath_encoding jsonb_jsonpath
>> +test: json jsonb json_encoding jsonpath jsonpath_encoding
>> jsonb_jsonpath sqljson
>>
>> can we rename sqljson sql test file to json_constructor?
>
> Not really - the later patches in the series add to it, so it ends up
> being more than just constructor tests.
>
>
> Thanks for reviewing,
>
>
Here's a patch set with all of these except the last fixed.
There are a couple of things that bother me:
1. This involves a sizeable addition to the grammar, with something over
20 new keywords, including "string" as a TYPE_FUNC_NAME_KEYWORD. I
guess we can't control what the SQL Standards Committee does, so if we
want to implement this we just need to suck it up. But it's annoying
that they are so profligate with grammar symbols.
2. The new GUC "sql_json" is a bit of a worry. I understand what it's
trying to do, but I'm trying to convince myself it's not going to be a
fruitful source of error reports, especially if people switch it in the
middle of a session. Maybe it should be an initdb option instead of a GUC?
cheers
andrew
--
Andrew Dunstan
EDB: https://www.enterprisedb.com
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
JSON_TABLE: Add support for NESTED paths and columns
- bb766cde63b4 17.0 landed
-
Add basic JSON_TABLE() functionality
- de3600452b61 17.0 landed
-
Add SQL/JSON query functions
- 6185c9737cf4 17.0 landed
-
Add soft error handling to some expression nodes
- aaaf9449ec6b 17.0 landed
-
Adjust populate_record_field() to handle errors softly
- 1edb3b491bee 17.0 landed
-
Refactor code used by jsonpath executor to fetch variables
- faa2b953ba3b 17.0 landed
-
Add more SQL/JSON constructor functions
- 03734a7fed7d 17.0 landed
-
SQL/JSON: support the IS JSON predicate
- 6ee30209a6f1 16.0 landed
-
SQL/JSON: add standard JSON constructor functions
- 7081ac46ace8 16.0 landed
-
Improve readability of SQL/JSON documentation.
- b46bcf7a4b6f 15.0 landed
-
Documentation for SQL/JSON features
- a6baa4baddd5 15.0 landed
-
RETURNING clause for JSON() and JSON_SCALAR()
- 49082c2cc3d8 15.0 landed
-
SQL JSON functions
- 606948b058dc 15.0 landed
-
SQL/JSON query functions
- 1a36bc9dba8e 15.0 landed
-
IS JSON predicate
- 33a377608fc2 15.0 landed
-
SQL/JSON constructors
- f4fb45d15c59 15.0 landed
-
Common SQL/JSON clauses
- f79b803dcc98 15.0 landed
- 865fe4d5df56 15.0 landed
-
Doc: remove obsolete entries in table of BRIN strategy numbers.
- 0ce4cd04da55 14.0 cited
-
Doc: standardize markup a bit more.
- 47046763c3ed 13.0 cited
-
Make pg_regress.c unset PGDATABASE during make installcheck.
- 5ee96b3e2221 13.0 cited
-
Fix handling of GENERATED columns in CREATE TABLE LIKE INCLUDING DEFAULTS.
- b81a9c2fc525 13.0 cited