Right, except:

create table test (a text, b int); 
create or replace rule test_rule as on insert to test where exists(select 1 
from test where a = NEW.a) do instead select * from test; 

insert into test (a,b) VALUES ('first',2);
   a   | b
-------+---
 first | 2
(1 row)

select * from test;
   a   | b
-------+---
 first | 2
(1 row)

Now, the select on the first insert should NOT have happened..... Since this is 
a do instead rule.
The insert should of course happen, since it's not present in the table.

Or am I missing the point completely?

... John

> -----Original Message-----
> From: Richard Huxton [mailto:[EMAIL PROTECTED] 
> Sent: Wednesday, January 12, 2005 10:22 PM
> To: John Hansen
> Cc: pgsql-bugs@postgresql.org
> Subject: Re: [BUGS] RULES doesn't work as expected
> 
> Removed cc to pgsql-patches since that's not the list for this.
> 
> John Hansen wrote:
> > It seems rules don't work as expected.
> > I could be wrong,... In which case, what am I doing wrong?
> 
> A rule is like a macro, rewriting the query plan. You're 
> trying to use it as though it is a trigger. The side-effects 
> of rules can be quite subtle and catches most of us out at least once.
> 
> > Clearly, the first insert below should not update the table as well.
> 
> > CREATE TABLE test (a text, b int4[]);
> > 
> > CREATE RULE test_rule AS 
> >   ON INSERT TO test 
> >   WHERE exists(SELECT 1 FROM test WHERE a = NEW.a)
> >   DO INSTEAD
> >     UPDATE test SET b = b + NEW.b WHERE a = NEW.a;
> > 
> > 
> > db1=# INSERT INTO test (a,b) VALUES (1,'{1}'::int4[]);
> 
> The NEW.a doesn't refer to a variable as such, it refers to 
> the updated/inserted value of an actual row in "test". Does 
> that clarify?
> 
> In your particular usage you'd want to consider concurrency 
> and locking issues too.
> 
> Repost your question on the general/sql lists if you'd like 
> some discussion. It's probably worth checking the list 
> archives too - plenty in there about rule/trigger differences.
> --
>    Richard Huxton
>    Archonet Ltd
> 
> 

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
      subscribe-nomail command to [EMAIL PROTECTED] so that your
      message can get through to the mailing list cleanly

Reply via email to