Forgot to handle 'opaque' function arguments in regprocedurein/out.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 11 May 2002 00:24:16 +0000 (00:24 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 11 May 2002 00:24:16 +0000 (00:24 +0000)
src/backend/utils/adt/regproc.c

index ac5a7fc84d1e01d8afcf77c3116cbc0ba9f7db90..f9de2677969d9a8a506f2f80a49642c52d4c5744 100644 (file)
@@ -13,7 +13,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.67 2002/05/01 23:06:41 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.68 2002/05/11 00:24:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -40,7 +40,7 @@
 
 static List *stringToQualifiedNameList(const char *string, const char *caller);
 static void parseNameAndArgTypes(const char *string, const char *caller,
-                                                                bool allow_none,
+                                                                const char *type0_spelling,
                                                                 List **names, int *nargs, Oid *argtypes);
 
 
@@ -261,7 +261,7 @@ regprocedurein(PG_FUNCTION_ARGS)
         * datatype cannot be used for any system column that needs to receive
         * data during bootstrap.
         */
-       parseNameAndArgTypes(pro_name_or_oid, "regprocedurein", false,
+       parseNameAndArgTypes(pro_name_or_oid, "regprocedurein", "opaque",
                                                 &names, &nargs, argtypes);
 
        clist = FuncnameGetCandidates(names, nargs);
@@ -326,12 +326,16 @@ regprocedureout(PG_FUNCTION_ARGS)
                                                 quote_qualified_identifier(nspname, proname));
                for (i = 0; i < nargs; i++)
                {
-                       appendStringInfo(&buf, "%s%s",
-                                                        (i > 0) ? "," : "",
-                                                        format_type_be(procform->proargtypes[i]));
-               }
+                       Oid             thisargtype = procform->proargtypes[i];
 
-               appendStringInfo(&buf, ")");
+                       if (i > 0)
+                               appendStringInfoChar(&buf, ',');
+                       if (OidIsValid(thisargtype))
+                               appendStringInfo(&buf, "%s", format_type_be(thisargtype));
+                       else
+                               appendStringInfo(&buf, "opaque");
+               }
+               appendStringInfoChar(&buf, ')');
 
                result = buf.data;
 
@@ -567,7 +571,7 @@ regoperatorin(PG_FUNCTION_ARGS)
         * datatype cannot be used for any system column that needs to receive
         * data during bootstrap.
         */
-       parseNameAndArgTypes(opr_name_or_oid, "regoperatorin", true,
+       parseNameAndArgTypes(opr_name_or_oid, "regoperatorin", "none",
                                                 &names, &nargs, argtypes);
        if (nargs == 1)
                elog(ERROR, "regoperatorin: use NONE to denote the missing argument of a unary operator");
@@ -1000,10 +1004,12 @@ stringToQualifiedNameList(const char *string, const char *caller)
  * the argtypes array should be of size FUNC_MAX_ARGS).  The function or
  * operator name is returned to *names as a List of Strings.
  *
- * NONE is accepted as a placeholder for OID 0 if allow_none is true.
+ * If type0_spelling is not NULL, it is a name to be accepted as a
+ * placeholder for OID 0.
  */
 static void
-parseNameAndArgTypes(const char *string, const char *caller, bool allow_none,
+parseNameAndArgTypes(const char *string, const char *caller,
+                                        const char *type0_spelling,
                                         List **names, int *nargs, Oid *argtypes)
 {
        char       *rawname;
@@ -1109,9 +1115,9 @@ parseNameAndArgTypes(const char *string, const char *caller, bool allow_none,
                        *ptr2 = '\0';
                }
 
-               if (allow_none && strcasecmp(typename, "none") == 0)
+               if (type0_spelling && strcasecmp(typename, type0_spelling) == 0)
                {
-                       /* Report NONE as OID 0 */
+                       /* Special case for OPAQUE or NONE */
                        typeid = InvalidOid;
                        typmod = -1;
                }