OSDN Git Service

Add new psql \da, \do, and \dT options.
authorBruce Momjian <bruce@momjian.us>
Fri, 14 Nov 1997 21:38:25 +0000 (21:38 +0000)
committerBruce Momjian <bruce@momjian.us>
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 6319be6..ed131fa 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 4c54483..1491680 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 [<captn>] -- set html3 caption (currently '%s')\n", pset->opt.caption ? pset->opt.caption : "");
        fprintf(fout, " \\connect <dbname|-> <user> -- connect to new database (currently '%s')\n", PQdb(pset->db));
        fprintf(fout, " \\copy table {from | to} <fname>\n");
-       fprintf(fout, " \\d [<table>] -- list tables and indices in database or columns in <table>, * for all\n");
+       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, " \\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 [<fname>] -- edit the current query buffer or <fname>\n");
        fprintf(fout, " \\E [<fname>] -- edit the current query buffer or <fname>, and execute\n");
        fprintf(fout, " \\f [<sep>]   -- 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 <cmd> 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 4d5972c..a191d00 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 a045685..78acab3 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 1076af0..177bfc7 100644 (file)
Binary files a/src/tools/backend/flow.gif and b/src/tools/backend/flow.gif differ