Igor Neyman wrote >> >> create type node as (r integer, s integer); alter type node add attribute >> children node[]; >> > > Under 9.2.2 I'm getting an error: > > ERROR: composite type node cannot be made a member of itself I'm not sure why the limitation exists (probably something to do with avoiding infinite recursion) but even if it could be fixed it wouldn't be for at least a year (version 9.4 or greater) before you'd see it so you will need to find an alternative solution to your problem. So with Chris' suggestion you store the node data in a highly detailed form with parent node id foreign keys then use a function to dynamically generate the "children" data. The syntax he is using is intermediate-level PostgreSQL but well described in the documentation (somewhere). Basically, table.virtual_column == virtual_column(table) so by creating a function named "children" taking a "node" record/table-type as input you can use a shorthand form to actually call the function. These are equivalent: SELECT node.*, node.children FROM node SELECT node.*, children(node) FROM node noting the fact the "node.*" will NOT give you the children; you must still explicitly invoke the function somehow. Other solutions are possible but as we do not know the use case meaningful but more specific solutions are hard to envision or suggest. Chris' solution is fairly generic in nature and quite useful once you understand what exactly is going on. David J. -- View this message in context: http://postgresql.1045698.n5.nabble.com/Self-referencing-composite-datatype-tp5766635p5766662.html Sent from the PostgreSQL - general mailing list archive at Nabble.com. -- Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general