I solved my problem by using attnum::text instead of attname for 
pg_class.relkind = ā€˜i’ as a work-around to avoid a diff.

On Mon, Feb 22, 2021, at 18:21, Joel Jacobson wrote:
> Hi,
> 
> When renaming a column that is part of a primary key,
> the primary key index's pg_attribute.attname value
> isn't updated accordingly, the old value remains.
> 
> This causes problems when trying to measure if the
> effects of a migration script caused the same end result
> as if installing the same version of the schema from scratch.
> 
> The schema diffing tool reports a diff, and there is one,
> but not actually diff that causes any problems,
> since the primary key index's attname doesn't appear
> to be used for anything, since the attnum is probably
> used instead, which is correct.
> 
> Below in an example to illustrate the problem:
> 
> CREATE TABLE foo (
>   foo_id integer NOT NULL,
>   CONSTRAINT foo_pk PRIMARY KEY (foo_id)
> );
> 
> \d foo
> 
>                 Table "public.foo"
> Column |  Type   | Collation | Nullable | Default
> --------+---------+-----------+----------+---------
> foo_id | integer |           | not null |
> Indexes:
>     "foo_pk" PRIMARY KEY, btree (foo_id)
> 
> SELECT c.relname, a.attnum, c.relkind, a.attname
> FROM pg_class AS c
> JOIN pg_attribute AS a ON a.attrelid = c.oid
> JOIN pg_namespace AS n ON n.oid = c.relnamespace
> WHERE n.nspname = 'public'
> ORDER BY 1,2;
> 
> relname | attnum | relkind | attname
> ---------+--------+---------+----------
> foo     |     -6 | r       | tableoid
> foo     |     -5 | r       | cmax
> foo     |     -4 | r       | xmax
> foo     |     -3 | r       | cmin
> foo     |     -2 | r       | xmin
> foo     |     -1 | r       | ctid
> foo     |      1 | r       | foo_id
> foo_pk  |      1 | i       | foo_id
> (8 rows)
> 
> ALTER TABLE foo RENAME COLUMN foo_id TO bar_id;
> ALTER TABLE foo RENAME CONSTRAINT "foo_pk" TO "bar_pk";
> ALTER TABLE foo RENAME TO bar;
> 
> \d bar
> 
>                 Table "public.bar"
> Column |  Type   | Collation | Nullable | Default
> --------+---------+-----------+----------+---------
> bar_id | integer |           | not null |
> Indexes:
>     "bar_pk" PRIMARY KEY, btree (bar_id)
> 
> Looks good! But...
> 
> SELECT c.relname, a.attnum, c.relkind, a.attname
> FROM pg_class AS c
> JOIN pg_attribute AS a ON a.attrelid = c.oid
> JOIN pg_namespace AS n ON n.oid = c.relnamespace
> WHERE n.nspname = 'public'
> ORDER BY 1,2;
> 
> relname | attnum | relkind | attname
> ---------+--------+---------+----------
> bar     |     -6 | r       | tableoid
> bar     |     -5 | r       | cmax
> bar     |     -4 | r       | xmax
> bar     |     -3 | r       | cmin
> bar     |     -2 | r       | xmin
> bar     |     -1 | r       | ctid
> bar     |      1 | r       | bar_id
> bar_pk  |      1 | i       | foo_id
> (8 rows)
> 
> On the last row, we can see that the
> attname for the PRIMARY KEY index
> still says "foo_id".
> 
> While I could ignore PRIMARY KEY index
> attname values, it is ugly and I hope there
> is a way to avoid it.
> 
> /Joel

Kind regards,

Joel

Reply via email to