summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2006-11-24 23:06:56 +0000
committerTom Lane2006-11-24 23:06:56 +0000
commit2f523a6f53e5929b8b72df620a16e3981488eac0 (patch)
tree938be63b9f1f8ce25fe85eca813a8548c6464856
parent35f9bf3725c164fa302e748f6b063dafce3c4027 (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 bd1763c5ac4..15739318826 100644
--- a/src/bin/psql/copy.c
+++ b/src/bin/psql/copy.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.58 2005/10/15 02:49:40 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.58.2.1 2006/11/24 23:06:56 tgl Exp $
*/
#include "postgres_fe.h"
#include "copy.h"
@@ -573,6 +573,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)