I tested the v9 patch series on current PostgreSQL HEAD.
The patches did not apply cleanly on the latest tree because of a small conflict in nodeModifyTable.c, but after resolving it manually, the build and installation completed successfully.
I initialized a fresh cluster and verified that the built-in composite type copy_error_saving is created correctly during initdb.
I tested the feature using the following setup:
CREATE TABLE err_tbl OF copy_error_saving;
CREATE TABLE t(a int, b int, c int);
COPY t
FROM STDIN
WITH (
FORMAT csv,
ON_ERROR table,
ERROR_TABLE err_tbl
);
Input used:
1,2,3
4,5,x
7,8,9
From my testing:
valid rows were inserted into the target table correctly
malformed rows were stored in ERROR_TABLE as expected
COPY continued processing the remaining rows successfully
The latest executor-based approach using ExecInsert() looks cleaner and easier to follow compared to the earlier direct insertion approach.
I also feel the built-in composite type approach makes the ERROR_TABLE validation simpler and more maintainable compared to manually checking all columns and types.