Fix a passel of problems with incorrect calls to typinput and typoutput
authorTom Lane
Sat, 15 Jan 2000 22:43:25 +0000 (22:43 +0000)
committerTom Lane
Sat, 15 Jan 2000 22:43:25 +0000 (22:43 +0000)
functions, which would lead to trouble with datatypes that paid attention
to the typelem or typmod parameters to these functions.  In particular,
incorrect code in pg_aggregate.c explains the platform-specific failures
that have been reported in NUMERIC avg().

src/backend/bootstrap/bootstrap.c
src/backend/catalog/pg_aggregate.c
src/backend/commands/vacuum.c
src/backend/utils/adt/arrayfuncs.c
src/backend/utils/adt/ruleutils.c
src/backend/utils/adt/selfuncs.c
src/include/commands/vacuum.h
src/pl/plpgsql/src/pl_comp.c
src/pl/plpgsql/src/pl_exec.c
src/pl/plpgsql/src/plpgsql.h
src/pl/tcl/pltcl.c

index 8e9f125996df6906c18f54cdd9bbde6ee396120c..306b983370bd835267fb59df6a7ca43087965d3f 100644 (file)
@@ -7,7 +7,7 @@
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.77 2000/01/15 02:59:27 petere Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.78 2000/01/15 22:43:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -680,11 +680,10 @@ InsertOneValue(Oid objectid, char *value, int i)
        values[i] = fmgr(ap->am_typ.typinput,
                         value,
                         ap->am_typ.typelem,
-                        -1);   /* shouldn't have char() or varchar()
-                                * types during boostrapping but just to
-                                * be safe */
+                        -1);
        prt = fmgr(ap->am_typ.typoutput, values[i],
-                  ap->am_typ.typelem);
+                  ap->am_typ.typelem,
+                  -1);
        if (!Quiet)
            printf("%s ", prt);
        pfree(prt);
index 7a5377fd033c380b54054046fadc9897382451df..cf338742c9c21df98addd3753f3f682569f302b4 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.27 2000/01/10 17:14:31 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.28 2000/01/15 22:43:21 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -262,7 +262,9 @@ AggNameGetInitVal(char *aggName, Oid basetype, int xfuncno, bool *isNull)
    HeapTuple   tup;
    Relation    aggRel;
    int         initValAttno;
-   Oid         transtype;
+   Oid         transtype,
+               typinput,
+               typelem;
    text       *textInitVal;
    char       *strInitVal,
               *initVal;
@@ -320,7 +322,11 @@ AggNameGetInitVal(char *aggName, Oid basetype, int xfuncno, bool *isNull)
        pfree(strInitVal);
        elog(ERROR, "AggNameGetInitVal: cache lookup failed on aggregate transition function return type");
    }
-   initVal = fmgr(((Form_pg_type) GETSTRUCT(tup))->typinput, strInitVal, -1);
+   typinput = ((Form_pg_type) GETSTRUCT(tup))->typinput;
+   typelem = ((Form_pg_type) GETSTRUCT(tup))->typelem;
+
+   initVal = fmgr(typinput, strInitVal, typelem, -1);
+
    pfree(strInitVal);
    return initVal;
 }
index 7d3a1b6f318e9a21a2a39675e21b5121c1603764..3af6f6b183b6d9f5d104fba61a069444adea2d1a 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.134 2000/01/10 04:09:50 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.135 2000/01/15 22:43:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -516,9 +516,15 @@ vc_vacone(Oid relid, bool analyze, List *va_cols)
                                 ObjectIdGetDatum(stats->attr->atttypid),
                                            0, 0, 0);
            if (HeapTupleIsValid(typetuple))
+           {
                stats->outfunc = ((Form_pg_type) GETSTRUCT(typetuple))->typoutput;
+               stats->typelem = ((Form_pg_type) GETSTRUCT(typetuple))->typelem;
+           }
            else
+           {
                stats->outfunc = InvalidOid;
+               stats->typelem = InvalidOid;
+           }
        }
        vacrelstats->va_natts = attr_cnt;
        /* delete existing pg_statistic rows for relation */
@@ -2488,13 +2494,13 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex,
                    /* hack: this code knows float4 is pass-by-ref */
                    values[i++] = PointerGetDatum(&nullratio);  /* stanullfrac */
                    values[i++] = PointerGetDatum(&bestratio);  /* stacommonfrac */
-                   out_string = (*fmgr_faddr(&out_function)) (stats->best, stats->attr->atttypid, stats->attr->atttypmod);
+                   out_string = (*fmgr_faddr(&out_function)) (stats->best, stats->typelem, stats->attr->atttypmod);
                    values[i++] = PointerGetDatum(textin(out_string)); /* stacommonval */
                    pfree(out_string);
-                   out_string = (*fmgr_faddr(&out_function)) (stats->min, stats->attr->atttypid, stats->attr->atttypmod);
+                   out_string = (*fmgr_faddr(&out_function)) (stats->min, stats->typelem, stats->attr->atttypmod);
                    values[i++] = PointerGetDatum(textin(out_string)); /* staloval */
                    pfree(out_string);
-                   out_string = (char *) (*fmgr_faddr(&out_function)) (stats->max, stats->attr->atttypid, stats->attr->atttypmod);
+                   out_string = (char *) (*fmgr_faddr(&out_function)) (stats->max, stats->typelem, stats->attr->atttypmod);
                    values[i++] = PointerGetDatum(textin(out_string)); /* stahival */
                    pfree(out_string);
 
index 9f04ca482297b6e63c9d57eb7f629baec183e13b..ebf54e8b6237f8944ac4fcab31dcfc96bbd2a00c 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.50 1999/12/09 15:56:16 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.51 2000/01/15 22:43:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -669,21 +669,21 @@ array_out(ArrayType *v, Oid element_type)
            switch (typlen)
            {
                case 1:
-                   values[i] = (*fmgr_faddr(&outputproc)) (*p, typelem);
+                   values[i] = (*fmgr_faddr(&outputproc)) (*p, typelem, -1);
                    break;
                case 2:
-                   values[i] = (*fmgr_faddr(&outputproc)) (*(int16 *) p, typelem);
+                   values[i] = (*fmgr_faddr(&outputproc)) (*(int16 *) p, typelem, -1);
                    break;
                case 3:
                case 4:
-                   values[i] = (*fmgr_faddr(&outputproc)) (*(int32 *) p, typelem);
+                   values[i] = (*fmgr_faddr(&outputproc)) (*(int32 *) p, typelem, -1);
                    break;
            }
            p += typlen;
        }
        else
        {
-           values[i] = (*fmgr_faddr(&outputproc)) (p, typelem);
+           values[i] = (*fmgr_faddr(&outputproc)) (p, typelem, -1);
            if (typlen > 0)
                p += typlen;
            else
index 496fb94ddc921cd3e02924949594b26645eb7167..c4e31491604f556433878f6794fdde7ff162b5f6 100644 (file)
@@ -3,7 +3,7 @@
  *           out of its tuple
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.38 2000/01/15 02:59:38 petere Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.39 2000/01/15 22:43:24 tgl Exp $
  *
  *   This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -1604,7 +1604,6 @@ get_const_expr(Const *constval, deparse_context *context)
    FmgrInfo    finfo_output;
    char       *extval;
    char       *valptr;
-   bool        isnull = FALSE;
 
    typetup = SearchSysCacheTuple(TYPEOID,
                                  ObjectIdGetDatum(constval->consttype),
@@ -1629,7 +1628,8 @@ get_const_expr(Const *constval, deparse_context *context)
 
    fmgr_info(typeStruct->typoutput, &finfo_output);
    extval = (char *) (*fmgr_faddr(&finfo_output)) (constval->constvalue,
-                                                   &isnull, -1);
+                                                   typeStruct->typelem,
+                                                   -1);
 
    switch (constval->consttype)
    {
index b711d768c07f7961fc4eba6daeabfedf0c2ddf9c..7ec3e4dc1b8cd8f798b7ac832964052bdeaf7d67 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.47 2000/01/15 02:59:38 petere Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.48 2000/01/15 22:43:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -600,6 +600,7 @@ getattstatistics(Oid relid, AttrNumber attnum, Oid opid, Oid typid,
    HeapTuple   tuple;
    HeapTuple   typeTuple;
    FmgrInfo    inputproc;
+   Oid         typelem;
 
    rel = heap_openr(StatisticRelationName, AccessShareLock);
 
@@ -630,6 +631,7 @@ getattstatistics(Oid relid, AttrNumber attnum, Oid opid, Oid typid,
        elog(ERROR, "getattstatistics: Cache lookup failed for type %u",
             typid);
    fmgr_info(((Form_pg_type) GETSTRUCT(typeTuple))->typinput, &inputproc);
+   typelem = ((Form_pg_type) GETSTRUCT(typeTuple))->typelem;
 
    /* Values are variable-length fields, so cannot access as struct fields.
     * Must do it the hard way with heap_getattr.
@@ -649,7 +651,7 @@ getattstatistics(Oid relid, AttrNumber attnum, Oid opid, Oid typid,
        {
            char *strval = textout(val);
            *commonval = (Datum)
-               (*fmgr_faddr(&inputproc)) (strval, typid, typmod);
+               (*fmgr_faddr(&inputproc)) (strval, typelem, typmod);
            pfree(strval);
        }
    }
@@ -669,7 +671,7 @@ getattstatistics(Oid relid, AttrNumber attnum, Oid opid, Oid typid,
        {
            char *strval = textout(val);
            *loval = (Datum)
-               (*fmgr_faddr(&inputproc)) (strval, typid, typmod);
+               (*fmgr_faddr(&inputproc)) (strval, typelem, typmod);
            pfree(strval);
        }
    }
@@ -689,7 +691,7 @@ getattstatistics(Oid relid, AttrNumber attnum, Oid opid, Oid typid,
        {
            char *strval = textout(val);
            *hival = (Datum)
-               (*fmgr_faddr(&inputproc)) (strval, typid, typmod);
+               (*fmgr_faddr(&inputproc)) (strval, typelem, typmod);
            pfree(strval);
        }
    }
index 860491797150514732aa4a3142f661f85b9d32ae..aca63898be64468bcddaf99362d9b0cdef31cf53 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: vacuum.h,v 1.24 1999/08/25 12:18:31 ishii Exp $
+ * $Id: vacuum.h,v 1.25 2000/01/15 22:43:23 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -86,6 +86,7 @@ typedef struct
                f_cmpgt;
    Oid         op_cmplt;
    regproc     outfunc;
+   Oid         typelem;
    bool        initialized;
 } VacAttrStats;
 
index 9d509e2c3896d2fe1b4154b0f04c27da8347dfe0..0b88050577358c2d48ff5b2030373e772517707e 100644 (file)
@@ -3,7 +3,7 @@
  *           procedural language
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.15 2000/01/10 17:14:45 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.16 2000/01/15 22:43:25 tgl Exp $
  *
  *   This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -191,6 +191,7 @@ plpgsql_compile(Oid fn_oid, int functype)
            {
                function->fn_retbyval = typeStruct->typbyval;
                function->fn_rettyplen = typeStruct->typlen;
+               function->fn_rettypelem = typeStruct->typelem;
                fmgr_info(typeStruct->typinput, &(function->fn_retinput));
            }
 
@@ -259,6 +260,7 @@ plpgsql_compile(Oid fn_oid, int functype)
                    var->datatype->typname = strdup(nameout(&(typeStruct->typname)));
                    var->datatype->typoid = procStruct->proargtypes[i];
                    fmgr_info(typeStruct->typinput, &(var->datatype->typinput));
+                   var->datatype->typelem = typeStruct->typelem;
                    var->datatype->typbyval = typeStruct->typbyval;
                    var->datatype->atttypmod = -1;
                    var->isconst = true;
@@ -621,6 +623,7 @@ plpgsql_parse_word(char *word)
        typ->typname = strdup(nameout(&(typeStruct->typname)));
        typ->typoid = typeTup->t_data->t_oid;
        fmgr_info(typeStruct->typinput, &(typ->typinput));
+       typ->typelem = typeStruct->typelem;
        typ->typbyval = typeStruct->typbyval;
        typ->atttypmod = -1;
 
@@ -944,6 +947,7 @@ plpgsql_parse_wordtype(char *word)
        typ->typname = strdup(nameout(&(typeStruct->typname)));
        typ->typoid = typeTup->t_data->t_oid;
        fmgr_info(typeStruct->typinput, &(typ->typinput));
+       typ->typelem = typeStruct->typelem;
        typ->typbyval = typeStruct->typbyval;
        typ->atttypmod = -1;
 
@@ -1088,6 +1092,7 @@ plpgsql_parse_dblwordtype(char *string)
    typ->typname = strdup(nameout(&(typeStruct->typname)));
    typ->typoid = typetup->t_data->t_oid;
    fmgr_info(typeStruct->typinput, &(typ->typinput));
+   typ->typelem = typeStruct->typelem;
    typ->typbyval = typeStruct->typbyval;
    typ->atttypmod = attrStruct->atttypmod;
 
@@ -1216,6 +1221,7 @@ plpgsql_parse_wordrowtype(char *string)
        var->datatype->typname = strdup(NameStr(typeStruct->typname));
        var->datatype->typoid = typetup->t_data->t_oid;
        fmgr_info(typeStruct->typinput, &(var->datatype->typinput));
+       var->datatype->typelem = typeStruct->typelem;
        var->datatype->typbyval = typeStruct->typbyval;
        var->datatype->atttypmod = attrStruct->atttypmod;
        var->isconst = false;
index 5c7405a1e40bea008d6d8975fbc2658b8b13d03e..48223ffab7b970f0b354aae128aa6311d05c72d1 100644 (file)
@@ -3,7 +3,7 @@
  *           procedural language
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.16 2000/01/05 18:23:53 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.17 2000/01/15 22:43:25 tgl Exp $
  *
  *   This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -129,7 +129,8 @@ static void exec_move_row(PLpgSQL_execstate * estate,
 static Datum exec_cast_value(Datum value, Oid valtype,
                Oid reqtype,
                FmgrInfo *reqinput,
-               int16 reqtypmod,
+               Oid reqtypelem,
+               int32 reqtypmod,
                bool *isnull);
 static void exec_set_found(PLpgSQL_execstate * estate, bool state);
 
@@ -388,7 +389,10 @@ plpgsql_exec_function(PLpgSQL_function * func,
    if (!estate.retistuple)
    {
        estate.retval = exec_cast_value(estate.retval, estate.rettype,
-                             func->fn_rettype, &(func->fn_retinput), -1,
+                                       func->fn_rettype,
+                                       &(func->fn_retinput),
+                                       func->fn_rettypelem,
+                                       -1,
                                        isNull);
 
        /* ----------
@@ -1160,6 +1164,7 @@ exec_stmt_fori(PLpgSQL_execstate * estate, PLpgSQL_stmt_fori * stmt)
 
    value = exec_cast_value(value, valtype, var->datatype->typoid,
                            &(var->datatype->typinput),
+                           var->datatype->typelem,
                            var->datatype->atttypmod, &isnull);
    if (isnull)
        elog(ERROR, "lower bound of FOR loop cannot be NULL");
@@ -1173,6 +1178,7 @@ exec_stmt_fori(PLpgSQL_execstate * estate, PLpgSQL_stmt_fori * stmt)
    value = exec_eval_expr(estate, stmt->upper, &isnull, &valtype);
    value = exec_cast_value(value, valtype, var->datatype->typoid,
                            &(var->datatype->typinput),
+                           var->datatype->typelem,
                            var->datatype->atttypmod, &isnull);
    if (isnull)
        elog(ERROR, "upper bound of FOR loop cannot be NULL");
@@ -1560,7 +1566,10 @@ exec_stmt_raise(PLpgSQL_execstate * estate, PLpgSQL_stmt_raise * stmt)
                        typeStruct = (Form_pg_type) GETSTRUCT(typetup);
 
                        fmgr_info(typeStruct->typoutput, &finfo_output);
-                       extval = (char *) (*fmgr_faddr(&finfo_output)) (var->value, &(var->isnull), var->datatype->atttypmod);
+                       extval = (char *) (*fmgr_faddr(&finfo_output))
+                           (var->value,
+                            typeStruct->typelem,
+                            var->datatype->atttypmod);
                    }
                    plpgsql_dstring_append(&ds, extval);
                    break;
@@ -1697,7 +1706,8 @@ exec_prepare_plan(PLpgSQL_execstate * estate,
                break;
 
            default:
-               elog(ERROR, "unknown parameter dtype %d in exec_run_select()", estate->datums[expr->params[i]]);
+               elog(ERROR, "unknown parameter dtype %d in exec_run_select()",
+                    estate->datums[expr->params[i]]->dtype);
        }
    }
 
@@ -1873,7 +1883,7 @@ exec_assign_value(PLpgSQL_execstate * estate,
    char       *nulls;
    bool        attisnull;
    Oid         atttype;
-   int       atttypmod;
+   int32       atttypmod;
    HeapTuple   typetup;
    Form_pg_type typeStruct;
    FmgrInfo    finfo_input;
@@ -1888,7 +1898,9 @@ exec_assign_value(PLpgSQL_execstate * estate,
            var = (PLpgSQL_var *) target;
            var->value = exec_cast_value(value, valtype, var->datatype->typoid,
                                         &(var->datatype->typinput),
-                                      var->datatype->atttypmod, isNull);
+                                        var->datatype->typelem,
+                                        var->datatype->atttypmod,
+                                        isNull);
 
            if (isNull && var->notnull)
                elog(ERROR, "NULL assignment to variable '%s' declared NOT NULL", var->refname);
@@ -1967,7 +1979,9 @@ exec_assign_value(PLpgSQL_execstate * estate,
 
                attisnull = *isNull;
                values[i] = exec_cast_value(value, valtype,
-                          atttype, &finfo_input, atttypmod, &attisnull);
+                                           atttype, &finfo_input,
+                                           typeStruct->typelem,
+                                           atttypmod, &attisnull);
                if (attisnull)
                    nulls[i] = 'n';
                else
@@ -2138,7 +2152,8 @@ exec_run_select(PLpgSQL_execstate * estate,
                break;
 
            default:
-               elog(ERROR, "unknown parameter dtype %d in exec_eval_expr()", estate->datums[expr->params[i]]);
+               elog(ERROR, "unknown parameter dtype %d in exec_eval_expr()",
+                    estate->datums[expr->params[i]]->dtype);
        }
    }
    nulls[i] = '\0';
@@ -2372,7 +2387,8 @@ static Datum
 exec_cast_value(Datum value, Oid valtype,
                Oid reqtype,
                FmgrInfo *reqinput,
-               int16 reqtypmod,
+               Oid reqtypelem,
+               int32 reqtypmod,
                bool *isnull)
 {
    if (!*isnull)
@@ -2382,7 +2398,7 @@ exec_cast_value(Datum value, Oid valtype,
         * that of the variable, convert it.
         * ----------
         */
-       if (valtype != reqtype || reqtypmod > 0)
+       if (valtype != reqtype || reqtypmod != -1)
        {
            HeapTuple   typetup;
            Form_pg_type typeStruct;
@@ -2396,8 +2412,14 @@ exec_cast_value(Datum value, Oid valtype,
            typeStruct = (Form_pg_type) GETSTRUCT(typetup);
 
            fmgr_info(typeStruct->typoutput, &finfo_output);
-           extval = (char *) (*fmgr_faddr(&finfo_output)) (value, &isnull, -1);
-           value = (Datum) (*fmgr_faddr(reqinput)) (extval, &isnull, reqtypmod);
+           extval = (char *) (*fmgr_faddr(&finfo_output))
+               (value,
+                typeStruct->typelem,
+                -1);
+           value = (Datum) (*fmgr_faddr(reqinput)) (extval,
+                                                    reqtypelem,
+                                                    reqtypmod);
+           pfree(extval);
        }
    }
 
index e14fd47ecd7f0b9662c65f4679ae6f33ee03e7d9..b698419653fbae755ba95ad26a7f35677a0e112f 100644 (file)
@@ -3,7 +3,7 @@
  *           procedural language
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.6 2000/01/14 01:36:42 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.7 2000/01/15 22:43:25 tgl Exp $
  *
  *   This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -123,8 +123,9 @@ typedef struct
    char       *typname;
    Oid         typoid;
    FmgrInfo    typinput;
+   Oid         typelem;
    bool        typbyval;
-   int16       atttypmod;
+   int32       atttypmod;
 }          PLpgSQL_type;
 
 
@@ -373,6 +374,7 @@ typedef struct PLpgSQL_function
    int         fn_rettyplen;
    bool        fn_retbyval;
    FmgrInfo    fn_retinput;
+   Oid         fn_rettypelem;
    bool        fn_retistuple;
    bool        fn_retset;
 
index cf89817d4549b5d352a88abe2095ea68bc88d065..f693b4f2db34802ed31142158c8e18e1e70c8920 100644 (file)
@@ -3,7 +3,7 @@
  *           procedural language (PL)
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.17 2000/01/10 17:14:46 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.18 2000/01/15 22:43:23 tgl Exp $
  *
  *   This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -65,7 +65,6 @@ typedef struct pltcl_proc_desc
    char       *proname;
    FmgrInfo    result_in_func;
    Oid         result_in_elem;
-   int         result_in_len;
    int         nargs;
    FmgrInfo    arg_out_func[FUNC_MAX_ARGS];
    Oid         arg_out_elem[FUNC_MAX_ARGS];
@@ -501,8 +500,7 @@ pltcl_func_handler(FmgrInfo *proinfo,
        }
 
        fmgr_info(typeStruct->typinput, &(prodesc->result_in_func));
-       prodesc->result_in_elem = (Oid) (typeStruct->typelem);
-       prodesc->result_in_len = typeStruct->typlen;
+       prodesc->result_in_elem = typeStruct->typelem;
 
        /************************************************************
         * Get the required information for output conversion
@@ -721,7 +719,7 @@ pltcl_func_handler(FmgrInfo *proinfo,
    retval = (Datum) (*fmgr_faddr(&prodesc->result_in_func))
        (pltcl_safe_interp->result,
         prodesc->result_in_elem,
-        prodesc->result_in_len);
+        -1);
 
    memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
    return retval;
@@ -1140,10 +1138,7 @@ pltcl_trigger_handler(FmgrInfo *proinfo)
        modvalues[attnum - 1] = (Datum) (*fmgr_faddr(&finfo))
            (ret_values[i++],
             typelem,
-            (!VARLENA_FIXED_SIZE(tupdesc->attrs[attnum - 1]))
-            ? tupdesc->attrs[attnum - 1]->attlen
-            : tupdesc->attrs[attnum - 1]->atttypmod
-           );
+            tupdesc->attrs[attnum - 1]->atttypmod);
    }