From c1eadf4e3dd49a344b38d70a46bd66c2d749e65f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= Date: Tue, 9 Apr 2019 18:50:35 +0100 Subject: [PATCH] Fix ->ping error detection on PostgreSQL 12 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The libpq write error handling was revamped in PostgreSQL 12, so it can return a non-NULL pointer even if it encouters a fatal error. Instead rely on PQresultStatus() to detect fatal errors (including NULL pointers). Petr Písař: Ported to 3.7.4 from 3e1a89a8e5557607932e57b85a2bbc875c2821b6. Signed-off-by: Petr Písař --- dbdimp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dbdimp.c b/dbdimp.c index f5c8703..0f7941a 100644 --- a/dbdimp.c +++ b/dbdimp.c @@ -493,19 +493,19 @@ int dbd_db_ping (SV * dbh) tstatus = pg_db_txn_status(aTHX_ imp_dbh); if (TRACE5_slow) TRC(DBILOGFP, "%sdbd_db_ping txn_status is %d\n", THEADER_slow, tstatus); - if (tstatus >= 4) { /* Unknown, so we err on the side of "bad" */ + if (tstatus >= PQTRANS_UNKNOWN) { /* Unknown, so we err on the side of "bad" */ if (TEND_slow) TRC(DBILOGFP, "%sEnd dbd_pg_ping (result: -2 unknown/bad)\n", THEADER_slow); return -2; } /* No matter what state we are in, send an empty query to the backend */ result = PQexec(imp_dbh->conn, "/* DBD::Pg ping test v3.7.4 */"); - if (NULL == result) { + status = PQresultStatus(result); + PQclear(result); + if (PGRES_FATAL_ERROR == status) { /* Something very bad, usually indicating the backend is gone */ return -3; } - status = PQresultStatus(result); - PQclear(result); /* We expect to see an empty query most times */ if (PGRES_EMPTY_QUERY == status) { -- 2.21.0