diff --git a/doc/src/sgml/ref/alter_type.sgml b/doc/src/sgml/ref/alter_type.sgml index e889ffbc352e41724d0d238f90c50ac13f06ca8e..a417c0d01b30dfcda8b09dd16848e36b032cc1fa 100644 --- a/doc/src/sgml/ref/alter_type.sgml +++ b/doc/src/sgml/ref/alter_type.sgml @@ -122,7 +122,7 @@ ALTER TYPE <replaceable class="PARAMETER">name</replaceable> ADD VALUE <replacea <listitem> <para> Automatically propagate the operation to typed tables of the - type being altered. + type being altered, and their descendants. </para> </listitem> </varlistentry> diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 26062f45602847f26f06da7480c0c9ee2eb8b67d..bcf660b6de02f139f71d294aaef2d455e8940db8 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -3876,7 +3876,8 @@ ATSimpleRecursion(List **wqueue, Relation rel, * ATTypedTableRecursion * * Propagate ALTER TYPE operations to the typed tables of that type. - * Also check the RESTRICT/CASCADE behavior. + * Also check the RESTRICT/CASCADE behavior. Given CASCADE, also permit + * recursion to inheritance children of the typed tables. */ static void ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, @@ -3898,7 +3899,7 @@ ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, childrel = relation_open(childrelid, lockmode); CheckTableNotInUse(childrel, "ALTER TABLE"); - ATPrepCmd(wqueue, childrel, cmd, false, true, lockmode); + ATPrepCmd(wqueue, childrel, cmd, true, true, lockmode); relation_close(childrel, NoLock); } } diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 8344d8542fa768b632d01fb1525831c85c7c34e7..a6fb36e2d97fef5234bd2affff8d2a9177b143a2 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -1845,6 +1845,7 @@ ALTER TYPE test_type1 ALTER ATTRIBUTE b TYPE varchar; -- fails ERROR: cannot alter type "test_type1" because column "test_tbl1"."y" uses it CREATE TYPE test_type2 AS (a int, b text); CREATE TABLE test_tbl2 OF test_type2; +CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2); \d test_type2 Composite type "public.test_type2" Column | Type | Modifiers @@ -1858,6 +1859,7 @@ Composite type "public.test_type2" --------+---------+----------- a | integer | b | text | +Number of child tables: 1 (Use \d+ to list them.) Typed table of type: test_type2 ALTER TYPE test_type2 ADD ATTRIBUTE c text; -- fails @@ -1879,6 +1881,7 @@ Composite type "public.test_type2" a | integer | b | text | c | text | +Number of child tables: 1 (Use \d+ to list them.) Typed table of type: test_type2 ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar; -- fails @@ -1900,6 +1903,7 @@ ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar CASCADE; a | integer | b | character varying | c | text | +Number of child tables: 1 (Use \d+ to list them.) Typed table of type: test_type2 ALTER TYPE test_type2 DROP ATTRIBUTE b; -- fails @@ -1919,6 +1923,7 @@ Composite type "public.test_type2" --------+---------+----------- a | integer | c | text | +Number of child tables: 1 (Use \d+ to list them.) Typed table of type: test_type2 ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa; -- fails @@ -1938,8 +1943,18 @@ Composite type "public.test_type2" --------+---------+----------- aa | integer | c | text | +Number of child tables: 1 (Use \d+ to list them.) Typed table of type: test_type2 +\d test_tbl2_subclass +Table "public.test_tbl2_subclass" + Column | Type | Modifiers +--------+---------+----------- + aa | integer | + c | text | +Inherits: test_tbl2 + +DROP TABLE test_tbl2_subclass; CREATE TYPE test_type_empty AS (); DROP TYPE test_type_empty; -- diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 25fa7d562c597699e0243164a057512e59cf02a7..4b2afe8bc932fafaa39bd9ef694f7b89f6595f51 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -1344,6 +1344,7 @@ ALTER TYPE test_type1 ALTER ATTRIBUTE b TYPE varchar; -- fails CREATE TYPE test_type2 AS (a int, b text); CREATE TABLE test_tbl2 OF test_type2; +CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2); \d test_type2 \d test_tbl2 @@ -1366,6 +1367,9 @@ ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa; -- fails ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa CASCADE; \d test_type2 \d test_tbl2 +\d test_tbl2_subclass + +DROP TABLE test_tbl2_subclass; CREATE TYPE test_type_empty AS (); DROP TYPE test_type_empty;