Generally looks good to me, I only found a few typos:
+ errmsg("saving
error information to table \"%s\" row due to
data type incompatibility at line %" PRIu64 " for column \"%s\":
\"%s\"",
Is row needed there?
+ * TODO: Allow cstate->error_rel to be a partitioned table. This should
be
+ * not difficult, but requires proper handling of constraints and
triggers
should not be difficult
+ privileges on it. During the error records inseration,
+ <literal>NOT NULL</literal> and <literal>CHECK</literal>
constraints are enforced,
+ and both row-level and statement-level triggers will be fired.
record's insertion
Maybe this could explicitly mention that failure to insert into the
error table will fail the copy statement? Or some better wording of
that, as it is allowed behavior with triggers.