diff --git a/contrib/dblink/README.dblink b/contrib/dblink/README.dblink index 04219b7be2..c56720d2fb 100644 --- a/contrib/dblink/README.dblink +++ b/contrib/dblink/README.dblink @@ -24,12 +24,18 @@ * */ -Version 0.2 (29 May, 2001): + +Version 0.3 (14 June, 2001): Function to test returning data set from remote database Tested under Linux (Red Hat 6.2 and 7.0) and PostgreSQL 7.1 and 7.2devel Release Notes: + Version 0.3 + - fixed dblink invalid pointer causing corrupt elog message + - fixed dblink_tok improper handling of null results + - fixed examples in README.dblink + Version 0.2 - initial release @@ -124,11 +130,11 @@ to 'fake' a UNION, e.g. 'hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd' ,'select f1, f2 from mytable' ) as dblink_p - union - select null,null where false + union all + select null where false ) as t1 where - f1 = 'mycriteria'; + dblink_tok(t1.dblink_p,0) = 'mycriteria'; in order to work around an issue with the query optimizer. A more convenient way to approach this problem is to create a view: @@ -143,8 +149,8 @@ this problem is to create a view: 'hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd' ,'select f1, f2 from mytable' ) as dblink_p - union - select null,null where false + union all + select null where false ) as t1; Then you can simply write: diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index b3c9c6cbbf..d457a76cbf 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -57,7 +57,7 @@ dblink(PG_FUNCTION_ARGS) conn = PQconnectdb(optstr); if (PQstatus(conn) == CONNECTION_BAD) { - msg = PQerrorMessage(conn); + msg = pstrdup(PQerrorMessage(conn)); PQfinish(conn); elog(ERROR, "dblink: connection error: %s", msg); } @@ -65,7 +65,7 @@ dblink(PG_FUNCTION_ARGS) res = PQexec(conn, "BEGIN"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { - msg = PQerrorMessage(conn); + msg = pstrdup(PQerrorMessage(conn)); PQclear(res); PQfinish(conn); elog(ERROR, "dblink: begin error: %s", msg); @@ -84,7 +84,7 @@ dblink(PG_FUNCTION_ARGS) res = PQexec(conn, execstatement); if (!res || (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) != PGRES_TUPLES_OK)) { - msg = PQerrorMessage(conn); + msg = pstrdup(PQerrorMessage(conn)); PQclear(res); PQfinish(conn); elog(ERROR, "dblink: sql error: %s", msg); @@ -96,7 +96,7 @@ dblink(PG_FUNCTION_ARGS) res = PQexec(conn, "FETCH ALL in mycursor"); if (!res || PQresultStatus(res) != PGRES_TUPLES_OK) { - msg = PQerrorMessage(conn); + msg = pstrdup(PQerrorMessage(conn)); PQclear(res); PQfinish(conn); elog(ERROR, "dblink: sql error: %s", msg); @@ -230,20 +230,28 @@ dblink_tok(PG_FUNCTION_ARGS) elog(ERROR, "dblink: field number %d does not exist", fldnum); } - text_len = PQgetlength(results->res, results->tup_num, fldnum); + if (PQgetisnull(results->res, results->tup_num, fldnum) == 1) { - result = (char *) palloc(text_len + 1); + PG_RETURN_NULL(); - if (result != NULL) { - strcpy(result, PQgetvalue(results->res, results->tup_num, fldnum)); - strcat(result, "\0"); } else { - elog(ERROR, "dblink: insufficient memory" ); + + text_len = PQgetlength(results->res, results->tup_num, fldnum); + + result = (char *) palloc(text_len + 1); + + if (result != NULL) { + strcpy(result, PQgetvalue(results->res, results->tup_num, fldnum)); + strcat(result, "\0"); + } else { + elog(ERROR, "dblink: insufficient memory" ); + } + + result_text = DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(result))); + + PG_RETURN_TEXT_P(result_text); + } - - result_text = DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(result))); - - PG_RETURN_TEXT_P(result_text); }