The following bug has been logged online:

Bug reference:      1447
Logged by:          Olleg Samoylov
Email address:      [EMAIL PROTECTED]
PostgreSQL version: 7.4.6, 8.0.0
Operating system:   x86_64-pc-linux-gnu, compiled by GCC x86_64-linux-gcc
(GCC) 3.3.5 (Debian 1:3.3.5-6)
Description:        Sometimes rules don't work
Details: 

Test below show this bug. This is very simplified query from real billing
system. If abonent get service less then $5 per month, the billing must get
other.

--create structure
-- table with abonent and his money
create table abonent (abonent integer primary key, money double precision
not null default 0);
-- table with history of money change
create table history (abonent integer not null references abonent, money
double precision not null);
-- to change money enough add record to table history
create rule history_i as on insert to history do (update abonent set
money=money+new.money where abonent=new.abonent);

-- insert example values
-- one abonent
insert into abonent values (1);
-- it get service for $2
insert into history values (1,-2);

-- Always must be 0, due to rule history_i
 select abonent.money-history.money from (select sum(money) as money from
abonent) abonent, (select sum(money) as money from history) history;
-- Okey

-- payment per month, simplified but still show bug
-- minimal payment $5
insert into history (abonent,money) select abonent,-(money.money+5) as pay
from
    ( select abonent,sum(money) as money from history where money<0 group by
abonent) money
    where money.money+5>0;

-- must be 0
 select abonent.money-history.money from (select sum(money) as money from
abonent) abonent, (select sum(money) as money from history) history;
-- fail

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

Reply via email to