Recursive types?

Started by John Hansenalmost 21 years ago2 messages
#1John Hansen
john@geeknet.com.au

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

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Hansen (#1)
Re: Recursive types?

"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