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