Here's a small patch for dblink:

- fixed dblink invalid pointer causing corrupt elog message
   - fixed dblink_tok improper handling of null results
   - fixed examples in README.dblink

Joe Conway
This commit is contained in:
Bruce Momjian 2001-06-18 19:09:50 +00:00
parent ec96f1dacd
commit 10b5f0bea8
2 changed files with 34 additions and 20 deletions

View file

@ -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 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 Tested under Linux (Red Hat 6.2 and 7.0) and PostgreSQL 7.1 and 7.2devel
Release Notes: 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 Version 0.2
- initial release - 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' 'hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd'
,'select f1, f2 from mytable' ,'select f1, f2 from mytable'
) as dblink_p ) as dblink_p
union union all
select null,null where false select null where false
) as t1 ) as t1
where 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 in order to work around an issue with the query optimizer. A more convenient way to approach
this problem is to create a view: 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' 'hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd'
,'select f1, f2 from mytable' ,'select f1, f2 from mytable'
) as dblink_p ) as dblink_p
union union all
select null,null where false select null where false
) as t1; ) as t1;
Then you can simply write: Then you can simply write:

View file

@ -57,7 +57,7 @@ dblink(PG_FUNCTION_ARGS)
conn = PQconnectdb(optstr); conn = PQconnectdb(optstr);
if (PQstatus(conn) == CONNECTION_BAD) if (PQstatus(conn) == CONNECTION_BAD)
{ {
msg = PQerrorMessage(conn); msg = pstrdup(PQerrorMessage(conn));
PQfinish(conn); PQfinish(conn);
elog(ERROR, "dblink: connection error: %s", msg); elog(ERROR, "dblink: connection error: %s", msg);
} }
@ -65,7 +65,7 @@ dblink(PG_FUNCTION_ARGS)
res = PQexec(conn, "BEGIN"); res = PQexec(conn, "BEGIN");
if (PQresultStatus(res) != PGRES_COMMAND_OK) if (PQresultStatus(res) != PGRES_COMMAND_OK)
{ {
msg = PQerrorMessage(conn); msg = pstrdup(PQerrorMessage(conn));
PQclear(res); PQclear(res);
PQfinish(conn); PQfinish(conn);
elog(ERROR, "dblink: begin error: %s", msg); elog(ERROR, "dblink: begin error: %s", msg);
@ -84,7 +84,7 @@ dblink(PG_FUNCTION_ARGS)
res = PQexec(conn, execstatement); res = PQexec(conn, execstatement);
if (!res || (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) != PGRES_TUPLES_OK)) if (!res || (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) != PGRES_TUPLES_OK))
{ {
msg = PQerrorMessage(conn); msg = pstrdup(PQerrorMessage(conn));
PQclear(res); PQclear(res);
PQfinish(conn); PQfinish(conn);
elog(ERROR, "dblink: sql error: %s", msg); elog(ERROR, "dblink: sql error: %s", msg);
@ -96,7 +96,7 @@ dblink(PG_FUNCTION_ARGS)
res = PQexec(conn, "FETCH ALL in mycursor"); res = PQexec(conn, "FETCH ALL in mycursor");
if (!res || PQresultStatus(res) != PGRES_TUPLES_OK) { if (!res || PQresultStatus(res) != PGRES_TUPLES_OK) {
msg = PQerrorMessage(conn); msg = pstrdup(PQerrorMessage(conn));
PQclear(res); PQclear(res);
PQfinish(conn); PQfinish(conn);
elog(ERROR, "dblink: sql error: %s", msg); 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); 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 { } 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);
} }