Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
postgres_fdw: Fix unexpected reporting of empty message.
authorFujii Masao <fujii@postgresql.org>
Fri, 3 Dec 2021 08:35:29 +0000 (17:35 +0900)
committerFujii Masao <fujii@postgresql.org>
Fri, 3 Dec 2021 08:37:19 +0000 (17:37 +0900)
pgfdw_report_error() in postgres_fdw gets a message from PGresult or
PGconn to report an error received from a remote server. Previously
if it could get a message from neither of them, it reported empty
message unexpectedly. The cause of this issue was that pgfdw_report_error()
didn't handle properly the case where no message could be obtained
and its local variable message_primary was set to '\0'.

This commit improves pgfdw_report_error() so that it reports the message
"could not obtain ..." when it gets no message and message_primary
is set to '\0'. This is the same behavior as when message_primary is NULL.

dblink_res_error() in dblink has the same issue, so this commit also
improves it in the same way.

Back-patch to all supported branches.

Author: Fujii Masao
Reviewed-by: Bharath Rupireddy
Discussion: https://postgr.es/m/477c16c8-7ea4-20fc-38d5-ed3a77ed616c@oss.nttdata.com

contrib/dblink/dblink.c
contrib/postgres_fdw/connection.c

index 5381976a92bc2b93503856169f3630a20d8cb73d..aa94e89170afcab7c65861f5e03a9efb879abfa8 100644 (file)
@@ -2757,7 +2757,8 @@ dblink_res_error(PGconn *conn, const char *conname, PGresult *res,
 
    ereport(level,
            (errcode(sqlstate),
-            message_primary ? errmsg_internal("%s", message_primary) :
+            (message_primary != NULL && message_primary[0] != '\0') ?
+            errmsg_internal("%s", message_primary) :
             errmsg("could not obtain message string for remote error"),
             message_detail ? errdetail_internal("%s", message_detail) : 0,
             message_hint ? errhint("%s", message_hint) : 0,
index 283e2f8b652aee5a78e196c37a69059c86f3d878..f36871da9ad8ef1f3ac1f93f5472c027ccbc5059 100644 (file)
@@ -626,7 +626,8 @@ pgfdw_report_error(int elevel, PGresult *res, PGconn *conn,
 
        ereport(elevel,
                (errcode(sqlstate),
-                message_primary ? errmsg_internal("%s", message_primary) :
+                (message_primary != NULL && message_primary[0] != '\0') ?
+                errmsg_internal("%s", message_primary) :
                 errmsg("could not obtain message string for remote error"),
                 message_detail ? errdetail_internal("%s", message_detail) : 0,
                 message_hint ? errhint("%s", message_hint) : 0,