From: Tom Lane Date: Fri, 24 Nov 2006 23:07:07 +0000 (+0000) Subject: Fix psql's \copy command to ensure that it cycles libpq back to the idle state X-Git-Tag: REL7_4_15~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e53a43bf1710533028c4e57df5c0322281827779;p=postgresql 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. --- diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c index aed8b3196a..925940e84d 100644 --- a/src/bin/psql/copy.c +++ b/src/bin/psql/copy.c @@ -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);