diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 8e9f125996df6906c18f54cdd9bbde6ee396120c..306b983370bd835267fb59df6a7ca43087965d3f 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -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);
diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c
index 7a5377fd033c380b54054046fadc9897382451df..cf338742c9c21df98addd3753f3f682569f302b4 100644
--- a/src/backend/catalog/pg_aggregate.c
+++ b/src/backend/catalog/pg_aggregate.c
@@ -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;
 }
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 7d3a1b6f318e9a21a2a39675e21b5121c1603764..3af6f6b183b6d9f5d104fba61a069444adea2d1a 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -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);
 
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 9f04ca482297b6e63c9d57eb7f629baec183e13b..ebf54e8b6237f8944ac4fcab31dcfc96bbd2a00c 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -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
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 496fb94ddc921cd3e02924949594b26645eb7167..c4e31491604f556433878f6794fdde7ff162b5f6 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -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)
 	{
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index b711d768c07f7961fc4eba6daeabfedf0c2ddf9c..7ec3e4dc1b8cd8f798b7ac832964052bdeaf7d67 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -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);
 		}
 	}
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 860491797150514732aa4a3142f661f85b9d32ae..aca63898be64468bcddaf99362d9b0cdef31cf53 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -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;
 
diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
index 9d509e2c3896d2fe1b4154b0f04c27da8347dfe0..0b88050577358c2d48ff5b2030373e772517707e 100644
--- a/src/pl/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -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;
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 5c7405a1e40bea008d6d8975fbc2658b8b13d03e..48223ffab7b970f0b354aae128aa6311d05c72d1 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -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;
-	int4		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);
 		}
 	}
 
diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h
index e14fd47ecd7f0b9662c65f4679ae6f33ee03e7d9..b698419653fbae755ba95ad26a7f35677a0e112f 100644
--- a/src/pl/plpgsql/src/plpgsql.h
+++ b/src/pl/plpgsql/src/plpgsql.h
@@ -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;
 
diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c
index cf89817d4549b5d352a88abe2095ea68bc88d065..f693b4f2db34802ed31142158c8e18e1e70c8920 100644
--- a/src/pl/tcl/pltcl.c
+++ b/src/pl/tcl/pltcl.c
@@ -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);
 	}