v4-0002-Add-custom-PQsetNoticeProcessor-handlers-for-dbli.patch
text/x-patch
Filename: v4-0002-Add-custom-PQsetNoticeProcessor-handlers-for-dbli.patch
Type: text/x-patch
Part: 1
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 v4-0002
Subject: Add custom PQsetNoticeProcessor handlers for dblink connection
| File | + | − |
|---|---|---|
| contrib/dblink/dblink.c | 31 | 0 |
From 9a0c0ce671d3860f1611c4ca1ec7cf55ab43e6e4 Mon Sep 17 00:00:00 2001
From: Vignesh C <vignesh21@gmail.com>
Date: Wed, 16 Jul 2025 15:31:54 +0530
Subject: [PATCH v4 2/3] Add custom PQsetNoticeProcessor handlers for dblink
connection
This patch introduces a custom notice processor for libpq-based
connections in dblink connection. The notice processor captures
messages and routes them through ereport(), making them visible
in local logs with a prefix making it easy for diagnosis.
---
contrib/dblink/dblink.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c
index 8a0b112a7ff..30509f9ff32 100644
--- a/contrib/dblink/dblink.c
+++ b/contrib/dblink/dblink.c
@@ -137,6 +137,7 @@ static void appendSCRAMKeysInfo(StringInfo buf);
static bool is_valid_dblink_fdw_option(const PQconninfoOption *options, const char *option,
Oid context);
static bool dblink_connstr_has_required_scram_options(const char *connstr);
+static void notice_processor(void *arg, const char *message);
/* Global */
static remoteConn *pconn = NULL;
@@ -240,6 +241,14 @@ dblink_get_conn(char *conname_or_str,
errmsg("could not establish connection"),
errdetail_internal("%s", msg)));
}
+
+ /*
+ * Set a custom notice processor so that NOTICEs, WARNINGs, and
+ * similar messages from the remote server connection are reported via
+ * ereport(), instead of being printed to stderr.
+ */
+ PQsetNoticeProcessor(conn, notice_processor, NULL);
+
dblink_security_check(conn, NULL, connstr);
if (PQclientEncoding(conn) != GetDatabaseEncoding())
PQsetClientEncoding(conn, GetDatabaseEncodingName());
@@ -338,6 +347,8 @@ dblink_connect(PG_FUNCTION_ARGS)
errdetail_internal("%s", msg)));
}
+ PQsetNoticeProcessor(conn, notice_processor, NULL);
+
/* check password actually used if not superuser */
dblink_security_check(conn, connname, connstr);
@@ -2670,6 +2681,26 @@ dblink_connstr_has_required_scram_options(const char *connstr)
return (has_scram_keys && has_require_auth);
}
+/*
+ * Custom notice processor for remote server connection.
+ */
+static void
+notice_processor(void *arg, const char *message)
+{
+ int len;
+
+ /*
+ * Trim the trailing newline from the message text passed to the notice
+ * processor, as it always includes one, to produce cleaner log output.
+ */
+ len = strlen(message);
+ if (len > 0 && message[len - 1] == '\n')
+ len--;
+
+ ereport(LOG,
+ errmsg("received message from remote server: %.*s", len, message));
+}
+
/*
* We need to make sure that the connection made used credentials
* which were provided by the user, so check what credentials were
--
2.43.0