This patch to src/backend/executor/nodeFunctionscan.c is intended to
make life a little easier for people using row-returning functions, by
increasing the level of detail in the error messages thrown when
tupledesc_match fails.
Cheers
BJ
Index: src/backend/executor/nodeFunctionscan.c
===
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeFunctionscan.c,v
retrieving revision 1.29
diff -c -r1.29 nodeFunctionscan.c
*** src/backend/executor/nodeFunctionscan.c 31 Dec 2004 21:59:45 -
1.29
--- src/backend/executor/nodeFunctionscan.c 11 Jan 2005 22:17:16 -
***
*** 87,96
* need to do this for functions returning RECORD, but might as
* well do it always.
*/
! if (funcTupdesc !tupledesc_match(node-tupdesc, funcTupdesc))
! ereport(ERROR,
! (errcode(ERRCODE_DATATYPE_MISMATCH),
!errmsg(query-specified return row and
actual function return row do not match)));
}
/*
--- 87,94
* need to do this for functions returning RECORD, but might as
* well do it always.
*/
! if( funcTupdesc )
! tupledesc_match(node-tupdesc, funcTupdesc);
}
/*
***
*** 363,369
--- 361,373
int i;
if (dst_tupdesc-natts != src_tupdesc-natts)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+errmsg(function return row and query-specified return
row do not match),
+errdetail(function-returned row contains %d
attributes, but query expects %d., src_tupdesc-natts, dst_tupdesc-natts)));
return false;
+ }
for (i = 0; i dst_tupdesc-natts; i++)
{
***
*** 373,382
--- 377,401
if (dattr-atttypid == sattr-atttypid)
continue; /* no worries */
if (!dattr-attisdropped)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+errmsg(function return row and
query-specified return row do not match),
+errdetail(function returned type %s at
ordinal position %d, but query expects %s.,
+format_type_be(sattr-atttypid),
+i+1,
+format_type_be(dattr-atttypid;
return false;
+ }
if (dattr-attlen != sattr-attlen ||
dattr-attalign != sattr-attalign)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+errmsg(function return row and
query-specified return row do not match),
+errdetail(physical storage mismatch on
dropped attribute at ordinal position %d., i+1)));
return false;
+ }
}
return true;
---(end of broadcast)---
TIP 8: explain analyze is your friend