Commit a0e8df52 authored by Robert Haas's avatar Robert Haas

Allow ALTER TYPE .. ADD ATTRIBUTE .. CASCADE to recurse to descendants.

Without this, adding an attribute to a typed table with an inheritance
child fails, which is surprising.

Noah Misch, with minor changes by me.
parent 8ede4279
...@@ -122,7 +122,7 @@ ALTER TYPE <replaceable class="PARAMETER">name</replaceable> ADD VALUE <replacea ...@@ -122,7 +122,7 @@ ALTER TYPE <replaceable class="PARAMETER">name</replaceable> ADD VALUE <replacea
<listitem> <listitem>
<para> <para>
Automatically propagate the operation to typed tables of the Automatically propagate the operation to typed tables of the
type being altered. type being altered, and their descendants.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
......
...@@ -3876,7 +3876,8 @@ ATSimpleRecursion(List **wqueue, Relation rel, ...@@ -3876,7 +3876,8 @@ ATSimpleRecursion(List **wqueue, Relation rel,
* ATTypedTableRecursion * ATTypedTableRecursion
* *
* Propagate ALTER TYPE operations to the typed tables of that type. * 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 static void
ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd,
...@@ -3898,7 +3899,7 @@ ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, ...@@ -3898,7 +3899,7 @@ ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd,
childrel = relation_open(childrelid, lockmode); childrel = relation_open(childrelid, lockmode);
CheckTableNotInUse(childrel, "ALTER TABLE"); CheckTableNotInUse(childrel, "ALTER TABLE");
ATPrepCmd(wqueue, childrel, cmd, false, true, lockmode); ATPrepCmd(wqueue, childrel, cmd, true, true, lockmode);
relation_close(childrel, NoLock); relation_close(childrel, NoLock);
} }
} }
......
...@@ -1845,6 +1845,7 @@ ALTER TYPE test_type1 ALTER ATTRIBUTE b TYPE varchar; -- fails ...@@ -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 ERROR: cannot alter type "test_type1" because column "test_tbl1"."y" uses it
CREATE TYPE test_type2 AS (a int, b text); CREATE TYPE test_type2 AS (a int, b text);
CREATE TABLE test_tbl2 OF test_type2; CREATE TABLE test_tbl2 OF test_type2;
CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2);
\d test_type2 \d test_type2
Composite type "public.test_type2" Composite type "public.test_type2"
Column | Type | Modifiers Column | Type | Modifiers
...@@ -1858,6 +1859,7 @@ Composite type "public.test_type2" ...@@ -1858,6 +1859,7 @@ Composite type "public.test_type2"
--------+---------+----------- --------+---------+-----------
a | integer | a | integer |
b | text | b | text |
Number of child tables: 1 (Use \d+ to list them.)
Typed table of type: test_type2 Typed table of type: test_type2
ALTER TYPE test_type2 ADD ATTRIBUTE c text; -- fails ALTER TYPE test_type2 ADD ATTRIBUTE c text; -- fails
...@@ -1879,6 +1881,7 @@ Composite type "public.test_type2" ...@@ -1879,6 +1881,7 @@ Composite type "public.test_type2"
a | integer | a | integer |
b | text | b | text |
c | text | c | text |
Number of child tables: 1 (Use \d+ to list them.)
Typed table of type: test_type2 Typed table of type: test_type2
ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar; -- fails ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar; -- fails
...@@ -1900,6 +1903,7 @@ ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar CASCADE; ...@@ -1900,6 +1903,7 @@ ALTER TYPE test_type2 ALTER ATTRIBUTE b TYPE varchar CASCADE;
a | integer | a | integer |
b | character varying | b | character varying |
c | text | c | text |
Number of child tables: 1 (Use \d+ to list them.)
Typed table of type: test_type2 Typed table of type: test_type2
ALTER TYPE test_type2 DROP ATTRIBUTE b; -- fails ALTER TYPE test_type2 DROP ATTRIBUTE b; -- fails
...@@ -1919,6 +1923,7 @@ Composite type "public.test_type2" ...@@ -1919,6 +1923,7 @@ Composite type "public.test_type2"
--------+---------+----------- --------+---------+-----------
a | integer | a | integer |
c | text | c | text |
Number of child tables: 1 (Use \d+ to list them.)
Typed table of type: test_type2 Typed table of type: test_type2
ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa; -- fails ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa; -- fails
...@@ -1938,8 +1943,18 @@ Composite type "public.test_type2" ...@@ -1938,8 +1943,18 @@ Composite type "public.test_type2"
--------+---------+----------- --------+---------+-----------
aa | integer | aa | integer |
c | text | c | text |
Number of child tables: 1 (Use \d+ to list them.)
Typed table of type: test_type2 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 (); CREATE TYPE test_type_empty AS ();
DROP TYPE test_type_empty; DROP TYPE test_type_empty;
-- --
......
...@@ -1344,6 +1344,7 @@ ALTER TYPE test_type1 ALTER ATTRIBUTE b TYPE varchar; -- fails ...@@ -1344,6 +1344,7 @@ ALTER TYPE test_type1 ALTER ATTRIBUTE b TYPE varchar; -- fails
CREATE TYPE test_type2 AS (a int, b text); CREATE TYPE test_type2 AS (a int, b text);
CREATE TABLE test_tbl2 OF test_type2; CREATE TABLE test_tbl2 OF test_type2;
CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2);
\d test_type2 \d test_type2
\d test_tbl2 \d test_tbl2
...@@ -1366,6 +1367,9 @@ ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa; -- fails ...@@ -1366,6 +1367,9 @@ ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa; -- fails
ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa CASCADE; ALTER TYPE test_type2 RENAME ATTRIBUTE a TO aa CASCADE;
\d test_type2 \d test_type2
\d test_tbl2 \d test_tbl2
\d test_tbl2_subclass
DROP TABLE test_tbl2_subclass;
CREATE TYPE test_type_empty AS (); CREATE TYPE test_type_empty AS ();
DROP TYPE test_type_empty; DROP TYPE test_type_empty;
......
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