diff options
Diffstat (limited to 'contrib/dblink/dblink.c')
-rw-r--r-- | contrib/dblink/dblink.c | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 35641c2e21e..7e98987dad8 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -8,7 +8,7 @@ * Darko Prenosil <Darko.Prenosil@finteh.hr> * Shridhar Daithankar <shridhar_daithankar@persistent.co.in> * - * Copyright (c) 2001-2005, PostgreSQL Global Development Group + * Copyright (c) 2001-2006, PostgreSQL Global Development Group * ALL RIGHTS RESERVED; * * Permission to use, copy, modify, and distribute this software and its @@ -578,14 +578,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) - { - if (res) - PQclear(res); - SRF_RETURN_DONE(funcctx); - } - /* get a tuple descriptor for our result type */ switch (get_call_result_type(fcinfo, NULL, &tupdesc)) { @@ -608,6 +600,21 @@ dblink_fetch(PG_FUNCTION_ARGS) /* make sure we have a persistent copy of the tupdesc */ tupdesc = CreateTupleDescCopy(tupdesc); + /* check result and tuple descriptor have the same number of columns */ + if (PQnfields(res) != tupdesc->natts) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("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); + } + /* store needed metadata for subsequent calls */ attinmeta = TupleDescGetAttInMetadata(tupdesc); funcctx->attinmeta = attinmeta; @@ -777,14 +784,6 @@ dblink_record(PG_FUNCTION_ARGS) if (freeconn) PQfinish(conn); - /* fast track when no results */ - if (funcctx->max_calls < 1) - { - if (res) - PQclear(res); - SRF_RETURN_DONE(funcctx); - } - if (!is_sql_cmd) { /* get a tuple descriptor for our result type */ @@ -810,6 +809,21 @@ dblink_record(PG_FUNCTION_ARGS) tupdesc = CreateTupleDescCopy(tupdesc); } + /* check result and tuple descriptor have the same number of columns */ + if (PQnfields(res) != tupdesc->natts) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("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); + } + /* store needed metadata for subsequent calls */ attinmeta = TupleDescGetAttInMetadata(tupdesc); funcctx->attinmeta = attinmeta; |