Re: Fix missing FORMAT when deparsing JSON_ARRAY(query)

From: Ewan Young <kdbase(dot)hack(at)gmail(dot)com>
To: Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com>
Cc: PostgreSQL-development <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Richard Guo <guofenglinux(at)gmail(dot)com>
Subject: Re: Fix missing FORMAT when deparsing JSON_ARRAY(query)
Date: 2026-07-23 07:25:58
Message-ID: CAON2xHOd8X0npo-YfeNaKFudWY5+UumsxWTEZg5=7s9WuxYYow@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Jul 22, 2026 at 2:22 PM Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com> wrote:
>
> 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)
> ```

Thanks for the patch — I reviewed and tested it, and it looks correct.

One thing that seems missing: since JsonConstructorExpr is stored in
pg_rewrite (and in SQL-function bodies), adding a field changes the
stored node representation,
so this should bump CATALOG_VERSION_NO?

>
> Best regards,
> --
> Chao Li (Evan)
> HighGo Software Co., Ltd.
> https://www.highgo.com/
>
>
>
>

--
Regards,
Ewan Young

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Zsolt Parragi 2026-07-23 07:33:57 pg_resetwal: do not allow zero next multixact offset
Previous Message Fujii Masao 2026-07-23 07:24:03 Re: Incorrect check in 037_except.pl?