Re: Problems with RULE - Mailing list pgsql-sql

From dev@archonet.com
Subject Re: Problems with RULE
Date
Msg-id 20010306.18094200@client.archonet.com
Whole thread Raw
In response to Problems with RULE  ("Jens Hartwig" <jens.hartwig@t-systems.de>)
Responses AW: Problems with RULE
List pgsql-sql
On 3/6/01, 7:11:48 AM, Jens Hartwig <jens.hartwig@t-systems.de> wrote 
regarding [SQL] Problems with RULE:

> Hello all,

> I tried to implement the following rule: if someone wants to delete a 
record
> from a table t_xyz (id integer, deleted boolean) the record should get a
> delete-flag (deleted = true). When this "pre-deleted" record is deleted 
for
> the next time it should be physically deleted from the database.

Jens - more info

Definitely a bug if my testing is correct (see below) - I'll file a 
report on it and include your example too (hope that's OK)

- Richard Huxton

-- OK define a table foo with data and a view voo showing
-- even-numbered entries
--
richardh=> create table foo (a int, b text);
CREATE
richardh=> insert into foo values (1,'aaa');
INSERT 1287580 1
richardh=> insert into foo values (2,'bbb');
INSERT 1287581 1
richardh=> insert into foo values (3,'ccc');
INSERT 1287582 1
richardh=> insert into foo values (4,'ddd');
INSERT 1287583 1
richardh=> create view voo as select * from foo where (a % 2)=0;
CREATE
richardh=> select * from voo;a |  b
---+-----2 | bbb4 | ddd
(2 rows)

-- Now define an insert rule with a where on voo
--
richardh=> CREATE RULE voo_ins_rule AS ON INSERT TO voo WHERE (NEW.a % 2)=0 
DO INSTEAD INSERT INTO foo VALUES (NEW.a, NEW.b);
CREATE
richardh=> insert into voo values (99,'zzz');
ERROR:  Cannot insert into a view without an appropriate rule
richardh=> insert into voo values (98,'yyy');
ERROR:  Cannot insert into a view without an appropriate rule
richardh=> select * from foo;a |  b
---+-----1 | aaa2 | bbb3 | ccc4 | ddd
(4 rows)

richardh=> select * from voo;a |  b
---+-----2 | bbb4 | ddd
(2 rows)

-- OK: rule wasn't accepted, so lets add another rule to voo without a 
where
--
richardh=> CREATE RULE voo_ins_rule2 AS ON INSERT TO voo DO INSTEAD INSERT 
INTO
foo VALUES (NEW.a, NEW.b);
CREATE
richardh=> insert into voo values (99,'zzz');
INSERT 1287602 1
richardh=> insert into voo values (98,'yyy');
INSERT 1287604 1
richardh=> select * from foo;a  |  b
----+----- 1 | aaa 2 | bbb 3 | ccc 4 | ddd99 | zzz98 | yyy98 | yyy
(7 rows)

richardh=> select * from voo;a  |  b
----+----- 2 | bbb 4 | ddd98 | yyy98 | yyy
(4 rows)

-- So: looks like either rule2 executes twice or both fire.
-- Is it because we have a second rule?
--
richardh=> drop rule voo_ins_rule2;
DROP
richardh=> CREATE RULE voo_ins_rule3 AS ON INSERT TO voo WHERE (NEW.a % 
2)=1 DO
INSTEAD INSERT INTO foo VALUES (NEW.a, NEW.b);
CREATE
richardh=> insert into voo values (99,'zzz');
ERROR:  Cannot insert into a view without an appropriate rule
richardh=> insert into voo values (98,'yyy');
ERROR:  Cannot insert into a view without an appropriate rule
richardh=> select * from foo;a  |  b
----+----- 1 | aaa 2 | bbb 3 | ccc 4 | ddd99 | zzz98 | yyy98 | yyy
(7 rows)

richardh=> select * from voo;a  |  b
----+----- 2 | bbb 4 | ddd98 | yyy98 | yyy
(4 rows)

-- No: it must be the lack of where on rule2
-- Let's put rule2 back in and see what executes now
--
richardh=> CREATE RULE voo_ins_rule2 AS ON INSERT TO voo DO INSTEAD INSERT 
INTO
foo VALUES (NEW.a, NEW.b);
CREATE
richardh=> insert into voo values (99,'zzz');
INSERT 1287608 1
richardh=> insert into voo values (98,'yyy');
INSERT 1287610 1
richardh=> select * from foo;a  |  b
----+----- 1 | aaa 2 | bbb 3 | ccc 4 | ddd99 | zzz98 | yyy98 | yyy99 | zzz99 | zzz98 | yyy98 | yyy
(11 rows)

richardh=> select * from voo;a  |  b
----+----- 2 | bbb 4 | ddd98 | yyy98 | yyy98 | yyy98 | yyy
(6 rows)

-- OK: so it looks like rules with "WHERE" don't execute until
-- there is a rule that fires unconditionally, when
-- the "WHERE" is recognised and applies accordingly.



pgsql-sql by date:

Previous
From: "Brett W. McCoy"
Date:
Subject: Re: Quick question MySQL --> PgSQL
Next
From: The Hermit Hacker
Date:
Subject: Re: Quick question MySQL --> PgSQL