Re: Composite datatypes, dynamic member fields

From: Robert Staudinger <robson(at)stereolyzer(dot)net>
To: pgsql-interfaces(at)postgresql(dot)org
Subject: Re: Composite datatypes, dynamic member fields
Date: 2002-05-13 13:41:57
Message-ID: 1021297326.381.48.camel@ws224
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-interfaces

On Mon, 2002-05-13 at 16:17, Tom Lane wrote:
> Robert Staudinger <robson(at)stereolyzer(dot)net> writes:
> > One idea is to implement a . operator on a basic data type and return
> > the value
> > for the corresponding field from the "operator function".
> > E.g.
> > "select * from mytable where mytype.mymember='x'"
> > could call something like
> > mytype_member_read( mytype, member_name )
> > but I'm not sure which datatype member_name would be in this case.
>
> PG has always had the ability to define functions that could be
> notationally treated as fields. A trivial example:
>
> test72=# create table tours(depart date, return date);
> CREATE
> test72=# insert into tours values('2002-01-01', '2002-01-10');
> INSERT 525275 1
> test72=# insert into tours values('2001-12-15', '2002-01-05');
> INSERT 525276 1
> test72=# create function numdays(tours) returns int as '
> test72'# select $1.return - $1.depart' language sql;
> CREATE
> test72=# select *, tours.numdays from tours;
> depart | return | numdays
> ------------+------------+---------
> 2002-01-01 | 2002-01-10 | 9
> 2001-12-15 | 2002-01-05 | 21
> (2 rows)
>
> The computed field doesn't quite have the same status as real fields
> --- notice that * doesn't know about it in the above example --- but
> it's a useful technique anyway.
>
> regards, tom lane

Hmm I don't know if this solves my problem.
E.g.
I want to store a group of linked objects. Maybe x(ht)ml could be an
example:

<table bgcolor="#000000">
<tr>
<td border="1">one</td>
<td cellpadding="2">two</td>
<td border="1">three</td>
</tr>
</table>

these should be stored in a table
( column "object" is of a base type written in c and should hold
arbitrary string attributes)

id parentid object
------------------
1 0 table
2 1 tr
3 2 td1
4 2 td2
5 2 td3

to be able to query something like
"select * from mytable where object.border='1'"
i'd probably need a . operator on "object" if "object" is a base type
implemented in c which holds the attributes internally - just as
described in my previous post.

The problem is that i don't know how to handle
"update mytable set object.margin='2' where parentid='2'"

Please note that I'm just thinking about how OR mapping could be done by
taking advantage of postgresql's extensibility - this is not a real
world problem ;-)

Thanks for sharing
Robert Staudinger

In response to

Responses

Browse pgsql-interfaces by date

  From Date Subject
Next Message Tom Lane 2002-05-13 14:17:55 Re: Composite datatypes, dynamic member fields
Previous Message Robert Staudinger 2002-05-13 09:08:18 Re: Composite datatypes, dynamic member fields