aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>1999-04-20 03:51:19 +0000
committerTom Lane <tgl@sss.pgh.pa.us>1999-04-20 03:51:19 +0000
commit00fbb64bed15f8d9e169decc7a234caef70c0df9 (patch)
tree7cf67de6820dbb973bb723b1e30d7fc6ca2fa1db
parent09c5e84072326c1774bef933c8712906b0f01f85 (diff)
downloadpostgresql-00fbb64bed15f8d9e169decc7a234caef70c0df9.tar.gz
postgresql-00fbb64bed15f8d9e169decc7a234caef70c0df9.zip
Un-break CREATE TYPE. Fix some other inconsistencies in the
pg_proc entries for array I/O routines besides the one detected by the original patcher. Tighten type_sanity regress test accordingly.
-rw-r--r--src/backend/catalog/pg_type.c34
-rw-r--r--src/include/catalog/pg_proc.h10
-rw-r--r--src/test/regress/expected/type_sanity.out4
-rw-r--r--src/test/regress/sql/type_sanity.sql4
4 files changed, 32 insertions, 20 deletions
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index 63c021ad0be..4d108a825ff 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 60289ad8706..76f9bbf8160 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 d09a6525309..25aee300bf2 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 aa175a4ce8f..3250600714e 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,