summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2006-11-24 23:06:50 +0000
committerTom Lane2006-11-24 23:06:50 +0000
commitdf3a6fe477bcb82c76276a1b38714a225cc2cbff (patch)
treebcac88e71159c9f9d0a542552c3b8ba05036d27c
parent9b15b1401482f4354dd0205c607edddb48950ad0 (diff)
Fix psql's \copy command to ensure that it cycles libpq back to the idle state
(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.
-rw-r--r--src/bin/psql/copy.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c
index 9adbed1811c..623ed36ae0b 100644
--- a/src/bin/psql/copy.c
+++ b/src/bin/psql/copy.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2006, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.70 2006/10/06 17:14:00 petere Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.71 2006/11/24 23:06:50 tgl Exp $
*/
#include "postgres_fe.h"
#include "copy.h"
@@ -598,6 +598,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 (options->file != NULL)
{
if (fclose(copystream) != 0)