Allow psql's \dt and \di to show TOAST tables and their indexes.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 5 Jan 2021 23:41:50 +0000 (18:41 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 5 Jan 2021 23:41:50 +0000 (18:41 -0500)
Formerly, TOAST objects were unconditionally suppressed, but since
\d is able to print them it's not very clear why these variants
should not.  Instead, use the same rules as for system catalogs:
they can be seen if you write the 'S' modifier or a table name
pattern.  (In practice, since hardly anybody would keep pg_toast
in their search_path, it's really down to whether you use a pattern
that can match pg_toast.*.)

No docs change seems necessary because the docs already say that
this happens for "system objects"; we're just classifying TOAST
tables as being that.

Justin Pryzby, reviewed by Laurenz Albe

Discussion: https://postgr.es/m/20201130165436.GX24052@telsasoft.com

src/bin/psql/describe.c
src/test/regress/expected/psql.out
src/test/regress/sql/psql.sql

index 52c6de51b62d519e6de563723594a0e86be69491..caf97563f4871f371f453de6829d9e5babbe7da1 100644 (file)
@@ -3718,6 +3718,7 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
                      " WHEN " CppAsString2(RELKIND_INDEX) " THEN '%s'"
                      " WHEN " CppAsString2(RELKIND_SEQUENCE) " THEN '%s'"
                      " WHEN 's' THEN '%s'"
+                     " WHEN " CppAsString2(RELKIND_TOASTVALUE) " THEN '%s'"
                      " WHEN " CppAsString2(RELKIND_FOREIGN_TABLE) " THEN '%s'"
                      " WHEN " CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN '%s'"
                      " WHEN " CppAsString2(RELKIND_PARTITIONED_INDEX) " THEN '%s'"
@@ -3731,6 +3732,7 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
                      gettext_noop("index"),
                      gettext_noop("sequence"),
                      gettext_noop("special"),
+                     gettext_noop("TOAST table"),
                      gettext_noop("foreign table"),
                      gettext_noop("partitioned table"),
                      gettext_noop("partitioned index"),
@@ -3813,8 +3815,13 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
 
    appendPQExpBufferStr(&buf, "\nWHERE c.relkind IN (");
    if (showTables)
+   {
        appendPQExpBufferStr(&buf, CppAsString2(RELKIND_RELATION) ","
                             CppAsString2(RELKIND_PARTITIONED_TABLE) ",");
+       /* with 'S' or a pattern, allow 't' to match TOAST tables too */
+       if (showSystem || pattern)
+           appendPQExpBufferStr(&buf, CppAsString2(RELKIND_TOASTVALUE) ",");
+   }
    if (showViews)
        appendPQExpBufferStr(&buf, CppAsString2(RELKIND_VIEW) ",");
    if (showMatViews)
@@ -3834,17 +3841,9 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
 
    if (!showSystem && !pattern)
        appendPQExpBufferStr(&buf, "      AND n.nspname <> 'pg_catalog'\n"
+                            "      AND n.nspname !~ '^pg_toast'\n"
                             "      AND n.nspname <> 'information_schema'\n");
 
-   /*
-    * TOAST objects are suppressed unconditionally.  Since we don't provide
-    * any way to select RELKIND_TOASTVALUE above, we would never show toast
-    * tables in any case; it seems a bit confusing to allow their indexes to
-    * be shown.  Use plain \d if you really need to look at a TOAST
-    * table/index.
-    */
-   appendPQExpBufferStr(&buf, "      AND n.nspname !~ '^pg_toast'\n");
-
    processSQLNamePattern(pset.db, &buf, pattern, true, false,
                          "n.nspname", "c.relname", NULL,
                          "pg_catalog.pg_table_is_visible(c.oid)");
@@ -4057,17 +4056,9 @@ listPartitionedTables(const char *reltypes, const char *pattern, bool verbose)
 
    if (!pattern)
        appendPQExpBufferStr(&buf, "      AND n.nspname <> 'pg_catalog'\n"
+                            "      AND n.nspname !~ '^pg_toast'\n"
                             "      AND n.nspname <> 'information_schema'\n");
 
-   /*
-    * TOAST objects are suppressed unconditionally.  Since we don't provide
-    * any way to select RELKIND_TOASTVALUE above, we would never show toast
-    * tables in any case; it seems a bit confusing to allow their indexes to
-    * be shown.  Use plain \d if you really need to look at a TOAST
-    * table/index.
-    */
-   appendPQExpBufferStr(&buf, "      AND n.nspname !~ '^pg_toast'\n");
-
    processSQLNamePattern(pset.db, &buf, pattern, true, false,
                          "n.nspname", "c.relname", NULL,
                          "pg_catalog.pg_table_is_visible(c.oid)");
index 7204fdb0b439c3ce7c824d6209db122df511b4d7..d3134ecb2f4339223790ffd89281aa593d588d5d 100644 (file)
@@ -4895,6 +4895,20 @@ Owning table: "pg_catalog.pg_statistic"
 Indexes:
     "pg_toast_2619_index" PRIMARY KEY, btree (chunk_id, chunk_seq)
 
+\dt pg_toast.pg_toast_2619
+                 List of relations
+  Schema  |     Name      |    Type     |  Owner   
+----------+---------------+-------------+----------
+ pg_toast | pg_toast_2619 | TOAST table | postgres
+(1 row)
+
+\di pg_toast.pg_toast_2619_index
+                         List of relations
+  Schema  |        Name         | Type  |  Owner   |     Table     
+----------+---------------------+-------+----------+---------------
+ pg_toast | pg_toast_2619_index | index | postgres | pg_toast_2619
+(1 row)
+
 -- check printing info about access methods
 \dA
 List of access methods
index 537d5332aa90c0a0ce40b34550f5e687e5abcd9a..2cb9da8bff9540519d8faa87d7a72e6c2092ccf2 100644 (file)
@@ -1210,6 +1210,8 @@ drop role regress_partitioning_role;
 
 -- \d on toast table (use pg_statistic's toast table, which has a known name)
 \d pg_toast.pg_toast_2619
+\dt pg_toast.pg_toast_2619
+\di pg_toast.pg_toast_2619_index
 
 -- check printing info about access methods
 \dA