Commit 7d80441d authored by Tom Lane's avatar Tom Lane

Allow psql's \dt and \di to show TOAST tables and their indexes.

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
parent bf8a662c
......@@ -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)");
......
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment