Commit 5cb86a26 authored by Fujii Masao's avatar Fujii Masao

postgres_fdw: Fix unexpected reporting of empty message.

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
parent 4cd29285
...@@ -2799,7 +2799,8 @@ dblink_res_error(PGconn *conn, const char *conname, PGresult *res, ...@@ -2799,7 +2799,8 @@ dblink_res_error(PGconn *conn, const char *conname, PGresult *res,
ereport(level, ereport(level,
(errcode(sqlstate), (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"), errmsg("could not obtain message string for remote error"),
message_detail ? errdetail_internal("%s", message_detail) : 0, message_detail ? errdetail_internal("%s", message_detail) : 0,
message_hint ? errhint("%s", message_hint) : 0, message_hint ? errhint("%s", message_hint) : 0,
......
...@@ -805,7 +805,8 @@ pgfdw_report_error(int elevel, PGresult *res, PGconn *conn, ...@@ -805,7 +805,8 @@ pgfdw_report_error(int elevel, PGresult *res, PGconn *conn,
ereport(elevel, ereport(elevel,
(errcode(sqlstate), (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"), errmsg("could not obtain message string for remote error"),
message_detail ? errdetail_internal("%s", message_detail) : 0, message_detail ? errdetail_internal("%s", message_detail) : 0,
message_hint ? errhint("%s", message_hint) : 0, message_hint ? errhint("%s", message_hint) : 0,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment