aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-06-28 00:06:01 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-06-28 00:06:01 +0000
commitea20397b79f795441d48eae0ace03caf4c108a3c (patch)
tree2866bb3122ca963b729258df91f1d8beae8787d4 /src
parentbf75f1a063c5b03058c9caa07157d75f4945b673 (diff)
downloadpostgresql-ea20397b79f795441d48eae0ace03caf4c108a3c.tar.gz
postgresql-ea20397b79f795441d48eae0ace03caf4c108a3c.zip
When using new protocol, PQexec can get out of a COPY IN or COPY OUT
state by itself, so do so.
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/libpq/fe-exec.c49
1 files changed, 42 insertions, 7 deletions
diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c
index a1ae2612569..9285adc4599 100644
--- a/src/interfaces/libpq/fe-exec.c
+++ b/src/interfaces/libpq/fe-exec.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.140 2003/06/23 19:20:24 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.141 2003/06/28 00:06:01 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1083,13 +1083,48 @@ PQexecStart(PGconn *conn)
*/
while ((result = PQgetResult(conn)) != NULL)
{
- if (result->resultStatus == PGRES_COPY_IN ||
- result->resultStatus == PGRES_COPY_OUT)
+ if (result->resultStatus == PGRES_COPY_IN)
{
- PQclear(result);
- printfPQExpBuffer(&conn->errorMessage,
- libpq_gettext("COPY state must be terminated first\n"));
- return false;
+ if (PG_PROTOCOL_MAJOR(conn->pversion) >= 3)
+ {
+ /* In protocol 3, we can get out of a COPY IN state */
+ if (PQputCopyEnd(conn,
+ libpq_gettext("COPY terminated by new PQexec")) < 0)
+ {
+ PQclear(result);
+ return false;
+ }
+ /* keep waiting to swallow the copy's failure message */
+ }
+ else
+ {
+ /* In older protocols we have to punt */
+ PQclear(result);
+ printfPQExpBuffer(&conn->errorMessage,
+ libpq_gettext("COPY IN state must be terminated first\n"));
+ return false;
+ }
+ }
+ else if (result->resultStatus == PGRES_COPY_OUT)
+ {
+ if (PG_PROTOCOL_MAJOR(conn->pversion) >= 3)
+ {
+ /*
+ * In protocol 3, we can get out of a COPY OUT state: we
+ * just switch back to BUSY and allow the remaining COPY
+ * data to be dropped on the floor.
+ */
+ conn->asyncStatus = PGASYNC_BUSY;
+ /* keep waiting to swallow the copy's completion message */
+ }
+ else
+ {
+ /* In older protocols we have to punt */
+ PQclear(result);
+ printfPQExpBuffer(&conn->errorMessage,
+ libpq_gettext("COPY OUT state must be terminated first\n"));
+ return false;
+ }
}
PQclear(result);
}