Thread: Object syntax

Object syntax

From
Michael Ansley
Date:

Given the following table definitions, and data inserts:

dev=# create address (addr varchar(50), postcode varchar(9));
dev=# create client (name varchar(30), addr address);
dev=# insert into client values ('Michael');
dev=# insert into address values ('11 Windsor Close', 'RH16 4QR');
INSERT 18935 1
dev=# update client set addr = 18935::address;

dev=# explain select client.addr.postcode from client;
NOTICE:  QUERY PLAN:
Seq Scan on client  (cost=0.00..1.01 rows=1 width=4)
EXPLAIN
dev=# select client.addr.postcode from client;
ERROR:  init_fcache: Cache lookup failed for procedure 18935

What's happening here?  Bug, or am I doing something wrong?

Cheers...

Re: Object syntax

From
Tom Lane
Date:
Michael Ansley <Michael.Ansley@intec-telecom-systems.com> writes:
> dev=# create address (addr varchar(50), postcode varchar(9));
> dev=# create client (name varchar(30), addr address);
> dev=# insert into client values ('Michael');
> dev=# insert into address values ('11 Windsor Close', 'RH16 4QR');
> INSERT 18935 1
> dev=# update client set addr = 18935::address;
> dev=# select client.addr.postcode from client;
> ERROR:  init_fcache: Cache lookup failed for procedure 18935

What you're messing with here is some extremely old and crufty Berkeley
code.  It does more or less work as-designed in current development
sources, although it seems to be broken in 7.0.2.  However, the above
is not as-designed.  The underlying idea of table-valued attributes in
POSTQUEL was that the referencing row would store the OID of a procedure
that would yield the table value on execution.  So, when you try to
force it as above, you get a complaint that there's no procedure of that
OID.

In current sources I can get it to work:

create function rowxx() returns address as
'select \'11 Windsor Close\'::varchar,\'RH16 4QR\'::varchar '
language 'sql';
CREATE
select oid from pg_proc where proname = 'rowxx';
  oid
--------
 395222
(1 row)

insert into client values ('Michael', 395222::address);
INSERT 395223 1
select client.addr.postcode from client;
 postcode
----------
 RH16 4QR
(1 row)

There used to be some support in the parser for automatically creating
an intermediate function like this if you wrote, say,
insert into client values ('Michael', '{11 Windsor Close,RH16 4QR}');
(not quite that syntax I suppose, but you get the idea).  But the parser
support has been dead code for a long time.  It could probably be fixed
if anyone really wanted to.

However, this code is an academic toy exercise and quite unusable for
production purposes.  You certainly don't want to create a function for
every row of your database, even neglecting the fact that POSTQUEL never
had any mechanism for getting rid of no-longer-referenced row generation
functions.  And the implementation suffers from severe performance
problems and memory leaks, even on days when it's working.  Add in the
fact that no one's really bothering to maintain non-SQL POSTQUEL
functionality, and the bottom line is pretty clear.

I'd recommend the traditional SQL solution: add a primary key to the
address table and reference key values in the client table.

            regards, tom lane

Re: Object syntax

From
"Josh Berkus"
Date:
Tom,

> I'd recommend the traditional SQL solution: add a primary
> key to the
> address table and reference key values in the client
> table.

What you seem to be telling us is that, other than
inheritance, PGSQL doesn't really support OODB functionality
at this time.  Is that an accurate summary assessment?

-Josh berkus


Re: Object syntax

From
Tom Lane
Date:
"Josh Berkus" <josh@agliodbs.com> writes:
> What you seem to be telling us is that, other than
> inheritance, PGSQL doesn't really support OODB functionality
> at this time.  Is that an accurate summary assessment?

What's your definition of "OODB functionality"?  That's the kind
of term that can mean different things to different people...
        regards, tom lane