From: Robert Haas on
On Tue, Aug 3, 2010 at 3:05 PM, Yeb Havinga <yebhavinga(a)gmail.com> wrote:
> Yeb Havinga wrote:
>> The underlying cause is the failure of the code to recognize that if
>> relation C inherits from both A and B, where A and B both have column x,
>> that A.x 'is the same as' B.x, where the 'is the same as' relation is the
>> same that holds for (A.x, C.x) and (B.x, C.x), which the code does a lot of
>> trouble for to recognize. This means that if some definition is altered on
>> A.x, only C.x is updated and B.x not touched. IMO this is wrong and either a
>> multiple inheritance structure like this should be prohibited, since the
>> user did not explicitly declare that A.x and B.x 'are the same' (by e.g.
>> defining a relation D.x and have A and B inherit from that), or the code
>> should update parents of relations when the childs are updated.
>
> Thinking about this a bit more, the name 'is the same as' is a bit
> confusing, since that relation might not be commutative. C.x 'inherits
> properties from' A.x, or C.x 'is defined by' A.x are perhaps better names,
> that reflect that the converse might not hold. OTOH, what does C.x 'inherits
> (all) properties from' A.x mean? If it means that for all properties P,
> P(C.x) iff P(A.x), then C.x = �A.x commutatively and by similar reasoning
> A.x = B.x.
>
>> ALTER TABLE top1 RENAME COLUMN a_table_column TO another_table_column;
>
> When looking for previous discussions that was referred to upthread, the
> first thing I found was this recent thread about the exactly the same
> problem �http://archives.postgresql.org/pgsql-hackers/2010-01/msg03117.php
>
> Sorry for the double post, however the previous discussion postponed work to
> .. now, so maybe there is some value in first trying to specify exactly what
> 'inherits' means, and derive consequences for code behaviour from that.

Yeah, I was thinking about that thread, too, on my drive home from
Metuchen. I wouldn't get too bogged down in formal logic; it seems
there are a couple of distinct cases here:

1. If you're changing properties of a column, you need to verify for
each relation in the inheritance tree that the "expected attinhcount"
and the actual attinhcount match. If, for any relation in the
inheritance tree rooted at the named table, they don't, then they are
doubly inherited there, from some other table outside the hierarchy
rooted at the named table, and the operation must fail. We'd need
similar logic for constraints, if we had support for renaming or
otherwise modifying them, but right now we don't.

2. If you're adding a column, you need to propagate the new column to
relations that don't have it yet, but if you find one that already has
it than you adjust attinhcount and don't recurse to its chidlren.

3. If you're dropping a column, you essentially decrement the
attinhcount of all your children; then you recurse into any that reach
attincount = 0 and not attislocal and drop the column there as well.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers(a)postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

From: Robert Haas on
On Wed, Aug 4, 2010 at 3:48 AM, Yeb Havinga <yebhavinga(a)gmail.com> wrote:
> I just read that thread. In the beginning there is a short discussion what
> the non-astonishing behaviour of the RENAME in the case of multiple origin
> inheritance should be, which is preventing renames or any property change in
> that case. I think we should explore the possibilty of allowing the RENAME
> more.

If child inherits column A from parent1 and parent2, and it is then
renamed to B in parent2, what should the name be in the child after
the rename is completed?

For bonus points, how should pg_dump handle this to make sure the
state after a dump and reload matches the state before the dump and
reload?

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers(a)postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

From: Robert Haas on
On Wed, Aug 4, 2010 at 6:41 AM, Yeb Havinga <yebhavinga(a)gmail.com> wrote:
>> If child inherits column A from parent1 and parent2, and it is then
>> renamed to B in parent2, what should the name be in the child after
>> the rename is completed?
>
> The column should be renamed to B in parent2, child and parent1.

Uh, really? Wow. You want to follow the inheritance hierarchy in
both directions, both down and up? That seems like it could be
confusing.

>> For bonus points, how should pg_dump handle this to make sure the
>> state after a dump and reload matches the state before the dump and
>> reload?
>
> If the change happens in a single transaction there should be no problems
> here, as opposed to e.g. have the user issue two renames. Did I get the
> bonus points? :-)

Sure, though I'm not sure I like the basic idea. :-)

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers(a)postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

From: Tom Lane on
Andrew Dunstan <andrew(a)dunslane.net> writes:
> On 08/04/2010 06:41 AM, Robert Haas wrote:
>> Uh, really? Wow. You want to follow the inheritance hierarchy in
>> both directions, both down and up? That seems like it could be
>> confusing.

> It seems more than confusing. It seems fundamentally wrong. It would
> certainly be a violation of POLA.

I agree, this idea seems completely nuts. It is *not* reasonable for
an action applied to a child to change the definition of the parent.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers(a)postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

From: Tom Lane on
Yeb Havinga <yebhavinga(a)gmail.com> writes:
> Tom Lane wrote:
>> I agree, this idea seems completely nuts. It is *not* reasonable for
>> an action applied to a child to change the definition of the parent.

> Also not in the case that we're talking about here?

> A.a_column B.a_column
> | /
> v v
> C.a_column

> C inherits from A and B.

> The user wants to change a_column to better_name.

Well, if A and B inherited the column from a common ancestor, he can
easily do that. If not, maybe he should have thought harder before he
started. I do NOT agree that issuing a rename against C is a sane way
of dealing with this.

> This doesn't seem nuts to me.

You're in the minority.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers(a)postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers