Re: Increased error verbosity when querying row-returning - Mailing list pgsql-patches
From | Brendan Jurd |
---|---|
Subject | Re: Increased error verbosity when querying row-returning |
Date | |
Msg-id | 41E4C503.3070509@blakjak.sytes.net Whole thread Raw |
In response to | Re: Increased error verbosity when querying row-returning functions (Alvaro Herrera <alvherre@dcc.uchile.cl>) |
Responses |
Re: Increased error verbosity when querying row-returning
Re: Increased error verbosity when querying row-returning Re: Increased error verbosity when querying row-returning |
List | pgsql-patches |
Alvaro Herrera wrote: >On Wed, Jan 12, 2005 at 09:23:26AM +1100, Brendan Jurd wrote: > > >>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. >> >> > >You should get rid of the returns, because ereport(ERROR) will never >return control to the function and they are thus dead code. And make >the function return void rather than bool. > >Also follow the style: use "if (foo)" rather than "if( foo )". And >message style stipulates that the errdetail() message should start with >a capital (upper case?) letter. > > > Thanks Alvaro, changes made and new patch attached. 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 12 Jan 2005 06:36:53 -0000 *************** *** 36,42 **** static TupleTableSlot *FunctionNext(FunctionScanState *node); ! static bool tupledesc_match(TupleDesc dst_tupdesc, TupleDesc src_tupdesc); /* ---------------------------------------------------------------- * Scan Support --- 36,42 ---- static TupleTableSlot *FunctionNext(FunctionScanState *node); ! static void tupledesc_match(TupleDesc dst_tupdesc, TupleDesc src_tupdesc); /* ---------------------------------------------------------------- * Scan Support *************** *** 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); } /* *************** *** 357,369 **** * destination type, so long as the physical storage matches. This is * helpful in some cases involving out-of-date cached plans. */ ! static bool tupledesc_match(TupleDesc dst_tupdesc, TupleDesc src_tupdesc) { int i; if (dst_tupdesc->natts != src_tupdesc->natts) ! return false; for (i = 0; i < dst_tupdesc->natts; i++) { --- 355,370 ---- * destination type, so long as the physical storage matches. This is * helpful in some cases involving out-of-date cached plans. */ ! static void tupledesc_match(TupleDesc dst_tupdesc, TupleDesc src_tupdesc) { 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))); for (i = 0; i < dst_tupdesc->natts; i++) { *************** *** 373,382 **** if (dattr->atttypid == sattr->atttypid) continue; /* no worries */ if (!dattr->attisdropped) ! return false; if (dattr->attlen != sattr->attlen || dattr->attalign != sattr->attalign) ! return false; } return true; --- 374,393 ---- 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)))); ! 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 true;
pgsql-patches by date: