From ffc8f3e201396f08db148a9f0e21d48c32273232 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Dec 2014 05:38:02 +0000 Subject: [PATCH 1/5] When closing a (shared-cache) database connection, be sure to clear out all KeyInfo objects cached on Index objects. Proposed fix for ticket [e4a18565a36884b00edf]. FossilOrigin-Name: 651ed97de13234be60a1138a98b06d308449a791 --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/main.c | 8 +++++++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 375f1f89b0..6a37a13e06 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scompiler\swarnings. -D 2014-12-05T00:32:09.905 +C When\sclosing\sa\s(shared-cache)\sdatabase\sconnection,\sbe\ssure\sto\sclear\sout\sall\nKeyInfo\sobjects\scached\son\sIndex\sobjects.\nProposed\sfix\sfor\sticket\s[e4a18565a36884b00edf]. +D 2014-12-05T05:38:02.138 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 6c4f961fa91d0b4fa121946a19f9e5eac2f2f809 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770 F src/loadext.c de741e66e5ddc1598d904d7289239696e40ed994 -F src/main.c 84cc0fc4861bd2b06c286b38bf03bce604a0a66a +F src/main.c fa9f0e511a64caf66b8e7bb835c55172e7d61527 F src/malloc.c 740db54387204c9a2eb67c6d98e68b08e9ef4eab F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c faf615aafd8be74a71494dfa027c113ea5c6615f @@ -1223,7 +1223,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 520c2b838da8b230487c8c66f3ba8e5daa1ca886 -R 2f1363efb358b758f4fe53b98d762c1d +P e9955c0e14d13ba1411f013acb4979958dae2516 +R 6bcc6e9801f68a90df02ecfc8338dee3 +T *branch * fix-stale-keyinfo-cache +T *sym-fix-stale-keyinfo-cache * +T -sym-trunk * U drh -Z 8ac94f0b609313b69c75d4df8f71997e +Z 0a051974f060a3e4f394579c98ab9920 diff --git a/manifest.uuid b/manifest.uuid index 0fa8785978..cf22e9381d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e9955c0e14d13ba1411f013acb4979958dae2516 \ No newline at end of file +651ed97de13234be60a1138a98b06d308449a791 \ No newline at end of file diff --git a/src/main.c b/src/main.c index f7a0b1f7fd..39c65baabc 100644 --- a/src/main.c +++ b/src/main.c @@ -1034,7 +1034,13 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ if( pDb->pBt ){ sqlite3BtreeClose(pDb->pBt); pDb->pBt = 0; - if( j!=1 ){ + if( j!=1 && pDb->pSchema ){ + /* Must clear the KeyInfo cache. See ticket [e4a18565a36884b00edf] */ + for(i=sqliteHashFirst(&pDb->pSchema->idxHash); i; i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + sqlite3KeyInfoUnref(pIdx->pKeyInfo); + pIdx->pKeyInfo = 0; + } pDb->pSchema = 0; } } From a895a4d22cedbf9bbfb7288069dc5347139ee36b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Dec 2014 14:07:53 +0000 Subject: [PATCH 2/5] Test case demonstrating the problem described by ticket [e4a18565a36884b00edf]. FossilOrigin-Name: ffea3e905adc108d2dc37f5d6da2024f0389f176 --- manifest | 14 +++++------- manifest.uuid | 2 +- test/sharedB.test | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 test/sharedB.test diff --git a/manifest b/manifest index 6a37a13e06..1c55723bc4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sclosing\sa\s(shared-cache)\sdatabase\sconnection,\sbe\ssure\sto\sclear\sout\sall\nKeyInfo\sobjects\scached\son\sIndex\sobjects.\nProposed\sfix\sfor\sticket\s[e4a18565a36884b00edf]. -D 2014-12-05T05:38:02.138 +C Test\scase\sdemonstrating\sthe\sproblem\sdescribed\sby\nticket\s[e4a18565a36884b00edf]. +D 2014-12-05T14:07:53.311 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 6c4f961fa91d0b4fa121946a19f9e5eac2f2f809 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -846,6 +846,7 @@ F test/shared7.test a81e99f83e6c51b02ac99c96fb3a2a7b5978c956 F test/shared8.test 00a07bf5e1337ecf72e94542bdefdc330d7a2538 F test/shared9.test 5f2a8f79b4d6c7d107a01ffa1ed05ae7e6333e21 F test/sharedA.test 0cdf1a76dfa00e6beee66af5b534b1e8df2720f5 +F test/sharedB.test 91c8244e0f2a5f0bda731981d62208b6b54bfff2 F test/shared_err.test 2f2aee20db294b9924e81f6ccbe60f19e21e8506 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 F test/shell1.test ab6025d941f9c84c5b83412c6b4d8b57f78dfa3a @@ -1223,10 +1224,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e9955c0e14d13ba1411f013acb4979958dae2516 -R 6bcc6e9801f68a90df02ecfc8338dee3 -T *branch * fix-stale-keyinfo-cache -T *sym-fix-stale-keyinfo-cache * -T -sym-trunk * +P 651ed97de13234be60a1138a98b06d308449a791 +R 9f67caf91540cf2461a4c618c84ef365 U drh -Z 0a051974f060a3e4f394579c98ab9920 +Z 2496f3d4e53b37395b3a158db036ecc7 diff --git a/manifest.uuid b/manifest.uuid index cf22e9381d..69d4dd6ea0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -651ed97de13234be60a1138a98b06d308449a791 \ No newline at end of file +ffea3e905adc108d2dc37f5d6da2024f0389f176 \ No newline at end of file diff --git a/test/sharedB.test b/test/sharedB.test new file mode 100644 index 0000000000..beb99578f4 --- /dev/null +++ b/test/sharedB.test @@ -0,0 +1,57 @@ +# 2013 May 14 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Open two database connections on the same database in shared cache +# mode. Hold one open while repeatedly closing, reopening, and using +# the second. +# + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +if {[run_thread_tests]==0} { finish_test ; return } +db close +set ::testprefix sharedB + +set ::enable_shared_cache [sqlite3_enable_shared_cache 1] + +#------------------------------------------------------------------------- +# +do_test 1.1 { + sqlite3 db1 test.db + sqlite3 db2 test.db + + db1 eval { + CREATE TABLE t1(x,y TEXT COLLATE nocase); + WITH RECURSIVE + c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<100) + INSERT INTO t1(x,y) SELECT i, printf('x%03dy',i) FROM c; + CREATE INDEX t1yx ON t1(y,x); + } + db2 eval { + SELECT x FROM t1 WHERE y='X014Y'; + } +} {14} + +for {set j 1} {$j<=100} {incr j} { + do_test 1.2.$j { + db2 close + sqlite3 db2 test.db + db2 eval { + SELECT x FROM t1 WHERE y='X014Y'; + } + } {14} +} + +db1 close +db2 close +sqlite3_enable_shared_cache $::enable_shared_cache +finish_test From 351064b4522e9fb7f224697f3abb9adceed169fa Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Dec 2014 14:34:30 +0000 Subject: [PATCH 3/5] Improved comment on the sharedB.test test script. FossilOrigin-Name: 71f589e3f82a07513425e212072f32748c0732d4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/sharedB.test | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1c55723bc4..48f0747ab8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Test\scase\sdemonstrating\sthe\sproblem\sdescribed\sby\nticket\s[e4a18565a36884b00edf]. -D 2014-12-05T14:07:53.311 +C Improved\scomment\son\sthe\ssharedB.test\stest\sscript. +D 2014-12-05T14:34:30.550 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 6c4f961fa91d0b4fa121946a19f9e5eac2f2f809 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -846,7 +846,7 @@ F test/shared7.test a81e99f83e6c51b02ac99c96fb3a2a7b5978c956 F test/shared8.test 00a07bf5e1337ecf72e94542bdefdc330d7a2538 F test/shared9.test 5f2a8f79b4d6c7d107a01ffa1ed05ae7e6333e21 F test/sharedA.test 0cdf1a76dfa00e6beee66af5b534b1e8df2720f5 -F test/sharedB.test 91c8244e0f2a5f0bda731981d62208b6b54bfff2 +F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 2f2aee20db294b9924e81f6ccbe60f19e21e8506 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 F test/shell1.test ab6025d941f9c84c5b83412c6b4d8b57f78dfa3a @@ -1224,7 +1224,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 651ed97de13234be60a1138a98b06d308449a791 -R 9f67caf91540cf2461a4c618c84ef365 +P ffea3e905adc108d2dc37f5d6da2024f0389f176 +R 2f7d3cb7a2e1e65c7403b8d51d471007 U drh -Z 2496f3d4e53b37395b3a158db036ecc7 +Z 951231dae63f2db1845bdae375b332da diff --git a/manifest.uuid b/manifest.uuid index 69d4dd6ea0..d3a7ef5638 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ffea3e905adc108d2dc37f5d6da2024f0389f176 \ No newline at end of file +71f589e3f82a07513425e212072f32748c0732d4 \ No newline at end of file diff --git a/test/sharedB.test b/test/sharedB.test index beb99578f4..1b15755076 100644 --- a/test/sharedB.test +++ b/test/sharedB.test @@ -1,4 +1,4 @@ -# 2013 May 14 +# 2014-12-05 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: @@ -13,6 +13,9 @@ # mode. Hold one open while repeatedly closing, reopening, and using # the second. # +# This test is designed to demostrate that the fix for ticket +# [e4a18565a36884b00edf66541f38c693827968ab] works. +# set testdir [file dirname $argv0] From ebdb81dd455a3c3965b3159129d96fbcc49adb13 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Dec 2014 15:31:33 +0000 Subject: [PATCH 4/5] The KeyInfo cache must be cleared before closing the btree, not after. Revised fix for ticket [e4a18565a36884b00edf]. FossilOrigin-Name: 7ed3346e8c10dbf52fd44ab69900699d4f7ad3fd --- manifest | 13 +++++++------ manifest.uuid | 2 +- src/main.c | 8 +++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 14a2b23306..fd3e0c5784 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sclosing\sa\s(shared-cache)\sdatabase\sconnection,\sbe\ssure\sto\sclear\sout\nall\sKeyInfo\sobjects\scached\son\sIndex\sobjects.\s\nFix\sfor\sticket\s[e4a18565a36884b00edf]. -D 2014-12-05T14:44:57.022 +C The\sKeyInfo\scache\smust\sbe\scleared\sbefore\sclosing\sthe\sbtree,\snot\safter.\nRevised\sfix\sfor\sticket\s[e4a18565a36884b00edf]. +D 2014-12-05T15:31:33.761 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 6c4f961fa91d0b4fa121946a19f9e5eac2f2f809 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770 F src/loadext.c de741e66e5ddc1598d904d7289239696e40ed994 -F src/main.c fa9f0e511a64caf66b8e7bb835c55172e7d61527 +F src/main.c e50203613fb77e2f28deb51425ee52b3879e85f8 F src/malloc.c 740db54387204c9a2eb67c6d98e68b08e9ef4eab F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c faf615aafd8be74a71494dfa027c113ea5c6615f @@ -1224,7 +1224,8 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e9955c0e14d13ba1411f013acb4979958dae2516 71f589e3f82a07513425e212072f32748c0732d4 -R 2f7d3cb7a2e1e65c7403b8d51d471007 +P adca7688de20ff40d8ddf2107dfaf92af3873b83 +Q +48529508cfe2f9445a6940222fe5ff7cc92aef78 +R 943a66e258c43484e6287cfb624784df U drh -Z 971c54886e3dd2c38037eed368c93472 +Z 9be13842ba3000b4a28c2a5894f2ade5 diff --git a/manifest.uuid b/manifest.uuid index adefef81dc..34d0aae3a8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -adca7688de20ff40d8ddf2107dfaf92af3873b83 \ No newline at end of file +7ed3346e8c10dbf52fd44ab69900699d4f7ad3fd \ No newline at end of file diff --git a/src/main.c b/src/main.c index 39c65baabc..34093b2495 100644 --- a/src/main.c +++ b/src/main.c @@ -1032,15 +1032,17 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ for(j=0; jnDb; j++){ struct Db *pDb = &db->aDb[j]; if( pDb->pBt ){ - sqlite3BtreeClose(pDb->pBt); - pDb->pBt = 0; - if( j!=1 && pDb->pSchema ){ + if( pDb->pSchema ){ /* Must clear the KeyInfo cache. See ticket [e4a18565a36884b00edf] */ for(i=sqliteHashFirst(&pDb->pSchema->idxHash); i; i=sqliteHashNext(i)){ Index *pIdx = sqliteHashData(i); sqlite3KeyInfoUnref(pIdx->pKeyInfo); pIdx->pKeyInfo = 0; } + } + sqlite3BtreeClose(pDb->pBt); + pDb->pBt = 0; + if( j!=1 ){ pDb->pSchema = 0; } } From fe32daaeaaffb3306d885b39d33774bc432607ba Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Dec 2014 19:50:58 +0000 Subject: [PATCH 5/5] Make sure the WhereTerm objects are fully zeroed when they are allocated. FossilOrigin-Name: fdb667335c2250239a66143aec4235325dec8274 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/where.c | 1 + 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index fd3e0c5784..dc82a51063 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sKeyInfo\scache\smust\sbe\scleared\sbefore\sclosing\sthe\sbtree,\snot\safter.\nRevised\sfix\sfor\sticket\s[e4a18565a36884b00edf]. -D 2014-12-05T15:31:33.761 +C Make\ssure\sthe\sWhereTerm\sobjects\sare\sfully\szeroed\swhen\sthey\sare\sallocated. +D 2014-12-05T19:50:58.294 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 6c4f961fa91d0b4fa121946a19f9e5eac2f2f809 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -304,7 +304,7 @@ F src/vtab.c c08ec66f45919eaa726bf88aa53eb08379d607f9 F src/wal.c 847692349eb6e1fb8543dbc97e69ddbfa4cc7ea7 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 -F src/where.c d67fe69dd1bb32ad3d488a8c5bc803a29814f357 +F src/where.c 8877b55e6803eaa856254875bca8d12fff3681cf F src/whereInt.h d3633e9b592103241b74b0ec76185f3e5b8b62e0 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 @@ -1224,8 +1224,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P adca7688de20ff40d8ddf2107dfaf92af3873b83 -Q +48529508cfe2f9445a6940222fe5ff7cc92aef78 -R 943a66e258c43484e6287cfb624784df +P 7ed3346e8c10dbf52fd44ab69900699d4f7ad3fd +R 4b33ce7227bf5d27f48a35be658eb882 U drh -Z 9be13842ba3000b4a28c2a5894f2ade5 +Z 1360efaa2c5f7305d23abadc41fbb137 diff --git a/manifest.uuid b/manifest.uuid index 34d0aae3a8..437ab02c1f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ed3346e8c10dbf52fd44ab69900699d4f7ad3fd \ No newline at end of file +fdb667335c2250239a66143aec4235325dec8274 \ No newline at end of file diff --git a/src/where.c b/src/where.c index bda2a801ea..8ec6018bce 100644 --- a/src/where.c +++ b/src/where.c @@ -222,6 +222,7 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u8 wtFlags){ sqlite3DbFree(db, pOld); } pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]); + memset(&pWC->a[pWC->nTerm], 0, sizeof(pWC->a[0])*(pWC->nSlot-pWC->nTerm)); } pTerm = &pWC->a[idx = pWC->nTerm++]; if( p && ExprHasProperty(p, EP_Unlikely) ){