Re: remaining sql/json patches

From: Amit Langote <amitlangote09(at)gmail(dot)com>
To: jian he <jian(dot)universality(at)gmail(dot)com>
Cc: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Tomas Vondra <tomas(dot)vondra(at)enterprisedb(dot)com>, Himanshu Upadhyaya <upadhyaya(dot)himanshu(at)gmail(dot)com>, Erik Rijkers <er(at)xs4all(dot)nl>, Andres Freund <andres(at)anarazel(dot)de>, Andrew Dunstan <andrew(at)dunslane(dot)net>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: remaining sql/json patches
Date: 2024-04-04 12:02:48
Message-ID: CA+HiwqGGF2K9EDfN+Zw-=dzPFRk0PTVdMw1n4joXNhhWJVcitA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Apr 3, 2024 at 11:48 PM jian he <jian(dot)universality(at)gmail(dot)com> wrote:
> hi.
> + <para>
> + <function>json_table</function> is an SQL/JSON function which
> + queries <acronym>JSON</acronym> data
> + and presents the results as a relational view, which can be accessed as a
> + regular SQL table. You can only use
> <function>json_table</function> inside the
> + <literal>FROM</literal> clause of a <literal>SELECT</literal>,
> + <literal>UPDATE</literal>, <literal>DELETE</literal>, or
> <literal>MERGE</literal>
> + statement.
> + </para>
>
> the only issue is that <literal>MERGE</literal> Synopsis don't have
> <literal>FROM</literal> clause.
> other than that, it's quite correct.
> see following tests demo:
>
> drop table ss;
> create table ss(a int);
> insert into ss select 1;
> delete from ss using JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH '$'
> ) ERROR ON ERROR) jt where jt.a = 1;
> insert into ss select 2;
> update ss set a = 1 from JSON_TABLE(jsonb '2', '$' COLUMNS (a int PATH
> '$')) jt where jt.a = 2;
> DROP TABLE IF EXISTS target;
> CREATE TABLE target (tid integer, balance integer) WITH
> (autovacuum_enabled=off);
> INSERT INTO target VALUES (1, 10),(2, 20),(3, 30);
> MERGE INTO target USING JSON_TABLE(jsonb '2', '$' COLUMNS (a int PATH
> '$' ) ERROR ON ERROR) source(sid)
> ON target.tid = source.sid
> WHEN MATCHED THEN UPDATE SET balance = 0
> returning *;
> --------------------------------------------------------------------------------------------------
>
> + <para>
> + To split the row pattern into columns, <function>json_table</function>
> + provides the <literal>COLUMNS</literal> clause that defines the
> + schema of the created view. For each column, a separate path expression
> + can be specified to be evaluated against the row pattern to get a
> + SQL/JSON value that will become the value for the specified column in
> + a given output row.
> + </para>
> should be "an SQL/JSON".
>
> + <para>
> + Inserts a SQL/JSON value obtained by applying
> + <replaceable>path_expression</replaceable> against the row pattern into
> + the view's output row after coercing it to specified
> + <replaceable>type</replaceable>.
> + </para>
> should be "an SQL/JSON".
>
> "coercing it to specified <replaceable>type</replaceable>"
> should be
> "coercing it to the specified <replaceable>type</replaceable>"?
> ---------------------------------------------------------------------------------------------------------------
> + <para>
> + The value corresponds to whether evaluating the <literal>PATH</literal>
> + expression yields any SQL/JSON values.
> + </para>
> maybe we can change to
> + <para>
> + The value corresponds to whether applying the
> <replaceable>path_expression</replaceable>
> + expression yields any SQL/JSON values.
> + </para>
> so it looks more consistent with the preceding paragraph.
>
> + <para>
> + Optionally, <literal>ON ERROR</literal> can be used to specify whether
> + to throw an error or return the specified value to handle structural
> + errors, respectively. The default is to return a boolean value
> + <literal>FALSE</literal>.
> + </para>
> we don't need "respectively" here?
>
> + if (jt->on_error &&
> + jt->on_error->btype != JSON_BEHAVIOR_ERROR &&
> + jt->on_error->btype != JSON_BEHAVIOR_EMPTY &&
> + jt->on_error->btype != JSON_BEHAVIOR_EMPTY_ARRAY)
> + ereport(ERROR,
> + errcode(ERRCODE_SYNTAX_ERROR),
> + errmsg("invalid ON ERROR behavior"),
> + errdetail("Only EMPTY or ERROR is allowed for ON ERROR in JSON_TABLE()."),
> + parser_errposition(pstate, jt->on_error->location));
>
> errdetail("Only EMPTY or ERROR is allowed for ON ERROR in JSON_TABLE()."),
> maybe change to something like:
> `
> errdetail("Only EMPTY or ERROR is allowed for ON ERROR in the
> top-level JSON_TABLE() ").
> `
> i guess mentioning "top-level" is fine.
> since "top-level", we have 19 appearances in functions-json.html.

Thanks for checking.

Pushed after fixing these and a few other issues. I didn't include
the testing function you proposed in your other email. It sounds
useful for testing locally but will need some work before we can
include it in the tree.

I'll post the rebased 0002 tomorrow after addressing your comments.

--
Thanks, Amit Langote

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Peter Eisentraut 2024-04-04 12:05:27 Re: Built-in CTYPE provider
Previous Message shveta malik 2024-04-04 12:01:45 Re: Synchronizing slots from primary to standby