Add new psql \da, \do, and \dT options.
authorBruce Momjian
Fri, 14 Nov 1997 21:38:25 +0000 (21:38 +0000)
committerBruce Momjian
Fri, 14 Nov 1997 21:38:25 +0000 (21:38 +0000)
src/bin/initdb/initdb.sh
src/bin/psql/psql.c
src/include/catalog/pg_proc.h
src/man/psql.1
src/tools/backend/flow.gif

index 6319be6870de74d7fc8988c724d064bca949aa11..ed131fab21f6df913ab87db5ffec6909c6f6d2ce 100644 (file)
@@ -26,7 +26,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.25 1997/11/13 03:22:34 momjian Exp $
+#    $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.26 1997/11/14 21:37:35 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -346,11 +346,12 @@ fi
 
 echo
 
+echo "loading pg_description"
+echo "copy pg_description from '$TEMPLATE_DESCR'" | postgres -F -Q -D$PGDATA template1 > /dev/null
+echo "copy pg_description from '$GLOBAL_DESCR'" | postgres -F -Q -D$PGDATA template1 > /dev/null
+
 echo "vacuuming template1"
 echo "vacuum" | postgres -F -Q -D$PGDATA template1 2>&1 > /dev/null |\
    grep -v "^DEBUG:"
 
-echo "loading pg_description"
-echo "copy pg_description from '$TEMPLATE_DESCR'" | postgres -F -Q -D$PGDATA template1 > /dev/null
-echo "copy pg_description from '$GLOBAL_DESCR'" | postgres -F -Q -D$PGDATA template1 > /dev/null
 
index 4c544837631ebb350229398f3155ef115d72ab55..14916801d69a91522f9980afa9a5dff06674c220 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.104 1997/11/14 05:57:35 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.105 1997/11/14 21:37:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -135,14 +135,6 @@ HandleSlashCmds(PsqlSettings *pset,
                char *line,
                char *query);
 static int MainLoop(PsqlSettings *pset, char *query, FILE *source);
-
-/* probably should move this into libpq */
-void
-PQprint(FILE *fp,
-       PGresult *res,
-       PQprintOpt *po
-);
-
 static FILE *setFout(PsqlSettings *pset, char *fname);
 
 /*
@@ -224,11 +216,14 @@ slashUsage(PsqlSettings *pset)
    fprintf(fout, " \\C [] -- set html3 caption (currently '%s')\n", pset->opt.caption ? pset->opt.caption : "");
    fprintf(fout, " \\connect   -- connect to new database (currently '%s')\n", PQdb(pset->db));
    fprintf(fout, " \\copy table {from | to} \n");
-   fprintf(fout, " \\d [] -- list tables and indices in database or columns in 
, * for all\n");
+   fprintf(fout, " \\d [
] -- list tables and indices, columns in 
, or * for all\n");
+   fprintf(fout, " \\da          -- list aggregates\n");
    fprintf(fout, " \\dd []- list comment for table, field, type, function, or operator.\n");
-   fprintf(fout, " \\di          -- list only indices in database\n");
-   fprintf(fout, " \\ds          -- list only sequences in database\n");
-   fprintf(fout, " \\dt          -- list only tables in database\n");
+   fprintf(fout, " \\di          -- list only indices\n");
+   fprintf(fout, " \\do          -- list operators\n");
+   fprintf(fout, " \\ds          -- list only sequences\n");
+   fprintf(fout, " \\dt          -- list only tables\n");
+   fprintf(fout, " \\dT          -- list types\n");
    fprintf(fout, " \\e [] -- edit the current query buffer or \n");
    fprintf(fout, " \\E [] -- edit the current query buffer or , and execute\n");
    fprintf(fout, " \\f []   -- change field separater (currently '%s')\n", pset->opt.fieldSep);
@@ -751,20 +746,19 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
            strcat(descbuf, "FROM pg_type, pg_description ");
            strcat(descbuf, "WHERE pg_type.typname = '");
            strcat(descbuf, object);
-           strcat(descbuf, "');
-           strcat(descbuf, " and pg_type.oid = pg_description.objoid " );
+           strcat(descbuf, "' and ");
+           strcat(descbuf, " pg_type.oid = pg_description.objoid " );
            if (!(res = PSQLexec(pset, descbuf)))
                return -1;
-           else if (PQntuples(res) <= 0)
            {
                PQclear(res);
                descbuf[0] = '\0';
                strcat(descbuf, "SELECT DISTINCT description ");
-               strcat(descbuf, "FROM pg_type, pg_description ");
-               strcat(descbuf, "WHERE pg_type.typname = '");
+               strcat(descbuf, "FROM pg_proc, pg_description ");
+               strcat(descbuf, "WHERE pg_proc.proname = '");
                strcat(descbuf, object);
                strcat(descbuf, "'" );
-               strcat(descbuf, " and pg_type.oid = pg_description.objoid " );
+               strcat(descbuf, " and pg_proc.oid = pg_description.objoid " );
                if (!(res = PSQLexec(pset, descbuf)))
                    return -1;
                else if (PQntuples(res) <= 0)
@@ -772,11 +766,11 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
                    PQclear(res);
                    descbuf[0] = '\0';
                    strcat(descbuf, "SELECT DISTINCT description ");
-                   strcat(descbuf, "FROM pg_proc, pg_description ");
-                   strcat(descbuf, "WHERE pg_proc.proname = '");
+                   strcat(descbuf, "FROM pg_operator, pg_description ");
+                   strcat(descbuf, "WHERE pg_operator.oprname = '");
                    strcat(descbuf, object);
                    strcat(descbuf, "'" );
-                   strcat(descbuf, " and pg_proc.oid = pg_description.objoid " );
+                   strcat(descbuf, " and pg_operator.oid = pg_description.objoid " );
                    if (!(res = PSQLexec(pset, descbuf)))
                        return -1;
                    else if (PQntuples(res) <= 0)
@@ -784,26 +778,13 @@ objectDescription(PsqlSettings *pset, char *object, FILE *fout)
                        PQclear(res);
                        descbuf[0] = '\0';
                        strcat(descbuf, "SELECT DISTINCT description ");
-                       strcat(descbuf, "FROM pg_operator, pg_description ");
-                       strcat(descbuf, "WHERE pg_operator.oprname = '");
+                       strcat(descbuf, "FROM pg_aggregate, pg_description ");
+                       strcat(descbuf, "WHERE pg_aggregate.aggname = '");
                        strcat(descbuf, object);
                        strcat(descbuf, "'" );
-                       strcat(descbuf, " and pg_operator.oid = pg_description.objoid " );
+                       strcat(descbuf, " and pg_aggregate.oid = pg_description.objoid " );
                        if (!(res = PSQLexec(pset, descbuf)))
                            return -1;
-                       else if (PQntuples(res) <= 0)
-                       {
-                           PQclear(res);
-                           descbuf[0] = '\0';
-                           strcat(descbuf, "SELECT DISTINCT description ");
-                           strcat(descbuf, "FROM pg_aggregate, pg_description ");
-                           strcat(descbuf, "WHERE pg_aggregate.aggname = '");
-                           strcat(descbuf, object);
-                           strcat(descbuf, "'" );
-                           strcat(descbuf, " and pg_aggregate.oid = pg_description.objoid " );
-                           if (!(res = PSQLexec(pset, descbuf)))
-                               return -1;
-                       }
                    }
                }
            }
@@ -1584,7 +1565,7 @@ HandleSlashCmds(PsqlSettings *pset,
 {
    int         status = CMD_SKIP_LINE;
    char       *optarg;
-
+   bool        success;
    /*
     * Pointer inside the  string to the argument of the slash
     * command, assuming it is a one-character slash command.  If it's not
@@ -1696,20 +1677,82 @@ HandleSlashCmds(PsqlSettings *pset,
                }
            }
            break;
-       case 'd':               /* \d describe tables or columns in a
-                                * table */
-           if (strncmp(cmd, "dd", 2) == 0)
+       case 'd':   /* \d describe database information */
+           if (strncmp(cmd, "da", 2) == 0)
+                               /* aggregates */
+               SendQuery(&success, pset,"\
+                   SELECT  a.aggname AS aggname, \
+                           t.typname AS typname, \
+                           obj_description(a.oid) as description \
+                   FROM    pg_aggregate a, pg_type t \
+                   WHERE   a.aggbasetype = t.oid \
+                   ORDER BY aggname, typname;",
+                       false, false, 0);
+           else if (strncmp(cmd, "dd", 2) == 0)
                                /* descriptions */
                objectDescription(pset, optarg+1, NULL);
            else if (strncmp(cmd, "di", 2) == 0)
                                /* only indices */
                tableList(pset, false, 'i');
+           else if (strncmp(cmd, "do", 2) == 0)
+           {
+                               /* operators */
+               SendQuery(&success, pset,"\
+                   SELECT  t0.typname AS result, \
+                           t1.typname AS left_type, \
+                           t2.typname AS right_type, \
+                           o.oprname AS operatr, \
+                           p.proname AS func_name, \
+                           obj_description(o.oid) as description \
+                   FROM    pg_proc p, pg_type t0, \
+                           pg_type t1, pg_type t2, \
+                           pg_operator o \
+                   WHERE   p.prorettype = t0.oid AND \
+                           RegprocToOid(o.oprcode) = p.oid AND \
+                           p.pronargs = 2 AND \
+                           o.oprleft = t1.oid AND \
+                           o.oprright = t2.oid \
+                   ORDER BY result, left_type, right_type, operatr;",
+                       false, false, 0);
+               SendQuery(&success, pset,"\
+                   SELECT  o.oprname AS left_unary, \
+                           t.typname AS operand, \
+                           r.typname AS return_type, \
+                           obj_description(o.oid) as description \
+                   FROM    pg_operator o, pg_type t, pg_type r \
+                   WHERE   o.oprkind = 'l' AND \
+                           o.oprright = t.oid AND \
+                           o.oprresult = r.oid \
+                   ORDER BY operand;",
+                       false, false, 0);
+               SendQuery(&success, pset,"\
+                   SELECT  o.oprname AS right_unary, \
+                           t.typname AS operand, \
+                           r.typname AS return_type, \
+                           obj_description(o.oid) as description \
+                   FROM    pg_operator o, pg_type t, pg_type r \
+                   WHERE   o.oprkind = 'r' AND \
+                           o.oprleft = t.oid AND \
+                           o.oprresult = r.oid \
+                   ORDER BY operand;",
+                       false, false, 0);
+           }
            else if (strncmp(cmd, "ds", 2) == 0)
                                /* only sequences */
                tableList(pset, false, 'S');
            else if (strncmp(cmd, "dt", 2) == 0)
                                /* only tables */
                tableList(pset, false, 't');
+           else if (strncmp(cmd, "dT", 2) == 0)
+                               /* types */
+               SendQuery(&success, pset,"\
+                   SELECT  typname AS type, \
+                           obj_description(oid) as description \
+                   FROM    pg_type \
+                   WHERE   typrelid = 0 AND \
+                           typname !~ '^_.*' \
+                   ORDER BY type;",
+                   false, false, 0);
            else if (!optarg)
                                /* show tables, sequences and indices */
                tableList(pset, false, 'b');
@@ -1718,9 +1761,12 @@ HandleSlashCmds(PsqlSettings *pset,
                if (tableList(pset, false, 'b') == 0)
                    tableList(pset, true, 'b');
            }
-           else
+           else if (strncmp(cmd, "d ", 2) == 0)
                                /* describe the specified table */
                tableDesc(pset, optarg, NULL);
+           else
+               slashUsage(pset);
+           
            break;
        case 'e':               /* edit */
            {
index 4d5972c224dc243e7d9a6b0a78f0e9d7aeb809dd..a191d0083726c02e532945e5737cd45d15850f7a 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.34 1997/11/13 03:23:07 momjian Exp $
+ * $Id: pg_proc.h,v 1.35 1997/11/14 21:37:54 momjian Exp $
  *
  * NOTES
  *   The script catalog/genbki.sh reads this file and generates .bki
@@ -1649,6 +1649,8 @@ DATA(insert OID = 1346 (  int2           PGUID 14 f t f 1 f   21 "25" 100 0 0 100  "sele
 DESCR("");
 DATA(insert OID = 1347 (  int4        PGUID 14 f t f 1 f   23 "25" 100 0 0 100  "select text_int4($1)" - ));
 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 = 1350 (  datetime    PGUID 14 f t f 1 f 1184 "1184" 100 0 0 100  "select $1" - ));
 DESCR("");
index a045685cb3658dbc625869226feb1f829ef67eac..78acab3099e12ba5128d20171028e187714a745a 100644 (file)
@@ -1,6 +1,6 @@
 .\" This is -*-nroff-*-
 .\" XXX standard disclaimer belongs here....
-.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.14 1997/11/13 03:36:42 momjian Exp $
+.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.15 1997/11/14 21:38:16 momjian Exp $
 .TH PSQL UNIX 1/20/96 PostgreSQL PostgreSQL
 .SH NAME
 psql \(em run the interactive query front-end
@@ -292,14 +292,20 @@ is specified, list the columns in
 If table name is
 .IR *,
 list all tables and column information for each tables.
+.IP "\eda"
+List aggregates.
 .IP "\edd object"
 List the description of the table, table.column, type, operator, or aggregate.
 .IP "\edi"
 List only indexes.
-.IP "\edt"
-List only tables.
+.IP "\edo"
+List operators.
 .IP "\eds"
 List only sequences.
+.IP "\edt"
+List only tables.
+.IP "\edT"
+List types.
 .IP "\ee [\fIfilename\fR]"
 Edit the current query buffer or \fIfile\fR.
 .IP "\eE [\fIfilename\fR]"
index 1076af06f425fe342007c70de4a5814e19fd44da..177bfc729d9b995964f005899ae19dfeec74587e 100644 (file)
Binary files a/src/tools/backend/flow.gif and b/src/tools/backend/flow.gif differ