diff --git a/src/bin/psql/psql.c b/src/bin/psql/psql.c
index f84e96ae126f39eb13fc3cb5989bec21deb5b5ef..e0108ba65cbbe0ded7f70a3b5d27618d62416c57 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.181 1999/05/30 15:32:45 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.182 1999/06/04 21:21:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -421,6 +421,7 @@ tableList(PsqlSettings *pset, bool deep_tablelist, char info_type,
 	char	   *rr;
 	PGresult   *res;
 	int			usePipe = 0;
+	bool		haveIndexes = false;
 	char	   *pagerenv;
 	FILE	   *fout;
 
@@ -440,27 +441,39 @@ tableList(PsqlSettings *pset, bool deep_tablelist, char info_type,
 	listbuf[0] = '\0';
 	strcat(listbuf, "SELECT usename, relname, relkind, relhasrules ");
 	strcat(listbuf, "FROM pg_class, pg_user ");
+	strcat(listbuf, "WHERE usesysid = relowner ");
 	switch (info_type)
 	{
 		case 't':
-			strcat(listbuf, "WHERE ( relkind = 'r') ");
+			strcat(listbuf, "and ( relkind = 'r') ");
 			break;
 		case 'i':
-			strcat(listbuf, "WHERE ( relkind = 'i') ");
+			strcat(listbuf, "and ( relkind = 'i') ");
+			haveIndexes = true;
 			break;
 		case 'S':
-			strcat(listbuf, "WHERE ( relkind = 'S') ");
+			strcat(listbuf, "and ( relkind = 'S') ");
 			break;
 		case 'b':
 		default:
-			strcat(listbuf, "WHERE ( relkind = 'r' OR relkind = 'i' OR relkind = 'S') ");
+			strcat(listbuf, "and ( relkind = 'r' OR relkind = 'i' OR relkind = 'S') ");
+			haveIndexes = true;
 			break;
 	}
 	if (!system_tables)
-		strcat(listbuf, "  and relname !~ '^pg_'");
+		strcat(listbuf, "and relname !~ '^pg_' ");
 	else
-		strcat(listbuf, "  and relname ~ '^pg_'");
-	strcat(listbuf, " and usesysid = relowner");
+		strcat(listbuf, "and relname ~ '^pg_' ");
+	/*
+	 * Large-object relations are automatically ignored because they have
+	 * relkind 'l'.  However, we want to ignore their indexes as well.
+	 * The clean way to do that would be to do a join to find out which
+	 * table each index is for.  The ugly but fast way is to know that
+	 * large object indexes have names starting with 'xinx'.
+	 */
+	if (haveIndexes)
+		strcat(listbuf, "and (relkind != 'i' OR relname !~ '^xinx') ");
+
 	strcat(listbuf, " ORDER BY relname ");
 	if (!(res = PSQLexec(pset, listbuf)))
 		return -1;
@@ -603,10 +616,10 @@ rightsList(PsqlSettings *pset)
 
 	listbuf[0] = '\0';
 	strcat(listbuf, "SELECT relname, relacl ");
-	strcat(listbuf, "FROM pg_class, pg_user ");
-	strcat(listbuf, "WHERE ( relkind = 'r' OR relkind = 'i' OR relkind = 'S') ");
+	strcat(listbuf, "FROM pg_class ");
+	/* Currently, we ignore indexes since they have no meaningful rights */
+	strcat(listbuf, "WHERE ( relkind = 'r' OR relkind = 'S') ");
 	strcat(listbuf, "  and relname !~ '^pg_'");
-	strcat(listbuf, "  and usesysid = relowner");
 	strcat(listbuf, "  ORDER BY relname ");
 	if (!(res = PSQLexec(pset, listbuf)))
 		return -1;