mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Disallow changing an inherited column's type if not all parents changed.
If a table inherits from multiple unrelated parents, we must disallow changing the type of a column inherited from multiple such parents, else it would be out of step with the other parents. However, it's possible for the column to ultimately be inherited from just one common ancestor, in which case a change starting from that ancestor should still be allowed. (I would not be excited about preserving that option, were it not that we have regression test cases exercising it already ...) It's slightly annoying that this patch looks different from the logic with the same end goal in renameatt(), and more annoying that it requires an extra syscache lookup to make the test. However, the recursion logic is quite different in the two functions, and a back-patched bug fix is no place to be trying to unify them. Per report from Manuel Rigger. Back-patch to 9.5. The bug exists in 9.4 too (and doubtless much further back); but the way the recursion is done in 9.4 is a good bit different, so that substantial refactoring would be needed to fix it in 9.4. I'm disinclined to do that, or risk introducing new bugs, for a bug that has escaped notice for this long. Discussion: https://postgr.es/m/CA+u7OA4qogDv9rz1HAb-ADxttXYPqQdUdPY_yd4kCzywNxRQXA@mail.gmail.com
This commit is contained in:
@ -723,6 +723,16 @@ select * from d;
|
||||
32 | one | two | three
|
||||
(1 row)
|
||||
|
||||
-- The above verified that we can change the type of a multiply-inherited
|
||||
-- column; but we should reject that if any definition was inherited from
|
||||
-- an unrelated parent.
|
||||
create temp table parent1(f1 int, f2 int);
|
||||
create temp table parent2(f1 int, f3 bigint);
|
||||
create temp table childtab(f4 int) inherits(parent1, parent2);
|
||||
NOTICE: merging multiple inherited definitions of column "f1"
|
||||
alter table parent1 alter column f1 type bigint; -- fail, conflict w/parent2
|
||||
ERROR: cannot alter inherited column "f1" of relation "childtab"
|
||||
alter table parent1 alter column f2 type bigint; -- ok
|
||||
-- Test non-inheritable parent constraints
|
||||
create table p1(ff1 int);
|
||||
alter table p1 add constraint p1chk check (ff1 > 0) no inherit;
|
||||
|
@ -208,6 +208,15 @@ insert into d values('test','one','two','three');
|
||||
alter table a alter column aa type integer using bit_length(aa);
|
||||
select * from d;
|
||||
|
||||
-- The above verified that we can change the type of a multiply-inherited
|
||||
-- column; but we should reject that if any definition was inherited from
|
||||
-- an unrelated parent.
|
||||
create temp table parent1(f1 int, f2 int);
|
||||
create temp table parent2(f1 int, f3 bigint);
|
||||
create temp table childtab(f4 int) inherits(parent1, parent2);
|
||||
alter table parent1 alter column f1 type bigint; -- fail, conflict w/parent2
|
||||
alter table parent1 alter column f2 type bigint; -- ok
|
||||
|
||||
-- Test non-inheritable parent constraints
|
||||
create table p1(ff1 int);
|
||||
alter table p1 add constraint p1chk check (ff1 > 0) no inherit;
|
||||
|
Reference in New Issue
Block a user