> On May 6, 2026, at 16:46, Alex Guo <[email protected]> wrote:
> 
> 
> On 5/6/26 2:40 PM, Chao Li wrote:
>> Hi,
>> 
>> Another issue I found with COPY TO (FORMAT json, FORCE_ARRAY) is that it 
>> places the delimiter comma at the beginning of the next line, like this:
>> ```
>> evantest=# copy test_json_copy to stdout with (format json, force_array);
>> [
>> {"id":1,"name":"Alice","is_active":true,"tags":["dev","db"],"created_at":"2026-05-01"}
>> ,{"id":2,"name":"Bob","is_active":false,"tags":["manager"],"created_at":"2026-05-02"}
>> ,{"id":3,"name":"Charlie","is_active":null,"tags":null,"created_at":null}
>> ,{"id":4,"name":"Special Case: 
>> \"Quotes\"","is_active":true,"tags":["a","b"],"created_at":"2026-05-04"}
>> ]
>> ```
>> 
>> I was surprised by the comma placement. It is valid JSON, but it looks quite 
>> uncommon.
>> 
>> For comparison, the existing json_agg() places commas at the end of the line:
>> ```
>> evantest=# select json_agg(t) from (select id, name from test_json_copy) t;
>>                    json_agg
>> ----------------------------------------------
>>  [{"id":1,"name":"Alice"},                   +
>>   {"id":2,"name":"Bob"},                     +
>>   {"id":3,"name":"Charlie"},                 +
>>   {"id":4,"name":"Special Case: \"Quotes\""}]
>> (1 row)
>> ```
>> 
>> If this feature had already been released, I would not think it worth 
>> changing just for formatting. But since "FORMAT json" is a new PG19 feature 
>> and has not been released yet, I think it is better to make the output to 
>> follow the more common style.
>> 
>> This patch changes the output to place the comma at the end of the previous 
>> line instead. The fix only adjusts how commas and newlines are emitted. It 
>> does not buffer the whole result, so it should not have any performance 
>> impact.
>> 
>> See the attached patch for details.
>> 
>> Best regards,
>> --
>> Chao Li (Evan)
>> HighGo Software Co., Ltd.
>> https://www.highgo.com/
>> 
>> 
>> 
> Thanks for the patch, I like it as I feel better with placing commas at the 
> end of lines.
> 
> I have a small suggestion. The function name CopySendTextLikeEOL reads very 
> similar to the existing CopySendTextLikeEndOfRow. Would it better to rename 
> it to CopySendTextLikeLineTerminator?
> 
> Other than that, the patch looks good to me.
> 
> Regards,
> Alex Guo

Thanks for the suggestion, I take it.

PFA v2 - Renamed CopySendTextLikeEOL to CopySendTextLikeLineTerminator.

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




Attachment: v2-0001-COPY-JSON-use-trailing-commas-in-FORCE_ARRAY-outp.patch
Description: Binary data

Reply via email to