On Mon, Oct 26, 2009 at 12:40 PM, Wanadoo Hartwig <hartwig.wiesm...@wanadoo.nl> wrote: > > Am 26.10.2009 um 15:27 schrieb P Kishor: > > On Mon, Oct 26, 2009 at 9:17 AM, Scott Hess <sh...@google.com> wrote: > > The bug was closed with "cannot reproduce". So IMHO either the bug > > should be re-opened with the provided repro case, or a new bug should > > be opened with the provided repro case. > > As listed in my earlier email, it can be reproduced very simply as follows > -- > > SQLite version 3.6.19 > Enter ".help" for instructions > Enter SQL statements terminated with a ";" > sqlite> CREATE TABLE Simple (ID integer primary key, Name text); > sqlite> CREATE VIRTUAL TABLE SimpleFTS USING FTS3 (Name); > sqlite> CREATE TRIGGER DeleteTrigger AFTER DELETE ON Simple FOR EACH ROW > BEGIN > ...> DELETE FROM SimpleFTS WHERE (rowid=OLD.ID); END; > sqlite> CREATE TRIGGER InsertTrigger AFTER INSERT ON Simple FOR EACH ROW > BEGIN > ...> INSERT INTO SimpleFTS (rowid,Name) VALUES(NEW.ID,NEW.Name); END; > sqlite> INSERT INTO Simple (Name) VALUES('one'); > sqlite> INSERT INTO Simple (Name) VALUES('two'); > sqlite> SELECT * FROM simple; > ID Name > ---------- ---------- > 1 one > 2 two > sqlite> SELECT last_insert_rowid(); > last_insert_rowid() > ------------------- > 2 > sqlite> DELETE FROM Simple WHERE (ID = 1); > sqlite> INSERT INTO Simple (Name) VALUES('three'); > sqlite> SELECT last_insert_rowid(); > last_insert_rowid() > ------------------- > 4 > sqlite> > > > > Then, if the team decides > > that this is works-as-designed, the team can close the bug with that > > resolution. > > When I brought this up on the list a year and a half ago, we didn't > > really come to a conclusion on how it should work. I think there were > > arguments for both sides of the equation. My personal preference > > would be for it to work like one would expect it to (the "interior" > > last-insert-id isn't exposed to "exterior" code, because it is none of > > that code's business). But it needs to happen in a way which doesn't > > adversely impact performance. > > Performance is important, but getting back what one expects > (integrity) is perhaps more important. If my subsequent actions are > dependent on the correct last_insert_rowid(), then the way it works > right now doesn't work. > > > > I really think that this is a bug. The last-inserted-id is under normal > circumstances always the one that caused the trigger to fire (in case of an > insert trigger).
I concur. Consider SQLite version 3.6.19 sqlite> CREATE TABLE a (id INTEGER PRIMARY KEY, desc TEXT); sqlite> CREATE TRIGGER foo AFTER INSERT ON a ...> BEGIN ...> INSERT INTO a (desc) VALUES ('after insert'); ...> END; sqlite> INSERT INTO a (desc) VALUES ('insert'); sqlite> SELECT last_insert_rowid(); last_insert_rowid() ------------------- 1 sqlite> SELECT * FROM a; id desc ---------- ---------- 1 insert 2 after inse sqlite> > Furthermore, I checked the documentation concerning virtual > tables and there is no exception mentioned that virtual tables should behave > differently than normal tables with respect to triggers (besides the > statement that virtual tables cannot fire triggers). > The only usable workaround I currently have is to simulate the trigger by > doing the corresponding calls explicitely. > Hartwig > > -scott > > > On Sun, Oct 25, 2009 at 6:32 PM, Roger Binns <rog...@rogerbinns.com> wrote: > > -----BEGIN PGP SIGNED MESSAGE----- > > Hash: SHA1 > > Wanadoo Hartwig wrote: > > Actually, if you replace the FTS3 table with any other type of table - > > or as many tables as you like and do also in these tables insert > > operations - the last row id of the original table is correctly > > returned. Therefore, I assume (I do not have any details) that there > > is a bug in the trigger mechanism itself. > > The point that keeps being missed is that FTS3 is not a regular table. It > > is a virtual table. That means that the SQLite core calls it corresponding > > to various SQL operations but behind the scenes it is up the virtual table > > implementation what to do. Read about them at: > > http://www.sqlite.org/cvstrac/wiki?p=VirtualTables > > A virtual table implementation is free to do whatever it wants. When asked > > to insert one row, it could store 27 after converting all text to Klingon. > > It could instead delete whatever you asked it to add. It could do nothing. > > The FTS3 implementation happens to have 3 other tables and so on an insert > > those are updated with extra information and you are seeing those after > effects. > > Roger > -- Puneet Kishor http://www.punkish.org Carbon Model http://carbonmodel.org Charter Member, Open Source Geospatial Foundation http://www.osgeo.org Science Commons Fellow, http://sciencecommons.org/about/whoweare/kishor Nelson Institute, UW-Madison http://www.nelson.wisc.edu ----------------------------------------------------------------------- Assertions are politics; backing up assertions with evidence is science ======================================================================= Sent from Madison, WI, United States _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users