Re: Increased error verbosity when querying row-returning - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: Increased error verbosity when querying row-returning |
Date | |
Msg-id | 200501162013.j0GKDQH02476@candle.pha.pa.us Whole thread Raw |
In response to | Re: Increased error verbosity when querying row-returning (Brendan Jurd <blakjak@blakjak.sytes.net>) |
List | pgsql-patches |
This has been saved for the 8.1 release: http:/momjian.postgresql.org/cgi-bin/pgpatches2 --------------------------------------------------------------------------- Brendan Jurd wrote: > 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; > > ---------------------------(end of broadcast)--------------------------- > TIP 5: Have you checked our extensive FAQ? > > http://www.postgresql.org/docs/faqs/FAQ.html -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
pgsql-patches by date: