Include typmod when complaining about inherited column type mismatches.

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
This commit is contained in:
Tom Lane 2015-12-26 13:41:29 -05:00
parent 3d2b31e30e
commit fec1ad94df
3 changed files with 40 additions and 4 deletions

View 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)

View 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

View 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);