Alvaro Herrera wrote:
On Thu, Jul 07, 2005 at 03:01:46PM +1200, Mark Kirkwood wrote:

Neil Conway wrote:


elog(ERROR) is usually used for "can't happen" errors.

I have attached a little change to varlena.c that uses it. I left the
ereport as it was, but am not fussed about it either way.


I am, because it gives useless messages to the translators to work on.
elog parameters are not marked for translation, ereport are (errmsg and
friends, really).  So please don't do that.


Ok, didn't realize the difference! Revised patch attached that uses elog.

Neil, I will runs some tests to see if there is any performance saving with the first-call-only business.

Cheers

Mark

Index: src/backend/utils/adt/varlena.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/varlena.c,v
retrieving revision 1.125
diff -c -r1.125 varlena.c
*** src/backend/utils/adt/varlena.c     6 Jul 2005 19:02:52 -0000       1.125
--- src/backend/utils/adt/varlena.c     7 Jul 2005 03:40:44 -0000
***************
*** 28,34 ****
  #include "utils/builtins.h"
  #include "utils/lsyscache.h"
  #include "utils/pg_locale.h"
- #include "utils/syscache.h"
  
  
  typedef struct varlena unknown;
--- 28,33 ----
***************
*** 2364,2385 ****
        {
                /* On the first call lookup the datatype of the supplied 
argument */
                Oid                             argtypeid = 
get_fn_expr_argtype(fcinfo->flinfo, 0);
!               HeapTuple               tp;
!               int                             typlen;
  
!               tp = SearchSysCache(TYPEOID,
!                                                       
ObjectIdGetDatum(argtypeid),
!                                                       0, 0, 0);
!               if (!HeapTupleIsValid(tp))
                {
                        /* Oid not in pg_type, should never happen. */
!                       ereport(ERROR,
!                                       (errcode(ERRCODE_INTERNAL_ERROR),
!                                        errmsg("invalid typid: %u", 
argtypeid)));
                }
!               
!               typlen = ((Form_pg_type)GETSTRUCT(tp))->typlen;
!               ReleaseSysCache(tp);
                fcinfo->flinfo->fn_extra = 
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
                                                                                
                          sizeof(int));
                *(int *)fcinfo->flinfo->fn_extra = typlen;
--- 2363,2377 ----
        {
                /* On the first call lookup the datatype of the supplied 
argument */
                Oid                             argtypeid = 
get_fn_expr_argtype(fcinfo->flinfo, 0);
!               int                             typlen    = 
get_typlen(argtypeid);
  
!               
!               if (typlen == 0)
                {
                        /* Oid not in pg_type, should never happen. */
!                       elog(ERROR, "cache lookup failed for type %u", 
argtypeid);
                }
! 
                fcinfo->flinfo->fn_extra = 
MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
                                                                                
                          sizeof(int));
                *(int *)fcinfo->flinfo->fn_extra = typlen;

---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to