Thread: Recursive types?

Recursive types?

From
"John Hansen"
Date:
Consider the following:

create table foo ( id serial primary key, path text);
alter table foo add ref foo;
                          Table "public.foo"Column |  Type   |                      Modifiers
--------+---------+-----------------------------------------------------id     | integer | not null default
nextval('public.foo_id_seq'::text)path  | text    |ref    | foo     | 
Indexes:   "foo_pkey" PRIMARY KEY, btree (id)


insert into foo (path) VALUES ('/');
insert into foo (path,ref) VALUES ('/foo',ROW(1,'/',NULL));
insert into foo (path,ref) VALUES
('/foo/bar',ROW(2,'/foo',ROW(1,'/',NULL)));

select * from foo;id |   path   |        ref
----+----------+------------------- 1 | /        | 2 | /foo     | (1,/,) 3 | /foo/bar | (2,/foo,"(1,/,)")
(3 rows)

However, it is not possible to create such a type using create type, as
there is no alter type, even tho alter table does the same thing.

Is this a bug or a random feature?

It is also not possible to dump and restore this using pg_dump.

... John


Re: Recursive types?

From
Tom Lane
Date:
"John Hansen" <john@geeknet.com.au> writes:
> create table foo ( id serial primary key, path text);
> alter table foo add ref foo;

> Is this a bug or a random feature?

I'd say it's a random misfeature ;-).  I certainly don't care to promise
that it's supported ... but on the other hand, preventing you from doing
it seems nontrivial (consider indirect recursions).  I'd put this in the
category of "doctor, it hurts when I do that".
        regards, tom lane