case CONNECTION_SSL_STARTUP:
                case CONNECTION_NEEDED:
                case CONNECTION_CHECK_WRITABLE:
+               case CONNECTION_CONSUME:
                        break;
 
                default:
                        conn->status = CONNECTION_OK;
                        return PGRES_POLLING_OK;
 
+               case CONNECTION_CONSUME:
+                       {
+                               conn->status = CONNECTION_OK;
+                               if (!PQconsumeInput(conn))
+                                       goto error_return;
+
+                               if (PQisBusy(conn))
+                               {
+                                       conn->status = CONNECTION_CONSUME;
+                                       restoreErrorMessage(conn, &savedMessage);
+                                       return PGRES_POLLING_READING;
+                               }
+
+                               /*
+                                * Call PQgetResult() again to consume NULL result.
+                                */
+                               res = PQgetResult(conn);
+                               if (res != NULL)
+                               {
+                                       PQclear(res);
+                                       conn->status = CONNECTION_CONSUME;
+                                       goto keep_going;
+                               }
+
+                               /* We are open for business! */
+                               conn->status = CONNECTION_OK;
+                               return PGRES_POLLING_OK;
+                       }
                case CONNECTION_CHECK_WRITABLE:
                        {
                                if (!saveErrorMessage(conn, &savedMessage))
                                        /* We can release the address lists now. */
                                        release_all_addrinfo(conn);
 
-                                       /* We are open for business! */
-                                       conn->status = CONNECTION_OK;
-                                       return PGRES_POLLING_OK;
+                                       /*
+                                        * Finish reading any remaining messages before
+                                        * being considered as ready.
+                                        */
+                                       conn->status = CONNECTION_CONSUME;
+                                       goto keep_going;
                                }
 
                                /*
 
        CONNECTION_SETENV,                      /* Negotiating environment. */
        CONNECTION_SSL_STARTUP,         /* Negotiating SSL. */
        CONNECTION_NEEDED,                      /* Internal state: connect() needed */
-       CONNECTION_CHECK_WRITABLE       /* Check if we could make a writable
+       CONNECTION_CHECK_WRITABLE,      /* Check if we could make a writable
                                                                 * connection. */
+       CONNECTION_CONSUME                      /* Wait for any pending message and
+                                                                * consume them. */
 } ConnStatusType;
 
 typedef enum