1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-02 09:02:37 +03:00

When the remote query result has a different number of columns

than the local query specifies (e.g. in the FROM clause),
throw an ERROR (instead of crashing). Fix for bug #2129 reported
by Akio Iwaasa.
This commit is contained in:
Joe Conway
2006-01-03 23:48:42 +00:00
parent a74dc12416
commit 4e0f51f13d
2 changed files with 35 additions and 8 deletions

View File

@ -315,10 +315,6 @@ dblink_fetch(PG_FUNCTION_ARGS)
/* got results, keep track of them */
funcctx->user_fctx = res;
/* fast track when no results */
if (funcctx->max_calls < 1)
SRF_RETURN_DONE(funcctx);
/* check typtype to see if we have a predetermined return type */
functypeid = get_func_rettype(funcid);
functyptype = get_typtype(functypeid);
@ -342,6 +338,20 @@ dblink_fetch(PG_FUNCTION_ARGS)
/* store needed metadata for subsequent calls */
slot = TupleDescGetSlot(tupdesc);
funcctx->slot = slot;
/* check result and tuple descriptor have the same number of columns */
if (PQnfields(res) != tupdesc->natts)
elog(ERROR, "remote query result rowtype does not match "
"the specified FROM clause rowtype");
/* fast track when no results */
if (funcctx->max_calls < 1)
{
if (res)
PQclear(res);
SRF_RETURN_DONE(funcctx);
}
attinmeta = TupleDescGetAttInMetadata(tupdesc);
funcctx->attinmeta = attinmeta;
@ -500,10 +510,6 @@ dblink_record(PG_FUNCTION_ARGS)
PQfinish(conn);
}
/* fast track when no results */
if (funcctx->max_calls < 1)
SRF_RETURN_DONE(funcctx);
/* check typtype to see if we have a predetermined return type */
functypeid = get_func_rettype(funcid);
functyptype = get_typtype(functypeid);
@ -530,6 +536,20 @@ dblink_record(PG_FUNCTION_ARGS)
/* store needed metadata for subsequent calls */
slot = TupleDescGetSlot(tupdesc);
funcctx->slot = slot;
/* check result and tuple descriptor have the same number of columns */
if (PQnfields(res) != tupdesc->natts)
elog(ERROR, "remote query result rowtype does not match "
"the specified FROM clause rowtype");
/* fast track when no results */
if (funcctx->max_calls < 1)
{
if (res)
PQclear(res);
SRF_RETURN_DONE(funcctx);
}
attinmeta = TupleDescGetAttInMetadata(tupdesc);
funcctx->attinmeta = attinmeta;

View File

@ -69,6 +69,13 @@ Outputs
Returns setof record
Note
On a mismatch between the number of return fields as specified in the FROM
clause, and the actual number of fields returned by the remote cursor, an
ERROR will be thrown. In this event, the remote cursor is still advanced
by as many rows as it would have been if the ERROR had not occurred.
Example usage
test=# select dblink_connect('dbname=template1');