Re: Bug when changing datatype of primary key column - Mailing list pgsql-bugs

From Tom Lane
Subject Re: Bug when changing datatype of primary key column
Date
Msg-id 12533.1344697329@sss.pgh.pa.us
Whole thread Raw
In response to Bug when changing datatype of primary key column  (hubert depesz lubaczewski <depesz@depesz.com>)
List pgsql-bugs
hubert depesz lubaczewski <depesz@depesz.com> writes:
> $ create table z (i int4);
> CREATE TABLE
> $ create unique index q on z (i);
> CREATE INDEX
> $ alter table z add primary key using index q;
> ALTER TABLE
> $ alter table z alter column i type int8;
> ERROR:  could not open relation with OID 16503

> looks like some missing dependancy.

Mph.  Looks more like too many dependencies :-(

If you just create a pkey straight off, the dependencies look like this:

regression=# create domain ref as int;
CREATE DOMAIN
regression=# create table z (i int primary key);
CREATE TABLE
regression=# select pg_describe_object(classid,objid,objsubid) as obj,
pg_describe_object(refclassid,refobjid,refobjsubid)as ref, deptype from pg_depend where objid > 'ref'::regtype or
refobjid> 'ref'::regtype; 
             obj              |             ref              | deptype
------------------------------+------------------------------+---------
 type z                       | table z                      | i
 type z[]                     | type z                       | i
 table z                      | schema public                | n
 constraint z_pkey on table z | table z column i             | a
 index z_pkey                 | constraint z_pkey on table z | i
(5 rows)

But if you make the index separately and then use "add primary key using
index":

regression=# drop table z;
DROP TABLE
regression=# create table z (i int4);
CREATE TABLE
regression=# create unique index q on z (i);
CREATE INDEX
regression=# select pg_describe_object(classid,objid,objsubid) as obj,
pg_describe_object(refclassid,refobjid,refobjsubid)as ref, deptype from pg_depend where objid > 'ref'::regtype or
refobjid> 'ref'::regtype; 
   obj    |       ref        | deptype
----------+------------------+---------
 type z   | table z          | i
 type z[] | type z           | i
 table z  | schema public    | n
 index q  | table z column i | a
(4 rows)

regression=# alter table z add primary key using index q;
ALTER TABLE
regression=# select pg_describe_object(classid,objid,objsubid) as obj,
pg_describe_object(refclassid,refobjid,refobjsubid)as ref, deptype from pg_depend where objid > 'ref'::regtype or
refobjid> 'ref'::regtype; 
           obj           |           ref           | deptype
-------------------------+-------------------------+---------
 type z                  | table z                 | i
 type z[]                | type z                  | i
 table z                 | schema public           | n
 index q                 | table z column i        | a
 constraint q on table z | table z column i        | a
 index q                 | constraint q on table z | i
(6 rows)

So that ALTER is forgetting to remove the index's original direct
dependency on the table column(s).  I suppose ideally that wouldn't
matter, but in the real world it will likely confuse many things, not
just ALTER COLUMN TYPE.

            regards, tom lane

pgsql-bugs by date:

Previous
From: hubert depesz lubaczewski
Date:
Subject: Bug when changing datatype of primary key column
Next
From: Thom Brown
Date:
Subject: pg_dump dependency loop with extension containing its own schema