Thread: BUG #5856: pg_attribute.attinhcount is not correct.

BUG #5856: pg_attribute.attinhcount is not correct.

From
"Naoya Anzai"
Date:
The following bug has been logged online:

Bug reference:      5856
Logged by:          Naoya Anzai
Email address:      anzai-naoya@mxu.nes.nec.co.jp
PostgreSQL version: 8.4.5
Operating system:   Red Hat Enterprise Linux Server release 5.5
Description:        pg_attribute.attinhcount is not correct.
Details:

In PostgreSQL8.4.5, I found that the catalog pg_attribute.attinhcount is not
correct.

I executed the following queries.

--------------------------------------------------------------------------
create table "3_grandchild"();
create table "2_child"();
create table "1_parent"();

alter table "3_grandchild" inherit "2_child";
alter table "2_child" inherit "1_parent";

alter table "3_grandchild" add column c1 text;
alter table "2_child" add column c1 text;
alter table "1_parent" add column c1 text;

select c.relname,a.attname,a.attinhcount from pg_attribute a,pg_class c
where a.attrelid=c.oid
and relname in ('1_parent','2_child','3_grandchild')
and attname not in('xmax','xmin','cmin','cmax','tableoid','ctid')
order by relname;

    relname    | attname | attinhcount
 --------------+---------+-------------
  1_parent     | c1      |           0
  2_child      | c1      |           1
  3_grandchild | c1      |           2
 (3 rows)
--------------------------------------------------------------------------

"3_grandchild"'s attinhcount should be 1.

When column "c1" is added  to "1_parent", "ATExecAddColumn" is
executed for "2_child" and "3_grandchild" too.
If column "c1" already exists on "2_child" and "3_grandchild",
"ATExecAddColumn" increment pg_attribute.attinhcount of "c1".

 childatt->attinhcount++;     # src/backend/commands/tablecmds.c:3560

But pg_attribute.attinhcount should be the number of parent table (column)
that inherited directly.
So pg_attribute.attinhcount of "3_grandchild"."c1" should not be
incremented.

In this case,an error occurs when the following operations are
executed.

--------------------------------------------------------------------------
alter table "1_parent" drop column c1;
alter table "2_child" drop column c1;
alter table "3_grandchild" drop column c1;
 ERROR:  cannot drop inherited column "c1"

select c.relname,a.attname,a.attinhcount from pg_attribute a,pg_class c
where a.attrelid=c.oid
and relname in ('1_parent','2_child','3_grandchild')
and attname not in('xmax','xmin','cmin','cmax','tableoid','ctid')
order by relname;

    relname    | attname | attinhcount
 --------------+---------+-------------
  1_parent     | c1      |           0
  2_child      | c1      |           0
  3_grandchild | c1      |           1
 (3 rows)
--------------------------------------------------------------------------

Re: BUG #5856: pg_attribute.attinhcount is not correct.

From
Robert Haas
Date:
On Mon, Jan 31, 2011 at 6:42 AM, Naoya Anzai
<anzai-naoya@mxu.nes.nec.co.jp> wrote:
> In PostgreSQL8.4.5, I found that the catalog pg_attribute.attinhcount is =
not
> correct.
>
> I executed the following queries.
>
> --------------------------------------------------------------------------
> create table "3_grandchild"();
> create table "2_child"();
> create table "1_parent"();
>
> alter table "3_grandchild" inherit "2_child";
> alter table "2_child" inherit "1_parent";
>
> alter table "3_grandchild" add column c1 text;
> alter table "2_child" add column c1 text;
> alter table "1_parent" add column c1 text;
>
> select c.relname,a.attname,a.attinhcount from pg_attribute a,pg_class c
> where a.attrelid=3Dc.oid
> and relname in ('1_parent','2_child','3_grandchild')
> and attname not in('xmax','xmin','cmin','cmax','tableoid','ctid')
> order by relname;
>
> =A0 =A0relname =A0 =A0| attname | attinhcount
> =A0--------------+---------+-------------
> =A01_parent =A0 =A0 | c1 =A0 =A0 =A0| =A0 =A0 =A0 =A0 =A0 0
> =A02_child =A0 =A0 =A0| c1 =A0 =A0 =A0| =A0 =A0 =A0 =A0 =A0 1
> =A03_grandchild | c1 =A0 =A0 =A0| =A0 =A0 =A0 =A0 =A0 2
> =A0(3 rows)
> --------------------------------------------------------------------------
>
> "3_grandchild"'s attinhcount should be 1.

I think this is a manifestation the same problem mentioned here:

http://git.postgresql.org/gitweb?p=3Dpostgresql.git;a=3Dcommit;h=3D31b6fc06=
d83c6de3644c8f2921eb7de0eb92fac3

I believe this requires some refactoring to fix.  It would be good to do th=
at.

--=20
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company