1
0
mirror of https://github.com/postgres/postgres.git synced 2026-10-23 13:29:09 +03:00
Files
postgres/contrib/pg_stat_statements/expected/sqljson.out
Michael Paquier 1910daf983 Fix handling of some SQL/JSON locations in query jumbling
GetJsonBehaviorConst() builds Const values for clauses like ON EMPTY or
ON ERROR in SQL/JSON, and was setting up a location without considering
the fact that these are not constants as per the query text: they are
query keywords.  For example "EMPTY ARRAY ON EMPTY" became "$2 ARRAY ON
EMPTY", leading to confusing information reported for example in PGSS.

The Const nodes used by GetJsonBehaviorConst() is now left unset.  The
location was only used for an error position.  This code path cannot be
reached currently but we cannot use the expression location if not set;
this spot is switched to the location of behavior keyword instead, which
is better than nothing.

This is obviously a bug.  Unfortunately, no backpatch is done as this
impacts the information of saved in PGSS and the shape of the Nodes
themselves.

Oversight in 6185c9737c.

Author: Ilya Staroverov <i.staroverov@ftdata.ru>
Reviewed-by: Sami Imseih <samimseih.pg@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/457969A9-5D24-422F-B09E-F388053DE028@localhost.localdomain
2026-10-23 16:21:54 +09:00

1370 lines
39 KiB
Plaintext

--
-- SQL/JSON
--
SET pg_stat_statements.track_utility = FALSE;
CREATE TABLE pgss_sqljson_tab (js jsonb, t text, b bytea);
--
-- SQL/JSON query functions
--
-- JSON_VALUE ON EMPTY and ON ERROR behaviors
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT JSON_VALUE(js, '$.a') FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
-- NULL ON EMPTY and NULL ON ERROR are the defaults
SELECT JSON_VALUE(js, '$.a' NULL ON EMPTY) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' NULL ON EMPTY NULL ON ERROR) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' ERROR ON EMPTY NULL ON ERROR) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' ERROR ON EMPTY) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' NULL ON EMPTY ERROR ON ERROR) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' ERROR ON ERROR) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' DEFAULT 1 ON EMPTY) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' DEFAULT 2 ON EMPTY) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' DEFAULT 1 ON ERROR) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+-----------------------------------------------------------------------------------------
1 | SELECT JSON_VALUE(js, $1 DEFAULT $2 ON EMPTY DEFAULT $3 ON ERROR) FROM pgss_sqljson_tab
2 | SELECT JSON_VALUE(js, $1 DEFAULT $2 ON EMPTY) FROM pgss_sqljson_tab
1 | SELECT JSON_VALUE(js, $1 DEFAULT $2 ON ERROR) FROM pgss_sqljson_tab
2 | SELECT JSON_VALUE(js, $1 ERROR ON EMPTY NULL ON ERROR) FROM pgss_sqljson_tab
2 | SELECT JSON_VALUE(js, $1 NULL ON EMPTY ERROR ON ERROR) FROM pgss_sqljson_tab
3 | SELECT JSON_VALUE(js, $1) FROM pgss_sqljson_tab
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(7 rows)
-- JSON_VALUE RETURNING and PASSING
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT JSON_VALUE(js, '$.a') FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
-- text is the default RETURNING type
SELECT JSON_VALUE(js, '$.a' RETURNING text) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' RETURNING int) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' RETURNING varchar(3)) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a' RETURNING varchar(4)) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a ? (@ > $x)' PASSING 1 AS x) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a ? (@ > $x)' PASSING 2 AS x) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a ? (@ > $y)' PASSING 1 AS y) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT JSON_VALUE(js, '$.a ? (@ > $x && @ < $y)'
PASSING 1 AS x, 2 AS y) FROM pgss_sqljson_tab;
json_value
------------
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+----------------------------------------------------------------------
1 | SELECT JSON_VALUE(js, $1 +
| PASSING $2 AS x, $3 AS y) FROM pgss_sqljson_tab
2 | SELECT JSON_VALUE(js, $1 PASSING $2 AS x) FROM pgss_sqljson_tab
1 | SELECT JSON_VALUE(js, $1 PASSING $2 AS y) FROM pgss_sqljson_tab
1 | SELECT JSON_VALUE(js, $1 RETURNING int) FROM pgss_sqljson_tab
1 | SELECT JSON_VALUE(js, $1 RETURNING varchar(3)) FROM pgss_sqljson_tab
1 | SELECT JSON_VALUE(js, $1 RETURNING varchar(4)) FROM pgss_sqljson_tab
2 | SELECT JSON_VALUE(js, $1) FROM pgss_sqljson_tab
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(8 rows)
-- JSON_QUERY ON EMPTY and ON ERROR behaviors
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT JSON_QUERY(js, '$.a' EMPTY ARRAY ON EMPTY) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' EMPTY OBJECT ON EMPTY) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
-- EMPTY is a non-standard spelling of EMPTY ARRAY
SELECT JSON_QUERY(js, '$.a' EMPTY ON EMPTY) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' NULL ON EMPTY) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' ERROR ON EMPTY) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' DEFAULT '[]' ON EMPTY) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' EMPTY ON ERROR) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' EMPTY ARRAY ON ERROR) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' EMPTY OBJECT ON ERROR) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' ERROR ON ERROR) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' DEFAULT '[]' ON ERROR) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' EMPTY ARRAY ON EMPTY EMPTY OBJECT ON ERROR)
FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+-----------------------------------------------------------------------
1 | SELECT JSON_QUERY(js, $1 DEFAULT $2 ON EMPTY) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 DEFAULT $2 ON ERROR) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 EMPTY ARRAY ON EMPTY EMPTY OBJECT ON ERROR) +
| FROM pgss_sqljson_tab
2 | SELECT JSON_QUERY(js, $1 EMPTY ARRAY ON EMPTY) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 EMPTY OBJECT ON EMPTY) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 EMPTY OBJECT ON ERROR) FROM pgss_sqljson_tab
2 | SELECT JSON_QUERY(js, $1 EMPTY ON ERROR) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 ERROR ON EMPTY) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 ERROR ON ERROR) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 NULL ON EMPTY) FROM pgss_sqljson_tab
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(11 rows)
-- JSON_QUERY WRAPPER, QUOTES, RETURNING, FORMAT JSON and PASSING
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT JSON_QUERY(js, '$.a') FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' WITHOUT WRAPPER) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' WITHOUT ARRAY WRAPPER) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' WITH WRAPPER) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' WITH ARRAY WRAPPER) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' WITH UNCONDITIONAL WRAPPER) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' WITH UNCONDITIONAL ARRAY WRAPPER) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' WITH CONDITIONAL WRAPPER) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' WITH CONDITIONAL ARRAY WRAPPER) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
-- KEEP QUOTES is the default
SELECT JSON_QUERY(js, '$.a' KEEP QUOTES) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' KEEP QUOTES ON SCALAR STRING) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' OMIT QUOTES) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' OMIT QUOTES ON SCALAR STRING) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' RETURNING jsonb) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' RETURNING json) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a' RETURNING text) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
-- FORMAT JSON in RETURNING is implied for JSON_QUERY
SELECT JSON_QUERY(js, '$.a' RETURNING text FORMAT JSON) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(t, '$.a') FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(t FORMAT JSON, '$.a') FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(b FORMAT JSON, '$.a') FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(b FORMAT JSON ENCODING UTF8, '$.a') FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(b FORMAT JSON ENCODING UTF16, '$.a') FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(b FORMAT JSON ENCODING UTF32, '$.a') FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT JSON_QUERY(js, '$.a ? (@ > $x)' PASSING 1 AS x) FROM pgss_sqljson_tab;
json_query
------------
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+---------------------------------------------------------------------------
1 | SELECT JSON_QUERY(b FORMAT JSON ENCODING UTF16, $1) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(b FORMAT JSON ENCODING UTF32, $1) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(b FORMAT JSON ENCODING UTF8, $1) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(b FORMAT JSON, $1) FROM pgss_sqljson_tab
2 | SELECT JSON_QUERY(js, $1 OMIT QUOTES) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 PASSING $2 AS x) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 RETURNING json) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(js, $1 RETURNING jsonb) FROM pgss_sqljson_tab
2 | SELECT JSON_QUERY(js, $1 RETURNING text) FROM pgss_sqljson_tab
2 | SELECT JSON_QUERY(js, $1 WITH CONDITIONAL WRAPPER) FROM pgss_sqljson_tab
4 | SELECT JSON_QUERY(js, $1 WITH WRAPPER) FROM pgss_sqljson_tab
2 | SELECT JSON_QUERY(js, $1 WITHOUT WRAPPER) FROM pgss_sqljson_tab
3 | SELECT JSON_QUERY(js, $1) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(t FORMAT JSON, $1) FROM pgss_sqljson_tab
1 | SELECT JSON_QUERY(t, $1) FROM pgss_sqljson_tab
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(16 rows)
-- JSON_EXISTS ON ERROR behaviors and PASSING
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT JSON_EXISTS(js, 'strict $.a' FALSE ON ERROR) FROM pgss_sqljson_tab;
json_exists
-------------
(0 rows)
-- FALSE ON ERROR is the default
SELECT JSON_EXISTS(js, 'strict $.a') FROM pgss_sqljson_tab;
json_exists
-------------
(0 rows)
SELECT JSON_EXISTS(js, 'strict $.a' TRUE ON ERROR) FROM pgss_sqljson_tab;
json_exists
-------------
(0 rows)
SELECT JSON_EXISTS(js, 'strict $.a' UNKNOWN ON ERROR) FROM pgss_sqljson_tab;
json_exists
-------------
(0 rows)
SELECT JSON_EXISTS(js, 'strict $.a' ERROR ON ERROR) FROM pgss_sqljson_tab;
json_exists
-------------
(0 rows)
SELECT JSON_EXISTS(js, '$.a ? (@ > $x)' PASSING 1 AS x) FROM pgss_sqljson_tab;
json_exists
-------------
(0 rows)
SELECT JSON_EXISTS(js, '$.a ? (@ > $x)' PASSING 2 AS x) FROM pgss_sqljson_tab;
json_exists
-------------
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+-------------------------------------------------------------------
1 | SELECT JSON_EXISTS(js, $1 ERROR ON ERROR) FROM pgss_sqljson_tab
2 | SELECT JSON_EXISTS(js, $1 FALSE ON ERROR) FROM pgss_sqljson_tab
2 | SELECT JSON_EXISTS(js, $1 PASSING $2 AS x) FROM pgss_sqljson_tab
1 | SELECT JSON_EXISTS(js, $1 TRUE ON ERROR) FROM pgss_sqljson_tab
1 | SELECT JSON_EXISTS(js, $1 UNKNOWN ON ERROR) FROM pgss_sqljson_tab
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(6 rows)
--
-- JSON_TABLE
--
-- regular columns: types, ON EMPTY and ON ERROR behaviors
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a text PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a varchar(3) PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a varchar(4) PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a' ERROR ON EMPTY)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a' DEFAULT 1 ON EMPTY)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a' DEFAULT 2 ON EMPTY)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a' ERROR ON ERROR)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a' DEFAULT 1 ON ERROR)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a'
DEFAULT 1 ON EMPTY ERROR ON ERROR)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+----------------------------------------------------
10 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 COLUMNS (a int PATH '$.a')) jt
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(2 rows)
-- EXISTS, FORMAT JSON and FOR ORDINALITY columns
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int EXISTS PATH '$.a' FALSE ON ERROR)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int EXISTS PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int EXISTS PATH '$.a' TRUE ON ERROR)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int EXISTS PATH '$.a' UNKNOWN ON ERROR)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int EXISTS PATH '$.a' ERROR ON ERROR)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a jsonb PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a jsonb FORMAT JSON PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a jsonb FORMAT JSON PATH '$.a' WITH WRAPPER)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a text FORMAT JSON PATH '$.a' OMIT QUOTES)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a jsonb FORMAT JSON PATH '$.a'
EMPTY ARRAY ON EMPTY)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a jsonb FORMAT JSON PATH '$.a'
EMPTY OBJECT ON EMPTY)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a jsonb FORMAT JSON PATH '$.a'
EMPTY ARRAY ON EMPTY EMPTY OBJECT ON ERROR)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a FOR ORDINALITY)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+--------------------------------------------------------------------------
13 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 COLUMNS (a int EXISTS PATH '$.a' FALSE ON ERROR)) jt
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(2 rows)
-- column names and paths
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
-- only the column name and the path differ
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (b int PATH '$.b')) jt;
js | t | b | b
----+---+---+---
(0 rows)
-- without PATH, the path is derived from the column name
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (b int)) jt;
js | t | b | b
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a', b int PATH '$.b')) jt;
js | t | b | a | b
----+---+---+---+---
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+----------------------------------------------------------------------
4 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 COLUMNS (a int PATH '$.a')) jt
1 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 COLUMNS (a int PATH '$.a', b int PATH '$.b')) jt
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(3 rows)
-- NESTED PATH
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a', b int PATH '$.b')) jt;
js | t | b | a | b
----+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' COLUMNS (b int PATH '$'))) jt;
js | t | b | a | b
----+---+---+---+---
(0 rows)
-- only the paths and the path name differ
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a',
NESTED PATH '$.c[*]' AS p1 COLUMNS (b int PATH '$'))) jt;
js | t | b | a | b
----+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' COLUMNS (c int PATH '$'))) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' COLUMNS (b int PATH '$',
NESTED PATH '$.c[*]' COLUMNS (c int PATH '$')))) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
-- PATH is optional after NESTED
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a',
NESTED '$.b[*]' COLUMNS (b int PATH '$'))) jt;
js | t | b | a | b
----+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a',
NESTED '$.b[*]' AS p1 COLUMNS (b int PATH '$'))) jt;
js | t | b | a | b
----+---+---+---+---
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+----------------------------------------------------------------------
2 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 COLUMNS (a int PATH '$.a', +
| NESTED PATH '$.b[*]' COLUMNS (b int PATH '$'), +
| NESTED PATH '$.c[*]' COLUMNS (c int PATH '$'))) jt
5 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 COLUMNS (a int PATH '$.a', b int PATH '$.b')) jt
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(3 rows)
-- PLAN without NESTED PATH, which is the same as no PLAN
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a') PLAN (p0)) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+--------------------------------------------------------------------
2 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 AS p0 COLUMNS (a int PATH '$.a') PLAN (p0)) jt
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(2 rows)
-- PLAN with one NESTED PATH
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'))) jt;
js | t | b | a | b
----+---+---+---+---
(0 rows)
-- PLAN (p0 OUTER p1) is the default plan
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'))
PLAN (p0 OUTER p1)) jt;
js | t | b | a | b
----+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'))
PLAN (p0 INNER p1)) jt;
js | t | b | a | b
----+---+---+---+---
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+--------------------------------------------------------------
3 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 AS p0 COLUMNS (a int PATH '$.a', +
| NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'))) jt
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(2 rows)
-- PLAN with sibling NESTED PATH
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'))) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
-- PLAN (p0 OUTER (p1 UNION p2)) is the default plan
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'))
PLAN (p0 OUTER (p1 UNION p2))) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'))
PLAN (p0 INNER (p1 UNION p2))) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'))
PLAN (p0 OUTER (p1 CROSS p2))) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'))
PLAN DEFAULT (INNER, CROSS)) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'))
PLAN DEFAULT (INNER)) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'))
PLAN DEFAULT (CROSS)) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'))
PLAN DEFAULT (UNION, INNER)) jt;
js | t | b | a | b | c
----+---+---+---+---+---
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+--------------------------------------------------------------
8 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 AS p0 COLUMNS (a int PATH '$.a', +
| NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'), +
| NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'))) jt
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(2 rows)
-- PLAN with chained UNION and CROSS
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'),
NESTED PATH '$.d[*]' AS p3 COLUMNS (d int PATH '$'))) jt;
js | t | b | a | b | c | d
----+---+---+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'),
NESTED PATH '$.d[*]' AS p3 COLUMNS (d int PATH '$'))
PLAN (p0 OUTER (p1 UNION p2 UNION p3))) jt;
js | t | b | a | b | c | d
----+---+---+---+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' AS p0 COLUMNS (a int PATH '$.a',
NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'),
NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'),
NESTED PATH '$.d[*]' AS p3 COLUMNS (d int PATH '$'))
PLAN (p0 OUTER (p1 CROSS p2 CROSS p3))) jt;
js | t | b | a | b | c | d
----+---+---+---+---+---+---
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+--------------------------------------------------------------
3 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 AS p0 COLUMNS (a int PATH '$.a', +
| NESTED PATH '$.b[*]' AS p1 COLUMNS (b int PATH '$'), +
| NESTED PATH '$.c[*]' AS p2 COLUMNS (c int PATH '$'), +
| NESTED PATH '$.d[*]' AS p3 COLUMNS (d int PATH '$'))) jt
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(2 rows)
-- table-level ON ERROR and PASSING
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
-- EMPTY is a non-standard spelling of EMPTY ARRAY
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a') EMPTY ON ERROR) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a') EMPTY ARRAY ON ERROR) jt;
js | t | b | a
----+---+---+---
(0 rows)
-- EMPTY ARRAY ON ERROR is the default
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*]' COLUMNS (a int PATH '$.a') ERROR ON ERROR) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*] ? (@.a > $x)' PASSING 1 AS x
COLUMNS (a int PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*] ? (@.a > $x)' PASSING 2 AS x
COLUMNS (a int PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT * FROM pgss_sqljson_tab,
JSON_TABLE(js, '$[*] ? (@.a > $y)' PASSING 1 AS y
COLUMNS (a int PATH '$.a')) jt;
js | t | b | a
----+---+---+---
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+-------------------------------------------------------------------
3 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 COLUMNS (a int PATH '$.a') EMPTY ON ERROR) jt
1 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 COLUMNS (a int PATH '$.a') ERROR ON ERROR) jt
2 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 PASSING $2 AS x +
| COLUMNS (a int PATH '$.a')) jt
1 | SELECT * FROM pgss_sqljson_tab, +
| JSON_TABLE(js, $1 PASSING $2 AS y +
| COLUMNS (a int PATH '$.a')) jt
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(5 rows)
--
-- SQL/JSON constructors and predicates
--
-- JSON_OBJECT and JSON_ARRAY
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT JSON_OBJECT('a' VALUE t) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('b' VALUE t) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a': t) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a' VALUE t, 'b' VALUE t) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a' VALUE t NULL ON NULL) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a' VALUE t ABSENT ON NULL) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a' VALUE t WITH UNIQUE KEYS) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a' VALUE t WITH UNIQUE) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a' VALUE t WITHOUT UNIQUE KEYS) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a' VALUE t WITHOUT UNIQUE) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a' VALUE t RETURNING jsonb) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT('a' VALUE t FORMAT JSON) FROM pgss_sqljson_tab;
json_object
-------------
(0 rows)
SELECT JSON_OBJECT();
json_object
-------------
{}
(1 row)
SELECT JSON_ARRAY(t) FROM pgss_sqljson_tab;
json_array
------------
(0 rows)
SELECT JSON_ARRAY(t, t) FROM pgss_sqljson_tab;
json_array
------------
(0 rows)
SELECT JSON_ARRAY(t ABSENT ON NULL) FROM pgss_sqljson_tab;
json_array
------------
(0 rows)
SELECT JSON_ARRAY(t NULL ON NULL) FROM pgss_sqljson_tab;
json_array
------------
(0 rows)
SELECT JSON_ARRAY(t RETURNING jsonb) FROM pgss_sqljson_tab;
json_array
------------
(0 rows)
SELECT JSON_ARRAY(t FORMAT JSON) FROM pgss_sqljson_tab;
json_array
------------
(0 rows)
SELECT JSON_ARRAY();
json_array
------------
[]
(1 row)
SELECT JSON_ARRAY(SELECT t FROM pgss_sqljson_tab);
json_array
------------
[]
(1 row)
SELECT JSON_ARRAY(SELECT t FROM pgss_sqljson_tab FORMAT JSON);
json_array
------------
[]
(1 row)
SELECT JSON_ARRAY(SELECT t FROM pgss_sqljson_tab RETURNING jsonb);
json_array
------------
[]
(1 row)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+-----------------------------------------------------------------------
1 | SELECT JSON_ARRAY()
1 | SELECT JSON_ARRAY(SELECT t FROM pgss_sqljson_tab FORMAT JSON)
1 | SELECT JSON_ARRAY(SELECT t FROM pgss_sqljson_tab RETURNING jsonb)
1 | SELECT JSON_ARRAY(SELECT t FROM pgss_sqljson_tab)
1 | SELECT JSON_ARRAY(t FORMAT JSON) FROM pgss_sqljson_tab
1 | SELECT JSON_ARRAY(t NULL ON NULL) FROM pgss_sqljson_tab
1 | SELECT JSON_ARRAY(t RETURNING jsonb) FROM pgss_sqljson_tab
2 | SELECT JSON_ARRAY(t) FROM pgss_sqljson_tab
1 | SELECT JSON_ARRAY(t, t) FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECT($1 VALUE t ABSENT ON NULL) FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECT($1 VALUE t FORMAT JSON) FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECT($1 VALUE t RETURNING jsonb) FROM pgss_sqljson_tab
2 | SELECT JSON_OBJECT($1 VALUE t WITH UNIQUE KEYS) FROM pgss_sqljson_tab
6 | SELECT JSON_OBJECT($1 VALUE t) FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECT($1 VALUE t, $2 VALUE t) FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECT()
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(17 rows)
-- JSON_OBJECTAGG and JSON_ARRAYAGG
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT JSON_OBJECTAGG(t VALUE t) FROM pgss_sqljson_tab;
json_objectagg
----------------
(1 row)
SELECT JSON_OBJECTAGG(t VALUE t ABSENT ON NULL) FROM pgss_sqljson_tab;
json_objectagg
----------------
(1 row)
SELECT JSON_OBJECTAGG(t VALUE t WITH UNIQUE KEYS) FROM pgss_sqljson_tab;
json_objectagg
----------------
(1 row)
SELECT JSON_OBJECTAGG(t VALUE t RETURNING jsonb) FROM pgss_sqljson_tab;
json_objectagg
----------------
(1 row)
SELECT JSON_OBJECTAGG(t VALUE t) FILTER (WHERE t IS NOT NULL)
FROM pgss_sqljson_tab;
json_objectagg
----------------
(1 row)
SELECT JSON_OBJECTAGG(t VALUE t) OVER () FROM pgss_sqljson_tab;
json_objectagg
----------------
(0 rows)
SELECT JSON_ARRAYAGG(t) FROM pgss_sqljson_tab;
json_arrayagg
---------------
(1 row)
SELECT JSON_ARRAYAGG(t NULL ON NULL) FROM pgss_sqljson_tab;
json_arrayagg
---------------
(1 row)
SELECT JSON_ARRAYAGG(t ORDER BY js) FROM pgss_sqljson_tab;
json_arrayagg
---------------
(1 row)
SELECT JSON_ARRAYAGG(t ORDER BY js DESC) FROM pgss_sqljson_tab;
json_arrayagg
---------------
(1 row)
SELECT JSON_ARRAYAGG(t RETURNING jsonb) FROM pgss_sqljson_tab;
json_arrayagg
---------------
(1 row)
SELECT JSON_ARRAYAGG(t) FILTER (WHERE t IS NOT NULL) FROM pgss_sqljson_tab;
json_arrayagg
---------------
(1 row)
SELECT JSON_ARRAYAGG(t) OVER () FROM pgss_sqljson_tab;
json_arrayagg
---------------
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+----------------------------------------------------------------------------
1 | SELECT JSON_ARRAYAGG(t NULL ON NULL) FROM pgss_sqljson_tab
1 | SELECT JSON_ARRAYAGG(t ORDER BY js DESC) FROM pgss_sqljson_tab
1 | SELECT JSON_ARRAYAGG(t ORDER BY js) FROM pgss_sqljson_tab
1 | SELECT JSON_ARRAYAGG(t RETURNING jsonb) FROM pgss_sqljson_tab
1 | SELECT JSON_ARRAYAGG(t) FILTER (WHERE t IS NOT NULL) FROM pgss_sqljson_tab
1 | SELECT JSON_ARRAYAGG(t) FROM pgss_sqljson_tab
1 | SELECT JSON_ARRAYAGG(t) OVER () FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECTAGG(t VALUE t ABSENT ON NULL) FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECTAGG(t VALUE t RETURNING jsonb) FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECTAGG(t VALUE t WITH UNIQUE KEYS) FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECTAGG(t VALUE t) FILTER (WHERE t IS NOT NULL) +
| FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECTAGG(t VALUE t) FROM pgss_sqljson_tab
1 | SELECT JSON_OBJECTAGG(t VALUE t) OVER () FROM pgss_sqljson_tab
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
(14 rows)
-- JSON, JSON_SCALAR, JSON_SERIALIZE and IS JSON
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
t
(1 row)
SELECT JSON(t) FROM pgss_sqljson_tab;
json
------
(0 rows)
SELECT JSON(t WITH UNIQUE KEYS) FROM pgss_sqljson_tab;
json
------
(0 rows)
SELECT JSON(b FORMAT JSON ENCODING UTF8) FROM pgss_sqljson_tab;
json
------
(0 rows)
SELECT JSON_SCALAR(t) FROM pgss_sqljson_tab;
json_scalar
-------------
(0 rows)
SELECT JSON_SERIALIZE(js) FROM pgss_sqljson_tab;
json_serialize
----------------
(0 rows)
SELECT JSON_SERIALIZE(js RETURNING bytea) FROM pgss_sqljson_tab;
json_serialize
----------------
(0 rows)
SELECT JSON_SERIALIZE(js RETURNING bytea FORMAT JSON ENCODING UTF8)
FROM pgss_sqljson_tab;
json_serialize
----------------
(0 rows)
SELECT t IS JSON FROM pgss_sqljson_tab;
?column?
----------
(0 rows)
SELECT t IS JSON VALUE FROM pgss_sqljson_tab;
?column?
----------
(0 rows)
SELECT t IS JSON OBJECT FROM pgss_sqljson_tab;
?column?
----------
(0 rows)
SELECT t IS JSON ARRAY FROM pgss_sqljson_tab;
?column?
----------
(0 rows)
SELECT t IS JSON SCALAR FROM pgss_sqljson_tab;
?column?
----------
(0 rows)
SELECT t IS JSON WITH UNIQUE KEYS FROM pgss_sqljson_tab;
?column?
----------
(0 rows)
SELECT t IS JSON WITHOUT UNIQUE KEYS FROM pgss_sqljson_tab;
?column?
----------
(0 rows)
SELECT t IS NOT JSON FROM pgss_sqljson_tab;
?column?
----------
(0 rows)
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", calls;
calls | query
-------+---------------------------------------------------------------------
1 | SELECT JSON(b FORMAT JSON ENCODING UTF8) FROM pgss_sqljson_tab
1 | SELECT JSON(t WITH UNIQUE KEYS) FROM pgss_sqljson_tab
1 | SELECT JSON(t) FROM pgss_sqljson_tab
1 | SELECT JSON_SCALAR(t) FROM pgss_sqljson_tab
1 | SELECT JSON_SERIALIZE(js RETURNING bytea FORMAT JSON ENCODING UTF8)+
| FROM pgss_sqljson_tab
1 | SELECT JSON_SERIALIZE(js RETURNING bytea) FROM pgss_sqljson_tab
1 | SELECT JSON_SERIALIZE(js) FROM pgss_sqljson_tab
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
1 | SELECT t IS JSON ARRAY FROM pgss_sqljson_tab
3 | SELECT t IS JSON FROM pgss_sqljson_tab
1 | SELECT t IS JSON OBJECT FROM pgss_sqljson_tab
1 | SELECT t IS JSON SCALAR FROM pgss_sqljson_tab
1 | SELECT t IS JSON WITH UNIQUE KEYS FROM pgss_sqljson_tab
1 | SELECT t IS NOT JSON FROM pgss_sqljson_tab
(14 rows)
DROP TABLE pgss_sqljson_tab;