mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-03 08:00:21 +08:00
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:
parent
ec96f1dacd
commit
10b5f0bea8
@ -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:
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user