> 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/
v2-0001-COPY-JSON-use-trailing-commas-in-FORCE_ARRAY-outp.patch
Description: Binary data
