AW: Problems with RULE

From: "Jens Hartwig" <jens(dot)hartwig(at)t-systems(dot)de>
To: <dev(at)archonet(dot)com>
Cc: "'PSQL-Sql \(E-Mail\)'" <pgsql-sql(at)postgresql(dot)org>
Subject: AW: Problems with RULE
Date: 2001-03-07 07:23:43
Message-ID: 000e01c0a6d7$8ad0c0d0$c10ac98a@0000864A433A
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(dot)hartwig(at)t-systems(dot)de
Internet: http://www.t-systems.de

> -----Ursprüngliche Nachricht-----
> Von: dev(at)archonet(dot)com [mailto:dev(at)archonet(dot)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(dot)hartwig(at)t-systems(dot)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.

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Eric G. Miller 2001-03-07 08:05:45 Re: Undefined symbol
Previous Message Jens Hartwig 2001-03-07 07:18:19 AW: Problems with RULE