]> granicus.if.org Git - postgresql/commitdiff
Allow ALTER TYPE .. ADD ATTRIBUTE .. CASCADE to recurse to descendants.
authorRobert Haas <rhaas@postgresql.org>
Thu, 21 Apr 2011 02:49:37 +0000 (22:49 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 21 Apr 2011 02:49:37 +0000 (22:49 -0400)
Without this, adding an attribute to a typed table with an inheritance
child fails, which is surprising.

Noah Misch, with minor changes by me.

doc/src/sgml/ref/alter_type.sgml
src/backend/commands/tablecmds.c
src/test/regress/expected/alter_table.out
src/test/regress/sql/alter_table.sql

index e889ffbc352e41724d0d238f90c50ac13f06ca8e..a417c0d01b30dfcda8b09dd16848e36b032cc1fa 100644 (file)
@@ -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>
index 26062f45602847f26f06da7480c0c9ee2eb8b67d..bcf660b6de02f139f71d294aaef2d455e8940db8 100644 (file)
@@ -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);
        }
 }
index 8344d8542fa768b632d01fb1525831c85c7c34e7..a6fb36e2d97fef5234bd2affff8d2a9177b143a2 100644 (file)
@@ -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;
 --
index 25fa7d562c597699e0243164a057512e59cf02a7..4b2afe8bc932fafaa39bd9ef694f7b89f6595f51 100644 (file)
@@ -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;