From 4e9df155f08f4cfc4a29d2953deba6508c3dadfd Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Sat, 15 Nov 1997 16:32:25 +0000
Subject: [PATCH] Add new \df psql option and oid8types() function.

---
 src/backend/utils/adt/regproc.c | 79 ++++++++++++++++++++++++++++++++-
 src/bin/psql/psql.c             | 17 ++++++-
 src/include/catalog/pg_proc.h   |  4 +-
 src/include/utils/builtins.h    |  3 +-
 src/man/psql.1                  |  4 +-
 5 files changed, 101 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c
index 70c97e0833f..025597ddc85 100644
--- a/src/backend/utils/adt/regproc.c
+++ b/src/backend/utils/adt/regproc.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.8 1997/10/25 01:10:45 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.9 1997/11/15 16:32:01 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -118,7 +118,7 @@ regprocout(RegProcedure proid)
 	if (!HeapScanIsValid(procscan))
 	{
 		heap_close(proc);
-		elog(WARN, "regprocin: could not being scan of %s",
+		elog(WARN, "regprocout: could not being scan of %s",
 			 ProcedureRelationName);
 		return (0);
 	}
@@ -150,6 +150,81 @@ regprocout(RegProcedure proid)
 	return (result);
 }
 
+/*
+ *		int8typeout			- converts int8 type oids to "typname" list
+ */
+text	   *
+oid8types(Oid (*oidArray)[])
+{
+	Relation	type;
+	HeapScanDesc typescan;
+	HeapTuple	typetup;
+	text	   *result;
+	ScanKeyData key;
+	register int num;
+	register Oid *sp;
+
+	if (oidArray == NULL)
+	{
+	 	result = (text *) palloc(VARHDRSZ);
+		VARSIZE(result) = 0;
+		return (result);
+	}
+
+ 	result = (text *) palloc(NAMEDATALEN * 8 + 8 + VARHDRSZ);
+ 	*VARDATA(result) = '\0';
+	type = heap_openr(TypeRelationName);
+	if (!RelationIsValid(type))
+	{
+		elog(WARN, "int8typeout: could not open %s",
+			 TypeRelationName);
+		return (0);
+	}
+
+	sp = *oidArray;
+	for (num = 8; num != 0; num--, sp++)
+	{
+		if (*sp != InvalidOid)
+		{
+			ScanKeyEntryInitialize(&key,
+								   (bits16) 0,
+								   (AttrNumber) ObjectIdAttributeNumber,
+								   (RegProcedure) F_INT4EQ,
+								   (Datum) *sp);
+		
+			typescan = heap_beginscan(type, 0, NowTimeQual, 1, &key);
+			if (!HeapScanIsValid(typescan))
+			{
+				heap_close(type);
+				elog(WARN, "int8typeout: could not being scan of %s",
+					 TypeRelationName);
+				return (0);
+			}
+			typetup = heap_getnext(typescan, 0, (Buffer *) NULL);
+			if (HeapTupleIsValid(typetup))
+			{
+				char	   *s;
+				bool		isnull;
+	
+				s = (char *) heap_getattr(typetup, InvalidBuffer, 1,
+								  RelationGetTupleDescriptor(type), &isnull);
+				if (!isnull)
+				{
+					StrNCpy(VARDATA(result)+strlen(VARDATA(result)),s,16);
+					strcat(VARDATA(result)," ");
+				}
+				else
+					elog(FATAL, "int8typeout: null procedure %d", *sp);
+					/* FALLTHROUGH */
+			}
+			heap_endscan(typescan);
+		}
+	}
+	heap_close(type);
+	VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ;
+	return (result);
+}
+
 
 /*****************************************************************************
  *	 PUBLIC ROUTINES														 *
diff --git a/src/bin/psql/psql.c b/src/bin/psql/psql.c
index 14916801d69..e214428811a 100644
--- a/src/bin/psql/psql.c
+++ b/src/bin/psql/psql.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.105 1997/11/14 21:37:41 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.106 1997/11/15 16:32:03 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -219,6 +219,7 @@ slashUsage(PsqlSettings *pset)
 	fprintf(fout, " \\d [<table>] -- list tables and indices, columns in <table>, or * for all\n");
 	fprintf(fout, " \\da          -- list aggregates\n");
 	fprintf(fout, " \\dd [<object>]- list comment for table, field, type, function, or operator.\n");
+	fprintf(fout, " \\df          -- list functions\n");
 	fprintf(fout, " \\di          -- list only indices\n");
 	fprintf(fout, " \\do          -- list operators\n");
 	fprintf(fout, " \\ds          -- list only sequences\n");
@@ -1691,6 +1692,20 @@ HandleSlashCmds(PsqlSettings *pset,
 			else if (strncmp(cmd, "dd", 2) == 0)
 								/* descriptions */
 				objectDescription(pset, optarg+1, NULL);
+			else if (strncmp(cmd, "df", 2) == 0)
+								/* functions/procedures */
+			/* we skip in/out funcs by excluding functions that take
+			   some arguments, but have no types defined for those arguments */
+				SendQuery(&success, pset,"\
+					SELECT	p.proname as function, \
+							t.typname as return_type, \
+							oid8types(p.proargtypes) as arguments, \
+							obj_description(p.oid) \
+					FROM pg_proc p, pg_type t \
+					WHERE p.prorettype = t.oid and \
+							(pronargs = 0 or oid8types(p.proargtypes) != '') \
+					ORDER BY function;",
+					false, false, 0);
 			else if (strncmp(cmd, "di", 2) == 0)
 								/* only indices */
 				tableList(pset, false, 'i');
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index a191d008372..944b2a4255b 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.35 1997/11/14 21:37:54 momjian Exp $
+ * $Id: pg_proc.h,v 1.36 1997/11/15 16:32:09 momjian Exp $
  *
  * NOTES
  *	  The script catalog/genbki.sh reads this file and generates .bki
@@ -1651,6 +1651,8 @@ DATA(insert OID = 1347 (  int4		   PGUID 14 f t f 1 f	23 "25" 100 0 0 100  "sele
 DESCR("");
 DATA(insert OID = 1348 (  obj_description   PGUID 14 f t f 1 f	25 "26" 100 0 0 100  "select description from pg_description where objoid = $1" - ));
 DESCR("");
+DATA(insert OID = 1349 (  oid8types	   PGUID 11 f t f 1 f	25 "30" 100 0 0 100  foo bar ));
+DESCR("");
 
 DATA(insert OID = 1350 (  datetime	   PGUID 14 f t f 1 f 1184 "1184" 100 0 0 100  "select $1" - ));
 DESCR("");
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index a02f3addf0a..c9aedbff16f 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: builtins.h,v 1.29 1997/10/30 16:42:50 thomas Exp $
+ * $Id: builtins.h,v 1.30 1997/11/15 16:32:15 momjian Exp $
  *
  * NOTES
  *	  This should normally only be included by fmgr.h.
@@ -410,6 +410,7 @@ extern bool texticregexne(struct varlena * s, struct varlena * p);
 /* regproc.c */
 extern int32 regprocin(char *proname);
 extern char *regprocout(RegProcedure proid);
+extern text *oid8types(Oid (*oidArray)[]);
 extern Oid	regproctooid(RegProcedure rp);
 
 /* define macro to replace mixed-case function call - tgl 97/04/27 */
diff --git a/src/man/psql.1 b/src/man/psql.1
index 0ee386e96ac..e104512c24a 100644
--- a/src/man/psql.1
+++ b/src/man/psql.1
@@ -1,6 +1,6 @@
 .\" This is -*-nroff-*-
 .\" XXX standard disclaimer belongs here....
-.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.16 1997/11/15 02:47:23 thomas Exp $
+.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.17 1997/11/15 16:32:25 momjian Exp $
 .TH PSQL UNIX 1/20/96 PostgreSQL PostgreSQL
 .SH NAME
 psql \(em run the interactive query front-end
@@ -296,6 +296,8 @@ list all tables and column information for each tables.
 List aggregates.
 .IP "\edd object"
 List the description of the table, table.column, type, operator, or aggregate.
+.IP "\edf"
+List functions.
 .IP "\edi"
 List only indexes.
 .IP "\edo"
-- 
GitLab