AW: Problems with RULE - Mailing list pgsql-sql

From Jens Hartwig
Subject AW: Problems with RULE
Date
Msg-id 000e01c0a6d7$8ad0c0d0$c10ac98a@0000864A433A
Whole thread Raw
In response to Re: Problems with RULE  (dev@archonet.com)
List pgsql-sql
Hello Richard,

this was a very precise analysis - thanks for the effort you made!
Nevertheless the Tom's explanation of the behaviour in case of views was
sufficient for me. But still I don't understand the behaviour in my case ...

Best regards, Jens

PS: I use 7.1b4

-----------------------------------------------------

T-Systems
Projektleiter
debis Systemhaus GEI GmbH
Hausanschrift: Eichhornstraße 3, 10785 Berlin
Postanschrift: 10785 Berlin
Telefon: (004930) 25 54-32 82
Telefax: (004930) 25 54-31 87
Mobiltelefon: (0170) 167 26 48
E-Mail: jens.hartwig@t-systems.de
Internet: http://www.t-systems.de


> -----Ursprüngliche Nachricht-----
> Von: dev@archonet.com [mailto:dev@archonet.com]
> Gesendet: Dienstag, 6. März 2001 19:10
> An: Jens Hartwig
> Cc: PSQL-Sql (E-Mail)
> Betreff: Re: [SQL] Problems with RULE
>
>
> 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 | bbb
>  4 | 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 | aaa
>  2 | bbb
>  3 | ccc
>  4 | ddd
> (4 rows)
>
> richardh=> select * from voo;
>  a |  b
> ---+-----
>  2 | bbb
>  4 | 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 | ddd
>  99 | zzz
>  98 | yyy
>  98 | yyy
> (7 rows)
>
> richardh=> select * from voo;
>  a  |  b
> ----+-----
>   2 | bbb
>   4 | ddd
>  98 | yyy
>  98 | 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 | ddd
>  99 | zzz
>  98 | yyy
>  98 | yyy
> (7 rows)
>
> richardh=> select * from voo;
>  a  |  b
> ----+-----
>   2 | bbb
>   4 | ddd
>  98 | yyy
>  98 | 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 | ddd
>  99 | zzz
>  98 | yyy
>  98 | yyy
>  99 | zzz
>  99 | zzz
>  98 | yyy
>  98 | yyy
> (11 rows)
>
> richardh=> select * from voo;
>  a  |  b
> ----+-----
>   2 | bbb
>   4 | ddd
>  98 | yyy
>  98 | yyy
>  98 | yyy
>  98 | 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: "Jens Hartwig"
Date:
Subject: AW: Problems with RULE
Next
From: Karel Zak
Date:
Subject: Re: Re: [GENERAL] Re: MySQLs Describe emulator!