Re: RULES doesn't work as expected - Mailing list pgsql-bugs

From Richard Huxton
Subject Re: RULES doesn't work as expected
Date
Msg-id 41E50866.1090007@archonet.com
Whole thread Raw
In response to RULES doesn't work as expected  ("John Hansen" <john@geeknet.com.au>)
List pgsql-bugs
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

pgsql-bugs by date:

Previous
From: Christoph Becker
Date:
Subject: rc4, restore of a db with psql freezes without warning if plpythonu is needed, but is not installed
Next
From: "Magnus Hagander"
Date:
Subject: Re: rc4, PostgreSQL-installer on WinXP: anybody can read, write and delete in data-dir