]> granicus.if.org Git - postgresql/commitdiff
Fix psql's \copy command to ensure that it cycles libpq back to the idle state
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 24 Nov 2006 23:07:07 +0000 (23:07 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 24 Nov 2006 23:07:07 +0000 (23:07 +0000)
(in particular, causing the ReadyForQuery message to be eaten) before
returning from do_copy.  The only known consequence of failing to do so is
that get_prompt might show a wrong result for the %x transaction status
escape, as reported by Bernd Helmle; but it's possible there are other issues.

Back-patch as far as 7.4, the oldest version supporting %x.

src/bin/psql/copy.c

index aed8b3196aed74ef4a7c0ae403982159dff49e59..925940e84d49e3e45c0af9926eaaa79bdb64db2e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.33.4.1 2004/08/14 22:24:49 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.33.4.2 2006/11/24 23:07:07 tgl Exp $
  */
 #include "postgres_fe.h"
 #include "copy.h"
@@ -416,6 +416,18 @@ do_copy(const char *args)
 
        PQclear(result);
 
+       /*
+        * Make sure we have pumped libpq dry of results; else it may still be
+        * in ASYNC_BUSY state, leading to false readings in, eg, get_prompt().
+        */
+       while ((result = PQgetResult(pset.db)) != NULL)
+       {
+               success = false;
+               psql_error("\\copy: unexpected response (%d)\n",
+                                  PQresultStatus(result));
+               PQclear(result);
+       }
+
        if (copystream != stdout && copystream != stdin)
                fclose(copystream);
        free_copy_options(options);