]> granicus.if.org Git - postgresql/commitdiff
Show table persistence in psql's \dt+ and related commands.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Jul 2019 15:46:34 +0000 (11:46 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 3 Jul 2019 15:46:34 +0000 (11:46 -0400)
In verbose mode, listTables() now emits a "Persistence" column
showing whether the table/index/view/etc is permanent, temporary,
or unlogged.

David Fetter, reviewed by Fabien Coelho and Rafia Sabih

Discussion: https://postgr.es/m/20190423005642.GZ28936@fetter.org

src/bin/psql/describe.c

index 1c770b4347a1dc901d41f887473f25347243de4b..0e0af5f942c5d5797365afbfe47b301a4594f6fb 100644 (file)
@@ -3632,7 +3632,8 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
        PQExpBufferData buf;
        PGresult   *res;
        printQueryOpt myopt = pset.popt;
-       static const bool translate_columns[] = {false, false, true, false, false, false, false};
+       int                     cols_so_far;
+       bool            translate_columns[] = {false, false, true, 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))
@@ -3672,14 +3673,39 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
                                          gettext_noop("partitioned index"),
                                          gettext_noop("Type"),
                                          gettext_noop("Owner"));
+       cols_so_far = 4;
 
        if (showIndexes)
+       {
                appendPQExpBuffer(&buf,
-                                                 ",\n c2.relname as \"%s\"",
+                                                 ",\n  c2.relname as \"%s\"",
                                                  gettext_noop("Table"));
+               cols_so_far++;
+       }
 
        if (verbose)
        {
+               /*
+                * Show whether a relation is permanent, temporary, or unlogged.  Like
+                * describeOneTableDetails(), we consider that persistence emerged in
+                * v9.1, even though related concepts existed before.
+                */
+               if (pset.sversion >= 90100)
+               {
+                       appendPQExpBuffer(&buf,
+                                                         ",\n  CASE c.relpersistence WHEN 'p' THEN '%s' WHEN 't' THEN '%s' WHEN 'u' THEN '%s' END as \"%s\"",
+                                                         gettext_noop("permanent"),
+                                                         gettext_noop("temporary"),
+                                                         gettext_noop("unlogged"),
+                                                         gettext_noop("Persistence"));
+                       translate_columns[cols_so_far] = true;
+               }
+
+               /*
+                * We don't bother to count cols_so_far below here, as there's no need
+                * to; this might change with future additions to the output columns.
+                */
+
                /*
                 * As of PostgreSQL 9.0, use pg_table_size() to show a more accurate
                 * size of a table, including FSM, VM and TOAST tables.