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.

Cheers

BJ


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;
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to