diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index 63c021ad0be7a0eca4cf65903b9a1869d00f46f3..4d108a825ffc3f8b5bc1086da520159c0540685e 100644
--- a/src/backend/catalog/pg_type.c
+++ b/src/backend/catalog/pg_type.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.35 1999/02/13 23:14:59 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.36 1999/04/20 03:51:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -390,11 +390,6 @@ TypeCreate(char *typeName,
 	values[i++] = (Datum) (typeType == 'c' ? relationOid : InvalidOid); /* 9 */
 	values[i++] = (Datum) elementObjectId;		/* 10 */
 
-	/*
-	 * arguments to type input and output functions must be 0
-	 */
-	MemSet(argList, 0, 8 * sizeof(Oid));
-
 	procs[0] = inputProcedure;
 	procs[1] = outputProcedure;
 	procs[2] = (receiveProcedure) ? receiveProcedure : inputProcedure;
@@ -404,6 +399,12 @@ TypeCreate(char *typeName,
 	{
 		procname = procs[j];
 
+		/*
+		 * First look for a 1-argument func with all argtypes 0.
+		 * This is valid for all four kinds of procedure.
+		 */
+		MemSet(argList, 0, 8 * sizeof(Oid));
+
 		tup = SearchSysCacheTuple(PRONAME,
 								  PointerGetDatum(procname),
 								  Int32GetDatum(1),
@@ -412,17 +413,28 @@ TypeCreate(char *typeName,
 
 		if (!HeapTupleIsValid(tup))
 		{
-
 			/*
-			 * it is possible for the input/output procedure to take two
-			 * arguments, where the second argument is the element type
-			 * (eg array_in/array_out)
+			 * For array types, the input procedures may take 3 args
+			 * (data value, element OID, atttypmod); the pg_proc
+			 * argtype signature is 0,0,INT4OID.  The output procedures
+			 * may take 2 args (data value, element OID).
 			 */
 			if (OidIsValid(elementObjectId))
 			{
+				int nargs;
+				if (j % 2)
+				{
+					/* output proc */
+					nargs = 2;
+				} else
+				{
+					/* input proc */
+					nargs = 3;
+					argList[2] = INT4OID;
+				}
 				tup = SearchSysCacheTuple(PRONAME,
 										  PointerGetDatum(procname),
-										  Int32GetDatum(2),
+										  Int32GetDatum(nargs),
 										  PointerGetDatum(argList),
 										  0);
 			}
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 60289ad8706f19e3ea073d1ce0e5601545496b00..76f9bbf816087972e592e86a656a46a2dcddef53 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.95 1999/04/13 17:28:35 momjian Exp $
+ * $Id: pg_proc.h,v 1.96 1999/04/20 03:51:13 tgl Exp $
  *
  * NOTES
  *	  The script catalog/genbki.sh reads this file and generates .bki
@@ -1001,9 +1001,9 @@ DESCR("array");
 DATA(insert OID = 751 (  array_out		   PGUID 11 f t f 2 f 23 "0 0" 100 0 0 100	array_out - ));
 DESCR("array");
 
-DATA(insert OID = 752 (  filename_in	   PGUID 11 f t f 2 f 605 "0" 100 0 0 100  filename_in - ));
+DATA(insert OID = 752 (  filename_in	   PGUID 11 f t f 1 f 605 "0" 100 0 0 100  filename_in - ));
 DESCR("(internal)");
-DATA(insert OID = 753 (  filename_out	   PGUID 11 f t f 2 f 19  "0" 100 0 0 100  filename_out - ));
+DATA(insert OID = 753 (  filename_out	   PGUID 11 f t f 2 f 19  "0 0" 100 0 0 100  filename_out - ));
 DESCR("(internal)");
 
 DATA(insert OID = 760 (  smgrin			   PGUID 11 f t f 1 f 210 "0" 100 0 0 100  smgrin - ));
@@ -1300,11 +1300,11 @@ DATA(insert OID = 1037 (  aclcontains	   PGUID 11 f t f 2 f 16 "1034 1033" 100 0
 DESCR("matches regex., case-sensitive");
 DATA(insert OID = 1038 (  seteval		   PGUID 11 f t f 1 f 23 "26" 100 0 0 100  seteval - ));
 DESCR("");
-DATA(insert OID = 1044 (  bpcharin		   PGUID 11 f t f 3 f 1042 "0" 100 0 0 100	bpcharin - ));
+DATA(insert OID = 1044 (  bpcharin		   PGUID 11 f t f 3 f 1042 "0 0 23" 100 0 0 100	bpcharin - ));
 DESCR("(internal)");
 DATA(insert OID = 1045 (  bpcharout		   PGUID 11 f t f 1 f 23 "0" 100 0 0 100  bpcharout - ));
 DESCR("(internal)");
-DATA(insert OID = 1046 (  varcharin		   PGUID 11 f t f 3 f 1043 "0" 100 0 0 100	varcharin - ));
+DATA(insert OID = 1046 (  varcharin		   PGUID 11 f t f 3 f 1043 "0 0 23" 100 0 0 100	varcharin - ));
 DESCR("(internal)");
 DATA(insert OID = 1047 (  varcharout	   PGUID 11 f t f 1 f 23 "0" 100 0 0 100  varcharout - ));
 DESCR("(internal)");
diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out
index d09a652530934dbd36eb0a1407efa34b59e2db5c..25aee300bf219b8298f8b928fe598b997398b47f 100644
--- a/src/test/regress/expected/type_sanity.out
+++ b/src/test/regress/expected/type_sanity.out
@@ -40,7 +40,7 @@ QUERY: SELECT p1.oid, p1.typname, p2.oid, p2.proname
 FROM pg_type AS p1, pg_proc AS p2
 WHERE p1.typinput = p2.oid AND p1.typtype = 'b' AND
     (p2.pronargs != 1 OR p2.proretset) AND
-    (p2.pronargs < 2 OR p2.pronargs > 3 OR p2.proretset OR p1.typelem = 0);
+    (p2.pronargs != 3 OR p2.proretset OR p1.typelem = 0);
 oid|typname|oid|proname
 ---+-------+---+-------
 (0 rows)
@@ -58,7 +58,7 @@ QUERY: SELECT p1.oid, p1.typname, p2.oid, p2.proname
 FROM pg_type AS p1, pg_proc AS p2
 WHERE p1.typreceive = p2.oid AND p1.typtype = 'b' AND
     (p2.pronargs != 1 OR p2.proretset) AND
-    (p2.pronargs < 2 OR p2.pronargs > 3 OR p2.proretset OR p1.typelem = 0);
+    (p2.pronargs != 3 OR p2.proretset OR p1.typelem = 0);
 oid|typname|oid|proname
 ---+-------+---+-------
 (0 rows)
diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql
index aa175a4ce8f2b4c7b7e2348c93f07716de04f03a..3250600714e5ed89a5c2aa30fb692520e8c834c8 100644
--- a/src/test/regress/sql/type_sanity.sql
+++ b/src/test/regress/sql/type_sanity.sql
@@ -59,7 +59,7 @@ SELECT p1.oid, p1.typname, p2.oid, p2.proname
 FROM pg_type AS p1, pg_proc AS p2
 WHERE p1.typinput = p2.oid AND p1.typtype = 'b' AND
     (p2.pronargs != 1 OR p2.proretset) AND
-    (p2.pronargs < 2 OR p2.pronargs > 3 OR p2.proretset OR p1.typelem = 0);
+    (p2.pronargs != 3 OR p2.proretset OR p1.typelem = 0);
 
 -- Check for bogus typoutput routines
 -- The first OR subclause detects bogus non-array cases,
@@ -83,7 +83,7 @@ SELECT p1.oid, p1.typname, p2.oid, p2.proname
 FROM pg_type AS p1, pg_proc AS p2
 WHERE p1.typreceive = p2.oid AND p1.typtype = 'b' AND
     (p2.pronargs != 1 OR p2.proretset) AND
-    (p2.pronargs < 2 OR p2.pronargs > 3 OR p2.proretset OR p1.typelem = 0);
+    (p2.pronargs != 3 OR p2.proretset OR p1.typelem = 0);
 
 -- Check for bogus typsend routines
 -- The first OR subclause detects bogus non-array cases,