]> granicus.if.org Git - postgresql/commitdiff
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),