diff --git a/src/bin/initdb/initdb.sh b/src/bin/initdb/initdb.sh
index 6319be6870de74d7fc8988c724d064bca949aa11..ed131fab21f6df913ab87db5ffec6909c6f6d2ce 100644
--- a/src/bin/initdb/initdb.sh
+++ b/src/bin/initdb/initdb.sh
@@ -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
 
diff --git a/src/bin/psql/psql.c b/src/bin/psql/psql.c
index 4c544837631ebb350229398f3155ef115d72ab55..14916801d69a91522f9980afa9a5dff06674c220 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.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 */
 			{
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 4d5972c224dc243e7d9a6b0a78f0e9d7aeb809dd..a191d0083726c02e532945e5737cd45d15850f7a 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.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("");
diff --git a/src/man/psql.1 b/src/man/psql.1
index a045685cb3658dbc625869226feb1f829ef67eac..78acab3099e12ba5128d20171028e187714a745a 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.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]"
diff --git a/src/tools/backend/flow.gif b/src/tools/backend/flow.gif
index 1076af06f425fe342007c70de4a5814e19fd44da..177bfc729d9b995964f005899ae19dfeec74587e 100644
Binary files a/src/tools/backend/flow.gif and b/src/tools/backend/flow.gif differ