From 9b5ca7ee0c4c9aefe9f0669b8f08b6f433f1f00a Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 11 May 2002 00:24:16 +0000
Subject: [PATCH] Forgot to handle 'opaque' function arguments in
 regprocedurein/out.

---
 src/backend/utils/adt/regproc.c | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c
index ac5a7fc84d1..f9de2677969 100644
--- a/src/backend/utils/adt/regproc.c
+++ b/src/backend/utils/adt/regproc.c
@@ -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;
 		}
-- 
GitLab