Commit 05b6ec39 authored by Simon Riggs's avatar Simon Riggs

Show partition info from psql \d+

Author: Amit Langote, Ashutosh Bapat
Reviewed-by:  Álvaro Herrera, Simon Riggs
parent 7e17a688
...@@ -2870,7 +2870,9 @@ describeOneTableDetails(const char *schemaname, ...@@ -2870,7 +2870,9 @@ describeOneTableDetails(const char *schemaname,
/* print child tables (with additional info if partitions) */ /* print child tables (with additional info if partitions) */
if (pset.sversion >= 100000) if (pset.sversion >= 100000)
printfPQExpBuffer(&buf, printfPQExpBuffer(&buf,
"SELECT c.oid::pg_catalog.regclass, pg_catalog.pg_get_expr(c.relpartbound, c.oid)" "SELECT c.oid::pg_catalog.regclass,"
" pg_catalog.pg_get_expr(c.relpartbound, c.oid),"
" c.relkind"
" FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i" " FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i"
" WHERE c.oid=i.inhrelid AND i.inhparent = '%s'" " WHERE c.oid=i.inhrelid AND i.inhparent = '%s'"
" ORDER BY c.oid::pg_catalog.regclass::pg_catalog.text;", oid); " ORDER BY c.oid::pg_catalog.regclass::pg_catalog.text;", oid);
...@@ -2893,7 +2895,18 @@ describeOneTableDetails(const char *schemaname, ...@@ -2893,7 +2895,18 @@ describeOneTableDetails(const char *schemaname,
else else
tuples = PQntuples(result); 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)
{
printfPQExpBuffer(&buf, _("Number of partitions: %d"), tuples);
printTableAddFooter(&cont, buf.data);
}
else if (!verbose)
{ {
/* print the number of child tables, if any */ /* print the number of child tables, if any */
if (tuples > 0) if (tuples > 0)
...@@ -2925,12 +2938,21 @@ describeOneTableDetails(const char *schemaname, ...@@ -2925,12 +2938,21 @@ describeOneTableDetails(const char *schemaname,
} }
else else
{ {
char *partitioned_note;
if (*PQgetvalue(result, i, 2) == RELKIND_PARTITIONED_TABLE)
partitioned_note = ", PARTITIONED";
else
partitioned_note = "";
if (i == 0) if (i == 0)
printfPQExpBuffer(&buf, "%s: %s %s", printfPQExpBuffer(&buf, "%s: %s %s%s",
ct, PQgetvalue(result, i, 0), PQgetvalue(result, i, 1)); ct, PQgetvalue(result, i, 0), PQgetvalue(result, i, 1),
partitioned_note);
else else
printfPQExpBuffer(&buf, "%*s %s %s", printfPQExpBuffer(&buf, "%*s %s %s%s",
ctw, "", PQgetvalue(result, i, 0), PQgetvalue(result, i, 1)); ctw, "", PQgetvalue(result, i, 0), PQgetvalue(result, i, 1),
partitioned_note);
} }
if (i < tuples - 1) if (i < tuples - 1)
appendPQExpBufferChar(&buf, ','); appendPQExpBufferChar(&buf, ',');
......
...@@ -428,13 +428,15 @@ ERROR: cannot inherit from partitioned table "partitioned2" ...@@ -428,13 +428,15 @@ ERROR: cannot inherit from partitioned table "partitioned2"
c | text | | | c | text | | |
d | text | | | d | text | | |
Partition key: RANGE (a oid_ops, plusone(b), c, d COLLATE "C") Partition key: RANGE (a oid_ops, plusone(b), c, d COLLATE "C")
Number of partitions: 0
\d partitioned2 \d+ partitioned2
Table "public.partitioned2" Table "public.partitioned2"
Column | Type | Collation | Nullable | Default Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+---------+-----------+----------+--------- --------+---------+-----------+----------+---------+---------+--------------+-------------
a | integer | | | a | integer | | | | plain | |
Partition key: LIST (((a + 1))) Partition key: LIST (((a + 1)))
Number of partitions: 0
DROP TABLE partitioned, partitioned2; DROP TABLE partitioned, partitioned2;
-- --
...@@ -858,5 +860,6 @@ SELECT obj_description('parted_col_comment'::regclass); ...@@ -858,5 +860,6 @@ SELECT obj_description('parted_col_comment'::regclass);
a | integer | | | | plain | | Partition key a | integer | | | | plain | | Partition key
b | text | | | | extended | | b | text | | | | extended | |
Partition key: LIST (a) Partition key: LIST (a)
Number of partitions: 0
DROP TABLE parted_col_comment; DROP TABLE parted_col_comment;
...@@ -1898,6 +1898,7 @@ DROP FOREIGN TABLE pt2_1; ...@@ -1898,6 +1898,7 @@ DROP FOREIGN TABLE pt2_1;
c2 | text | | | | extended | | c2 | text | | | | extended | |
c3 | date | | | | plain | | c3 | date | | | | plain | |
Partition key: LIST (c1) Partition key: LIST (c1)
Number of partitions: 0
CREATE FOREIGN TABLE pt2_1 ( CREATE FOREIGN TABLE pt2_1 (
c1 integer NOT NULL, c1 integer NOT NULL,
...@@ -1982,6 +1983,7 @@ ALTER TABLE pt2 ALTER c2 SET NOT NULL; ...@@ -1982,6 +1983,7 @@ ALTER TABLE pt2 ALTER c2 SET NOT NULL;
c2 | text | | not null | | extended | | c2 | text | | not null | | extended | |
c3 | date | | | | plain | | c3 | date | | | | plain | |
Partition key: LIST (c1) Partition key: LIST (c1)
Number of partitions: 0
\d+ pt2_1 \d+ pt2_1
Foreign table "public.pt2_1" Foreign table "public.pt2_1"
...@@ -2011,6 +2013,7 @@ ALTER TABLE pt2 ADD CONSTRAINT pt2chk1 CHECK (c1 > 0); ...@@ -2011,6 +2013,7 @@ ALTER TABLE pt2 ADD CONSTRAINT pt2chk1 CHECK (c1 > 0);
Partition key: LIST (c1) Partition key: LIST (c1)
Check constraints: Check constraints:
"pt2chk1" CHECK (c1 > 0) "pt2chk1" CHECK (c1 > 0)
Number of partitions: 0
\d+ pt2_1 \d+ pt2_1
Foreign table "public.pt2_1" Foreign table "public.pt2_1"
......
...@@ -425,6 +425,23 @@ from hash_parted order by part; ...@@ -425,6 +425,23 @@ from hash_parted order by part;
hpart3 | 11 | 3 hpart3 | 11 | 3
(13 rows) (13 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_default DEFAULT, PARTITIONED,
part_ee_ff FOR VALUES IN ('ee', 'ff'), PARTITIONED,
part_gg FOR VALUES IN ('gg'), PARTITIONED,
part_null FOR VALUES IN (NULL),
part_xx_yy FOR VALUES IN ('xx', 'yy'), PARTITIONED
-- cleanup -- cleanup
drop table range_parted, list_parted; drop table range_parted, list_parted;
drop table hash_parted; drop table hash_parted;
......
...@@ -421,7 +421,7 @@ CREATE TABLE fail () INHERITS (partitioned2); ...@@ -421,7 +421,7 @@ CREATE TABLE fail () INHERITS (partitioned2);
-- Partition key in describe output -- Partition key in describe output
\d partitioned \d partitioned
\d partitioned2 \d+ partitioned2
DROP TABLE partitioned, partitioned2; DROP TABLE partitioned, partitioned2;
......
...@@ -252,6 +252,10 @@ insert into hpart3 values(11); ...@@ -252,6 +252,10 @@ insert into hpart3 values(11);
select tableoid::regclass as part, a, a%4 as "remainder = a % 4" select tableoid::regclass as part, a, a%4 as "remainder = a % 4"
from hash_parted order by part; from hash_parted order by part;
-- test \d+ output on a table which has both partitioned and unpartitioned
-- partitions
\d+ list_parted
-- cleanup -- cleanup
drop table range_parted, list_parted; drop table range_parted, list_parted;
drop table hash_parted; drop table hash_parted;
......
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