aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/src/sgml/libpq.sgml3
-rw-r--r--src/bin/psql/common.c4
-rw-r--r--src/interfaces/ecpg/ecpglib/execute.c5
-rw-r--r--src/interfaces/libpq/fe-exec.c3
-rw-r--r--src/test/examples/testlibpq2.c1
5 files changed, 12 insertions, 4 deletions
diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml
index f7bd9650af1..2913fd79750 100644
--- a/doc/src/sgml/libpq.sgml
+++ b/doc/src/sgml/libpq.sgml
@@ -5215,7 +5215,7 @@ typedef struct pgNotify
<para>
<function>PQnotifies</function> does not actually read data from the
server; it just returns messages previously absorbed by another
- <application>libpq</application> function. In prior releases of
+ <application>libpq</application> function. In ancient releases of
<application>libpq</application>, the only way to ensure timely receipt
of <command>NOTIFY</> messages was to constantly submit commands, even
empty ones, and then check <function>PQnotifies</function> after each
@@ -8608,6 +8608,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 a41932ff275..d257be5700f 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -788,7 +788,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])
@@ -799,6 +800,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 9a6dde44de9..6f20cc412a2 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -1729,12 +1729,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 a97e73cf99d..916eb45d4a8 100644
--- a/src/interfaces/libpq/fe-exec.c
+++ b/src/interfaces/libpq/fe-exec.c
@@ -2239,6 +2239,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);
}
}