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  (Brendan Jurd <blakjak@blakjak.sytes.net>)
Re: Increased error verbosity when querying row-returning  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: Increased error verbosity when querying row-returning  (Neil Conway <neilc@samurai.com>)
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:

Previous
From: Alvaro Herrera
Date:
Subject: Re: Increased error verbosity when querying row-returning functions
Next
From: "John Hansen"
Date:
Subject: RULES doesn't work as expected