On Apr 11, 2009, at 3:03 AM, Dave Toll wrote: > Hello list > > I am sometimes seeing the error SQLITE_CORRUPT with message > "database disk image is malformed", when I attempt CREATE TEMP > TRIGGER. My test spawns 5 threads, each of which modifies and > queries its own table in a common database (each thread uses a > separate connection from sqlite3_open_v2() to the same filename with > shared cache enabled). The error occurs when one thread attempts > CREATE TEMP TRIGGER while another thread is closing its own database > connection (I have proved this by protecting all calls except these > with semaphores). Looking through the SQLite 3.6.12 amalgamation > code I found the following comment in sqlite3VdbeExec(): > > ** Although the mutex on the BtShared object that corresponds to > ** database iDb (the database containing the sqlite_master table > ** read by this instruction) is currently held, it is necessary to > ** obtain the mutexes on all attached databases before checking if > ** the schema of iDb is loaded. This is because, at the start of > ** the sqlite3_exec() call below, SQLite will invoke > ** sqlite3BtreeEnterAll(). If all mutexes are not already held, the > ** iDb mutex may be temporarily released to avoid deadlock. If > ** this happens, then some other thread may delete the in-memory > ** schema of database iDb before the SQL statement runs. The schema > ** will not be reloaded becuase the db->init.busy flag is set. This > ** can result in a "no such table: sqlite_master" or "malformed > ** database schema" error being returned to the user. > > Could this be the reason for the error I'm seeing? Is this a known > issue or expected behaviour? Do I need to protect DDL calls on > multiple connections to the same database, or this there some other > way to protect against this possibility?
No. SQLite does this internally. All you have to do is make sure SQLite is compiled to be threadsafe. Call the sqlite3_threadsafe() API at runtime if you are not sure. If you have example code that can reproduce this, please file a bug here: http://www.sqlite.org/cvstrac/tktnew It sounds like this could use looking into. Dan. > Cheers, > Dave. > _______________________________________________ > 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