From: | David Wheeler <david(at)kineticode(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Neil Conway <neilc(at)samurai(dot)com>, Jan Wieck <JanWieck(at)yahoo(dot)com> |
Subject: | Re: DO INSTEAD and conditional rules |
Date: | 2005-04-26 16:17:32 |
Message-ID: | 8880fc76858a02cd5c253aa6b5684623@kineticode.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Apr 26, 2005, at 8:55 AM, Tom Lane wrote:
> Well, they handle simple situations OK, but we keep seeing people get
> burnt as soon as they venture into interesting territory. For
> instance,
> if the view is a join, you can't easily make a rule that turns a delete
> into deletions of both joined rows. And you'll get burnt if you try to
> insert any volatile functions, because of the multiple-evaluation
> issue.
> Etc.
sharky=# CREATE TABLE a (
sharky(# id int,
sharky(# name text
sharky(# );
CREATE TABLE
sharky=# CREATE TABLE b (
sharky(# a_id int,
sharky(# rank text
sharky(# );
CREATE TABLE
sharky=#
sharky=# CREATE VIEW ab AS
sharky-# SELECT id, name, rank
sharky-# FROM a, b
sharky-# WHERE a.id = b.a_id
sharky-# ;
CREATE VIEW
sharky=# CREATE RULE delete_ab AS
sharky-# ON DELETE TO ab DO INSTEAD (
sharky(# DELETE FROM b
sharky(# WHERE a_id = OLD.id;
sharky(#
sharky(# DELETE FROM a
sharky(# WHERE id = OLD.id;
sharky(# );
CREATE RULE
sharky=#
sharky=#
sharky=# insert into a values (1, 'test');
INSERT 597795 1
sharky=# insert into b values (1, 'sergeant');
INSERT 597796 1
sharky=# select * from ab;
id | name | rank
----+------+----------
1 | test | sergeant
(1 row)
sharky=# delete from ab;
DELETE 0
sharky=# select * from ab;
id | name | rank
----+------+------
(0 rows)
sharky=# select * from a;
id | name
----+------
1 | test
(1 row)
sharky=# select * from b;
a_id | rank
------+------
(0 rows)
Ah, yes, you're right, that is...unexpected. Perhaps OLD can contain
its values for the duration of the RULE's statements? I'm assuming that
what's happening is that OLD.id is NULL after the first of the two
DELETE statements...
> Like I said, I don't have a better idea. Just a vague feeling of
> dissatisfaction.
I'd call it a bug. ;-)
Regards,
David
From | Date | Subject | |
---|---|---|---|
Next Message | Oleg Bartunov | 2005-04-26 16:31:23 | Re: bitmapscan test, no success, bs is not faster |
Previous Message | Tom Lane | 2005-04-26 15:55:58 | Re: DO INSTEAD and conditional rules |