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;