Add check for matching column collations in ALTER TABLE ... INHERIT.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 17 Apr 2011 20:22:13 +0000 (16:22 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 17 Apr 2011 20:22:13 +0000 (16:22 -0400)
The other DDL operations that create an inheritance relationship were
checking for collation match already, but this one got missed.

Also fix comments that failed to mention collation checks.

src/backend/commands/tablecmds.c

index 35929b20d53808466eaa9bb726c5cb121a25fe5a..1f709a4977360027e2783511fe50aa3182c55183 100644 (file)
@@ -1434,7 +1434,7 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
 
                /*
                 * Yes, try to merge the two column definitions. They must
-                * have the same type and typmod.
+                * have the same type, typmod, and collation.
                 */
                ereport(NOTICE,
                        (errmsg("merging multiple inherited definitions of column \"%s\"",
@@ -1620,7 +1620,7 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
 
                /*
                 * Yes, try to merge the two column definitions. They must
-                * have the same type and typmod.
+                * have the same type, typmod, and collation.
                 */
                ereport(NOTICE,
                   (errmsg("merging column \"%s\" with inherited definition",
@@ -4121,7 +4121,7 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel,
            int32       ctypmod;
            Oid         ccollid;
 
-           /* Child column must match by type */
+           /* Child column must match on type, typmod, and collation */
            typenameTypeIdAndMod(NULL, colDef->typeName, &ctypeId, &ctypmod);
            if (ctypeId != childatt->atttypid ||
                ctypmod != childatt->atttypmod)
@@ -8178,7 +8178,7 @@ MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel)
                                          attributeName);
        if (HeapTupleIsValid(tuple))
        {
-           /* Check they are same type and typmod */
+           /* Check they are same type, typmod, and collation */
            Form_pg_attribute childatt = (Form_pg_attribute) GETSTRUCT(tuple);
 
            if (attribute->atttypid != childatt->atttypid ||
@@ -8189,6 +8189,17 @@ MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel)
                                RelationGetRelationName(child_rel),
                                attributeName)));
 
+           if (attribute->attcollation != childatt->attcollation)
+               ereport(ERROR,
+                       (errcode(ERRCODE_COLLATION_MISMATCH),
+                        errmsg("child table \"%s\" has different collation for column \"%s\"",
+                               RelationGetRelationName(child_rel),
+                               attributeName)));
+
+           /*
+            * Check child doesn't discard NOT NULL property.  (Other
+            * constraints are checked elsewhere.)
+            */
            if (attribute->attnotnull && !childatt->attnotnull)
                ereport(ERROR,
                        (errcode(ERRCODE_DATATYPE_MISMATCH),