[sqlite] journal_mode = off crash in 3.6.10
Hi, I know that there has been a number of crashes involving journal_mode = off. This problem continues for me in sqlite 3.6.10 almalgamation though. A trigger seems to be the cause. The following test program crashes on the last line (sqlite3_step) with a NULL pointer dereference of id-pMethods when compiled on Windows with VC2003. sqlite.c line 12576 SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ DO_OS_MALLOC_TEST; return id-pMethods-xWrite(id, pBuf, amt, offset); } If the prop table and associated triggers are removed, the crash doesn't occur. Regards, Brodie The stack trace is: testsqlite.exe!sqlite3OsWrite(sqlite3_file * id=0x00510b58, const void * pBuf=0x0012e3e4, int amt=4, __int64 offset=0) Line 12576 + 0x1b C testsqlite.exe!write32bits(sqlite3_file * fd=0x00510b58, __int64 offset=0, unsigned int val=4) Line 31128 + 0x17 C testsqlite.exe!subjournalPage(PgHdr * pPg=0x00388a64) Line 33450 + 0x1bC testsqlite.exe!pager_write(PgHdr * pPg=0x00388a64) Line 34311 + 0x9 C testsqlite.exe!sqlite3PagerWrite(PgHdr * pDbPage=0x00388a64) Line 34420 + 0x9 C testsqlite.exe!insertCell(MemPage * pPage=0x00388e88, int i=0, unsigned char * pCell=0x00388f20, int sz=9, unsigned char * pTemp=0x, unsigned char nSkip=0) Line 40971 + 0xc C testsqlite.exe!sqlite3BtreeInsert(BtCursor * pCur=0x00385760, const void * pKey=0x0051d698, __int64 nKey=8, const void * pData=0x004f6c22, int nData=0, int nZero=0, int appendBias=0) Line 42175 + 0x19 C testsqlite.exe!sqlite3VdbeExec(Vdbe * p=0x00386808) Line 52819 + 0x2c C testsqlite.exe!sqlite3Step(Vdbe * p=0x00386808) Line 47849 + 0x9 C testsqlite.exe!sqlite3_step(sqlite3_stmt * pStmt=0x00386808) Line 47916 + 0x9 C testsqlite.exe!main(int argc=1, unsigned short * * argv=0x00381d88) Line 48 + 0x9 C++ testsqlite.exe!mainCRTStartup() Line 259 + 0x19C kernel32.dll!7c817067() ntdll.dll!7c915d27() The test program is: #include windows.h #include assert.h #include io.h #include stdio.h #include sqlite3.h int main(int argc, TCHAR * argv[]) { sqlite3 * pDatabase = NULL; char * pszError = NULL; sqlite3_stmt * pStatement = NULL; unlink(test.sqlite); unlink(test.sqlite-journal); assert(SQLITE_OK == sqlite3_open_v2(test.sqlite, pDatabase, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)); assert(SQLITE_OK == sqlite3_exec(pDatabase, CREATE TABLE dic ( entryid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, headword TEXT NOT NULL, source TEXT NOT NULL ); CREATE INDEX dic_headword_idx ON dic ( headword ); CREATE TABLE prop ( pkey TEXT PRIMARY KEY NOT NULL, pval TEXT NOT NULL ); INSERT INTO prop(pkey, pval) VALUES ('total_count', 0); CREATE TRIGGER count_insert_trigger AFTER INSERT ON [dic] FOR EACH ROW BEGIN UPDATE prop SET pval = pval + 1 WHERE pkey = 'total_count'; END; CREATE TRIGGER count_delete_trigger AFTER DELETE ON [dic] FOR EACH ROW BEGIN UPDATE prop SET pval = pval - 1 WHERE pkey = 'total_count'; END; , NULL, NULL, pszError)); assert(SQLITE_OK == sqlite3_close(pDatabase)); assert(SQLITE_OK == sqlite3_open_v2(test.sqlite, pDatabase, SQLITE_OPEN_READWRITE, NULL)); assert(SQLITE_OK == sqlite3_exec(pDatabase, PRAGMA journal_mode = OFF; BEGIN IMMEDIATE TRANSACTION; , NULL, NULL, pszError)); assert(SQLITE_OK == sqlite3_prepare_v2(pDatabase, INSERT INTO dic (entryid, headword, source) VALUES (?, ?, ?);, -1, pStatement, NULL)); assert(SQLITE_OK == sqlite3_bind_null(pStatement, 1)); assert(SQLITE_OK == sqlite3_bind_text16(pStatement, 2, foo, -1, NULL)); assert(SQLITE_OK == sqlite3_bind_text16(pStatement, 3, bar, -1, NULL)); assert(SQLITE_DONE == sqlite3_step(pStatement)); // crash here return 0; } ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] journal_mode = off crash in 3.6.10
This has already been fixed, see http://www.sqlite.org/cvstrac/tktview?tn=3603 Regards, Vivien 2009/2/4 Brodie Thiesfield brofie...@jellycan.com Hi, I know that there has been a number of crashes involving journal_mode = off. This problem continues for me in sqlite 3.6.10 almalgamation though. A trigger seems to be the cause. The following test program crashes on the last line (sqlite3_step) with a NULL pointer dereference of id-pMethods when compiled on Windows with VC2003. sqlite.c line 12576 SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ DO_OS_MALLOC_TEST; return id-pMethods-xWrite(id, pBuf, amt, offset); } If the prop table and associated triggers are removed, the crash doesn't occur. Regards, Brodie The stack trace is: testsqlite.exe!sqlite3OsWrite(sqlite3_file * id=0x00510b58, const void * pBuf=0x0012e3e4, int amt=4, __int64 offset=0) Line 12576 + 0x1b C testsqlite.exe!write32bits(sqlite3_file * fd=0x00510b58, __int64 offset=0, unsigned int val=4) Line 31128 + 0x17 C testsqlite.exe!subjournalPage(PgHdr * pPg=0x00388a64) Line 33450 + 0x1bC testsqlite.exe!pager_write(PgHdr * pPg=0x00388a64) Line 34311 + 0x9 C testsqlite.exe!sqlite3PagerWrite(PgHdr * pDbPage=0x00388a64) Line 34420 + 0x9 C testsqlite.exe!insertCell(MemPage * pPage=0x00388e88, int i=0, unsigned char * pCell=0x00388f20, int sz=9, unsigned char * pTemp=0x, unsigned char nSkip=0) Line 40971 + 0xc C testsqlite.exe!sqlite3BtreeInsert(BtCursor * pCur=0x00385760, const void * pKey=0x0051d698, __int64 nKey=8, const void * pData=0x004f6c22, int nData=0, int nZero=0, int appendBias=0) Line 42175 + 0x19 C testsqlite.exe!sqlite3VdbeExec(Vdbe * p=0x00386808) Line 52819 + 0x2c C testsqlite.exe!sqlite3Step(Vdbe * p=0x00386808) Line 47849 + 0x9 C testsqlite.exe!sqlite3_step(sqlite3_stmt * pStmt=0x00386808) Line 47916 + 0x9 C testsqlite.exe!main(int argc=1, unsigned short * * argv=0x00381d88) Line 48 + 0x9 C++ testsqlite.exe!mainCRTStartup() Line 259 + 0x19C kernel32.dll!7c817067() ntdll.dll!7c915d27() The test program is: #include windows.h #include assert.h #include io.h #include stdio.h #include sqlite3.h int main(int argc, TCHAR * argv[]) { sqlite3 * pDatabase = NULL; char * pszError = NULL; sqlite3_stmt * pStatement = NULL; unlink(test.sqlite); unlink(test.sqlite-journal); assert(SQLITE_OK == sqlite3_open_v2(test.sqlite, pDatabase, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)); assert(SQLITE_OK == sqlite3_exec(pDatabase, CREATE TABLE dic ( entryid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, headword TEXT NOT NULL, source TEXT NOT NULL ); CREATE INDEX dic_headword_idx ON dic ( headword ); CREATE TABLE prop ( pkey TEXT PRIMARY KEY NOT NULL, pval TEXT NOT NULL ); INSERT INTO prop(pkey, pval) VALUES ('total_count', 0); CREATE TRIGGER count_insert_trigger AFTER INSERT ON [dic] FOR EACH ROW BEGIN UPDATE prop SET pval = pval + 1 WHERE pkey = 'total_count'; END; CREATE TRIGGER count_delete_trigger AFTER DELETE ON [dic] FOR EACH ROW BEGIN UPDATE prop SET pval = pval - 1 WHERE pkey = 'total_count'; END; , NULL, NULL, pszError)); assert(SQLITE_OK == sqlite3_close(pDatabase)); assert(SQLITE_OK == sqlite3_open_v2(test.sqlite, pDatabase, SQLITE_OPEN_READWRITE, NULL)); assert(SQLITE_OK == sqlite3_exec(pDatabase, PRAGMA journal_mode = OFF; BEGIN IMMEDIATE TRANSACTION; , NULL, NULL, pszError)); assert(SQLITE_OK == sqlite3_prepare_v2(pDatabase, INSERT INTO dic (entryid, headword, source) VALUES (?, ?, ?);, -1, pStatement, NULL)); assert(SQLITE_OK == sqlite3_bind_null(pStatement, 1)); assert(SQLITE_OK == sqlite3_bind_text16(pStatement, 2, foo, -1, NULL)); assert(SQLITE_OK == sqlite3_bind_text16(pStatement, 3, bar, -1, NULL)); assert(SQLITE_DONE == sqlite3_step(pStatement)); // crash here return 0; } ___ 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
Re: [sqlite] journal_mode = off crash in 3.6.10
I think this may be a new one. See here: http://www.sqlite.org/cvstrac/tktview?tn=3636 Dan. On Feb 4, 2009, at 4:27 PM, Vivien Malerba wrote: This has already been fixed, see http://www.sqlite.org/cvstrac/tktview?tn=3603 Regards, Vivien 2009/2/4 Brodie Thiesfield brofie...@jellycan.com Hi, I know that there has been a number of crashes involving journal_mode = off. This problem continues for me in sqlite 3.6.10 almalgamation though. A trigger seems to be the cause. The following test program crashes on the last line (sqlite3_step) with a NULL pointer dereference of id-pMethods when compiled on Windows with VC2003. sqlite.c line 12576 SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ DO_OS_MALLOC_TEST; return id-pMethods-xWrite(id, pBuf, amt, offset); } If the prop table and associated triggers are removed, the crash doesn't occur. Regards, Brodie The stack trace is: testsqlite.exe!sqlite3OsWrite(sqlite3_file * id=0x00510b58, const void * pBuf=0x0012e3e4, int amt=4, __int64 offset=0) Line 12576 + 0x1b C testsqlite.exe!write32bits(sqlite3_file * fd=0x00510b58, __int64 offset=0, unsigned int val=4) Line 31128 + 0x17 C testsqlite.exe!subjournalPage(PgHdr * pPg=0x00388a64) Line 33450 + 0x1bC testsqlite.exe!pager_write(PgHdr * pPg=0x00388a64) Line 34311 + 0x9 C testsqlite.exe!sqlite3PagerWrite(PgHdr * pDbPage=0x00388a64) Line 34420 + 0x9 C testsqlite.exe!insertCell(MemPage * pPage=0x00388e88, int i=0, unsigned char * pCell=0x00388f20, int sz=9, unsigned char * pTemp=0x, unsigned char nSkip=0) Line 40971 + 0xc C testsqlite.exe!sqlite3BtreeInsert(BtCursor * pCur=0x00385760, const void * pKey=0x0051d698, __int64 nKey=8, const void * pData=0x004f6c22, int nData=0, int nZero=0, int appendBias=0) Line 42175 + 0x19 C testsqlite.exe!sqlite3VdbeExec(Vdbe * p=0x00386808) Line 52819 + 0x2c C testsqlite.exe!sqlite3Step(Vdbe * p=0x00386808) Line 47849 + 0x9 C testsqlite.exe!sqlite3_step(sqlite3_stmt * pStmt=0x00386808) Line 47916 + 0x9 C testsqlite.exe!main(int argc=1, unsigned short * * argv=0x00381d88) Line 48 + 0x9 C++ testsqlite.exe!mainCRTStartup() Line 259 + 0x19C kernel32.dll!7c817067() ntdll.dll!7c915d27() The test program is: #include windows.h #include assert.h #include io.h #include stdio.h #include sqlite3.h int main(int argc, TCHAR * argv[]) { sqlite3 * pDatabase = NULL; char * pszError = NULL; sqlite3_stmt * pStatement = NULL; unlink(test.sqlite); unlink(test.sqlite-journal); assert(SQLITE_OK == sqlite3_open_v2(test.sqlite, pDatabase, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)); assert(SQLITE_OK == sqlite3_exec(pDatabase, CREATE TABLE dic ( entryid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, headword TEXT NOT NULL, source TEXT NOT NULL ); CREATE INDEX dic_headword_idx ON dic ( headword ); CREATE TABLE prop ( pkey TEXT PRIMARY KEY NOT NULL, pval TEXT NOT NULL ); INSERT INTO prop(pkey, pval) VALUES ('total_count', 0); CREATE TRIGGER count_insert_trigger AFTER INSERT ON [dic] FOR EACH ROW BEGIN UPDATE prop SET pval = pval + 1 WHERE pkey = 'total_count'; END; CREATE TRIGGER count_delete_trigger AFTER DELETE ON [dic] FOR EACH ROW BEGIN UPDATE prop SET pval = pval - 1 WHERE pkey = 'total_count'; END; , NULL, NULL, pszError)); assert(SQLITE_OK == sqlite3_close(pDatabase)); assert(SQLITE_OK == sqlite3_open_v2(test.sqlite, pDatabase, SQLITE_OPEN_READWRITE, NULL)); assert(SQLITE_OK == sqlite3_exec(pDatabase, PRAGMA journal_mode = OFF; BEGIN IMMEDIATE TRANSACTION; , NULL, NULL, pszError)); assert(SQLITE_OK == sqlite3_prepare_v2(pDatabase, INSERT INTO dic (entryid, headword, source) VALUES (?, ?, ?);, -1, pStatement, NULL)); assert(SQLITE_OK == sqlite3_bind_null(pStatement, 1)); assert(SQLITE_OK == sqlite3_bind_text16(pStatement, 2, foo, -1, NULL)); assert(SQLITE_OK == sqlite3_bind_text16(pStatement, 3, bar, -1, NULL)); assert(SQLITE_DONE == sqlite3_step(pStatement)); // crash here return 0; } ___ 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