Commit fec1ad94 authored by Tom Lane's avatar Tom Lane

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
parent 3d2b31e3
......@@ -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)
......
......@@ -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
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment