diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 06d909e8049..82a440531b5 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -5284,7 +5284,7 @@ typedef struct pgNotify PQnotifies does not actually read data from the server; it just returns messages previously absorbed by another - libpq function. In prior releases of + libpq function. In ancient releases of libpq, the only way to ensure timely receipt of NOTIFY messages was to constantly submit commands, even empty ones, and then check PQnotifies after each @@ -8711,6 +8711,7 @@ main(int argc, char **argv) notify->relname, notify->be_pid); PQfreemem(notify); nnotifies++; + PQconsumeInput(conn); } } diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index b56995925bd..62c2928e6bb 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -836,7 +836,8 @@ PrintNotifications(void) { PGnotify *notify; - while ((notify = PQnotifies(pset.db))) + PQconsumeInput(pset.db); + while ((notify = PQnotifies(pset.db)) != NULL) { /* for backward compatibility, only show payload if nonempty */ if (notify->extra[0]) @@ -847,6 +848,7 @@ PrintNotifications(void) notify->relname, notify->be_pid); fflush(pset.queryFout); PQfreemem(notify); + PQconsumeInput(pset.db); } } diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index ff244498da4..42640ba9be1 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1722,12 +1722,13 @@ ecpg_process_output(struct statement *stmt, bool clear_result) } /* check for asynchronous returns */ - notify = PQnotifies(stmt->connection->connection); - if (notify) + PQconsumeInput(stmt->connection->connection); + while ((notify = PQnotifies(stmt->connection->connection)) != NULL) { ecpg_log("ecpg_process_output on line %d: asynchronous notification of \"%s\" from backend PID %d received\n", stmt->lineno, notify->relname, notify->be_pid); PQfreemem(notify); + PQconsumeInput(stmt->connection->connection); } return status; diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index e8b28d9ccf9..6aed8c87c7a 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -2265,6 +2265,9 @@ sendFailed: * no unhandled async notification from the backend * * the CALLER is responsible for FREE'ing the structure returned + * + * Note that this function does not read any new data from the socket; + * so usually, caller should call PQconsumeInput() first. */ PGnotify * PQnotifies(PGconn *conn) diff --git a/src/test/examples/testlibpq2.c b/src/test/examples/testlibpq2.c index 62ecd68b55e..6cdf8c8631b 100644 --- a/src/test/examples/testlibpq2.c +++ b/src/test/examples/testlibpq2.c @@ -140,6 +140,7 @@ main(int argc, char **argv) notify->relname, notify->be_pid); PQfreemem(notify); nnotifies++; + PQconsumeInput(conn); } }