On Wed, Jul 22, 2026 at 2:22 PM Chao Li <[email protected]> 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


Reply via email to