On Sat, 19 Jul 2025 at 01:39, Álvaro Herrera <alvhe...@kurilemu.de> wrote: > > On 2025-Jul-18, vignesh C wrote: > > > diff --git a/contrib/postgres_fdw/connection.c > > b/contrib/postgres_fdw/connection.c > > index 304f3c20f83..c1ce6f33436 100644 > > --- a/contrib/postgres_fdw/connection.c > > +++ b/contrib/postgres_fdw/connection.c > > @@ -625,6 +625,9 @@ connect_pg_server(ForeignServer *server, UserMapping > > *user) > > server->servername), > > errdetail_internal("%s", > > pchomp(PQerrorMessage(conn))))); > > > > + PQsetNoticeReceiver(conn, libpqsrv_notice_receiver, > > + "received message via > > remote connection"); > > + > > These need to be: > > PQsetNoticeReceiver(conn, libpqsrv_notice_receiver, > gettext_noop("received message via remote > connection")); > > so that the strings are picked up by gettext.
Modified > Also, I don't see why there are three patches here instead of just one. Earlier we thought to commit replication changes function firstlly and then commit dblink and fdw changes, but now that we are using a common notice receiver function. I feel it can be a single patch. Merged the patches. The attached v7 version patch has the changes for the same. Regards, Vignesh
From 5807449c0bca1f9a6a407aebd9958d6ac0c9c902 Mon Sep 17 00:00:00 2001 From: Vignesh C <vignes...@gmail.com> Date: Wed, 16 Jul 2025 15:26:12 +0530 Subject: [PATCH v7] Add custom PQsetNoticeReceiver handlers for replication/fdw/dblink connection This patch introduces a custom notice receiver for replication/fdw/dblink 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. --- contrib/dblink/dblink.c | 7 +++++ contrib/postgres_fdw/connection.c | 3 ++ .../libpqwalreceiver/libpqwalreceiver.c | 3 ++ src/include/libpq/libpq-be-fe-helpers.h | 31 +++++++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 8a0b112a7ff..c459a842fa9 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -240,6 +240,10 @@ dblink_get_conn(char *conname_or_str, errmsg("could not establish connection"), errdetail_internal("%s", msg))); } + + PQsetNoticeReceiver(conn, libpqsrv_notice_receiver, + gettext_noop("received message via remote connection")); + dblink_security_check(conn, NULL, connstr); if (PQclientEncoding(conn) != GetDatabaseEncoding()) PQsetClientEncoding(conn, GetDatabaseEncodingName()); @@ -338,6 +342,9 @@ dblink_connect(PG_FUNCTION_ARGS) errdetail_internal("%s", msg))); } + PQsetNoticeReceiver(conn, libpqsrv_notice_receiver, + gettext_noop("received message via remote connection")); + /* check password actually used if not superuser */ dblink_security_check(conn, connname, connstr); diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index 304f3c20f83..e41d47c3bbd 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -625,6 +625,9 @@ connect_pg_server(ForeignServer *server, UserMapping *user) server->servername), errdetail_internal("%s", pchomp(PQerrorMessage(conn))))); + PQsetNoticeReceiver(conn, libpqsrv_notice_receiver, + gettext_noop("received message via remote connection")); + /* Perform post-connection security checks. */ pgfdw_security_check(keywords, values, user, conn); diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index f7b5d093681..0c75fe064d5 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -232,6 +232,9 @@ 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."))); } + PQsetNoticeReceiver(conn->streamConn, libpqsrv_notice_receiver, + gettext_noop("received message via replication")); + /* * Set always-secure search path for the cases where the connection is * used to run SQL queries, so malicious users can't get control. diff --git a/src/include/libpq/libpq-be-fe-helpers.h b/src/include/libpq/libpq-be-fe-helpers.h index 16205b824fa..a697d6a0f2c 100644 --- a/src/include/libpq/libpq-be-fe-helpers.h +++ b/src/include/libpq/libpq-be-fe-helpers.h @@ -52,6 +52,7 @@ static inline void libpqsrv_connect_prepare(void); static inline void libpqsrv_connect_internal(PGconn *conn, uint32 wait_event_info); static inline PGresult *libpqsrv_get_result_last(PGconn *conn, uint32 wait_event_info); static inline PGresult *libpqsrv_get_result(PGconn *conn, uint32 wait_event_info); +static inline void libpqsrv_notice_receiver(void *arg, const PGresult *res); /* @@ -454,4 +455,34 @@ exit: ; return error; } +/* + * libpqsrv_notice_receiver + * + * Custom notice receiver for libpq connections. + * + * This function is intended to be set via PQsetNoticeReceiver() so that + * NOTICE, WARNING, and similar messages from the connection are reported via + * ereport(), instead of being printed to stderr. + */ +static inline void +libpqsrv_notice_receiver(void *arg, const PGresult *res) +{ + char *message; + int len; + char *prefix = (char *) arg; + + /* + * Trim the trailing newline from the message text returned from + * PQresultErrorMessage(), as it always includes one, to produce cleaner + * log output. + */ + message = PQresultErrorMessage(res); + len = strlen(message); + if (len > 0 && message[len - 1] == '\n') + len--; + + ereport(LOG, + errmsg_internal("%s: %.*s", _(prefix), len, message)); +} + #endif /* LIBPQ_BE_FE_HELPERS_H */ -- 2.43.0