> yes it is risky, in general. but in this specific case, I expect no
> problems.
> just as a reference, this works just fine on mysql and oracle..
> and used to work quite well until sqlite 3.6.16.

I don't know anything about MySQL but Oracle has completely different
concept of BEFORE UPDATE triggers, so you cannot compare it with
SQLite in here.

And I wouldn't look at this issue as on a regression but as on some
undocumented feature that you relied upon and it was changed without a
warning. I guess now SQLite works like this:
1) you issue update to change d;
2) SQLite finds row that you want to update;
3) remembers its old state and new state (including all fields that
you didn't update);
4) executes your trigger;
5) writes into database all new values remembered on step 3.

I wouldn't say these steps are wrong but they lead to behavior you caught up.


Pavel

On Tue, Nov 24, 2009 at 2:04 PM, Vasu Nori <vn...@google.com> wrote:
> On Tue, Nov 24, 2009 at 10:26 AM, Igor Tandetnik <itandet...@mvps.org>wrote:
>
>> Vasu Nori <vn...@google.com> wrote:
>> > wondering if this is a known issue in 3.6.20.
>> >
>> > create table t1(_id integer primary key, v integer, d integer);
>> > CREATE TRIGGER t1_trig BEFORE UPDATE ON t1
>> >  BEGIN
>> >    update t1 SET v=OLD.v+1 WHERE NEW._id=OLD._id AND NEW.d!= OLD.d;
>> >  END;
>>
>> Realize that your trigger updates all records in t1, not just the record
>> where t1._id = OLD._id. You probably don't want that.
>>
>> not quite true though.. although I did make a mistake by including NEW
> infront of "_id" in trigger.
>
>>  > insert into t1 values(1, 1,0);
>> > update t1  set d= 2  where _id = 1;  <-- expected "v" = 2
>> > select * FROM t1;   <--  shows "v" = 1
>>
>> I wonder - does a similar AFTER UPDATE trigger work? It sounds risky to try
>> and modify a table ahead of another update. Though on the face of it, I
>> would expect your code to work as written.
>>
>> yes it is risky, in general. but in this specific case, I expect no
> problems.
> just as a reference, this works just fine on mysql and oracle..
> and used to work quite well until sqlite 3.6.16.
>
> thanks for your thoughts on this issue.
>
>
>> Igor Tandetnik
>>
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@sqlite.org
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to