Hi Jian

On 11/05/2026 05:13, jian he wrote:
> The attached patch should address most, if not all, of the issues you
> both raised.

Thanks for the update. All my points were addressed.

> As explained in [1], we can export ExecInsert to let it perform the
> main insertion work.
> To allow ExecInsert to handle the remaining tasks, we need to carefuly manage
> the lifecycle of constructed CopyFromStateData->ModifyTableContext (including
> ModifyTableContext->EState): populate it, use it, and then release it.
> 
> Since ExecInsert already contains the necessary infrastructure for INSERT ON
> CONFLICT DO NOTHING/SELECT, exporting it avoids duplicating that logic in
> src/backend/commands/copyfrom.c (which is what v1 of the patch did).
> 
> [1]: https://postgr.es/m/CACJufxH_NbPuA+O5YR7xP4xDZ+iHkO2VFkddhrhBz+4-
> [email protected]
> 
> The exclusion unique constraint issue is still not resolved.... but,
> overall v2 is better than v1, IMHO.


One other thing I just noticed in BINARY mode. I believe we're missing a
check in ProcessCopyOptions() with ON_CONFLICT TABLE to show a proper
error message, e.g.

/* Check on_conflict */
if (opts_out->format == COPY_FORMAT_BINARY && opts_out->on_conflict !=
ONCONFLICT_NONE)
  ereport(ERROR,
    (errcode(ERRCODE_SYNTAX_ERROR),
     errmsg("cannot specify %s in BINARY mode", "ON_CONFLICT TABLE")));

postgres=# COPY t FROM STDIN (FORMAT binary, ON_CONFLICT TABLE,
CONFLICT_TABLE ctbl);
ERROR:  cannot specify ON_CONFLICT TABLE in BINARY mode

Right now the error is rather vague:

ERROR:  COPY file signature not recognized

What do you think?

Thanks!

Best, Jim



Reply via email to