]> granicus.if.org Git - postgresql/commitdiff
Add new \df psql option and oid8types() function.
authorBruce Momjian <bruce@momjian.us>
Sat, 15 Nov 1997 16:32:25 +0000 (16:32 +0000)
committerBruce Momjian <bruce@momjian.us>
Sat, 15 Nov 1997 16:32:25 +0000 (16:32 +0000)
src/backend/utils/adt/regproc.c
src/bin/psql/psql.c
src/include/catalog/pg_proc.h
src/include/utils/builtins.h
src/man/psql.1

index 70c97e0833f62d4a59dc7ea2cb84c8c5e5d0b28c..025597ddc857d6fc7d6fb53cdc114194d21cde03 100644 (file)
@@ -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                                                                                                                 *
index 14916801d69a91522f9980afa9a5dff06674c220..e214428811ad8741dfcd1fcc64d554a0f8575151 100644 (file)
@@ -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');
index a191d0083726c02e532945e5737cd45d15850f7a..944b2a4255bd2ffedf99dafb6076ba098f4efaf0 100644 (file)
@@ -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("");
index a02f3addf0ab769b43459762b44d06c035304cfc..c9aedbff16fb1b87204b08e7d7b997fda12c7644 100644 (file)
@@ -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 */
index 0ee386e96acb2b1985c8d51e17657a8ec61c2f98..e104512c24a62e6c57f5a5c5b5552c7f338f3039 100644 (file)
@@ -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"