]> granicus.if.org Git - postgresql/commitdiff
Include typmod when complaining about inherited column type mismatches.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 26 Dec 2015 18:41:29 +0000 (13:41 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 26 Dec 2015 18:41:29 +0000 (13:41 -0500)
MergeAttributes() rejects cases where columns to be merged have the same
type but different typmod, which is correct; but the error message it
printed didn't show either typmod, which is unhelpful.  Changing this
requires using format_type_with_typemod() in place of TypeNameToString(),
which will have some minor side effects on the way some type names are
printed, but on balance this is an improvement: the old code sometimes
printed one type according to one set of rules and the other type according
to the other set, which could be confusing in its own way.

Oddly, there were no regression test cases covering any of this behavior,
so add some.

Complaint and fix by Amit Langote

src/backend/commands/tablecmds.c
src/test/regress/expected/alter_table.out
src/test/regress/sql/alter_table.sql

index 56fed4d87cd5ae83cdc2ab346ed604f8c14bd5cf..a217dbcb1ef65bfad0ffd02468ec4fba76d46054 100644 (file)
@@ -1613,8 +1613,10 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
                                                errmsg("inherited column \"%s\" has a type conflict",
                                                           attributeName),
                                                         errdetail("%s versus %s",
-                                                                          TypeNameToString(def->typeName),
-                                                                          format_type_be(attribute->atttypid))));
+                                                                          format_type_with_typemod(defTypeId,
+                                                                                                                               deftypmod),
+                                                               format_type_with_typemod(attribute->atttypid,
+                                                                                                       attribute->atttypmod))));
                                defCollId = GetColumnDefCollation(NULL, def, defTypeId);
                                if (defCollId != attribute->attcollation)
                                        ereport(ERROR,
@@ -1832,8 +1834,10 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
                                                         errmsg("column \"%s\" has a type conflict",
                                                                        attributeName),
                                                         errdetail("%s versus %s",
-                                                                          TypeNameToString(def->typeName),
-                                                                          TypeNameToString(newdef->typeName))));
+                                                                          format_type_with_typemod(defTypeId,
+                                                                                                                               deftypmod),
+                                                                          format_type_with_typemod(newTypeId,
+                                                                                                                               newtypmod))));
                                defcollid = GetColumnDefCollation(NULL, def, defTypeId);
                                newcollid = GetColumnDefCollation(NULL, newdef, newTypeId);
                                if (defcollid != newcollid)
index 228ae6ec22134b05a8a93b85733c190765bfacd4..7c88ddc9fed8ad604ac98fd4768907aea053cd95 100644 (file)
@@ -1268,6 +1268,27 @@ select * from child;
  12 | testing
 (1 row)
 
+drop table child;
+drop table parent;
+-- check error cases for inheritance column merging
+create table parent (a float8, b numeric(10,4), c text collate "C");
+create table child (a float4) inherits (parent); -- fail
+NOTICE:  merging column "a" with inherited definition
+ERROR:  column "a" has a type conflict
+DETAIL:  double precision versus real
+create table child (b decimal(10,7)) inherits (parent); -- fail
+NOTICE:  moving and merging column "b" with inherited definition
+DETAIL:  User-specified column moved to the position of the inherited column.
+ERROR:  column "b" has a type conflict
+DETAIL:  numeric(10,4) versus numeric(10,7)
+create table child (c text collate "POSIX") inherits (parent); -- fail
+NOTICE:  moving and merging column "c" with inherited definition
+DETAIL:  User-specified column moved to the position of the inherited column.
+ERROR:  column "c" has a collation conflict
+DETAIL:  "C" versus "POSIX"
+create table child (a double precision, b decimal(10,4)) inherits (parent);
+NOTICE:  merging column "a" with inherited definition
+NOTICE:  merging column "b" with inherited definition
 drop table child;
 drop table parent;
 -- test copy in/out
index 3db34609733779f7d8ded6b8b99d47ce64236932..72e65d4ee052e6708f8e127b75db3e726d973cdd 100644 (file)
@@ -906,6 +906,17 @@ select * from child;
 drop table child;
 drop table parent;
 
+-- check error cases for inheritance column merging
+create table parent (a float8, b numeric(10,4), c text collate "C");
+
+create table child (a float4) inherits (parent); -- fail
+create table child (b decimal(10,7)) inherits (parent); -- fail
+create table child (c text collate "POSIX") inherits (parent); -- fail
+create table child (a double precision, b decimal(10,4)) inherits (parent);
+
+drop table child;
+drop table parent;
+
 -- test copy in/out
 create table test (a int4, b int4, c int4);
 insert into test values (1,2,3);