Re: BUG #5837: PQstatus() fails to report lost connection
От | Murray S. Kucherawy |
---|---|
Тема | Re: BUG #5837: PQstatus() fails to report lost connection |
Дата | |
Msg-id | F5833273385BB34F99288B3648C4F06F1341E73FCE@EXCH-C2.corp.cloudmark.com обсуждение исходный текст |
Ответ на | Re: BUG #5837: PQstatus() fails to report lost connection (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | pgsql-bugs |
> -----Original Message----- > From: Tom Lane [mailto:tgl@sss.pgh.pa.us] > Sent: Monday, January 24, 2011 9:42 AM > To: Murray S. Kucherawy > Cc: Robert Haas; pgsql-bugs@postgresql.org > Subject: Re: [BUGS] BUG #5837: PQstatus() fails to report lost connection >=20 > >> This is complete nonsense. If you followed the documented method for > >> using PQgetResult -- ie, keep calling it till it returns NULL, rather > >> than assuming there will be a specific number of results --- then > >> PQstatus would show you the bad status afterwards. >=20 > > Your assertion here of "Read the result set to exhaustion, THEN check > > connection status to see if it was bad to begin with," can be politely > > described as counter-intuitive. >=20 > [ shrug... ] I guess if your intuition is that PQstatus should be > expected to intuit the failure of a call that hasn't happened yet, > then it's counter-intuitive. You're mixing internal implementation details with what the API consumer se= es. I don't expect PQstatus() to do anything other than tell me that a con= nection is no longer usable, which is what it's documented to do. I'm fine= with checking it after an error has been returned by some query-related fu= nction, which is what OpenDBX is doing. I don't know why that's "complete = nonsense". Look at the order of operations here: 0) A previous connection exists. The server is manually restarted. 1) A query is issued. This succeeds. 2) A request for results is issued. This returns non-NULL, apparently indi= cating at least one result object came back. 3) PQresultStatus() is called, and it returns PGRES_FATAL_ERROR. 4) PQstatus() is checked, and indicates no problem. 4a) A call to PQresultErrorMessage() indicates that the library knows the c= onnection was administratively reset. As a consumer of the API, not knowing (or wanting to know) what's going on = under-the-hood, this looks like a bug; the library certainly did know that = the connection can no longer be used or 4a wouldn't happen, but PQstatus() = is not saying so. The documentation I see at http://www.postgresql.org/doc= s/9.0/interactive/libpq-status.html doesn't lead me to believe that any of = this logic is faulty. That I have to iterate on step 2 above to get PQstat= us() to eventually tell me the truth even though I know something has gone = wrong already seems strange, and that's why I raised this issue. Another possible explanation is that PQresultStatus() doesn't give a consis= tent result until after PQgetResult() has returned NULL. If that's the cas= e, it should be documented, because right now it isn't. -MSK
В списке pgsql-bugs по дате отправления: