From df3a6fe477bcb82c76276a1b38714a225cc2cbff Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 24 Nov 2006 23:06:50 +0000
Subject: [PATCH] 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.
---
 src/bin/psql/copy.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

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)
-- 
GitLab