diff options
Diffstat (limited to 'src/interfaces/libpq/fe-connect.c')
-rw-r--r-- | src/interfaces/libpq/fe-connect.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index c505b661c6b..65b7c31dc03 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -1896,6 +1896,7 @@ PQconnectPoll(PGconn *conn) case CONNECTION_SSL_STARTUP: case CONNECTION_NEEDED: case CONNECTION_CHECK_WRITABLE: + case CONNECTION_CONSUME: break; default: @@ -2935,6 +2936,34 @@ keep_going: /* We will come back to here until there is 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)) @@ -2994,9 +3023,12 @@ keep_going: /* We will come back to here until there is /* 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; } /* |