Patch applied. Thanks.
---------------------------------------------------------------------------
Mark Kirkwood wrote:
> 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;
>
--
Bruce Momjian | http://candle.pha.pa.us
[email protected] | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend