On 2017/07/12 13:09, Amit Langote wrote:
> On 2017/07/12 12:47, Ashutosh Bapat wrote:
>> Do you see that those patches can be used in current discussion in any way?
> 
> It wouldn't really be a bad idea to put that patch here, because there's
> no special reason for it to be in the CF for PG 11, if we are talking here
> about changing \d command outputs anyway.

So, here are 4 patches (including the 2 patches that Ashutosh linked to
upthread):

0001: Show relispartition=true relations as "(foreign) partition" and
      RELKIND_PARTITIONED_TABLE relations that are not themselves
      partitions as "partitioned table"

0002: Hide relispartition=true relations (partitions) by default in the
      \d listing (that is, \d without a name pattern); to enable
      displaying partitions, add a modifier '++'

0003: In \d+ partitioned_table output (describe partitioned table showing
      individual partitions), show if the individual partitions are
      partitioned themselves if it actually does have partitions
      currently

0004: In \d+ partitioned_table output, do not skip the portion of the
      output showing information about partitions if there are currently
      no partitions defined; instead show "Number of partitions: 0"


Regarding 0001, while it shows "partition" and "partitioned table" in the
Type column of \d listing, \d name_pattern will still show Table
"schemaname.tablename".  For example:

\d
             List of relations
 Schema | Name  |       Type        | Owner
--------+-------+-------------------+-------
 public | xyz   | partitioned table | amit
 public | xyz1  | partition         | amit
 public | xyz2  | partition         | amit
 public | xyz3  | partition         | amit
 public | xyz31 | partition         | amit
(5 rows)

\d xyz*
                Table "public.xyz"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a      | integer |           |          |
Partition key: LIST (a)
Number of partitions: 3 (Use \d+ to list them.)

                Table "public.xyz1"
<snip>
                Table "public.xyz2"
<snip>
                Table "public.xyz3"
<snip>
                Table "public.xyz31"
<snip>

...which might seem kind of odd.  Do we want to show xyz1 as "Partition
public.xyz1", for example?

Thanks,
Amit
From ceacc566ab7ac2ffe56a47435a53a12ebafdffe5 Mon Sep 17 00:00:00 2001
From: amit <amitlangot...@gmail.com>
Date: Mon, 10 Jul 2017 13:25:20 +0900
Subject: [PATCH 1/4] Show partitions and partitioned tables as such in \d
 listing

---
 src/bin/psql/describe.c | 51 ++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 42 insertions(+), 9 deletions(-)

diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index e6833eced5..4613490f56 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -3321,27 +3321,60 @@ listTables(const char *tabtypes, const char *pattern, 
bool verbose, bool showSys
        printfPQExpBuffer(&buf,
                                          "SELECT n.nspname as \"%s\",\n"
                                          "  c.relname as \"%s\",\n"
-                                         "  CASE c.relkind"
-                                         " WHEN " 
CppAsString2(RELKIND_RELATION) " THEN '%s'"
+                                         "  CASE c.relkind",
+                                         gettext_noop("Schema"),
+                                         gettext_noop("Name"));
+
+       /*
+        * Starting in PG 10, certain kinds of relations could be partitions, 
which
+        * if so, we show Type accordingly.
+        */
+       if (pset.sversion >= 100000)
+               appendPQExpBuffer(&buf,
+                                                 " WHEN " 
CppAsString2(RELKIND_RELATION) " THEN"
+                                                 "   CASE c.relispartition"
+                                                 "     WHEN 'true' THEN '%s' 
ELSE '%s'"
+                                                 "   END"
+
+                                                 " WHEN " 
CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN"
+                                                 "   CASE c.relispartition"
+                                                 "     WHEN 'true' THEN '%s' 
ELSE '%s'"
+                                                 "   END"
+
+                                                 " WHEN " 
CppAsString2(RELKIND_FOREIGN_TABLE) " THEN"
+                                                 "   CASE c.relispartition"
+                                                 "     WHEN 'true' THEN '%s' 
ELSE '%s'"
+                                                 "   END",
+                                                 gettext_noop("partition"),
+                                                 gettext_noop("table"),
+
+                                                 gettext_noop("partition"),
+                                                 gettext_noop("partitioned 
table"),
+
+                                                 gettext_noop("foreign 
partition"),
+                                                 gettext_noop("foreign 
table"));
+       else
+               appendPQExpBuffer(&buf,
+                                                 " WHEN " 
CppAsString2(RELKIND_RELATION) " THEN '%s'"
+                                                 " WHEN " 
CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN '%s'"
+                                                 " WHEN " 
CppAsString2(RELKIND_FOREIGN_TABLE) " THEN '%s'",
+                                                 gettext_noop("table"),
+                                                 gettext_noop("partitioned 
table"),
+                                                 gettext_noop("foreign 
table"));
+
+       appendPQExpBuffer(&buf,
                                          " WHEN " CppAsString2(RELKIND_VIEW) " 
THEN '%s'"
                                          " WHEN " 
CppAsString2(RELKIND_MATVIEW) " THEN '%s'"
                                          " WHEN " CppAsString2(RELKIND_INDEX) 
" THEN '%s'"
                                          " WHEN " 
CppAsString2(RELKIND_SEQUENCE) " THEN '%s'"
                                          " WHEN 's' THEN '%s'"
-                                         " WHEN " 
CppAsString2(RELKIND_FOREIGN_TABLE) " THEN '%s'"
-                                         " WHEN " 
CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN '%s'"
                                          " END as \"%s\",\n"
                                          "  
pg_catalog.pg_get_userbyid(c.relowner) as \"%s\"",
-                                         gettext_noop("Schema"),
-                                         gettext_noop("Name"),
-                                         gettext_noop("table"),
                                          gettext_noop("view"),
                                          gettext_noop("materialized view"),
                                          gettext_noop("index"),
                                          gettext_noop("sequence"),
                                          gettext_noop("special"),
-                                         gettext_noop("foreign table"),
-                                         gettext_noop("table"),        /* 
partitioned table */
                                          gettext_noop("Type"),
                                          gettext_noop("Owner"));
 
-- 
2.11.0

From 32e3a030fcc3642c8af3dfae0c40869f8377299b Mon Sep 17 00:00:00 2001
From: amit <amitlangot...@gmail.com>
Date: Mon, 10 Jul 2017 13:57:47 +0900
Subject: [PATCH 2/4] Exclude partitions by default from the the psql \d
 listing

Add a new modifier '!' to \d to request listing partitions.
---
 doc/src/sgml/ref/psql-ref.sgml | 14 +++++++++-----
 src/bin/psql/command.c         | 13 +++++++++----
 src/bin/psql/describe.c        | 12 ++++++++++--
 src/bin/psql/describe.h        |  4 ++--
 src/bin/psql/help.c            | 12 ++++++------
 5 files changed, 36 insertions(+), 19 deletions(-)

diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index c592edac60..8bb2f5bb0c 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -1096,7 +1096,7 @@ testdb=&gt;
 
 
       <varlistentry>
-        <term><literal>\d[S+] [ <link linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
+        <term><literal>\d[S{+|++}] [ <link 
linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
 
         <listitem>
         <para>
@@ -1132,7 +1132,9 @@ testdb=&gt;
         <para>
         By default, only user-created objects are shown;  supply a
         pattern or the <literal>S</literal> modifier to include system
-        objects.
+        objects.  Also, by default, only non-partition objects are shown;
+        supply a pattern or the <literal>!</literal> modifier to include
+        partitions.
         </para>
 
         <note>
@@ -1296,11 +1298,11 @@ testdb=&gt;
 
 
       <varlistentry>
-        <term><literal>\dE[S+] [ <link 
linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
+        <term><literal>\dE[S{+|++}] [ <link 
linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
         <term><literal>\di[S+] [ <link 
linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
         <term><literal>\dm[S+] [ <link 
linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
         <term><literal>\ds[S+] [ <link 
linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
-        <term><literal>\dt[S+] [ <link 
linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
+        <term><literal>\dt[S{+|++}] [ <link 
linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
         <term><literal>\dv[S+] [ <link 
linkend="APP-PSQL-patterns"><replaceable 
class="parameter">pattern</replaceable></link> ]</literal></term>
 
         <listitem>
@@ -1320,7 +1322,9 @@ testdb=&gt;
         specified, only objects whose names match the pattern are listed.
         By default, only user-created objects are shown; supply a
         pattern or the <literal>S</literal> modifier to include system
-        objects.
+        objects.  Also, by default, only non-partition objects are shown;
+        supply a pattern or the <literal>++</literal> modifier to include
+        partitions.
         </para>
         </listitem>
       </varlistentry>
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 14c64208ca..07a4e7d0ac 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -703,7 +703,8 @@ exec_command_d(PsqlScanState scan_state, bool 
active_branch, const char *cmd)
        {
                char       *pattern;
                bool            show_verbose,
-                                       show_system;
+                                       show_system,
+                                       show_partitions;
 
                /* We don't do SQLID reduction on the pattern yet */
                pattern = psql_scan_slash_option(scan_state,
@@ -711,6 +712,7 @@ exec_command_d(PsqlScanState scan_state, bool 
active_branch, const char *cmd)
 
                show_verbose = strchr(cmd, '+') ? true : false;
                show_system = strchr(cmd, 'S') ? true : false;
+               show_partitions = strstr(cmd, "++") ? true : false;
 
                switch (cmd[1])
                {
@@ -718,10 +720,12 @@ exec_command_d(PsqlScanState scan_state, bool 
active_branch, const char *cmd)
                        case '+':
                        case 'S':
                                if (pattern)
-                                       success = describeTableDetails(pattern, 
show_verbose, show_system);
+                                       success = describeTableDetails(pattern, 
show_verbose, show_system,
+                                                                               
                   show_partitions);
                                else
                                        /* standard listing of interesting 
things */
-                                       success = listTables("tvmsE", NULL, 
show_verbose, show_system);
+                                       success = listTables("tvmsE", NULL, 
show_verbose, show_system,
+                                                                               
 show_partitions);
                                break;
                        case 'A':
                                success = describeAccessMethods(pattern, 
show_verbose);
@@ -795,7 +799,8 @@ exec_command_d(PsqlScanState scan_state, bool 
active_branch, const char *cmd)
                        case 'i':
                        case 's':
                        case 'E':
-                               success = listTables(&cmd[1], pattern, 
show_verbose, show_system);
+                               success = listTables(&cmd[1], pattern, 
show_verbose, show_system,
+                                                                        
show_partitions);
                                break;
                        case 'r':
                                if (cmd[2] == 'd' && cmd[3] == 's')
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 4613490f56..86adfb71b7 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -1284,7 +1284,8 @@ objectDescription(const char *pattern, bool showSystem)
  * verbose: if true, this is \d+
  */
 bool
-describeTableDetails(const char *pattern, bool verbose, bool showSystem)
+describeTableDetails(const char *pattern, bool verbose, bool showSystem,
+                                        bool showPartitions)
 {
        PQExpBufferData buf;
        PGresult   *res;
@@ -1303,6 +1304,9 @@ describeTableDetails(const char *pattern, bool verbose, 
bool showSystem)
                appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
                                                         "      AND n.nspname 
<> 'information_schema'\n");
 
+       if (pset.sversion >= 100000 && !showPartitions && !pattern)
+               appendPQExpBufferStr(&buf, "      AND relispartition = 
false\n");
+
        processSQLNamePattern(pset.db, &buf, pattern, !showSystem && !pattern, 
false,
                                                  "n.nspname", "c.relname", 
NULL,
                                                  
"pg_catalog.pg_table_is_visible(c.oid)");
@@ -3294,7 +3298,8 @@ listDbRoleSettings(const char *pattern, const char 
*pattern2)
  * (any order of the above is fine)
  */
 bool
-listTables(const char *tabtypes, const char *pattern, bool verbose, bool 
showSystem)
+listTables(const char *tabtypes, const char *pattern, bool verbose, bool 
showSystem,
+                  bool showPartitions)
 {
        bool            showTables = strchr(tabtypes, 't') != NULL;
        bool            showIndexes = strchr(tabtypes, 'i') != NULL;
@@ -3444,6 +3449,9 @@ listTables(const char *tabtypes, const char *pattern, 
bool verbose, bool showSys
         */
        appendPQExpBufferStr(&buf, "      AND n.nspname !~ '^pg_toast'\n");
 
+       if (pset.sversion >= 100000 && !showPartitions)
+               appendPQExpBufferStr(&buf, "      AND relispartition = 
'false'\n");
+
        processSQLNamePattern(pset.db, &buf, pattern, true, false,
                                                  "n.nspname", "c.relname", 
NULL,
                                                  
"pg_catalog.pg_table_is_visible(c.oid)");
diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h
index 14a5667f3e..f48c505798 100644
--- a/src/bin/psql/describe.h
+++ b/src/bin/psql/describe.h
@@ -43,7 +43,7 @@ extern bool listDefaultACLs(const char *pattern);
 extern bool objectDescription(const char *pattern, bool showSystem);
 
 /* \d foo */
-extern bool describeTableDetails(const char *pattern, bool verbose, bool 
showSystem);
+extern bool describeTableDetails(const char *pattern, bool verbose, bool 
showSystem, bool showPartitions);
 
 /* \dF */
 extern bool listTSConfigs(const char *pattern, bool verbose);
@@ -61,7 +61,7 @@ extern bool listTSTemplates(const char *pattern, bool 
verbose);
 extern bool listAllDbs(const char *pattern, bool verbose);
 
 /* \dt, \di, \ds, \dS, etc. */
-extern bool listTables(const char *tabtypes, const char *pattern, bool 
verbose, bool showSystem);
+extern bool listTables(const char *tabtypes, const char *pattern, bool 
verbose, bool showSystem, bool showPartitions);
 
 /* \dD */
 extern bool listDomains(const char *pattern, bool verbose, bool showSystem);
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index b3dbb5946e..d0603f6436 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -218,9 +218,9 @@ slashUsage(unsigned short int pager)
        fprintf(output, "\n");
 
        fprintf(output, _("Informational\n"));
-       fprintf(output, _("  (options: S = show system objects, + = additional 
detail)\n"));
-       fprintf(output, _("  \\d[S+]                 list tables, views, and 
sequences\n"));
-       fprintf(output, _("  \\d[S+]  NAME           describe table, view, 
sequence, or index\n"));
+       fprintf(output, _("  (options: S = show system objects, + = additional 
detail, ++ = show partitions)\n"));
+       fprintf(output, _("  \\d[S{+|++}]            list tables, views, and 
sequences\n"));
+       fprintf(output, _("  \\d[S{+|++}]  NAME      describe table, view, 
sequence, or index\n"));
        fprintf(output, _("  \\da[S]  [PATTERN]      list aggregates\n"));
        fprintf(output, _("  \\dA[+]  [PATTERN]      list access methods\n"));
        fprintf(output, _("  \\db[+]  [PATTERN]      list tablespaces\n"));
@@ -229,8 +229,8 @@ slashUsage(unsigned short int pager)
        fprintf(output, _("  \\dd[S]  [PATTERN]      show object descriptions 
not displayed elsewhere\n"));
        fprintf(output, _("  \\dD[S+] [PATTERN]      list domains\n"));
        fprintf(output, _("  \\ddp    [PATTERN]      list default 
privileges\n"));
-       fprintf(output, _("  \\dE[S+] [PATTERN]      list foreign tables\n"));
-       fprintf(output, _("  \\det[+] [PATTERN]      list foreign tables\n"));
+       fprintf(output, _("  \\dE[S{+|++}] [PATTERN] list foreign tables\n"));
+       fprintf(output, _("  \\det[{+|++}] [PATTERN] list foreign tables\n"));
        fprintf(output, _("  \\des[+] [PATTERN]      list foreign servers\n"));
        fprintf(output, _("  \\deu[+] [PATTERN]      list user mappings\n"));
        fprintf(output, _("  \\dew[+] [PATTERN]      list foreign-data 
wrappers\n"));
@@ -252,7 +252,7 @@ slashUsage(unsigned short int pager)
        fprintf(output, _("  \\dRp[+] [PATTERN]      list replication 
publications\n"));
        fprintf(output, _("  \\dRs[+] [PATTERN]      list replication 
subscriptions\n"));
        fprintf(output, _("  \\ds[S+] [PATTERN]      list sequences\n"));
-       fprintf(output, _("  \\dt[S+] [PATTERN]      list tables\n"));
+       fprintf(output, _("  \\dt[S{+|++}] [PATTERN] list tables\n"));
        fprintf(output, _("  \\dT[S+] [PATTERN]      list data types\n"));
        fprintf(output, _("  \\du[S+] [PATTERN]      list roles\n"));
        fprintf(output, _("  \\dv[S+] [PATTERN]      list views\n"));
-- 
2.11.0

From adbe3b01da876ea506dbffedc7188c3ebfd46e42 Mon Sep 17 00:00:00 2001
From: amit <amitlangot...@gmail.com>
Date: Wed, 12 Jul 2017 15:24:07 +0900
Subject: [PATCH 3/4] Indicate whether a partition is itself partitioned in \d+
 output

That's done by appending a " has partitions" string to the line
describing an individual partition.

Authors: Amit Langote, Ashutosh Bapat
---
 src/bin/psql/describe.c              | 37 +++++++++++++++++++++++++-----------
 src/test/regress/expected/insert.out | 15 +++++++++++++++
 src/test/regress/sql/insert.sql      |  4 ++++
 3 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 86adfb71b7..faf69b95c6 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -2838,7 +2838,9 @@ describeOneTableDetails(const char *schemaname,
                /* print child tables (with additional info if partitions) */
                if (pset.sversion >= 100000)
                        printfPQExpBuffer(&buf,
-                                                         "SELECT 
c.oid::pg_catalog.regclass, pg_get_expr(c.relpartbound, c.oid)"
+                                                         "SELECT 
c.oid::pg_catalog.regclass,"
+                                                         "       
pg_get_expr(c.relpartbound, c.oid),"
+                                                         "       c.relkind"
                                                          " FROM 
pg_catalog.pg_class c, pg_catalog.pg_inherits i"
                                                          " WHERE 
c.oid=i.inhrelid AND"
                                                          " i.inhparent = '%s' 
AND"
@@ -2863,21 +2865,25 @@ describeOneTableDetails(const char *schemaname,
 
                if (!verbose)
                {
+                       const char *ct = (tableinfo.relkind != 
RELKIND_PARTITIONED_TABLE)
+                                                                       ? 
_("child tables")
+                                                                       : 
_("partitions");
+
                        /* print the number of child tables, if any */
                        if (tuples > 0)
                        {
-                               if (tableinfo.relkind != 
RELKIND_PARTITIONED_TABLE)
-                                       printfPQExpBuffer(&buf, _("Number of 
child tables: %d (Use \\d+ to list them.)"), tuples);
-                               else
-                                       printfPQExpBuffer(&buf, _("Number of 
partitions: %d (Use \\d+ to list them.)"), tuples);
+                               printfPQExpBuffer(&buf,
+                                                         _("Number of %s: %d 
(Use \\d+ to list them.)"),
+                                                         ct, tuples);
                                printTableAddFooter(&cont, buf.data);
                        }
                }
                else
                {
                        /* display the list of child tables */
-                       const char *ct = (tableinfo.relkind != 
RELKIND_PARTITIONED_TABLE) ?
-                       _("Child tables") : _("Partitions");
+                       const char *ct = (tableinfo.relkind != 
RELKIND_PARTITIONED_TABLE)
+                                                                       ? 
_("Child tables")
+                                                                       : 
_("Partitions");
                        int                     ctw = pg_wcswidth(ct, 
strlen(ct), pset.encoding);
 
                        for (i = 0; i < tuples; i++)
@@ -2893,12 +2899,21 @@ describeOneTableDetails(const char *schemaname,
                                }
                                else
                                {
+                                       char *partitioned_note;
+
+                                       if (*PQgetvalue(result, i, 2) == 
RELKIND_PARTITIONED_TABLE)
+                                               partitioned_note = " has 
partitions";
+                                       else
+                                               partitioned_note = "";
+
                                        if (i == 0)
-                                               printfPQExpBuffer(&buf, "%s: %s 
%s",
-                                                                               
  ct, PQgetvalue(result, i, 0), PQgetvalue(result, i, 1));
+                                               printfPQExpBuffer(&buf, "%s: %s 
%s%s",
+                                                                               
  ct, PQgetvalue(result, i, 0), PQgetvalue(result, i, 1),
+                                                                               
  partitioned_note);
                                        else
-                                               printfPQExpBuffer(&buf, "%*s  
%s %s",
-                                                                               
  ctw, "", PQgetvalue(result, i, 0), PQgetvalue(result, i, 1));
+                                               printfPQExpBuffer(&buf, "%*s  
%s %s%s",
+                                                                               
  ctw, "", PQgetvalue(result, i, 0), PQgetvalue(result, i, 1),
+                                                                               
  partitioned_note);
                                }
                                if (i < tuples - 1)
                                        appendPQExpBufferChar(&buf, ',');
diff --git a/src/test/regress/expected/insert.out 
b/src/test/regress/expected/insert.out
index d1153f410b..210a158521 100644
--- a/src/test/regress/expected/insert.out
+++ b/src/test/regress/expected/insert.out
@@ -314,6 +314,21 @@ select tableoid::regclass::text, a, min(b) as min_b, 
max(b) as max_b from list_p
  part_null     |    |     1 |     1
 (9 rows)
 
+-- test \d+ output on a table which has both partitioned and unpartitioned
+-- partitions
+\d+ list_parted
+                                Table "public.list_parted"
+ Column |  Type   | Collation | Nullable | Default | Storage  | Stats target | 
Description 
+--------+---------+-----------+----------+---------+----------+--------------+-------------
+ a      | text    |           |          |         | extended |              | 
+ b      | integer |           |          |         | plain    |              | 
+Partition key: LIST (lower(a))
+Partitions: part_aa_bb FOR VALUES IN ('aa', 'bb'),
+            part_cc_dd FOR VALUES IN ('cc', 'dd'),
+            part_ee_ff FOR VALUES IN ('ee', 'ff') has partitions,
+            part_gg FOR VALUES IN ('gg') has partitions,
+            part_null FOR VALUES IN (NULL)
+
 -- cleanup
 drop table range_parted, list_parted;
 -- more tests for certain multi-level partitioning scenarios
diff --git a/src/test/regress/sql/insert.sql b/src/test/regress/sql/insert.sql
index 83c3ad8f53..3c67692ace 100644
--- a/src/test/regress/sql/insert.sql
+++ b/src/test/regress/sql/insert.sql
@@ -185,6 +185,10 @@ insert into list_parted select 'gg', s.a from 
generate_series(1, 9) s(a);
 insert into list_parted (b) values (1);
 select tableoid::regclass::text, a, min(b) as min_b, max(b) as max_b from 
list_parted group by 1, 2 order by 1;
 
+-- test \d+ output on a table which has both partitioned and unpartitioned
+-- partitions
+\d+ list_parted
+
 -- cleanup
 drop table range_parted, list_parted;
 
-- 
2.11.0

From d42522fb19d74a4154d3310a667a82ca888e0bf9 Mon Sep 17 00:00:00 2001
From: amit <amitlangot...@gmail.com>
Date: Wed, 12 Jul 2017 15:37:29 +0900
Subject: [PATCH 4/4] Fix \d+ output for yet empty partitioned tables

Currently it only shows the partition key line, but says nothing
about partitions.  Instead add a line saying it has 0 partitions.

Authors: Amit Langote, Ashutosh Bapat
---
 src/bin/psql/describe.c                    | 16 +++++++++++++++-
 src/test/regress/expected/create_table.out | 13 ++++++++-----
 src/test/regress/expected/foreign_data.out |  3 +++
 src/test/regress/sql/create_table.sql      |  2 +-
 4 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index faf69b95c6..28b0f2b62a 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -2863,7 +2863,20 @@ describeOneTableDetails(const char *schemaname,
                else
                        tuples = PQntuples(result);
 
-               if (!verbose)
+               /*
+                * For a partitioned table with no partitions, always print the 
number
+                * of partitions as zero, even when verbose output is expected.
+                * Otherwise, we will not print "Partitions" section for a 
partitioned
+                * table without any partitions.
+                */
+               if (tableinfo.relkind == RELKIND_PARTITIONED_TABLE && tuples == 
0)
+               {
+
+                       /* print the number of child tables, if any */
+                       printfPQExpBuffer(&buf, _("Number of partitions: %d"), 
tuples);
+                       printTableAddFooter(&cont, buf.data);
+               }
+               else if (!verbose)
                {
                        const char *ct = (tableinfo.relkind != 
RELKIND_PARTITIONED_TABLE)
                                                                        ? 
_("child tables")
@@ -2921,6 +2934,7 @@ describeOneTableDetails(const char *schemaname,
                                printTableAddFooter(&cont, buf.data);
                        }
                }
+
                PQclear(result);
 
                /* Table type */
diff --git a/src/test/regress/expected/create_table.out 
b/src/test/regress/expected/create_table.out
index b6f794e1c2..f6c6a514fa 100644
--- a/src/test/regress/expected/create_table.out
+++ b/src/test/regress/expected/create_table.out
@@ -428,13 +428,15 @@ ERROR:  cannot inherit from partitioned table 
"partitioned2"
  c      | text    |           |          | 
  d      | text    |           |          | 
 Partition key: RANGE (a oid_ops, plusone(b), c, d COLLATE "C")
+Number of partitions: 0
 
-\d partitioned2
-            Table "public.partitioned2"
- Column |  Type   | Collation | Nullable | Default 
---------+---------+-----------+----------+---------
- a      | integer |           |          | 
+\d+ partitioned2
+                               Table "public.partitioned2"
+ Column |  Type   | Collation | Nullable | Default | Storage | Stats target | 
Description 
+--------+---------+-----------+----------+---------+---------+--------------+-------------
+ a      | integer |           |          |         | plain   |              | 
 Partition key: LIST ((a + 1))
+Number of partitions: 0
 
 DROP TABLE partitioned, partitioned2;
 --
@@ -773,5 +775,6 @@ SELECT obj_description('parted_col_comment'::regclass);
  a      | integer |           |          |         | plain    |              | 
Partition key
  b      | text    |           |          |         | extended |              | 
 Partition key: LIST (a)
+Number of partitions: 0
 
 DROP TABLE parted_col_comment;
diff --git a/src/test/regress/expected/foreign_data.out 
b/src/test/regress/expected/foreign_data.out
index 7f2f529393..51da5e91e2 100644
--- a/src/test/regress/expected/foreign_data.out
+++ b/src/test/regress/expected/foreign_data.out
@@ -1879,6 +1879,7 @@ DROP FOREIGN TABLE pt2_1;
  c2     | text    |           |          |         | extended |              | 
  c3     | date    |           |          |         | plain    |              | 
 Partition key: LIST (c1)
+Number of partitions: 0
 
 CREATE FOREIGN TABLE pt2_1 (
        c1 integer NOT NULL,
@@ -1963,6 +1964,7 @@ ALTER TABLE pt2 ALTER c2 SET NOT NULL;
  c2     | text    |           | not null |         | extended |              | 
  c3     | date    |           |          |         | plain    |              | 
 Partition key: LIST (c1)
+Number of partitions: 0
 
 \d+ pt2_1
                                       Foreign table "public.pt2_1"
@@ -1992,6 +1994,7 @@ ALTER TABLE pt2 ADD CONSTRAINT pt2chk1 CHECK (c1 > 0);
 Partition key: LIST (c1)
 Check constraints:
     "pt2chk1" CHECK (c1 > 0)
+Number of partitions: 0
 
 \d+ pt2_1
                                       Foreign table "public.pt2_1"
diff --git a/src/test/regress/sql/create_table.sql 
b/src/test/regress/sql/create_table.sql
index cb7aa5bbc6..80106dd7d9 100644
--- a/src/test/regress/sql/create_table.sql
+++ b/src/test/regress/sql/create_table.sql
@@ -421,7 +421,7 @@ CREATE TABLE fail () INHERITS (partitioned2);
 
 -- Partition key in describe output
 \d partitioned
-\d partitioned2
+\d+ partitioned2
 
 DROP TABLE partitioned, partitioned2;
 
-- 
2.11.0

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to