Re: Increased error verbosity when querying row-returning

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Brendan Jurd <blakjak(at)blakjak(dot)sytes(dot)net>
Cc: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>, pgsql-patches(at)postgresql(dot)org
Subject: Re: Increased error verbosity when querying row-returning
Date: 2005-01-16 20:13:26
Message-ID: 200501162013.j0GKDQH02476@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073

In response to

Browse pgsql-patches by date

  From Date Subject
Next Message Tom Lane 2005-01-16 20:22:11 Re: Much Ado About COUNT(*)
Previous Message Tom Lane 2005-01-16 20:11:37 Re: Much Ado About COUNT(*)