While translating a message, I found a questionable behavior in \d+, introduced by a recent commit b0e96f3119. In short, the current code hides the constraint's origin when "NO INHERIT" is used.
For these tables: create table p (a int, b int not null default 0); create table c1 (a int, b int not null default 1) inherits (p); The output from "\d+ c1" contains the lines: > Not-null constraints: > "c1_b_not_null" NOT NULL "b" *(local, inherited)* But with these tables: create table p (a int, b int not null default 0); create table c1 (a int, b int not null NO INHERIT default 1) inherits (p); I get: > Not-null constraints: > "c1_b_not_null" NOT NULL "b" *NO INHERIT* Here, "NO INHERIT" is mapped from connoinherit, and conislocal and "coninhcount <> 0" align with "local" and "inherited". For a clearer picuture, those values for c1 are as follows. =# SELECT co.conname, at.attname, co.connoinherit, co.conislocal, co.coninhcount FROM pg_catalog.pg_constraint co JOIN pg_catalog.pg_attribute at ON (at.attnum = co.conkey[1]) WHERE co.contype = 'n' AND co.conrelid = 'c1'::pg_catalog.regclass AND at.attrelid = 'c1'::pg_catalog.regclass ORDER BY at.attnum; conname | attname | connoinherit | conislocal | coninhcount ---------------+---------+--------------+------------+------------- c1_b_not_null | b | t | t | 1 It feels off to me, but couldn't find any discussion about it. Is it the intended behavior? I believe it's more appropriate to show the origins even when specifed as NO INHERIT. ====== If not so, the following change might be possible, which is quite simple. > Not-null constraints: > "c1_b_not_null" NOT NULL "b" NO INHERIT(local, inherited) However, it looks somewhat strange as the information in parentheses is not secondary to "NO INHERIT". Thus, perhaps a clearer or more proper representation would be: > "c1_b_not_null" NOT NULL "b" (local, inherited, not inheritable) That being said, I don't come up with a simple way to do this for now.. (Note that we need to translate the puctuations and the words.) There's no need to account for all combinations. "Local" and "inherited" don't be false at the same time and the combination (local & !inherited) is not displayed. Given these factors, we're left with 6 possible combinations, which I don't think aren't worth the hassle: (local, inherited, not inheritable) (inherited, not inheritable) # I didn't figure out how to cause this. (not inheritable) (local, inherited) (inherited) "" (empty string, means local) A potential solution that comes to mind is presenting the attributes in a space sparated list after a colon as attached. (Honestly, I'm not fond of the format and the final term, though.) > "c1_b_not_null" NOT NULL "b": local inherited uninheritable In 0001, I did wonder about hiding "local" when it's not inherited, but this behavior rfollows existing code. In 0002, I'm not completely satisfied with the location, but standard regression test suite seems more suitable for this check than the TAP test suite used for testing psql. regards. -- Kyotaro Horiguchi NTT Open Source Software Center
>From 6c8511499d5dbfc769c38b32292d415fa8982707 Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi <horikyota....@gmail.com> Date: Mon, 28 Aug 2023 14:38:58 +0900 Subject: [PATCH 1/2] Fix not-null constraint representation in \d+ The recent commit b0e96f3119 added the description about not-null constraints in the output of \d+ command. It hided constraints' origin when it is marked as NO INHERIT. Show their origin irrespective of the NO INHERIT state. --- src/bin/psql/describe.c | 22 +++++++--- src/test/regress/expected/constraints.out | 12 ++--- src/test/regress/expected/create_table.out | 6 +-- .../regress/expected/create_table_like.out | 6 +-- src/test/regress/expected/foreign_data.out | 44 +++++++++---------- src/test/regress/expected/generated.out | 2 +- src/test/regress/expected/inherit.out | 30 ++++++------- 7 files changed, 66 insertions(+), 56 deletions(-) diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index bac94a338c..3bf1c0cb97 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -3079,16 +3079,26 @@ describeOneTableDetails(const char *schemaname, /* Might be an empty set - that's ok */ for (i = 0; i < tuples; i++) { + bool noinherit = PQgetvalue(result, i, 2)[0] == 't'; bool islocal = PQgetvalue(result, i, 3)[0] == 't'; bool inherited = PQgetvalue(result, i, 4)[0] == 't'; - printfPQExpBuffer(&buf, " \"%s\" NOT NULL \"%s\"%s", + printfPQExpBuffer(&buf, " \"%s\" NOT NULL \"%s\"", PQgetvalue(result, i, 0), - PQgetvalue(result, i, 1), - PQgetvalue(result, i, 2)[0] == 't' ? - " NO INHERIT" : - islocal && inherited ? _(" (local, inherited)") : - inherited ? _(" (inherited)") : ""); + PQgetvalue(result, i, 1)); + if (inherited || noinherit) + { + appendPQExpBufferChar(&buf, ':'); + + if (inherited) + { + if (islocal) + appendPQExpBufferStr(&buf, _(" local")); + appendPQExpBufferStr(&buf, _(" inherited")); + } + if (noinherit) + appendPQExpBufferStr(&buf, _(" uninheritable")); + } printTableAddFooter(&cont, buf.data); } diff --git a/src/test/regress/expected/constraints.out b/src/test/regress/expected/constraints.out index b7de50ad6a..d4adbaa518 100644 --- a/src/test/regress/expected/constraints.out +++ b/src/test/regress/expected/constraints.out @@ -914,7 +914,7 @@ ALTER TABLE cnn_parent ADD PRIMARY KEY (b); a | integer | | | | plain | | b | integer | | not null | | plain | | Not-null constraints: - "cnn_grandchild_b_not_null" NOT NULL "b" (local, inherited) + "cnn_grandchild_b_not_null" NOT NULL "b": local inherited Inherits: cnn_child Child tables: cnn_grandchild2 @@ -925,7 +925,7 @@ Child tables: cnn_grandchild2 a | integer | | | | plain | | b | integer | | not null | | plain | | Not-null constraints: - "cnn_grandchild_b_not_null" NOT NULL "b" (inherited) + "cnn_grandchild_b_not_null" NOT NULL "b": inherited Inherits: cnn_grandchild, cnn_child2 @@ -951,7 +951,7 @@ ERROR: multiple primary keys for table "cnn_parent" are not allowed a | integer | | | | plain | | b | integer | | not null | | plain | | Not-null constraints: - "cnn_grandchild_b_not_null" NOT NULL "b" (local, inherited) + "cnn_grandchild_b_not_null" NOT NULL "b": local inherited Inherits: cnn_child Child tables: cnn_grandchild2 @@ -962,7 +962,7 @@ Child tables: cnn_grandchild2 a | integer | | | | plain | | b | integer | | not null | | plain | | Not-null constraints: - "cnn_grandchild_b_not_null" NOT NULL "b" (inherited) + "cnn_grandchild_b_not_null" NOT NULL "b": inherited Inherits: cnn_grandchild, cnn_child2 @@ -988,7 +988,7 @@ ALTER TABLE cnn_parent ADD PRIMARY KEY USING INDEX b_uq; a | integer | | | | plain | | b | integer | | not null | | plain | | Not-null constraints: - "cnn_grandchild_b_not_null" NOT NULL "b" (local, inherited) + "cnn_grandchild_b_not_null" NOT NULL "b": local inherited Inherits: cnn_child Child tables: cnn_grandchild2 @@ -999,7 +999,7 @@ Child tables: cnn_grandchild2 a | integer | | | | plain | | b | integer | | not null | | plain | | Not-null constraints: - "cnn_grandchild_b_not_null" NOT NULL "b" (inherited) + "cnn_grandchild_b_not_null" NOT NULL "b": inherited Inherits: cnn_grandchild, cnn_child2 diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index 344d05233a..293e4292e9 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -855,7 +855,7 @@ drop table test_part_coll_posix; Partition of: parted FOR VALUES IN ('b') Partition constraint: ((a IS NOT NULL) AND (a = 'b'::text)) Not-null constraints: - "part_b_b_not_null" NOT NULL "b" (local, inherited) + "part_b_b_not_null" NOT NULL "b": local inherited -- Both partition bound and partition key in describe output \d+ part_c @@ -868,7 +868,7 @@ Partition of: parted FOR VALUES IN ('c') Partition constraint: ((a IS NOT NULL) AND (a = 'c'::text)) Partition key: RANGE (b) Not-null constraints: - "part_c_b_not_null" NOT NULL "b" (local, inherited) + "part_c_b_not_null" NOT NULL "b": local inherited Partitions: part_c_1_10 FOR VALUES FROM (1) TO (10) -- a level-2 partition's constraint will include the parent's expressions @@ -881,7 +881,7 @@ Partitions: part_c_1_10 FOR VALUES FROM (1) TO (10) Partition of: part_c FOR VALUES FROM (1) TO (10) Partition constraint: ((a IS NOT NULL) AND (a = 'c'::text) AND (b IS NOT NULL) AND (b >= 1) AND (b < 10)) Not-null constraints: - "part_c_b_not_null" NOT NULL "b" (inherited) + "part_c_b_not_null" NOT NULL "b": inherited -- Show partition count in the parent's describe output -- Tempted to include \d+ output listing partitions with bound info but diff --git a/src/test/regress/expected/create_table_like.out b/src/test/regress/expected/create_table_like.out index 61956773ff..6604d0c7fa 100644 --- a/src/test/regress/expected/create_table_like.out +++ b/src/test/regress/expected/create_table_like.out @@ -360,7 +360,7 @@ NOTICE: merging constraint "ctlt1_a_check" with inherited definition Check constraints: "ctlt1_a_check" CHECK (length(a) > 2) Not-null constraints: - "ctlt1_inh_a_not_null" NOT NULL "a" (local, inherited) + "ctlt1_inh_a_not_null" NOT NULL "a": local inherited Inherits: ctlt1 SELECT description FROM pg_description, pg_constraint c WHERE classoid = 'pg_constraint'::regclass AND objoid = c.oid AND c.conrelid = 'ctlt1_inh'::regclass; @@ -383,7 +383,7 @@ Check constraints: "ctlt3_a_check" CHECK (length(a) < 5) "ctlt3_c_check" CHECK (length(c) < 7) Not-null constraints: - "ctlt13_inh_a_not_null" NOT NULL "a" (inherited) + "ctlt13_inh_a_not_null" NOT NULL "a": inherited Inherits: ctlt1, ctlt3 @@ -403,7 +403,7 @@ Check constraints: "ctlt3_a_check" CHECK (length(a) < 5) "ctlt3_c_check" CHECK (length(c) < 7) Not-null constraints: - "ctlt13_like_a_not_null" NOT NULL "a" (inherited) + "ctlt13_like_a_not_null" NOT NULL "a": inherited Inherits: ctlt1 SELECT description FROM pg_description, pg_constraint c WHERE classoid = 'pg_constraint'::regclass AND objoid = c.oid AND c.conrelid = 'ctlt13_like'::regclass; diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out index 1dfe23cc1e..17cdd7e5b3 100644 --- a/src/test/regress/expected/foreign_data.out +++ b/src/test/regress/expected/foreign_data.out @@ -1421,7 +1421,7 @@ Child tables: ft2, FOREIGN c2 | text | | | | | extended | | c3 | date | | | | | plain | | Not-null constraints: - "fd_pt1_c1_not_null" NOT NULL "c1" (inherited) + "fd_pt1_c1_not_null" NOT NULL "c1": inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1474,7 +1474,7 @@ Child tables: ft2, FOREIGN c2 | text | | | | | extended | | c3 | date | | | | | plain | | Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (local, inherited) + "ft2_c1_not_null" NOT NULL "c1": local inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1497,7 +1497,7 @@ NOTICE: merging column "c3" with inherited definition c2 | text | | | | | extended | | c3 | date | | | | | plain | | Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (local, inherited) + "ft2_c1_not_null" NOT NULL "c1": local inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1512,7 +1512,7 @@ Child tables: ct3, c2 | text | | | | extended | | c3 | date | | | | plain | | Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (inherited) + "ft2_c1_not_null" NOT NULL "c1": inherited Inherits: ft2 \d+ ft3 @@ -1523,7 +1523,7 @@ Inherits: ft2 c2 | text | | | | | extended | | c3 | date | | | | | plain | | Not-null constraints: - "ft3_c1_not_null" NOT NULL "c1" (local, inherited) + "ft3_c1_not_null" NOT NULL "c1": local inherited Server: s0 Inherits: ft2 @@ -1563,8 +1563,8 @@ Child tables: ft2, FOREIGN c7 | integer | | not null | | | plain | | c8 | integer | | | | | plain | | Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (local, inherited) - "fd_pt1_c7_not_null" NOT NULL "c7" (inherited) + "ft2_c1_not_null" NOT NULL "c1": local inherited + "fd_pt1_c7_not_null" NOT NULL "c7": inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1584,8 +1584,8 @@ Child tables: ct3, c7 | integer | | not null | | plain | | c8 | integer | | | | plain | | Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (inherited) - "fd_pt1_c7_not_null" NOT NULL "c7" (inherited) + "ft2_c1_not_null" NOT NULL "c1": inherited + "fd_pt1_c7_not_null" NOT NULL "c7": inherited Inherits: ft2 \d+ ft3 @@ -1601,8 +1601,8 @@ Inherits: ft2 c7 | integer | | not null | | | plain | | c8 | integer | | | | | plain | | Not-null constraints: - "ft3_c1_not_null" NOT NULL "c1" (local, inherited) - "fd_pt1_c7_not_null" NOT NULL "c7" (inherited) + "ft3_c1_not_null" NOT NULL "c1": local inherited + "fd_pt1_c7_not_null" NOT NULL "c7": inherited Server: s0 Inherits: ft2 @@ -1649,8 +1649,8 @@ Child tables: ft2, FOREIGN c7 | integer | | | | | plain | | c8 | text | | | | | external | | Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (local, inherited) - "fd_pt1_c6_not_null" NOT NULL "c6" (inherited) + "ft2_c1_not_null" NOT NULL "c1": local inherited + "fd_pt1_c6_not_null" NOT NULL "c6": inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1682,7 +1682,7 @@ Child tables: ft2, FOREIGN c2 | text | | | | | extended | | c3 | date | | | | | plain | | Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (local, inherited) + "ft2_c1_not_null" NOT NULL "c1": local inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1729,7 +1729,7 @@ Child tables: ft2, FOREIGN Check constraints: "fd_pt1chk2" CHECK (c2 <> ''::text) Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (local, inherited) + "ft2_c1_not_null" NOT NULL "c1": local inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1780,7 +1780,7 @@ Child tables: ft2, FOREIGN Check constraints: "fd_pt1chk2" CHECK (c2 <> ''::text) Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (local, inherited) + "ft2_c1_not_null" NOT NULL "c1": local inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1815,7 +1815,7 @@ Check constraints: "fd_pt1chk2" CHECK (c2 <> ''::text) "fd_pt1chk3" CHECK (c2 <> ''::text) NOT VALID Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (local, inherited) + "ft2_c1_not_null" NOT NULL "c1": local inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1846,7 +1846,7 @@ Check constraints: "fd_pt1chk2" CHECK (c2 <> ''::text) "fd_pt1chk3" CHECK (c2 <> ''::text) Not-null constraints: - "ft2_c1_not_null" NOT NULL "c1" (local, inherited) + "ft2_c1_not_null" NOT NULL "c1": local inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1881,7 +1881,7 @@ Check constraints: "f2_check" CHECK (f2 <> ''::text) "fd_pt1chk2" CHECK (f2 <> ''::text) Not-null constraints: - "ft2_c1_not_null" NOT NULL "f1" (local, inherited) + "ft2_c1_not_null" NOT NULL "f1": local inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') Inherits: fd_pt1 @@ -1942,7 +1942,7 @@ Partitions: fd_pt2_1 FOR VALUES IN (1), FOREIGN Partition of: fd_pt2 FOR VALUES IN (1) Partition constraint: ((c1 IS NOT NULL) AND (c1 = 1)) Not-null constraints: - "fd_pt2_c1_not_null" NOT NULL "c1" (inherited) + "fd_pt2_c1_not_null" NOT NULL "c1": inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') @@ -2024,7 +2024,7 @@ Partitions: fd_pt2_1 FOR VALUES IN (1), FOREIGN Partition of: fd_pt2 FOR VALUES IN (1) Partition constraint: ((c1 IS NOT NULL) AND (c1 = 1)) Not-null constraints: - "fd_pt2_1_c1_not_null" NOT NULL "c1" (inherited) + "fd_pt2_1_c1_not_null" NOT NULL "c1": inherited Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') @@ -2058,7 +2058,7 @@ Partition constraint: ((c1 IS NOT NULL) AND (c1 = 1)) Check constraints: "p21chk" CHECK (c2 <> ''::text) Not-null constraints: - "fd_pt2_1_c1_not_null" NOT NULL "c1" (inherited) + "fd_pt2_1_c1_not_null" NOT NULL "c1": inherited "fd_pt2_1_c3_not_null" NOT NULL "c3" Server: s0 FDW options: (delimiter ',', quote '"', "be quoted" 'value') diff --git a/src/test/regress/expected/generated.out b/src/test/regress/expected/generated.out index dc97ed3fe0..4a1744f129 100644 --- a/src/test/regress/expected/generated.out +++ b/src/test/regress/expected/generated.out @@ -316,7 +316,7 @@ NOTICE: merging column "b" with inherited definition b | integer | | | generated always as (a * 22) stored | plain | | x | integer | | | | plain | | Not-null constraints: - "gtestx_a_not_null" NOT NULL "a" (inherited) + "gtestx_a_not_null" NOT NULL "a": inherited Inherits: gtest1 CREATE TABLE gtestxx_1 (a int NOT NULL, b int); diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out index 6daca12340..c80e398f71 100644 --- a/src/test/regress/expected/inherit.out +++ b/src/test/regress/expected/inherit.out @@ -2007,7 +2007,7 @@ Child tables: cc2 f4 | double precision | | | | plain | | a2 | integer | | not null | | plain | | Not-null constraints: - "nn" NOT NULL "a2" (inherited) + "nn" NOT NULL "a2": inherited Inherits: pp1, cc1 @@ -2031,7 +2031,7 @@ Child tables: cc1, f3 | integer | | | | plain | | a2 | integer | | not null | | plain | | Not-null constraints: - "pp1_f1_not_null" NOT NULL "f1" (inherited) + "pp1_f1_not_null" NOT NULL "f1": inherited "nn" NOT NULL "a2" Inherits: pp1 Child tables: cc2 @@ -2046,8 +2046,8 @@ Child tables: cc2 f4 | double precision | | | | plain | | a2 | integer | | not null | | plain | | Not-null constraints: - "pp1_f1_not_null" NOT NULL "f1" (inherited) - "nn" NOT NULL "a2" (inherited) + "pp1_f1_not_null" NOT NULL "f1": inherited + "nn" NOT NULL "a2": inherited Inherits: pp1, cc1 @@ -2065,7 +2065,7 @@ alter table cc1 alter column a2 drop not null; f3 | integer | | | | plain | | a2 | integer | | | | plain | | Not-null constraints: - "pp1_f1_not_null" NOT NULL "f1" (inherited) + "pp1_f1_not_null" NOT NULL "f1": inherited Inherits: pp1 Child tables: cc2 @@ -2082,7 +2082,7 @@ ERROR: cannot drop inherited constraint "pp1_f1_not_null" of relation "cc2" f4 | double precision | | | | plain | | a2 | integer | | | | plain | | Not-null constraints: - "pp1_f1_not_null" NOT NULL "f1" (inherited) + "pp1_f1_not_null" NOT NULL "f1": inherited Inherits: pp1, cc1 @@ -2112,8 +2112,8 @@ create table inh_child () inherits (inh_parent1, inh_parent2); a | integer | | not null | | plain | | b | integer | | not null | | plain | | Not-null constraints: - "nn" NOT NULL "a" (inherited) - "inh_child_b_not_null" NOT NULL "b" (inherited) + "nn" NOT NULL "a": inherited + "inh_child_b_not_null" NOT NULL "b": inherited Inherits: inh_parent1, inh_parent2 @@ -2147,9 +2147,9 @@ select conrelid::regclass, conname, contype, conkey, d | integer | | not null | | plain | | e | integer | | | | plain | | Not-null constraints: - "inh_child_a_not_null" NOT NULL "a" (inherited) - "inh_child_b_not_null" NOT NULL "b" (inherited) - "inh_child_d_not_null" NOT NULL "d" (inherited) + "inh_child_a_not_null" NOT NULL "a": inherited + "inh_child_b_not_null" NOT NULL "b": inherited + "inh_child_d_not_null" NOT NULL "d": inherited Inherits: inh_parent1, inh_parent2 @@ -2188,7 +2188,7 @@ Inherits: inh_nn_parent --------+---------+-----------+----------+---------+---------+--------------+------------- a | integer | | not null | | plain | | Not-null constraints: - "inh_nn_parent_a_not_null" NOT NULL "a" NO INHERIT + "inh_nn_parent_a_not_null" NOT NULL "a": uninheritable Child tables: inh_nn_child, inh_nn_child2 @@ -2223,7 +2223,7 @@ Child tables: inh_child1 --------+---------+-----------+----------+---------+---------+--------------+------------- f1 | integer | | not null | | plain | | Not-null constraints: - "inh_child1_f1_not_null" NOT NULL "f1" (local, inherited) + "inh_child1_f1_not_null" NOT NULL "f1": local inherited Inherits: inh_parent Child tables: inh_child2 @@ -2233,7 +2233,7 @@ Child tables: inh_child2 --------+---------+-----------+----------+---------+---------+--------------+------------- f1 | integer | | not null | | plain | | Not-null constraints: - "inh_child2_f1_not_null" NOT NULL "f1" (local, inherited) + "inh_child2_f1_not_null" NOT NULL "f1": local inherited Inherits: inh_child1 select conrelid::regclass, conname, contype, coninhcount, conislocal @@ -2277,7 +2277,7 @@ Child tables: inh_child2, --------+---------+-----------+----------+---------+---------+--------------+------------- f1 | integer | | not null | | plain | | Not-null constraints: - "inh_child2_f1_not_null" NOT NULL "f1" (local, inherited) + "inh_child2_f1_not_null" NOT NULL "f1": local inherited Inherits: inh_child1 select conrelid::regclass, conname, contype, coninhcount, conislocal -- 2.39.3
>From 606eb7074f18d330833d044d262eeadfe7f6ac12 Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi <horikyota....@gmail.com> Date: Mon, 28 Aug 2023 15:27:53 +0900 Subject: [PATCH 2/2] Add tests for \d+ not-null constraints Separated for improved readability. --- src/test/regress/expected/inherit.out | 35 ++++++++++++++++++++++++--- src/test/regress/sql/inherit.sql | 7 +++--- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out index c80e398f71..99f260b1a5 100644 --- a/src/test/regress/expected/inherit.out +++ b/src/test/regress/expected/inherit.out @@ -2155,10 +2155,14 @@ Inherits: inh_parent1, drop table inh_parent1, inh_parent2, inh_child; -- NOT NULL NO INHERIT -create table inh_nn_parent(a int); +create table inh_nn_parent(a int, b int); create table inh_nn_child() inherits (inh_nn_parent); alter table inh_nn_parent add not null a no inherit; -create table inh_nn_child2() inherits (inh_nn_parent); +create table inh_nn_child2(c int not null) inherits (inh_nn_parent); +create table inh_nn_child3(a int not null, b int not null no inherit, c int not null no inherit) inherits (inh_nn_child2); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "b" with inherited definition +NOTICE: merging column "c" with inherited definition select conrelid::regclass, conname, contype, conkey, (select attname from pg_attribute where attrelid = conrelid and attnum = conkey[1]), coninhcount, conislocal, connoinherit @@ -2167,32 +2171,55 @@ select conrelid::regclass, conname, contype, conkey, order by 2, 1; conrelid | conname | contype | conkey | attname | coninhcount | conislocal | connoinherit ---------------+--------------------------+---------+--------+---------+-------------+------------+-------------- + inh_nn_child2 | inh_nn_child2_c_not_null | n | {3} | c | 0 | t | f + inh_nn_child3 | inh_nn_child3_a_not_null | n | {1} | a | 0 | t | f + inh_nn_child3 | inh_nn_child3_b_not_null | n | {2} | b | 0 | t | t + inh_nn_child3 | inh_nn_child3_c_not_null | n | {3} | c | 1 | t | t inh_nn_parent | inh_nn_parent_a_not_null | n | {1} | a | 0 | t | t -(1 row) +(5 rows) \d+ inh_nn* Table "public.inh_nn_child" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+---------+-----------+----------+---------+---------+--------------+------------- a | integer | | | | plain | | + b | integer | | | | plain | | Inherits: inh_nn_parent Table "public.inh_nn_child2" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+---------+-----------+----------+---------+---------+--------------+------------- a | integer | | | | plain | | + b | integer | | | | plain | | + c | integer | | not null | | plain | | +Not-null constraints: + "inh_nn_child2_c_not_null" NOT NULL "c" Inherits: inh_nn_parent +Child tables: inh_nn_child3 + + Table "public.inh_nn_child3" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + b | integer | | not null | | plain | | + c | integer | | not null | | plain | | +Not-null constraints: + "inh_nn_child3_a_not_null" NOT NULL "a" + "inh_nn_child3_b_not_null" NOT NULL "b": uninheritable + "inh_nn_child3_c_not_null" NOT NULL "c": local inherited uninheritable +Inherits: inh_nn_child2 Table "public.inh_nn_parent" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+---------+-----------+----------+---------+---------+--------------+------------- a | integer | | not null | | plain | | + b | integer | | | | plain | | Not-null constraints: "inh_nn_parent_a_not_null" NOT NULL "a": uninheritable Child tables: inh_nn_child, inh_nn_child2 -drop table inh_nn_parent, inh_nn_child, inh_nn_child2; +drop table inh_nn_parent, inh_nn_child, inh_nn_child2, inh_nn_child3; -- -- test inherit/deinherit -- diff --git a/src/test/regress/sql/inherit.sql b/src/test/regress/sql/inherit.sql index d8fae92a53..82e9118745 100644 --- a/src/test/regress/sql/inherit.sql +++ b/src/test/regress/sql/inherit.sql @@ -777,10 +777,11 @@ select conrelid::regclass, conname, contype, conkey, drop table inh_parent1, inh_parent2, inh_child; -- NOT NULL NO INHERIT -create table inh_nn_parent(a int); +create table inh_nn_parent(a int, b int); create table inh_nn_child() inherits (inh_nn_parent); alter table inh_nn_parent add not null a no inherit; -create table inh_nn_child2() inherits (inh_nn_parent); +create table inh_nn_child2(c int not null) inherits (inh_nn_parent); +create table inh_nn_child3(a int not null, b int not null no inherit, c int not null no inherit) inherits (inh_nn_child2); select conrelid::regclass, conname, contype, conkey, (select attname from pg_attribute where attrelid = conrelid and attnum = conkey[1]), coninhcount, conislocal, connoinherit @@ -788,7 +789,7 @@ select conrelid::regclass, conname, contype, conkey, conrelid::regclass::text like 'inh\_nn\_%' order by 2, 1; \d+ inh_nn* -drop table inh_nn_parent, inh_nn_child, inh_nn_child2; +drop table inh_nn_parent, inh_nn_child, inh_nn_child2, inh_nn_child3; -- -- test inherit/deinherit -- 2.39.3