It's probably not a good idea, because it depends on some behaviour that is not specified, but I once used a trick like this to get good performance:
CREATE TABLE abc(a, b); UPDATE abc SET b = user2(a, b) WHERE <condition> AND user1(a, b); SQLite loops through the rows where <condition> is true, and remembers those for which user1() returns true. It then runs a second loop through those rows and calls user2() for each of the remembered rows, setting 'b' to the return value. But like I said, it depends on unspecified behaviour so you had better have some assert() statements to make sure SQLite is calling the functions in the expected order. Dan. --- "D. Richard Hipp" <[EMAIL PROTECTED]> wrote: > On Fri, 2005-05-13 at 15:16 +0100, Brandon, Nicholas wrote: > > I think I might be getting confused on this subject as well. Does this mean > > that SQLite 3.x can NOT process multiple inserts/updates within one > > transaction if it is working on the same table? > > > > ie Below would return "database table is locked"? > > > > BEGIN TRANSACTION > > SELECT * from table1 WHERE col > x > > UPDATE table1 SET col = ... > > INSERT INTO table1 .... > > COMMIT TRANSACTION > > > > You cannot simultaneously read and write from the same table. > If you are in the middle of a SELECT on a table, you cannot > UPDATE or INSERT or DELETE from that table until the SELECT > is finished. (NB: the SELECT is usually not finished until > you call sqlite3_finalize() or sqlite3_reset() on the statement. > For an exception to this rule, see solution (2) below.) > > You can read and write the same table as many times as you > want within the same transaction as long and the reading and > writing do not overlap in time. > > If you want to do an UPDATE on each row of a SELECT on the same > table, you can do this in several ways. > > (1) Load the results of the SELECT into a TEMP table, then > loop over the TEMP table to do your UPDATES: > > CREATE TEMP TABLE temp1 AS SELECT * FROM table1 WHERE...; > SELECT * FROM temp1; > -- for each row of result do: > UPDATE table1 SET ...; > > (2) Add an ORDER BY clause to the SELECT statement where the > ORDER BY clause contains at least one arithmetic expression. > For example: > > SELECT * FROM table1 WHERE ... ORDER BY rowid+1; > -- for each row of result do: > UPDATE table1 SET ...; > > (3) Store your UPDATEs in a temp table then execute them after > the SELECT has finished: > > CREATE TEMP TABLE updates(stmt TEXT); > SELECT * FROM table1 WHERE ...; > -- for each row of result do: > INSERT INTO updates VALUES('UPDATE table1 SET ...'); > SELECT * FROM updates; > -- for each row of result, evaluate the stmt > -- column as SQL. > > You can probably also think of schemes where you store either > the SELECT results or the UPDATE statements in memory. Note > that technique (2) above works by moving the entire result set > into memory for you. Avoid solution (2) if your result set is > exceedingly large. > -- > D. Richard Hipp <[EMAIL PROTECTED]> > > __________________________________ Yahoo! Mail Mobile Take Yahoo! Mail with you! Check email on your mobile phone. http://mobile.yahoo.com/learn/mail