rhaas=# create table A(ff1 int); CREATE TABLE rhaas=# create table B () inherits (A); CREATE TABLE rhaas=# create table C () inherits (B); CREATE TABLE rhaas=# alter table only b add constraint chk check (ff1 > 0); ALTER TABLE rhaas=# alter table a add constraint chk check (ff1 > 0); NOTICE: merging constraint "chk" with inherited definition ALTER TABLE
At this point, you'll find that a has a constraint, and b has a constraint, but *c does not have a constraint*. That's bad, because a's constraint wasn't "only" and should therefore have propagated all the way down the tree.
Apologies, I did not check this particular scenario.
I guess, here, we should not allow merging of the inherited constraint into an "only" constraint. Because that breaks the semantics for "only" constraints. If this sounds ok, I can whip up a patch for the same.
PFA, patch which does just this.
postgres=# alter table a add constraint chk check (ff1 > 0); ERROR: constraint "chk" for relation "b" is an ONLY constraint. Cannot merge