aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-03-29 17:52:33 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2012-03-29 17:52:33 -0400
commitdde1813dff577991a71bd3beedb333cd2ad2559f (patch)
tree2018cbf7a51b62eb87ab07e9bc72b6f52a241f5e
parent20d98ab6e4110087d1816cd105a40fcc8ce0a307 (diff)
downloadpostgresql-dde1813dff577991a71bd3beedb333cd2ad2559f.tar.gz
postgresql-dde1813dff577991a71bd3beedb333cd2ad2559f.zip
Fix dblink's failure to report correct connection name in error messages.
The DBLINK_GET_CONN and DBLINK_GET_NAMED_CONN macros did not set the surrounding function's conname variable, causing errors to be incorrectly reported as having occurred on the "unnamed" connection in some cases. This bug was actually visible in two cases in the regression tests, but apparently whoever added those cases wasn't paying attention. Noted by Kyotaro Horiguchi, though this is different from his proposed patch. Back-patch to 8.4; 8.3 does not have the same type of error reporting so the patch is not relevant.
-rw-r--r--contrib/dblink/dblink.c12
-rw-r--r--contrib/dblink/expected/dblink.out4
2 files changed, 11 insertions, 5 deletions
diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c
index 0812a3b2b56..98a1cc055f1 100644
--- a/contrib/dblink/dblink.c
+++ b/contrib/dblink/dblink.c
@@ -167,9 +167,10 @@ typedef struct remoteConnHashEnt
do { \
char *conname_or_str = text_to_cstring(PG_GETARG_TEXT_PP(0)); \
rconn = getConnectionByName(conname_or_str); \
- if(rconn) \
+ if (rconn) \
{ \
conn = rconn->conn; \
+ conname = conname_or_str; \
} \
else \
{ \
@@ -197,9 +198,9 @@ typedef struct remoteConnHashEnt
#define DBLINK_GET_NAMED_CONN \
do { \
- char *conname = text_to_cstring(PG_GETARG_TEXT_PP(0)); \
+ conname = text_to_cstring(PG_GETARG_TEXT_PP(0)); \
rconn = getConnectionByName(conname); \
- if(rconn) \
+ if (rconn) \
conn = rconn->conn; \
else \
DBLINK_CONN_NOT_AVAIL; \
@@ -612,6 +613,7 @@ PG_FUNCTION_INFO_V1(dblink_send_query);
Datum
dblink_send_query(PG_FUNCTION_ARGS)
{
+ char *conname = NULL;
PGconn *conn = NULL;
char *sql = NULL;
remoteConn *rconn = NULL;
@@ -933,6 +935,7 @@ PG_FUNCTION_INFO_V1(dblink_is_busy);
Datum
dblink_is_busy(PG_FUNCTION_ARGS)
{
+ char *conname = NULL;
PGconn *conn = NULL;
remoteConn *rconn = NULL;
@@ -959,6 +962,7 @@ Datum
dblink_cancel_query(PG_FUNCTION_ARGS)
{
int res = 0;
+ char *conname = NULL;
PGconn *conn = NULL;
remoteConn *rconn = NULL;
PGcancel *cancel;
@@ -993,6 +997,7 @@ Datum
dblink_error_message(PG_FUNCTION_ARGS)
{
char *msg;
+ char *conname = NULL;
PGconn *conn = NULL;
remoteConn *rconn = NULL;
@@ -1502,6 +1507,7 @@ PG_FUNCTION_INFO_V1(dblink_get_notify);
Datum
dblink_get_notify(PG_FUNCTION_ARGS)
{
+ char *conname = NULL;
PGconn *conn = NULL;
remoteConn *rconn = NULL;
PGnotify *notify;
diff --git a/contrib/dblink/expected/dblink.out b/contrib/dblink/expected/dblink.out
index 511dd5efcfb..1db153aeb1a 100644
--- a/contrib/dblink/expected/dblink.out
+++ b/contrib/dblink/expected/dblink.out
@@ -371,7 +371,7 @@ SELECT *
FROM dblink('myconn','SELECT * FROM foobar',false) AS t(a int, b text, c text[])
WHERE t.a > 7;
NOTICE: relation "foobar" does not exist
-CONTEXT: Error occurred on dblink connection named "unnamed": could not execute query.
+CONTEXT: Error occurred on dblink connection named "myconn": could not execute query.
a | b | c
---+---+---
(0 rows)
@@ -494,7 +494,7 @@ SELECT dblink_close('myconn','rmt_foo_cursor');
-- this should fail because there is no open transaction
SELECT dblink_exec('myconn','DECLARE xact_test CURSOR FOR SELECT * FROM foo');
ERROR: DECLARE CURSOR can only be used in transaction blocks
-CONTEXT: Error occurred on dblink connection named "unnamed": could not execute command.
+CONTEXT: Error occurred on dblink connection named "myconn": could not execute command.
-- reset remote transaction state
SELECT dblink_exec('myconn','ABORT');
dblink_exec