Re: SQL/JSON documentation JSON_TABLE

From: Erik Rijkers <er(at)xs4all(dot)nl>
To: Andrew Dunstan <andrew(at)dunslane(dot)net>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: SQL/JSON documentation JSON_TABLE
Date: 2022-07-15 06:20:59
Message-ID: 6b4e3550-8051-77e0-695d-f5144d699e3a@xs4all.nl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 7/14/22 17:45, Andrew Dunstan wrote:
>
> On 2022-07-08 Fr 16:20, Andrew Dunstan wrote:
>> On 2022-07-08 Fr 16:03, Erik Rijkers wrote:
>>> Hi,
>>>
>>> Attached are a few small changes to the JSON_TABLE section in func.sgml.
>>>
>>> The first two changes are simple typos.
>>>
>>> Then there was this line:
>>>
>>> ----
>>> context_item, path_expression [ AS json_path_name ] [ PASSING { value
>>> AS varname } [, ...]]
>>> ----
>>>
>>> those are the parameters to JSON_TABLE() so I changed that line to:
>>>
>>> ----
>>> JSON_TABLE(context_item, path_expression [ AS json_path_name ] [
>>> PASSING { value AS varname } [, ...]])
>>> ----
>>>
>>> Some parts of the JSON_TABLE text strike me as opaque.  For instance,
>>> there are paragraphs that more than once use the term:
>>>    json_api_common_syntax
>>>
>>> 'json_api_common_syntax' is not explained.  It turns out it's a relic
>>> from Nikita's original docs. I dug up a 2018 patch where the term is
>>> used as:
>>>
>>> ---- 2018:
>>> JSON_TABLE (
>>>  json_api_common_syntax [ AS path_name ]
>>>  COLUMNS ( json_table_column [, ...] )
>>>      (etc...)
>>> ----
>>>
>>> with explanation:
>>>
>>> ---- 2018:
>>> json_api_common_syntax:
>>>    The input data to query, the JSON path expression defining the
>>> query, and an optional PASSING clause.
>>> ----
>>>
>>> So that made sense then (input+jsonpath+params=api), but it doesn't
>>> now fit as such in the current docs.
>>>
>>> I think it would be best to remove all uses of that compound term, and
>>> rewrite the explanations using only the current parameter names
>>> (context_item, path_expression, etc).
>>
>> Thanks for this. If you want to follow up that last sentence I will try
>> to commit a single fix early next week.
>
> Here's a patch that deals with most of this. There's one change you
> wanted that I don't think is correct, which I omitted.
>
> [json-docs-fix.patch]

Thanks, much better. I also agree that the change I proposed (and you
omitted) wasn't great (although it leaves the paragraph somewhat
orphaned - but maybe it isn't too bad.).

I've now compared our present document not only with the original doc as
produced by Nikita Glukhov et al in 2018, but also with the ISO draft
from 2017 (ISO/IEC TR 19075-6 (JSON) for JavaScript Object).

I think we can learn a few things from that ISO draft's JSON_TABLE text.
Let me copy-paste its first explicatory paragraph on JSON_TABLE:

-------------- [ ISO SQL/JSON draft 2017 ] ---------
Like the other JSON querying operators, JSON_TABLE begins with <JSON API
common syntax> to specify the context item, path expression and PASSING
clause. The path expression in this case is more accurately called the
row pattern path expression. This path expression is intended to produce
an SQL/JSON sequence, with one SQL/JSON item for each row of the output
table.

The COLUMNS clause can define two kinds of columns: ordinality columns
and regular columns.

An ordinality column provides a sequential numbering of rows. Row
numbering is 1-based.

A regular column supports columns of scalar type. The column is produced
using the semantics of JSON_VALUE. The column has an optional path
expression, called the column pattern, which can be defaulted from the
column name. The column pattern is used to search for the column within
the current SQL/JSON item produced by the row pattern. The column also
has optional ON EMPTY and ON ERROR clauses, with the same choices and
semantics as JSON_VALUE.
--------------

So, where the ISO draft introduces the term 'row pattern' it /also/
introduces the term 'column pattern' close by, in the next paragraph.

I think our docs too should have both terms. The presence of both 'row
pattern' and 'column pattern' immediately makes their meanings obvious.
At the moment our docs only use the term 'row pattern', for all the
JSON_TABLE json path expressions (also those in the COLUMN clause, it
seems).

At the moment, we say, in the JSON_TABLE doc:
----
To split the row pattern into columns, json_table provides the COLUMNS
clause that defines the schema of the created view.
----

I think that to use 'row pattern' here is just wrong, or at least
confusing. The 'row pattern' is /not/ the data as produced from the
json expression; the 'row pattern' /is/ the json path expression. (ISO
draft: 'The path expression in this case is more accurately called the
row pattern path expression.' )

If you agree with my reasoning I can try to rewrite these bits in our
docs accordingly.

Erik Rijkers

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message shiy.fnst@fujitsu.com 2022-07-15 06:32:10 RE: [BUG] Logical replication failure "ERROR: could not map filenode "base/13237/442428" to relation OID" with catalog modifying txns
Previous Message houzj.fnst@fujitsu.com 2022-07-15 06:08:54 RE: Collect ObjectAddress for ATTACH DETACH PARTITION to use in event trigger