Re: Make COPY format extendable: Extract COPY TO format implementations
Masahiko Sawada <sawada.mshk@gmail.com>
Attachments
- v2-0002-Allow-extensions-to-register-custom-format-to-COP.patch (text/x-patch) patch v2-0002
- v2-0004-Add-test-module-for-COPY-custom-format.patch (text/x-patch) patch v2-0004
- v2-0003-Add-an-hook-for-custom-COPY-format-option-validat.patch (text/x-patch) patch v2-0003
- v2-0001-Move-Copy-From-To-StateData-to-copy_state.h.patch (text/x-patch) patch v2-0001
Hi, On Thu, Mar 26, 2026 at 6:36 PM Sutou Kouhei <kou@clear-code.com> wrote: > > Hi, > > In <CAD21AoCLxUhQ0uBjDKXvCEtJBCfF13Ru_7u-Qrrsu+0PPUqcPQ@mail.gmail.com> > "Re: Make COPY format extendable: Extract COPY TO format implementations" on Thu, 18 Dec 2025 15:43:07 -0800, > Masahiko Sawada <sawada.mshk@gmail.com> wrote: > > > Looking at these results, it seems that 0001-from-binary cases and > > 0006-to-binary cases are slower throughout the six results? > > Good point. I didn't notice them. But I feel that it's not > related to the patch set. Because 0001 doesn't change COPY > FROM related code. 0001 just changes COPY TO related > code. And 0006 just adds tests. 0006 doesn't change > implementations. > > > BTW, how to proceed this proposal? It seems that we can't > proceed this proposal without PostgreSQL committers' > attentions but it seems that it's difficult. Sorry for going quiet on this for a while -- I haven't had time to work on it until now. After more thought, I'd like to keep the custom-format changes to the bare minimum and not disturb the existing built-in format processing. In particular, I've dropped the earlier rework that split CopyToStateData / CopyFromStateData to hide built-in-specific fields from extensions. That was my own idea, but I no longer think it pays off: the fields it hid (raw_buf, line_buf, the input buffers, etc.) are only ever used by the built-in text/CSV/binary parsers, and a custom format never touches them -- so visible or not, nothing depends on them, while splitting the struct is invasive to the existing format processing. Touching the Copy state structs is fine in itself; it's the hiding that wasn't worth the cost. Instead, each state struct just gets one opaque pointer for a custom format to keep its own state, and the existing code paths are left alone. Updated patches attached: - 0001 moves CopyFromStateData and CopyToStateData to a new copy_state.h, so extensions can implement their routines without including the *_internal.h headers. It also drops file_fdw.c's dependency on copyfrom_internal.h. - 0002 introduces the registration API and the opaque per-format pointer in both structs. - 0003 adds a callback to validate the COPY options as a whole, called after all options are processed. - 0004 adds the regression tests. I'd like to proceed in this direction barring objections. Feedback is very welcome. Regards, -- Masahiko Sawada Amazon Web Services: https://aws.amazon.com
Commits
-
Refactor Copy{From|To}GetRoutine() to use pass-by-reference argument.
- bacbc4863b3b 18.0 landed
-
Refactor COPY FROM to use format callback functions.
- 7717f6300693 18.0 landed
-
Refactor COPY TO to use format callback functions.
- 2e4127b6d2d8 18.0 landed
-
Another try to fix BF failure introduced in commit ddd5f4f54a.
- 9bc1eee988c3 17.0 cited
-
Revert "Refactor CopyReadAttributes{CSV,Text}() to use a callback in COPY FROM"
- 06bd311bce24 17.0 landed
-
Improve COPY TO performance when server and client encodings match
- b619852086ed 17.0 cited
-
Simplify signature of CopyAttributeOutCSV() in copyto.c
- b9d6038d7048 17.0 landed
-
Revert "Refactor CopyAttributeOut{CSV,Text}() to use a callback in COPY TO"
- 1aa8324b81fa 17.0 landed
-
Refactor CopyAttributeOut{CSV,Text}() to use a callback in COPY TO
- 2889fd23be56 17.0 landed
-
Refactor CopyReadAttributes{CSV,Text}() to use a callback in COPY FROM
- 95fb5b49024a 17.0 landed
-
Add progress reporting of skipped tuples during COPY FROM.
- 729439607ad2 17.0 cited
-
pgbench: Add \syncpipeline
- 94edfe250c6a 17.0 cited
-
meson: Make gzip and tar optional
- 9ca6e7b9411e 17.0 cited
-
Export the external file reader used in COPY FROM as APIs.
- 8ddc05fb01ee 9.1.0 cited