Commit eb5472da authored by Tom Lane's avatar Tom Lane

Improve psql's \d output for TOAST tables.

Add the name of the owning table to the footers for a TOAST table.
Also, show all the same footers as for a regular table (in practice,
this adds the index and perhaps the tablespace and access method).

Justin Pryzby, reviewed by Fabien Coelho

Discussion: https://postgr.es/m/20190422154902.GH14223@telsasoft.com
parent 06140c20
...@@ -2172,6 +2172,33 @@ describeOneTableDetails(const char *schemaname, ...@@ -2172,6 +2172,33 @@ describeOneTableDetails(const char *schemaname,
PQclear(result); PQclear(result);
} }
if (tableinfo.relkind == RELKIND_TOASTVALUE)
{
/* For a TOAST table, print name of owning table */
PGresult *result;
printfPQExpBuffer(&buf,
"SELECT n.nspname, c.relname\n"
"FROM pg_catalog.pg_class c"
" JOIN pg_catalog.pg_namespace n"
" ON n.oid = c.relnamespace\n"
"WHERE reltoastrelid = '%s';", oid);
result = PSQLexec(buf.data);
if (!result)
goto error_return;
if (PQntuples(result) == 1)
{
char *schemaname = PQgetvalue(result, 0, 0);
char *relname = PQgetvalue(result, 0, 1);
printfPQExpBuffer(&tmpbuf, _("Owning table: \"%s.%s\""),
schemaname, relname);
printTableAddFooter(&cont, tmpbuf.data);
}
PQclear(result);
}
if (tableinfo.relkind == RELKIND_INDEX || if (tableinfo.relkind == RELKIND_INDEX ||
tableinfo.relkind == RELKIND_PARTITIONED_INDEX) tableinfo.relkind == RELKIND_PARTITIONED_INDEX)
{ {
...@@ -2272,10 +2299,12 @@ describeOneTableDetails(const char *schemaname, ...@@ -2272,10 +2299,12 @@ describeOneTableDetails(const char *schemaname,
PQclear(result); PQclear(result);
} }
/* If you add relkinds here, see also "Finish printing..." stanza below */
else if (tableinfo.relkind == RELKIND_RELATION || else if (tableinfo.relkind == RELKIND_RELATION ||
tableinfo.relkind == RELKIND_MATVIEW || tableinfo.relkind == RELKIND_MATVIEW ||
tableinfo.relkind == RELKIND_FOREIGN_TABLE || tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
tableinfo.relkind == RELKIND_PARTITIONED_TABLE) tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
tableinfo.relkind == RELKIND_TOASTVALUE)
{ {
/* Footer information about a table */ /* Footer information about a table */
PGresult *result = NULL; PGresult *result = NULL;
...@@ -3040,7 +3069,8 @@ describeOneTableDetails(const char *schemaname, ...@@ -3040,7 +3069,8 @@ describeOneTableDetails(const char *schemaname,
if (tableinfo.relkind == RELKIND_RELATION || if (tableinfo.relkind == RELKIND_RELATION ||
tableinfo.relkind == RELKIND_MATVIEW || tableinfo.relkind == RELKIND_MATVIEW ||
tableinfo.relkind == RELKIND_FOREIGN_TABLE || tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
tableinfo.relkind == RELKIND_PARTITIONED_TABLE) tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
tableinfo.relkind == RELKIND_TOASTVALUE)
{ {
PGresult *result; PGresult *result;
int tuples; int tuples;
...@@ -3308,7 +3338,8 @@ add_tablespace_footer(printTableContent *const cont, char relkind, ...@@ -3308,7 +3338,8 @@ add_tablespace_footer(printTableContent *const cont, char relkind,
relkind == RELKIND_MATVIEW || relkind == RELKIND_MATVIEW ||
relkind == RELKIND_INDEX || relkind == RELKIND_INDEX ||
relkind == RELKIND_PARTITIONED_TABLE || relkind == RELKIND_PARTITIONED_TABLE ||
relkind == RELKIND_PARTITIONED_INDEX) relkind == RELKIND_PARTITIONED_INDEX ||
relkind == RELKIND_TOASTVALUE)
{ {
/* /*
* We ignore the database default tablespace so that users not using * We ignore the database default tablespace so that users not using
......
...@@ -4748,3 +4748,15 @@ drop schema testpart; ...@@ -4748,3 +4748,15 @@ drop schema testpart;
set search_path to default; set search_path to default;
set role to default; set role to default;
drop role regress_partitioning_role; 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
TOAST table "pg_toast.pg_toast_2619"
Column | Type
------------+---------
chunk_id | oid
chunk_seq | integer
chunk_data | bytea
Owning table: "pg_catalog.pg_statistic"
Indexes:
"pg_toast_2619_index" PRIMARY KEY, btree (chunk_id, chunk_seq)
...@@ -1131,3 +1131,6 @@ set search_path to default; ...@@ -1131,3 +1131,6 @@ set search_path to default;
set role to default; set role to default;
drop role regress_partitioning_role; 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
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