]> granicus.if.org Git - postgresql/commitdiff
Fix dblink's failure to report correct connection name in error messages.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 29 Mar 2012 21:52:28 +0000 (17:52 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 29 Mar 2012 21:52:28 +0000 (17:52 -0400)
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.

contrib/dblink/dblink.c
contrib/dblink/expected/dblink.out

index 36a8e3eceb93460ece97872ab5d6e4e2e35ed00b..df1ff05a8fe339f88771d8d5ae803049ed0706a1 100644 (file)
@@ -153,9 +153,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 \
                        { \
@@ -183,9 +184,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; \
@@ -598,6 +599,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;
@@ -919,6 +921,7 @@ PG_FUNCTION_INFO_V1(dblink_is_busy);
 Datum
 dblink_is_busy(PG_FUNCTION_ARGS)
 {
+       char       *conname = NULL;
        PGconn     *conn = NULL;
        remoteConn *rconn = NULL;
 
@@ -945,6 +948,7 @@ Datum
 dblink_cancel_query(PG_FUNCTION_ARGS)
 {
        int                     res = 0;
+       char       *conname = NULL;
        PGconn     *conn = NULL;
        remoteConn *rconn = NULL;
        PGcancel   *cancel;
@@ -979,6 +983,7 @@ Datum
 dblink_error_message(PG_FUNCTION_ARGS)
 {
        char       *msg;
+       char       *conname = NULL;
        PGconn     *conn = NULL;
        remoteConn *rconn = NULL;
 
@@ -1488,6 +1493,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;
index 511dd5efcfbe1fc6bb663a3bcf1525530df69d88..1db153aeb1af861d776530d44b43b7d1ea05b4f9 100644 (file)
@@ -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