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 -0000 1.29 --- src/backend/executor/nodeFunctionscan.c 11 Jan 2005 22:17:16 -0000 *************** *** 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;