Re: [sqlite] journal_mode = off crash in 3.6.10

2009-02-04 Thread Dan

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 
>
>> 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 
>> #include 
>> #include 
>> #include 
>> #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",
>>   , 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, ));
>>
>>   assert(SQLITE_OK == sqlite3_close(pDatabase));
>>
>>   assert(SQLITE_OK == sqlite3_open_v2("test.sqlite", ,
>> SQLITE_OPEN_READWRITE, NULL));
>>
>>   assert(SQLITE_OK == sqlite3_exec(pDatabase,
>>   "PRAGMA journal_mode = OFF; "
>>   "BEGIN IMMEDIATE TRANSACTION; ",
>>   NULL, NULL, ));
>>
>>   assert(SQLITE_OK == sqlite3_prepare_v2(pDatabase,
>>   "INSERT INTO dic (entryid, headword, source) VALUES  
>> (?, ?, ?);", -1,
>> , 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

2009-02-04 Thread Vivien Malerba
This has already been fixed, see
http://www.sqlite.org/cvstrac/tktview?tn=3603

Regards,

Vivien

2009/2/4 Brodie Thiesfield 

> 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 
> #include 
> #include 
> #include 
> #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",
>, 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, ));
>
>assert(SQLITE_OK == sqlite3_close(pDatabase));
>
>assert(SQLITE_OK == sqlite3_open_v2("test.sqlite", ,
> SQLITE_OPEN_READWRITE, NULL));
>
>assert(SQLITE_OK == sqlite3_exec(pDatabase,
>"PRAGMA journal_mode = OFF; "
>"BEGIN IMMEDIATE TRANSACTION; ",
>NULL, NULL, ));
>
>assert(SQLITE_OK == sqlite3_prepare_v2(pDatabase,
>"INSERT INTO dic (entryid, headword, source) VALUES (?, ?, ?);", -1,
> , 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