Attached 40th version of the patches.
I have added some documentation which has been simply copied from [1].
Also, I have split patches more correctly, and extracted patch #2 with common
SQL/JSON clauses, that are used by both constructors and query functions.
Patches #3 and #4 are necessary only for constructors (patch #5).
Patches #5 and #6 are almost independent on patch #1, which is needed only for
query functions.
So, patches #5, #6, #7 are independent now, but the code changes in them are
still conflicting. I can rebase #6 and #7 on top of #2, if it is necessary
for separate review/commit.
[1] https://www.postgresql.org/message-id/732208d3-56c3-25a4-8f08-3be1d54ad51b%40postgrespro.ru
I tested cumulative patch - sent in json_table patch.
I almost satisfied by quality of this patch. There is very good conformance with standard and with Oracle. Unfortunately MySQL in this part of JSON support is not compatible.
I found one issue, when I tested some examples from Oracle.
SELECT JSON_VALUE('{a:100}', '$.a' RETURNING int) AS value;
then the result was null.
But it is wrong, because it should to raise a exception, because this json is broken on Postgres (Postgres requires quoted attribute names)
json_query has same problem
postgres=# SELECT JSON_QUERY('{a:100, b:200, c:300}', '$') AS value; ┌───────┐ │ value │ ╞═══════╡ │ ∅ │ └───────┘ (1 row)