| From: | Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com> |
|---|---|
| To: | PostgreSQL-development <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
| Cc: | Richard Guo <guofenglinux(at)gmail(dot)com> |
| Subject: | Fix missing FORMAT when deparsing JSON_ARRAY(query) |
| Date: | 2026-07-22 06:21:27 |
| Message-ID: | 4C89B193-7D54-4705-9CF9-F0D484B9E099@gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi,
While testing "[8d829f5a0] Fix JSON_ARRAY(query) empty set handling and view deparsing”, I found that the departing may omit the FORMAT JSON clause.
Here is a simple repro:
```
evantest=# create view v as
evantest-# select json_array(select '{"a": 1}'::text format json) as j;
CREATE VIEW
evantest=# select * from v;
j
------------
[{"a": 1}]
(1 row)
evantest=# select pg_get_viewdef('v'::regclass, true);
pg_get_viewdef
---------------------------------------------------------------------------
SELECT JSON_ARRAY( SELECT '{"a": 1}'::text AS text RETURNING json) AS j;
(1 row)
evantest=# select pg_get_viewdef('v'::regclass, false);
pg_get_viewdef
---------------------------------------------------------------------------
SELECT JSON_ARRAY( SELECT '{"a": 1}'::text AS text RETURNING json) AS j;
(1 row)
evantest=# SELECT JSON_ARRAY( SELECT '{"a": 1}'::text AS text RETURNING json) AS j;
j
----------------
["{\"a\": 1}"]
(1 row)
```
As shown above, I defined the view with FORMAT JSON, but the deparsed SQL has lost that clause. Running the deparsed SELECT produces a different result from selecting from the view because FORMAT JSON is missing.
Currently, JsonConstructorExpr does not store the JsonFormat information. To fix this problem, we need to add a JsonFormat field to JsonConstructorExpr. Please see the attached patch for details.
With the fix:
```
evantest=# select pg_get_viewdef('v'::regclass, true);
pg_get_viewdef
---------------------------------------------------------------------------------------
SELECT JSON_ARRAY( SELECT '{"a": 1}'::text AS text FORMAT JSON RETURNING json) AS j;
(1 row)
evantest=# SELECT JSON_ARRAY( SELECT '{"a": 1}'::text AS text FORMAT JSON RETURNING json) AS j;
j
------------
[{"a": 1}]
(1 row)
```
Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/
| Attachment | Content-Type | Size |
|---|---|---|
| v1-0001-Preserve-FORMAT-when-deparsing-JSON_ARRAY-query.patch | application/octet-stream | 5.9 KB |
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Hayato Kuroda (Fujitsu) | 2026-07-22 06:28:18 | RE: sequencesync worker race with REFRESH SEQUENCES |
| Previous Message | Zsolt Parragi | 2026-07-22 06:14:00 | Re: [PATCH] Add pg_get_event_trigger_ddl() function |