Hello ! I was calling sqlite3_close_v2 after sqlite3_next_stmt/sqlite3_finalize the problem probably was the fts3/4 extension trying to finalize a statement I already had finalized.
Cheers ! > Fri Sep 04 2015 5:42:03 pm CEST CEST from "Dan Kennedy" ><danielk1977 at gmail.com> Subject: Re: [sqlite] SQLite3 trunk error with old >database with fts3/4 > > On 09/04/2015 10:13 PM, Domingo Alvarez Duarte wrote: > >>Hello again ! >> >> I looked at the documentaion again and realized that I was alread calling >> sqlite3_close_v2 the I commented out all of the sqlite3_next_stmt cleanup >>and >> no segfaults so far, I'll see if memory is released on a long running >>process >> to certify that everything is fine. >> > The trouble with sqlite3_close_v2() is that after you call it you can't > safely pass the db handle to sqlite3_next_stmt() - the data structure > may have already been freed. > > Dan. > > > > > >>Thanks a lot for your help ! >> >> >> >> >>>Fri Sep 04 2015 4:57:57 pm CEST CEST from "Domingo Alvarez Duarte" >>> <sqlite-mail at dev.dadbiz.es> Subject: Re: [sqlite] SQLite3 trunk error >>>with >>> old database with fts3/4 >>> >>> Hello ! >>> >>> I did something similar to your sugestion (sqlite3_next_stmt(db, NULL)) >>> and >>> it still segfaults. >>> >>> What you mention about fts3/4 having prepared statemtns that and somehow >>> I'm >>> doing a double free a good point. >>> >>> And will be sad to not be able to use sqlite3_next_stmt(db, NULL) to >>> finalize >>> any open preapred statemnt, because it's very handy when using >>>"exceptions" >>> and having a single point to do the cleanup. >>> >>> Can somehow sqlite3_prepare somehow have any extra parameter to indicated >>> that we are using it from an extension and somehow sqlite3_next_stmt >>>detect >>> it and skip it ? >>> >>> Or any way to safely have a central point to do a cleanup ? >>> >>> Cheers ! >>> >>> >>> >>>>Fri Sep 04 2015 4:44:02 pm CEST CEST from "Dan Kennedy" >>>> <danielk1977 at gmail.com> Subject: Re: [sqlite] SQLite3 trunk error with >>>>old >>>> database with fts3/4 >>>> >>>> On 09/04/2015 09:29 PM, Domingo Alvarez Duarte wrote: >>>> >>>> >>>> >>>>>Hello again ! >>>>> >>>>> On mac os x some time ago I was getting segfaults here and tought that >>>>>it >>>>> was >>>>> caused by the way os x manage memory but it doesn't seem correct. >>>>> >>>>> The error happens on this code that is called before call >>>>>sqlite3_close: >>>>> >>>>> sqlite3 *db = sdb->db; >>>>> sqlite3_stmt* statement = NULL; >>>>> int count = 0; >>>>> while ((statement = sqlite3_next_stmt(db, statement))) >>>>> { >>>>> //do no close statements because garbage collector will >>>>> do it >>>>> //on MacOSX we get segfaults finalizing statements here >>>>> printf("sq_sqlite3_close_release:stmt:%s\n", >>>>> sqlite3_sql(statement)); >>>>> sqlite3_finalize(statement); >>>>> count++; >>>>> } >>>>> if (count) return sq_throwerror(v, _SC("closing database with >>>>> %d statements not closed."), count); >>>>> >>>>> >>>> Hi, >>>> >>>> Two problems: >>>> >>>> After you have finalized a statement handle, it may not be passed to >>>> sqlite3_next_stmt(). Change the while() line to: >>>> >>>> while( (statement = sqlite3_next_stmt(db, NULL)) ){ ... >>>> >>>> Another reason not to do this before calling sqlite3_close() is that the >>>> FTS module may be managing some of these statement handles. So if you >>>> finalize() them before sqlite3_close() is called, then when the FTS >>>> module is shut down as part of the eventual sqlite3_close() call, it may >>>> pass the same statement handle pointers to sqlite3_finalize() - similar >>>> to a double-free of any other object or memory allocation. SQLite >>>> includes checks to try to return SQLITE_MISUSE instead of crashing when >>>> this happens, but they only work some of the time - this scenario can >>>> still cause crashes or heap corruption. >>>> >>>> A workaround is to call sqlite3_close() on the db, then do the above >>>> only if it returns SQLITE_BUSY. This works because, even though it >>>> fails, the first sqlite3_close() shuts down the FTS module - >>>> guaranteeing that it is no longer holding pointers to statement handles. >>>> >>>> Even better is not to leak statement handle pointers. The >>>> sqlite3_next_stmt() API should really only be used to help track down >>>> leaks, not to do cleanup. >>>> >>>> Dan. >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>>> >>>>>>Fri Sep 04 2015 4:18:01 pm CEST CEST from "Domingo Alvarez Duarte" >>>>>> <sqlite-mail at dev.dadbiz.es> Subject: Re: [sqlite] SQLite3 trunk error >>>>>> with >>>>>> old database with fts3/4 >>>>>> >>>>>> Hello ! >>>>>> >>>>>> I'm not sure where the problem is but this code worked without any >>>>>> problem >>>>>> with previous sqlite3. >>>>>> >>>>>> Here is a backtrace of a segfault using gdb (the line numbers will not >>>>>> match >>>>>> standard sqlite3.c because I have some custom extensions): >>>>>> >>>>>> enter mutex 0x7fffe405f570 (1213663847) with nRef=1919906927 >>>>>> >>>>>> Program received signal SIGSEGV, Segmentation fault. >>>>>> [Switching to Thread 0x7ffff3c70700 (LWP 22336)] >>>>>> 0x0000000000479d85 in freeEphemeralFunction (db=0x7fffe4000078, >>>>>> pDef=0xaaaaaaaaaaaaaaaa) >>>>>> at sqlite3.c:66869 >>>>>> 66869 if( ALWAYS(pDef) && (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 >>>>>> ){ >>>>>> (gdb) bt >>>>>> #0 0x0000000000479d85 in freeEphemeralFunction (db=0x7fffe4000078, >>>>>> pDef=0xaaaaaaaaaaaaaaaa) >>>>>> at sqlite3.c:66869 >>>>>> #1 0x0000000000479e39 in freeP4 (db=db at entry=0x7fffe4000078, >>>>>> p4type=-1431655766, p4=0x7fffe4181588) >>>>>> at sqlite3.c:66884 >>>>>> #2 0x0000000000479f14 in vdbeFreeOpArray (db=0x7fffe4000078, >>>>>> aOp=0x7fffe40df508, nOp=<optimised out>) >>>>>> at sqlite3.c:66933 >>>>>> #3 0x000000000047a01c in sqlite3VdbeClearObject (db=0x7fffe4000078, >>>>>> p=0x7fffe408ac88) at sqlite3.c:68920 >>>>>> #4 0x000000000047a0c3 in sqlite3VdbeDelete (p=0x7fffe408ac88) >>>>>> at sqlite3.c:68941 >>>>>> #5 0x00000000004e6044 in sqlite3VdbeFinalize (p=0x7fffe408ac88) >>>>>> at sqlite3.c:68861 >>>>>> #6 0x00000000004e60cd in sqlite3_finalize (pStmt=0x7fffe408ac88) >>>>>> at sqlite3.c:70500 >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>>Fri Sep 04 2015 4:05:12 pm CEST CEST from "Dan Kennedy" >>>>>>> <danielk1977 at gmail.com> Subject: Re: [sqlite] SQLite3 trunk error >>>>>>>with >>>>>>> old >>>>>>> database with fts3/4 >>>>>>> >>>>>>> On 09/04/2015 07:35 PM, Domingo Alvarez Duarte wrote: >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>>>Hello ! >>>>>>>> >>>>>>>> After fix the index issues using an old sqlite3 executable (the >>>>>>>>trunk >>>>>>>> refuse >>>>>>>> to work on indexes created with single quotes on field names) I'm >>>>>>>> getting >>>>>>>> ocasionaly memory errors when using fts3/4 searches, see error >>>>>>>>below: >>>>>>>> >>>>>>>> free(): corrupted unsorted chunks: 0x00007fa3a01073a0 >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> Is this error on the trunk or with the old version? >>>>>>> >>>>>>> If it's on the trunk, is the error reproducible using the sqlite3 >>>>>>>shell >>>>>>> tool? >>>>>>> >>>>>>> If not, what does valgrind have to say about the app? >>>>>>> >>>>>>> Thanks, >>>>>>> Dan. >>>>>>> >>>>>>> _______________________________________________ >>>>>>> sqlite-users mailing list >>>>>>> sqlite-users at mailinglists.sqlite.org >>>>>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> _______________________________________________ >>>>>> sqlite-users mailing list >>>>>> sqlite-users at mailinglists.sqlite.org >>>>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>> _______________________________________________ >>>>> sqlite-users mailing list >>>>> sqlite-users at mailinglists.sqlite.org >>>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >>>>> >>>>> >>>> _______________________________________________ >>>> sqlite-users mailing list >>>> sqlite-users at mailinglists.sqlite.org >>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>> _______________________________________________ >>> sqlite-users mailing list >>> sqlite-users at mailinglists.sqlite.org >>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >>> >>> >>> >>> >>> >>> >> _______________________________________________ >> sqlite-users mailing list >> sqlite-users at mailinglists.sqlite.org >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >> > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > > > ?