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.
This commit is contained in:
parent
8ede427938
commit
a0e8df527e
@ -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,
|
|||||||
* 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,
|
|||||||
|
|
||||||
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
|
|||||||
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"
|
|||||||
--------+---------+-----------
|
--------+---------+-----------
|
||||||
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"
|
|||||||
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;
|
|||||||
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"
|
|||||||
--------+---------+-----------
|
--------+---------+-----------
|
||||||
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"
|
|||||||
--------+---------+-----------
|
--------+---------+-----------
|
||||||
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
|
|||||||
|
|
||||||
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
|
|||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user