Re: DO INSTEAD and conditional rules - Mailing list pgsql-hackers

From Jan Wieck
Subject Re: DO INSTEAD and conditional rules
Date
Msg-id 426E9306.6090702@Yahoo.com
Whole thread Raw
In response to Re: DO INSTEAD and conditional rules  (Rob Butler <crodster2k@yahoo.com>)
Responses Re: DO INSTEAD and conditional rules  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
On 4/26/2005 3:01 PM, Rob Butler wrote:

> Are rules even needed anymore?  Can't you do this all
> with triggers?  If you want to "DO INSTEAD" just use a
> row based trigger, and return null.  Or is this less
> efficient?

On INSERT, yes, on UPDATE, how so?


Jan

> 
> Later
> Rob
> --- David Wheeler <david@kineticode.com> wrote:
>> 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
>> 
>> 
>> ---------------------------(end of
>> broadcast)---------------------------
>> TIP 6: Have you searched our list archives?
>> 
>>                http://archives.postgresql.org
>> 
> 
> __________________________________________________
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around 
> http://mail.yahoo.com 


-- 
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#================================================== JanWieck@Yahoo.com #


pgsql-hackers by date:

Previous
From: Rob Butler
Date:
Subject: Re: DO INSTEAD and conditional rules
Next
From: Tom Lane
Date:
Subject: Re: DO INSTEAD and conditional rules