Blob Blame History Raw
From c1eadf4e3dd49a344b38d70a46bd66c2d749e65f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= <ilmari@ilmari.org>
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ř <ppisar@redhat.com>
---
 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