Forgot to handle 'opaque' function arguments in regprocedurein/out.
authorTom Lane
Sat, 11 May 2002 00:24:16 +0000 (00:24 +0000)
committerTom Lane
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;
        }