some more minor issues: SELECT * FROM JSON_TABLE(jsonb '{"a":[123,2]}', '$' COLUMNS (item int[] PATH '$.a' error on error, foo text path '$' error on error)) bar; ERROR: JSON path expression in JSON_VALUE should return singleton scalar item
the error message seems not so great, imho. since the JSON_TABLE doc entries didn't mention that JSON_TABLE actually transformed to json_value, json_query, json_exists. JSON_VALUE even though cannot specify KEEP | OMIT QUOTES. It might be a good idea to mention the default is to omit quotes in the doc. because JSON_TABLE actually transformed to json_value, json_query, json_exists. JSON_TABLE can specify quotes behavior freely. bother again, i kind of get what the function transformJsonTableChildPlan do, but adding more comments would make it easier to understand.... (json_query) + This function must return a JSON string, so if the path expression + returns multiple SQL/JSON items, you must wrap the result using the + <literal>WITH WRAPPER</literal> clause. If the wrapper is + <literal>UNCONDITIONAL</literal>, an array wrapper will always + be applied, even if the returned value is already a single JSON object + or an array, but if it is <literal>CONDITIONAL</literal>, it will not be + applied to a single array or object. <literal>UNCONDITIONAL</literal> + is the default. If the result is a scalar string, by default the value + returned will have surrounding quotes making it a valid JSON value, + which can be made explicit by specifying <literal>KEEP QUOTES</literal>. + Conversely, quotes can be omitted by specifying <literal>OMIT QUOTES</literal>. + The returned <replaceable>data_type</replaceable> has the same semantics + as for constructor functions like <function>json_objectagg</function>; + the default returned type is <type>jsonb</type>. + <para> + Returns the result of applying the + <replaceable>path_expression</replaceable> to the + <replaceable>context_item</replaceable> using the + <literal>PASSING</literal> <replaceable>value</replaceable>s. The + extracted value must be a single <acronym>SQL/JSON</acronym> scalar + item. For results that are objects or arrays, use the + <function>json_query</function> function instead. + The returned <replaceable>data_type</replaceable> has the same semantics + as for constructor functions like <function>json_objectagg</function>. + The default returned type is <type>text</type>. + The <literal>ON ERROR</literal> and <literal>ON EMPTY</literal> + clauses have similar semantics as mentioned in the description of + <function>json_query</function>. + </para> + The returned <replaceable>data_type</replaceable> has the same semantics + as for constructor functions like <function>json_objectagg</function>. IMHO, the above description is not so good, since the function json_objectagg is listed in functions-aggregate.html, using Ctrl + F in the browser cannot find json_objectagg in functions-json.html. for json_query, maybe we can rephrase like: the RETURNING clause, which specifies the data type returned. It must be a type for which there is a cast from text to that type. By default, the <type>jsonb</type> type is returned. json_value: the RETURNING clause, which specifies the data type returned. It must be a type for which there is a cast from text to that type. By default, the <type>text</type> type is returned.