> On Jul 23, 2026, at 15:25, Ewan Young <[email protected]> wrote:
> 
> 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.
> 

Thank you very much for the review.

> 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?
> 

You are right, CATALOG_VERSION_NO needs to be bumped. As a general rule, 
however, the committer will do that before pushing, so submitted patches should 
never touch CATALOG_VERSION_NO.

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






Reply via email to