psql: stop at error immediately during \copy - Mailing list pgsql-hackers

From Peifeng Qiu
Subject psql: stop at error immediately during \copy
Date
Msg-id CAPH51bdPp7gR1ca76Rh2f-BJg4BGDpb3Shzko8jEtNM1r_zWyw@mail.gmail.com
Whole thread Raw
List pgsql-hackers
Hi, hackers.

psql \copy command can stream data from client host just like the normal
copy command can do on server host. Let's assume we want to stream a
local data file from psql:
pgsql =# \copy tbl from '/tmp/datafile' (format 'text');
If there's error inside the data file, \copy will still stream the
whole data file
before it reports the error. This is undesirable If the data file is very large,
or it's an infinite pipe. The normal copy command which reads file on the
server host can report error immediately as expected.

The problem seems to be pqParseInput3(). When error occurs in server
backend, it will send 'E' packet back to client. During \copy command, the
connection's asyncStatus is PGASYNC_COPY_IN, any 'E' packet will
get ignored by this path:

else if (conn->asyncStatus != PGASYNC_BUSY)
{
/* If not IDLE state, just wait ... */
if (conn->asyncStatus != PGASYNC_IDLE)
return;

So the client can't detect the error sent back by server.

I've attached a patch to demonstrate one way to workaround this. Save
the error via pqGetErrorNotice3() if the conn is PGASYNC_COPY_IN
status. The client code(psql) can detect the error via PQerrorMessage().
Probably still lots of details need to be considered but should be good
enough to start this discussion. Any thoughts on this issue?

Best regards
Peifeng Qiu

Attachment

pgsql-hackers by date:

Previous
From: Andres Freund
Date:
Subject: Re: BUG #17717: Regression in vacuumdb (15 is slower than 10/11 and possible memory issue)
Next
From: Peter Geoghegan
Date:
Subject: Re: Avoiding unnecessary clog lookups while freezing