From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | depesz(at)depesz(dot)com |
Cc: | pgsql-bugs(at)postgresql(dot)org |
Subject: | Re: Bug when changing datatype of primary key column |
Date: | 2012-08-11 15:02:09 |
Message-ID: | 12533.1344697329@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
hubert depesz lubaczewski <depesz(at)depesz(dot)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
From | Date | Subject | |
---|---|---|---|
Next Message | Thom Brown | 2012-08-11 22:55:07 | pg_dump dependency loop with extension containing its own schema |
Previous Message | hubert depesz lubaczewski | 2012-08-11 10:53:32 | Bug when changing datatype of primary key column |