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/




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

Reply via email to