From fb5e1f03c334fdc2bbf318c14ed253b08a65f379 Mon Sep 17 00:00:00 2001
From: Anthonin Bonnefoy <anthonin.bonnefoy@datadoghq.com>
Date: Wed, 22 Jul 2026 14:25:44 +0200
Subject: Fix error handling in getCopyDataMessage and pqFunctionCall3

Currently, if an error is triggered in getNotify or getParameterStatus,
the error is ignored and the loop will try to process the next message.

This patch fixes the issue by returning -2 in getCopyDataMessage, and
the error PGresult in pqFunctionCall3 when a fatal error was triggered.
---
 src/interfaces/libpq/fe-protocol3.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c
index 9d6a285fb28..f807670409c 100644
--- a/src/interfaces/libpq/fe-protocol3.c
+++ b/src/interfaces/libpq/fe-protocol3.c
@@ -1931,6 +1931,13 @@ getCopyDataMessage(PGconn *conn)
 				return -1;
 		}
 
+		/*
+		 * An error may have been triggered while processing the message,
+		 * report it if it's the case
+		 */
+		if (conn->error_result && conn->status == CONNECTION_BAD)
+			return -2;
+
 		/* Drop the processed message and loop around for another */
 		pqParseDone(conn, conn->inCursor);
 	}
@@ -2425,6 +2432,13 @@ pqFunctionCall3(PGconn *conn, Oid fnid,
 				return pqPrepareAsyncResult(conn);
 		}
 
+		/*
+		 * An error may have been triggered while processing the message, bail
+		 * out
+		 */
+		if (conn->error_result && conn->status == CONNECTION_BAD)
+			return pqPrepareAsyncResult(conn);
+
 		/* Completed parsing this message, keep going */
 		pqParseDone(conn, conn->inStart + 5 + msgLength);
 		needInput = false;
-- 
2.55.0

