Greg Sabino Mullane <htamf...@gmail.com> writes:
> I like the ntypes idea: please find attached version 3 which implements it.
> I wrote it slightly differently as I did not want to leave any chance of it
> escaping the if else blocks without a match.

Hmm, I was envisioning being a little more in-your-face about the
no-match case, because that would surely represent somebody failing
to update the code correctly when adding a new relation kind.
So I was imagining something like the attached.

One problem with it is that while we can leave "List of ???" out
of the set of translatable strings easily, we can't currently
do that for the argument of pg_log_error because it's automatically
a gettext trigger.  I'd rather not burden translators with figuring
out what to do with that.  Is it worth creating pg_log_error_internal,
equivalently to elog and errmsg_internal in the backend?

BTW, I updated the regression tests for this, and that bears out
your argument that one-type commands are the majority.  There
are still a couple "List of relations", but not many.

                        regards, tom lane

diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index aa4363b200..b314fb5d71 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -4011,14 +4011,18 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
 	bool		showSeq = strchr(tabtypes, 's') != NULL;
 	bool		showForeign = strchr(tabtypes, 'E') != NULL;
 
+	int			ntypes;
 	PQExpBufferData buf;
 	PGresult   *res;
 	printQueryOpt myopt = pset.popt;
 	int			cols_so_far;
 	bool		translate_columns[] = {false, false, true, false, false, false, false, false, false};
 
-	/* If tabtypes is empty, we default to \dtvmsE (but see also command.c) */
-	if (!(showTables || showIndexes || showViews || showMatViews || showSeq || showForeign))
+	/* Count the number of explicitly-requested relation types */
+	ntypes = showTables + showIndexes + showViews + showMatViews +
+		showSeq + showForeign;
+	/* If none, we default to \dtvmsE (but see also command.c) */
+	if (ntypes == 0)
 		showTables = showViews = showMatViews = showSeq = showForeign = true;
 
 	initPQExpBuffer(&buf);
@@ -4169,14 +4173,55 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
 	if (PQntuples(res) == 0 && !pset.quiet)
 	{
 		if (pattern)
-			pg_log_error("Did not find any relation named \"%s\".",
-						 pattern);
+		{
+			if (ntypes != 1)
+				pg_log_error("Did not find any relations named \"%s\".", pattern);
+			else if (showTables)
+				pg_log_error("Did not find any tables named \"%s\".", pattern);
+			else if (showIndexes)
+				pg_log_error("Did not find any indexes named \"%s\".", pattern);
+			else if (showViews)
+				pg_log_error("Did not find any views named \"%s\".", pattern);
+			else if (showMatViews)
+				pg_log_error("Did not find any materialized views named \"%s\".", pattern);
+			else if (showSeq)
+				pg_log_error("Did not find any sequences named \"%s\".", pattern);
+			else if (showForeign)
+				pg_log_error("Did not find any foreign tables named \"%s\".", pattern);
+			else				/* should not get here */
+				pg_log_error("Did not find any ??? named \"%s\".", pattern);
+		}
 		else
-			pg_log_error("Did not find any relations.");
+		{
+			if (ntypes != 1)
+				pg_log_error("Did not find any relations.");
+			else if (showTables)
+				pg_log_error("Did not find any tables.");
+			else if (showIndexes)
+				pg_log_error("Did not find any indexes.");
+			else if (showViews)
+				pg_log_error("Did not find any views.");
+			else if (showMatViews)
+				pg_log_error("Did not find any materialized views.");
+			else if (showSeq)
+				pg_log_error("Did not find any sequences.");
+			else if (showForeign)
+				pg_log_error("Did not find any foreign tables.");
+			else				/* should not get here */
+				pg_log_error("Did not find any ??? relations.");
+		}
 	}
 	else
 	{
-		myopt.title = _("List of relations");
+		myopt.title =
+			(ntypes != 1) ? _("List of relations") :
+			(showTables) ? _("List of tables") :
+			(showIndexes) ? _("List of indexes") :
+			(showViews) ? _("List of views") :
+			(showMatViews) ? _("List of materialized views") :
+			(showSeq) ? _("List of sequences") :
+			(showForeign) ? _("List of foreign tables") :
+			"List of ???";		/* should not get here */
 		myopt.translate_header = true;
 		myopt.translate_columns = translate_columns;
 		myopt.n_translate_columns = lengthof(translate_columns);
diff --git a/src/test/regress/expected/dependency.out b/src/test/regress/expected/dependency.out
index 74d9ff2998..75a078ada9 100644
--- a/src/test/regress/expected/dependency.out
+++ b/src/test/regress/expected/dependency.out
@@ -116,7 +116,7 @@ FROM pg_type JOIN pg_class c ON typrelid = c.oid WHERE typname = 'deptest_t';
 RESET SESSION AUTHORIZATION;
 REASSIGN OWNED BY regress_dep_user1 TO regress_dep_user2;
 \dt deptest
-              List of relations
+                List of tables
  Schema |  Name   | Type  |       Owner       
 --------+---------+-------+-------------------
  public | deptest | table | regress_dep_user2
diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out
index e6f7b9013d..f9db4032e1 100644
--- a/src/test/regress/expected/psql.out
+++ b/src/test/regress/expected/psql.out
@@ -3027,7 +3027,7 @@ Access method: heap
 (4 rows)
 
 \dt+
-                                                  List of relations
+                                                    List of tables
      Schema      |     Name      | Type  |        Owner         | Persistence | Access method |  Size   | Description 
 -----------------+---------------+-------+----------------------+-------------+---------------+---------+-------------
  tableam_display | tbl_heap      | table | regress_display_role | permanent   | heap          | 0 bytes | 
@@ -3035,7 +3035,7 @@ Access method: heap
 (2 rows)
 
 \dm+
-                                                           List of relations
+                                                      List of materialized views
      Schema      |        Name        |       Type        |        Owner         | Persistence | Access method |  Size   | Description 
 -----------------+--------------------+-------------------+----------------------+-------------+---------------+---------+-------------
  tableam_display | mat_view_heap_psql | materialized view | regress_display_role | permanent   | heap_psql     | 0 bytes | 
@@ -3043,7 +3043,7 @@ Access method: heap
 
 -- But not for views and sequences.
 \dv+
-                                          List of relations
+                                            List of views
      Schema      |      Name      | Type |        Owner         | Persistence |  Size   | Description 
 -----------------+----------------+------+----------------------+-------------+---------+-------------
  tableam_display | view_heap_psql | view | regress_display_role | permanent   | 0 bytes | 
@@ -6244,7 +6244,7 @@ List of access methods
 (0 rows)
 
 \dt "no.such.table.relation"
-      List of relations
+        List of tables
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
@@ -6316,31 +6316,31 @@ List of access methods
 (0 rows)
 
 \di "no.such.index.relation"
-          List of relations
+           List of indexes
  Schema | Name | Type | Owner | Table 
 --------+------+------+-------+-------
 (0 rows)
 
 \dm "no.such.materialized.view"
-      List of relations
+  List of materialized views
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
 
 \ds "no.such.relation"
-      List of relations
+      List of sequences
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
 
 \dt "no.such.relation"
-      List of relations
+        List of tables
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
 
 \dv "no.such.relation"
-      List of relations
+        List of views
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
@@ -6474,7 +6474,7 @@ List of schemas
 \dA "no.such.schema"."no.such.access.method"
 improper qualified name (too many dotted names): "no.such.schema"."no.such.access.method"
 \dt "no.such.schema"."no.such.table.relation"
-      List of relations
+        List of tables
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
@@ -6526,31 +6526,31 @@ improper qualified name (too many dotted names): "no.such.schema"."no.such.table
 (0 rows)
 
 \di "no.such.schema"."no.such.index.relation"
-          List of relations
+           List of indexes
  Schema | Name | Type | Owner | Table 
 --------+------+------+-------+-------
 (0 rows)
 
 \dm "no.such.schema"."no.such.materialized.view"
-      List of relations
+  List of materialized views
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
 
 \ds "no.such.schema"."no.such.relation"
-      List of relations
+      List of sequences
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
 
 \dt "no.such.schema"."no.such.relation"
-      List of relations
+        List of tables
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
 
 \dv "no.such.schema"."no.such.relation"
-      List of relations
+        List of views
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
@@ -6641,7 +6641,7 @@ improper qualified name (too many dotted names): "no.such.schema"."no.such.insta
 improper qualified name (too many dotted names): "no.such.schema"."no.such.event.trigger"
 -- again, but with current database and dotted schema qualifications.
 \dt regression."no.such.schema"."no.such.table.relation"
-      List of relations
+        List of tables
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
@@ -6677,31 +6677,31 @@ improper qualified name (too many dotted names): "no.such.schema"."no.such.event
 (0 rows)
 
 \di regression."no.such.schema"."no.such.index.relation"
-          List of relations
+           List of indexes
  Schema | Name | Type | Owner | Table 
 --------+------+------+-------+-------
 (0 rows)
 
 \dm regression."no.such.schema"."no.such.materialized.view"
-      List of relations
+  List of materialized views
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
 
 \ds regression."no.such.schema"."no.such.relation"
-      List of relations
+      List of sequences
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
 
 \dt regression."no.such.schema"."no.such.relation"
-      List of relations
+        List of tables
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)
 
 \dv regression."no.such.schema"."no.such.relation"
-      List of relations
+        List of views
  Schema | Name | Type | Owner 
 --------+------+------+-------
 (0 rows)

Reply via email to