v5-0001-Add-custom-PQsetNoticeReceiver-handlers-for-repli.patch
text/x-patch
Filename: v5-0001-Add-custom-PQsetNoticeReceiver-handlers-for-repli.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v5-0001
Subject: Add custom PQsetNoticeReceiver handlers for replication connection
| File | + | − |
|---|---|---|
| src/backend/replication/libpqwalreceiver/libpqwalreceiver.c | 30 | 0 |
From 8a0d5392f482572ebd57a6eae30c715c81b31963 Mon Sep 17 00:00:00 2001
From: Vignesh C <vignesh21@gmail.com>
Date: Wed, 16 Jul 2025 15:26:12 +0530
Subject: [PATCH v5 1/3] Add custom PQsetNoticeReceiver handlers for
replication connection
This patch introduces a custom notice receiver for replication
connections. The notice receiver captures messages and routes
them through ereport(), making them visible in local logs with
a prefix making it easy for diagnosis.
---
.../libpqwalreceiver/libpqwalreceiver.c | 30 +++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
index f7b5d093681..7d1031139ac 100644
--- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
+++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
@@ -114,6 +114,7 @@ static WalReceiverFunctionsType PQWalReceiverFunctions = {
};
/* Prototypes for private functions */
+static void notice_receiver(void *arg, const PGresult *result);
static char *stringlist_to_identifierstr(PGconn *conn, List *strings);
/*
@@ -232,6 +233,13 @@ libpqrcv_connect(const char *conninfo, bool replication, bool logical,
errhint("Target server's authentication method must be changed, or set password_required=false in the subscription parameters.")));
}
+ /*
+ * Set a custom notice receiver so that NOTICEs, WARNINGs, and similar
+ * messages from the replication connection are reported via ereport(),
+ * instead of being printed to stderr.
+ */
+ PQsetNoticeReceiver(conn->streamConn, notice_receiver, NULL);
+
/*
* Set always-secure search path for the cases where the connection is
* used to run SQL queries, so malicious users can't get control.
@@ -1195,6 +1203,28 @@ libpqrcv_exec(WalReceiverConn *conn, const char *query,
return walres;
}
+/*
+ * Custom notice receiver for replication connection.
+ */
+static void
+notice_receiver(void *arg, const PGresult *result)
+{
+ char *message;
+ int len;
+
+ /*
+ * Trim the trailing newline from the message text passed to the notice
+ * receiver, as it always includes one, to produce cleaner log output.
+ */
+ message = PQresultErrorMessage(result);
+ len = strlen(message);
+ if (len > 0 && message[len - 1] == '\n')
+ len--;
+
+ ereport(LOG,
+ errmsg("received message via replication: %.*s", len, message));
+}
+
/*
* Given a List of strings, return it as single comma separated
* string, quoting identifiers as needed.
--
2.43.0