]> granicus.if.org Git - postgresql/commitdiff
libpq: Notice errors a backend may have sent just before dying.
authorRobert Haas <rhaas@postgresql.org>
Thu, 12 Nov 2015 14:12:18 +0000 (09:12 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 12 Nov 2015 14:12:18 +0000 (09:12 -0500)
At least since the introduction of Hot Standby, the backend has
sometimes sent fatal errors even when no client query was in
progress, assuming that the client would receive it.  However,
pqHandleSendFailure was not in sync with this assumption, and
only tries to catch notices and notifies.  Add a parseInput call
to the loop there to fix.

Andres Freund suggested the fix.  Comments are by me.
Reviewed by Michael Paquier.

src/interfaces/libpq/fe-exec.c

index 828f18e1110119efc3bf99ecf16d98ce306458ea..07c433552116082e29ba72280f6fdca2a78b987b 100644 (file)
@@ -1553,8 +1553,8 @@ sendFailed:
 /*
  * pqHandleSendFailure: try to clean up after failure to send command.
  *
- * Primarily, what we want to accomplish here is to process an async
- * NOTICE message that the backend might have sent just before it died.
+ * Primarily, what we want to accomplish here is to process any messages that
+ * the backend might have sent just before it died.
  *
  * NOTE: this routine should only be called in PGASYNC_IDLE state.
  */
@@ -1562,16 +1562,16 @@ void
 pqHandleSendFailure(PGconn *conn)
 {
        /*
-        * Accept any available input data, ignoring errors.  Note that if
-        * pqReadData decides the backend has closed the channel, it will close
-        * our side of the socket --- that's just what we want here.
+        * Accept and parse any available input data.  Note that if pqReadData
+        * decides the backend has closed the channel, it will close our side of
+        * the socket --- that's just what we want here.
         */
        while (pqReadData(conn) > 0)
-                /* loop until no more data readable */ ;
+               parseInput(conn);
 
        /*
-        * Parse any available input messages.  Since we are in PGASYNC_IDLE
-        * state, only NOTICE and NOTIFY messages will be eaten.
+        * Make one attempt to parse available input messages even if we read no
+        * data.
         */
        parseInput(conn);
 }