Re: Emitting JSON to file using COPY TO

Florents Tselai <florents.tselai@gmail.com>

From: Florents Tselai <florents.tselai@gmail.com>
To: jian he <jian.universality@gmail.com>
Cc: Junwang Zhao <zhjwpku@gmail.com>, Joe Conway <mail@joeconway.com>, "Andrey M. Borodin" <x4mmm@yandex-team.ru>, Dean Rasheed <dean.a.rasheed@gmail.com>, Daniel Verite <daniel@manitou-mail.org>, Andrew Dunstan <andrew@dunslane.net>, Davin Shearer <davin@apache.org>, PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2026-02-03T16:40:49Z
Lists: pgsql-hackers, pgsql-general
On Wed, Jan 21, 2026 at 2:16 PM jian he <jian.universality@gmail.com> wrote:

> hi.
>
> rebase only.
>
> --
> jian
> https://www.enterprisedb.com/


I (and others I assume) would really like to see this in 19;
glancing at the thread above and in the test cases I see this is in good
shape for comitter review.
No?

If I were to add something  it would be an example in copy.sgml
  <para>
   When the <literal>FORCE_ARRAY</literal> option is enabled,
   the entire output is wrapped in a JSON array and individual rows are
separated by commas:
   <programlisting>
COPY (SELECT id, name FROM users) TO STDOUT (FORMAT JSON, FORCE_ARRAY);
   </programlisting>
   <programlisting>
[
{"id": 1, "name": "Alice"}
,{"id": 2, "name": "Bob"}
,{"id": 3, "name": "Charlie"}
]
   </programlisting>
  </para>

Also, apologies if that has been discussed already,
is there a good reason why didn't we just go with a simple "WRAP_ARRAY" ?

Commits

  1. Add option force_array for COPY JSON FORMAT

  2. json format for COPY TO

  3. introduce CopyFormat, refactor CopyFormatOptions

  4. Doc: add IDs to copy.sgml's <varlistentry> and <refsect1>

  5. Refactor COPY TO to use format callback functions.