From acef1abda2746ec5a64c39130ae3e88adaf526f2 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 21 May 2021 16:41:22 +0000 Subject: [PATCH 01/70] Fix a problem with SQLITE_MAX_MEMORY in malloc.c. FossilOrigin-Name: c18dbe2f389f4ba7b219b7995d4f7009d1bc249ef8f93a30b262c6d2c008319d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/malloc.c | 1 - 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4861e18ede..0ac7a15037 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfaulty\sassert()\sstatement\sin\ssqlite3ExprListDup().\sThis\sis\sa\scontinuation\nof\sthe\sfix\sat\s[59812e7ef705226c]. -D 2021-05-20T23:25:28.287 +C Fix\sa\sproblem\swith\sSQLITE_MAX_MEMORY\sin\smalloc.c. +D 2021-05-21T16:41:22.941 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -508,7 +508,7 @@ F src/insert.c 2189e0e596010a0dc5405d9f14f78db1ee2fa71138c931f5b6ea96610b95bfc1 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 8c9c8cd2bd8eecdb06d9b6e89de7e9e65bae45cc8fc33609cc74023a5c296067 F src/main.c 2b2044221a10e7c5f49a98f50563ce9a944511241ba5946d1754dcc2a7437a07 -F src/malloc.c c1af4ac5a463648cd2953fd4ac679b3ba9022ce5ec794a60806150ad69dfd33a +F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c b93b8762ab999a29ae7751532dadf0a1ac78040308a5fb1d17fcc365171d67eb @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 179dcb6ba771f0e94e06b5e3c5534d8005d27b2c9b4601be20fd68abfbc5dfd0 -R b65f4b641381f2377ccb77e896547360 -U drh -Z 83b95a83b421e548ed773aa244b4a289 +P 240f7494bfa3e0806ae2f971e78039c62a419de647cb9e807309f90e1d2a536d +R 04449523789f74442d2ffc6328882af8 +U dan +Z d5a4a247a6ed6e80155854d3f3c040e4 diff --git a/manifest.uuid b/manifest.uuid index d2cf9163e8..f9a0787a44 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -240f7494bfa3e0806ae2f971e78039c62a419de647cb9e807309f90e1d2a536d \ No newline at end of file +c18dbe2f389f4ba7b219b7995d4f7009d1bc249ef8f93a30b262c6d2c008319d \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index a0f7a739c0..b8a88f128c 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -161,7 +161,6 @@ int sqlite3MallocInit(void){ if( sqlite3GlobalConfig.m.xMalloc==0 ){ sqlite3MemSetDefault(); } - memset(&mem0, 0, sizeof(mem0)); mem0.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); if( sqlite3GlobalConfig.pPage==0 || sqlite3GlobalConfig.szPage<512 || sqlite3GlobalConfig.nPage<=0 ){ From 93c8139c1a9755a9f599966f82df45cdee85305e Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 21 May 2021 21:49:07 +0000 Subject: [PATCH 02/70] If there are errors in a nested CTE, be sure to abandon processing. Do not continue since the parse tree may have been left in a goofy state which could cause use-after-free and segfaults. See [forum:/forumpost/aa4a7a3980|forum post aa4a7a3980] for an example. FossilOrigin-Name: 94225d693932eb0b5d7799d40513afbd31ed40e1e156675eb92ad7216f1ff20f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 5 +++++ test/with2.test | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 0ac7a15037..114b4e8cb3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sSQLITE_MAX_MEMORY\sin\smalloc.c. -D 2021-05-21T16:41:22.941 +C If\sthere\sare\serrors\sin\sa\snested\sCTE,\sbe\ssure\sto\sabandon\sprocessing.\s\sDo\snot\ncontinue\ssince\sthe\sparse\stree\smay\shave\sbeen\sleft\sin\sa\sgoofy\sstate\swhich\scould\ncause\suse-after-free\sand\ssegfaults.\nSee\s[forum:/forumpost/aa4a7a3980|forum\spost\saa4a7a3980]\sfor\san\sexample. +D 2021-05-21T21:49:07.197 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -543,7 +543,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 40e216d9a72e52841a9c8e0aec7d367bade8e2df17b804653b539b20c1ab5660 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 8f9ecc60f9ffb5954f726d2adf5722c638072260838490d0349e71d2e4a31822 +F src/select.c dd81ee4c1afeeb91047c5df7778701ea445bbaee24bfb5aeb980c7a32d2844d0 F src/shell.c.in 1b32ba2918ede13b68df47c7b92b72ba0d06e68d384e78bb9d7456527271d400 F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1792,7 +1792,7 @@ F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3c F test/windowfault.test 21919e601f20b976ea2a73aa401220c89ed0e8d203c4f69476ea55bce3726496 F test/windowpushd.test d8895d08870b7226f7693665bd292eb177e62ca06799184957b3ca7dc03067df F test/with1.test 7bc5abfe4c80c0cef8a90f5a66d60b9982e8ccd7350c8eb70611323a3b8e07ba -F test/with2.test 000fb95f1f29dae868cea0f41505eb5126077d49eb967ff88f9ee46212ad8863 +F test/with2.test 858070ce1c71a198bff63691dab7eb3ce6c74fa46da3fff6b6c4c34c83f141fe F test/with3.test ad32d13ad50661e6fa305f62a0717649c348792e7b658bf2644976227a9e0373 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8 @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 240f7494bfa3e0806ae2f971e78039c62a419de647cb9e807309f90e1d2a536d -R 04449523789f74442d2ffc6328882af8 -U dan -Z d5a4a247a6ed6e80155854d3f3c040e4 +P c18dbe2f389f4ba7b219b7995d4f7009d1bc249ef8f93a30b262c6d2c008319d +R ddcc3a411d04466b180e47749d964e86 +U drh +Z cac7574e7912a186bd75c53237363cb1 diff --git a/manifest.uuid b/manifest.uuid index f9a0787a44..85125b5a9a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c18dbe2f389f4ba7b219b7995d4f7009d1bc249ef8f93a30b262c6d2c008319d \ No newline at end of file +94225d693932eb0b5d7799d40513afbd31ed40e1e156675eb92ad7216f1ff20f \ No newline at end of file diff --git a/src/select.c b/src/select.c index 88aa795274..5df43cbabc 100644 --- a/src/select.c +++ b/src/select.c @@ -5067,6 +5067,11 @@ static int resolveFromTermToCte( /* There are no WITH clauses in the stack. No match is possible */ return 0; } + if( pParse->nErr ){ + /* Prior errors might have left pParse->pWith in a goofy state, so + ** go no further. */ + return 0; + } if( pFrom->zDatabase!=0 ){ /* The FROM term contains a schema qualifier (ex: main.t1) and so ** it cannot possibly be a CTE reference. */ diff --git a/test/with2.test b/test/with2.test index 1051c6fb17..ebd4cf54b1 100644 --- a/test/with2.test +++ b/test/with2.test @@ -549,4 +549,55 @@ do_execsql_test 10.1 { ) } {1} +# 2021-05-21 +# Forum post https://sqlite.org/forum/forumpost/aa4a7a3980 +# +reset_db +do_execsql_test 11.1 { + CREATE TABLE t1(a); + CREATE VIEW v2(c) AS + WITH x AS ( + WITH y AS ( + WITH z AS(SELECT * FROM t1) + SELECT * FROM v2 + ) SELECT a + ) SELECT * from t1; + ALTER TABLE t1 RENAME COLUMN a TO b; + SELECT sql FROM sqlite_schema WHERE name='t1'; +} {{CREATE TABLE t1(b)}} +do_catchsql_test 11.2 { + INSERT INTO t1 VALUES(55); + SELECT * FROM v2; +} {0 55} +do_catchsql_test 11.3 { + DROP VIEW v2; + CREATE VIEW v2(c) AS + WITH x AS ( + WITH y AS ( + WITH z AS(SELECT * FROM t1) + SELECT * FROM v2 + ) SELECT a + ) SELECT * from t1, x; + SELECT * FROM v2; +} {1 {no such column: a}} +do_catchsql_test 11.4 { + DROP VIEW v2; + CREATE VIEW v2(c) AS + WITH x AS ( + WITH y AS ( + WITH z AS(SELECT * FROM t1) + SELECT * FROM v2 + ) SELECT * + ) SELECT * from t1, x; + SELECT * FROM v2; +} {1 {no tables specified}} +do_catchsql_test 11.5 { + WITH x AS ( + WITH y AS ( + WITH z AS(SELECT * FROM t1) + SELECT * FROM no_such_table + ) SELECT a + ) SELECT * from t1; +} {0 55} + finish_test From d42dbd9dfeb9233dcf9bb7af617289bc51a12379 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 22 May 2021 01:30:30 +0000 Subject: [PATCH 03/70] If an FTS5 Cursor fails to enlarge the space for the aInst array, set the size of the aInst array to zero. dbsqlfuzz 294254b8105cca409f27a711f1eb2e9e63cbcac5. FossilOrigin-Name: 4ae5e5b5ecbce580d3f7f970076e828fc6fb5fbcdc3bbe8381ab38f52870a54f --- ext/fts5/fts5_main.c | 1 + manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 2dcdad9f87..0588516e10 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1956,6 +1956,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ if( aInst ){ pCsr->aInst = aInst; }else{ + pCsr->nInstAlloc = nInst = 0; rc = SQLITE_NOMEM; break; } diff --git a/manifest b/manifest index 114b4e8cb3..999276d329 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sthere\sare\serrors\sin\sa\snested\sCTE,\sbe\ssure\sto\sabandon\sprocessing.\s\sDo\snot\ncontinue\ssince\sthe\sparse\stree\smay\shave\sbeen\sleft\sin\sa\sgoofy\sstate\swhich\scould\ncause\suse-after-free\sand\ssegfaults.\nSee\s[forum:/forumpost/aa4a7a3980|forum\spost\saa4a7a3980]\sfor\san\sexample. -D 2021-05-21T21:49:07.197 +C If\san\sFTS5\sCursor\sfails\sto\senlarge\sthe\sspace\sfor\sthe\saInst\sarray,\sset\sthe\nsize\sof\sthe\saInst\sarray\sto\szero.\ndbsqlfuzz\s294254b8105cca409f27a711f1eb2e9e63cbcac5. +D 2021-05-22T01:30:30.860 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -120,7 +120,7 @@ F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7 F ext/fts5/fts5_expr.c 9462249a3bb82d0e49b163500f9d2197c2e4cd95bf440a9bbfc3906b22ea1e1b F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 F ext/fts5/fts5_index.c 222b5e56f51139ca5400985e26ea9971165901c7a45a2c17499bd2be3695c697 -F ext/fts5/fts5_main.c f497ca97cb2802311ec93733b595762dc5b044ce3c6c8ce5fb3e871dd3fccd5d +F ext/fts5/fts5_main.c ff58907c51e347808ea4691f2cb341bb3d5558448a0c17a25a26a0740ea47a09 F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c18dbe2f389f4ba7b219b7995d4f7009d1bc249ef8f93a30b262c6d2c008319d -R ddcc3a411d04466b180e47749d964e86 +P 94225d693932eb0b5d7799d40513afbd31ed40e1e156675eb92ad7216f1ff20f +R 7ab0547b25495b9c2ea308d91c7abcea U drh -Z cac7574e7912a186bd75c53237363cb1 +Z 2300f3100b43ff3fe1a9ea7184b73bea diff --git a/manifest.uuid b/manifest.uuid index 85125b5a9a..9a13403063 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -94225d693932eb0b5d7799d40513afbd31ed40e1e156675eb92ad7216f1ff20f \ No newline at end of file +4ae5e5b5ecbce580d3f7f970076e828fc6fb5fbcdc3bbe8381ab38f52870a54f \ No newline at end of file From ff9186137d4fa0c09519ec99f9e503b215c307b7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 22 May 2021 11:00:03 +0000 Subject: [PATCH 04/70] The fix in the previous check-in was only correct if the OOM occurs on the initial allocation. This changes should make it correct for a resize as well. FossilOrigin-Name: 57087ab2f297e4d96da5b9f3b89a26d8dd2bc4d22c2be8045b5d956d86282f39 --- ext/fts5/fts5_main.c | 7 ++++--- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 0588516e10..3dea6cafcb 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1949,14 +1949,15 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ nInst++; if( nInst>=pCsr->nInstAlloc ){ - pCsr->nInstAlloc = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32; + int nNewSize = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32; aInst = (int*)sqlite3_realloc64( - pCsr->aInst, pCsr->nInstAlloc*sizeof(int)*3 + pCsr->aInst, nNewSize*sizeof(int)*3 ); if( aInst ){ pCsr->aInst = aInst; + pCsr->nInstAlloc = nNewSize; }else{ - pCsr->nInstAlloc = nInst = 0; + nInst--; rc = SQLITE_NOMEM; break; } diff --git a/manifest b/manifest index 999276d329..9cf98316d4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\san\sFTS5\sCursor\sfails\sto\senlarge\sthe\sspace\sfor\sthe\saInst\sarray,\sset\sthe\nsize\sof\sthe\saInst\sarray\sto\szero.\ndbsqlfuzz\s294254b8105cca409f27a711f1eb2e9e63cbcac5. -D 2021-05-22T01:30:30.860 +C The\sfix\sin\sthe\sprevious\scheck-in\swas\sonly\scorrect\sif\sthe\sOOM\soccurs\son\nthe\sinitial\sallocation.\s\sThis\schanges\sshould\smake\sit\scorrect\sfor\sa\sresize\nas\swell. +D 2021-05-22T11:00:03.746 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -120,7 +120,7 @@ F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7 F ext/fts5/fts5_expr.c 9462249a3bb82d0e49b163500f9d2197c2e4cd95bf440a9bbfc3906b22ea1e1b F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 F ext/fts5/fts5_index.c 222b5e56f51139ca5400985e26ea9971165901c7a45a2c17499bd2be3695c697 -F ext/fts5/fts5_main.c ff58907c51e347808ea4691f2cb341bb3d5558448a0c17a25a26a0740ea47a09 +F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 94225d693932eb0b5d7799d40513afbd31ed40e1e156675eb92ad7216f1ff20f -R 7ab0547b25495b9c2ea308d91c7abcea +P 4ae5e5b5ecbce580d3f7f970076e828fc6fb5fbcdc3bbe8381ab38f52870a54f +R 1cc525965a2e2a127c8f9151feacb5ac U drh -Z 2300f3100b43ff3fe1a9ea7184b73bea +Z e1fae3c7a54ed2950c8f337c19125b3f diff --git a/manifest.uuid b/manifest.uuid index 9a13403063..e8044de1cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4ae5e5b5ecbce580d3f7f970076e828fc6fb5fbcdc3bbe8381ab38f52870a54f \ No newline at end of file +57087ab2f297e4d96da5b9f3b89a26d8dd2bc4d22c2be8045b5d956d86282f39 \ No newline at end of file From 5e1a7ded4d423e26e7925a514cbe03303524b9a2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 22 May 2021 11:23:20 +0000 Subject: [PATCH 05/70] Do not invoke sqlite3ExprAffinity() after a syntax error that might have left the tree in an inconsistent state. See also [e8a1515b44380cc5] and [forum:/forumpost/7e484e225c|forum post 7e484e225c]. FossilOrigin-Name: b986600520696b0c91c4ccc6aff1b698391b4bcaf8a3ea436be1967883faa2fe --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 2 +- test/window1.test | 10 ++++++++++ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 9cf98316d4..9bd0173044 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sfix\sin\sthe\sprevious\scheck-in\swas\sonly\scorrect\sif\sthe\sOOM\soccurs\son\nthe\sinitial\sallocation.\s\sThis\schanges\sshould\smake\sit\scorrect\sfor\sa\sresize\nas\swell. -D 2021-05-22T11:00:03.746 +C Do\snot\sinvoke\ssqlite3ExprAffinity()\safter\sa\ssyntax\serror\sthat\smight\shave\nleft\sthe\stree\sin\san\sinconsistent\sstate.\s\sSee\salso\s[e8a1515b44380cc5]\sand\n[forum:/forumpost/7e484e225c|forum\spost\s7e484e225c]. +D 2021-05-22T11:23:20.366 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -632,7 +632,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 32f41c3c93c6785e0077e3a2cdc669c3ccfe70173787847be77f294c18fc7dc3 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c 110ed13049e0f1dc27e9dd942eb870417b36480cb7819302f5804cbcf9330b0e +F src/wherecode.c adb672751620b034cfc92b6e6595d80f1ea3ec1ffb54275378f960ba25d9aac1 F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 F src/window.c ce5e73ab88a8527d268673906bf89cbe58c61bca8d54d38ed8c33c3220a276ee F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1771,7 +1771,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 7cb66f49d30d89ca9d28dc20f7f1d85229365651e8e6211f7da1448740866511 +F test/window1.test b7ed3bc8188b0c4036a2a19136405518939e63cf167c37ea2ceb78dd21c9a1f8 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4ae5e5b5ecbce580d3f7f970076e828fc6fb5fbcdc3bbe8381ab38f52870a54f -R 1cc525965a2e2a127c8f9151feacb5ac +P 57087ab2f297e4d96da5b9f3b89a26d8dd2bc4d22c2be8045b5d956d86282f39 +R 66a15b9d8fd951142648a451f7618484 U drh -Z e1fae3c7a54ed2950c8f337c19125b3f +Z e6443cef6f675f9efc24bfe89410552e diff --git a/manifest.uuid b/manifest.uuid index e8044de1cd..3feed8945f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -57087ab2f297e4d96da5b9f3b89a26d8dd2bc4d22c2be8045b5d956d86282f39 \ No newline at end of file +b986600520696b0c91c4ccc6aff1b698391b4bcaf8a3ea436be1967883faa2fe \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 4d0ba880d1..892772b1cc 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -773,7 +773,7 @@ static int codeAllEqualityTerms( sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); VdbeCoverage(v); } - if( pParse->db->mallocFailed==0 ){ + if( pParse->db->mallocFailed==0 && pParse->nErr==0 ){ if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_BLOB ){ zAff[j] = SQLITE_AFF_BLOB; } diff --git a/test/window1.test b/test/window1.test index f4b573d298..c1a40aebc0 100644 --- a/test/window1.test +++ b/test/window1.test @@ -2159,4 +2159,14 @@ do_catchsql_test 68.0 { SELECT rowid, a, b, sum(a)OVER() FROM t1 ORDER BY count(b); } {1 {misuse of aggregate: count()}} +# 2021-05-22 +# Forum https://sqlite.org/forum/forumpost/7e484e225c +# +reset_db +do_catchsql_test 69.0 { + CREATE TABLE t1(a,b); + CREATE INDEX t1ba ON t1(b,a); + SELECT * FROM t1 WHERE b = (SELECT b FROM t1 ORDER BY lead(b) OVER () AND SUM(a)); +} {1 {misuse of aggregate: SUM()}} + finish_test From 7cc73b399e07a6a4c663b4932c801ad26934fd48 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 23 May 2021 17:47:04 +0000 Subject: [PATCH 06/70] Do not push a WITH clause onto the processing stack if prior errors have occurred. dbsqlfuzz 6b7a144674e215f06ddfeb9042c873d9ee956ac0. FossilOrigin-Name: c2066dde53b9872dbb991e27419dd031791c942fe23826556f52efbd66c51662 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 12 +++++++----- test/with2.test | 11 +++++++++++ 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 9bd0173044..a1d27715e0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sinvoke\ssqlite3ExprAffinity()\safter\sa\ssyntax\serror\sthat\smight\shave\nleft\sthe\stree\sin\san\sinconsistent\sstate.\s\sSee\salso\s[e8a1515b44380cc5]\sand\n[forum:/forumpost/7e484e225c|forum\spost\s7e484e225c]. -D 2021-05-22T11:23:20.366 +C Do\snot\spush\sa\sWITH\sclause\sonto\sthe\sprocessing\sstack\sif\sprior\serrors\shave\noccurred.\s\sdbsqlfuzz\s6b7a144674e215f06ddfeb9042c873d9ee956ac0. +D 2021-05-23T17:47:04.747 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -543,7 +543,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 40e216d9a72e52841a9c8e0aec7d367bade8e2df17b804653b539b20c1ab5660 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c dd81ee4c1afeeb91047c5df7778701ea445bbaee24bfb5aeb980c7a32d2844d0 +F src/select.c 531612539a0058b6e953a5b5497d9a2066f483089764002d9f2745dd7600d6f7 F src/shell.c.in 1b32ba2918ede13b68df47c7b92b72ba0d06e68d384e78bb9d7456527271d400 F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1792,7 +1792,7 @@ F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3c F test/windowfault.test 21919e601f20b976ea2a73aa401220c89ed0e8d203c4f69476ea55bce3726496 F test/windowpushd.test d8895d08870b7226f7693665bd292eb177e62ca06799184957b3ca7dc03067df F test/with1.test 7bc5abfe4c80c0cef8a90f5a66d60b9982e8ccd7350c8eb70611323a3b8e07ba -F test/with2.test 858070ce1c71a198bff63691dab7eb3ce6c74fa46da3fff6b6c4c34c83f141fe +F test/with2.test bbf82609bbacc0a7a01d822022aed7b2fa702436dd3d0ecf942023564d2bba13 F test/with3.test ad32d13ad50661e6fa305f62a0717649c348792e7b658bf2644976227a9e0373 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8 @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 57087ab2f297e4d96da5b9f3b89a26d8dd2bc4d22c2be8045b5d956d86282f39 -R 66a15b9d8fd951142648a451f7618484 +P b986600520696b0c91c4ccc6aff1b698391b4bcaf8a3ea436be1967883faa2fe +R eb17d4980cec26c3ee5100c600887bbf U drh -Z e6443cef6f675f9efc24bfe89410552e +Z 47c85be57ec11e908122d7690b7c8f04 diff --git a/manifest.uuid b/manifest.uuid index 3feed8945f..c10a4f024b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b986600520696b0c91c4ccc6aff1b698391b4bcaf8a3ea436be1967883faa2fe \ No newline at end of file +c2066dde53b9872dbb991e27419dd031791c942fe23826556f52efbd66c51662 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 5df43cbabc..42be8554b4 100644 --- a/src/select.c +++ b/src/select.c @@ -5021,16 +5021,18 @@ static struct Cte *searchWith( ** ** This routine pushes the WITH clause passed as the second argument ** onto the top of the stack. If argument bFree is true, then this -** WITH clause will never be popped from the stack. In this case it -** should be freed along with the Parse object. In other cases, when +** WITH clause will never be popped from the stack but should instead +** be freed along with the Parse object. In other cases, when ** bFree==0, the With object will be freed along with the SELECT ** statement with which it is associated. */ void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ if( pWith ){ - assert( pParse->pWith!=pWith ); - pWith->pOuter = pParse->pWith; - pParse->pWith = pWith; + if( pParse->nErr==0 ){ + assert( pParse->pWith!=pWith ); + pWith->pOuter = pParse->pWith; + pParse->pWith = pWith; + } if( bFree ){ sqlite3ParserAddCleanup(pParse, (void(*)(sqlite3*,void*))sqlite3WithDelete, diff --git a/test/with2.test b/test/with2.test index ebd4cf54b1..02f808ea23 100644 --- a/test/with2.test +++ b/test/with2.test @@ -600,4 +600,15 @@ do_catchsql_test 11.5 { ) SELECT * from t1; } {0 55} +# 2021-05-23 dbsqlfuzz 6b7a144674e215f06ddfeb9042c873d9ee956ac0 */ +reset_db +do_execsql_test 12.1 { + CREATE TABLE t1(a); + INSERT INTO t1 VALUES(1),('hello'),(4.25),(NULL),(x'3c626c6f623e'); + CREATE VIEW v2(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM t1) SELECT * FROM v2) SELECT a) SELECT * from t1; + CREATE VIEW v3(c) AS WITH x AS (WITH y AS (WITH z AS(SELECT * FROM v2) SELECT * FROM v3) SELECT a) SELECT * from t1; + ALTER TABLE t1 RENAME TO t1x; + SELECT quote(c) FROM v3; +} {1 'hello' 4.25 NULL X'3C626C6F623E'} + finish_test From 0542812726e199388fa06e8bdea8a75bb3688721 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 24 May 2021 00:17:04 +0000 Subject: [PATCH 07/70] Additional defenses (above and beyond [b986600520696b0c]) to prevent an invalid subquery from causing problems downstream. If an error is found while analyzing a subquery expression, change the expression to TK_ERROR so inhibit further processing on that expression. dbsqlfuzz cf624b8c0484c66e0f552bf6475e3e3f2c22b24e. FossilOrigin-Name: 0be6b6c9f7c562e764792a4a5eb53ed11b230174b19361f7cd7778c743314bbd --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 16 +++++++++++----- src/parse.y | 1 + test/window1.test | 11 +++++++++-- 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index a1d27715e0..b254f9b07b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\spush\sa\sWITH\sclause\sonto\sthe\sprocessing\sstack\sif\sprior\serrors\shave\noccurred.\s\sdbsqlfuzz\s6b7a144674e215f06ddfeb9042c873d9ee956ac0. -D 2021-05-23T17:47:04.747 +C Additional\sdefenses\s(above\sand\sbeyond\s[b986600520696b0c])\sto\sprevent\san\ninvalid\ssubquery\sfrom\scausing\sproblems\sdownstream.\s\sIf\san\serror\sis\sfound\nwhile\sanalyzing\sa\ssubquery\sexpression,\schange\sthe\sexpression\sto\sTK_ERROR\nso\sinhibit\sfurther\sprocessing\son\sthat\sexpression.\ndbsqlfuzz\scf624b8c0484c66e0f552bf6475e3e3f2c22b24e. +D 2021-05-24T00:17:04.520 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 73f57a9a183532c344a3135cf8f2a5589376e39183e0b5f562d6b61b2af0f4d8 -F src/expr.c c56c74d40d1ca5359177f1425d2eb2aa050c30da0b49e014da1f109aa38ece0f +F src/expr.c d4fd1850355d580f31a97bac8d640827b76de774bbcdc7ee105bbd1033da2bf9 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c 88fd711754a7241cb9f8eb1391370fd0c0cea756b3358efa274c5d1efd59af93 @@ -532,7 +532,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y ac294bd2891c4310b0b23a67ea3bbca2d0bf5b7662c4444b6517c3986be4a437 +F src/parse.y 8920f4444957d7827ca458029b2e41ffa32dd3b72917be0b52cae0aace3eadb5 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f @@ -1771,7 +1771,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test b7ed3bc8188b0c4036a2a19136405518939e63cf167c37ea2ceb78dd21c9a1f8 +F test/window1.test 49eadb28b0bae0f916518c9983b1fb7450c198915664f323b2bfc480cc98c431 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b986600520696b0c91c4ccc6aff1b698391b4bcaf8a3ea436be1967883faa2fe -R eb17d4980cec26c3ee5100c600887bbf +P c2066dde53b9872dbb991e27419dd031791c942fe23826556f52efbd66c51662 +R 431d781874723b1ee1c951d35c5f209c U drh -Z 47c85be57ec11e908122d7690b7c8f04 +Z 0c99c528950e729ac1ad6bba2e782e3e diff --git a/manifest.uuid b/manifest.uuid index c10a4f024b..8324580eae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c2066dde53b9872dbb991e27419dd031791c942fe23826556f52efbd66c51662 \ No newline at end of file +0be6b6c9f7c562e764792a4a5eb53ed11b230174b19361f7cd7778c743314bbd \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 6af6493c70..93da25ec44 100644 --- a/src/expr.c +++ b/src/expr.c @@ -561,7 +561,7 @@ static int exprVectorRegister( int *pRegFree /* OUT: Temp register to free */ ){ u8 op = pVector->op; - assert( op==TK_VECTOR || op==TK_REGISTER || op==TK_SELECT ); + assert( op==TK_VECTOR || op==TK_REGISTER || op==TK_SELECT || op==TK_ERROR ); if( op==TK_REGISTER ){ *ppExpr = sqlite3VectorFieldSubexpr(pVector, iField); return pVector->iTable+iField; @@ -570,8 +570,11 @@ static int exprVectorRegister( *ppExpr = pVector->x.pSelect->pEList->a[iField].pExpr; return regSelect+iField; } - *ppExpr = pVector->x.pList->a[iField].pExpr; - return sqlite3ExprCodeTemp(pParse, *ppExpr, pRegFree); + if( op==TK_VECTOR ){ + *ppExpr = pVector->x.pList->a[iField].pExpr; + return sqlite3ExprCodeTemp(pParse, *ppExpr, pRegFree); + } + return 0; } /* @@ -3093,6 +3096,7 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ Vdbe *v = pParse->pVdbe; assert( v!=0 ); + if( pParse->nErr ) return 0; testcase( pExpr->op==TK_EXISTS ); testcase( pExpr->op==TK_SELECT ); assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); @@ -3174,6 +3178,7 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ } pSel->iLimit = 0; if( sqlite3Select(pParse, pSel, &dest) ){ + if( pParse->nErr ) pExpr->op = TK_ERROR; return 0; } pExpr->iTable = rReg = dest.iSDParm; @@ -4017,7 +4022,7 @@ expr_code_doover: ** Expr node to be passed into this function, it will be handled ** sanely and not crash. But keep the assert() to bring the problem ** to the attention of the developers. */ - assert( op==TK_NULL || pParse->db->mallocFailed ); + assert( op==TK_NULL || op==TK_ERROR || pParse->db->mallocFailed ); sqlite3VdbeAddOp2(v, OP_Null, 0, target); return target; } @@ -4360,7 +4365,8 @@ expr_code_doover: if( pExpr->pLeft->iTable==0 ){ pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); } - assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); + assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT + || pExpr->pLeft->op==TK_ERROR ); if( pExpr->iTable!=0 && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) ){ diff --git a/src/parse.y b/src/parse.y index d29d861e70..359b02bc4e 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1855,6 +1855,7 @@ filter_clause(A) ::= FILTER LP WHERE expr(X) RP. { A = X; } IF_NULL_ROW /* the if-null-row operator */ ASTERISK /* The "*" in count(*) and similar */ SPAN /* The span operator */ + ERROR /* An expression containing an error */ . /* There must be no more than 255 tokens defined above. If this grammar ** is extended with new rules and tokens, they must either be so few in diff --git a/test/window1.test b/test/window1.test index c1a40aebc0..886bf468ff 100644 --- a/test/window1.test +++ b/test/window1.test @@ -2166,7 +2166,14 @@ reset_db do_catchsql_test 69.0 { CREATE TABLE t1(a,b); CREATE INDEX t1ba ON t1(b,a); - SELECT * FROM t1 WHERE b = (SELECT b FROM t1 ORDER BY lead(b) OVER () AND SUM(a)); -} {1 {misuse of aggregate: SUM()}} + SELECT * FROM t1 WHERE b = (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a)); +} {1 {misuse of aggregate: sum()}} +do_catchsql_test 69.1 { + SELECT * FROM t1 WHERE b >= (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a)); +} {1 {misuse of aggregate: sum()}} +do_catchsql_test 69.2 { + SELECT * FROM t1 WHERE b <= (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a)); +} {1 {misuse of aggregate: sum()}} + finish_test From bf7f3a005e1cf4573af2c74f3c3fdb721961ad4d Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 24 May 2021 11:35:16 +0000 Subject: [PATCH 08/70] Fix the TreeView module so that it works with the TK_ERROR exprssion. Also fix an assert() that was failing due to the recent TK_ERROR addition. FossilOrigin-Name: dd56fbe0cfb0f7848190ce097b378321dd25ae509c7edf93682b091014824fc6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 7 +++++-- src/treeview.c | 8 ++++++++ 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index b254f9b07b..ef79d8d801 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Additional\sdefenses\s(above\sand\sbeyond\s[b986600520696b0c])\sto\sprevent\san\ninvalid\ssubquery\sfrom\scausing\sproblems\sdownstream.\s\sIf\san\serror\sis\sfound\nwhile\sanalyzing\sa\ssubquery\sexpression,\schange\sthe\sexpression\sto\sTK_ERROR\nso\sinhibit\sfurther\sprocessing\son\sthat\sexpression.\ndbsqlfuzz\scf624b8c0484c66e0f552bf6475e3e3f2c22b24e. -D 2021-05-24T00:17:04.520 +C Fix\sthe\sTreeView\smodule\sso\sthat\sit\sworks\swith\sthe\sTK_ERROR\sexprssion.\nAlso\sfix\san\sassert()\sthat\swas\sfailing\sdue\sto\sthe\srecent\sTK_ERROR\saddition. +D 2021-05-24T11:35:16.772 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 73f57a9a183532c344a3135cf8f2a5589376e39183e0b5f562d6b61b2af0f4d8 -F src/expr.c d4fd1850355d580f31a97bac8d640827b76de774bbcdc7ee105bbd1033da2bf9 +F src/expr.c fcca84eb7b96038a45b1d7f67fa1e65667c5d50ff65f1235ce2fee82903899e3 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c 88fd711754a7241cb9f8eb1391370fd0c0cea756b3358efa274c5d1efd59af93 @@ -608,7 +608,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e -F src/treeview.c e483aeedf6f207000db1f90eb6abd816350493314c30e8749d319bdb9ab3b08c +F src/treeview.c 21449a944d5abd3ac07b7eab76f7221e20c9480d06f01798f8dc66d9bc361769 F src/trigger.c e0fd347b2571a2d956318cdc6d011ccca7ce862d10a0ca04188a37920ef5440c F src/update.c 56fa0458b1ffc1042629f926443e8ed44203983df3ab2b0db2ba556e6ceed68c F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c2066dde53b9872dbb991e27419dd031791c942fe23826556f52efbd66c51662 -R 431d781874723b1ee1c951d35c5f209c +P 0be6b6c9f7c562e764792a4a5eb53ed11b230174b19361f7cd7778c743314bbd +R 864ff1884742300c9d9725780964fbda U drh -Z 0c99c528950e729ac1ad6bba2e782e3e +Z 20a5f66a072e10dabc92731ce9bb2356 diff --git a/manifest.uuid b/manifest.uuid index 8324580eae..1cceca4a29 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0be6b6c9f7c562e764792a4a5eb53ed11b230174b19361f7cd7778c743314bbd \ No newline at end of file +dd56fbe0cfb0f7848190ce097b378321dd25ae509c7edf93682b091014824fc6 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 93da25ec44..fbfba759f5 100644 --- a/src/expr.c +++ b/src/expr.c @@ -445,7 +445,7 @@ int sqlite3ExprVectorSize(Expr *pExpr){ ** been positioned. */ Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){ - assert( iop==TK_ERROR ); if( sqlite3ExprIsVector(pVector) ){ assert( pVector->op2==0 || pVector->op==TK_REGISTER ); if( pVector->op==TK_SELECT || pVector->op2==TK_SELECT ){ @@ -3178,7 +3178,10 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ } pSel->iLimit = 0; if( sqlite3Select(pParse, pSel, &dest) ){ - if( pParse->nErr ) pExpr->op = TK_ERROR; + if( pParse->nErr ){ + pExpr->op2 = pExpr->op; + pExpr->op = TK_ERROR; + } return 0; } pExpr->iTable = rReg = dest.iSDParm; diff --git a/src/treeview.c b/src/treeview.c index 12a6b21a87..c737a1b98b 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -706,6 +706,14 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); break; } + case TK_ERROR: { + Expr tmp; + sqlite3TreeViewLine(pView, "ERROR"); + tmp = *pExpr; + tmp.op = pExpr->op2; + sqlite3TreeViewExpr(pView, &tmp, 0); + break; + } default: { sqlite3TreeViewLine(pView, "op=%d", pExpr->op); break; From b6b06bb339cbbed269cc5b7017de5c94e9c67bb1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 24 May 2021 12:13:10 +0000 Subject: [PATCH 09/70] New dbsqlfuzz cases added to test/fuzzdata8.db. FossilOrigin-Name: 5bb5c9ec049488f95e47bbd9f1db9038ffabad3cfafa613acdaa790ab4034eee --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2260992 -> 2276352 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index ef79d8d801..25408f3f86 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sTreeView\smodule\sso\sthat\sit\sworks\swith\sthe\sTK_ERROR\sexprssion.\nAlso\sfix\san\sassert()\sthat\swas\sfailing\sdue\sto\sthe\srecent\sTK_ERROR\saddition. -D 2021-05-24T11:35:16.772 +C New\sdbsqlfuzz\scases\sadded\sto\stest/fuzzdata8.db. +D 2021-05-24T12:13:10.905 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 5e616432bbdd9b27014463545cae06797790645021fbc650d28c994b4f02a6f5 +F test/fuzzdata8.db 29ca3c47821abb626309e0d182b0f00ad3b49638370daee855641b9abc36dfa2 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0be6b6c9f7c562e764792a4a5eb53ed11b230174b19361f7cd7778c743314bbd -R 864ff1884742300c9d9725780964fbda +P dd56fbe0cfb0f7848190ce097b378321dd25ae509c7edf93682b091014824fc6 +R 8dc3e7bfe0211a30e62fc14fd0ca86e9 U drh -Z 20a5f66a072e10dabc92731ce9bb2356 +Z e786b23401afb7174d49afd764617506 diff --git a/manifest.uuid b/manifest.uuid index 1cceca4a29..2bd843c26b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dd56fbe0cfb0f7848190ce097b378321dd25ae509c7edf93682b091014824fc6 \ No newline at end of file +5bb5c9ec049488f95e47bbd9f1db9038ffabad3cfafa613acdaa790ab4034eee \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index a5521775916979cff9b93273d0dd0cd3b0087d1b..619e5d53b697fc196feaa1ae625bcafe1967b38e 100644 GIT binary patch delta 41907 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

yFn^-3uWKO7~6^UR1f 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 KuWZ*q_WuFFJQgDW delta 38242 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 From 0fcf6f01e7a81647ca34b540540e0905d6042899 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 24 May 2021 12:28:13 +0000 Subject: [PATCH 10/70] Minor comment improvements in fuzzcheck.c. FossilOrigin-Name: 7aca8d52c16c2192d9c1ff03a976c482a60365cef8d2474b540ff4c84e8737b4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 16 ++++++++-------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 25408f3f86..193d38f167 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sdbsqlfuzz\scases\sadded\sto\stest/fuzzdata8.db. -D 2021-05-24T12:13:10.905 +C Minor\scomment\simprovements\sin\sfuzzcheck.c. +D 2021-05-24T12:28:13.639 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1047,7 +1047,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c c51cdb34e926d0a6551624aa1f04c456c29317b5457855d64391917d9b4c2aff +F test/fuzzcheck.c 37f09efcd982048694d8b06fa3ef817df17f2a82e90af85cb3fb8eddd0f57ec4 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P dd56fbe0cfb0f7848190ce097b378321dd25ae509c7edf93682b091014824fc6 -R 8dc3e7bfe0211a30e62fc14fd0ca86e9 +P 5bb5c9ec049488f95e47bbd9f1db9038ffabad3cfafa613acdaa790ab4034eee +R 8abf47bfcd09099416b7e0ebf8da1954 U drh -Z e786b23401afb7174d49afd764617506 +Z 7413c02b9058cd69a9060ec55f66578b diff --git a/manifest.uuid b/manifest.uuid index 2bd843c26b..810c065d19 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5bb5c9ec049488f95e47bbd9f1db9038ffabad3cfafa613acdaa790ab4034eee \ No newline at end of file +7aca8d52c16c2192d9c1ff03a976c482a60365cef8d2474b540ff4c84e8737b4 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 6ec2f8460c..3020086a24 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -63,7 +63,7 @@ ** of the global variable g.zTextName[] will identify the specific XSQL and ** DB values that were running when the crash occurred. ** -** DBSQLFUZZ: +** DBSQLFUZZ: (Added 2020-02-25) ** ** The dbsqlfuzz fuzzer includes both a database file and SQL to run against ** that database in its input. This utility can now process dbsqlfuzz @@ -108,10 +108,10 @@ typedef unsigned char uint8_t; */ typedef struct VFile VFile; struct VFile { - char *zFilename; /* Filename. NULL for delete-on-close. From malloc() */ - int sz; /* Size of the file in bytes */ - int nRef; /* Number of references to this file */ - unsigned char *a; /* Content of the file. From malloc() */ + char *zFilename; /* Filename. NULL for delete-on-close. From malloc() */ + int sz; /* Size of the file in bytes */ + int nRef; /* Number of references to this file */ + unsigned char *a; /* Content of the file. From malloc() */ }; typedef struct VHandle VHandle; struct VHandle { @@ -219,7 +219,7 @@ static int progressHandler(void *pVdbeLimitFlag){ #endif /* -** Reallocate memory. Show and error and quit if unable. +** Reallocate memory. Show an error and quit if unable. */ static void *safe_realloc(void *pOld, int szNew){ void *pNew = realloc(pOld, szNew<=0 ? 1 : szNew); @@ -617,8 +617,8 @@ static int isOffset( /* ** Decode the text starting at zIn into a binary database file. -** The maximum length of zIn is nIn bytes. Compute the binary database -** file contain in space obtained from sqlite3_malloc(). +** The maximum length of zIn is nIn bytes. Store the binary database +** file in space obtained from sqlite3_malloc(). ** ** Return the number of bytes of zIn consumed. Or return -1 if there ** is an error. One potential error is that the recipe specifies a From c00727ab583ea47f6962aa33dfc84f2d3723dc04 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 24 May 2021 14:35:19 +0000 Subject: [PATCH 11/70] Fix a problem in the in-memory journal code that could occasionally lead to a segfault when a sub-transaction that modified zero pages was committed. FossilOrigin-Name: 17960165f5840cab45b7a8bb02779ebfb321c68f33ec6da9ab14063ccd134fa4 --- manifest | 15 +++++++------- manifest.uuid | 2 +- src/memjournal.c | 38 ++++++++++++++++++----------------- test/memjournal.test | 48 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 26 deletions(-) create mode 100644 test/memjournal.test diff --git a/manifest b/manifest index 193d38f167..e79b0171d7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\scomment\simprovements\sin\sfuzzcheck.c. -D 2021-05-24T12:28:13.639 +C Fix\sa\sproblem\sin\sthe\sin-memory\sjournal\scode\sthat\scould\soccasionally\slead\sto\sa\ssegfault\swhen\sa\ssub-transaction\sthat\smodified\szero\spages\swas\scommitted. +D 2021-05-24T14:35:19.500 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,7 +515,7 @@ F src/mem2.c b93b8762ab999a29ae7751532dadf0a1ac78040308a5fb1d17fcc365171d67eb F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 F src/memdb.c f6ce717b26cd51a24cda62fce611b4b72b3db367113374aa498e489a69470715 -F src/memjournal.c 431c70a111223a8a6e2e7e9f014afc6c88d818d357d866afc563195f2277d50e +F src/memjournal.c a85f0dc5c02a42453d0bc3819ecfb5666cb6433e5deefcd93ccbe05c9f088b83 F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a @@ -1190,6 +1190,7 @@ F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 F test/memdb1.test 7b76c3262d63c46dd6b408d18f5721071776f2df4ffeb11e668824e427127594 +F test/memjournal.test 70f3a00c7f84ee2978ad14e831231caa1e7f23915a2c54b4f775a021d5740c6c F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 @@ -1914,7 +1915,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5bb5c9ec049488f95e47bbd9f1db9038ffabad3cfafa613acdaa790ab4034eee -R 8abf47bfcd09099416b7e0ebf8da1954 -U drh -Z 7413c02b9058cd69a9060ec55f66578b +P 7aca8d52c16c2192d9c1ff03a976c482a60365cef8d2474b540ff4c84e8737b4 +R 063cf7670c70a45b325de4faeffc140b +U dan +Z 2105d14c8908ec3b52c696f7307f25a5 diff --git a/manifest.uuid b/manifest.uuid index 810c065d19..103e3f204f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7aca8d52c16c2192d9c1ff03a976c482a60365cef8d2474b540ff4c84e8737b4 \ No newline at end of file +17960165f5840cab45b7a8bb02779ebfb321c68f33ec6da9ab14063ccd134fa4 \ No newline at end of file diff --git a/src/memjournal.c b/src/memjournal.c index 660a842676..598d5cc026 100644 --- a/src/memjournal.c +++ b/src/memjournal.c @@ -257,26 +257,28 @@ static int memjrnlWrite( */ static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ MemJournal *p = (MemJournal *)pJfd; - FileChunk *pIter = 0; + assert( p->endpoint.pChunk==0 || p->endpoint.pChunk->pNext==0 ); + if( sizeendpoint.iOffset ){ + FileChunk *pIter = 0; + if( size==0 ){ + memjrnlFreeChunks(p->pFirst); + p->pFirst = 0; + }else{ + i64 iOff = p->nChunkSize; + for(pIter=p->pFirst; ALWAYS(pIter) && iOff<=size; pIter=pIter->pNext){ + iOff += p->nChunkSize; + } + if( ALWAYS(pIter) ){ + memjrnlFreeChunks(pIter->pNext); + pIter->pNext = 0; + } + } - if( size==0 ){ - memjrnlFreeChunks(p->pFirst); - p->pFirst = 0; - }else{ - i64 iOff = p->nChunkSize; - for(pIter=p->pFirst; ALWAYS(pIter) && iOff<=size; pIter=pIter->pNext){ - iOff += p->nChunkSize; - } - if( ALWAYS(pIter) ){ - memjrnlFreeChunks(pIter->pNext); - pIter->pNext = 0; - } + p->endpoint.pChunk = pIter; + p->endpoint.iOffset = size; + p->readpoint.pChunk = 0; + p->readpoint.iOffset = 0; } - - p->endpoint.pChunk = pIter; - p->endpoint.iOffset = size; - p->readpoint.pChunk = 0; - p->readpoint.iOffset = 0; return SQLITE_OK; } diff --git a/test/memjournal.test b/test/memjournal.test new file mode 100644 index 0000000000..73f984b553 --- /dev/null +++ b/test/memjournal.test @@ -0,0 +1,48 @@ +# 2021 May 24 +# +# 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. +# +#*********************************************************************** +# Tests focused on the in-memory journal. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/malloc_common.tcl +set testprefix memjournal + + +do_execsql_test 1.0 { + PRAGMA journal_mode = memory; + CREATE TABLE t1(a); +} {memory} + +set nRow [expr 1] + +do_execsql_test 1.1 { + BEGIN; + INSERT INTO t1 VALUES( randomblob(500) ); +} {} + +do_test 1.2 { + for {set i 1} {$i <= 500} {incr i} { + execsql { + SAVEPOINT one; + UPDATE t1 SET a=randomblob(500); + } + execsql { SAVEPOINT abc } + execsql { UPDATE t1 SET a=randomblob(500) WHERE rowid<=$i AND 0 } + execsql { RELEASE abc } + } +} {} + +do_execsql_test 1.3 { + COMMIT; +} + +finish_test From 78a9d7551c7f709eef0804bd00caee1c06ff11d0 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 25 May 2021 11:39:14 +0000 Subject: [PATCH 12/70] Enhance the shell tool ".dump PATTERN" command so that it dumps the contents of shadow tables when a virtual table is identified by the PATTERN. FossilOrigin-Name: b0bc5ab9ceec496ac260ccfd53b51a2b53a81576fbe04c97b99f6705b063c59f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 27 +++++++++++++++++++++------ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index e79b0171d7..8908399948 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sthe\sin-memory\sjournal\scode\sthat\scould\soccasionally\slead\sto\sa\ssegfault\swhen\sa\ssub-transaction\sthat\smodified\szero\spages\swas\scommitted. -D 2021-05-24T14:35:19.500 +C Enhance\sthe\sshell\stool\s".dump\sPATTERN"\scommand\sso\sthat\sit\sdumps\sthe\scontents\sof\sshadow\stables\swhen\sa\svirtual\stable\sis\sidentified\sby\sthe\sPATTERN. +D 2021-05-25T11:39:14.912 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 40e216d9a72e52841a9c8e0aec7d367bade8e2df17b804653b539b20c1ab5660 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 531612539a0058b6e953a5b5497d9a2066f483089764002d9f2745dd7600d6f7 -F src/shell.c.in 1b32ba2918ede13b68df47c7b92b72ba0d06e68d384e78bb9d7456527271d400 +F src/shell.c.in 2a2b06d463933ee3a5bb0242d5d2200ca36769493fd6f4d939a0574113f3d6d8 F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e @@ -1915,7 +1915,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7aca8d52c16c2192d9c1ff03a976c482a60365cef8d2474b540ff4c84e8737b4 -R 063cf7670c70a45b325de4faeffc140b +P 17960165f5840cab45b7a8bb02779ebfb321c68f33ec6da9ab14063ccd134fa4 +R 566b3231aafb0b1c4d92f8d47e61c4a9 U dan -Z 2105d14c8908ec3b52c696f7307f25a5 +Z b40b0f8d44019306141de12b3f25d01c diff --git a/manifest.uuid b/manifest.uuid index 103e3f204f..a459b9cd7f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -17960165f5840cab45b7a8bb02779ebfb321c68f33ec6da9ab14063ccd134fa4 \ No newline at end of file +b0bc5ab9ceec496ac260ccfd53b51a2b53a81576fbe04c97b99f6705b063c59f \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 462cd717ba..517e12cb5a 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7739,11 +7739,26 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_free(zLike); goto meta_command_exit; } - }else if( zLike ){ - zLike = sqlite3_mprintf("%z OR name LIKE %Q ESCAPE '\\'", - zLike, azArg[i]); }else{ - zLike = sqlite3_mprintf("name LIKE %Q ESCAPE '\\'", azArg[i]); + /* azArg[i] contains a LIKE pattern. This ".dump" request should + ** only dump data for tables for which either the table name matches + ** the LIKE pattern, or the table appears to be a shadow table of + ** a virtual table for which the name matches the LIKE pattern. + */ + char *zExpr = sqlite3_mprintf( + "name LIKE %Q ESCAPE '\\' OR EXISTS (" + " SELECT 1 FROM sqlite_schema WHERE " + " name LIKE %Q ESCAPE '\\' AND" + " sql LIKE 'CREATE VIRTUAL TABLE%%' AND" + " substr(o.name, 1, length(name)+1) == (name||'_')" + ")", azArg[i], azArg[i] + ); + + if( zLike ){ + zLike = sqlite3_mprintf("%z OR %z", zLike, zExpr); + }else{ + zLike = zExpr; + } } } @@ -7765,7 +7780,7 @@ static int do_meta_command(char *zLine, ShellState *p){ p->nErr = 0; if( zLike==0 ) zLike = sqlite3_mprintf("true"); zSql = sqlite3_mprintf( - "SELECT name, type, sql FROM sqlite_schema " + "SELECT name, type, sql FROM sqlite_schema AS o " "WHERE (%s) AND type=='table'" " AND sql NOT NULL" " ORDER BY tbl_name='sqlite_sequence', rowid", @@ -7775,7 +7790,7 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_free(zSql); if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ zSql = sqlite3_mprintf( - "SELECT sql FROM sqlite_schema " + "SELECT sql FROM sqlite_schema AS o " "WHERE (%s) AND sql NOT NULL" " AND type IN ('index','trigger','view')", zLike From 4df68e0ae537a6821854d6cfacdf52b7d58ffb46 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 25 May 2021 15:21:54 +0000 Subject: [PATCH 13/70] Update an allocation routine in the sessions module to allow it to allocate the maximum size permitted by sqlite3_realloc64(). FossilOrigin-Name: 0b45e821911e4a852edd6d9e9cfe5f9de33337edf76fb12b79adaf11a4b83e8a --- ext/session/sessionbig.test | 98 ++++++++++++++++++++++++++++++++++++ ext/session/sqlite3session.c | 22 ++++++-- manifest | 15 +++--- manifest.uuid | 2 +- test/permutations.test | 1 + 5 files changed, 127 insertions(+), 11 deletions(-) create mode 100644 ext/session/sessionbig.test diff --git a/ext/session/sessionbig.test b/ext/session/sessionbig.test new file mode 100644 index 0000000000..1470902293 --- /dev/null +++ b/ext/session/sessionbig.test @@ -0,0 +1,98 @@ +# 2014 August 16 +# +# 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. +# +#*********************************************************************** +# +# This file implements regression tests for sessions SQLite extension. +# Specifically, this file contains tests for "patchset" changes. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source [file join [file dirname [info script]] session_common.tcl] +source $testdir/tester.tcl +ifcapable !session {finish_test; return} + +set testprefix sessionbig + +forcedelete test.db2 +sqlite3 db2 test.db2 + +do_execsql_test 1.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); +} +do_execsql_test -db db2 1.1 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); +} + +do_test 1.2 { + do_then_apply_sql { + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + } +} {} + +do_test 1.3 { + execsql { DELETE FROM t1 } + execsql2 { DELETE FROM t1 } +} {} + +do_test 1.4 { + set rc [catch { + do_then_apply_sql { + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + INSERT INTO t1(b) VALUES( zeroblob(100*1000*1000) ); + } + } msg] + list $rc $msg +} {1 SQLITE_NOMEM} + + +finish_test + diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 1f6c58b4db..c96363b604 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -1974,13 +1974,29 @@ int sqlite3session_attach( ** If successful, return zero. Otherwise, if an OOM condition is encountered, ** set *pRc to SQLITE_NOMEM and return non-zero. */ -static int sessionBufferGrow(SessionBuffer *p, size_t nByte, int *pRc){ - if( *pRc==SQLITE_OK && (size_t)(p->nAlloc-p->nBuf)nBuf + nByte; + if( *pRc==SQLITE_OK && nReq>p->nAlloc ){ u8 *aNew; i64 nNew = p->nAlloc ? p->nAlloc : 128; + do { nNew = nNew*2; - }while( (size_t)(nNew-p->nBuf)SESSION_MAX_BUFFER_SZ ){ + nNew = SESSION_MAX_BUFFER_SZ; + if( nNewaBuf, nNew); if( 0==aNew ){ diff --git a/manifest b/manifest index 8908399948..0e955af7e0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sshell\stool\s".dump\sPATTERN"\scommand\sso\sthat\sit\sdumps\sthe\scontents\sof\sshadow\stables\swhen\sa\svirtual\stable\sis\sidentified\sby\sthe\sPATTERN. -D 2021-05-25T11:39:14.912 +C Update\san\sallocation\sroutine\sin\sthe\ssessions\smodule\sto\sallow\sit\sto\sallocate\sthe\smaximum\ssize\spermitted\sby\ssqlite3_realloc64(). +D 2021-05-25T15:21:54.821 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -446,6 +446,7 @@ F ext/session/sessionH.test b17afdbd3b8f17e9bab91e235acf167cf35485db2ab2df0ea889 F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f46840172e9a01e8cc53e F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec +F ext/session/sessionbig.test 2a12fabf53f079042ac00e2ff01a445e774f4d4eedd54a1ada27b25c14e780d9 F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181332da26f29cddd7bb @@ -456,7 +457,7 @@ F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2 F ext/session/sessionsize.test 6f644aff31c7f1e4871e9ff3542766e18da68fc7e587b83a347ea9820a002dd8 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc -F ext/session/sqlite3session.c 703634ca25b4b903ae8ec25045802a8c8deca36a65d2b993c4bc8888f6d6c7ee +F ext/session/sqlite3session.c af0cb1163e224b286a9cba3c1ad877d927821e6a0e317c29b289a16e5da378a8 F ext/session/sqlite3session.h 0907de79bc13a2e3af30a6dc29acc60792a3eaf7d33d44cf52500d0f3c2b2171 F ext/session/test_session.c f433f68a8a8c64b0f5bc74dc725078f12483301ad4ae8375205eef790274a787 F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 @@ -1266,7 +1267,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test 9bb03106a024e9938d329a33380ea7fd91b6e45516881db68663505c444b3242 +F test/permutations.test 63da39a4234eed2ccd10bf7872de58e24d53a50d11014dc8a8ab9f252368e880 F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f F test/pragma.test 50b91bedea9324d3ab48e793f908ee7d2c7dcf84bfa2281e792838be59641ec8 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1915,7 +1916,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 17960165f5840cab45b7a8bb02779ebfb321c68f33ec6da9ab14063ccd134fa4 -R 566b3231aafb0b1c4d92f8d47e61c4a9 +P b0bc5ab9ceec496ac260ccfd53b51a2b53a81576fbe04c97b99f6705b063c59f +R ef39c7464543ee69b4de0503a2bec5a4 U dan -Z b40b0f8d44019306141de12b3f25d01c +Z c10587a9d81e2ad7ca989feae2bbdfdd diff --git a/manifest.uuid b/manifest.uuid index a459b9cd7f..b5b0f665d7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b0bc5ab9ceec496ac260ccfd53b51a2b53a81576fbe04c97b99f6705b063c59f \ No newline at end of file +0b45e821911e4a852edd6d9e9cfe5f9de33337edf76fb12b79adaf11a4b83e8a \ No newline at end of file diff --git a/test/permutations.test b/test/permutations.test index ed39c79a0f..b652f8571c 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -131,6 +131,7 @@ set allquicktests [test_set $alltests -exclude { fts3defer.test fts4langid.test fts3sort.test fts5unicode.test rtree4.test + sessionbig.test }] if {[info exists ::env(QUICKTEST_INCLUDE)]} { set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)] From 137b8ebb2b5535ee18e5ac20df1a3982bcfc5fcf Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 25 May 2021 16:10:12 +0000 Subject: [PATCH 14/70] Do not run sessionbig.test as part of the session_strm permutation. It is too slow. FossilOrigin-Name: 708ce7ad8acee702d08d1987aa253b0bfc3fd97255d6e4153122b03eba337570 --- ext/session/sessionbig.test | 5 +++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/ext/session/sessionbig.test b/ext/session/sessionbig.test index 1470902293..688025d80c 100644 --- a/ext/session/sessionbig.test +++ b/ext/session/sessionbig.test @@ -20,6 +20,11 @@ source [file join [file dirname [info script]] session_common.tcl] source $testdir/tester.tcl ifcapable !session {finish_test; return} +if {[permutation]=="session_strm" || [permutation]=="session_eec"} { + finish_test + return +} + set testprefix sessionbig forcedelete test.db2 diff --git a/manifest b/manifest index 0e955af7e0..0ff07745a5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\san\sallocation\sroutine\sin\sthe\ssessions\smodule\sto\sallow\sit\sto\sallocate\sthe\smaximum\ssize\spermitted\sby\ssqlite3_realloc64(). -D 2021-05-25T15:21:54.821 +C Do\snot\srun\ssessionbig.test\sas\spart\sof\sthe\ssession_strm\spermutation.\sIt\sis\stoo\sslow. +D 2021-05-25T16:10:12.465 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -446,7 +446,7 @@ F ext/session/sessionH.test b17afdbd3b8f17e9bab91e235acf167cf35485db2ab2df0ea889 F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f46840172e9a01e8cc53e F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec -F ext/session/sessionbig.test 2a12fabf53f079042ac00e2ff01a445e774f4d4eedd54a1ada27b25c14e780d9 +F ext/session/sessionbig.test 5851fc7f9981e2ccf1c7d9e7cb239dc530db07d5e878ebbb2f6d993d27872a43 F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181332da26f29cddd7bb @@ -1916,7 +1916,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b0bc5ab9ceec496ac260ccfd53b51a2b53a81576fbe04c97b99f6705b063c59f -R ef39c7464543ee69b4de0503a2bec5a4 +P 0b45e821911e4a852edd6d9e9cfe5f9de33337edf76fb12b79adaf11a4b83e8a +R e5e65b96cfadc0ae4669cc65c5b6cd06 U dan -Z c10587a9d81e2ad7ca989feae2bbdfdd +Z 9a7abfbe0eb3b33eb92b702ee941abb0 diff --git a/manifest.uuid b/manifest.uuid index b5b0f665d7..a58aa2c87c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0b45e821911e4a852edd6d9e9cfe5f9de33337edf76fb12b79adaf11a4b83e8a \ No newline at end of file +708ce7ad8acee702d08d1987aa253b0bfc3fd97255d6e4153122b03eba337570 \ No newline at end of file From 151446e793e6cf9398afd0fe48c45e2cbada8c4a Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 26 May 2021 14:32:33 +0000 Subject: [PATCH 15/70] Update an assert() in wherecode.c that might fail following an unrelated SQL error. FossilOrigin-Name: 3e2c36a8272ab3c1777638c0ed8222e7ff04657fe1c40f74a63b99a5a90258cc --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 2 +- test/rowvalue9.test | 13 +++++++++++++ 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 0ff07745a5..514e2f6f3c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\srun\ssessionbig.test\sas\spart\sof\sthe\ssession_strm\spermutation.\sIt\sis\stoo\sslow. -D 2021-05-25T16:10:12.465 +C Update\san\sassert()\sin\swherecode.c\sthat\smight\sfail\sfollowing\san\sunrelated\sSQL\serror. +D 2021-05-26T14:32:33.099 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 32f41c3c93c6785e0077e3a2cdc669c3ccfe70173787847be77f294c18fc7dc3 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c adb672751620b034cfc92b6e6595d80f1ea3ec1ffb54275378f960ba25d9aac1 +F src/wherecode.c b40f3addc024e546dd6c3c93261b0f484e98597bbde04f2a04b95dd570e00d02 F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 F src/window.c ce5e73ab88a8527d268673906bf89cbe58c61bca8d54d38ed8c33c3220a276ee F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1315,7 +1315,7 @@ F test/rowvalue5.test c81c7d8cf36711ab37675ad7376084ae2a359cb6 F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf6f2dba F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 -F test/rowvalue9.test d8dd2c6ecac432dadaa79e41dc2434f007be1b6b +F test/rowvalue9.test cb5380df82dca9db463081e26952c1e097b34fc2c2ac87453970c048d97df687 F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 F test/rowvaluevtab.test cd9747bb3f308086944c07968f547ad6b05022e698d80b9ffbdfe09ce0b8da6f F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 @@ -1916,7 +1916,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0b45e821911e4a852edd6d9e9cfe5f9de33337edf76fb12b79adaf11a4b83e8a -R e5e65b96cfadc0ae4669cc65c5b6cd06 +P 708ce7ad8acee702d08d1987aa253b0bfc3fd97255d6e4153122b03eba337570 +R 2526ebb62b8cafe1a6bcc018fc81592f U dan -Z 9a7abfbe0eb3b33eb92b702ee941abb0 +Z 78f8b00cbc933cd939f882f5d83b5332 diff --git a/manifest.uuid b/manifest.uuid index a58aa2c87c..4d7a5f522c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -708ce7ad8acee702d08d1987aa253b0bfc3fd97255d6e4153122b03eba337570 \ No newline at end of file +3e2c36a8272ab3c1777638c0ed8222e7ff04657fe1c40f74a63b99a5a90258cc \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 892772b1cc..71ba9f7633 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1122,7 +1122,7 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ } } }else{ - assert( nReg==1 ); + assert( nReg==1 || pParse->nErr ); sqlite3ExprCode(pParse, p, iReg); } } diff --git a/test/rowvalue9.test b/test/rowvalue9.test index 0fa652f97d..611aa3fbb7 100644 --- a/test/rowvalue9.test +++ b/test/rowvalue9.test @@ -297,5 +297,18 @@ do_execsql_test 7.3 { ); } { 1 4 1 5 } +#------------------------------------------------------------------------- +# +do_execsql_test 8.1 { + CREATE TABLE t1(a ,b FLOAT); + CREATE INDEX t1x1 ON t1(a,b,a,a,a,a,a,a,a,a,a,b); +} + +do_catchsql_test 8.2 { + SELECT a FROM t1 NATURAL JOIN t1 WHERE (a,b)> (SELECT 2 IN (SELECT 2,2), 2); +} {1 {sub-select returns 2 columns - expected 1}} + finish_test + + From 14c4d42874bd44c414c0ab0c77bde254d7c34b29 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 26 May 2021 18:46:51 +0000 Subject: [PATCH 16/70] Take care that the code is not generated for the same Select object more than once, as transformations that apply during the first pass might cause problems for the second pass. dbsqlfuzz 836b625cd8a41809ef80fc7ebaa6554357bcb463. FossilOrigin-Name: f30fb19ff763a7cbe768ea49954704e14d6400f69bb4257c9c890e1564e14835 --- manifest | 18 ++++++++--------- manifest.uuid | 2 +- src/expr.c | 54 +++++++++++++++++++++++++++------------------------ src/select.c | 18 +++-------------- src/window.c | 2 +- 5 files changed, 43 insertions(+), 51 deletions(-) diff --git a/manifest b/manifest index 514e2f6f3c..65c2202bec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\san\sassert()\sin\swherecode.c\sthat\smight\sfail\sfollowing\san\sunrelated\sSQL\serror. -D 2021-05-26T14:32:33.099 +C Take\scare\sthat\sthe\scode\sis\snot\sgenerated\sfor\sthe\ssame\sSelect\sobject\smore\nthan\sonce,\sas\stransformations\sthat\sapply\sduring\sthe\sfirst\spass\smight\ncause\sproblems\sfor\sthe\ssecond\spass.\ndbsqlfuzz\s836b625cd8a41809ef80fc7ebaa6554357bcb463. +D 2021-05-26T18:46:51.922 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 73f57a9a183532c344a3135cf8f2a5589376e39183e0b5f562d6b61b2af0f4d8 -F src/expr.c fcca84eb7b96038a45b1d7f67fa1e65667c5d50ff65f1235ce2fee82903899e3 +F src/expr.c 09f8ae1421d09802b4ac4b05c507761ecd142fa32cc0b1e33b9bd07fba10d34a F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c 88fd711754a7241cb9f8eb1391370fd0c0cea756b3358efa274c5d1efd59af93 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 40e216d9a72e52841a9c8e0aec7d367bade8e2df17b804653b539b20c1ab5660 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 531612539a0058b6e953a5b5497d9a2066f483089764002d9f2745dd7600d6f7 +F src/select.c 90e68ce9825dfcfed66c913c40dabf9d1c18232e6163ccf0eb83a062426b1aca F src/shell.c.in 2a2b06d463933ee3a5bb0242d5d2200ca36769493fd6f4d939a0574113f3d6d8 F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -635,7 +635,7 @@ F src/where.c 32f41c3c93c6785e0077e3a2cdc669c3ccfe70173787847be77f294c18fc7dc3 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c b40f3addc024e546dd6c3c93261b0f484e98597bbde04f2a04b95dd570e00d02 F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 -F src/window.c ce5e73ab88a8527d268673906bf89cbe58c61bca8d54d38ed8c33c3220a276ee +F src/window.c a6d624d83b2d5b3cfb82bb437a2fbae759c928d47dc9ad1338a9419269181bb2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test eecb0dabee4b7765a8465439d5e99429279ffba23ca74a7eae270a452799f9e7 @@ -1916,7 +1916,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 708ce7ad8acee702d08d1987aa253b0bfc3fd97255d6e4153122b03eba337570 -R 2526ebb62b8cafe1a6bcc018fc81592f -U dan -Z 78f8b00cbc933cd939f882f5d83b5332 +P 3e2c36a8272ab3c1777638c0ed8222e7ff04657fe1c40f74a63b99a5a90258cc +R b10ce1f99358565d3f53c557419950f3 +U drh +Z fbb7a8e7a5ceee7fc65ff6d53906cc32 diff --git a/manifest.uuid b/manifest.uuid index 4d7a5f522c..1962ec5c1f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e2c36a8272ab3c1777638c0ed8222e7ff04657fe1c40f74a63b99a5a90258cc \ No newline at end of file +f30fb19ff763a7cbe768ea49954704e14d6400f69bb4257c9c890e1564e14835 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index fbfba759f5..77f049ab04 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2985,19 +2985,23 @@ void sqlite3CodeRhsOfIN( /* If the LHS and RHS of the IN operator do not match, that ** error will have been caught long before we reach this point. */ if( ALWAYS(pEList->nExpr==nVal) ){ + Select *pCopy; SelectDest dest; int i; + int rc; sqlite3SelectDestInit(&dest, SRT_Set, iTab); dest.zAffSdst = exprINAffinity(pParse, pExpr); pSelect->iLimit = 0; testcase( pSelect->selFlags & SF_Distinct ); testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ - if( sqlite3Select(pParse, pSelect, &dest) ){ - sqlite3DbFree(pParse->db, dest.zAffSdst); + pCopy = sqlite3SelectDup(pParse->db, pSelect, 0); + rc = pParse->db->mallocFailed ? 1 :sqlite3Select(pParse, pCopy, &dest); + sqlite3SelectDelete(pParse->db, pCopy); + sqlite3DbFree(pParse->db, dest.zAffSdst); + if( rc ){ sqlite3KeyInfoUnref(pKeyInfo); return; - } - sqlite3DbFree(pParse->db, dest.zAffSdst); + } assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ assert( pEList!=0 ); assert( pEList->nExpr>0 ); @@ -3103,6 +3107,23 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ assert( ExprHasProperty(pExpr, EP_xIsSelect) ); pSel = pExpr->x.pSelect; + /* If this routine has already been coded, then invoke it as a + ** subroutine. */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId)); + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + return pExpr->iTable; + } + + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); + + /* The evaluation of the EXISTS/SELECT must be repeated every time it ** is encountered if any of the following is true: ** @@ -3114,22 +3135,6 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ ** save the results, and reuse the same result on subsequent invocations. */ if( !ExprHasProperty(pExpr, EP_VarSelect) ){ - /* If this routine has already been coded, then invoke it as a - ** subroutine. */ - if( ExprHasProperty(pExpr, EP_Subrtn) ){ - ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId)); - sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, - pExpr->y.sub.iAddr); - return pExpr->iTable; - } - - /* Begin coding the subroutine */ - ExprSetProperty(pExpr, EP_Subrtn); - pExpr->y.sub.regReturn = ++pParse->nMem; - pExpr->y.sub.iAddr = - sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; - VdbeComment((v, "return address")); - addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } @@ -3188,13 +3193,12 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ ExprSetVVAProperty(pExpr, EP_NoReduce); if( addrOnce ){ sqlite3VdbeJumpHere(v, addrOnce); - - /* Subroutine return */ - sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); - sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); - sqlite3ClearTempRegCache(pParse); } + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + sqlite3ClearTempRegCache(pParse); return rReg; } #endif /* SQLITE_OMIT_SUBQUERY */ diff --git a/src/select.c b/src/select.c index 42be8554b4..5e2655c41f 100644 --- a/src/select.c +++ b/src/select.c @@ -6421,19 +6421,8 @@ int sqlite3Select( pSub = pItem->pSelect; if( pSub==0 ) continue; - /* The code for a subquery should only be generated once, though it is - ** technically harmless for it to be generated multiple times. The - ** following assert() will detect if something changes to cause - ** the same subquery to be coded multiple times, as a signal to the - ** developers to try to optimize the situation. - ** - ** Update 2019-07-24: - ** See ticket https://sqlite.org/src/tktview/c52b09c7f38903b1311cec40. - ** The dbsqlfuzz fuzzer found a case where the same subquery gets - ** coded twice. So this assert() now becomes a testcase(). It should - ** be very rare, though. - */ - testcase( pItem->addrFillSub!=0 ); + /* The code for a subquery should only be generated once. */ + assert( pItem->addrFillSub==0 ); /* Increment Parse.nHeight by the height of the largest expression ** tree referred to by this, the parent select. The child select @@ -6520,14 +6509,13 @@ int sqlite3Select( sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pPrior->iCursor); pSub->nSelectRow = pPrior->pSelect->nSelectRow; }else{ - /* Materalize the view. If the view is not correlated, generate a + /* Materialize the view. If the view is not correlated, generate a ** subroutine to do the materialization so that subsequent uses of ** the same view can reuse the materialization. */ int topAddr; int onceAddr = 0; int retAddr; - testcase( pItem->addrFillSub==0 ); /* Ticket c52b09c7f38903b1311 */ pItem->regReturn = ++pParse->nMem; topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); pItem->addrFillSub = topAddr+1; diff --git a/src/window.c b/src/window.c index a997b9c6c9..2afa7c12ce 100644 --- a/src/window.c +++ b/src/window.c @@ -958,7 +958,7 @@ static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){ */ int sqlite3WindowRewrite(Parse *pParse, Select *p){ int rc = SQLITE_OK; - if( p->pWin && p->pPrior==0 && (p->selFlags & SF_WinRewrite)==0 ){ + if( p->pWin && p->pPrior==0 && ALWAYS((p->selFlags & SF_WinRewrite)==0) ){ Vdbe *v = sqlite3GetVdbe(pParse); sqlite3 *db = pParse->db; Select *pSub = 0; /* The subquery */ From 40b82f9dc64d6256f3624da044ff4e44a957e540 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 26 May 2021 18:51:57 +0000 Subject: [PATCH 17/70] Avoid assuming that an expression like "x=10" in a WHERE clause implies that CASE(x AS TEXT)=='10'. FossilOrigin-Name: 389ec669f416c74d651e25572f6e007c2a62ddd4027524f553107b06db5c55eb --- manifest | 15 ++++++++----- manifest.uuid | 2 +- src/select.c | 62 +++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 514e2f6f3c..e7ddb5a41f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\san\sassert()\sin\swherecode.c\sthat\smight\sfail\sfollowing\san\sunrelated\sSQL\serror. -D 2021-05-26T14:32:33.099 +C Avoid\sassuming\sthat\san\sexpression\slike\s"x=10"\sin\sa\sWHERE\sclause\simplies\sthat\sCASE(x\sAS\sTEXT)=='10'. +D 2021-05-26T18:51:57.863 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 40e216d9a72e52841a9c8e0aec7d367bade8e2df17b804653b539b20c1ab5660 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 531612539a0058b6e953a5b5497d9a2066f483089764002d9f2745dd7600d6f7 +F src/select.c c4cb9151f29451fb9375c8034b2381f0ec714d2c53c81a70afe959d96b7fc3b6 F src/shell.c.in 2a2b06d463933ee3a5bb0242d5d2200ca36769493fd6f4d939a0574113f3d6d8 F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1916,7 +1916,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 708ce7ad8acee702d08d1987aa253b0bfc3fd97255d6e4153122b03eba337570 -R 2526ebb62b8cafe1a6bcc018fc81592f +P 3e2c36a8272ab3c1777638c0ed8222e7ff04657fe1c40f74a63b99a5a90258cc +R cffb4f3f02576d8a42daeb09373618f5 +T *branch * constant-propagation-fix +T *sym-constant-propagation-fix * +T -sym-trunk * U dan -Z 78f8b00cbc933cd939f882f5d83b5332 +Z 5eeb8299cfa9877533e1ce28b95ad785 diff --git a/manifest.uuid b/manifest.uuid index 4d7a5f522c..026f717c4b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e2c36a8272ab3c1777638c0ed8222e7ff04657fe1c40f74a63b99a5a90258cc \ No newline at end of file +389ec669f416c74d651e25572f6e007c2a62ddd4027524f553107b06db5c55eb \ No newline at end of file diff --git a/src/select.c b/src/select.c index 42be8554b4..b94cd5364d 100644 --- a/src/select.c +++ b/src/select.c @@ -4417,6 +4417,7 @@ struct WhereConst { Parse *pParse; /* Parsing context */ int nConst; /* Number for COLUMN=CONSTANT terms */ int nChng; /* Number of times a constant is propagated */ + int bHasAffBlob; /* At least one column in apExpr[] as affinity BLOB */ Expr **apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */ }; @@ -4455,6 +4456,9 @@ static void constInsert( return; /* Already present. Return without doing anything. */ } } + if( sqlite3ExprAffinity(pColumn)==SQLITE_AFF_BLOB ){ + pConst->bHasAffBlob = 1; + } pConst->nConst++; pConst->apExpr = sqlite3DbReallocOrFree(pConst->pParse->db, pConst->apExpr, @@ -4496,26 +4500,34 @@ static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ } /* -** This is a Walker expression callback. pExpr is a candidate expression -** to be replaced by a value. If pExpr is equivalent to one of the -** columns named in pWalker->u.pConst, then overwrite it with its -** corresponding value. +** This is a helper function for Walker callback propagateConstantExprRewrite(). +** +** Argument pExpr is a candidate expression to be replaced by a value. If +** pExpr is equivalent to one of the columns named in pWalker->u.pConst, +** then overwrite it with the corresponding value. Except, do not do so +** if argument bIgnoreAffBlob is non-zero and the affinity of pExpr +** is SQLITE_AFF_BLOB. */ -static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ +static int propagateConstantExprRewriteOne( + WhereConst *pConst, + Expr *pExpr, + int bIgnoreAffBlob +){ int i; - WhereConst *pConst; if( pExpr->op!=TK_COLUMN ) return WRC_Continue; if( ExprHasProperty(pExpr, EP_FixedCol|EP_FromJoin) ){ testcase( ExprHasProperty(pExpr, EP_FixedCol) ); testcase( ExprHasProperty(pExpr, EP_FromJoin) ); return WRC_Continue; } - pConst = pWalker->u.pConst; for(i=0; inConst; i++){ Expr *pColumn = pConst->apExpr[i*2]; if( pColumn==pExpr ) continue; if( pColumn->iTable!=pExpr->iTable ) continue; if( pColumn->iColumn!=pExpr->iColumn ) continue; + if( bIgnoreAffBlob && sqlite3ExprAffinity(pColumn)==SQLITE_AFF_BLOB ){ + break; + } /* A match is found. Add the EP_FixedCol property */ pConst->nChng++; ExprClearProperty(pExpr, EP_Leaf); @@ -4527,6 +4539,41 @@ static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ return WRC_Prune; } +/* +** This is a Walker expression callback. pExpr is a node from the WHERE +** clause of a SELECT statement. This function examines pExpr to see if +** any substitutions based on the contents of pWalker->u.pConst should +** be made to pExpr or its immediate children. +** +** A substitution is made if: +** +** + pExpr is a column with an affinity other than BLOB that matches +** one of the columns in pWalker->u.pConst, or +** +** + pExpr is a binary comparison operator (=, <=, >=, <, >) that +** uses an affinity other than TEXT and one of its immediate +** children is a column that matches one of the columns in +** pWalker->u.pConst. +*/ +static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ + WhereConst *pConst = pWalker->u.pConst; + if( pConst->bHasAffBlob ){ + if( pExpr->op==TK_EQ + || pExpr->op==TK_LE + || pExpr->op==TK_GE + || pExpr->op==TK_LT + || pExpr->op==TK_GT + || pExpr->op==TK_IS + ){ + propagateConstantExprRewriteOne(pConst, pExpr->pLeft, 0); + if( sqlite3ExprAffinity(pExpr->pLeft)!=SQLITE_AFF_TEXT ){ + propagateConstantExprRewriteOne(pConst, pExpr->pRight, 0); + } + } + } + return propagateConstantExprRewriteOne(pConst, pExpr, pConst->bHasAffBlob); +} + /* ** The WHERE-clause constant propagation optimization. ** @@ -4575,6 +4622,7 @@ static int propagateConstants( x.nConst = 0; x.nChng = 0; x.apExpr = 0; + x.bHasAffBlob = 0; findConstInWhere(&x, p->pWhere); if( x.nConst ){ memset(&w, 0, sizeof(w)); From c3b48848b3a7f3564f8e7101be29868e76daf983 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 26 May 2021 19:37:27 +0000 Subject: [PATCH 18/70] Add new test file whereM.test. Containing tests for the change on this branch. FossilOrigin-Name: c4c76b824c41afb5b4d7b397c4d3142698aa303ea3a368c0cc7af4884e3a10bd --- manifest | 14 +++--- manifest.uuid | 2 +- test/whereM.test | 112 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 9 deletions(-) create mode 100644 test/whereM.test diff --git a/manifest b/manifest index e7ddb5a41f..685d9c1289 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sassuming\sthat\san\sexpression\slike\s"x=10"\sin\sa\sWHERE\sclause\simplies\sthat\sCASE(x\sAS\sTEXT)=='10'. -D 2021-05-26T18:51:57.863 +C Add\snew\stest\sfile\swhereM.test.\sContaining\stests\sfor\sthe\schange\son\sthis\sbranch. +D 2021-05-26T19:37:27.717 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1765,6 +1765,7 @@ F test/whereI.test c4bb7e2ca56d49bd8ab5c7bd085b8b83e353922b46904d68aefb3c7468643 F test/whereJ.test fc05e374cc9f2dc204148d6c06822c380ad388895fe97a6d335b94a26a08aecf F test/whereK.test 0270ab7f04ba5436fb9156d31d642a1c82727f4c4bfe5ba90d435c78cf44684a F test/whereL.test 50171e3ec00b4c8ad5ec773119a35d9e9642cec45154b44c366d628326479f4d +F test/whereM.test 0dbc9998783458ddcf3cc078ca7c2951d8b2677d472ecf0028f449ed327c0250 F test/wherefault.test 6cf2a9c5712952d463d3f45ebee7f6caf400984df51a195d884cfb7eb0e837a7 F test/wherelfault.test 9012e4ef5259058b771606616bd007af5d154e64cc25fa9fd4170f6411db44e3 F test/wherelimit.test afb46397c6d7e964e6e294ba3569864a0c570fe3807afc634236c2b752372f31 @@ -1916,10 +1917,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3e2c36a8272ab3c1777638c0ed8222e7ff04657fe1c40f74a63b99a5a90258cc -R cffb4f3f02576d8a42daeb09373618f5 -T *branch * constant-propagation-fix -T *sym-constant-propagation-fix * -T -sym-trunk * +P 389ec669f416c74d651e25572f6e007c2a62ddd4027524f553107b06db5c55eb +R cf3825b1c4ece40bade1233f60e8347b U dan -Z 5eeb8299cfa9877533e1ce28b95ad785 +Z 109f39ba8a2ad6a213793823e9e155e4 diff --git a/manifest.uuid b/manifest.uuid index 026f717c4b..0486ae84c6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -389ec669f416c74d651e25572f6e007c2a62ddd4027524f553107b06db5c55eb \ No newline at end of file +c4c76b824c41afb5b4d7b397c4d3142698aa303ea3a368c0cc7af4884e3a10bd \ No newline at end of file diff --git a/test/whereM.test b/test/whereM.test new file mode 100644 index 0000000000..83436893e8 --- /dev/null +++ b/test/whereM.test @@ -0,0 +1,112 @@ +# 2021 May 27 +# +# 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. +# +#*********************************************************************** +# Tests focused on the "constant propagation" that occurs within the +# WHERE clause of a SELECT statemente. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/malloc_common.tcl +set testprefix whereM + + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b INTEGER, c TEXT, d REAL, e BLOB); + INSERT INTO t1 VALUES(10.0, 10.0, 10.0, 10.0, 10.0); + SELECT * FROM t1; +} { + 10.0 10 10.0 10.0 10.0 +} + +do_execsql_test 1.1.1 { + SELECT a=10, a = '10.0', a LIKE '10.0' FROM t1; +} {1 0 1} +do_execsql_test 1.1.2 { + SELECT count(*) FROM t1 WHERE a=10 AND a = '10.0' +} {0} +do_execsql_test 1.1.3 { + SELECT count(*) FROM t1 WHERE a=10 AND a LIKE '10.0' +} {1} +do_execsql_test 1.1.4 { + SELECT count(*) FROM t1 WHERE a='10.0' AND a LIKE '10.0' +} {0} + +do_execsql_test 1.2.1 { + SELECT b=10, b = '10.0', b LIKE '10.0', b LIKE '10' FROM t1; +} {1 1 0 1} +do_execsql_test 1.2.2 { + SELECT count(*) FROM t1 WHERE b=10 AND b = '10.0' +} {1} +do_execsql_test 1.2.3 { + SELECT count(*) FROM t1 WHERE b=10 AND b LIKE '10.0' +} {0} +do_execsql_test 1.2.4 { + SELECT count(*) FROM t1 WHERE b='10.0' AND b LIKE '10.0' +} {0} +do_execsql_test 1.2.3 { + SELECT count(*) FROM t1 WHERE b=10 AND b LIKE '10' +} {1} +do_execsql_test 1.2.4 { + SELECT count(*) FROM t1 WHERE b='10.0' AND b LIKE '10' +} {1} + +do_execsql_test 1.3.1 { + SELECT c=10, c = 10.0, c = '10.0', c LIKE '10.0' FROM t1; +} {0 1 1 1} +do_execsql_test 1.3.2 { + SELECT count(*) FROM t1 WHERE c=10 AND c = '10.0' +} {0} +do_execsql_test 1.3.3 { + SELECT count(*) FROM t1 WHERE c=10 AND c LIKE '10.0' +} {0} +do_execsql_test 1.3.4 { + SELECT count(*) FROM t1 WHERE c='10.0' AND c LIKE '10.0' +} {1} +do_execsql_test 1.3.5 { + SELECT count(*) FROM t1 WHERE c=10.0 AND c = '10.0' +} {1} +do_execsql_test 1.3.6 { + SELECT count(*) FROM t1 WHERE c=10.0 AND c LIKE '10.0' +} {1} + +do_execsql_test 1.4.1 { + SELECT d=10, d = 10.0, d = '10.0', d LIKE '10.0', d LIKE '10' FROM t1; +} {1 1 1 1 0} +do_execsql_test 1.4.2 { + SELECT count(*) FROM t1 WHERE d=10 AND d = '10.0' +} {1} +do_execsql_test 1.4.3 { + SELECT count(*) FROM t1 WHERE d=10 AND d LIKE '10.0' +} {1} +do_execsql_test 1.4.4 { + SELECT count(*) FROM t1 WHERE d='10.0' AND d LIKE '10.0' +} {1} +do_execsql_test 1.4.5 { + SELECT count(*) FROM t1 WHERE d='10' AND d LIKE '10.0' +} {1} + +do_execsql_test 1.5.1 { + SELECT e=10, e = '10.0', e LIKE '10.0', e LIKE '10' FROM t1; +} {1 0 1 0} +do_execsql_test 1.5.2 { + SELECT count(*) FROM t1 WHERE e=10 AND e = '10.0' +} {0} +do_execsql_test 1.5.3 { + SELECT count(*) FROM t1 WHERE e=10 AND e LIKE '10.0' +} {1} +do_execsql_test 1.5.4 { + SELECT count(*) FROM t1 WHERE e='10.0' AND e LIKE '10.0' +} {0} +do_execsql_test 1.5.5 { + SELECT count(*) FROM t1 WHERE e=10.0 AND e LIKE '10.0' +} {1} + +finish_test From a8ed5154009e5028f9f0db271d086f2575ed1648 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 26 May 2021 19:52:21 +0000 Subject: [PATCH 19/70] Minor optimization to opcode comparison logic in the fixes to the constant-propagation optimization on this branch. FossilOrigin-Name: f17dec40a0ccc044bd32e035fc10797552329af242408a45f36125ed8d2ef088 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 685d9c1289..3891e97c8a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\stest\sfile\swhereM.test.\sContaining\stests\sfor\sthe\schange\son\sthis\sbranch. -D 2021-05-26T19:37:27.717 +C Minor\soptimization\sto\sopcode\scomparison\slogic\sin\sthe\sfixes\sto\nthe\sconstant-propagation\soptimization\son\sthis\sbranch. +D 2021-05-26T19:52:21.111 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 40e216d9a72e52841a9c8e0aec7d367bade8e2df17b804653b539b20c1ab5660 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c c4cb9151f29451fb9375c8034b2381f0ec714d2c53c81a70afe959d96b7fc3b6 +F src/select.c d5c307553eee86e5b0f17da1bd32cdb11ed9075450e54c7eb2c097a4eafa8690 F src/shell.c.in 2a2b06d463933ee3a5bb0242d5d2200ca36769493fd6f4d939a0574113f3d6d8 F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1917,7 +1917,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 389ec669f416c74d651e25572f6e007c2a62ddd4027524f553107b06db5c55eb -R cf3825b1c4ece40bade1233f60e8347b -U dan -Z 109f39ba8a2ad6a213793823e9e155e4 +P c4c76b824c41afb5b4d7b397c4d3142698aa303ea3a368c0cc7af4884e3a10bd +R 7605ce2b0c251b353f8b555563472bec +U drh +Z e16e744a131327b16a7c67438b84f063 diff --git a/manifest.uuid b/manifest.uuid index 0486ae84c6..35c002ce43 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c4c76b824c41afb5b4d7b397c4d3142698aa303ea3a368c0cc7af4884e3a10bd \ No newline at end of file +f17dec40a0ccc044bd32e035fc10797552329af242408a45f36125ed8d2ef088 \ No newline at end of file diff --git a/src/select.c b/src/select.c index b94cd5364d..9b1f95680d 100644 --- a/src/select.c +++ b/src/select.c @@ -4557,12 +4557,12 @@ static int propagateConstantExprRewriteOne( */ static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ WhereConst *pConst = pWalker->u.pConst; + assert( TK_GT==TK_EQ+1 ); + assert( TK_LE==TK_EQ+2 ); + assert( TK_LT==TK_EQ+3 ); + assert( TK_GE==TK_EQ+4 ); if( pConst->bHasAffBlob ){ - if( pExpr->op==TK_EQ - || pExpr->op==TK_LE - || pExpr->op==TK_GE - || pExpr->op==TK_LT - || pExpr->op==TK_GT + if( (pExpr->op>=TK_EQ && pExpr->op<=TK_GE) || pExpr->op==TK_IS ){ propagateConstantExprRewriteOne(pConst, pExpr->pLeft, 0); From 48f4f27cfbc29d497eea85b626497403866f2742 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 27 May 2021 10:23:16 +0000 Subject: [PATCH 20/70] Remove a NEVER that is reachable following OOM in writable_schema=ON mode with a corrupt schema. FossilOrigin-Name: 4eb80b0cc61526c1ff7478b1b855b29fa4326daee61facd1d85e4297bb32ac9d --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/alter.c | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 0db5d0a578..3b688ee670 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sconstant-propagation\soptimization\sin\sorder\sto\sbetter\ndeal\swith\sunusual\saffinities.\s\sSee\n[forum:/forumpost/6a06202608|forum\spost\s6a06202608]\sfor\smore\sdetail. -D 2021-05-26T23:10:19.141 +C Remove\sa\sNEVER\sthat\sis\sreachable\sfollowing\sOOM\sin\swritable_schema=ON\smode\nwith\sa\scorrupt\sschema. +D 2021-05-27T10:23:16.388 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c df53c39fd4f32528fc7ad8188b3bf2b506e1a8b3bb975b14f16a1bc6e901950f +F src/alter.c e2e0e6be8a53cc5c145d9ff4f82a2c8d6851468a366ac8b5bd7306c792e37619 F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -1917,8 +1917,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f30fb19ff763a7cbe768ea49954704e14d6400f69bb4257c9c890e1564e14835 f17dec40a0ccc044bd32e035fc10797552329af242408a45f36125ed8d2ef088 -R f9b4579ee085374536d0f78bf690bce2 -T +closed f17dec40a0ccc044bd32e035fc10797552329af242408a45f36125ed8d2ef088 +P 9be208a6d70582c6808abe6e016ab9cd8d10f0deefb8c7a8c0543372cca15b12 +R 8892243aaa7d6362f74772ffbfc7a32c U drh -Z 8281f9c417505202be530b0457855632 +Z b2475892e25c19e3c04350a708cba5bc diff --git a/manifest.uuid b/manifest.uuid index 706d1f3968..50213534b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9be208a6d70582c6808abe6e016ab9cd8d10f0deefb8c7a8c0543372cca15b12 \ No newline at end of file +4eb80b0cc61526c1ff7478b1b855b29fa4326daee61facd1d85e4297bb32ac9d \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 047b407e5b..423b2433b8 100644 --- a/src/alter.c +++ b/src/alter.c @@ -919,7 +919,7 @@ static RenameToken *renameTokenFind( void *pPtr ){ RenameToken **pp; - if( NEVER(pPtr==0) ){ + if( pPtr==0 ){ return 0; } for(pp=&pParse->pRename; (*pp); pp=&(*pp)->pNext){ From 342cb33b2321ea61075e17ce14863d851127cd59 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 27 May 2021 14:09:01 +0000 Subject: [PATCH 21/70] Improved comment on the prpagateConstants() routine. No changes to executable code. FossilOrigin-Name: d61a875df48d8baab3ada0174c8e0312a9268bbd11bf104b4385eff9e2744266 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 3b688ee670..a879453a2b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER\sthat\sis\sreachable\sfollowing\sOOM\sin\swritable_schema=ON\smode\nwith\sa\scorrupt\sschema. -D 2021-05-27T10:23:16.388 +C Improved\scomment\son\sthe\sprpagateConstants()\sroutine.\s\sNo\schanges\sto\sexecutable\ncode. +D 2021-05-27T14:09:01.854 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 40e216d9a72e52841a9c8e0aec7d367bade8e2df17b804653b539b20c1ab5660 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c f2d664297fccfe3eff7ac3b4e387ddb5cda1d53300f262d881869055b2299b85 +F src/select.c 2f4429e0b0ca031e360489c45dca5dfa06cd85480e12c0d1360b91e1c8e7f7a2 F src/shell.c.in 2a2b06d463933ee3a5bb0242d5d2200ca36769493fd6f4d939a0574113f3d6d8 F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1917,7 +1917,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9be208a6d70582c6808abe6e016ab9cd8d10f0deefb8c7a8c0543372cca15b12 -R 8892243aaa7d6362f74772ffbfc7a32c +P 4eb80b0cc61526c1ff7478b1b855b29fa4326daee61facd1d85e4297bb32ac9d +R 816e0d4f9adc95e1495d0ff38bde7776 U drh -Z b2475892e25c19e3c04350a708cba5bc +Z 0be2b6d4391de9cac15cfbee3096d192 diff --git a/manifest.uuid b/manifest.uuid index 50213534b1..eca5c5ff31 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4eb80b0cc61526c1ff7478b1b855b29fa4326daee61facd1d85e4297bb32ac9d \ No newline at end of file +d61a875df48d8baab3ada0174c8e0312a9268bbd11bf104b4385eff9e2744266 \ No newline at end of file diff --git a/src/select.c b/src/select.c index d10518a39e..3c70441a8b 100644 --- a/src/select.c +++ b/src/select.c @@ -4609,6 +4609,21 @@ static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ ** routines know to generate the constant "123" instead of looking up the ** column value. Also, to avoid collation problems, this optimization is ** only attempted if the "a=123" term uses the default BINARY collation. +** +** 2021-05-25 forum post 6a06202608: Another troublesome case is... +** +** CREATE TABLE t1(x); +** INSERT INTO t1 VALUES(10.0); +** SELECT 1 FROM t1 WHERE x=10 AND x LIKE 10; +** +** The query should return no rows, because the t1.x value is '10.0' not '10' +** and '10.0' is not LIKE '10'. But if we are not careful, the first WHERE +** term "x=10" will cause the second WHERE term to become "10 LIKE 10", +** resulting in a false positive. To avoid this, constant propagation for +** columns with BLOB affinity is only allowed if the constant is used with +** operators ==, <=, <, >=, >, or IS in a way that will cause the correct +** type conversions to occur. See logic associated with the bHasAffBlob flag +** for details. */ static int propagateConstants( Parse *pParse, /* The parsing context */ From 48a296c58954b93b1bde1006f77718450de81039 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 27 May 2021 16:31:04 +0000 Subject: [PATCH 22/70] Add the merge-test.tcl script to ease verification of LTS branches. FossilOrigin-Name: f958ffbc61c693b71538cc3aa5f95ce0f0b5d4906efbb0c075f543e19883a669 --- manifest | 11 ++--- manifest.uuid | 2 +- tool/merge-test.tcl | 99 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 tool/merge-test.tcl diff --git a/manifest b/manifest index a879453a2b..54e45bc28b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scomment\son\sthe\sprpagateConstants()\sroutine.\s\sNo\schanges\sto\sexecutable\ncode. -D 2021-05-27T14:09:01.854 +C Add\sthe\smerge-test.tcl\sscript\sto\sease\sverification\sof\sLTS\sbranches. +D 2021-05-27T16:31:04.311 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1842,6 +1842,7 @@ F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 +F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176 F tool/mkautoconfamal.sh f62353eb6c06ab264da027fd4507d09914433dbdcab9cb011cdc18016f1ab3b8 F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x F tool/mkctimec.tcl 06b0d503ee0e6c2d4abe83563b43d4925a12e31ec9fb3249ce39661f53fbd1ce @@ -1917,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4eb80b0cc61526c1ff7478b1b855b29fa4326daee61facd1d85e4297bb32ac9d -R 816e0d4f9adc95e1495d0ff38bde7776 +P d61a875df48d8baab3ada0174c8e0312a9268bbd11bf104b4385eff9e2744266 +R 5e30c1492c2c1677fa63079c20b0d339 U drh -Z 0be2b6d4391de9cac15cfbee3096d192 +Z bcd233e14e52403e9c9befb82a37b462 diff --git a/manifest.uuid b/manifest.uuid index eca5c5ff31..13fd3320c2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d61a875df48d8baab3ada0174c8e0312a9268bbd11bf104b4385eff9e2744266 \ No newline at end of file +f958ffbc61c693b71538cc3aa5f95ce0f0b5d4906efbb0c075f543e19883a669 \ No newline at end of file diff --git a/tool/merge-test.tcl b/tool/merge-test.tcl new file mode 100644 index 0000000000..2010d67657 --- /dev/null +++ b/tool/merge-test.tcl @@ -0,0 +1,99 @@ +#!/usr/bin/tcl +# +# Run this script to test to see that the latest trunk changes can be +# merged into LTS branches without breaking anything. +# +# To Use: +# +# * Copy this script into a directory above the sqlite checkout +# * Run "fossil update trunk" and "fossil revert" +# * Run "tclsh ../merge-test.tcl" (in other words run this script) +# +# Operation: +# +# This script changes to each LTS branch to be tested, merges the latest +# trunk changes into the branch (without committing them) and then +# runs "make test". Any errors are stored in local files. +# +# Limitations: +# +# Some LTS branches are not synced directly from trunk but rather from +# other LTS branches. These other branches cannot be tested because +# there is no good way to generate the intermediate merges. +# +############################################################################### + +# Run a shell command contained in arguments. Put the return code in +# global variable ::res and the output string in global variable ::result +# +proc safeexec {args} { + global res result + set res [catch "exec $args" result] +} + +# Run the shell command contained in arguments. Print an error and exit +# if anything goes wrong. +# +proc mustbeok {args} { + global res result + set res [catch "exec $args" result] + if {$res} { + puts "FAILED: $args" + puts $result + exit 1 + } +} + +# Write $content into a file named $filename. The file is overwritten if it +# already exist. The file is create if it does not already exist. +# +proc writefile {filename content} { + set fd [open $filename wb] + puts $fd $content + close $fd +} + +# Run the merge-test +# +foreach {branch configopts} { + begin-concurrent {--enable-json1} + begin-concurrent-pnu {--enable-json1} + wal2 {--enable-all} + reuse-schema {--enable-all} +} { + puts $branch + set errorfile ${branch}-error.txt + mustbeok fossil revert + mustbeok fossil up $branch + safeexec fossil merge trunk + if {$res} { + puts " merge failed - see $errorfile" + writefile $errorfile $result + } else { + puts " merge ok" + safeexec ./configure --enable-debug {*}$configopts + if {$res} { + puts " configure failed - see $errorfile" + writefile $errorfile $result + } else { + puts " configure ok" + safeexec make fuzzcheck sqlite3 testfixture + if {$res} { + puts " build failed - see $errorfile" + writefile $errorfile $result + } else { + puts " build ok" + safeexec make test + if {$res} { + puts " test failed - see $errorfile" + writefile $errorfile $result + } else { + puts " test ok" + } + } + } + } +} +mustbeok fossil revert +mustbeok fossil up trunk +puts "reset back to trunk" From d2f55773f1ef16132103f6b607802a59a00013b8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 28 May 2021 12:15:19 +0000 Subject: [PATCH 23/70] Fix a potential memory leak in json_group_object() following an error. dbsqlfuzz cd32630de3ff039d97089592b63cb3616f8ec9dd FossilOrigin-Name: 21676731cedae27d1ab9fe62b269001ae6e3eeb3caa87b4f5536f777631a8bbc --- ext/misc/json1.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 41ff01db49..077d02d912 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -2003,8 +2003,8 @@ static void jsonObjectStep( jsonAppendChar(pStr, '{'); }else if( pStr->nUsed>1 ){ jsonAppendChar(pStr, ','); - pStr->pCtx = ctx; } + pStr->pCtx = ctx; z = (const char*)sqlite3_value_text(argv[0]); n = (u32)sqlite3_value_bytes(argv[0]); jsonAppendString(pStr, z, n); diff --git a/manifest b/manifest index 54e45bc28b..5c1230994a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\smerge-test.tcl\sscript\sto\sease\sverification\sof\sLTS\sbranches. -D 2021-05-27T16:31:04.311 +C Fix\sa\spotential\smemory\sleak\sin\sjson_group_object()\sfollowing\san\serror.\ndbsqlfuzz\scd32630de3ff039d97089592b63cb3616f8ec9dd +D 2021-05-28T12:15:19.049 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -305,7 +305,7 @@ F ext/misc/fileio.c 9b69e25da3b51d4a1d905a464ccb96709792ad627a742ba09215bc0d1447 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c cd6ab89f85fda8a020559b3f4d03001a8a62dd856beda5af3f558621d12be913 -F ext/misc/json1.c 2c5c0dbc7fa303f0213f008e5878db9f0e5875fe8ff59a7c2d9f235b18e323a7 +F ext/misc/json1.c 76c5d9e0960fd15b4be79dacb76d872b4d0d983ce13e72ebfe9481d82cb9345d F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d61a875df48d8baab3ada0174c8e0312a9268bbd11bf104b4385eff9e2744266 -R 5e30c1492c2c1677fa63079c20b0d339 +P f958ffbc61c693b71538cc3aa5f95ce0f0b5d4906efbb0c075f543e19883a669 +R 96a7d9abe665dfd5611578e638dd272f U drh -Z bcd233e14e52403e9c9befb82a37b462 +Z d6e9a2d658f734ee79d64b1f37f13952 diff --git a/manifest.uuid b/manifest.uuid index 13fd3320c2..5105b37eab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f958ffbc61c693b71538cc3aa5f95ce0f0b5d4906efbb0c075f543e19883a669 \ No newline at end of file +21676731cedae27d1ab9fe62b269001ae6e3eeb3caa87b4f5536f777631a8bbc \ No newline at end of file From e9de65201c7630f9b587b8b14d1caecf2ca4c8d4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 28 May 2021 12:48:31 +0000 Subject: [PATCH 24/70] Make a deep copy of the result of a subquery in case the subquery is reused. Fix for the problem reported by [forum:/forumpost/28216b36ac|forum post 28216b36ac] and introduced by check-in [f30fb19ff763a7cb]. Further changes to try to optimize the new OP_Copy opcode back into either OP_SCopy or OP_Move will be attempted separately. A test case will be in TH3. FossilOrigin-Name: c9f0b9cb0aef107265435e22c164dd3c974eadfd00abf7cfd4fc7ec95c0dd7d0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5c1230994a..cc15943c16 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\smemory\sleak\sin\sjson_group_object()\sfollowing\san\serror.\ndbsqlfuzz\scd32630de3ff039d97089592b63cb3616f8ec9dd -D 2021-05-28T12:15:19.049 +C Make\sa\sdeep\scopy\sof\sthe\sresult\sof\sa\ssubquery\sin\scase\sthe\ssubquery\sis\nreused.\s\sFix\sfor\sthe\sproblem\sreported\sby\n[forum:/forumpost/28216b36ac|forum\spost\s28216b36ac]\sand\sintroduced\sby\ncheck-in\s[f30fb19ff763a7cb].\s\sFurther\schanges\sto\stry\sto\soptimize\sthe\snew\nOP_Copy\sopcode\sback\sinto\seither\sOP_SCopy\sor\sOP_Move\swill\sbe\sattempted\nseparately.\s\sA\stest\scase\swill\sbe\sin\sTH3. +D 2021-05-28T12:48:31.685 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 32f41c3c93c6785e0077e3a2cdc669c3ccfe70173787847be77f294c18fc7dc3 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c b40f3addc024e546dd6c3c93261b0f484e98597bbde04f2a04b95dd570e00d02 +F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 F src/window.c a6d624d83b2d5b3cfb82bb437a2fbae759c928d47dc9ad1338a9419269181bb2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f958ffbc61c693b71538cc3aa5f95ce0f0b5d4906efbb0c075f543e19883a669 -R 96a7d9abe665dfd5611578e638dd272f +P 21676731cedae27d1ab9fe62b269001ae6e3eeb3caa87b4f5536f777631a8bbc +R 77e951a6e7b5327d1f646c5968da6983 U drh -Z d6e9a2d658f734ee79d64b1f37f13952 +Z 20c9ad1ef6610380252081cdda3138d3 diff --git a/manifest.uuid b/manifest.uuid index 5105b37eab..f8745ea2ba 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -21676731cedae27d1ab9fe62b269001ae6e3eeb3caa87b4f5536f777631a8bbc \ No newline at end of file +c9f0b9cb0aef107265435e22c164dd3c974eadfd00abf7cfd4fc7ec95c0dd7d0 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 71ba9f7633..84fa1a1410 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -756,7 +756,7 @@ static int codeAllEqualityTerms( sqlite3ReleaseTempReg(pParse, regBase); regBase = r1; }else{ - sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j); + sqlite3VdbeAddOp2(v, OP_Copy, r1, regBase+j); } } if( pTerm->eOperator & WO_IN ){ From d36bcec9ad8ab1849f1ee4752289dc7d10dddf2e Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 29 May 2021 21:50:05 +0000 Subject: [PATCH 25/70] Fix a subtle error in an assert(). dbsqlfuzz eefbd0215c0c1b4bcc32b8141b48b35f7b431300 FossilOrigin-Name: a5ec81eb49e55fc03591666f336c09e5469785c8680f253ec3cc5366ac2fa45a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index cc15943c16..1e0916d521 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sa\sdeep\scopy\sof\sthe\sresult\sof\sa\ssubquery\sin\scase\sthe\ssubquery\sis\nreused.\s\sFix\sfor\sthe\sproblem\sreported\sby\n[forum:/forumpost/28216b36ac|forum\spost\s28216b36ac]\sand\sintroduced\sby\ncheck-in\s[f30fb19ff763a7cb].\s\sFurther\schanges\sto\stry\sto\soptimize\sthe\snew\nOP_Copy\sopcode\sback\sinto\seither\sOP_SCopy\sor\sOP_Move\swill\sbe\sattempted\nseparately.\s\sA\stest\scase\swill\sbe\sin\sTH3. -D 2021-05-28T12:48:31.685 +C Fix\sa\ssubtle\serror\sin\san\sassert().\ndbsqlfuzz\seefbd0215c0c1b4bcc32b8141b48b35f7b431300 +D 2021-05-29T21:50:05.246 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 51ba86095316fceb3e25bc61617d673d84627e79f4ace83f8722910f33eedef3 F src/btree.h 096cc53baa58be22b02c896d1cf933c38cfc6d65f9253c1367ece8cc88a24de5 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c daeb1beb04e3729456f095686bc26bb0cde026263fc281257d431ba22c2e7f21 +F src/build.c d766f04ddd88822c2c10cf3c0dfb34b068c45f103f442222038b9eeff02312ca F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 3052b6b05ed9ef547a3dd66b8e01bfa9d582e78752ad6ed327da84652641e038 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 21676731cedae27d1ab9fe62b269001ae6e3eeb3caa87b4f5536f777631a8bbc -R 77e951a6e7b5327d1f646c5968da6983 +P c9f0b9cb0aef107265435e22c164dd3c974eadfd00abf7cfd4fc7ec95c0dd7d0 +R d57d21188e8d42b5d5565dbb9a21642f U drh -Z 20c9ad1ef6610380252081cdda3138d3 +Z d77d383002af491a27be0c454c686139 diff --git a/manifest.uuid b/manifest.uuid index f8745ea2ba..b3cfdd709d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c9f0b9cb0aef107265435e22c164dd3c974eadfd00abf7cfd4fc7ec95c0dd7d0 \ No newline at end of file +a5ec81eb49e55fc03591666f336c09e5469785c8680f253ec3cc5366ac2fa45a \ No newline at end of file diff --git a/src/build.c b/src/build.c index 4f76c9380f..4680991ec0 100644 --- a/src/build.c +++ b/src/build.c @@ -888,7 +888,7 @@ int sqlite3TwoPartName( return -1; } }else{ - assert( db->init.iDb==0 || db->init.busy || IN_RENAME_OBJECT + assert( db->init.iDb==0 || db->init.busy || IN_SPECIAL_PARSE || (db->mDbFlags & DBFLAG_Vacuum)!=0); iDb = db->init.iDb; *pUnqual = pName1; From d65b7e36ecf05a3464c7071f92cfd304197ac66a Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 29 May 2021 23:07:59 +0000 Subject: [PATCH 26/70] Do not confuse the ">" operator with IS NOT NULL when checking to see if a partial index is usable. [forum:/forumpost/d813704d7c|Forum post d813704d7c]. FossilOrigin-Name: 8cc23931d61b7d78521acce93fc2603649c5813c7a0869cb2c1bde2c8c4e51b4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 3 ++- test/index6.test | 10 ++++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1e0916d521..eb69ac6165 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\ssubtle\serror\sin\san\sassert().\ndbsqlfuzz\seefbd0215c0c1b4bcc32b8141b48b35f7b431300 -D 2021-05-29T21:50:05.246 +C Do\snot\sconfuse\sthe\s">"\soperator\swith\sIS\sNOT\sNULL\swhen\schecking\sto\ssee\sif\na\spartial\sindex\sis\susable.\n[forum:/forumpost/d813704d7c|Forum\spost\sd813704d7c]. +D 2021-05-29T23:07:59.634 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -631,7 +631,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c c8ec20a1ca161d5635a4f19c2a4efec2e006e19a8a61f272bf6bce1c80ab7436 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c 32f41c3c93c6785e0077e3a2cdc669c3ccfe70173787847be77f294c18fc7dc3 +F src/where.c db781a6fb79cd68155a4c33638d4a2885e45ad57f8a8e99e95778e259c2aee8f F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 @@ -1093,7 +1093,7 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test 880858a65d8686120fe9a8971a4d82b429cc206fe7fd525b8b2b55451c74d82d +F test/index6.test 5a7ab531c692ff3b3d139ef8ea6709fab40f9c6862ed418b4976752a5481da3a F test/index7.test b238344318e0b4e42126717f6554f0e7dfd0b39cecad4b736039b43e1e3b6eb3 F test/index8.test caa097735c91dbc23d8a402f5e63a2a03c83840ba3928733ed7f9a03f8a912a3 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c9f0b9cb0aef107265435e22c164dd3c974eadfd00abf7cfd4fc7ec95c0dd7d0 -R d57d21188e8d42b5d5565dbb9a21642f +P a5ec81eb49e55fc03591666f336c09e5469785c8680f253ec3cc5366ac2fa45a +R fece908df531511de4c3e13a7b5636c9 U drh -Z d77d383002af491a27be0c454c686139 +Z a53952856d84541f7fe1749541be6df3 diff --git a/manifest.uuid b/manifest.uuid index b3cfdd709d..2e614497fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a5ec81eb49e55fc03591666f336c09e5469785c8680f253ec3cc5366ac2fa45a \ No newline at end of file +8cc23931d61b7d78521acce93fc2603649c5813c7a0869cb2c1bde2c8c4e51b4 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 4062de7eab..9483abdc5b 100644 --- a/src/where.c +++ b/src/where.c @@ -2914,7 +2914,8 @@ static int whereUsablePartialIndex( pExpr = pTerm->pExpr; if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) && (isLeft==0 || ExprHasProperty(pExpr, EP_FromJoin)) - && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) + && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) + && (pTerm->wtFlags & TERM_VNULL)==0 ){ return 1; } diff --git a/test/index6.test b/test/index6.test index d22c4d47df..7eed6a47e7 100644 --- a/test/index6.test +++ b/test/index6.test @@ -498,4 +498,14 @@ do_execsql_test index6-17.3 { SELECT COUNT(*) FROM t0 WHERE t0.c0 GLOB t0.c0; } {1} +# 2021-05-29 +# Forum https://sqlite.org/forum/forumpost/d813704d7c +reset_db +do_execsql_test index6-18.1 { + CREATE TABLE t1(a INT, b INT); + INSERT INTO t1 VALUES(10,10); + CREATE UNIQUE INDEX t1b ON t1(b) WHERE a>NULL; + SELECT * FROM t1 WHERE a IS NOT NULL; +} {10 10} + finish_test From b56a09079e8b5305d3c99ae19aedcbbd343b28d9 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 1 Jun 2021 15:37:14 +0000 Subject: [PATCH 27/70] Fix a problem with running ALTER TABLE against schemas that contain compound SELECT statements with ORDER BY clauses containing one or more references to the second or subsequent component SELECT statements. FossilOrigin-Name: 587a3044468a40707c714d013cb766d8a4d9eb13bb20871846a0e8c34bea8cf4 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 27 +++++++++++---------------- test/altertab.test | 26 +++++++++++++++++++++++--- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index eb69ac6165..540ae92042 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sconfuse\sthe\s">"\soperator\swith\sIS\sNOT\sNULL\swhen\schecking\sto\ssee\sif\na\spartial\sindex\sis\susable.\n[forum:/forumpost/d813704d7c|Forum\spost\sd813704d7c]. -D 2021-05-29T23:07:59.634 +C Fix\sa\sproblem\swith\srunning\sALTER\sTABLE\sagainst\sschemas\sthat\scontain\scompound\sSELECT\sstatements\swith\sORDER\sBY\sclauses\scontaining\sone\sor\smore\sreferences\sto\sthe\ssecond\sor\ssubsequent\scomponent\sSELECT\sstatements. +D 2021-06-01T15:37:14.513 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/prepare.c d778af9986f3b0107c5b255dcfe2696e8e99e00fb77c5115bbfea4e92c3302e7 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 40e216d9a72e52841a9c8e0aec7d367bade8e2df17b804653b539b20c1ab5660 +F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 2f4429e0b0ca031e360489c45dca5dfa06cd85480e12c0d1360b91e1c8e7f7a2 F src/shell.c.in 2a2b06d463933ee3a5bb0242d5d2200ca36769493fd6f4d939a0574113f3d6d8 @@ -658,7 +658,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altermalloc3.test 059841a3de6b6780efd9f0b30bf1d9b4443c555f68d39975cbcac2583167b239 F test/alterqf.test 67568ad152db8c1187b15633b801242cf960f1beafc51261a3d1725d910baeb2 -F test/altertab.test c7966d92e4da535050b911e1e9972ecb3a5befb0b2d22026b132cf5003d43dec +F test/altertab.test a96e2169bbb2c5a754b0ddac8a396e15b4ad6f34a5fbf6fbfad76bdfb339479f F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b F test/altertab3.test 2b82fa2236a3a91553d53ae5555d8e723c7eec174c41f1fa62ff497355398479 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a5ec81eb49e55fc03591666f336c09e5469785c8680f253ec3cc5366ac2fa45a -R fece908df531511de4c3e13a7b5636c9 -U drh -Z a53952856d84541f7fe1749541be6df3 +P 8cc23931d61b7d78521acce93fc2603649c5813c7a0869cb2c1bde2c8c4e51b4 +R 1e5d2af30db5fdc50b309212c57979f4 +U dan +Z 59a6bb7e776c02bc744130f0bc937781 diff --git a/manifest.uuid b/manifest.uuid index 2e614497fe..eff8dd6ecc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8cc23931d61b7d78521acce93fc2603649c5813c7a0869cb2c1bde2c8c4e51b4 \ No newline at end of file +587a3044468a40707c714d013cb766d8a4d9eb13bb20871846a0e8c34bea8cf4 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index d5cec3550a..93e10b6e44 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1262,7 +1262,7 @@ static int resolveOrderByTermToExprList( nc.nNcErr = 0; db = pParse->db; savedSuppErr = db->suppressErr; - if( IN_RENAME_OBJECT==0 ) db->suppressErr = 1; + db->suppressErr = 1; rc = sqlite3ResolveExprNames(&nc, pE); db->suppressErr = savedSuppErr; if( rc ) return 0; @@ -1361,29 +1361,24 @@ static int resolveCompoundOrderBy( ** Once the comparisons are finished, the duplicate expression ** is deleted. ** - ** Or, if this is running as part of an ALTER TABLE operation, - ** resolve the symbols in the actual expression, not a duplicate. - ** And, if one of the comparisons is successful, leave the expression - ** as is instead of transforming it to an integer as in the usual - ** case. This allows the code in alter.c to modify column - ** refererences within the ORDER BY expression as required. */ - if( IN_RENAME_OBJECT ){ - pDup = pE; - }else{ - pDup = sqlite3ExprDup(db, pE, 0); - } + ** If this is running as part of an ALTER TABLE operation and + ** the symbols resolve successfully, also resolve the symbols in the + ** actual expression. This allows the code in alter.c to modify + ** column references within the ORDER BY expression as required. */ + pDup = sqlite3ExprDup(db, pE, 0); if( !db->mallocFailed ){ assert(pDup); iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); + if( IN_RENAME_OBJECT && iCol>0 ){ + resolveOrderByTermToExprList(pParse, pSelect, pE); + } } - if( !IN_RENAME_OBJECT ){ - sqlite3ExprDelete(db, pDup); - } + sqlite3ExprDelete(db, pDup); } } if( iCol>0 ){ /* Convert the ORDER BY term into an integer column number iCol, - ** taking care to preserve the COLLATE clause if it exists */ + ** taking care to preserve the COLLATE clause if it exists. */ if( !IN_RENAME_OBJECT ){ Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); if( pNew==0 ) return 1; diff --git a/test/altertab.test b/test/altertab.test index 576d391ced..dacc5ab0e7 100644 --- a/test/altertab.test +++ b/test/altertab.test @@ -789,14 +789,34 @@ do_execsql_test 27.1 { END; } - -breakpoint do_execsql_test 27.2 { alter table t_sa rename column c_muyat to c_dg; } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 28.1 { + CREATE TABLE t1(a); + CREATE TABLE t2(b,c); + INSERT INTO t2 VALUES(1,2),(1,3),(2,5); + CREATE VIEW v3 AS + WITH RECURSIVE t3(x,y,z) AS ( + SELECT b,c,NULL FROM t2 + UNION + SELECT x,y,NULL FROM t3, t2 WHERE b=x + ORDER BY y + ) + SELECT * FROM t3; +} +do_execsql_test 28.2 { + SELECT * FROM v3 +} { + 1 2 {} 1 3 {} 2 5 {} +} - +do_execsql_test 28.3 { + ALTER TABLE t1 RENAME a TO a2; -- fails in v3 +} finish_test From f9ac1ab1e7fd9cb827094a88c894d595aacb4927 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 1 Jun 2021 21:07:49 +0000 Subject: [PATCH 28/70] Fix issue in 'mkopcodeh.tcl' tool that prevented its termination in rare circumstances. FossilOrigin-Name: a8d921136f8ab132279984a77d0eeaf355342cdb0a98d7e1e59c8e6c8ed9459c --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/mkopcodeh.tcl | 3 ++- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 540ae92042..ddc20c9616 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\srunning\sALTER\sTABLE\sagainst\sschemas\sthat\scontain\scompound\sSELECT\sstatements\swith\sORDER\sBY\sclauses\scontaining\sone\sor\smore\sreferences\sto\sthe\ssecond\sor\ssubsequent\scomponent\sSELECT\sstatements. -D 2021-06-01T15:37:14.513 +C Fix\sissue\sin\s'mkopcodeh.tcl'\stool\sthat\sprevented\sits\stermination\sin\srare\scircumstances. +D 2021-06-01T21:07:49.044 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1849,7 +1849,7 @@ F tool/mkctimec.tcl 06b0d503ee0e6c2d4abe83563b43d4925a12e31ec9fb3249ce39661f53fb F tool/mkkeywordhash.c 08b6e4d7a482a7f37a9a0032e7ba968e26624a027b6b2e9ba589be6f5e3d8c2c F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c -F tool/mkopcodeh.tcl acc798757e2c60e4b6e16745505b9595fca76c206815c8ada576a136cf3608ed +F tool/mkopcodeh.tcl 130b88697da6ec5b89b41844d955d08fb62c2552e889dec8c7bcecb28d8f50bd F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa F tool/mkpragmatab.tcl ae5585ae76ca26e4d6ccd5ea9cdebaf5efefb318bf989497a0e846cd711d9ab1 F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8cc23931d61b7d78521acce93fc2603649c5813c7a0869cb2c1bde2c8c4e51b4 -R 1e5d2af30db5fdc50b309212c57979f4 -U dan -Z 59a6bb7e776c02bc744130f0bc937781 +P 587a3044468a40707c714d013cb766d8a4d9eb13bb20871846a0e8c34bea8cf4 +R 28996daffb0e59933544ba8f6a6b21ff +U mistachkin +Z 45822110f0419a0d61a2348a085e7f10 diff --git a/manifest.uuid b/manifest.uuid index eff8dd6ecc..4fa1d90d6b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -587a3044468a40707c714d013cb766d8a4d9eb13bb20871846a0e8c34bea8cf4 \ No newline at end of file +a8d921136f8ab132279984a77d0eeaf355342cdb0a98d7e1e59c8e6c8ed9459c \ No newline at end of file diff --git a/tool/mkopcodeh.tcl b/tool/mkopcodeh.tcl index cc372e404a..d4f3c4f13b 100644 --- a/tool/mkopcodeh.tcl +++ b/tool/mkopcodeh.tcl @@ -208,8 +208,9 @@ for {set i 0} {$i<$nOp} {incr i} { for {set g 0} {$g<$nGroup} {incr g} { set gLen [llength $groups($g)] set ok 0; set start -1 + set seek $cnt while {!$ok} { - set seek $cnt; incr seek + incr seek while {[info exists used($seek)]} {incr seek} set ok 1; set start $seek for {set j 0} {$j<$gLen} {incr j} { From b034a241403a32eaa11897c2f28e83d9e1fc275e Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Jun 2021 12:44:26 +0000 Subject: [PATCH 29/70] This is an attempt to address the OP_SeekScan performance issue identified by [forum:/forumpost/b4fcb8a598|forum post b4fcb8a598]. FossilOrigin-Name: d58efb3f21a4150b8136197e43837c7b646c42d492a7c24ddc7591dba415a2c8 --- manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/where.c | 23 ++++++++++++++++------- src/wherecode.c | 2 +- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index ddc20c9616..9732d15ae4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sissue\sin\s'mkopcodeh.tcl'\stool\sthat\sprevented\sits\stermination\sin\srare\scircumstances. -D 2021-06-01T21:07:49.044 +C This\sis\san\sattempt\sto\saddress\sthe\sOP_SeekScan\sperformance\sissue\sidentified\sby\n[forum:/forumpost/b4fcb8a598|forum\spost\sb4fcb8a598]. +D 2021-06-02T12:44:26.088 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -631,9 +631,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c c8ec20a1ca161d5635a4f19c2a4efec2e006e19a8a61f272bf6bce1c80ab7436 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c db781a6fb79cd68155a4c33638d4a2885e45ad57f8a8e99e95778e259c2aee8f +F src/where.c 2a6ae34252a15de5e6e1102d037ec899bd22c020d4f3e3df30f7afc1d9d3e349 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f +F src/wherecode.c d0963d5a2aaae8c18f459a7e72dc6c7ca897f3a4ddb40fd56a12384b725e9e0a F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 F src/window.c a6d624d83b2d5b3cfb82bb437a2fbae759c928d47dc9ad1338a9419269181bb2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1918,7 +1918,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 587a3044468a40707c714d013cb766d8a4d9eb13bb20871846a0e8c34bea8cf4 -R 28996daffb0e59933544ba8f6a6b21ff -U mistachkin -Z 45822110f0419a0d61a2348a085e7f10 +P a8d921136f8ab132279984a77d0eeaf355342cdb0a98d7e1e59c8e6c8ed9459c +R c9d14953d90f0bc10aff723dd24fc8cd +T *branch * seekscan-improvements +T *sym-seekscan-improvements * +T -sym-trunk * +U drh +Z 37cec0fe3735838a40d15474ed3bffee diff --git a/manifest.uuid b/manifest.uuid index 4fa1d90d6b..0ba9b1497b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a8d921136f8ab132279984a77d0eeaf355342cdb0a98d7e1e59c8e6c8ed9459c \ No newline at end of file +d58efb3f21a4150b8136197e43837c7b646c42d492a7c24ddc7591dba415a2c8 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 9483abdc5b..9ccdd7e669 100644 --- a/src/where.c +++ b/src/where.c @@ -2597,7 +2597,7 @@ static int whereLoopAddBtreeIndex( nIn = sqlite3LogEst(pExpr->x.pList->nExpr); } if( pProbe->hasStat1 && rLogSize>=10 ){ - LogEst M, logK, safetyMargin; + LogEst M, logK, x; /* Let: ** N = the total number of rows in the table ** K = the number of entries on the RHS of the IN operator @@ -2620,16 +2620,25 @@ static int whereLoopAddBtreeIndex( */ M = pProbe->aiRowLogEst[saved_nEq]; logK = estLog(nIn); - safetyMargin = 10; /* TUNING: extra weight for indexed IN */ - if( M + logK + safetyMargin < nIn + rLogSize ){ + /* TUNING v----- 10 to bias toward indexed IN */ + x = M + logK + 10 - (nIn + rLogSize); + if( x>=0 ){ WHERETRACE(0x40, - ("Scan preferred over IN operator on column %d of \"%s\" (%d<%d)\n", - saved_nEq, pProbe->zName, M+logK+10, nIn+rLogSize)); + ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d) " + "prefers indexed lookup\n", + saved_nEq, M, logK, nIn, rLogSize, x)); + }else if( x < -nInMul ){ + WHERETRACE(0x40, + ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d" + " nInMul=%d) prefers skip-scan\n", + saved_nEq, M, logK, nIn, rLogSize, x, nInMul)); pNew->wsFlags |= WHERE_IN_SEEKSCAN; }else{ WHERETRACE(0x40, - ("IN operator preferred on column %d of \"%s\" (%d>=%d)\n", - saved_nEq, pProbe->zName, M+logK+10, nIn+rLogSize)); + ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d" + " nInMul=%d) prefers normal scan\n", + saved_nEq, M, logK, nIn, rLogSize, x, nInMul)); + continue; } } pNew->wsFlags |= WHERE_COLUMN_IN; diff --git a/src/wherecode.c b/src/wherecode.c index 84fa1a1410..42315e59a0 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1827,7 +1827,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; assert( op!=0 ); - if( (pLoop->wsFlags & WHERE_IN_SEEKSCAN)!=0 && op==OP_SeekGE ){ + if( (pLoop->wsFlags & WHERE_IN_SEEKSCAN)!=0 && ALWAYS(op==OP_SeekGE) ){ assert( regBignull==0 ); /* TUNING: The OP_SeekScan opcode seeks to reduce the number ** of expensive seek operations by replacing a single seek with From eda790d28b431957fa876cafbe6526c7b128e114 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Jun 2021 17:14:50 +0000 Subject: [PATCH 30/70] Never use WHERE_IN_SEEKSCAN for the 2nd or subsequent IN operator. FossilOrigin-Name: d0b98619082038ed451912bcdf56568835a8577989a25cacf25591f2366d4f52 --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/where.c | 2 +- test/in4.test | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 9732d15ae4..f47789bbee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C This\sis\san\sattempt\sto\saddress\sthe\sOP_SeekScan\sperformance\sissue\sidentified\sby\n[forum:/forumpost/b4fcb8a598|forum\spost\sb4fcb8a598]. -D 2021-06-02T12:44:26.088 +C Never\suse\sWHERE_IN_SEEKSCAN\sfor\sthe\s2nd\sor\ssubsequent\sIN\soperator. +D 2021-06-02T17:14:50.729 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -631,7 +631,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c c8ec20a1ca161d5635a4f19c2a4efec2e006e19a8a61f272bf6bce1c80ab7436 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c 2a6ae34252a15de5e6e1102d037ec899bd22c020d4f3e3df30f7afc1d9d3e349 +F src/where.c fbb2da2b618c4a382a803d2a68795ade50702fa1cc21cd7c5b42f48ce811050a F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c d0963d5a2aaae8c18f459a7e72dc6c7ca897f3a4ddb40fd56a12384b725e9e0a F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 @@ -1074,7 +1074,7 @@ F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 F test/in.test 688ed2011d922d83141a45af431601738674a4c0bdde34b6351f688b82a169b3 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test cd08375ba470b248c3dc4ab30fd5dbcb682deafe3862d8249ba0ad6a11dd25ea +F test/in4.test 3f68dd68bda673e677c561b81e71cc7a42da1f08c3e172cb2ddab6c55f505269 F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f F test/in6.test f5f40d6816a8bb7c784424b58a10ac38efb76ab29127a2c17399e0cbeeda0e4b F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 @@ -1918,10 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a8d921136f8ab132279984a77d0eeaf355342cdb0a98d7e1e59c8e6c8ed9459c -R c9d14953d90f0bc10aff723dd24fc8cd -T *branch * seekscan-improvements -T *sym-seekscan-improvements * -T -sym-trunk * +P d58efb3f21a4150b8136197e43837c7b646c42d492a7c24ddc7591dba415a2c8 +R 8ad2053968a5fcd14ddf59995bbbadeb U drh -Z 37cec0fe3735838a40d15474ed3bffee +Z 725e8b4bd380dc24d27ee8c2d8e9d784 diff --git a/manifest.uuid b/manifest.uuid index 0ba9b1497b..cf28dca327 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d58efb3f21a4150b8136197e43837c7b646c42d492a7c24ddc7591dba415a2c8 \ No newline at end of file +d0b98619082038ed451912bcdf56568835a8577989a25cacf25591f2366d4f52 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 9ccdd7e669..9409495639 100644 --- a/src/where.c +++ b/src/where.c @@ -2627,7 +2627,7 @@ static int whereLoopAddBtreeIndex( ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d) " "prefers indexed lookup\n", saved_nEq, M, logK, nIn, rLogSize, x)); - }else if( x < -nInMul ){ + }else if( nInMul<2 ){ WHERETRACE(0x40, ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d" " nInMul=%d) prefers skip-scan\n", diff --git a/test/in4.test b/test/in4.test index de8c2d6dbc..fb57661208 100644 --- a/test/in4.test +++ b/test/in4.test @@ -392,5 +392,38 @@ do_execsql_test 8.3 { SELECT t1.x FROM t2 CROSS JOIN t1 WHERE t2.z = t1.y AND t1.x IN (111, 222); } {222 111} +# 2021-06-02 forum post https://sqlite.org/forum/forumpost/b4fcb8a598 +# OP_SeekScan changes from check-in 4a43430fd23f8835 on 2020-09-30 causes +# performance regression. +# +reset_db +do_execsql_test 9.0 { + CREATE TABLE node(node_id INTEGER PRIMARY KEY); + CREATE TABLE edge(node_from INT, node_to INT); + CREATE TABLE sub_nodes(node_id INTEGER PRIMARY KEY); + CREATE INDEX edge_from_to ON edge(node_from,node_to); + CREATE INDEX edge_to_from ON edge(node_to,node_from); + ANALYZE; + DELETE FROM sqlite_stat1; + INSERT INTO sqlite_stat1 VALUES + ('sub_nodes',NULL,'1000000'), + ('edge','edge_to_from','20000000 2 2'), + ('edge','edge_from_to','20000000 2 2'), + ('node',NULL,'10000000'); + ANALYZE sqlite_schema; +} {} +do_eqp_test 9.1 { +SELECT count(*) FROM edge + WHERE node_from IN sub_nodes AND node_to IN sub_nodes; +} { + QUERY PLAN + |--SEARCH edge USING COVERING INDEX edge_to_from (node_to=?) + |--USING ROWID SEARCH ON TABLE sub_nodes FOR IN-OPERATOR + `--USING ROWID SEARCH ON TABLE sub_nodes FOR IN-OPERATOR +} +# ^^^^^ the key to the above is that the index should only use a single +# term (node_to=?), not two terms (node_to=? AND node_from=). + + finish_test From e847164f55e9b145e191a79f67b2015b6fd5b43c Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Jun 2021 17:32:51 +0000 Subject: [PATCH 31/70] Tighten assert() restrictions on the OP_SeekScan opcode. FossilOrigin-Name: dbc33d3ae30de5427a4351824a11026145f778fad95bd0b825bd0a4b63059677 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 3 +-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f47789bbee..3e428dc032 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Never\suse\sWHERE_IN_SEEKSCAN\sfor\sthe\s2nd\sor\ssubsequent\sIN\soperator. -D 2021-06-02T17:14:50.729 +C Tighten\sassert()\srestrictions\son\sthe\sOP_SeekScan\sopcode. +D 2021-06-02T17:32:51.158 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 F src/vacuum.c 492422c1463c076473bae1858799c7a0a5fe87a133d1223239447c422cd26286 -F src/vdbe.c 73e5a8b64a77359f4287d76f168e89d12ba967cbb72a3d7619650568e9c1d66c +F src/vdbe.c bcb074ce72ad18723ce01d21d389dac60069270a42fb5e832dc567ccc62b6a13 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 58980223a32495ad059d10581b83e133abdc77248b1bab85c080cab8a13bd819 F src/vdbeapi.c d9e99daf59fec928986838b3389a7337e82fec6b3b5de30206cb99fb4661b94e @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d58efb3f21a4150b8136197e43837c7b646c42d492a7c24ddc7591dba415a2c8 -R 8ad2053968a5fcd14ddf59995bbbadeb +P d0b98619082038ed451912bcdf56568835a8577989a25cacf25591f2366d4f52 +R d26fe6f59a48492df417195f3011ada4 U drh -Z 725e8b4bd380dc24d27ee8c2d8e9d784 +Z ccfc7cbcce94189a4dff82a83cd75efc diff --git a/manifest.uuid b/manifest.uuid index cf28dca327..e10446d57d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d0b98619082038ed451912bcdf56568835a8577989a25cacf25591f2366d4f52 \ No newline at end of file +dbc33d3ae30de5427a4351824a11026145f778fad95bd0b825bd0a4b63059677 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index ad3008669a..55ed75c424 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4471,8 +4471,7 @@ case OP_SeekScan: { /* pOp->p2 points to the first instruction past the OP_IdxGT that ** follows the OP_SeekGE. */ assert( pOp->p2>=(int)(pOp-aOp)+2 ); - assert( aOp[pOp->p2-1].opcode==OP_IdxGT || aOp[pOp->p2-1].opcode==OP_IdxGE ); - testcase( aOp[pOp->p2-1].opcode==OP_IdxGE ); + assert( aOp[pOp->p2-1].opcode==OP_IdxGT ); assert( pOp[1].p1==aOp[pOp->p2-1].p1 ); assert( pOp[1].p2==aOp[pOp->p2-1].p2 ); assert( pOp[1].p3==aOp[pOp->p2-1].p3 ); From 9966439879524118c2aee0a039be4ab539d99497 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Jun 2021 18:50:39 +0000 Subject: [PATCH 32/70] Fix an ALWAYS which can be false. FossilOrigin-Name: a87f8ecd6db11ea40a15314b875fc78289c19ab2dec6f738b4bf37f4aafa7bbd --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 2 +- test/in4.test | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 3e428dc032..5571850e93 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Tighten\sassert()\srestrictions\son\sthe\sOP_SeekScan\sopcode. -D 2021-06-02T17:32:51.158 +C Fix\san\sALWAYS\swhich\scan\sbe\sfalse. +D 2021-06-02T18:50:39.413 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c fbb2da2b618c4a382a803d2a68795ade50702fa1cc21cd7c5b42f48ce811050a F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c d0963d5a2aaae8c18f459a7e72dc6c7ca897f3a4ddb40fd56a12384b725e9e0a +F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 F src/window.c a6d624d83b2d5b3cfb82bb437a2fbae759c928d47dc9ad1338a9419269181bb2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1074,7 +1074,7 @@ F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 F test/in.test 688ed2011d922d83141a45af431601738674a4c0bdde34b6351f688b82a169b3 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test 3f68dd68bda673e677c561b81e71cc7a42da1f08c3e172cb2ddab6c55f505269 +F test/in4.test 3ce7e79419bcd7942744bee2394f125b45513186819ffe771c78d04caa547d54 F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f F test/in6.test f5f40d6816a8bb7c784424b58a10ac38efb76ab29127a2c17399e0cbeeda0e4b F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d0b98619082038ed451912bcdf56568835a8577989a25cacf25591f2366d4f52 -R d26fe6f59a48492df417195f3011ada4 +P dbc33d3ae30de5427a4351824a11026145f778fad95bd0b825bd0a4b63059677 +R f9344dd18f4fb48d394c285c581c4451 U drh -Z ccfc7cbcce94189a4dff82a83cd75efc +Z dd1ede918ea9d283fd53a1c6a619c45c diff --git a/manifest.uuid b/manifest.uuid index e10446d57d..c71794e142 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dbc33d3ae30de5427a4351824a11026145f778fad95bd0b825bd0a4b63059677 \ No newline at end of file +a87f8ecd6db11ea40a15314b875fc78289c19ab2dec6f738b4bf37f4aafa7bbd \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 42315e59a0..84fa1a1410 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1827,7 +1827,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; assert( op!=0 ); - if( (pLoop->wsFlags & WHERE_IN_SEEKSCAN)!=0 && ALWAYS(op==OP_SeekGE) ){ + if( (pLoop->wsFlags & WHERE_IN_SEEKSCAN)!=0 && op==OP_SeekGE ){ assert( regBignull==0 ); /* TUNING: The OP_SeekScan opcode seeks to reduce the number ** of expensive seek operations by replacing a single seek with diff --git a/test/in4.test b/test/in4.test index fb57661208..12b306b644 100644 --- a/test/in4.test +++ b/test/in4.test @@ -424,6 +424,22 @@ SELECT count(*) FROM edge # ^^^^^ the key to the above is that the index should only use a single # term (node_to=?), not two terms (node_to=? AND node_from=). +# dbsqlfuzz case +# +reset_db +do_execsql_test 10.0 { + CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,b,c)) WITHOUT ROWID; + INSERT INTO t1(a,b,c,d) VALUES + (0,-2,2,3), + (0,2,3,4), + (0,5,8,10), + (1,7,11,13); + ANALYZE sqlite_schema; + INSERT INTO sqlite_stat1 VALUES('t1','t1','10 3 2 1'); + ANALYZE sqlite_schema; + PRAGMA reverse_unordered_selects(1); + SELECT d FROM t1 WHERE 0=a AND b IN (-17,-4,-3,1,5,25,7798); +} {10} finish_test From 3074faabedd39e0efd8d3b2c282d1b6043c96b67 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Jun 2021 19:28:07 +0000 Subject: [PATCH 33/70] Add an optimization control bit to disable the OP_SeekScan optimization. FossilOrigin-Name: f674c41e5cbbb08ffc3cc00ab449229b672054c872e209337f12e7eacb531fe5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqliteInt.h | 1 + src/where.c | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5571850e93..d457afdd8a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sALWAYS\swhich\scan\sbe\sfalse. -D 2021-06-02T18:50:39.413 +C Add\san\soptimization\scontrol\sbit\sto\sdisable\sthe\sOP_SeekScan\soptimization. +D 2021-06-02T19:28:07.128 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/shell.c.in 2a2b06d463933ee3a5bb0242d5d2200ca36769493fd6f4d939a0574113f3d6d F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e -F src/sqliteInt.h 6d0c49ed218f9f6ffabfdc8bed1a5de89f61e70c96a62156aeebeb20c1be9bf0 +F src/sqliteInt.h de7cf989dad75a3287a8b486083b21149bdead3669794b5a9c7e331668443ae1 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -631,7 +631,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c c8ec20a1ca161d5635a4f19c2a4efec2e006e19a8a61f272bf6bce1c80ab7436 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c fbb2da2b618c4a382a803d2a68795ade50702fa1cc21cd7c5b42f48ce811050a +F src/where.c dc062832c30aa6c5f17805c1235b2b621cd9db506412d5d3ef0799d26ae3396f F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P dbc33d3ae30de5427a4351824a11026145f778fad95bd0b825bd0a4b63059677 -R f9344dd18f4fb48d394c285c581c4451 +P a87f8ecd6db11ea40a15314b875fc78289c19ab2dec6f738b4bf37f4aafa7bbd +R 0673ef2c1144007e5dc9919859a8d932 U drh -Z dd1ede918ea9d283fd53a1c6a619c45c +Z e77ba6d1357c1434f617cbb216a877e4 diff --git a/manifest.uuid b/manifest.uuid index c71794e142..c542abada0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a87f8ecd6db11ea40a15314b875fc78289c19ab2dec6f738b4bf37f4aafa7bbd \ No newline at end of file +f674c41e5cbbb08ffc3cc00ab449229b672054c872e209337f12e7eacb531fe5 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 6fa33ea55e..1ada072ebb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1731,6 +1731,7 @@ struct sqlite3 { #define SQLITE_SkipScan 0x00004000 /* Skip-scans */ #define SQLITE_PropagateConst 0x00008000 /* The constant propagation opt */ #define SQLITE_MinMaxOpt 0x00010000 /* The min/max optimization */ +#define SQLITE_SeekScan 0x00020000 /* The OP_SeekScan optimization */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* diff --git a/src/where.c b/src/where.c index 9409495639..bfff5a39f4 100644 --- a/src/where.c +++ b/src/where.c @@ -2627,7 +2627,7 @@ static int whereLoopAddBtreeIndex( ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d) " "prefers indexed lookup\n", saved_nEq, M, logK, nIn, rLogSize, x)); - }else if( nInMul<2 ){ + }else if( nInMul<2 && OptimizationEnabled(db, SQLITE_SeekScan) ){ WHERETRACE(0x40, ("IN operator (N=%d M=%d logK=%d nIn=%d rLogSize=%d x=%d" " nInMul=%d) prefers skip-scan\n", From 75f7317722c3e41b61291db992b6527b4a756011 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 3 Jun 2021 12:31:08 +0000 Subject: [PATCH 34/70] Fix the case-insensitive version of the regexp() function so that it does not use the prefix optimization incorrectly. [forum:/forumpost/983b43ef8e|Forum post 983b43ef8e]. FossilOrigin-Name: 1a8e43cc1b7969c40140dd7fd481d5ffd9de80e214eb494567c286d93a2b06e5 --- ext/misc/regexp.c | 10 ++++++++-- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/regexp1.test | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index 03bbeb97d3..204489f588 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -673,7 +673,7 @@ static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){ ** regex engine over the string. Do not worry able trying to match ** unicode characters beyond plane 0 - those are very rare and this is ** just an optimization. */ - if( pRe->aOp[0]==RE_OP_ANYSTAR ){ + if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){ for(j=0, i=1; jzInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){ unsigned x = pRe->aArg[i]; if( x<=127 ){ @@ -719,7 +719,7 @@ static void re_sql_func( if( pRe==0 ){ zPattern = (const char*)sqlite3_value_text(argv[0]); if( zPattern==0 ) return; - zErr = re_compile(&pRe, zPattern, 0); + zErr = re_compile(&pRe, zPattern, sqlite3_user_data(context)!=0); if( zErr ){ re_free(pRe); sqlite3_result_error(context, zErr, -1); @@ -756,5 +756,11 @@ int sqlite3_regexp_init( SQLITE_EXTENSION_INIT2(pApi); rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8|SQLITE_INNOCUOUS, 0, re_sql_func, 0, 0); + if( rc==SQLITE_OK ){ + /* The regexpi(PATTERN,STRING) function is a case-insensitive version + ** of regexp(PATTERN,STRING). */ + rc = sqlite3_create_function(db, "regexpi", 2, SQLITE_UTF8|SQLITE_INNOCUOUS, + (void*)db, re_sql_func, 0, 0); + } return rc; } diff --git a/manifest b/manifest index ddc20c9616..f67ad18f92 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sissue\sin\s'mkopcodeh.tcl'\stool\sthat\sprevented\sits\stermination\sin\srare\scircumstances. -D 2021-06-01T21:07:49.044 +C Fix\sthe\scase-insensitive\sversion\sof\sthe\sregexp()\sfunction\sso\sthat\sit\sdoes\snot\nuse\sthe\sprefix\soptimization\sincorrectly.\n[forum:/forumpost/983b43ef8e|Forum\spost\s983b43ef8e]. +D 2021-06-03T12:31:08.225 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -315,7 +315,7 @@ F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1 F ext/misc/normalize.c bd84355c118e297522aba74de34a4fd286fc775524e0499b14473918d09ea61f F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c 246244c714267f303df76acf73dcf110cf2eaf076896aaaba8db6d6d21a129db +F ext/misc/regexp.c 1b9aa91151488ef5f2662449ed6e1896343f091807db739ac797a49cb2f21008 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 @@ -1292,7 +1292,7 @@ F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79070d -F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 +F test/regexp1.test 4fc575bff1440be924dbaeb0e70eb7337f6faa7cb070a221728cde650d38bc17 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d F test/releasetest.tcl 6f803ef0b896f8f3f4c26eb072c0399963a5987a509a64d45f5dfbc1ebae2951 x @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 587a3044468a40707c714d013cb766d8a4d9eb13bb20871846a0e8c34bea8cf4 -R 28996daffb0e59933544ba8f6a6b21ff -U mistachkin -Z 45822110f0419a0d61a2348a085e7f10 +P a8d921136f8ab132279984a77d0eeaf355342cdb0a98d7e1e59c8e6c8ed9459c +R c772ab7c0e1999965225c8ce74b7eb89 +U drh +Z 45c3bbe3107718f1b66f375ef1e2b5b3 diff --git a/manifest.uuid b/manifest.uuid index 4fa1d90d6b..328c610b61 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a8d921136f8ab132279984a77d0eeaf355342cdb0a98d7e1e59c8e6c8ed9459c \ No newline at end of file +1a8e43cc1b7969c40140dd7fd481d5ffd9de80e214eb494567c286d93a2b06e5 \ No newline at end of file diff --git a/test/regexp1.test b/test/regexp1.test index 0e63cd98c8..3672b675ff 100644 --- a/test/regexp1.test +++ b/test/regexp1.test @@ -28,18 +28,46 @@ do_test regexp1-1.1 { } } {1 3} +do_execsql_test regexp1-1.1.2 { + SELECT regexpi('abc','ABC'); +} {1} +do_execsql_test regexp1-1.1.3 { + SELECT regexpi('ABC','ABC'); +} {1} +do_execsql_test regexp1-1.1.4 { + SELECT regexpi('ABC','abc'); +} {1} + do_execsql_test regexp1-1.2 { SELECT x FROM t1 WHERE y REGEXP 'by|in' ORDER BY x; } {1 2 3 4} -do_execsql_test regexp1-1.3 { +do_execsql_test regexp1-1.3.1 { SELECT x FROM t1 WHERE y REGEXP 'by|Christ' ORDER BY x; } {1 2 4} +do_execsql_test regexp1-1.3.2 { + SELECT x FROM t1 WHERE regexp('by|christ',y) ORDER BY x; +} {1 2} +do_execsql_test regexp1-1.3.3 { + SELECT x FROM t1 WHERE regexpi('by|christ',y) ORDER BY x; +} {1 2 4} +do_execsql_test regexp1-1.3.4 { + SELECT x FROM t1 WHERE regexpi('BY|CHRIST',y) ORDER BY x; +} {1 2 4} do_execsql_test regexp1-1.4 { SELECT x FROM t1 WHERE y REGEXP 'shal+ al+' ORDER BY x; } {4} -do_execsql_test regexp1-1.5 { +do_execsql_test regexp1-1.5.1 { SELECT x FROM t1 WHERE y REGEXP 'shall x*y*z*all' ORDER BY x; } {4} +do_execsql_test regexp1-1.5.2 { + SELECT x FROM t1 WHERE regexp('shall x*y*z*all',y) ORDER BY x; +} {4} +do_execsql_test regexp1-1.5.3 { + SELECT x FROM t1 WHERE regexp('SHALL x*y*z*all',y) ORDER BY x; +} {} +do_execsql_test regexp1-1.5.4 { + SELECT x FROM t1 WHERE regexpi('SHALL x*y*z*all',y) ORDER BY x; +} {4} do_execsql_test regexp1-1.6 { SELECT x FROM t1 WHERE y REGEXP 'shallx?y? ?z?all' ORDER BY x; } {4} From de30a3d2e1101741d1f656458ca6d7378e0a0aa5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 3 Jun 2021 13:44:19 +0000 Subject: [PATCH 35/70] Fix a bug in the regexp extension in which the "." wildcard would match the 0x00 terminator at the end of the comparison string. FossilOrigin-Name: fa23108b299fc70e80540c449500e50ac6344a152f4f6b9c1b1f568bbda8f6e1 --- ext/misc/regexp.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- test/regexp1.test | 3 +++ 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index 204489f588..09ac9c5023 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -248,7 +248,7 @@ static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ break; } case RE_OP_ANY: { - re_add_state(pNext, x+1); + if( c!=0 ) re_add_state(pNext, x+1); break; } case RE_OP_WORD: { diff --git a/manifest b/manifest index f67ad18f92..d0cbbf1ca8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\scase-insensitive\sversion\sof\sthe\sregexp()\sfunction\sso\sthat\sit\sdoes\snot\nuse\sthe\sprefix\soptimization\sincorrectly.\n[forum:/forumpost/983b43ef8e|Forum\spost\s983b43ef8e]. -D 2021-06-03T12:31:08.225 +C Fix\sa\sbug\sin\sthe\sregexp\sextension\sin\swhich\sthe\s"."\swildcard\swould\smatch\nthe\s0x00\sterminator\sat\sthe\send\sof\sthe\scomparison\sstring. +D 2021-06-03T13:44:19.048 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -315,7 +315,7 @@ F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1 F ext/misc/normalize.c bd84355c118e297522aba74de34a4fd286fc775524e0499b14473918d09ea61f F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c 1b9aa91151488ef5f2662449ed6e1896343f091807db739ac797a49cb2f21008 +F ext/misc/regexp.c bc97bedcb504f6e885cc21f32e03302696c0498876ac10be0857dbeef534353f F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 @@ -1292,7 +1292,7 @@ F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79070d -F test/regexp1.test 4fc575bff1440be924dbaeb0e70eb7337f6faa7cb070a221728cde650d38bc17 +F test/regexp1.test 0c3ff80f66b0eff80e623eb5db7a3dad512095c573d78ac23009785f6d8f51ce F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d F test/releasetest.tcl 6f803ef0b896f8f3f4c26eb072c0399963a5987a509a64d45f5dfbc1ebae2951 x @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a8d921136f8ab132279984a77d0eeaf355342cdb0a98d7e1e59c8e6c8ed9459c -R c772ab7c0e1999965225c8ce74b7eb89 +P 1a8e43cc1b7969c40140dd7fd481d5ffd9de80e214eb494567c286d93a2b06e5 +R d7c85c11bdc28911b881e7d6006294f2 U drh -Z 45c3bbe3107718f1b66f375ef1e2b5b3 +Z dc5a449eaeacd8e519ce2e5a9848e34f diff --git a/manifest.uuid b/manifest.uuid index 328c610b61..a624686dd8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1a8e43cc1b7969c40140dd7fd481d5ffd9de80e214eb494567c286d93a2b06e5 \ No newline at end of file +fa23108b299fc70e80540c449500e50ac6344a152f4f6b9c1b1f568bbda8f6e1 \ No newline at end of file diff --git a/test/regexp1.test b/test/regexp1.test index 3672b675ff..1eb56c672c 100644 --- a/test/regexp1.test +++ b/test/regexp1.test @@ -37,6 +37,9 @@ do_execsql_test regexp1-1.1.3 { do_execsql_test regexp1-1.1.4 { SELECT regexpi('ABC','abc'); } {1} +do_execsql_test regexp1-1.1.5 { + SELECT regexpi('ABC.','ABC'); +} {0} do_execsql_test regexp1-1.2 { SELECT x FROM t1 WHERE y REGEXP 'by|in' ORDER BY x; From 6468990e7bf81db203a1d6abbf9ab806880fc750 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 3 Jun 2021 13:51:31 +0000 Subject: [PATCH 36/70] Add the regexp() and regexpi() extension functions to the CLI. FossilOrigin-Name: 5d4535bfb603d7c8229ef60f99666459f2997e02e186bc1e52b7ec1320251d67 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d0cbbf1ca8..874a463b7a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\sin\sthe\sregexp\sextension\sin\swhich\sthe\s"."\swildcard\swould\smatch\nthe\s0x00\sterminator\sat\sthe\send\sof\sthe\scomparison\sstring. -D 2021-06-03T13:44:19.048 +C Add\sthe\sregexp()\sand\sregexpi()\sextension\sfunctions\sto\sthe\sCLI. +D 2021-06-03T13:51:31.070 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 2f4429e0b0ca031e360489c45dca5dfa06cd85480e12c0d1360b91e1c8e7f7a2 -F src/shell.c.in 2a2b06d463933ee3a5bb0242d5d2200ca36769493fd6f4d939a0574113f3d6d8 +F src/shell.c.in ab37c8869390a7624e594cb1459277319d16521d4644c42f4ee6a3866cf5f0cd F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1a8e43cc1b7969c40140dd7fd481d5ffd9de80e214eb494567c286d93a2b06e5 -R d7c85c11bdc28911b881e7d6006294f2 +P fa23108b299fc70e80540c449500e50ac6344a152f4f6b9c1b1f568bbda8f6e1 +R 10e18e5c8351d48b79324cb92f1ac65f U drh -Z dc5a449eaeacd8e519ce2e5a9848e34f +Z 8ae1da0c921582126dbed75196d61b62 diff --git a/manifest.uuid b/manifest.uuid index a624686dd8..846f991b30 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa23108b299fc70e80540c449500e50ac6344a152f4f6b9c1b1f568bbda8f6e1 \ No newline at end of file +5d4535bfb603d7c8229ef60f99666459f2997e02e186bc1e52b7ec1320251d67 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 517e12cb5a..4e23ad84e3 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1027,6 +1027,7 @@ INCLUDE ../ext/misc/uint.c INCLUDE ../ext/misc/decimal.c INCLUDE ../ext/misc/ieee754.c INCLUDE ../ext/misc/series.c +INCLUDE ../ext/misc/regexp.c #ifdef SQLITE_HAVE_ZLIB INCLUDE ../ext/misc/zipfile.c INCLUDE ../ext/misc/sqlar.c @@ -4615,6 +4616,7 @@ static void open_db(ShellState *p, int openFlags){ sqlite3_completion_init(p->db, 0, 0); sqlite3_uint_init(p->db, 0, 0); sqlite3_decimal_init(p->db, 0, 0); + sqlite3_regexp_init(p->db, 0, 0); sqlite3_ieee_init(p->db, 0, 0); sqlite3_series_init(p->db, 0, 0); #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) From a6df0e693f0362c7f2b33d91ffa29770ae98b1ef Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 3 Jun 2021 18:51:51 +0000 Subject: [PATCH 37/70] Fix the truncate optimization so that PRAGMA count_changes and changes() return correct values even for a WITHOUT ROWID table. [forum:/forumpost/07dedbf9a1|Forum post 07dedbf9a1]. FossilOrigin-Name: 820ae3b117c2d8c117c0c5a4e440a7d06886772516c7fc0a84606388f91be195 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/btree.c | 9 ++++----- src/delete.c | 3 +++ src/vdbe.c | 13 +++++-------- test/delete.test | 2 +- test/delete4.test | 12 ++++++++++-- 7 files changed, 34 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index 874a463b7a..a320c5acd6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sregexp()\sand\sregexpi()\sextension\sfunctions\sto\sthe\sCLI. -D 2021-06-03T13:51:31.070 +C Fix\sthe\struncate\soptimization\sso\sthat\sPRAGMA\scount_changes\sand\schanges()\nreturn\scorrect\svalues\seven\sfor\sa\sWITHOUT\sROWID\stable.\n[forum:/forumpost/07dedbf9a1|Forum\spost\s07dedbf9a1]. +D 2021-06-03T18:51:51.135 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 51ba86095316fceb3e25bc61617d673d84627e79f4ace83f8722910f33eedef3 +F src/btree.c 6b24d93490ea4450a6800eef046fedf29e5e5ba00efc896eef2da5bb2869ea2e F src/btree.h 096cc53baa58be22b02c896d1cf933c38cfc6d65f9253c1367ece8cc88a24de5 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c d766f04ddd88822c2c10cf3c0dfb34b068c45f103f442222038b9eeff02312ca @@ -495,7 +495,7 @@ F src/ctime.c 3052b6b05ed9ef547a3dd66b8e01bfa9d582e78752ad6ed327da84652641e038 F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c -F src/delete.c 73f57a9a183532c344a3135cf8f2a5589376e39183e0b5f562d6b61b2af0f4d8 +F src/delete.c 930e63df768dcb197242b1efa0ed9fcdcc9a7b7556c236ee01a9959b61cf527b F src/expr.c 09f8ae1421d09802b4ac4b05c507761ecd142fa32cc0b1e33b9bd07fba10d34a F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 @@ -616,7 +616,7 @@ F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 F src/vacuum.c 492422c1463c076473bae1858799c7a0a5fe87a133d1223239447c422cd26286 -F src/vdbe.c 73e5a8b64a77359f4287d76f168e89d12ba967cbb72a3d7619650568e9c1d66c +F src/vdbe.c c42799bcd6cbeaf33a1767dde3ba926370afec4f82ba7ca92327a099251f62ec F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 58980223a32495ad059d10581b83e133abdc77248b1bab85c080cab8a13bd819 F src/vdbeapi.c d9e99daf59fec928986838b3389a7337e82fec6b3b5de30206cb99fb4661b94e @@ -836,10 +836,10 @@ F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef F test/decimal.test fcf403fd5585f47342234e153c4a4338cd737b8e0884ac66fc484df47dbcf1a7 F test/default.test 9687cfb16717e4b8238c191697c98be88c0b16e568dd5368cd9284154097ef50 -F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0 +F test/delete.test 438c14fdf2f2a520b63f892ea645896acf8832e2a2308578593d8e05274314b1 F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab -F test/delete4.test 6aa279f459f4aa792cc251435c3809415c1ecaf9f27dce91675e26f05b503db3 +F test/delete4.test 51fafebe9503a40796d1aae1565c60524cada720e50eecac01b7fd0419d9ea0b F test/delete_db.test 096d828493c7907f9ea11a7098ea6a0f73edba89406487d5d6cc2228dc4ab8b0 F test/descidx1.test edc8adee58d491b06c7157c50364eaf1c3605c9c19f8093cb1ea2b6184f3ac13 F test/descidx2.test a0ba347037ff3b811f4c6ceca5fd0f9d5d72e74e59f2d9de346a9d2f6ad78298 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fa23108b299fc70e80540c449500e50ac6344a152f4f6b9c1b1f568bbda8f6e1 -R 10e18e5c8351d48b79324cb92f1ac65f +P 5d4535bfb603d7c8229ef60f99666459f2997e02e186bc1e52b7ec1320251d67 +R 44321a6657926f9575a85818259f7e27 U drh -Z 8ae1da0c921582126dbed75196d61b62 +Z 587f0cd29c08ce7be2dd885b5d005a8e diff --git a/manifest.uuid b/manifest.uuid index 846f991b30..3e93a1a213 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d4535bfb603d7c8229ef60f99666459f2997e02e186bc1e52b7ec1320251d67 \ No newline at end of file +820ae3b117c2d8c117c0c5a4e440a7d06886772516c7fc0a84606388f91be195 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 300bb361e0..371f8d15c1 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9494,8 +9494,8 @@ static int clearDatabasePage( if( !pPage->leaf ){ rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange); if( rc ) goto cleardatabasepage_out; - }else if( pnChange ){ - assert( pPage->intKey || CORRUPT_DB ); + } + if( pnChange ){ testcase( !pPage->intKey ); *pnChange += pPage->nCell; } @@ -9520,9 +9520,8 @@ cleardatabasepage_out: ** read cursors on the table. Open write cursors are moved to the ** root of the table. ** -** If pnChange is not NULL, then table iTable must be an intkey table. The -** integer value pointed to by pnChange is incremented by the number of -** entries in the table. +** If pnChange is not NULL, then the integer value pointed to by pnChange +** is incremented by the number of entries in the table. */ int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){ int rc; diff --git a/src/delete.c b/src/delete.c index 0c9c7bc8d0..0a3b2dc16f 100644 --- a/src/delete.c +++ b/src/delete.c @@ -428,6 +428,9 @@ void sqlite3DeleteFrom( for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ assert( pIdx->pSchema==pTab->pSchema ); sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb); + if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ + sqlite3VdbeChangeP3(v, -1, memCnt ? memCnt : -1); + } } }else #endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */ diff --git a/src/vdbe.c b/src/vdbe.c index ad3008669a..f9be7893c5 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -6242,11 +6242,10 @@ case OP_Destroy: { /* out2 */ ** P2==1 then the table to be clear is in the auxiliary database file ** that is used to store tables create using CREATE TEMPORARY TABLE. ** -** If the P3 value is non-zero, then the table referred to must be an -** intkey table (an SQL table, not an index). In this case the row change -** count is incremented by the number of rows in the table being cleared. -** If P3 is greater than zero, then the value stored in register P3 is -** also incremented by the number of rows in the table being cleared. +** If the P3 value is non-zero, then the row change count is incremented +** by the number of rows in the table being cleared. If P3 is greater +** than zero, then the value stored in register P3 is also incremented +** by the number of rows in the table being cleared. ** ** See also: Destroy */ @@ -6257,9 +6256,7 @@ case OP_Clear: { nChange = 0; assert( p->readOnly==0 ); assert( DbMaskTest(p->btreeMask, pOp->p2) ); - rc = sqlite3BtreeClearTable( - db->aDb[pOp->p2].pBt, (u32)pOp->p1, (pOp->p3 ? &nChange : 0) - ); + rc = sqlite3BtreeClearTable(db->aDb[pOp->p2].pBt, (u32)pOp->p1, &nChange); if( pOp->p3 ){ p->nChange += nChange; if( pOp->p3>0 ){ diff --git a/test/delete.test b/test/delete.test index a448e52dd2..c15ac53c63 100644 --- a/test/delete.test +++ b/test/delete.test @@ -100,7 +100,7 @@ do_test delete-5.2.1 { } {200} do_test delete-5.2.2 { execsql {DELETE FROM table1} -} {200} +} {202} do_test delete-5.2.3 { execsql {BEGIN TRANSACTION} for {set i 1} {$i<=200} {incr i} { diff --git a/test/delete4.test b/test/delete4.test index f64778a167..8d6a1b8c7c 100644 --- a/test/delete4.test +++ b/test/delete4.test @@ -59,14 +59,22 @@ do_execsql_test 2.3 { #------------------------------------------------------------------------- # reset_db -do_execsql_test 3.1 { +do_execsql_test 3.0.1 { CREATE TABLE t1(a, b, PRIMARY KEY(a, b)) WITHOUT ROWID; INSERT INTO t1 VALUES(1, 2); INSERT INTO t1 VALUES(2, 4); INSERT INTO t1 VALUES(1, 5); DELETE FROM t1 WHERE a=1; + SELECT printf('(%d)',changes()); SELECT * FROM t1; -} {2 4} +} {(2) 2 4} +do_execsql_test 3.0.2 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) + INSERT INTO t1(a,b) SELECT x, x+1 FROM c; + SELECT printf('(%d)',changes()); + DELETE FROM t1; + SELECT printf('(%d)',changes()); +} {(100) (101)} #------------------------------------------------------------------------- # DELETE statement that uses the OR optimization From 19e4eefbca892a68a74407cfe40fb8d0f8435a6d Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 3 Jun 2021 18:56:42 +0000 Subject: [PATCH 38/70] Fix a case where combining row-value UPDATE FROM syntax with window functions over aggregates can cause an error. FossilOrigin-Name: 4a587c3492faa99490fd67ca1de9fceafcdc12d220f42817791923be258b73f1 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 1 + test/rowvalue.test | 31 +++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a320c5acd6..a57f79dc4d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\struncate\soptimization\sso\sthat\sPRAGMA\scount_changes\sand\schanges()\nreturn\scorrect\svalues\seven\sfor\sa\sWITHOUT\sROWID\stable.\n[forum:/forumpost/07dedbf9a1|Forum\spost\s07dedbf9a1]. -D 2021-06-03T18:51:51.135 +C Fix\sa\scase\swhere\scombining\srow-value\sUPDATE\sFROM\ssyntax\swith\swindow\sfunctions\sover\saggregates\scan\scause\san\serror. +D 2021-06-03T18:56:42.861 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 930e63df768dcb197242b1efa0ed9fcdcc9a7b7556c236ee01a9959b61cf527b -F src/expr.c 09f8ae1421d09802b4ac4b05c507761ecd142fa32cc0b1e33b9bd07fba10d34a +F src/expr.c f175b34cc0da572f899bb6591fd3510b17200702dce7d80226cd4e454f7cd83a F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c 88fd711754a7241cb9f8eb1391370fd0c0cea756b3358efa274c5d1efd59af93 @@ -1307,7 +1307,7 @@ F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test 466efbb7bb93ca9f95d89f69c7c140aa52cc57ac6dfa7efba09ea4a9ab3cd9f0 +F test/rowvalue.test 37effea4dd83555ea969a9461dfcffb25e6731a5db7c388e232410999c100853 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 441e7e366ac6d939a3a95a574031c56ec2a854077a91d66eee5ff1d86cb5be58 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5d4535bfb603d7c8229ef60f99666459f2997e02e186bc1e52b7ec1320251d67 -R 44321a6657926f9575a85818259f7e27 -U drh -Z 587f0cd29c08ce7be2dd885b5d005a8e +P 820ae3b117c2d8c117c0c5a4e440a7d06886772516c7fc0a84606388f91be195 +R 3fd4ec14904b0e03c6d406344d944d84 +U dan +Z f80d5b48e051c51974d8a351a0138ba6 diff --git a/manifest.uuid b/manifest.uuid index 3e93a1a213..f4119a266a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -820ae3b117c2d8c117c0c5a4e440a7d06886772516c7fc0a84606388f91be195 \ No newline at end of file +4a587c3492faa99490fd67ca1de9fceafcdc12d220f42817791923be258b73f1 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 77f049ab04..ad0fd96339 100644 --- a/src/expr.c +++ b/src/expr.c @@ -6005,6 +6005,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ */ struct AggInfo_func *pItem = pAggInfo->aFunc; for(i=0; inFunc; i++, pItem++){ + if( pItem->pFExpr==pExpr ) break; if( sqlite3ExprCompare(0, pItem->pFExpr, pExpr, -1)==0 ){ break; } diff --git a/test/rowvalue.test b/test/rowvalue.test index 79cde62762..c92d344821 100644 --- a/test/rowvalue.test +++ b/test/rowvalue.test @@ -663,4 +663,35 @@ do_catchsql_test 29.1 { SELECT (SELECT 1 WHERE ((SELECT 1 WHERE (2,(2,0)) IS (2,(20))),(2,0)) IS (2,(20))) WHERE (2,(2,0)) IS (2 IN(SELECT 1 WHERE (2,(2,2,0)) IS (2,(20))),(20)); } {1 {row value misused}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 30.0 { + CREATE TABLE t1(x, y, z); + CREATE TABLE t2(a, b); + + INSERT INTO t1 VALUES(1000, 2000, 3000); + INSERT INTO t2 VALUES(NULL, NULL); +} + +do_execsql_test 30.1 { + UPDATE t2 SET (a,b)=( + SELECT max( t1.x ) OVER( PARTITION BY sum( (SELECT t1.y) ) ), 2 + ) + FROM t1; +} {} + +do_execsql_test 30.2 { + SELECT * FROM t2 +} {1000 2} + +reset_db +do_execsql_test 30.3 { + CREATE TABLE t1(x INT PRIMARY KEY, y, z); + CREATE TABLE t2(a,b,c,d,e,PRIMARY KEY(a,b))WITHOUT ROWID; + + UPDATE t2 SET (d,d,a)=(SELECT EXISTS(SELECT 1 IN(SELECT max( 1 IN(SELECT x ORDER BY 1)) OVER(PARTITION BY sum((SELECT y FROM t1 UNION SELECT x ORDER BY 1)))INTERSECT SELECT EXISTS(SELECT 1 FROM t1 UNION SELECT x ORDER BY 1) ORDER BY 1) ORDERa)|9 AS blob, 2, 3) FROM t1 WHERE x Date: Fri, 4 Jun 2021 13:16:46 +0000 Subject: [PATCH 39/70] Add support for SQLITE_TESTCTRL_TUNE and the ".testctrl tune ID VALUE" command in the CLI. FossilOrigin-Name: f1199d58b9cfdcddb83bc35544ce38299ac4ed50d7ab90d33463f6ccce526feb --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/main.c | 23 +++++++++++++++++++++++ src/shell.c.in | 16 +++++++++++++++- src/sqlite.h.in | 3 ++- src/sqliteInt.h | 18 ++++++++++++++++++ 6 files changed, 68 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 5aab8fbf36..4df6ed003c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\srecent\strunk\senchancements\sinto\sthe\sseekscan-improvements\sbranch. -D 2021-06-04T12:29:22.099 +C Add\ssupport\sfor\sSQLITE_TESTCTRL_TUNE\sand\sthe\s".testctrl\stune\sID\sVALUE"\scommand\nin\sthe\sCLI. +D 2021-06-04T13:16:46.112 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -508,7 +508,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2189e0e596010a0dc5405d9f14f78db1ee2fa71138c931f5b6ea96610b95bfc1 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 8c9c8cd2bd8eecdb06d9b6e89de7e9e65bae45cc8fc33609cc74023a5c296067 -F src/main.c 2b2044221a10e7c5f49a98f50563ce9a944511241ba5946d1754dcc2a7437a07 +F src/main.c 3d9a09ebfcf5e1fa704afa3a1e957bc13b03c994c346bcec8c6b6ae5d5277caf F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -545,11 +545,11 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 2f4429e0b0ca031e360489c45dca5dfa06cd85480e12c0d1360b91e1c8e7f7a2 -F src/shell.c.in ab37c8869390a7624e594cb1459277319d16521d4644c42f4ee6a3866cf5f0cd -F src/sqlite.h.in 5c950066775ca9efdaa49077c05d38d0bef6418f3bd07d2dce0210f1d2f3c326 +F src/shell.c.in d10dd74a98c7d360ae3a2dffe867540648809581f3575fa3970d9c994814ebe6 +F src/sqlite.h.in 7f184776cfd85900905420ea3c62e44929ba348ddc015bc5933835ee0529188e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e -F src/sqliteInt.h de7cf989dad75a3287a8b486083b21149bdead3669794b5a9c7e331668443ae1 +F src/sqliteInt.h 96c6caf72c227310dcf401488c2227d7f5586453bc95372fa822fb10c810822f F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f674c41e5cbbb08ffc3cc00ab449229b672054c872e209337f12e7eacb531fe5 4a587c3492faa99490fd67ca1de9fceafcdc12d220f42817791923be258b73f1 -R e31162f50a8fe0f7f09f83d8467f9ef2 +P d9e85fe80cdd3d798a583a5f99148235d0c3f39adfabbc661615893c387e6e45 +R 6791cad4e90a4fac84f0f4c8722de676 U drh -Z f3a9a5e483214de7c18a55211d90eb86 +Z 52da6a38608d38de5f10fc4c527493c0 diff --git a/manifest.uuid b/manifest.uuid index 9b65ccd604..64285d1936 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d9e85fe80cdd3d798a583a5f99148235d0c3f39adfabbc661615893c387e6e45 \ No newline at end of file +f1199d58b9cfdcddb83bc35544ce38299ac4ed50d7ab90d33463f6ccce526feb \ No newline at end of file diff --git a/src/main.c b/src/main.c index bd92f7661a..5d50a1681b 100644 --- a/src/main.c +++ b/src/main.c @@ -4283,6 +4283,29 @@ int sqlite3_test_control(int op, ...){ } break; } + +#ifdef SQLITE_DEBUG + /* sqlite3_test_control(SQLITE_TESTCTRL_TUNE, id, val) + ** + ** "id" must be an integer between 0 and SQLITE_NTUNE-1. "val" + ** is a 64-bit signed integer. This test-control sets tuning parameter + ** id to the value val. + ** + ** Tuning parameters are for use during transient development builds, + ** to help find the best values for constants in the query planner. + ** Access tuning parameters using the Tuning(ID) macro. Set the + ** parameters in the CLI using ".testctrl tune ID VALUE". + ** + ** Transient use only. Tuning parameters should not be used in + ** checked-in code. + */ + case SQLITE_TESTCTRL_TUNE: { + int id = va_arg(ap, int); + int val = va_arg(ap, sqlite3_int64); + if( id>=0 && idout); isOk = 3; } + break; + } +#endif +#ifdef SQLITE_DEBUG + case SQLITE_TESTCTRL_TUNE: { + if( nArg==4 ){ + int id = (int)integerValue(azArg[2]); + i64 val = integerValue(azArg[3]); + rc2 = sqlite3_test_control(testctrl, id, val); + isOk = 3; + } + break; + } #endif } } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index ef452e3244..92ea416111 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -7811,7 +7811,8 @@ int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS 29 #define SQLITE_TESTCTRL_SEEK_COUNT 30 #define SQLITE_TESTCTRL_TRACEFLAGS 31 -#define SQLITE_TESTCTRL_LAST 31 /* Largest TESTCTRL */ +#define SQLITE_TESTCTRL_TUNE 32 +#define SQLITE_TESTCTRL_LAST 32 /* Largest TESTCTRL */ /* ** CAPI3REF: SQL Keyword Checking diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1ada072ebb..112168ed86 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3741,6 +3741,20 @@ typedef struct { #define INITFLAG_AlterRename 0x0001 /* Reparse after a RENAME */ #define INITFLAG_AlterDrop 0x0002 /* Reparse after a DROP COLUMN */ +/* Tuning parameters are set using SQLITE_TESTCTRL_TUNE and are controlled +** on debug-builds of the CLI using ".testctrl tune ID VALUE". Tuning +** parameters are for temporary use during development, to help find +** optimial values for parameters in the query planner. The should not +** be used on trunk check-ins. They are a temporary mechanism available +** for transient development builds only. +*/ +#define SQLITE_NTUNE 6 /* Should be zero for all trunk check-ins */ +#ifdef SQLITE_DEBUG +# define Tuning(X) (sqlite3Config.aTune[X]) +#else +# define Tuning(X) 0 +#endif + /* ** Structure containing global configuration data for the SQLite library. ** @@ -3805,6 +3819,10 @@ struct Sqlite3Config { int iOnceResetThreshold; /* When to reset OP_Once counters */ u32 szSorterRef; /* Min size in bytes to use sorter-refs */ unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ + /* vvvv--- must be last ---vvv */ +#ifdef SQLITE_DEBUG + sqlite3_int64 aTune[SQLITE_NTUNE]; /* Tuning parameters */ +#endif }; /* From 2d26cfcc4adda9d60ccc07488d1c59f1d04e77e7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 4 Jun 2021 13:40:26 +0000 Subject: [PATCH 40/70] Revamp SQLITE_TESTCTRL_TUNE to provide visibility of current turning parameter values. FossilOrigin-Name: 677e645e69e1f06487c26da6671fc03f0fb89a0f8e0d35712e6bdcf7279bdfc4 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/main.c | 19 +++++++++++++------ src/shell.c.in | 20 ++++++++++++++++++-- src/sqliteInt.h | 4 +++- 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 4df6ed003c..090e8d63c0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssupport\sfor\sSQLITE_TESTCTRL_TUNE\sand\sthe\s".testctrl\stune\sID\sVALUE"\scommand\nin\sthe\sCLI. -D 2021-06-04T13:16:46.112 +C Revamp\sSQLITE_TESTCTRL_TUNE\sto\sprovide\svisibility\sof\scurrent\sturning\nparameter\svalues. +D 2021-06-04T13:40:26.168 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -508,7 +508,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2189e0e596010a0dc5405d9f14f78db1ee2fa71138c931f5b6ea96610b95bfc1 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 8c9c8cd2bd8eecdb06d9b6e89de7e9e65bae45cc8fc33609cc74023a5c296067 -F src/main.c 3d9a09ebfcf5e1fa704afa3a1e957bc13b03c994c346bcec8c6b6ae5d5277caf +F src/main.c 7a1b7017af16977b298ef5a0b824b1153f1c878f94885a098620c3c1b1078ce9 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -545,11 +545,11 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 2f4429e0b0ca031e360489c45dca5dfa06cd85480e12c0d1360b91e1c8e7f7a2 -F src/shell.c.in d10dd74a98c7d360ae3a2dffe867540648809581f3575fa3970d9c994814ebe6 +F src/shell.c.in a4bc0e2ba9be798e293790f354dcc0099c6370127eec18cf49cb161b9dae2fbc F src/sqlite.h.in 7f184776cfd85900905420ea3c62e44929ba348ddc015bc5933835ee0529188e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e -F src/sqliteInt.h 96c6caf72c227310dcf401488c2227d7f5586453bc95372fa822fb10c810822f +F src/sqliteInt.h 61f717ac4242af975c6d8abc11a3ada6153ad5bfb7ce08ef8a443c01e13c8031 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d9e85fe80cdd3d798a583a5f99148235d0c3f39adfabbc661615893c387e6e45 -R 6791cad4e90a4fac84f0f4c8722de676 +P f1199d58b9cfdcddb83bc35544ce38299ac4ed50d7ab90d33463f6ccce526feb +R b36ffe32c23127e88069749b6a5f5f27 U drh -Z 52da6a38608d38de5f10fc4c527493c0 +Z 0e96dd2eb82b5d85005719ac04994aad diff --git a/manifest.uuid b/manifest.uuid index 64285d1936..c98981a2aa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f1199d58b9cfdcddb83bc35544ce38299ac4ed50d7ab90d33463f6ccce526feb \ No newline at end of file +677e645e69e1f06487c26da6671fc03f0fb89a0f8e0d35712e6bdcf7279bdfc4 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 5d50a1681b..732c085a98 100644 --- a/src/main.c +++ b/src/main.c @@ -4285,11 +4285,12 @@ int sqlite3_test_control(int op, ...){ } #ifdef SQLITE_DEBUG - /* sqlite3_test_control(SQLITE_TESTCTRL_TUNE, id, val) + /* sqlite3_test_control(SQLITE_TESTCTRL_TUNE, id, *piValue) ** - ** "id" must be an integer between 0 and SQLITE_NTUNE-1. "val" - ** is a 64-bit signed integer. This test-control sets tuning parameter - ** id to the value val. + ** If "id" is an integer between 1 and SQLITE_NTUNE then set the value + ** of the id-th tuning parameter to *piValue. If "id" is between -1 + ** and -SQLITE_NTUNE, then write the current value of the (-id)-th + ** tuning parameter into *piValue. ** ** Tuning parameters are for use during transient development builds, ** to help find the best values for constants in the query planner. @@ -4301,8 +4302,14 @@ int sqlite3_test_control(int op, ...){ */ case SQLITE_TESTCTRL_TUNE: { int id = va_arg(ap, int); - int val = va_arg(ap, sqlite3_int64); - if( id>=0 && id0 && id<=SQLITE_NTUNE ){ + Tuning(id) = *piValue; + }else if( id<0 && id>=-SQLITE_NTUNE ){ + *piValue = Tuning(-id); + }else{ + rc = SQLITE_NOTFOUND; + } break; } #endif diff --git a/src/shell.c.in b/src/shell.c.in index 67edb122d5..5e1eabfacb 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10131,8 +10131,24 @@ static int do_meta_command(char *zLine, ShellState *p){ case SQLITE_TESTCTRL_TUNE: { if( nArg==4 ){ int id = (int)integerValue(azArg[2]); - i64 val = integerValue(azArg[3]); - rc2 = sqlite3_test_control(testctrl, id, val); + int val = (int)integerValue(azArg[3]); + sqlite3_test_control(testctrl, id, &val); + isOk = 3; + }else if( nArg==3 ){ + int id = (int)integerValue(azArg[2]); + sqlite3_test_control(testctrl, -id, &rc2); + isOk = 1; + }else if( nArg==2 ){ + int id = 1; + while(1){ + int val = 0; + rc2 = sqlite3_test_control(testctrl, -id, &val); + if( rc2!=SQLITE_OK ) break; + if( id>1 ) utf8_printf(p->out, " "); + utf8_printf(p->out, "%d: %d", id, val); + id++; + } + if( id>1 ) utf8_printf(p->out, "\n"); isOk = 3; } break; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 112168ed86..806a1a3395 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3747,10 +3747,12 @@ typedef struct { ** optimial values for parameters in the query planner. The should not ** be used on trunk check-ins. They are a temporary mechanism available ** for transient development builds only. +** +** Tuning parameters are numbered starting with 1. */ #define SQLITE_NTUNE 6 /* Should be zero for all trunk check-ins */ #ifdef SQLITE_DEBUG -# define Tuning(X) (sqlite3Config.aTune[X]) +# define Tuning(X) (sqlite3Config.aTune[(X)-1]) #else # define Tuning(X) 0 #endif From 9718bca77fd2526d3261af9a454b2c259f0fdc95 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 4 Jun 2021 15:56:43 +0000 Subject: [PATCH 41/70] Fix more cases in the regexp extension where the 0x00 terminator at the end of the input string is being pattern matched. [forum/forumpost/9104f0d9e7|Forum post 9104f0d9e7]. FossilOrigin-Name: 569e00d4acd426667990d675ca5da48a1859ac84af2412464ecd29c7c5da828c --- ext/misc/regexp.c | 11 +++++++---- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/regexp2.test | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index 09ac9c5023..47103d7107 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -256,7 +256,7 @@ static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ break; } case RE_OP_NOTWORD: { - if( !re_word_char(c) ) re_add_state(pNext, x+1); + if( !re_word_char(c) && c!=0 ) re_add_state(pNext, x+1); break; } case RE_OP_DIGIT: { @@ -264,7 +264,7 @@ static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ break; } case RE_OP_NOTDIGIT: { - if( !re_digit_char(c) ) re_add_state(pNext, x+1); + if( !re_digit_char(c) && c!=0 ) re_add_state(pNext, x+1); break; } case RE_OP_SPACE: { @@ -272,7 +272,7 @@ static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ break; } case RE_OP_NOTSPACE: { - if( !re_space_char(c) ) re_add_state(pNext, x+1); + if( !re_space_char(c) && c!=0 ) re_add_state(pNext, x+1); break; } case RE_OP_BOUNDARY: { @@ -297,8 +297,11 @@ static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ rc = 1; goto re_match_end; } - case RE_OP_CC_INC: case RE_OP_CC_EXC: { + if( c==0 ) break; + /* fall-through */ + } + case RE_OP_CC_INC: { int j = 1; int n = pRe->aArg[x]; int hit = 0; diff --git a/manifest b/manifest index a57f79dc4d..c77af88e1e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scase\swhere\scombining\srow-value\sUPDATE\sFROM\ssyntax\swith\swindow\sfunctions\sover\saggregates\scan\scause\san\serror. -D 2021-06-03T18:56:42.861 +C Fix\smore\scases\sin\sthe\sregexp\sextension\swhere\sthe\s0x00\sterminator\sat\sthe\send\nof\sthe\sinput\sstring\sis\sbeing\spattern\smatched.\n[forum/forumpost/9104f0d9e7|Forum\spost\s9104f0d9e7]. +D 2021-06-04T15:56:43.442 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -315,7 +315,7 @@ F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1 F ext/misc/normalize.c bd84355c118e297522aba74de34a4fd286fc775524e0499b14473918d09ea61f F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c bc97bedcb504f6e885cc21f32e03302696c0498876ac10be0857dbeef534353f +F ext/misc/regexp.c 14f9ea26fa402b595e7b209d74221bff325e74cdc5dd62058fa2ad2ae1598c4c F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 @@ -1293,7 +1293,7 @@ F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79070d F test/regexp1.test 0c3ff80f66b0eff80e623eb5db7a3dad512095c573d78ac23009785f6d8f51ce -F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c +F test/regexp2.test 55ed41da802b0e284ac7e2fe944be3948f93ff25abbca0361a609acfed1368b5 F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d F test/releasetest.tcl 6f803ef0b896f8f3f4c26eb072c0399963a5987a509a64d45f5dfbc1ebae2951 x F test/releasetest_data.tcl f88ed29aa18366ed3956ace36c96ec6868ef5b9ee04cc05d32f4d81031e19e28 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 820ae3b117c2d8c117c0c5a4e440a7d06886772516c7fc0a84606388f91be195 -R 3fd4ec14904b0e03c6d406344d944d84 -U dan -Z f80d5b48e051c51974d8a351a0138ba6 +P 4a587c3492faa99490fd67ca1de9fceafcdc12d220f42817791923be258b73f1 +R 1388ff0f8d589b267d6560d7292d604f +U drh +Z f1274c6e186ac07cf9d2283fcacc2af8 diff --git a/manifest.uuid b/manifest.uuid index f4119a266a..60c54bd620 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a587c3492faa99490fd67ca1de9fceafcdc12d220f42817791923be258b73f1 \ No newline at end of file +569e00d4acd426667990d675ca5da48a1859ac84af2412464ecd29c7c5da828c \ No newline at end of file diff --git a/test/regexp2.test b/test/regexp2.test index e3922042cc..3e1da9f230 100644 --- a/test/regexp2.test +++ b/test/regexp2.test @@ -120,5 +120,25 @@ do_execsql_test 3.0 { SELECT * FROM t6; } {eab dea} +# 2021-06-04 Forum https://sqlite.org/forum/forumpost/9104f0d9e7 +# +do_execsql_test 4.1 {SELECT 'abc' REGEXP '\W'} {0} +do_execsql_test 4.2 {SELECT 'a c' REGEXP '\W'} {1} +do_execsql_test 4.3 {SELECT ' ' REGEXP '\W'} {1} +do_execsql_test 4.4 {SELECT 'abc' REGEXP '\w'} {1} +do_execsql_test 4.5 {SELECT 'a c' REGEXP '\w'} {1} +do_execsql_test 4.6 {SELECT ' ' REGEXP '\w'} {0} +do_execsql_test 4.7 {SELECT 'abc' REGEXP '\D'} {1} +do_execsql_test 4.8 {SELECT 'abc' REGEXP '[^a-z]'} {0} +do_execsql_test 4.9 {SELECT 'a c' REGEXP '[^a-z]'} {1} +do_execsql_test 4.10 {SELECT ' ' REGEXP '[^a-z]'} {1} +do_execsql_test 4.11 {SELECT 'abc' REGEXP '[a-z]'} {1} +do_execsql_test 4.12 {SELECT 'a c' REGEXP '[a-z]'} {1} +do_execsql_test 4.13 {SELECT ' ' REGEXP '[a-z]'} {0} +do_execsql_test 4.14 {SELECT 'abc' REGEXP '[^a-z]{2}'} {0} +do_execsql_test 4.15 {SELECT 'a c' REGEXP '[^a-z]{2}'} {0} +do_execsql_test 4.16 {SELECT ' ' REGEXP '[^a-z]{2}'} {1} +do_execsql_test 4.17 {SELECT 'abc' REGEXP '\W{1,1}'} {0} +do_execsql_test 4.18 {SELECT 'abc' REGEXP '\W{1}'} {0} finish_test From abc15f1b9a8e634feedbe48387f9c143b60fb509 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 4 Jun 2021 16:11:19 +0000 Subject: [PATCH 42/70] Fix harmless compiler warnings. FossilOrigin-Name: 83aca2d8704e51eeed5652b1506c6fc883c0397728cda456f229369788b8608a --- ext/misc/regexp.c | 4 +++- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index 47103d7107..95eb5c0834 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -677,7 +677,7 @@ static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){ ** unicode characters beyond plane 0 - those are very rare and this is ** just an optimization. */ if( pRe->aOp[0]==RE_OP_ANYSTAR && !noCase ){ - for(j=0, i=1; jzInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){ + for(j=0, i=1; j<(int)sizeof(pRe->zInit)-2 && pRe->aOp[i]==RE_OP_MATCH; i++){ unsigned x = pRe->aArg[i]; if( x<=127 ){ pRe->zInit[j++] = (unsigned char)x; @@ -718,6 +718,7 @@ static void re_sql_func( const char *zErr; /* Compile error message */ int setAux = 0; /* True to invoke sqlite3_set_auxdata() */ + (void)argc; /* Unused */ pRe = sqlite3_get_auxdata(context, 0); if( pRe==0 ){ zPattern = (const char*)sqlite3_value_text(argv[0]); @@ -757,6 +758,7 @@ int sqlite3_regexp_init( ){ int rc = SQLITE_OK; SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused */ rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8|SQLITE_INNOCUOUS, 0, re_sql_func, 0, 0); if( rc==SQLITE_OK ){ diff --git a/manifest b/manifest index c77af88e1e..502b12c45e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\smore\scases\sin\sthe\sregexp\sextension\swhere\sthe\s0x00\sterminator\sat\sthe\send\nof\sthe\sinput\sstring\sis\sbeing\spattern\smatched.\n[forum/forumpost/9104f0d9e7|Forum\spost\s9104f0d9e7]. -D 2021-06-04T15:56:43.442 +C Fix\sharmless\scompiler\swarnings. +D 2021-06-04T16:11:19.069 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -315,7 +315,7 @@ F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1 F ext/misc/normalize.c bd84355c118e297522aba74de34a4fd286fc775524e0499b14473918d09ea61f F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c 14f9ea26fa402b595e7b209d74221bff325e74cdc5dd62058fa2ad2ae1598c4c +F ext/misc/regexp.c 35fa6349ea4af66537520e13b74ee4b076c33ac076f59da0afe842034e14d18c F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 930e63df768dcb197242b1efa0ed9fcdcc9a7b7556c236ee01a9959b61cf527b -F src/expr.c f175b34cc0da572f899bb6591fd3510b17200702dce7d80226cd4e454f7cd83a +F src/expr.c 57534c739e1280de1cef333a4dc4c42ac1f8524acb71b715ae21406bf4363f57 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c 88fd711754a7241cb9f8eb1391370fd0c0cea756b3358efa274c5d1efd59af93 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4a587c3492faa99490fd67ca1de9fceafcdc12d220f42817791923be258b73f1 -R 1388ff0f8d589b267d6560d7292d604f +P 569e00d4acd426667990d675ca5da48a1859ac84af2412464ecd29c7c5da828c +R 0d9e861014d82b4faa1a9ba21bfe42f2 U drh -Z f1274c6e186ac07cf9d2283fcacc2af8 +Z ca70033f52afc9f08bf639903196adbd diff --git a/manifest.uuid b/manifest.uuid index 60c54bd620..c26185c97c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -569e00d4acd426667990d675ca5da48a1859ac84af2412464ecd29c7c5da828c \ No newline at end of file +83aca2d8704e51eeed5652b1506c6fc883c0397728cda456f229369788b8608a \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ad0fd96339..0a57d745e1 100644 --- a/src/expr.c +++ b/src/expr.c @@ -633,7 +633,7 @@ static void codeVectorCompare( sqlite3VdbeAddOp2(v, OP_Integer, 1, dest); for(i=0; 1 /*Loop exits by "break"*/; i++){ int regFree1 = 0, regFree2 = 0; - Expr *pL, *pR; + Expr *pL = 0, *pR = 0; int r1, r2; assert( i>=0 && i Date: Fri, 4 Jun 2021 16:17:38 +0000 Subject: [PATCH 43/70] Add the (missing) dependency of regexp.c to the shell.c rule in the makefiles. This dependency should have been added by [5d4535bfb603d7c8] but was missed. FossilOrigin-Name: c93be7e66039e4c27b86f49d29f5c653cc6c02f6cbc6ad02d8bb1d32d0240863 --- Makefile.in | 1 + Makefile.msc | 1 + main.mk | 1 + manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Makefile.in b/Makefile.in index f010cdaa15..2795ffa9e8 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1086,6 +1086,7 @@ SHELL_SRC = \ $(TOP)/ext/misc/decimal.c \ $(TOP)/ext/misc/fileio.c \ $(TOP)/ext/misc/ieee754.c \ + $(TOP)/ext/misc/regexp.c \ $(TOP)/ext/misc/series.c \ $(TOP)/ext/misc/shathree.c \ $(TOP)/ext/misc/sqlar.c \ diff --git a/Makefile.msc b/Makefile.msc index 394d342b6a..4f20c0c0c1 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2211,6 +2211,7 @@ SHELL_SRC = \ $(TOP)\ext\misc\decimal.c \ $(TOP)\ext\misc\fileio.c \ $(TOP)\ext\misc\ieee754.c \ + $(TOP)\ext\misc\regexp.c \ $(TOP)\ext\misc\series.c \ $(TOP)\ext\misc\shathree.c \ $(TOP)\ext\misc\uint.c \ diff --git a/main.mk b/main.mk index d8b44f4190..16d72ff924 100644 --- a/main.mk +++ b/main.mk @@ -747,6 +747,7 @@ SHELL_SRC = \ $(TOP)/ext/misc/decimal.c \ $(TOP)/ext/misc/fileio.c \ $(TOP)/ext/misc/ieee754.c \ + $(TOP)/ext/misc/regexp.c \ $(TOP)/ext/misc/shathree.c \ $(TOP)/ext/misc/sqlar.c \ $(TOP)/ext/misc/uint.c \ diff --git a/manifest b/manifest index 502b12c45e..fa9275c78a 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Fix\sharmless\scompiler\swarnings. -D 2021-06-04T16:11:19.069 +C Add\sthe\s(missing)\sdependency\sof\sregexp.c\sto\sthe\sshell.c\srule\sin\sthe\smakefiles.\nThis\sdependency\sshould\shave\sbeen\sadded\sby\s[5d4535bfb603d7c8]\sbut\swas\smissed. +D 2021-06-04T16:17:38.971 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 30c6d39386246695e951a676973e0bf57aabbd1e37024c07e657af89dd332555 +F Makefile.in ff5ac24ec9cb700135ee4453fa14c18ea371e94250d3673bda1f2cb56e1108ce F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 6443729ba6a013a0fea4f999b22e54760f36e73c2e691554f0c4bfa1dbe4d070 +F Makefile.msc 8285e1ea7264f32b08702866d69dd127c0f663bbc2002323d853c68c27c6b6e4 F README.md 2a71913f398ecac5f3e10945fcf438aed425c2e9ed9874de561156ba77fb7023 F VERSION 8c392f6d70d82e513a0eac622bdf23c43df3e084cb630288beba8cef3012c812 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -466,7 +466,7 @@ F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk d1654e2923a7195603a7d6564dabe037a3a20ea5b3817002db534ffc4ad8cecf +F main.mk c0c95f0aa2e3b731eb0c5a85869d4d6abef91647ec8e87a4013059bd1b910c0a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 569e00d4acd426667990d675ca5da48a1859ac84af2412464ecd29c7c5da828c -R 0d9e861014d82b4faa1a9ba21bfe42f2 +P 83aca2d8704e51eeed5652b1506c6fc883c0397728cda456f229369788b8608a +R f21bb0c9aca0f2f99e6cb97aa8cc41b9 U drh -Z ca70033f52afc9f08bf639903196adbd +Z d8be7c9aa67f8410dd7011c1d63c866b diff --git a/manifest.uuid b/manifest.uuid index c26185c97c..c3528215b3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -83aca2d8704e51eeed5652b1506c6fc883c0397728cda456f229369788b8608a \ No newline at end of file +c93be7e66039e4c27b86f49d29f5c653cc6c02f6cbc6ad02d8bb1d32d0240863 \ No newline at end of file From e427fe5210186bf192e8e1bc2e82b0a91d0cb220 Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 4 Jun 2021 21:46:29 +0000 Subject: [PATCH 44/70] Make MSVC build examples work when taken literally, and say when they do. FossilOrigin-Name: b53ca8ed8336d9e442a920e1c05a17a38dadc2fd1e0cb73e68d380ef34c87af8 --- README.md | 16 ++++++++-------- manifest | 15 +++++++-------- manifest.uuid | 2 +- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index fb72ae8c28..b79fc67f15 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ update to the lastest version using: Or type "fossil ui" to get a web-based user interface. -## Compiling +## Compiling for Unix-like systems First create a directory in which to place the build products. It is recommended, but not required, that the @@ -94,22 +94,22 @@ script does not work out for you, there is a generic makefile named can copy and edit to suit your needs. Comments on the generic makefile show what changes are needed. -## Using MSVC +## Using MSVC for Windows systems On Windows, all applicable build products can be compiled with MSVC. First open the command prompt window associated with the desired compiler version (e.g. "Developer Command Prompt for VS2013"). Next, use NMAKE with the provided "Makefile.msc" to build one of the supported targets. -For example: +For example, from the parent directory of the source subtree named "sqlite": mkdir bld cd bld - nmake /f Makefile.msc TOP=..\sqlite - nmake /f Makefile.msc sqlite3.c TOP=..\sqlite - nmake /f Makefile.msc sqlite3.dll TOP=..\sqlite - nmake /f Makefile.msc sqlite3.exe TOP=..\sqlite - nmake /f Makefile.msc test TOP=..\sqlite + nmake /f ..\sqlite\Makefile.msc TOP=..\sqlite + nmake /f ..\sqlite\Makefile.msc sqlite3.c TOP=..\sqlite + nmake /f ..\sqlite\Makefile.msc sqlite3.dll TOP=..\sqlite + nmake /f ..\sqlite\Makefile.msc sqlite3.exe TOP=..\sqlite + nmake /f ..\sqlite\Makefile.msc test TOP=..\sqlite There are several build options that can be set via the NMAKE command line. For example, to build for WinRT, simply add "FOR_WINRT=1" argument diff --git a/manifest b/manifest index 6673710696..345719d395 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C Improvements\sto\sthe\sOP_SeekScan\soptimization.\s\sAdded\sthe\nSQLITE_TESTCTRL_TUNE\stest-control. -D 2021-06-04T17:47:08.529 +C Make\sMSVC\sbuild\sexamples\swork\swhen\staken\sliterally,\sand\ssay\swhen\sthey\sdo. +D 2021-06-04T21:46:29.898 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in ff5ac24ec9cb700135ee4453fa14c18ea371e94250d3673bda1f2cb56e1108ce F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc 8285e1ea7264f32b08702866d69dd127c0f663bbc2002323d853c68c27c6b6e4 -F README.md 2a71913f398ecac5f3e10945fcf438aed425c2e9ed9874de561156ba77fb7023 +F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION 8c392f6d70d82e513a0eac622bdf23c43df3e084cb630288beba8cef3012c812 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 @@ -1918,8 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c93be7e66039e4c27b86f49d29f5c653cc6c02f6cbc6ad02d8bb1d32d0240863 677e645e69e1f06487c26da6671fc03f0fb89a0f8e0d35712e6bdcf7279bdfc4 -R 7f570944acb13c224bf3daa6354a37ca -T +closed 677e645e69e1f06487c26da6671fc03f0fb89a0f8e0d35712e6bdcf7279bdfc4 -U drh -Z 1487fd9719459ccfb4970df5beff8402 +P 9a2ab6092d644fc3effc4ab4aca33efb2b4dd4213b2154d518a3e87eec4d3983 +R 330a10ea9a78442fe7bd3f4c5feed3b7 +U larrybr +Z ef5013aa32987409174f0c0a96b71b92 diff --git a/manifest.uuid b/manifest.uuid index 75fc7295e4..c74ee4ba96 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a2ab6092d644fc3effc4ab4aca33efb2b4dd4213b2154d518a3e87eec4d3983 \ No newline at end of file +b53ca8ed8336d9e442a920e1c05a17a38dadc2fd1e0cb73e68d380ef34c87af8 \ No newline at end of file From 06258a4260a1054bf0f553bf861737988c7c3ee1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 4 Jun 2021 23:26:56 +0000 Subject: [PATCH 45/70] A better fix for the problem addressed by [4eb80b0cc61526c1]. This fix also avoids reading uninitialized variables. FossilOrigin-Name: 1c71de43dbc68002c4a6229e7efffb019655baff67a51fe922571fe420c95835 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 10 ++++++---- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 345719d395..c92b6e722c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sMSVC\sbuild\sexamples\swork\swhen\staken\sliterally,\sand\ssay\swhen\sthey\sdo. -D 2021-06-04T21:46:29.898 +C A\sbetter\sfix\sfor\sthe\sproblem\saddressed\sby\s[4eb80b0cc61526c1].\s\sThis\sfix\nalso\savoids\sreading\suninitialized\svariables. +D 2021-06-04T23:26:56.428 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c e2e0e6be8a53cc5c145d9ff4f82a2c8d6851468a366ac8b5bd7306c792e37619 +F src/alter.c 2cb4a3d15cfee6a8a631bbf35943421312addaee36ed171aafe1a88de8ada060 F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9a2ab6092d644fc3effc4ab4aca33efb2b4dd4213b2154d518a3e87eec4d3983 -R 330a10ea9a78442fe7bd3f4c5feed3b7 -U larrybr -Z ef5013aa32987409174f0c0a96b71b92 +P b53ca8ed8336d9e442a920e1c05a17a38dadc2fd1e0cb73e68d380ef34c87af8 +R 6bb182b746985a1fbabd260a9d2b7d10 +U drh +Z c646eee165dcb65ccd442f03bdd6fcbf diff --git a/manifest.uuid b/manifest.uuid index c74ee4ba96..5c40fafa39 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b53ca8ed8336d9e442a920e1c05a17a38dadc2fd1e0cb73e68d380ef34c87af8 \ No newline at end of file +1c71de43dbc68002c4a6229e7efffb019655baff67a51fe922571fe420c95835 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 423b2433b8..744b75ea8b 100644 --- a/src/alter.c +++ b/src/alter.c @@ -919,7 +919,7 @@ static RenameToken *renameTokenFind( void *pPtr ){ RenameToken **pp; - if( pPtr==0 ){ + if( NEVER(pPtr==0) ){ return 0; } for(pp=&pParse->pRename; (*pp); pp=&(*pp)->pNext){ @@ -1473,9 +1473,11 @@ static void renameColumnFunc( assert( sParse.pNewTable->pSelect==0 ); sCtx.pTab = sParse.pNewTable; if( bFKOnly==0 ){ - renameTokenFind( - &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zName - ); + if( iColnCol ){ + renameTokenFind( + &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zName + ); + } if( sCtx.iCol<0 ){ renameTokenFind(&sParse, &sCtx, (void*)&sParse.pNewTable->iPKey); } From 9ae57841d0156a266db7105e8d4f1ec4be27ddc3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 7 Jun 2021 00:41:18 +0000 Subject: [PATCH 46/70] Omit the unnecessary highlighting of the security implications of SQLTIE_DIRECTONLY in the sqlite3_create_function() documentation. No changes to code. FossilOrigin-Name: 2aa9368b63b42ac7c700516f109edcc6098c12b850eae591afed4e51a3f41819 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 2 -- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c92b6e722c..85a6295d1a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C A\sbetter\sfix\sfor\sthe\sproblem\saddressed\sby\s[4eb80b0cc61526c1].\s\sThis\sfix\nalso\savoids\sreading\suninitialized\svariables. -D 2021-06-04T23:26:56.428 +C Omit\sthe\sunnecessary\shighlighting\sof\sthe\ssecurity\simplications\sof\nSQLTIE_DIRECTONLY\sin\sthe\ssqlite3_create_function()\sdocumentation.\nNo\schanges\sto\scode. +D 2021-06-07T00:41:18.036 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -546,7 +546,7 @@ F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 2f4429e0b0ca031e360489c45dca5dfa06cd85480e12c0d1360b91e1c8e7f7a2 F src/shell.c.in a4bc0e2ba9be798e293790f354dcc0099c6370127eec18cf49cb161b9dae2fbc -F src/sqlite.h.in 7f184776cfd85900905420ea3c62e44929ba348ddc015bc5933835ee0529188e +F src/sqlite.h.in f450394634eac00bc680c0e91582b818359c6ad61149f49f90fb6ecbd526b51f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e F src/sqliteInt.h 61f717ac4242af975c6d8abc11a3ada6153ad5bfb7ce08ef8a443c01e13c8031 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b53ca8ed8336d9e442a920e1c05a17a38dadc2fd1e0cb73e68d380ef34c87af8 -R 6bb182b746985a1fbabd260a9d2b7d10 +P 1c71de43dbc68002c4a6229e7efffb019655baff67a51fe922571fe420c95835 +R c87395dcc8dfb3b7eafc4dc4fcea51a7 U drh -Z c646eee165dcb65ccd442f03bdd6fcbf +Z b0e78988bd880158640c51396f39391b diff --git a/manifest.uuid b/manifest.uuid index 5c40fafa39..d29b2a003b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c71de43dbc68002c4a6229e7efffb019655baff67a51fe922571fe420c95835 \ No newline at end of file +2aa9368b63b42ac7c700516f109edcc6098c12b850eae591afed4e51a3f41819 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 92ea416111..065438b1b8 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -5133,7 +5133,6 @@ int sqlite3_reset(sqlite3_stmt *pStmt); ** within VIEWs, TRIGGERs, CHECK constraints, generated column expressions, ** index expressions, or the WHERE clause of partial indexes. ** -** ** For best security, the [SQLITE_DIRECTONLY] flag is recommended for ** all application-defined SQL functions that do not need to be ** used inside of triggers, view, CHECK constraints, or other elements of @@ -5143,7 +5142,6 @@ int sqlite3_reset(sqlite3_stmt *pStmt); ** a database file to include invocations of the function with parameters ** chosen by the attacker, which the application will then execute when ** the database file is opened and read. -** ** ** ^(The fifth parameter is an arbitrary pointer. The implementation of the ** function can gain access to this pointer using [sqlite3_user_data()].)^ From 9a4127a8c1899b3826ed0f7c44f8985e1f511c0a Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 7 Jun 2021 00:54:38 +0000 Subject: [PATCH 47/70] Remove unnecessary end-of-line whitespace from the regexp.c extension. FossilOrigin-Name: 17e26a1f5e3cc4e96b9265dcdbf54f376304b0908f3ff0a0d3df33653e77e5b6 --- ext/misc/regexp.c | 10 +++++----- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index 95eb5c0834..99fb453cec 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -322,7 +322,7 @@ static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ } if( pRe->aOp[x]==RE_OP_CC_EXC ) hit = !hit; if( hit ) re_add_state(pNext, x+n); - break; + break; } } } @@ -483,7 +483,7 @@ static const char *re_subcompile_string(ReCompiled *p){ iStart = p->nState; switch( c ){ case '|': - case '$': + case '$': case ')': { p->sIn.i--; return 0; @@ -499,7 +499,7 @@ static const char *re_subcompile_string(ReCompiled *p){ if( rePeek(p)=='*' ){ re_append(p, RE_OP_ANYSTAR, 0); p->sIn.i++; - }else{ + }else{ re_append(p, RE_OP_ANY, 0); } break; @@ -708,8 +708,8 @@ static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){ ** is implemented as regexp(B,A). */ static void re_sql_func( - sqlite3_context *context, - int argc, + sqlite3_context *context, + int argc, sqlite3_value **argv ){ ReCompiled *pRe; /* Compiled regular expression */ diff --git a/manifest b/manifest index 85a6295d1a..bb164ca6bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\sunnecessary\shighlighting\sof\sthe\ssecurity\simplications\sof\nSQLTIE_DIRECTONLY\sin\sthe\ssqlite3_create_function()\sdocumentation.\nNo\schanges\sto\scode. -D 2021-06-07T00:41:18.036 +C Remove\sunnecessary\send-of-line\swhitespace\sfrom\sthe\sregexp.c\sextension. +D 2021-06-07T00:54:38.895 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -315,7 +315,7 @@ F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1 F ext/misc/normalize.c bd84355c118e297522aba74de34a4fd286fc775524e0499b14473918d09ea61f F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c 35fa6349ea4af66537520e13b74ee4b076c33ac076f59da0afe842034e14d18c +F ext/misc/regexp.c 5853b0e5ed40c47f7ded2b0bf2ff73796f7cb21543089c5f07308e0032647b76 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1c71de43dbc68002c4a6229e7efffb019655baff67a51fe922571fe420c95835 -R c87395dcc8dfb3b7eafc4dc4fcea51a7 +P 2aa9368b63b42ac7c700516f109edcc6098c12b850eae591afed4e51a3f41819 +R 6410a80813c7a5acd6639014bb0b3850 U drh -Z b0e78988bd880158640c51396f39391b +Z e86420a701d8182f7faf4cd935aa8498 diff --git a/manifest.uuid b/manifest.uuid index d29b2a003b..b4dc1a0dfe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2aa9368b63b42ac7c700516f109edcc6098c12b850eae591afed4e51a3f41819 \ No newline at end of file +17e26a1f5e3cc4e96b9265dcdbf54f376304b0908f3ff0a0d3df33653e77e5b6 \ No newline at end of file From fe972341a5a1993382aa75b3aa3eb0026c800ff2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 7 Jun 2021 11:50:23 +0000 Subject: [PATCH 48/70] Fix an assert() in the OP_ParseSchema opcode that might fail on a corrupt database file when running with PRAGMA writable_schema=ON. dbsqlfuzz e7d743ca65f2767e415095f0c5a49166a0f55eea. FossilOrigin-Name: 10801f65af495a999ef61741322ea82dc20bd92ea8e55e4016c409096f38b0d1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index bb164ca6bf..71008c5556 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sunnecessary\send-of-line\swhitespace\sfrom\sthe\sregexp.c\sextension. -D 2021-06-07T00:54:38.895 +C Fix\san\sassert()\sin\sthe\sOP_ParseSchema\sopcode\sthat\smight\sfail\son\sa\scorrupt\ndatabase\sfile\swhen\srunning\swith\sPRAGMA\swritable_schema=ON.\ndbsqlfuzz\se7d743ca65f2767e415095f0c5a49166a0f55eea. +D 2021-06-07T11:50:23.565 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 F src/vacuum.c 492422c1463c076473bae1858799c7a0a5fe87a133d1223239447c422cd26286 -F src/vdbe.c a51f4947380b0561ef70730e1144bf3837216cfea61a59a498149d47eeb09943 +F src/vdbe.c 87d29d763c0398d8128ecc9f043aab7108123b15c919ec92d4b57e5e4385818c F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 58980223a32495ad059d10581b83e133abdc77248b1bab85c080cab8a13bd819 F src/vdbeapi.c d9e99daf59fec928986838b3389a7337e82fec6b3b5de30206cb99fb4661b94e @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2aa9368b63b42ac7c700516f109edcc6098c12b850eae591afed4e51a3f41819 -R 6410a80813c7a5acd6639014bb0b3850 +P 17e26a1f5e3cc4e96b9265dcdbf54f376304b0908f3ff0a0d3df33653e77e5b6 +R 2008131d3502f721f33346d6e5ea4f59 U drh -Z e86420a701d8182f7faf4cd935aa8498 +Z 608a44948c135ddd98aa43f877710cc1 diff --git a/manifest.uuid b/manifest.uuid index b4dc1a0dfe..0e8715fd08 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -17e26a1f5e3cc4e96b9265dcdbf54f376304b0908f3ff0a0d3df33653e77e5b6 \ No newline at end of file +10801f65af495a999ef61741322ea82dc20bd92ea8e55e4016c409096f38b0d1 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index eb5a3f0aab..cbfec41ae1 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -6361,7 +6361,9 @@ case OP_ParseSchema: { iDb = pOp->p1; assert( iDb>=0 && iDbnDb ); - assert( DbHasProperty(db, iDb, DB_SchemaLoaded) || db->mallocFailed ); + assert( DbHasProperty(db, iDb, DB_SchemaLoaded) + || db->mallocFailed + || (CORRUPT_DB && (db->flags & SQLITE_NoSchemaError)!=0) ); #ifndef SQLITE_OMIT_ALTERTABLE if( pOp->p4.z==0 ){ From ccf0bb49bb850f1ce71c3942b6a076f4e4335a12 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 7 Jun 2021 13:50:36 +0000 Subject: [PATCH 49/70] Avoid use of uninitialized memory while running defragmentPage() on a corrupt database file. dbsqlfuzz 4c45cecc0b255aaf2ea85453ccd17e814fd0b6b2 FossilOrigin-Name: 35e40d75754ec6fb93fe57c6ecbe731104e77c997d7e17ef1a22984837dfcab2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 71008c5556..70b002748b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sthe\sOP_ParseSchema\sopcode\sthat\smight\sfail\son\sa\scorrupt\ndatabase\sfile\swhen\srunning\swith\sPRAGMA\swritable_schema=ON.\ndbsqlfuzz\se7d743ca65f2767e415095f0c5a49166a0f55eea. -D 2021-06-07T11:50:23.565 +C Avoid\suse\sof\suninitialized\smemory\swhile\srunning\sdefragmentPage()\son\sa\ncorrupt\sdatabase\sfile.\ndbsqlfuzz\s4c45cecc0b255aaf2ea85453ccd17e814fd0b6b2 +D 2021-06-07T13:50:36.893 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 6b24d93490ea4450a6800eef046fedf29e5e5ba00efc896eef2da5bb2869ea2e +F src/btree.c 399e1ebcd6c4f9ad47f5457bfe3623441db287f0923433cf6539497791557be8 F src/btree.h 096cc53baa58be22b02c896d1cf933c38cfc6d65f9253c1367ece8cc88a24de5 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c d766f04ddd88822c2c10cf3c0dfb34b068c45f103f442222038b9eeff02312ca @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 17e26a1f5e3cc4e96b9265dcdbf54f376304b0908f3ff0a0d3df33653e77e5b6 -R 2008131d3502f721f33346d6e5ea4f59 +P 10801f65af495a999ef61741322ea82dc20bd92ea8e55e4016c409096f38b0d1 +R 87c6ad819f9b16a006d2ce2c64be3689 U drh -Z 608a44948c135ddd98aa43f877710cc1 +Z ca5dd7010823297422d198ffa35c5cd5 diff --git a/manifest.uuid b/manifest.uuid index 0e8715fd08..b298681889 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10801f65af495a999ef61741322ea82dc20bd92ea8e55e4016c409096f38b0d1 \ No newline at end of file +35e40d75754ec6fb93fe57c6ecbe731104e77c997d7e17ef1a22984837dfcab2 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 371f8d15c1..d1e84d0a60 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1535,7 +1535,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ if( temp==0 ){ if( cbrk==pc ) continue; temp = sqlite3PagerTempSpace(pPage->pBt->pPager); - memcpy(&temp[iCellStart], &data[iCellStart], (cbrk+size) - iCellStart); + memcpy(&temp[iCellStart], &data[iCellStart], usableSize - iCellStart); src = temp; } memcpy(&data[cbrk], &src[pc], size); From 09c69fc1b37b184c74be69724607698fd9efb02f Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 7 Jun 2021 14:21:03 +0000 Subject: [PATCH 50/70] Add recent dbsqlfuzz test cases to test/fuzzdata8.db. FossilOrigin-Name: 162022003c2b4a393296939e2616bd3c7bbfd65b198ba6c9894e4234de2d3122 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2276352 -> 2390016 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 70b002748b..cac7421592 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\suse\sof\suninitialized\smemory\swhile\srunning\sdefragmentPage()\son\sa\ncorrupt\sdatabase\sfile.\ndbsqlfuzz\s4c45cecc0b255aaf2ea85453ccd17e814fd0b6b2 -D 2021-06-07T13:50:36.893 +C Add\srecent\sdbsqlfuzz\stest\scases\sto\stest/fuzzdata8.db. +D 2021-06-07T14:21:03.109 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1056,7 +1056,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 29ca3c47821abb626309e0d182b0f00ad3b49638370daee855641b9abc36dfa2 +F test/fuzzdata8.db bc52deef6091b1c3ae73c1d86de5eabbb643dbe2eb9595caf379db139b5fe376 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 10801f65af495a999ef61741322ea82dc20bd92ea8e55e4016c409096f38b0d1 -R 87c6ad819f9b16a006d2ce2c64be3689 +P 35e40d75754ec6fb93fe57c6ecbe731104e77c997d7e17ef1a22984837dfcab2 +R 937e997f3be9ea2e638b1b3d5bddd533 U drh -Z ca5dd7010823297422d198ffa35c5cd5 +Z 8e18d53031185b37081375f301b82b09 diff --git a/manifest.uuid b/manifest.uuid index b298681889..a3b6506419 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35e40d75754ec6fb93fe57c6ecbe731104e77c997d7e17ef1a22984837dfcab2 \ No newline at end of file +162022003c2b4a393296939e2616bd3c7bbfd65b198ba6c9894e4234de2d3122 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 619e5d53b697fc196feaa1ae625bcafe1967b38e..50c54a407cb7bfed5dd0623e5ee1f377d8a29e40 100644 GIT binary patch delta 41862 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 delta 35702 zcmeGEcYIV;6F-jcxn=k6?%mzHeG?K==_LuhB_#AtLhnf^(jgI$A|-bzA_yb~GJuo> zL6MqJGJpt)q5=veil|5lB8o^!&__iPzH=9!@H~E=-#@?a_x1Yz^X2v0*>KA_bLPy< zne(1Gn^l>^vVLE|vTN9rbUJCj?)kqdISre#q@uLl2G%}TmI~JOm!~h%Ewz|*I^LuX z)ake<>HwmDs{M#QP*aHBQ~MIVqV^&Bwc3N|S88{npQ_!6ma1Keo=`gweOIOaxZP?Z z(E>Gr=sGo?=qqYFqKnlwM6=XZMCYh2iOx`)6J3<4HlwfUYEz<<)i|Q*YAn%_YD1#K z)cQmRt96MEQtJ@yuhu4-tkxphM~x!dON}JjLk%a|RShHBSq&kYs0I^lsrraEQ$0ju zRTt41)k(Cm>LA*1k!q)}da8|RZPiLNTD1_3Qe~pys+nk*N)qB~sz#!rszfwIH4v?# z>WO+)k*G%%h&olCsG>5WmPJJ5`9usa6XECTbnK5gL>|6G!NjBU0sDPIw#4)zY{S7PIfaKVdYrS z%n)rxp_kz)&wXAO?7Ivu3`#cK;n_tL2GCXZ1*9h%E<9~Nsb!Qge}W;E7cUXxm!W8g zyXorjR6-d$x8WE}dmq$g!&^%+YRKLt(!5eI11??Yjbn zCEE856qak>-=grE_I(qDZ0-9y6xM3rw@_HGeSeR_ChhwN6!Nw2+fb2haAVMRZKOY< zuv5Eu2N!%{oWfzoK0_{JKcP@aSGl{95K&}kf-MgjKIPdx2>*e((09b}6VL9Wa9n%w zLGG8ED)E;RgN}NcQ{}2t3XqsS2 znc)M@__KOinI-BLXG7*T_y2m(LK?)rrq3@BH`(CDD{nnEE0i0=&F^6U|IE{%Mb!;^OmT}6Epo$iXRNv=JywxPf|N6@|BK%3!(@QqW764{^2 zB4*?DN<%cy9z#ZNDHdurkQy9LmEPnz_7@bzv-XhvV`K}Q?v`>mC>$&$!qMCtz>k>w$eF>3~7A10A$)E0w}0ywn_R^`$BXi)u^DpfEvNqupju)L-fg$tyT3 zo4dPrucfMsclM(;L)^1J{;Ztf!gt+g_HL+V8=?JUt z?ia@NkYbWLL#$US`)_u;L*hAK3m{JGtTn#^ zZ*`XfQte1Uq<+@TxdM@dsKV}f){5(PoGG6vLTQaWa5N*j1VqzjN< zC?`V6GASBrhZ^m;ZI+bIu^_T_iL5CYPXBJGdC)U5h{4lGhJl#9K)Ne2JuX-#`5E)& zEtj4!13q0Y^%O*jxNnk$iY*l@!D?BUWZhuL^>R?n1%&XPw19dqT{U4)CH` z(7o#ZkM}xmlu8(jgn|}^Sg3K3v?^_rlxk!$mh6z)b1Winr}Ud>5p=HwM%x#Az9Y>u zh*m+jX(D7Emy*z2B>lpP+QL#7g+tN=iP>=Kap`ql)E1rwPg42#k1S+ znoF(OrlTF9jH0)xwUlv4m#{ zP@ouR;c%bv6;gN|*B%NT#t;m58NV|~oUWHn_pYuN8C#rXZ^atP0CZeOOnNM}XV|f|v4mrt@-7L~Vmo8S-wL3+OCgl*F11=AED2Ua zP;F)mF8CtV?k((oF@L+^}q`_dXTZJL5w7o8~1!5+Jy98nW{zz zI_UW9ver7jJ<2$Qv7W_g#voCQB1=xGekT;?jWb@*i?ztG{tf^FnpHS8IvmQ*M%nSp zDa3{tP5eIZDG2_3-vNWB8{ZMNc(EVsmkbfO(_|RJAbeVo9v5dCdmC77ET3a+%!^uN zIS^95x7UTV1J+@UR|NwWa@y^*BZZN#^Jd&)p~;Nt>-d#;+{NXf5wIsuQv{r#D;>d zXt4Ii5QrUQ^jb~BiLX(sBh&`u6aq~Rfx>%|4X>Y#3T2qO&6v-`5%f$d3fnd1OQX2M z*hvy&X=cN;hQ?@ee_?rBHHN0+W$jA(vsTBgAEq{@?pkZt(x7pYS#KP@WRlv5ggvyH zg?d=yfblkCV_^E62nucv87a6K3q_}mS-9kgagmKpfXi2m=b_dSV=5S~ku~%Z*b#&-;294)4^v|c7d;S|{l4GtNL!1#mR0?FM? z-n_%cEZBI*I2#vSHu{-3p2jd0PG2^LV#Hk|#S+u7@T`$BSXp7*h+C_SJq==0vYY-| zi(@o3&e-fxn~)26=8qJ!sRLA;3N}LHL&kmo)z5rr@u%?&n^OGP=n=(cq<;bVtAWRH z2Q$?%vgUZsWNO017pdV{D9EO#yy>O%hNByfNr;bYl3RMZBPJ`RgFKs!5r=|0Fzn(s zJime3Q*%T-rW*QEpP!co_HR|zTyr~x_YGJ(}M)Wcb z#^H&k3In;X#`PQ>K^bm}!2E8ezRb8}txj!Cj$YJSNCUcf6WaDPof1`gcPR|(Z0?VP zdztiB)(%DuGffhguV|pQ#dE{7u`i=%UWJ^X2p^OPl1#C_sTHP;FuiGDD`|x@hk0@WZ z&g6u&VA{vLg{EP+V7V#A$l`Htj;S9fuAp`Rie8A$g#ABxBuuzxn#SQzc_trY>+wXT zsRK{mhD*|?btD(kS(=KhP%A?PlflEl2rUkTMJ0y)aMZum2rU8%$rtYu?OqrS%DR{op^lm_s zJCJlFj^T-4OrHcUyoIC{aV($(dD~1EG-lt1Qd@A_fE19V5YDh~>tKK2@tsiKHaJET z1I6;;+e{`@;)6>Ax88yB_Q5gmWS1!f!V`l-q3~r>BiwMsG>K=sp!BLK?ydbM24!7> zNm(TGQLgwq(+Ghj;>g=36DRIDJ4J1eQ|_2@nYfLZ*bC{4jb3eZw|TY?ipKwQK+So! zACgwcv*EorOdYimb>>+iq!)7|F+9VxH6W9s!->Hqf9vx%Pfc~%0jMf-)W(c|1!Z%^ zyG+3}iobcaX+u84MZ0n6A2W+Iv!w6;*5$#)vY8iH@iWUU zoF8Gs*dftdxqzVp8LEgE9p)Iu5K6~Izk_>S=0Q9=0uf>6>rir@iLfEo+yfFW$_8v5 zWIoHWqmbD`ngCgM%x0V&Vt$P`AB)xgjcL}T8Lbit=4Oz6)+B)K6;l#y4lCTEOrQ72%bEL1Vh7sacZSS6roDK*gE^Ez#?a_3Skl7Wo{7ilxe~Hj zPkrjqQv(X^=6LvKpw)@Vd1f!e!q(tx}h@7{D6s{(97qs(H1l5Ved^f z+hS6t`F)OEz|uUSEyJ=a?xhUU+Bv*=FY&qX^qSiT^RD`0pfbeMQ=88+$hqzg!>Bpt z3ZAf(f{WhS9L9d+TR?AhaOw5UG>qyqDEP`7pLfvh!hu=leLVXd%E!2BVAvA#cZ9M) zc~7Ssru^(S=CzT!<(6I6W5#lGu779{KHp+by8V+*4go|>_ zOE|(`a)J%i)LOI0sPC>BdrM8Sfq2<7 zuoMXY-TZ@|t6Vi%O-9Qj^FvO&Pq(Wu+2TmyAY+{^4*ob{?gC1Gn-MNdv{^y13BjPe zDfWW*PMSMbk0Ky4H^)7sJ&gQ>=eVCCCN(?=vQL>?J{!plSzcq{xPPJG3Ow*D3ckP} zzo8Hk_~UmJ!UKOi0;QHb8sKGjJIrq=Kj9$1jy#&<{=l+E@+}6b4o_W}e9mmd;QDfX zgV0aV{SjDDAo-Cw3U|lJ{W(4N3ytJ2V8wD6To_`_#o}giwm}>~3YiT>IkdVbUzMY@ z;Pz==g4$ou?PXxUDvv~Oy!-=a_1!17WIQk7BE#Cbs&hg|6_m-qiw@vb&#MtIK29q@xzGK4K;87(2xFv7Kxi+r;u%He11#u!U?6dy!3HFR(N=j16FYSU1*z zwPP(hM(3t;flW*(XaiK zjuFoJ2{sna_zArcKJ>>B-S2Nq^bLOlqHFwhi7xloCOY3wsF^U=Pw5z8vOj|81b-OO zG5(rFNBBdC_Vou5UDVC*p|93{H_--u%ESm!e!?6D#jg;R{FH(bn4eHJ{ue*_8~!^# zC13dKeoDUZSNxi_e(fhDl>gjMdl>!`KY3{Ww4c&0{Bb`=^q{(s=x%iZ(VZ&o)A$`K zO7)vEK(^C!>?5-5yQWxzC`p@m3D{xQgsGVRm~(iSIr!lT@Uj#UvHUwV0GZGA}0CNczQ;o-#aMOtLZjyqKh7 zxVM<3V)$_}NyTt$F-gU6V=+m^P_dY#Vz|1PY~0XgG0DczaWN&M^!baaLw%lqAFZGi^^z;2B3H^(Hl7xPmpCqB5c!)k|h3}kP%bi#h`$YukfNTUkn0$!{^0}I2r z?UoNX{J2hCs!9~;V%m{=lzz_X~_ z@-5*QeM+8dV#9FDc{!blWCeU}h+AcO5z2sT2-z>n?_kez`3T4AV8kEtXa=h$$O#a> zOc8MB7jlta93kjFYYGLOEVG|QBhydQf>-hz^FrZOS+Chaz0G6P;b^%kQy@a-$Jfuh z#KvL%SC$YSmfn;XGD55mTTbE!-^qkzHU#Cd+zQ*>mOtiMBZ#Xd*TTuAv`j$wBio-) zXjB@*A-6%v%~)C^cYh5%jQGo7h3ux@mN5U6OhD!_OKm7QB|~wgOk127NGg)+LBdqI z1H?vK_dxOu*@kVW$)&VK-6_w2QNPJMSS*~MAvb}mFIjBRbDZ26(oR`qsLUfd?4NCM zVaOwj9#|ZdgEa=$oVKiiRR-%Im_AYVKt+8^4eb7xTxJwT3c3#P1 zAvUHFHv_e+SReLJ4OTEgvMi9qQG#yIEKO?naIf7$pg>c4tR-ePwyb23HOsOA>v}BT zFxCnp(9#my`Ydl4#Z*Ceq$SczR)(V*S)5vqhi^fjwoqCo$KdrtmX-`B)w0~s3u&}_ zg1CB)04o=?#|t>I4LzFxRTVM;X0a9m%-TayQ%h}BYFl1qnBChF$sqp+IStlWEGoe> zmUbYuwNU0k$0vflNpKx_aLt|!*&8ELAiIN@0BPGIM&JvrEt@%(1nMz!5Ttgr48d9L zEOjI{8aH>clrX8|ZoNt&@Fi{AH52j$O+PG>11q~&Y)quoJKqVEFIh5FMq4eI-p#U& zXPq&>u5}-W2l`l2L`D!Na1F3zti?lU$7V|@>IYf=VyqkFjF;oE`4CH*B#seu@3q#X zbCgv#7X#*B*-nU!u>?GF7wW4gT)QsUgpqN7>$uixN1pY9aL*ee{^?Rn~)y#=?iR!z?Hz$XKH$1)l!T-L>y z@Q3VS_;jvC;P{lT^>RzkdEvrUXAK;lWSq@#{{l;YgGj*E!>*dT9MzVZ{@bHff@x0o z{zvz9wC?-RX8NtY zbxSE@gCU}gB{6qlj0CIRu!O*tZI=2*_MxS%b07EbmY-z1y*&{9_vCkndj4YV*(19bWHb@SB;1jh%G z-AGn9@A>5arinva-$p-!Il`wz+c4vMvL09zZ5@f^37T_|m}}Ki!~7V?c`eF|C#MA` zF-SZj?+A>fxVhyV({7K2g4ZoSf?~C_0#f)OOgLltkYnQ@uD+!WCVXo7kY_KTP-dZo z)dVPCqWJ!2SDm!BCPL9oxvypk0#ppOS|DSfWhGJ(!$||1g8RR-G-k$WZz$?yL04Q$ zlg)ajP5b2alhjEB%@5T^|DrZHZJD0}RUK&ao_0Xq#4xM2l`yNU-z-_6Y_Vi&olQk` zi)9fd1u}!Xak(Xpn-^DV6Ehu4(=B##s!OadV8v?|k<(sV%rYR;XpA^1w*cf8 z;xY9P%XX2yh&iQ}>4Xx!ZRw;vJ{D^5*4x0JvN)cNCb^eo6_Q#j92V=XYeZoh4FS@J znG&_Rna#8*oAt&7l`vThc&F!6)>0dg7S+6j_8aodz{Jd=+6hjm?rFC+p4o8ycR3!) zez$DZdRk@?GX&kKI+~b511dCc`2=-3WJg)2i(2sXGGrCWU*VN#YaO1=$IM!my4-U; zt^pGpSU0i-aATr%FeE=_hTIjux?ofN=vw$jL+bG!C#r6iSZTstb~-q@>cEXk$mw4>-U04MIq&6IgiW(A#tkJZd|pl zraFt7NqV;Fq9$4gz-fLpl%DZ;V9iQ%CK56bFdUK{uZNLgZSu4!o=!wZ|O%{aCZ(zaSU zV3&MrKciNHakQz{T?*cR$7<);`rpa^IYo2oTAmfhG9qM+pU%<|1ti23+ zm5Mn23ez}B#4pRNb$M|Mar8EnH{vPVebIW($f@(+etOl)iEq)3U68Ysz&u}t^?jpW zT|h~i=3wt?>wuAWtXG-%4n49LOQnrdQknyoA6q9|1mkAsH7cWBLXmc1=B-=U!++;Dt)i7*F38>^QET_+ts zjkVR4>N-)vyP1$Z)z5*Yt8I?4Bzuyd8Yv)G+SN8qGno^w)$!}FeM4Jg&h%c%By|y? zDC*#VAmDV2ttC5D+{#9}coI%lIXxKM&i1`lLBy9r(OWe=R1RQkh^gD{$qYBe+bIA3 zMGsqJk$nJ#A?`YOcdgCEL;L==QyOwSz(yAIA=-m%*Eq;tWDCMShuI{?KEfLjhA<9k z2v-9m{1^-B+eXoXw#??lS?RWw`n)SvJ?hsAW0_&LpE3qN&d@j<0;x+aHoVcvR)-Vc zC#KF~(jJ?{p*+bp+@KZ4>8}O_Q%iXpZLNcQa zVMx=vFEE;NEZP{^mrUGcdsiEF23Br})Mi1)e+KPW+DZdcsXgD@I|f(W~<29&&MtBsx4+fEqRR}eSI+46r3 zVjhR|m{~8-zet?m z*stY&_-~8+EZo)aIqbW4DIGxzzQ=8MoOgQS2t$>LY^yv3c{<+csD%(aI zFf3TP!HN$kRKPI(8{1mKr0<0)eq46Nwm>UB?Df!E6Sg+z+}QYtQprKhTFTd2Z$Cn> zU#*|vnc7NA1`C1SSo6JYCLpicwk0OY@+)WkY>Y=qVQ1Pz9Zow55}+cBQq z#XsW|kwfD{+aHYG!#|rV6vGDp%XXXN`1?@aT0u;f6xy?mcxvl|6aTPnU>yGdQuPY0 z#E)&Yd5*7yf)|A(Q2w%ILFyfOIF-vN-_q+19^n>!e#K*wZ4rkXzp^a|sM>GU zlFmVrGhyTW@33%b*e8@p&uDC~iTm3r19(Qojnl+hST9l8EeTXlcKq+SVw}`*lB8mk9sL4g0JCZUwab7qxFO8m9YWVn=3ZZT!0|L$^P2yceUH!aFpow z*#!(6sC>r}ynS*o-7D#@NEkcQevM&+VaivGknWSiwRb+Sc7cUPMlQkFwsw-O1Y7}=yIg8g`+ z--h{1l~hh7luK}c+D)8GDSu@dA>^?6vh6cyaNqhSJPlRm!Q4Yif9$ead5;lZuJjcf z!+Y0kA46G{bqIWpN~63;#SN1lT1~h)M|puG99`2SAWfP8HQ!af&8w}PfttTr>*w9F z$+#d-S;i=5pbQo%E3jUntbiBZdu*luY|{SY!_^-tFS0z&)*Vk4D4n#*$JK&uAq!{@ zkmjt#MsLwxkp)wMkV0FRklYM~!rxbwbevnLtl(KFEL^3WhR_GriMW5Yl0vJ||G{-E zt69xA5Z_DT(L?Kdc>Q%Pc=|8?Z?UldV+4y?z#ib~?^Y8e3>JF>jpV5|kKvFtL=49# z^%PoG?{8EbEHF5@-cX5yCLbu}R4e(!8i&Tl%1j0|wko%@@y?>+%72eIiNn=rmEC&1 zon~(Z?VziaR|3iB9 z$Y{8#Jmy$kEFGl81fs&0n9A&V0i&n~rNhYX+rMw!fMK^ZQ>YK6qZBWOM%q=X4ViD> zPV^^bgr3qSo2!&&Olo+{(IX4w2dfVCW@{HiBQTBV#_9JU+D3t80@ko-r zrv_5REoQ#l)!!K4-CdqwD4FP`%x+Cf0~j&G69y$~d~S&C87biYPWAx?))8`6ij$#a zf|82od)cXkqf@n4T#W-$?E5&@`MD!Ra)gJdZfTHG7mEjJe0PEPlbVxTF-I^~!~o?pyp&;Y#IxQQF+?$ONS#uFbK?8f<%DKZ zbA2#kgpx^D+S^N@&xh7_keFyMf{bP2Y`8DkWAOCL_Rj?|h)N|UYVk`a_%6#HX&iEL zgx@FVp2kDLI7KTU6p{~3@>3=4k3*l$E#{Y7XK8zIp*ww2o|lDT&2npV3T%H3YC^k) zONs_e2>qZihQP!=hpqoP;nkj<(t$dmKO}vlOu>xT>{O;O07?hi|Meg9-uiX>Sq<4L zY^$|XY7K=m72Fs+Uutc_!Kj;@5t6@Gs6r&%{;}5BAS@kek7xg(6w*ffpBn6y^pmDs zo9s6=cwN|TCr3D(sxfTj#`oCUN@55Fi?mE~&JOtWko^=hrmmUluOaBRrfL@xK}LIR z*KKOVpJQ3u@TM_ z96tWiZV=dbta;o1BEy%i+Gk5F4Da8v+c}Z4LBb?RpH8t8-QFdM5rXbJD!JvHLm+J> zLAP4?OK^yzK4etcbB$ASr}(La_iZX<)gCEqX8ya*WA69%LLpXb|2Fp*|%|oHkFlA@Cx%UIcnm^NsiYU^cd>U@Ejon>^?`k z!-)<`No1lu#1YA3ZG+>gz-D0FDcfcq3T%$iY$nE?w%Hgu?T$*0&C(*{=AaC6e2X>Q zj@ul232zT|5Rw@Z?D&D{XUDc`(aZ#y7P&Dr?&jElWg(8HJez~J(;c-L){k)T5{p7A zg*?cN^N!B*M+&;1sh0R}S%g)~B2TOC6kev1B*$W-R&o4YeDzb5RT$^kPr!|^z~9bK z)y7Mn9l6QkoPnC)n`|MdPfazT@(%5)lyeRdlVyj2VcXUY!WalxN^yM1@Jzg;4FOA7 zHPG<^(}dHGV=7b)btJA!beOPDC&yu)`Jrm0;{*J-o1>k95T)$vRw^h+cD%{6rC|HR z{vw_~Ya`owFx_E?YfeXGKt4$F`I)h0V0&V(1ljBO1$KYsFhaYTj!l@~$uT1kExiI& zRa9bDe}rSTB-R#mSH?UaA<_s-Igyfb!U`zmouP2-j#b7+6C9U#D)20=Ed*oCX`7vc z%CF2`c<`B{CWH=fEWz8;95onw?Kv;nT&3Z=8IEo|TLtA_M@)bhBwlD0Sq#viy*zr_+m3X46&hH$rVfGTo44%CX zRks~2u+4JE8D5_|wnbd*7_?k+3}Z0uq(i|Os~p)Jx3($d%yL9xgUgOy3}@sxvh^$v z?_Z1xVHm!_ag)lkAg6`13@>hS#PDoAaN6%X zw)5tVqp6CnXgaW_e(e2%c`KwUo-gny@PP-z{=jBW&Eebjs1l zKxmi!S`eLc`I`eW-t7>x%rWSH^!EZU?uc#KI*v*iZEmf%i&%Bh;o#X@n5j6IGkoo9 z$83(hjhQZIcMf}Ba}FB|;y?Ehu2i20=K5`J8`_r!u zD!1JS7xEl*Xzq81$tY6U`;C`Do#0%fEn&rlHT;d>JabMG3*U|MH^g|(`92eO(ybzb z!?crmf|Kge4nTGYRqG|UcZzW2f}>kN3P@7##Iu7~a>qfw@;VI{DvvwP{|ASCt4BJhhZRa@Q~7RM zLnjq$zlS+r*s1ueti51^jCz6x!j?OCL;IG_Q|ts}HgPtALWAsv?2*ph_-iYtg(oEJ zMwN%^ecCyx-lqg2UU4^v)Le4`q}d3Jp+do>(5HuU7s&0Mc9gn1KM8o7QYd)aL7UP} zPCAVFK9r|8={RFICmm<}0OLA4FHlw3eybPujdzAX#VQZg=Js=Lhssw>Hh4MM9BJtn z-eG9?#IbFutUx#gPx?8#WA9`q81*p};lo6v>2n0)`s4J#$F$9Jo`n2{ybBXsI6DwT zGRqlFTVHjnkZcB#N6COmO;n@gsWc6GB~`T`_T-vnM5?-f)ybaua9& z>hWj5)35CD@bYw0-A^HIt@A~EDZ}}NB+|ixrxP{(3B*R{H#PUuafTz)HJ0KzDtZvk z(g!2vIlrMK=C6DM+?wtDEg+OKtg7pDGB~^3nE+3tox6+uPM)JW&y@Mj{d|CbApTox zX8jqaWI0J0q*tAPa_n=wG1vJf!xig^8;DusyvQzM#8T&V4wRA3kF*vCYi|*5_NsQ# za=;Of;o!U}P(^3N5obT#yw^#)^k!R}7Z|~2(~F!laCW})LEz-X2`{8nIj2MAGRX=t z#m*hL>K*5coc zra`1E-MLvBKl8wP(|HtkpK%W0G&oJTi4|v@AsmLEchauqJ1Ckd)`W)poi>asbACqE zoDh*93;?o%KCq}|qyhI{bPl4Ex)2wx?^4~xV}`RYJAD#sf!W_Wr!(IpT2h~J&$M{YZ#jkG1|UFAH$iMQ$fdoUlJ zS+MhG=K#n$>a^hCbIw)_Lw|MNVw`Xvs*X8pL*agBdwBPlbA9d9`15VtTj%TT)UWF zc(}W}zZHg=Top{bOU(QX5lvln@mv!ZZD0Q#X}-yE!Y`ow8AX`_#kJ4C3BN*$HQ0&y zr|pku7aZ(*NbUayH~x$YgVnRbO;FjC4P93Bg}TN{ ztPL)x`kpk}T;B!wqh{cbl18%lnuB*e27|7his==xJo_qcwB`mtpGKvUb z%un^S#jILxGgIPPH*3+nS@Wh%n>BBx(}_Az3tcoriLP&W+C<;DPl8A;bKj;sBeCv7%v0S$!6`RYFb{AY(F!@!e{j*M zh;)8!b>AV_VVH{&=>~{6D(-;FDdZBvZ@X9G#F4Iz9Kpvznk!M#wiB9)AZX1tLnP}PTHs*A!88A`9a+e2j= z&qHjU={nC5o>i3KnT9XUbmi~_sugwc(Ehoku6rylo9kLYP!<$5a8t&)#B&$hFL0gG zQ$c6S5_diiixvn}!J`u$n6lih`I@$_-rE12nDUyNvU5-DQBB}Ng6A@3?IRIUHrP!$ zXr1W7lx+7=4&Qs-)rHYszx+vLCS;xTG{F3|t}$ArXX1Ky2_0qlKC&^S9d~I(B%&8? zv?nb}-9$;PmYZCk8d%V}q)1=25W3^E?XGp&x!lYJ!uwho`~ukQ;9FzrtL`Nl%p%sn zxbv=zf3UTfu@H#+%vAt|lidoGEigwwnmej7WcP7jhlCn@S1ieKUD8~wNQn@Yrz(^? z?tI+0)^$73YE7^&<$V}?*+ovYEQE{4>!o6EmiLDHGwq!)U^xQC+s9pAqjq57heg`l zy#1G0L#A7kieuJ0ME1##mA3XqH3 zbMZ-%i{mg&^z;jis5a)5cv2YHz)imaP$IU|B;SJJk#Af*1wyN;(%d$h*PU()gx_@C zWcA>Nc9ej$N1?%X=LbUCKE4fPMYwn3r0-oD=zuSlCwRz3Qx#J3ARKQid)ie* z3%^JusUl>ik|PM8WqyI)8|&^3Nn!5yslF>Nj<3QKE8G;EknN>W{>MErFt4p4t~s9v zWOf5Ed6qWim9^bYMkn}^%=>6B7dCb;WpwH|XM=Vr zag+NOi2cTHgO{4RSFw1EYt2d-e%Rcdz_Enf^bezR^TX;;L5DXKr?hg9GU_{#4zCY= zJ_@s@$+RgEld$NDdpiMm|8YuXI;^_sno&JXJ2ZiHfT9Z0uLs|`C`Ft+-d%|Kd)x;C zL+Xf?GhLL!&B%5U5=fpgM|+_Y7TtDBJcO0If6@Nm8H?_^Yq5U{8b2BA9w)Fa7&pQ# zGpXz0NPlMyE7Pj}vCQT9mH@54g+5E;IgviyFulaRm4_|Y+*F&V6T3tDDYshfQwk{B zB$)%roXlD$_Q3Sh?h~{&{w?!60j_&u`ls#)!Wzku06CJsVANrg0W+q#sjjLQBz1Bn zX|9Bh!c5a_o720i9fq*fo-$9A?D3- zPvu!(xS>}l!8YH0%)tJ}&a%I>8Sr|(`xS~qLHP99F`?WtO6gKN{V-yu>pDS!Kk{?} zTPOC%h&`_U?5&<|()pP#xq1}c1EUy#5rr;2AK)E`cPEe$T+v<}2pQKR_f|XaXe}El z4ytw~K1u9B);eBO38NNTi!U6t`MblkZSH+y>XBrBH;8!CJzW}dq>I0+psRwaTlQ{H z@uoXWOs0p2Lfk>Bm?@m;$$vIMNLCRQaJ$2x^aEPQXmYOoV@d)891g0RpN8Q*+!g;A zQJ=twMt~Z`r-9;*TKL@4KcArLLEg~DGZO6M`C>S^*1Z73)5w~jY`iBFvi#;2P_~2& zKRkjTtvxsjN?lM^8;3;SMiEA1rf9O8Q5xQ5^-EAX~WTtCAt~u+bJnI;&>K(W=hx}On z>#oq}6Qg;jD8|MTKBPTSR_UVc+yJ*d(8D;wiQJdTu#UL~VY5r_3nCj2YPQ*n;py%+ z91gtZ-p8l{jodrwONE_9F5eXjh5zkkS*o{0LG1rM1RA3-9fwEK*XxZC7%GTF%Z^M{q&jSVy-cv=` zU%_9I1Q7;eh%(XBlw&VK0gI|ZIX6;f5FS?{q~{m`zg%6)#aYSs%J@llt!GO?mMiG6$VFM>99aKL=b` zJ-FH0LvtbJAZ_$$m=}3APqVYl@Iz+s_W(`5cOV_8rY?T&)! zsh*r_CIS*(889}26zjTEAoZ|GAFzz)Yv52MmO?nf7>nZhI9M>=vlyl|@aTaSIU_-i zo_0K2j8(DjofKpYBY!@kkH@d4?85Z{o^W1VK;vA7IsII116ncnzooV-!0sy$vC?%N z3T>Pb^W#0_7yqpx2dS*B+`-kv$TZIlp1lf5Cp__x_$2aSKu}16O5hAD;$oY`#>U}^ zZk`UjrjUm;>8^yNkBHas93fr{F`H@JDJV_#L>k0CRL3-33os~*;+)d|ns1=_o~`+_ zrSw@11xNJ9Aj~cdr(cpXyRlI6hEXPXn4Y4f{LQ{MwGP)n&USqXWGwP!qq5HHVmM); z=MBcPA!nyP0TQp83=rEm*oaU3K8|d(qqh*0wn2;Fdb;3-@MgRoxA;92{pDa$^Jt2$ zOD=jVaN0{zgojr&@-ET(cpc*U33OV2x#xmGJL-3Twl<0(XkHps#Sto_U!t+RiazTw zy(IBOR0P?p^b_#$29JSwfe4_>F^z*w&zZ|b{}zu* zht45subXzgmEPSf?+b6f#?i}x);2)t3&KN<853W;)AOMqCQ~XeshXq9f%RZ5F|!FW zpSo6plHg3%!k%Nep~y3dW1FF1sD~!^kT$tnAg&ir*@q*ZTRee}Rekh63_0%kLBk#6 zCyoh3oHqXcu;7g6L*qL*%imAXJqRGC9bxrZPn5LnKx2Q3hLLL3 zr9kVy5x7r0e~E7pGjBdiJt+fyGK5(Kg7f!!!g2hko=qA|8Mn^!^liS}!?PU_x50z> z?nMuw(r-cBW)E%kzVgsk?`?=H@X+s6T=5VpN`*o@Jo9j2g=eXO?ZVVb50wUf@}sAf zo)E^uAwhI3w$k&RfzZUHanV%A_q%7gB+?1HigBQx@pJ`&dBco_>w5VI(uOxwyVeah zR5|Mea20%qc?WUgUShil(%T7dW7$Ao1;dqk?;J+xVnjWCbI8BtouKW3=|o+Dz8{3= zc~0X6qnEP32cdL}k03PJOAy*2Sku8v*t2I?Sg6TP4LJ>Qg>F`A1Ctj+ZF-wObdxt&~E<|~oQ7K;fI_<6hRvVJKPCNz$ z9lfcLmM+LRy{>ny1~2A3^tOlkZf^&8@HIaTF1x)`F|CoeM9+p`L^H30Gro7Qp`Y-m z??*lp%>A{#TDY@?cQ6x+sm&8mRo~tZ3q!mEIo#dGJA@I)s2aU}uwOfGkp?oV7H<=5 zk?1|gGXfId(MMt8Tr4uVbHaURe@{(y>-s_3#@%D>}O})l12Z4@d@|Le&e(0KEQ^kABD{qoyyL<<+CK zODy`z;Chliu#G+kySS?;Z59K@bZ$sK( zZw>rtjyGPb)XVHCkTK5pk};M+Rg36XaAlTvlR-Pg^Fz-7Q%G~NmK=F2M~Jqoyt?)Lm13wEJH`%GbWn@yoT|hI9g*eo4{rA!P#zs7D`f8Z0?LanSnh-pK|!ZC-v+nW^bgGN0!VT4}vp z!SqQ{TdAp=yc=WJdp;!xT+YweZe4|RPY@wshrCoPdkxcH)SfF*INJJFdRJlJV_pL5 zuR~QWcQ7go%##^j52a)_mQD0^X2m7+yC&?$vp~0^!n>2gew$DWD_489E%tA`UhCpp zWUYM%X*l8D_bIgKq<=-bdJ{7bc-PQ0Cinu~hXxkw?=Z8Nu44FhUr!FG_eky8TbOw) zaCN7TVpC$^ws!S<%sipBaQ;_sC+t?@t;ZE#@eUKTBSv@W_t3}zJ)2Vu5ApWVvh(6? z3ff0%L3>9iIpdLlraVHsPNjw7kN?TK<}HxC1PPmN_Al=?JtscE%n;uiK41ccPrY@GC;kj61)jCl3@xJ|FGa}4dsd&D?*4+Av0DGLDP@xU$UC^$tWeC?-#v8$)Bi>^DUy1*FJi3TiJ7>;b5aDVMor82 zR-$cQ)Do((>ggLmN9)Ob=F^Y(dDCI@RNpdO+1n=?SUTnm@J;3Q;$QTx9x_*Z2ZJ(O zxci*_fJC*RN^gM7*S&rIL$=QXBvO`ZP;uFJO?yUy%sg5uXiQ7#XZ_&DT=V(=<@Coe zD#g9Az#K-uFPTrV5-}RDS%BUQ%&zZR?eCv4jKuItgGf8eKW6-gEdtr%FQgoLI{&J- zk_9N8fL#71tU1?rOM`1~6zJoSmiY>TNuqoe)k-j2>q&tdJM<7x2dHc;)W`c-J~y4w z2bF%R1C%kosZg=SlY(8A`rhN116a%dtG6!?tFqeu_dU~l4hTXbaHe-UN5v6P6mbH| z$}u@kX*od7<^X7^T?gb?X`!K*%ghWc&CCHyS(aK*)-|swG?>@Ch1o4jOK7yg`hE6` z*{$FG{`GyHZ_mSPd!N16T6^vN?!Di&KWpvai=4AP@$Ekrsk;RoAUAJxx2EKOCTyoH zcS28&T$M<&@ND}b^184jIa|Fns(7NU*>~51DPqiv8Kte5OB`4v9Pw1q*M=|#8xqF~ z0AkI;_%V$6VjBR6R5Q-@D&@apbz#J~8-PMgG*O7l7A1U-+4H_gyrF%sCY}=Fc(`Ci zqGF|8f5-HZ`Dx4*tSyZXHzwW$^Vk!Z z7DcYgjlsly_{KPiHKFJx#B_@OTf#uPd?j(C_*tX6C*px$t4;*+K&LemaXN?zX|crh ziz5>)g8wMV!0H*l+2o5)@Chwts@jt{ka8VvK;1h!ZB@q;pK;hH1HRYvx(kiCOpW-! zqBUmM2*4MAu==m90+>qYaP@nTQ)+|or;Z|O7?E&4XKqe}IZg{En0pCFTWb8m-ihni zCulfr`qO6pPhS$T0fV%$3F38jBysi)*l$qvw!|5XtqIPl#+*;wA+_Uk-5og1Xt->R zq4EWB2|V!MiCF95OL%eV_3p)5kFhw5x?WB^ZV!T7N7_5zHb}fgvw^~BOuPk_TcO&u z60iR*ah65uOfm0T7x1Dhi4R((WDfO91pEkn2yeI)4)w=+aJ>gNb6bo1ti%;p5@6~s zKbz2;6YOrc41`i@bN30Wy#pAgalt1E8=>Sk6CS0mE#0-i9WLvWu$I@yxnURUPRp_r zYB{GU-f7{p9ygG4>74ha6)tUIzq`mH_29ZbHm`;1Pe;JR#{2lxV0R}0F02{lPN3dH-3REl5$@64A>>Y!?Kp3F+1xPS z%&SJbVa5Ou5EISGweH0TSn6IV@!*+mhxtDA#|e{rb%YJC_kPmj;$-?Qc`wI4=Uds5yzD~-NUVLOI`DT2i|Oz?klpCE*&>W5O6G)#Ht8(WC_uJO> z+ae+bja-tf9t_TEcbU^(hzP~Wf0pnLYy}*5ZE_bE2yg8_eq%_#5AfQ{?lxlHgkP#- zA}@~eEXCOn;npfS;$@QfNkq0|5!uev5sZHeJunG=w8NdkH=S}QqkwDTkqe)qnD0a+x()~xwGpE|>%)j3P4IZ`s&aa!nNEt; zH~*nEs!#W*uDP2Ni{YtwsM{Yu{K5AU<)(W&Q9}z)3%iK_Ft2H^Rr;lSCf2)aKQ+Iu zWLQ@3q0~X1ldSagd<@6A>#^Y|Yg%lk5cOV49qKtrl`*kx{wgU$QaHjcxXz;=PT~v? z4(=8TqS!tJJ=i|nCn&tkuO@l2MGVK(;hrQ)wnzSr)KA?b`InBK1+s9GJZ?t#&7|KI zS!;1E-kw|x(_t-8Z{n>n$Gy;jeLe(R!l`H7C$S%5ya>+i{c8INLLabG69ba(N{As)b&mvi2;?)xQP z8G=lX;`{J%KIlJKW6%OceTU}(*8^MH6fcCQ?X@_pzrTH?56dVgkmr&$EQ) zyaSuz7t=lXuz$EL&yz{{PsPcIf~Wx9yV(}W<7axd%F-$h-Qd|HiTCFm{X6JcM)jv6 zo}_*AJwv6{9E$hY;rh7H1J}n#DAeAA1pW?-c{|ck-^*#sT2rk*|nJd|0Uc&-oEBD}= z_%Xnf#lIWjui*ixcoRa$i}Vvzc@Xn)(moI14V!82MN3!Uu&{w2c);_bFt+V|!PS!b ztZV7#v_qb^Wyjx|S(h~X8{8u2MBM*y_b>nw53PrJP4KUs9^vAlA^#prgrj2nl;WlE z8@|@-kT-$O{@oK0W;Vwb+Vi+FggYGdm>z77rzrU`KkR!kzE7+c2k?MT_b<6j;9SRYUNGgI}&}{k+qF)}b66Av>`Ddx|vvyoy(Jb{G=@-3mlvUz& zQ~i9uM)hHD3}>$Mnei4KI}ujTKZkNJd7AUmG+!7*cEOFnKZl2W>se*4_`7M%XDBj$ znb*M`m;237&5k`(H_59~>uK7s=b#Qui#xhG1c3J zQ*7QHW|`;djO=YgwH00iFbJ=Rb514%yGhv4^)D(ZEYA7HkzzIUw-2X{@G5Ja zf6DdFTW1n`lL~(DU?a2L_ZsRQ!x5pVXY-!0(EjiJzlyo(ALN?pP2!G~zEdc2obvYj zfM(q1`zKOwQSDqWj<+^?qo@JyUetG)0>p%(blE>pnQn48L3z*lu;?xHI_dI!Z!BdM zdJ}o@A#{?(agyp5V$7Eoc%!L7R$^%Geck|N-Rn)HhC*)wk8&#GOe(chyA+IyE_zV+ zh*`IeVsB8O#iOPc-=^9JQ9wKDi$H7&-w_ahhZ_Is$6lh=_Zd>}(wZ_q1b^2Q{5_Jc z`T?Cj?K_I!PLU)jFh-sA?MCW-s(oCLD)jm|r{4EGvQAT-tcd9Brg~w3>!kFdhGYo5 zzuc>G{srG!lsbb`D4~tD-VQwBk~vC05b6qW+XmkUC~%fygZ{SM;alJPNc{`JNm0C% zz41KoithljKBQU}S^K?q&iKXmCbD3HtHg8>^O`q)f0|zmpL$yM8bs4U<9)cg|ZL2d538f`0+B;P4;>z7nOKumj4B0HBjwuAd%DPO=qPy_!H z3I6^T$M+mcG-+-1wx7MWt6 zC(QF*M5c{HIU;jrYhNV2{J8&S$X0h>p(0&rM9UK}ha#Fma%u^^Mb7-u{IpY;m zx8gHgJyKJrz%D2|Ih1SGo*|e_YGUG|&?Fx^d8hv!E9_XIX=aH+LH`BNkL1uylNx4y z!mMvf+nhuBW@a)n#}CBhmOjtt5h6!%XrB4Y?@It-2~fl@(HvS}{(_Z&uo9SrS^&>1 zGRw2Q5p?+P{#&FNfSEG)Z?xZ+jIqyf%V?$Fqp7jxC`rD>-0zBu; z^p&P`B8SRNA`=9WUz#%AtmmT8qbXjKriUuVc>z@{@#k51^VfbH^LkmICdi~!Hnqpc z`b_V6eAN|t-BmyPtr9F+dcG*}`T;m>XzOmL-eJ}`T~)usftJLk`BYL ztg*gGWQj$<)ul_1RCt5QI_pIu^UdTYh6d})&3ae}2n&H2)pCIK6(Y0zi>7u2SuYXk z`}T`<%d51MTC-j%a*8(M4eoW?7Y`7d+$JTX3x%%w`*1%^dBrLrAlwF%HdY2Z;P`S9 z>zhPI+9yrS+p%6Q(&cjn-DJ>h&-&9Q-NGi7bpXynr0;yPDczCuo!+ZBCs8aS_FG*g z)&fs&<#VglnL}614)}dRAS?)pqBY5^9{`O<)BI*Hq>z5dJAo(mSIVtYDuNjZ`eHd~ zk=8XLbz;h7OjD_-)`j&W;-|FcP4&96epIAWs=Ri3WVYg@hT9==8tcbJwk9`8*p2mC zvsz+PweGCHE7D>Oh)qXtMVK7YQ{ZhUr<496Mq=$`Ov{*?Wgap~sj|XgrJwb}5vAL7 z1<>6L*6Rg@%O5sz=!tugL|Uu~k*VoZgv_ATi}ed8aD%NQ;$$urkC7UG!nS z!OT3>M5{0B--`5}BA=Zydiza17d$Z<0r&X2@V`X*(!?6BFJ-Cr}8&Nb+` z;AE;Zf_`3skXLJ;R!%mTcRjGXb=YceR&sU-rEXI)Y3EjDk^R=PTf-JOrYmnt_I@A- ztJZb}A2|cqwp08&kdGZx;0ROwva*`W-^6P9(_Y18kp|ITR#eVftybe0XR5l0s#)=I zN|j>Th2_CqFjn1X;R7!zgCxN8vMLpU>Q$byO1Dv{Qt3=Nl}aC;Q?1}Qdnl)B+DR;b zRZ1tJ+Z?tX70g4l_jzS1H5^mM2(}Iw9;?627S8z;H0IE6N#BXarTTl1yihDMr%|Xj>v*KCHxA_}CdGL-@MZ zRVhJ1rUd6CwTg|udQ|}k2|}6%WO)>)E>i0({NBe(X9=FIrYt!}lwKCv`Llv^o_Z z*FxO_?42z}MZZnNH7ryFtw)tx;_w2uA!j_Tp?-o<@TQsH1solKKpAcziBSQ!%S{*7{M-`^wFv6{#ac zu^HIFXozrMeMJp%VXC^u0%%_BI`yca-hrV#mnrW|AzLcs{fC*H#i2{eB+LPdDh|-( z*+LhF5Pc^KGz;&Py~k zb&n7!?z)DZLd<(bUKgRW!vE-BQK!(XGoQ{KQ7(%9Z7{q3KYEuMZdTtFG!_5^tp=#5 zjjHm?t<@VXLeaDMyBTV*Z@5{a3GbP_i#RK2G8xds zWEo}cQW3baL_GoDUe2ypUoi!{!5m3~PFQdhC*tZ=)*n?rhNVvAz^%fsRU`C&jnc-X zd_TvIRxg{Cg*8xqV1GzOTvhEU^}O_;kfpVdrLQ?29uoytn93nFpq^_Q4>3{NX|um^ zk4vNq2C3TZ5*O@J*IJ~9C@)66EOdyNfvEhjkRe4-JZFy9{#5zC>f$L?>J#wx<=6|# zuacNvx`}oe;{V!-e#H%6sJx0}HFcDQ%a17A%#77Sl!WVpLx6teN8lx(7K$Mq&5Jc{ zk;xXJ-S;Uk5~deiGs8`<`wG#7Xny|-wH*$bW7K|(*S{s8b+o&+crA~sFHj|dT++qM zkg)bE6(@~FU9?0#aze$e1ZxHF4AByoIYwSGB`O2DK*Jk_;bAsyxNTiVY8N1%)uGnE zv`e(Gy^#1(K}km|J}_ln&vl*DWb-{hoV1VC7jW*)(Bc~~cbbi=R+3D0Z@8|@e*std z-<#G^g0FF7jbb(~28hB)HHI+W>xAJs;S zMSg;7eo``V=Gj9%Y|67)$m2sh@Et8bDH1(}dXB+(tEg8*OUpUCqdLeON_$1Rf@>n6 z%j;e8#|&Hu23x2m8k2C=40S(`iPfG()>E|Xb>*}ePA14)ep;x`{l{<`#yKACdC4Mg zWvxm`I)~g&f5hcm5L^-NjxY?W3=E|(rc7e|8*8&%pxXg zMczS`$5jMri&BfssgN$kXtQ}k7i|WFc#iXCs!w7|_@XjSG9nxC>BK&{dtAbEDMhOk=l^Hecgg8?E(g8@Q*f$FDfh{POe!5vqlwN{)l0?WKb z-bd5sY8$9@2?Xj?twr*#(b`Dl12Z@S0tqx1OZ^3qKv8iisLbchj`JY^)5xa@8+TG;2U5n!K1=?N6KTKB_YCWiOm=?jeEYc2Ht@6v=sc{&ZZ7OTm zcuk|)J2Zv4BT z!o62u`(cr5a2=Z|(yJ5;-EsR;%a+Kb2nh%ie~+W=}7`E?ro z6lA-)1DemR)VgzcleQH3Z@@%v()&BTQmGkKz6rhh$PUfLy`Kg{mwdEa_sQvLX=zk& zP)p{X+cg;5_bDx&2UVKm_#agJ06OC2X1g8Ns$gU! z?bFVn=y6)}1h`;K$yC1sdP+ZlZGlBbBtO<*$~vUMlqH{_&v$CD^HpmwP|7E1%`gd& z&?DNb*5-0;&%Ar{rq9f~YvyFq-qGU9iYiv{j-%RWl&qtgh(vv* zQ`{MPsHNbufG6wvV-|-Dr(*dtY+j6ml+)XoK_89RH}l_H>%Bno0^N3ApTz}9`W%Xho=&#B42ppFW5zLnI$t*n? zt@;90FH>r6@LfLLPj3(D8fZWTQE68La1G zczj)0IC=KG3G=4Uf~zX)tvHaQk9XN|n2W{pR#kD{u3B{kHG8tExf5vpM>MF^XN^;Fo);Q(?2p--XAEtlYyZ*Nr#P7 zzQSwn(-HI`db<8CMgt6dQHBV~RiJ+jT0c{f+kl(;JpEZ&iiRCTKO#lQS2x+i*a95@ zc&b5P#$di$a>(!~mVc$}!+J}~zsJa;OI@L_p%xwfWl;SjZdj(@0Fu8^OKEas8e=pJD3}K-PkMS{oTB^f@gT2;DeHhi>k8`}- z&uljSMKNqR=KfqC#Lqvfhb)qf@-pCj`$%1+oz(hRC+BX^@yTf~Yy1khlr1_waPlA5 zXY#$9^{aM!3tO`fK<(qxFMz z%ma!slA?y_xBVdr9lxOG(C#7lb?GTRjb6E;jo{k7`Zo?6tOc(KG?zKVTLZD+Y`!%k zjO$*H%@?d+7qEUOj6P2IjG{Xk-C2fpe!eAA8ld;Ml1*Gwq}{KQ{83gf>nsT8v6&r$tkqk?i;=`v3^ zr^5v=K@9Fw6zw&R@zej-Cs=?)6EQo?9%|B+e=Y7$%37$8;O?L6+hiL|W5>l!*qMyC zzTRRNH(YqdJDQ9+L$9?;K8oF`KgLh|qE8WF@$v@i*_72wzngxiw3y0I=`9&*o+xpg z)#z%s!#w>|lo*dkg^ty&IpH{4vwyS}Z8>Y|*n@1~(W3Nm>$~cEI3~*Y#sTbEW1)cq zm^cGqPVxqsECifU#|juOfAjY%7%0 z4aar8jR0bM>UU6SiH^Q3)Nf$!BgSXS$9hLf9BJH3PuA!u{PIX+xp)tqNu-zRuXAm- zF%Ui}Vo*0^=snFYVRXp=i4OKN#Fvh<9XIwfaGEGD}`#>Dco6L;-a6c{t?8IR|Nfh8|Aa64Q# zNY_(HhoCa^jEh!RuauPTrpFV`Wb`Z^yue^t>O-OKPQ<6naW3SwMMi?l=DQws16OND z@x_%!oF%Ham@r0KEMnT&L(RX{cf1grb(^%*xjUSNtY^Y~@O&!V6VFG(8F;P@!(G7n zNLWa*GMt9zgJD>ho%e@fdUh@k!+Y6T9L7Bs&Z2N9Jns#6#B*-A9iCIeNq9~Sx5o3% zuz}}@uo!?hhc!I2!wQ~RVLzTr`-XvxboK}%;G#46|NcsurNv8ddh@@&QpPbrTu9`& zxp)Si*~JKe=IB{G4bLvcQ}JwH48yM@Pz;l;Bd&N7p3RHz!qZl~6!v-hcg4AQepU?h zm%XldES|@T$KZLW7;rQDp5jq>Rulu$X5UzxgJ)UsP&`YDajAoSdGQcD=M@je^Y&uE z@$9!0--2gmaX&n}72kws=i(dj)QYq5bQNbJn#Rw?z45$K+;e@2(a#PO`Rcz3!)*^< zR$_c*!)ZhQ8UyB_n`ll7V$vq9Gk_oIN6(R%_BI%A%W|_xxS+Y&Bp^jbI}f5;ZOwi# z0fXIm#8<|1fEGTkhE)!2F?LG=nCQHfBo~$mU#)>}(EfZ!bO7OLj(=yQS?GiJjU;IR z6_m#Vk#QkzlkiXmHn(NqYsz14dzNzEj*H-NXN+yQG>{6Oj&CVkuG?|eS>rXUG>Gr; z1h!!jS{&!#%5%nW1UuyF8haM-bMLpp1vZ}=cL@uE^EOKDWX%==oRL`l+W16*Ew^Hc z4S=GYXv;_%Q)G)10;O93T+Ch-_s_pbK#<@g%KO>a0$Xpz1Gbj*)d$86RJ%70+mo|K z0b*J_WD{ThPMCV%kL!SYUIQcdFAprWO2b*25$^)XZ(!UC&i}VjAhAOZ{A63d9Fw%I z#M0a1Jm?GSK%OFs+-PSvUU$jBJ;vx)=csKD#$j0<9yi*Ib;5T?1vXe(awHa$KjtHj6ZY8^1SNNPm{~KYCo~8%WP)&RlBz z$;hYP9~c06T$8&*m?oTXtNzsp3D;ol&$5^QF&=zo3*l*P34oc|5`<@nkvOw&;Gir* z_mvGPljJUxdP`uxYx0AW!mu_!0$+Xf0|jplq}nIF=m-Zyc$y5+n9NYTzRP@>5b z?@nqvFSRYjo{MeCYD^He8RrIClqUm|7#CbGTbvtlnh~E#oyNGU+3FAeX0bRQ$EBS? zm}{JysDH~ieBCtKTs$EddDqgZQe@f zTEqJ;Yj^x1>>g*e1TOl31J3FHKfw_e=e9q$BkXeYu{A5r?nYXE@J4Z&s3tD9+qJ!G z7^efZcX#{sx8HuFf~n4Qx_4BtU6gbC#zA4kvD)wL2CqLM4?&(EMXx`Nzh^0LrL!GX z*F>~wy2O}qi7~7RPCykYQlmK?BfIkLV}s8@)z9&=dyJq&PmafDOmbfE9TeM1%gSBd zMC{eK*fBX66KT(~H7iCGlKkK*5fZYw^Df&m+(H=6 Date: Mon, 7 Jun 2021 15:28:33 +0000 Subject: [PATCH 51/70] Fix a buffer overrun in fts3 that could occur when handling corrupt records and '^' queries. FossilOrigin-Name: 9d0b6b0f42a47a3892ebc765250756fb8b844e8399d992a8b65f55af3800ea06 --- ext/fts3/fts3_write.c | 2 +- manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 219 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 229 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 544e23addd..c2e6bbcbd5 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -3003,7 +3003,7 @@ int sqlite3Fts3SegReaderStep( nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); - rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist); + rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist+FTS3_NODE_PADDING); if( rc ) return rc; if( isFirst ){ diff --git a/manifest b/manifest index cac7421592..259dabecaf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\srecent\sdbsqlfuzz\stest\scases\sto\stest/fuzzdata8.db. -D 2021-06-07T14:21:03.109 +C Fix\sa\sbuffer\soverrun\sin\sfts3\sthat\scould\soccur\swhen\shandling\scorrupt\srecords\sand\s'^'\squeries. +D 2021-06-07T15:28:33.462 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -102,7 +102,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c de426ff05c1c2e7bce161cf6b706638419c3a1d9c2667de9cb9dc0458c18e226 F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c aa751c4559a0d1b885206c5f4421c5b34a8ec7ea3d3d04127b7747a5a83a2f4e +F ext/fts3/fts3_write.c b0441839fd34bc23cce2e1bcdfb9489f716ff6ee0ef24308cea70ddfb5f14162 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -972,7 +972,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 79a32ffdcd5254e2f7fa121d9656e61949ad049c3c6554229911b7ceac37c9c6 F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 2b61991318db59b3c569d630660c4df0f22b0b2fe59f3bfbc111863b3bda6f14 +F test/fts3corrupt4.test 1b3333822577b0888c95de8490a1a6152c47cb33a763fe62c54825202c31812f F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 F test/fts3corrupt6.test d274f139ec173392002c768631f404fefc007ae02ffa1b03d8cbd096c3fc00f9 F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 35e40d75754ec6fb93fe57c6ecbe731104e77c997d7e17ef1a22984837dfcab2 -R 937e997f3be9ea2e638b1b3d5bddd533 -U drh -Z 8e18d53031185b37081375f301b82b09 +P 162022003c2b4a393296939e2616bd3c7bbfd65b198ba6c9894e4234de2d3122 +R 0d5e4bee21661798cf35b466387af9ed +U dan +Z d0ffcf2b467dcfb0c9a83ba45df381bb diff --git a/manifest.uuid b/manifest.uuid index a3b6506419..6e28d90e4b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -162022003c2b4a393296939e2616bd3c7bbfd65b198ba6c9894e4234de2d3122 \ No newline at end of file +9d0b6b0f42a47a3892ebc765250756fb8b844e8399d992a8b65f55af3800ea06 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 51016ab19c..044fd4e64d 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -6587,6 +6587,225 @@ do_catchsql_test 49.1 { SELECT matchinfo(t1,'pcx') IS NULL FROM t1 WHERE t1 MATCH 'f*e*'; } {0 0} +#------------------------------------------------------------------------- +# +reset_db +do_test 50.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-14ab65782c9c45.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 68 64 69 72 egdir_1t1_sehdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 62 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'b1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 00 00 00 00 00 00 00 00 00 ................ +| 2880: 00 00 00 00 00 00 00 00 81 f9 25 06 00 82 7f 00 ..........%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 37 a0 30 30 30 30 f2 30 20 4f 4d 49 54 20 4c =7.0000.0 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 54 53 41 46 45 3d ..%..THREATSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 5c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT .OAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 46 1e 1f 05 00 33 0f 17 ONXNOCASF....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 44 52 49 4d 1f 1e 05 00 33 0f 19 IONXRDRIM....3.. +| 3264: 4d 41 68 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAh MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 16 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 43 53 59 53 35 58 42 49 NABLE MECSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 46 20 46 54 53 34 58 52 54 52 49 4d 1e ABLF FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 55 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d UAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 00 00 00 00 00 00 00 00 9XNOCASE........ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 38 70 69 ...........co8pi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 52 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 Rstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 01 .enable?........ +| 3488: ff f1 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 03 00 01 01 00 02 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 12 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 04 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 0b 01 13 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 83 6f 6e 31 ...........j.on1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 00 00 00 00 ity-check....... +| end crash-14ab65782c9c45.db +}]} {} + +do_execsql_test 50.1 { + SELECT NULL FROM t1 WHERE t1 MATCH '"^enable"' +} { + {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} +} + + finish_test From bc85a51595d8afb0f82b3723050f0a6faa6082bc Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 7 Jun 2021 17:36:57 +0000 Subject: [PATCH 52/70] Fix a buffer overread that could occur in fts5 when handling corrupt records. FossilOrigin-Name: 078962a2164a784b135bacee51ef10973dc2e30de04353d48698d0e72edd63d8 --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5corrupt3.test | 212 ++++++++++++++++++++++++++++++++ manifest | 14 +-- manifest.uuid | 2 +- 4 files changed, 221 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index b66e9bece4..59650158c1 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3183,7 +3183,7 @@ static void fts5IndexExtractColset( } fts5BufferSafeAppendBlob(&pIter->poslist, aCopy, p-aCopy); } - if( p==pEnd ){ + if( p>=pEnd ){ pIter->base.pData = pIter->poslist.p; pIter->base.nData = pIter->poslist.n; return; diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 4796f2c489..467bcda030 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -14922,6 +14922,218 @@ do_catchsql_test 76.1 { SELECT * FROM t4; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 77.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-53216796d7c3d8.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 06 40 00 00 06 .....@ ....@... +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 35 07 17 1b 1b 01 81 01 74 61 62 6c WIDU5.......tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 00 00 00 00 00 00 00 00 00 00 00 00 ...m............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 82 d0 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 81 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f fc 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 00 f2 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 18 ea 00 ....is.......... +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 12 10 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 2f ff ff f0 11 02 01 ........./...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0d 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 01 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 e7 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 01 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 02 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 7f 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 03 .V.M.A.8./.&.... +| 64: 0f 0a 0f 00 9e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 18 04 01 10 01 02 32 74 1a 08 04 01 10 01 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 0f 01 02 31 6e 12 0a ...1t.......1n.. +| 3888: d4 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 1e 61 30 66 74 04 05 04 09 0c 01 02 .....a0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 03 03 02 01 da 03 02 02 01 02 00 00 00 00 ................ +| end crash-53216796d7c3d8.db +}]} {} + +do_catchsql_test 77.1 { + UPDATE t1 SET B =quote(zeroblob(200)) WHERE b MATCH 'threa*thrad*tlrad*the�d'; +} {1 {database disk image is malformed}} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 259dabecaf..818c477169 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverrun\sin\sfts3\sthat\scould\soccur\swhen\shandling\scorrupt\srecords\sand\s'^'\squeries. -D 2021-06-07T15:28:33.462 +C Fix\sa\sbuffer\soverread\sthat\scould\soccur\sin\sfts5\swhen\shandling\scorrupt\srecords. +D 2021-06-07T17:36:57.686 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -119,7 +119,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 9462249a3bb82d0e49b163500f9d2197c2e4cd95bf440a9bbfc3906b22ea1e1b F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c 222b5e56f51139ca5400985e26ea9971165901c7a45a2c17499bd2be3695c697 +F ext/fts5/fts5_index.c a2ce620e1f03c70cede1afcc78c9a82697f0d1c59525f1c3b425d6126885abcf F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -160,7 +160,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 7748c28d0a0c8f00e7741a097df7c76eed207b5443908621dd1ce1dd23b84a07 +F ext/fts5/test/fts5corrupt3.test a7c74304ade9934c51604f59d1f30e7e3f6309a340daaade1a13a857cc5921af F ext/fts5/test/fts5corrupt4.test f4c08e2182a48d8b70975fd869ee5391855c06d8a0ff87b6a2529e7c5a88a1d3 F ext/fts5/test/fts5delete.test 619295b20dbc1d840b403ee07c878f52378849c3c02e44f2ee143b3e978a0aa7 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 162022003c2b4a393296939e2616bd3c7bbfd65b198ba6c9894e4234de2d3122 -R 0d5e4bee21661798cf35b466387af9ed +P 9d0b6b0f42a47a3892ebc765250756fb8b844e8399d992a8b65f55af3800ea06 +R 23d59505d159d31d2ffb5d1777058548 U dan -Z d0ffcf2b467dcfb0c9a83ba45df381bb +Z 86b1a535909414fcc97ab5a0253c5f21 diff --git a/manifest.uuid b/manifest.uuid index 6e28d90e4b..8a422a6311 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9d0b6b0f42a47a3892ebc765250756fb8b844e8399d992a8b65f55af3800ea06 \ No newline at end of file +078962a2164a784b135bacee51ef10973dc2e30de04353d48698d0e72edd63d8 \ No newline at end of file From 822810b95a680e86f92d0d9e3a659e0dda8ce6d5 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 8 Jun 2021 12:15:56 +0000 Subject: [PATCH 53/70] Avoid a buffer overread in fts3 that could occur when handling corrupt data structures. FossilOrigin-Name: 45f459d2fa4be97d9bbb970efbc0b5d40efaf93f52ed111fd0fcdc572c24327b --- ext/fts3/fts3_write.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3corrupt6.test | 12 ++++++++++++ 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index c2e6bbcbd5..56c59ce3ae 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -2003,8 +2003,8 @@ static int fts3PrefixCompress( int nNext /* Size of buffer zNext in bytes */ ){ int n; - UNUSED_PARAMETER(nNext); - for(n=0; n Date: Tue, 8 Jun 2021 12:22:24 +0000 Subject: [PATCH 54/70] Add an assert() to prevent the value of the SQLITE_VTABRISK macros from being changed in a way that would break logic. FossilOrigin-Name: 33babdb582ca712cc089165a953972096b57d1cb683954fa830df5e7befaadba --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 6ad13fc3a8..dfd2f995e4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sa\sbuffer\soverread\sin\sfts3\sthat\scould\soccur\swhen\shandling\scorrupt\sdata\sstructures. -D 2021-06-08T12:15:56.225 +C Add\san\sassert()\sto\sprevent\sthe\svalue\sof\sthe\sSQLITE_VTABRISK\smacros\sfrom\sbeing\nchanged\sin\sa\sway\sthat\swould\sbreak\slogic. +D 2021-06-08T12:22:24.457 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 2f4429e0b0ca031e360489c45dca5dfa06cd85480e12c0d1360b91e1c8e7f7a2 +F src/select.c f0c7f050b85c902044e090d6bbe6425723d98f982c370ef573c0be40990bd9d4 F src/shell.c.in a4bc0e2ba9be798e293790f354dcc0099c6370127eec18cf49cb161b9dae2fbc F src/sqlite.h.in f450394634eac00bc680c0e91582b818359c6ad61149f49f90fb6ecbd526b51f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 078962a2164a784b135bacee51ef10973dc2e30de04353d48698d0e72edd63d8 -R 5a17f4e5ebbfe022e0c97e67ae492f79 -U dan -Z 7b7192d0a99b7f6acb9424a14999a3f8 +P 45f459d2fa4be97d9bbb970efbc0b5d40efaf93f52ed111fd0fcdc572c24327b +R f24c3388372fbfff30e1a783fa15bb17 +U drh +Z 0441089d1a94c0851a7c37efba5ddd60 diff --git a/manifest.uuid b/manifest.uuid index d9b791e0f6..20f586a9ab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -45f459d2fa4be97d9bbb970efbc0b5d40efaf93f52ed111fd0fcdc572c24327b \ No newline at end of file +33babdb582ca712cc089165a953972096b57d1cb683954fa830df5e7befaadba \ No newline at end of file diff --git a/src/select.c b/src/select.c index 3c70441a8b..5685eeaadc 100644 --- a/src/select.c +++ b/src/select.c @@ -5463,6 +5463,7 @@ static int selectExpander(Walker *pWalker, Select *p){ pTab->zName); } #ifndef SQLITE_OMIT_VIRTUALTABLE + assert( SQLITE_VTABRISK_Normal==1 && SQLITE_VTABRISK_High==2 ); if( IsVirtual(pTab) && pFrom->fg.fromDDL && ALWAYS(pTab->pVTable!=0) From 26ec568d2802b4851838e480b9aca02300c026fb Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 8 Jun 2021 17:56:16 +0000 Subject: [PATCH 55/70] Try to avoid a double-free in the showdb utility program when running pgidx on a corrupt database. See [forum:/forumpost/a60ea5a4d4|forum post a60ea5a4d4] for context FossilOrigin-Name: e3188a866362894d98521b3006fb5b9a63fe4a3bb2ff4f1b58acb6eb4e52da8f --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/showdb.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index dfd2f995e4..99727aa5f6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sassert()\sto\sprevent\sthe\svalue\sof\sthe\sSQLITE_VTABRISK\smacros\sfrom\sbeing\nchanged\sin\sa\sway\sthat\swould\sbreak\slogic. -D 2021-06-08T12:22:24.457 +C Try\sto\savoid\sa\sdouble-free\sin\sthe\sshowdb\sutility\sprogram\swhen\srunning\npgidx\son\sa\scorrupt\sdatabase.\nSee\s[forum:/forumpost/a60ea5a4d4|forum\spost\sa60ea5a4d4]\sfor\scontext +D 2021-06-08T17:56:16.029 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1868,7 +1868,7 @@ F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048 F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 -F tool/showdb.c 8c6b1cbb86ee25ca2173497183f8fcd444d4e26923e4cf57ddabe66c633b4dab +F tool/showdb.c 6554d4af7690404f5b9242cf0349a74b59cafbda95fcf8f31c36303faf8539da F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564 F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 45f459d2fa4be97d9bbb970efbc0b5d40efaf93f52ed111fd0fcdc572c24327b -R f24c3388372fbfff30e1a783fa15bb17 +P 33babdb582ca712cc089165a953972096b57d1cb683954fa830df5e7befaadba +R 19dbe72723f34ef6ef6d8bd4121ff075 U drh -Z 0441089d1a94c0851a7c37efba5ddd60 +Z f32a8ef337e0790972e06c7ccf978fb1 diff --git a/manifest.uuid b/manifest.uuid index 20f586a9ab..75b18791ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -33babdb582ca712cc089165a953972096b57d1cb683954fa830df5e7befaadba \ No newline at end of file +e3188a866362894d98521b3006fb5b9a63fe4a3bb2ff4f1b58acb6eb4e52da8f \ No newline at end of file diff --git a/tool/showdb.c b/tool/showdb.c index 5e949939e1..0356ef88f5 100644 --- a/tool/showdb.c +++ b/tool/showdb.c @@ -1041,6 +1041,8 @@ static void page_usage_report(const char *zPrg, const char *zDbName){ for(i=1; i<=g.mxPage; i++){ if( zPageUse[i]==0 ) page_usage_btree(i, -1, 0, 0); printf("%5u: %s\n", i, zPageUse[i] ? zPageUse[i] : "???"); + } + for(i=1; i<=g.mxPage; i++){ sqlite3_free(zPageUse[i]); } sqlite3_free(zPageUse); From 18f9be897d58f45f4ef205ad21c439e3bbfe56c2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 8 Jun 2021 23:46:59 +0000 Subject: [PATCH 56/70] Remove two assert()s in FTS5 that checks for database corruption right before actual code does the same check. dbsqlfuzz 9680db8f5338cb9b6060eb3a02d984555d4472e3. FossilOrigin-Name: f3f82967b2e9fd4168d86300138ac4bbcd6ffd7a3ff5ecf20acdc29e5356ac3b --- ext/fts5/fts5_index.c | 2 -- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2390016 -> 2397184 bytes 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 59650158c1..5f0e528698 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5078,8 +5078,6 @@ static void fts5MergePrefixLists( nTail = pHead->iter.nPoslist - pHead->iOff; /* WRITEPOSLISTSIZE */ - assert_nc( tmp.n+nTail<=nTmp ); - assert( tmp.n+nTail<=nTmp+nMerge*10 ); if( tmp.n+nTail>nTmp-FTS5_DATA_ZERO_PADDING ){ if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT; break; diff --git a/manifest b/manifest index 99727aa5f6..ee98e44dfb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Try\sto\savoid\sa\sdouble-free\sin\sthe\sshowdb\sutility\sprogram\swhen\srunning\npgidx\son\sa\scorrupt\sdatabase.\nSee\s[forum:/forumpost/a60ea5a4d4|forum\spost\sa60ea5a4d4]\sfor\scontext -D 2021-06-08T17:56:16.029 +C Remove\stwo\sassert()s\sin\sFTS5\sthat\schecks\sfor\sdatabase\scorruption\sright\sbefore\nactual\scode\sdoes\sthe\ssame\scheck.\ndbsqlfuzz\s9680db8f5338cb9b6060eb3a02d984555d4472e3. +D 2021-06-08T23:46:59.097 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -119,7 +119,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 9462249a3bb82d0e49b163500f9d2197c2e4cd95bf440a9bbfc3906b22ea1e1b F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c a2ce620e1f03c70cede1afcc78c9a82697f0d1c59525f1c3b425d6126885abcf +F ext/fts5/fts5_index.c 104ba1088ffbc1453ae8ae6f8ba896ab3ac62bb21829bf403b6c86eb7cd2857f F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -1056,7 +1056,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db bc52deef6091b1c3ae73c1d86de5eabbb643dbe2eb9595caf379db139b5fe376 +F test/fuzzdata8.db 98f0e365370523732a5ae916af0e231b34a7645e82d1aa9b9fedad35730dd926 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 33babdb582ca712cc089165a953972096b57d1cb683954fa830df5e7befaadba -R 19dbe72723f34ef6ef6d8bd4121ff075 +P e3188a866362894d98521b3006fb5b9a63fe4a3bb2ff4f1b58acb6eb4e52da8f +R 498a508e08d4a68fa12e51791716d97d U drh -Z f32a8ef337e0790972e06c7ccf978fb1 +Z a25454f0647dd4b7e8930ab999ad558e diff --git a/manifest.uuid b/manifest.uuid index 75b18791ec..6639d4da83 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3188a866362894d98521b3006fb5b9a63fe4a3bb2ff4f1b58acb6eb4e52da8f \ No newline at end of file +f3f82967b2e9fd4168d86300138ac4bbcd6ffd7a3ff5ecf20acdc29e5356ac3b \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 50c54a407cb7bfed5dd0623e5ee1f377d8a29e40..3f68cf0916f34621cf81c6042f678dcdda5c6478 100644 GIT binary patch delta 41593 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 delta 40934 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 Date: Wed, 9 Jun 2021 13:39:11 +0000 Subject: [PATCH 57/70] Add defensive code to better handle corrupt records in fts5. FossilOrigin-Name: a99c29b5efaf17e34506cda5ce017ec0112b3cb24bf8a2f1831f0c14a8aa8d30 --- ext/fts5/fts5_buffer.c | 22 ++++++++++++++-------- ext/fts5/fts5_index.c | 4 +++- ext/fts5/test/fts5corrupt3.test | 2 +- manifest | 18 +++++++++--------- manifest.uuid | 2 +- 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index cb768ebb15..a8f3bee334 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -178,6 +178,7 @@ int sqlite3Fts5PoslistNext64( i64 iOff = *piOff; int iVal; fts5FastGetVarint32(a, i, iVal); + assert( iVal>=0 ); if( iVal<=1 ){ if( iVal==0 ){ *pi = i; @@ -191,9 +192,12 @@ int sqlite3Fts5PoslistNext64( *piOff = -1; return 1; } + *piOff = iOff + ((iVal-2) & 0x7FFFFFFF); + }else{ + *piOff = (iOff & (i64)0x7FFFFFFF<<32)+((iOff + (iVal-2)) & 0x7FFFFFFF); } - *piOff = iOff + ((iVal-2) & 0x7FFFFFFF); *pi = i; + assert( *piOff>=iOff ); return 0; } } @@ -232,14 +236,16 @@ void sqlite3Fts5PoslistSafeAppend( i64 *piPrev, i64 iPos ){ - static const i64 colmask = ((i64)(0x7FFFFFFF)) << 32; - if( (iPos & colmask) != (*piPrev & colmask) ){ - pBuf->p[pBuf->n++] = 1; - pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], (iPos>>32)); - *piPrev = (iPos & colmask); + if( iPos>=*piPrev ){ + static const i64 colmask = ((i64)(0x7FFFFFFF)) << 32; + if( (iPos & colmask) != (*piPrev & colmask) ){ + pBuf->p[pBuf->n++] = 1; + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], (iPos>>32)); + *piPrev = (iPos & colmask); + } + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], (iPos-*piPrev)+2); + *piPrev = iPos; } - pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], (iPos-*piPrev)+2); - *piPrev = iPos; } int sqlite3Fts5PoslistWriterAppend( diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 5f0e528698..7cc0d46acc 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4979,7 +4979,7 @@ static void fts5MergePrefixLists( Fts5Buffer *aBuf /* Other lists to merge in */ ){ #define fts5PrefixMergerNextPosition(p) \ - sqlite3Fts5PoslistNext64((p)->aPos,(p)->iter.nPoslist,&(p)->iOff,&(p)->iPos); + sqlite3Fts5PoslistNext64((p)->aPos,(p)->iter.nPoslist,&(p)->iOff,&(p)->iPos) #define FTS5_MERGE_NLIST 16 PrefixMerger aMerger[FTS5_MERGE_NLIST]; PrefixMerger *pHead = 0; @@ -5078,6 +5078,8 @@ static void fts5MergePrefixLists( nTail = pHead->iter.nPoslist - pHead->iOff; /* WRITEPOSLISTSIZE */ + assert_nc( tmp.n+nTail<=nTmp ); + assert( tmp.n+nTail<=nTmp+nMerge*10 ); if( tmp.n+nTail>nTmp-FTS5_DATA_ZERO_PADDING ){ if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT; break; diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 467bcda030..5604bca76c 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -14791,7 +14791,7 @@ do_test 75.0 { do_catchsql_test 75.1 { SELECT rowid, quote(matchinfo(t1,'pcxybs')) FROM t1 WHERE t1 MATCH 'e*'; -} {1 {database disk image is malformed}} +} {1 {unable to use function matchinfo in the requested context}} #------------------------------------------------------------------------- reset_db diff --git a/manifest b/manifest index ee98e44dfb..af1dba4496 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\stwo\sassert()s\sin\sFTS5\sthat\schecks\sfor\sdatabase\scorruption\sright\sbefore\nactual\scode\sdoes\sthe\ssame\scheck.\ndbsqlfuzz\s9680db8f5338cb9b6060eb3a02d984555d4472e3. -D 2021-06-08T23:46:59.097 +C Add\sdefensive\scode\sto\sbetter\shandle\scorrupt\srecords\sin\sfts5. +D 2021-06-09T13:39:11.202 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -115,11 +115,11 @@ F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca2a F ext/fts5/fts5Int.h 26c74dd5776f798436fbf604a0bf0e8de263b35b5060b05c15f9085845d9fda2 F ext/fts5/fts5_aux.c f558e1fb9f0f86a4f7489e258c162e1f947de5ff2709087fbb465fddb7092f98 -F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 +F ext/fts5/fts5_buffer.c 605f509f88c73e9ab41323cb6cf74932f936acf3f7d9c87bd0d3c599b4c90281 F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 9462249a3bb82d0e49b163500f9d2197c2e4cd95bf440a9bbfc3906b22ea1e1b F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c 104ba1088ffbc1453ae8ae6f8ba896ab3ac62bb21829bf403b6c86eb7cd2857f +F ext/fts5/fts5_index.c eb1864c6abacf08d959956183a55a4f9767af76be289f2bb519bb0f197b3fd72 F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -160,7 +160,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test a7c74304ade9934c51604f59d1f30e7e3f6309a340daaade1a13a857cc5921af +F ext/fts5/test/fts5corrupt3.test 79467b7c69a9c45ee3260507c4648d6449323aaa3c1e05b360c9479f1aa7dcce F ext/fts5/test/fts5corrupt4.test f4c08e2182a48d8b70975fd869ee5391855c06d8a0ff87b6a2529e7c5a88a1d3 F ext/fts5/test/fts5delete.test 619295b20dbc1d840b403ee07c878f52378849c3c02e44f2ee143b3e978a0aa7 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e3188a866362894d98521b3006fb5b9a63fe4a3bb2ff4f1b58acb6eb4e52da8f -R 498a508e08d4a68fa12e51791716d97d -U drh -Z a25454f0647dd4b7e8930ab999ad558e +P f3f82967b2e9fd4168d86300138ac4bbcd6ffd7a3ff5ecf20acdc29e5356ac3b +R e887ea774358be61a01c8969bbba9b04 +U dan +Z 47ac93f33c440d293182c1e4a3488493 diff --git a/manifest.uuid b/manifest.uuid index 6639d4da83..1c2d3fbd1c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f3f82967b2e9fd4168d86300138ac4bbcd6ffd7a3ff5ecf20acdc29e5356ac3b \ No newline at end of file +a99c29b5efaf17e34506cda5ce017ec0112b3cb24bf8a2f1831f0c14a8aa8d30 \ No newline at end of file From d622855e34bf11537c14050fdc7ef84ac9328161 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 9 Jun 2021 14:45:02 +0000 Subject: [PATCH 58/70] Set the database connection error code for an oversize argument to sqlite3_bind_blob64() or sqlite3_bind_text64(). [forum:/info/a636276f0d451667|Forum post a636276f0d451667] and [forum/forumpost/33821c8db543c|33821c8db543c]. FossilOrigin-Name: 56ff58c0b8905aa10c85f1418da8d6089d23fd9a220c5cb17027d46affe05002 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/vdbeInt.h | 2 +- src/vdbeapi.c | 18 +++++------------- src/vdbemem.c | 12 ++++++------ 5 files changed, 22 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index af1dba4496..805fe52a6e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sdefensive\scode\sto\sbetter\shandle\scorrupt\srecords\sin\sfts5. -D 2021-06-09T13:39:11.202 +C Set\sthe\sdatabase\sconnection\serror\scode\sfor\san\soversize\sargument\sto\nsqlite3_bind_blob64()\sor\ssqlite3_bind_text64().\n[forum:/info/a636276f0d451667|Forum\spost\sa636276f0d451667]\sand\n[forum/forumpost/33821c8db543c|33821c8db543c]. +D 2021-06-09T14:45:02.707 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -618,11 +618,11 @@ F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 F src/vacuum.c 492422c1463c076473bae1858799c7a0a5fe87a133d1223239447c422cd26286 F src/vdbe.c 87d29d763c0398d8128ecc9f043aab7108123b15c919ec92d4b57e5e4385818c F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe -F src/vdbeInt.h 58980223a32495ad059d10581b83e133abdc77248b1bab85c080cab8a13bd819 -F src/vdbeapi.c d9e99daf59fec928986838b3389a7337e82fec6b3b5de30206cb99fb4661b94e +F src/vdbeInt.h 465fcb494db4ca6630fb9c19b2f3dfed597fbe885b0d4204193a5093b0dd7dc6 +F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 F src/vdbeaux.c 065a10392378109f08435bd50d03dff315e384cde2831d6b8dbaec05f33b10af F src/vdbeblob.c c6b8db50b227f66fb404215732068df76485b5b433e5f9d4d9ac27410b218193 -F src/vdbemem.c 175c73ced03edbb0f6567a41c8032afaeb83372090fa7bddfc88a67e28da2b8a +F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c f5b5e473a7cee44e47a94817b042fd7172cf3aa2c0a7928a8339d612bcfdec5a F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb724 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f3f82967b2e9fd4168d86300138ac4bbcd6ffd7a3ff5ecf20acdc29e5356ac3b -R e887ea774358be61a01c8969bbba9b04 -U dan -Z 47ac93f33c440d293182c1e4a3488493 +P a99c29b5efaf17e34506cda5ce017ec0112b3cb24bf8a2f1831f0c14a8aa8d30 +R 1aa848d7704aa0b4f54bd178d5a6c4bf +U drh +Z fc69d50bb08ad8b0f40bec3dc604333f diff --git a/manifest.uuid b/manifest.uuid index 1c2d3fbd1c..e4dcd7aac9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a99c29b5efaf17e34506cda5ce017ec0112b3cb24bf8a2f1831f0c14a8aa8d30 \ No newline at end of file +56ff58c0b8905aa10c85f1418da8d6089d23fd9a220c5cb17027d46affe05002 \ No newline at end of file diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 5e3e523f92..b6e0288807 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -516,7 +516,7 @@ int sqlite3VdbeMemCopy(Mem*, const Mem*); void sqlite3VdbeMemShallowCopy(Mem*, const Mem*, int); void sqlite3VdbeMemMove(Mem*, Mem*); int sqlite3VdbeMemNulTerminate(Mem*); -int sqlite3VdbeMemSetStr(Mem*, const char*, int, u8, void(*)(void*)); +int sqlite3VdbeMemSetStr(Mem*, const char*, i64, u8, void(*)(void*)); void sqlite3VdbeMemSetInt64(Mem*, i64); #ifdef SQLITE_OMIT_FLOATING_POINT # define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64 diff --git a/src/vdbeapi.c b/src/vdbeapi.c index b21634dc80..5de7c64c25 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -392,7 +392,7 @@ static int invokeValueDestructor( }else{ xDel((void*)p); } - if( pCtx ) sqlite3_result_error_toobig(pCtx); + sqlite3_result_error_toobig(pCtx); return SQLITE_TOOBIG; } void sqlite3_result_blob( @@ -1374,7 +1374,7 @@ static int bindText( sqlite3_stmt *pStmt, /* The statement to bind against */ int i, /* Index of the parameter to bind */ const void *zData, /* Pointer to the data to be bound */ - int nData, /* Number of bytes of data to be bound */ + i64 nData, /* Number of bytes of data to be bound */ void (*xDel)(void*), /* Destructor for the data */ u8 encoding /* Encoding for the data */ ){ @@ -1426,11 +1426,7 @@ int sqlite3_bind_blob64( void (*xDel)(void*) ){ assert( xDel!=SQLITE_DYNAMIC ); - if( nData>0x7fffffff ){ - return invokeValueDestructor(zData, xDel, 0); - }else{ - return bindText(pStmt, i, zData, (int)nData, xDel, 0); - } + return bindText(pStmt, i, zData, nData, xDel, 0); } int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ int rc; @@ -1500,12 +1496,8 @@ int sqlite3_bind_text64( unsigned char enc ){ assert( xDel!=SQLITE_DYNAMIC ); - if( nData>0x7fffffff ){ - return invokeValueDestructor(zData, xDel, 0); - }else{ - if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE; - return bindText(pStmt, i, zData, (int)nData, xDel, enc); - } + if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE; + return bindText(pStmt, i, zData, nData, xDel, enc); } #ifndef SQLITE_OMIT_UTF16 int sqlite3_bind_text16( diff --git a/src/vdbemem.c b/src/vdbemem.c index fd5212c8a9..dc177161b4 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1072,11 +1072,11 @@ void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){ int sqlite3VdbeMemSetStr( Mem *pMem, /* Memory cell to set to string value */ const char *z, /* String pointer */ - int n, /* Bytes in string, or negative */ + i64 n, /* Bytes in string, or negative */ u8 enc, /* Encoding of z. 0 for BLOBs */ void (*xDel)(void*) /* Destructor function */ ){ - int nByte = n; /* New value for pMem->n */ + i64 nByte = n; /* New value for pMem->n */ int iLimit; /* Maximum allowed string or blob size */ u16 flags = 0; /* New value for pMem->flags */ @@ -1098,7 +1098,7 @@ int sqlite3VdbeMemSetStr( if( nByte<0 ){ assert( enc!=0 ); if( enc==SQLITE_UTF8 ){ - nByte = 0x7fffffff & (int)strlen(z); + nByte = strlen(z); }else{ for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} } @@ -1110,7 +1110,7 @@ int sqlite3VdbeMemSetStr( ** management (one of MEM_Dyn or MEM_Static). */ if( xDel==SQLITE_TRANSIENT ){ - u32 nAlloc = nByte; + i64 nAlloc = nByte; if( flags&MEM_Term ){ nAlloc += (enc==SQLITE_UTF8?1:2); } @@ -1136,7 +1136,7 @@ int sqlite3VdbeMemSetStr( } } - pMem->n = nByte; + pMem->n = (int)(nByte & 0x7fffffff); pMem->flags = flags; if( enc ){ pMem->enc = enc; @@ -1156,7 +1156,7 @@ int sqlite3VdbeMemSetStr( #endif if( nByte>iLimit ){ - return SQLITE_TOOBIG; + return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); } return SQLITE_OK; From 75016050f398570dd484f49631ba70aac416d47d Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 10 Jun 2021 14:36:23 +0000 Subject: [PATCH 59/70] Improved robustness following OOM in the constant propagation optimization. dbsqlfuzz 001a20255c0df7495c21df62a20ea5b51e22c390. FossilOrigin-Name: 8658a64d414db6900b55281f5e67180ea74b82627199b927634a727ed28030c2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 805fe52a6e..5e3b293dd7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Set\sthe\sdatabase\sconnection\serror\scode\sfor\san\soversize\sargument\sto\nsqlite3_bind_blob64()\sor\ssqlite3_bind_text64().\n[forum:/info/a636276f0d451667|Forum\spost\sa636276f0d451667]\sand\n[forum/forumpost/33821c8db543c|33821c8db543c]. -D 2021-06-09T14:45:02.707 +C Improved\srobustness\sfollowing\sOOM\sin\sthe\sconstant\spropagation\soptimization.\ndbsqlfuzz\s001a20255c0df7495c21df62a20ea5b51e22c390. +D 2021-06-10T14:36:23.869 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c f0c7f050b85c902044e090d6bbe6425723d98f982c370ef573c0be40990bd9d4 +F src/select.c 96d8a8c19d8dd4a605f55166e3eefe4f8a3cd4d3e9255096b4bc740c75159593 F src/shell.c.in a4bc0e2ba9be798e293790f354dcc0099c6370127eec18cf49cb161b9dae2fbc F src/sqlite.h.in f450394634eac00bc680c0e91582b818359c6ad61149f49f90fb6ecbd526b51f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a99c29b5efaf17e34506cda5ce017ec0112b3cb24bf8a2f1831f0c14a8aa8d30 -R 1aa848d7704aa0b4f54bd178d5a6c4bf +P 56ff58c0b8905aa10c85f1418da8d6089d23fd9a220c5cb17027d46affe05002 +R 18566ccb2436921d616b19510604cebd U drh -Z fc69d50bb08ad8b0f40bec3dc604333f +Z c0637a6bda27d46672c1c58f8de8002f diff --git a/manifest.uuid b/manifest.uuid index e4dcd7aac9..8d2cf0705d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -56ff58c0b8905aa10c85f1418da8d6089d23fd9a220c5cb17027d46affe05002 \ No newline at end of file +8658a64d414db6900b55281f5e67180ea74b82627199b927634a727ed28030c2 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 5685eeaadc..589c8532d3 100644 --- a/src/select.c +++ b/src/select.c @@ -4415,6 +4415,7 @@ static int flattenSubquery( typedef struct WhereConst WhereConst; struct WhereConst { Parse *pParse; /* Parsing context */ + u8 *pOomFault; /* Pointer to pParse->db->mallocFailed */ int nConst; /* Number for COLUMN=CONSTANT terms */ int nChng; /* Number of times a constant is propagated */ int bHasAffBlob; /* At least one column in apExpr[] as affinity BLOB */ @@ -4514,6 +4515,7 @@ static int propagateConstantExprRewriteOne( int bIgnoreAffBlob ){ int i; + if( pConst->pOomFault[0] ) return WRC_Prune; if( pExpr->op!=TK_COLUMN ) return WRC_Continue; if( ExprHasProperty(pExpr, EP_FixedCol|EP_FromJoin) ){ testcase( ExprHasProperty(pExpr, EP_FixedCol) ); @@ -4534,6 +4536,7 @@ static int propagateConstantExprRewriteOne( ExprSetProperty(pExpr, EP_FixedCol); assert( pExpr->pLeft==0 ); pExpr->pLeft = sqlite3ExprDup(pConst->pParse->db, pConst->apExpr[i*2+1], 0); + if( pConst->pParse->db->mallocFailed ) return WRC_Prune; break; } return WRC_Prune; @@ -4566,6 +4569,7 @@ static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ || pExpr->op==TK_IS ){ propagateConstantExprRewriteOne(pConst, pExpr->pLeft, 0); + if( pConst->pOomFault[0] ) return WRC_Prune; if( sqlite3ExprAffinity(pExpr->pLeft)!=SQLITE_AFF_TEXT ){ propagateConstantExprRewriteOne(pConst, pExpr->pRight, 0); } @@ -4633,6 +4637,7 @@ static int propagateConstants( Walker w; int nChng = 0; x.pParse = pParse; + x.pOomFault = &pParse->db->mallocFailed; do{ x.nConst = 0; x.nChng = 0; From 26d61e5adfbc9e1a3955d1fb04a5f5f06ebfdb13 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Jun 2021 11:14:24 +0000 Subject: [PATCH 60/70] Fix problems with ALTER TABLE and schemas that contain views with some recursive CTEs, or CTEs that reference other CTEs. FossilOrigin-Name: 8b1f9a51e962cd9a5593a1ecf4da6c86e34c4f9ff96ffcea0fb421880c8836cb --- manifest | 20 +++---- manifest.uuid | 2 +- src/alter.c | 21 ++++++- src/expr.c | 6 +- src/sqliteInt.h | 1 + test/altertab.test | 138 +++++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 167 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 5e3b293dd7..b9d1b407de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\srobustness\sfollowing\sOOM\sin\sthe\sconstant\spropagation\soptimization.\ndbsqlfuzz\s001a20255c0df7495c21df62a20ea5b51e22c390. -D 2021-06-10T14:36:23.869 +C Fix\sproblems\swith\sALTER\sTABLE\sand\sschemas\sthat\scontain\sviews\swith\ssome\srecursive\sCTEs,\sor\sCTEs\sthat\sreference\sother\sCTEs. +D 2021-06-11T11:14:24.212 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 2cb4a3d15cfee6a8a631bbf35943421312addaee36ed171aafe1a88de8ada060 +F src/alter.c 3de695d859627b1a80f673c16155260a12af310b5853012da411f81e6f4442a4 F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 930e63df768dcb197242b1efa0ed9fcdcc9a7b7556c236ee01a9959b61cf527b -F src/expr.c 57534c739e1280de1cef333a4dc4c42ac1f8524acb71b715ae21406bf4363f57 +F src/expr.c 30a2abf526531ce6bd45fbc85bfec0fc3f6e5a0fb490cd2350855f2fc34dd789 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c 88fd711754a7241cb9f8eb1391370fd0c0cea756b3358efa274c5d1efd59af93 @@ -549,7 +549,7 @@ F src/shell.c.in a4bc0e2ba9be798e293790f354dcc0099c6370127eec18cf49cb161b9dae2fb F src/sqlite.h.in f450394634eac00bc680c0e91582b818359c6ad61149f49f90fb6ecbd526b51f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e -F src/sqliteInt.h 61f717ac4242af975c6d8abc11a3ada6153ad5bfb7ce08ef8a443c01e13c8031 +F src/sqliteInt.h c33a2734081287541a8356d2f2e6764c1b9f9c9d1635e8233084205ea7f11f65 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -658,7 +658,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altermalloc3.test 059841a3de6b6780efd9f0b30bf1d9b4443c555f68d39975cbcac2583167b239 F test/alterqf.test 67568ad152db8c1187b15633b801242cf960f1beafc51261a3d1725d910baeb2 -F test/altertab.test a96e2169bbb2c5a754b0ddac8a396e15b4ad6f34a5fbf6fbfad76bdfb339479f +F test/altertab.test 4120b9b2baa96ef2b0aaf4dd46b1858171503edf5e346b5ce939c73b4d314fa6 F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b F test/altertab3.test 2b82fa2236a3a91553d53ae5555d8e723c7eec174c41f1fa62ff497355398479 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 56ff58c0b8905aa10c85f1418da8d6089d23fd9a220c5cb17027d46affe05002 -R 18566ccb2436921d616b19510604cebd -U drh -Z c0637a6bda27d46672c1c58f8de8002f +P 8658a64d414db6900b55281f5e67180ea74b82627199b927634a727ed28030c2 +R 3e7137855bcb4cdf964662c585c92d6f +U dan +Z 5e06bfe97c02741d63caecdb97ff3417 diff --git a/manifest.uuid b/manifest.uuid index 8d2cf0705d..dd936d5176 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8658a64d414db6900b55281f5e67180ea74b82627199b927634a727ed28030c2 \ No newline at end of file +8b1f9a51e962cd9a5593a1ecf4da6c86e34c4f9ff96ffcea0fb421880c8836cb \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 744b75ea8b..de0dd4e4d4 100644 --- a/src/alter.c +++ b/src/alter.c @@ -800,15 +800,30 @@ static int renameUnmapExprCb(Walker *pWalker, Expr *pExpr){ static void renameWalkWith(Walker *pWalker, Select *pSelect){ With *pWith = pSelect->pWith; if( pWith ){ + Parse *pParse = pWalker->pParse; int i; + With *pCopy = 0; + assert( pWith->nCte>0 ); + if( (pWith->a[0].pSelect->selFlags & SF_Expanded)==0 ){ + /* Push a copy of the With object onto the with-stack. We use a copy + ** here as the original will be expanded and resolved (flags SF_Expanded + ** and SF_Resolved) below. And the parser code that uses the with-stack + ** fails if the Select objects on it have already been expanded and + ** resolved. */ + pCopy = sqlite3WithDup(pParse->db, pWith); + sqlite3WithPush(pParse, pCopy, 1); + } for(i=0; inCte; i++){ Select *p = pWith->a[i].pSelect; NameContext sNC; memset(&sNC, 0, sizeof(sNC)); - sNC.pParse = pWalker->pParse; - sqlite3SelectPrep(sNC.pParse, p, &sNC); + sNC.pParse = pParse; + if( pCopy ) sqlite3SelectPrep(sNC.pParse, p, &sNC); sqlite3WalkSelect(pWalker, p); - sqlite3RenameExprlistUnmap(pWalker->pParse, pWith->a[i].pCols); + sqlite3RenameExprlistUnmap(pParse, pWith->a[i].pCols); + } + if( pCopy && pParse->pWith==pCopy ){ + pParse->pWith = pCopy->pOuter; } } } diff --git a/src/expr.c b/src/expr.c index 0a57d745e1..b751f51a6d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1413,7 +1413,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ ** and the db->mallocFailed flag set. */ #ifndef SQLITE_OMIT_CTE -static With *withDup(sqlite3 *db, With *p){ +With *sqlite3WithDup(sqlite3 *db, With *p){ With *pRet = 0; if( p ){ sqlite3_int64 nByte = sizeof(*p) + sizeof(p->a[0]) * (p->nCte-1); @@ -1431,7 +1431,7 @@ static With *withDup(sqlite3 *db, With *p){ return pRet; } #else -# define withDup(x,y) 0 +# define sqlite3WithDup(x,y) 0 #endif #ifndef SQLITE_OMIT_WINDOWFUNC @@ -1635,7 +1635,7 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ pNew->addrOpenEphm[0] = -1; pNew->addrOpenEphm[1] = -1; pNew->nSelectRow = p->nSelectRow; - pNew->pWith = withDup(db, p->pWith); + pNew->pWith = sqlite3WithDup(db, p->pWith); #ifndef SQLITE_OMIT_WINDOWFUNC pNew->pWin = 0; pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 806a1a3395..ad857ab03b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4576,6 +4576,7 @@ void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3*); int sqlite3SafetyCheckOk(sqlite3*); int sqlite3SafetyCheckSickOrOk(sqlite3*); void sqlite3ChangeCookie(Parse*, int); +With *sqlite3WithDup(sqlite3 *db, With *p); #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) void sqlite3MaterializeView(Parse*, Table*, Expr*, ExprList*,Expr*,int); diff --git a/test/altertab.test b/test/altertab.test index dacc5ab0e7..8742c1769a 100644 --- a/test/altertab.test +++ b/test/altertab.test @@ -793,20 +793,80 @@ do_execsql_test 27.2 { alter table t_sa rename column c_muyat to c_dg; } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 29.1 { + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES('a', 'b', 'c'); + + CREATE VIEW v0 AS + WITH p AS ( SELECT 1 FROM t1 ), + g AS ( SELECT 1 FROM p, t1 ) + SELECT 1 FROM g; +} + +do_execsql_test 29.2 { + SELECT * FROM v0 +} 1 + +do_execsql_test 29.2 { + ALTER TABLE t1 RENAME TO t2 +} + +do_execsql_test 29.3 { + SELECT sql FROM sqlite_schema WHERE name='v0' +} {{CREATE VIEW v0 AS + WITH p AS ( SELECT 1 FROM "t2" ), + g AS ( SELECT 1 FROM p, "t2" ) + SELECT 1 FROM g}} + +do_execsql_test 29.4 { + CREATE VIEW v2 AS + WITH p AS ( SELECT 1 FROM t2 ), + g AS ( SELECT 1 FROM ( + WITH i AS (SELECT 1 FROM p, t2) + SELECT * FROM i + ) + ) + SELECT 1 FROM g; +} + +do_execsql_test 29.4 { + SELECT * FROM v2; +} 1 + +do_execsql_test 29.5 { + ALTER TABLE t2 RENAME TO t3; +} + +do_execsql_test 29.5 { + SELECT sql FROM sqlite_schema WHERE name='v2' +} {{CREATE VIEW v2 AS + WITH p AS ( SELECT 1 FROM "t3" ), + g AS ( SELECT 1 FROM ( + WITH i AS (SELECT 1 FROM p, "t3") + SELECT * FROM i + ) + ) + SELECT 1 FROM g}} + + #------------------------------------------------------------------------- reset_db do_execsql_test 28.1 { CREATE TABLE t1(a); CREATE TABLE t2(b,c); + CREATE TABLE t4(b,c); INSERT INTO t2 VALUES(1,2),(1,3),(2,5); + INSERT INTO t4 VALUES(1,2),(1,3),(2,5); + CREATE VIEW v3 AS WITH RECURSIVE t3(x,y,z) AS ( - SELECT b,c,NULL FROM t2 + SELECT b,c,NULL FROM t4 UNION - SELECT x,y,NULL FROM t3, t2 WHERE b=x - ORDER BY y + SELECT x,y,NULL FROM t3, t2 ) - SELECT * FROM t3; + SELECT * FROM t3 AS xyz; } do_execsql_test 28.2 { @@ -819,4 +879,74 @@ do_execsql_test 28.3 { ALTER TABLE t1 RENAME a TO a2; -- fails in v3 } +do_execsql_test 28.4 { + ALTER TABLE t2 RENAME TO t5; +} + +do_execsql_test 28.5 { + SELECT sql FROM sqlite_schema WHERE name='v3' +} {{CREATE VIEW v3 AS + WITH RECURSIVE t3(x,y,z) AS ( + SELECT b,c,NULL FROM t4 + UNION + SELECT x,y,NULL FROM t3, "t5" + ) + SELECT * FROM t3 AS xyz}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 30.0 { + CREATE TABLE t1(a,b,c,d,e,f); + CREATE TABLE t2(a,b,c); + CREATE INDEX t1abc ON t1(a,b,c+d+e); + CREATE VIEW v1(x,y) AS + SELECT t1.b,t2.b FROM t1,t2 WHERE t1.a=t2.a + GROUP BY 1 HAVING t2.c NOT NULL LIMIT 10; + CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN 'no' NOT NULL BEGIN + INSERT INTO t2(a,a,b,c) VALUES(new.b,new.a,new.c-7); + WITH c1(x) AS ( + VALUES(0) + UNION ALL + SELECT current_time+x FROM c1 WHERE x + UNION ALL + SELECT 1+x FROM c1 WHERE x<1 + ), c2(x) AS (VALUES(0),(1)) + SELECT * FROM c1 AS x1, c2 AS x2, ( + SELECT x+1 FROM c1 WHERE x IS NOT TRUE + UNION ALL + SELECT 1+x FROM c1 WHERE 1 Date: Fri, 11 Jun 2021 12:02:00 +0000 Subject: [PATCH 61/70] Remove an unreachable branch added by the previous commit. FossilOrigin-Name: 852ee0e91ceae090157c4ab2805530f5d7985a490ce77f54d7b148f56e466f79 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/alter.c | 27 +++++++++++++-------------- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index b9d1b407de..61cd83accd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\swith\sALTER\sTABLE\sand\sschemas\sthat\scontain\sviews\swith\ssome\srecursive\sCTEs,\sor\sCTEs\sthat\sreference\sother\sCTEs. -D 2021-06-11T11:14:24.212 +C Remove\san\sunreachable\sbranch\sadded\sby\sthe\sprevious\scommit. +D 2021-06-11T12:02:00.076 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 3de695d859627b1a80f673c16155260a12af310b5853012da411f81e6f4442a4 +F src/alter.c 3e76100bb48f1564e643119af8d9b12fd3d50eb4ca146ade027bcbb67dd77edd F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8658a64d414db6900b55281f5e67180ea74b82627199b927634a727ed28030c2 -R 3e7137855bcb4cdf964662c585c92d6f +P 8b1f9a51e962cd9a5593a1ecf4da6c86e34c4f9ff96ffcea0fb421880c8836cb +R a593835381f24a892eaf7459ea247fea U dan -Z 5e06bfe97c02741d63caecdb97ff3417 +Z a43fa53c46b2ebe85b882f7033342509 diff --git a/manifest.uuid b/manifest.uuid index dd936d5176..a649f4e781 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8b1f9a51e962cd9a5593a1ecf4da6c86e34c4f9ff96ffcea0fb421880c8836cb \ No newline at end of file +852ee0e91ceae090157c4ab2805530f5d7985a490ce77f54d7b148f56e466f79 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index de0dd4e4d4..c1a8e24761 100644 --- a/src/alter.c +++ b/src/alter.c @@ -802,29 +802,28 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ if( pWith ){ Parse *pParse = pWalker->pParse; int i; - With *pCopy = 0; + With *pCopy; + + /* Push a copy of the With object onto the with-stack. We use a copy + ** here as the original will be expanded and resolved (flags SF_Expanded + ** and SF_Resolved) below. And the parser code that uses the with-stack + ** fails if the Select objects on it have already been expanded and + ** resolved. */ assert( pWith->nCte>0 ); - if( (pWith->a[0].pSelect->selFlags & SF_Expanded)==0 ){ - /* Push a copy of the With object onto the with-stack. We use a copy - ** here as the original will be expanded and resolved (flags SF_Expanded - ** and SF_Resolved) below. And the parser code that uses the with-stack - ** fails if the Select objects on it have already been expanded and - ** resolved. */ - pCopy = sqlite3WithDup(pParse->db, pWith); - sqlite3WithPush(pParse, pCopy, 1); - } + assert( (pWith->a[0].pSelect->selFlags & SF_Expanded)==0 ); + pCopy = sqlite3WithDup(pParse->db, pWith); + sqlite3WithPush(pParse, pCopy, 1); + for(i=0; inCte; i++){ Select *p = pWith->a[i].pSelect; NameContext sNC; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; - if( pCopy ) sqlite3SelectPrep(sNC.pParse, p, &sNC); + sqlite3SelectPrep(sNC.pParse, p, &sNC); sqlite3WalkSelect(pWalker, p); sqlite3RenameExprlistUnmap(pParse, pWith->a[i].pCols); } - if( pCopy && pParse->pWith==pCopy ){ - pParse->pWith = pCopy->pOuter; - } + pParse->pWith = pCopy->pOuter; } } From d03d3a9b745aa5a32370bc41fc0d43cf51b3900c Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Jun 2021 12:14:58 +0000 Subject: [PATCH 62/70] Fix a crash in new ALTER TABLE code that could follow an OOM. FossilOrigin-Name: 6f1f2a0a9cd75ca43b81cc325296b843ccefe6f8040da8f2e873f49928423f10 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 23 ++++++++++++----------- test/altermalloc2.test | 21 +++++++++++++++++++++ 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 61cd83accd..cc2649e96f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunreachable\sbranch\sadded\sby\sthe\sprevious\scommit. -D 2021-06-11T12:02:00.076 +C Fix\sa\scrash\sin\snew\sALTER\sTABLE\scode\sthat\scould\sfollow\san\sOOM. +D 2021-06-11T12:14:58.334 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 3e76100bb48f1564e643119af8d9b12fd3d50eb4ca146ade027bcbb67dd77edd +F src/alter.c a5ddc873aeb9c162082735e3f33f0c97eff3827fe3512a9c55699966565c6c24 F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -655,7 +655,7 @@ F test/alterdropcol.test a653a3945f964d26845ec0cd0a8e74189f46de3119a984c5bc45457 F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a543280dfd4b4d41 F test/alterlegacy.test f38c6d06cda39e1f7b955bbce57f2e3ef5b7cb566d3d1234502093e228c15811 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 -F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b +F test/altermalloc2.test ca3ebc01670d9313953a2b7628d8cc00dc5ea9988f229b3cbbbe1cca506dae45 F test/altermalloc3.test 059841a3de6b6780efd9f0b30bf1d9b4443c555f68d39975cbcac2583167b239 F test/alterqf.test 67568ad152db8c1187b15633b801242cf960f1beafc51261a3d1725d910baeb2 F test/altertab.test 4120b9b2baa96ef2b0aaf4dd46b1858171503edf5e346b5ce939c73b4d314fa6 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8b1f9a51e962cd9a5593a1ecf4da6c86e34c4f9ff96ffcea0fb421880c8836cb -R a593835381f24a892eaf7459ea247fea +P 852ee0e91ceae090157c4ab2805530f5d7985a490ce77f54d7b148f56e466f79 +R 4908855f822587627e5ff1f9cc5f199c U dan -Z a43fa53c46b2ebe85b882f7033342509 +Z 6050252f76b9f756fd3413a1f8f80a55 diff --git a/manifest.uuid b/manifest.uuid index a649f4e781..29b3059d1b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -852ee0e91ceae090157c4ab2805530f5d7985a490ce77f54d7b148f56e466f79 \ No newline at end of file +6f1f2a0a9cd75ca43b81cc325296b843ccefe6f8040da8f2e873f49928423f10 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index c1a8e24761..e5f1eb3154 100644 --- a/src/alter.c +++ b/src/alter.c @@ -812,18 +812,19 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ assert( pWith->nCte>0 ); assert( (pWith->a[0].pSelect->selFlags & SF_Expanded)==0 ); pCopy = sqlite3WithDup(pParse->db, pWith); - sqlite3WithPush(pParse, pCopy, 1); - - for(i=0; inCte; i++){ - Select *p = pWith->a[i].pSelect; - NameContext sNC; - memset(&sNC, 0, sizeof(sNC)); - sNC.pParse = pParse; - sqlite3SelectPrep(sNC.pParse, p, &sNC); - sqlite3WalkSelect(pWalker, p); - sqlite3RenameExprlistUnmap(pParse, pWith->a[i].pCols); + if( pCopy ){ + sqlite3WithPush(pParse, pCopy, 1); + for(i=0; inCte; i++){ + Select *p = pWith->a[i].pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sqlite3SelectPrep(sNC.pParse, p, &sNC); + sqlite3WalkSelect(pWalker, p); + sqlite3RenameExprlistUnmap(pParse, pWith->a[i].pCols); + } + pParse->pWith = pCopy->pOuter; } - pParse->pWith = pCopy->pOuter; } } diff --git a/test/altermalloc2.test b/test/altermalloc2.test index 610b3f6bf0..3d22ad9453 100644 --- a/test/altermalloc2.test +++ b/test/altermalloc2.test @@ -98,4 +98,25 @@ do_faultsim_test 4 -faults oom-* -prep { faultsim_test_result {0 {}} } +reset_db +do_execsql_test 5.0 { + CREATE TABLE rr(a, b); + CREATE VIEW vv AS SELECT * FROM ( + WITH abc(d, e) AS (SELECT * FROM rr) + SELECT * FROM abc + ); +} {} + +faultsim_save_and_close +do_faultsim_test 5 -faults oom-* -prep { + faultsim_restore_and_reopen + execsql { SELECT * FROM sqlite_master } +} -body { + execsql { + ALTER TABLE rr RENAME TO c; + } +} -test { + faultsim_test_result {0 {}} +} + finish_test From cf145047b0d0ef57ffaaaad3e7d17dcf653a3244 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Jun 2021 12:41:14 +0000 Subject: [PATCH 63/70] Avoid bugs in some implementations of dlopen() by avoiding calls to dlopen() with a filename argument that exceeds FILENAME_MAX bytes. [forum:/forumpost/08a0d6d9bf|Forum post 08a0d6d9bf]. FossilOrigin-Name: 01f3877c7172d52225705d2461addc6129fe9cdb04e6f643518fc74bb4b526e4 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/loadext.c | 38 ++++++++++++++++++++++++-------------- src/os.c | 2 ++ src/os.h | 6 ++++++ 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index cc2649e96f..42a031c95d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\sin\snew\sALTER\sTABLE\scode\sthat\scould\sfollow\san\sOOM. -D 2021-06-11T12:14:58.334 +C Avoid\sbugs\sin\ssome\simplementations\sof\sdlopen()\sby\savoiding\scalls\sto\ndlopen()\swith\sa\sfilename\sargument\sthat\sexceeds\sFILENAME_MAX\sbytes.\n[forum:/forumpost/08a0d6d9bf|Forum\spost\s08a0d6d9bf]. +D 2021-06-11T12:41:14.442 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -507,7 +507,7 @@ F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2189e0e596010a0dc5405d9f14f78db1ee2fa71138c931f5b6ea96610b95bfc1 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 8c9c8cd2bd8eecdb06d9b6e89de7e9e65bae45cc8fc33609cc74023a5c296067 +F src/loadext.c 12684b3f19cd103cea97cdf14d0758196d0c646e12a898d7245141a9abfde9a4 F src/main.c 7a1b7017af16977b298ef5a0b824b1153f1c878f94885a098620c3c1b1078ce9 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -524,8 +524,8 @@ F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 F src/mutex_unix.c dd2b3f1cc1863079bc1349ac0fec395a500090c4fe4e11ab775310a49f2f956d F src/mutex_w32.c caa50e1c0258ac4443f52e00fe8aaea73b6d0728bd8856bedfff822cae418541 F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6 -F src/os.c 6e94cd64b134c9317e52ad534117578e3df66ec180d70dbf4b1d7eb1db8e5a5d -F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 +F src/os.c 59ed1f503347e8b5434c0ce7d7d0f02a3f24a72fea8b26d0bba2de8dfaef778b +F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c efa60c1cb54dba767abbba3c6dd67d3df5ef8aa26e2e499c37f055f56a374068 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 852ee0e91ceae090157c4ab2805530f5d7985a490ce77f54d7b148f56e466f79 -R 4908855f822587627e5ff1f9cc5f199c -U dan -Z 6050252f76b9f756fd3413a1f8f80a55 +P 6f1f2a0a9cd75ca43b81cc325296b843ccefe6f8040da8f2e873f49928423f10 +R 23cea976e993f7dc439db4b62b27e10a +U drh +Z 412447a47d8555a8bfce30ac9e03c884 diff --git a/manifest.uuid b/manifest.uuid index 29b3059d1b..fd32785982 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6f1f2a0a9cd75ca43b81cc325296b843ccefe6f8040da8f2e873f49928423f10 \ No newline at end of file +01f3877c7172d52225705d2461addc6129fe9cdb04e6f643518fc74bb4b526e4 \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index 60cffdaed3..aeea837c97 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -515,7 +515,7 @@ static int sqlite3LoadExtension( const char *zEntry; char *zAltEntry = 0; void **aHandle; - u64 nMsg = 300 + sqlite3Strlen30(zFile); + u64 nMsg = strlen(zFile); int ii; int rc; @@ -549,6 +549,12 @@ static int sqlite3LoadExtension( zEntry = zProc ? zProc : "sqlite3_extension_init"; + /* tag-20210611-1. Some dlopen() implementations will segfault if given + ** an oversize filename. Most filesystems have a pathname limit of 4K, + ** so limit the extension filename length to about twice that. + ** https://sqlite.org/forum/forumpost/08a0d6d9bf */ + if( nMsg>SQLITE_MAX_PATHLEN ) goto extension_not_found; + handle = sqlite3OsDlOpen(pVfs, zFile); #if SQLITE_OS_UNIX || SQLITE_OS_WIN for(ii=0; iiaExtension[db->nExtension++] = handle; return SQLITE_OK; + +extension_not_found: + if( pzErrMsg ){ + nMsg += 300; + *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); + if( zErrmsg ){ + assert( nMsg<0x7fffffff ); /* zErrmsg would be NULL if not so */ + sqlite3_snprintf((int)nMsg, zErrmsg, + "unable to open shared library [%.*s]", SQLITE_MAX_PATHLEN, zFile); + sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); + } + } + return SQLITE_ERROR; } int sqlite3_load_extension( sqlite3 *db, /* Load the extension into this database connection */ diff --git a/src/os.c b/src/os.c index b11c49c1d5..f1798ff96e 100644 --- a/src/os.c +++ b/src/os.c @@ -252,6 +252,8 @@ int sqlite3OsFullPathname( } #ifndef SQLITE_OMIT_LOAD_EXTENSION void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + assert( zPath!=0 ); + assert( strlen(zPath)<=SQLITE_MAX_PATHLEN ); /* tag-20210611-1 */ return pVfs->xDlOpen(pVfs, zPath); } void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ diff --git a/src/os.h b/src/os.h index f841d6bab1..1a8eff3298 100644 --- a/src/os.h +++ b/src/os.h @@ -33,6 +33,12 @@ # define SET_FULLSYNC(x,y) #endif +/* Maximum pathname length. Note: FILENAME_MAX defined by stdio.h +*/ +#ifndef SQLITE_MAX_PATHLEN +# define SQLITE_MAX_PATHLEN FILENAME_MAX +#endif + /* ** The default size of a disk sector */ From 35e6cd09f2387cb75d4b971413d2efa3f8d91b13 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 11 Jun 2021 13:18:56 +0000 Subject: [PATCH 64/70] Reapply two recent ALTER TABLE error checks that turned out to be necessary after all. dbsqlfuzz fc5a9deefda00dda914748985155a6d4c44174e5. FossilOrigin-Name: 230fedd923c87741d20caf55f29e8464cc6df344536f9b89331e0a0059a926f7 --- manifest | 16 +++++++++------- manifest.uuid | 2 +- src/alter.c | 38 +++++++++++++++++++------------------- test/fuzzdata8.db | Bin 2397184 -> 2398208 bytes 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index 42a031c95d..19ea042367 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sbugs\sin\ssome\simplementations\sof\sdlopen()\sby\savoiding\scalls\sto\ndlopen()\swith\sa\sfilename\sargument\sthat\sexceeds\sFILENAME_MAX\sbytes.\n[forum:/forumpost/08a0d6d9bf|Forum\spost\s08a0d6d9bf]. -D 2021-06-11T12:41:14.442 +C Reapply\stwo\srecent\sALTER\sTABLE\serror\schecks\sthat\sturned\sout\sto\sbe\snecessary\nafter\sall.\s\sdbsqlfuzz\sfc5a9deefda00dda914748985155a6d4c44174e5. +D 2021-06-11T13:18:56.772 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c a5ddc873aeb9c162082735e3f33f0c97eff3827fe3512a9c55699966565c6c24 +F src/alter.c 3de695d859627b1a80f673c16155260a12af310b5853012da411f81e6f4442a4 F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -1056,7 +1056,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 98f0e365370523732a5ae916af0e231b34a7645e82d1aa9b9fedad35730dd926 +F test/fuzzdata8.db 9e0123ce3df47d1f159f7b71d60b96bd8b89800a40ab081c5402167d7239ead7 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1918,7 +1918,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6f1f2a0a9cd75ca43b81cc325296b843ccefe6f8040da8f2e873f49928423f10 -R 23cea976e993f7dc439db4b62b27e10a +P 01f3877c7172d52225705d2461addc6129fe9cdb04e6f643518fc74bb4b526e4 +Q -6f1f2a0a9cd75ca43b81cc325296b843ccefe6f8040da8f2e873f49928423f10 +Q -852ee0e91ceae090157c4ab2805530f5d7985a490ce77f54d7b148f56e466f79 +R 209079f8bae7abdeeccb2384f599febc U drh -Z 412447a47d8555a8bfce30ac9e03c884 +Z 7b5e924ec5b470cee8adabc26d15dbda diff --git a/manifest.uuid b/manifest.uuid index fd32785982..17a890722c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -01f3877c7172d52225705d2461addc6129fe9cdb04e6f643518fc74bb4b526e4 \ No newline at end of file +230fedd923c87741d20caf55f29e8464cc6df344536f9b89331e0a0059a926f7 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index e5f1eb3154..de0dd4e4d4 100644 --- a/src/alter.c +++ b/src/alter.c @@ -802,27 +802,27 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ if( pWith ){ Parse *pParse = pWalker->pParse; int i; - With *pCopy; - - /* Push a copy of the With object onto the with-stack. We use a copy - ** here as the original will be expanded and resolved (flags SF_Expanded - ** and SF_Resolved) below. And the parser code that uses the with-stack - ** fails if the Select objects on it have already been expanded and - ** resolved. */ + With *pCopy = 0; assert( pWith->nCte>0 ); - assert( (pWith->a[0].pSelect->selFlags & SF_Expanded)==0 ); - pCopy = sqlite3WithDup(pParse->db, pWith); - if( pCopy ){ + if( (pWith->a[0].pSelect->selFlags & SF_Expanded)==0 ){ + /* Push a copy of the With object onto the with-stack. We use a copy + ** here as the original will be expanded and resolved (flags SF_Expanded + ** and SF_Resolved) below. And the parser code that uses the with-stack + ** fails if the Select objects on it have already been expanded and + ** resolved. */ + pCopy = sqlite3WithDup(pParse->db, pWith); sqlite3WithPush(pParse, pCopy, 1); - for(i=0; inCte; i++){ - Select *p = pWith->a[i].pSelect; - NameContext sNC; - memset(&sNC, 0, sizeof(sNC)); - sNC.pParse = pParse; - sqlite3SelectPrep(sNC.pParse, p, &sNC); - sqlite3WalkSelect(pWalker, p); - sqlite3RenameExprlistUnmap(pParse, pWith->a[i].pCols); - } + } + for(i=0; inCte; i++){ + Select *p = pWith->a[i].pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + if( pCopy ) sqlite3SelectPrep(sNC.pParse, p, &sNC); + sqlite3WalkSelect(pWalker, p); + sqlite3RenameExprlistUnmap(pParse, pWith->a[i].pCols); + } + if( pCopy && pParse->pWith==pCopy ){ pParse->pWith = pCopy->pOuter; } } diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 3f68cf0916f34621cf81c6042f678dcdda5c6478..86217e4b421375154ba0316867b7d9aa9514c191 100644 GIT binary patch delta 37522 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ɉ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 >u(fq4@0E3A)?J7>$WzQ6Z zT@4{?jXfOe{AusPa7w;CQ%iM@4!K~`ivATxJD z|BLo*@@{&d05()HMnPT>?NSpS*pCuekVgfc_0L#?p{3SwlUo)-^fr5MI8oDK26c_0 z0c8AWm2g9u-7etnYxdrZ9fXHvw5?CrVQ+}tuiN*FgmC$??O|B;ce_@=I^WnSq(2PF zE$mgG+mFU@hpkg*q#MNS8zbadkmts+57yD{$3U38;utEjkAMs(1fE{E7eQ%ddnnxe#co8a+3}boW9N6<58xry(TR{T zJipf-!_fMjolxB$+zu*n{S?j@*y*&J*J04}di7hcfp4i}6<@^8=T-7If^%VxvGQj} zBK)x!AMW^&$whSQG-T1v61|ZQssZ~PGUKR3E@`MkhJ%mn9RgB7l6qT_PGuGv9ONu- z(r}^dy8YaLaoD}SV?RHsS!m%;1o-?T#zDoQ=djRDmtJzaoE0>6&>~Tc=^r>6GsxQ} z*TuA7Y*htV*vc`VK(ZT;BkBg$fQtgV0KPts>sZ>>5h1dRkh)E#Q*Rv{r$u%NZjEz< zz@q^UH$)ZMEl>zlGn>-IK^4+hFzXi^m3tMplB|$cOL9ZVcE?U=)z|S69p6mv;b;JP zHB2tZoa@+$zxH#OMS{p~**ui)9^{~O_m>d%o~scI-DlhkDNzK=P<7rS=r-1|15865 zHdMwqJ`XsXYq0rKJ8f1+IOr7RS5T7fpmT_$9abt}#F&we^HdRW-r|AXOB|J%R^{R~GpUdBInslzYIH|ecA1iw07 z!GuMQ&Xj{XVlRfI9*&+B<4=RA0-$`u^u*xc&s9qwm)@ z@;9S&?Ig}pe1N6f)c9T8{WxL}<+3(7-W3QmEAQZNFgU&4(Gs4wb?hv7#~})ISTuRP zV~-eM9EfphM@8@%kcGs#0Es|aa^LKq+wef1e2+A9iQ+P z`|`I4JA0pBG+(gCV<Ab*FVAZH}R{p84pO=p62SbCkS>>t1y zX$L~eO`538Qpatb94~3kPUHN{28-xCggfs!s0@Z6HR%bK-g8tIF!Z5=HZxBlKU1y> zb-@AyaTp zV)9=a4FO%9esr{BTudWLz)?CKWc;B>pjLNO$+_mJflswgEkS1x=5>+>QJj%_+E;e9 zIrj=OqxZEi=c*$EwmY1?AmdAi8TD#l*ux2VuG-q&YF0(hm*Fn|A{cS2#l76N|BT*h<5JLF)Jk3 z4|ZVgUE3eDFK+Inut9}el_Eo6<(g0flnvLZImXCLDx9aKuzME@6?ext>p?~rnrd&n zbA-ZL)5s4M#<@4)pZ%PAkw)!1s0a{yJ$8xdpinCU19f4>Qn7W#}4OP?A4zQA+MvOhf}XKg4|vGtQBSC;{xE zvI>n{50mp;hXg#f*V&#CTvbvvA{{bry6a%>e&=vr*OYM3RY<1=v=Q|o<+_uXj1Zu8 zYiL9W3_VI!;7yJ?&*;GSDiwI0XcA%KGU$jCKXR@Ssmv*To%A8EG@lC_>|!$<`o3$S zAW{Q#EW<_a`;2SvKN(xVSR;t}$+;Qwmb+9a-e3%alt$EZ=0w*`Xjw^o1q<_?SNMV> zHwK$eq^c8xI~RBFci!btj@$%ni$pI*|LG*>SzK9&$D3cvU0Kc%*9CsNDX?7<#n;!J z9z8Gq|9(E7y={>2gZn6?HFxcy8a%mqVNHJrn%az>{N^x<8RQuHw7~q2U6jenOs9&% zyq#ie+<4zPlF<>Z{Lfqp)!Dt~&Vv)X#Vwff(D^Q7@sNMkwF^S-yV4+Iyz2>8`H6do zmIPQx6cLxWX5q6`ryyWTHFuA|h+1J*sXLj06|vRiBp8Huj#I9BUg$5fb3fxM7lkoq*9C#KL)&_1eF{$E z#o73Q&DB?+!Yf;@6Yy=PYn)#0Bx!zY!Ugp{?yu_V%;W@;RY&wq73~6_dOhd06bjGE zHQ@Yb&TD)cIzh=0aV{n#x(X@9y~~-yr9|6SjZD9gF-%;Ig+rXNq@x>*RD%^9F$-z> z(-@Skb<#mY4OMU!U6HGSy3#cTOCP#IN%o_}8E~S5dnzPd@@OGCPP9Xz)s;Y1q7haI zUGMyfztB z%MeE>MBjDhb4}<#pCqsylj9*%jhKv^(w+4LEN$tEpi>AC6C;-6@f|J-NXP(FDE;Fa z6PVf_5YtG^0kXYbn6!q^dRcpygR!2FScfbjBf>o&TX%F739J`p9dJ$}h88%DIIkO> z*`Ru#tV8@#!co^_i2loFh3P$AD_9?lX~v2ee%#yDQeb_vQ$LQ(&JC$Sg&dwLIKH22 zh+f-;)Oc-`m*X(?>l!}?!%0)JCO};w>A4x7s5GO5h zeD#ORERC7Vrr>tlL#B1xv0idBM*brJ1$>^ zW7$jrCW#zK8p@9+W8yi9&)8nRq@|GFcBtRchROoBaed6@pKd;!Qrk3)?==^ zn6uV3L1d%hR&|xqYwKNyb?k4zEb}+34sRB^mQd)qPdfABI8Ju4j#Bg*c^rnFa^4i7 z^qyFS|2-bV&NzFrZR1>|^{btxicxe7jA8Fys&L?u zJQpcXs&FP=MeafNI*MzAo`2{!jx-H;=eRetV!=UjRn_Tv$`7zK8_GwzieZ&qq^#u+&WV`xt!tk^h+g>^msQ}?G6z@PcTtvg4wg>{Tv|(> zEO)Q7%FBu2{)s%pT!Mu76UC~Fc5qW&wm=W_2pV!-Bg4Ap?1Qnty3Wfi1AKW#4~F_& z%?0fJ%(a^_9}f`D94K}Z&gF;X1`&twnB;CRvIUUbID+s^#eG|33t@Adn1V^aJ4e$I zyvhQdzShW#U~>Y6RD~fFo8*miCqcqy=UQ^&?!H=aN#o%dGuinz`GDG)ytuTzM@4h9oUQjjGJyu?Myr;h>u84I{7Ujjn$SNqk>~P`0X>Kz9q2C$p zIcuyT(CVSxgoSI2`hbixxn+e@fK4+9rPHaKjBj0cNqhH*hMd7}TD>%K7PmJ0zXzOG zF*qtm)5vc^@;hI^$-x0lpvUeiJ@kf1?J{dcc>`m&^R|?)?{akfL6@286}7;W~a0?b#$AVNe_u?oj^Md;`t*4DQaT zPELLgHeb>nh7g-Hkbd;Z=)%03o)Ah3PuEhIlzYtkF7I$VWEE-)A#Ia46V(GAC&SSj z-ETAYK4g8QZ3zia4LXSK7Ocl-?|20=(czvvPzMIhhnsUH7lg)&THN@Ko5H^xnBO~+ z0_?)ao>H8c6G0GoX;;re-p5XenJCdFZoB)uPNq%!!x?-O{m{5IqFjKGE!u^g6?_1?wed!Eh#QSX7UeV&`peYlbjneS^yly=~`et*hSnN zfbWyHxDiMWl?w7w&IG!W+xSYQ0$by8C+$ zHO7x7Gm9;Cf2mNu&2o<{_oJ-l{(&&}p8I3{hd9kYK+-%4fTV3;<$ZUAa%69Pe}4{( z^14!>^HYV7e!J9pVzZgk%!Rv;gR6G=Y9pGFi(j7vo&4(6oTxm!mo9J zbv9>>0HA{Jhk5!4@+ZXgX#yg=!7y~7v;j+}d5ak?ukM-22viJfr)>nevUfD!3e!1~ zW7-}NTHro~=WBT=BYXymj(Z6?tLq`;>@2Jr=AjgDv}d14rFZ$GwX`LO^_1pmrlqYk2gfI1#Qj@=U;#uAV|IOTn;S9y=A| z?W^k_DrvqO{6abp_j{}1_CB7zOg>L-UWM{bwjP)l=jkor&HG02n8 zu|;1!PXlb6;yEia!Vf>zMqt7^BVjY+M|wbDU!gB9h>WkShc+A6jq!}tQgNNFx@R^f z&GfnjI5Wj*rChKl8yZjXoMks4@xEs!+^i#2#8!8oHv>BYVJ3&+aixikyGg?m$hQ}^#cheyuQLiIgRTigKwdHvDyo7=6LBRRnl5| zGg(eYO14B_^%ld;!P>xf`a38&rcI>nke6yZGEZpJFynXchs@d}n)}KI(G8<1cOZWc zB}LlzAZ3Q95`MDQ6VGe)(nm>Tkn25UkoTaxPvjC@p6gk!lSk0jmQJRS#v;whYVzj& z?3MZ6_UFRZ{^7JK@X?l?>oeW0M2Rl>hrONr6fzO)$$xMwWrwFh&Q8yB`3~KB0EwaD zK}ZJpfOaLVrQf)^{0K$qo{KL+hkv=(@A>_Qko<@DB3|9^sr%xm?>tohScWkfS}LVT zi3^G#PaG^(#e2s+!5pRB?DJ4yROlg`@Fz$T^uL!CN@z_O`_irJh)iLJ5>mrbhUxPdv1kKY8YQxsJKx357xQ2K=KwMgTY6=5l~;}y-Yx7R&CD! z%q;PwQ5pRZZv$=x1Q%r0_k0aeA9|<2t{UE+6wG-uK)oj_7-jKNtRurMK{|$MBfNAl zV?&joRyf=4T}JhTz!qqqL#a**g_Hwg7}da#J*K$4@A4Yn^f>P-F<=3CA>N)$kLd|s z0^@VrYl8wT;qox=OkO&ee8}AwCQhecE;%*W8!X_Xb)IO(Iq5@ngUQF-OF0`Qlo$O( zy8ugTdnw2^L2{9Mbp7+%vI>-I+eK_A%il*NQ z5ih{`ALJM;+el3pNHVv8u^=Erp z=4^J)fg7_upA~fS5~S`#-y-jPDs~;KC4ZHrQ|DToD3TO z-|guOYPR$MGopj&Aj^N`$|EanD5UT8bo(y}zX*~@Uv5C@pWYk%nJ`E%prwL_v`A#( zaBH3M-2Za=!x@XfTN{ia^ka~P6fY5<@c|2n1XfS`N`=3F!7mcO%XR!j+MiSY%NBub z@iAACs`RM=Y>Ct>i3=prRDqm{qy_r zdhx)_GtbPKGc#vq&YbfeR-X3!N2qOU_BoOm(|k2lB{zGj>$}3eg3{JhQ|TbHQ&4St zTO0ni)YBB6sZ;=142lkWCQ#Y&q$hX_e^c%KxJ$yB+iSuDpN^IURDU9cbWw3kF_$AzqPK$#e0OXhts z-kYH%+XvAoVpI4^hG#oA8<#OH%pC;?rAE)h_ovGq?`rWHKx6xw!LY5`1EYiPw0sl} z1|gJYNnHJGq{kx4zf0;tCl5DUYnF?x_?%cL?L6V>PuVTJFnAx}vhBR&+29Z!c|X(* ze8CmB$(7D1qBkTgK$_c8()*N);P0xdj<;fU{?zVbg!ck1k zUQX+r&V62nHB2 z-dmu<6|7w$aY<9}B#YFSqEA_8aK6X;gjMRtS))BLJwhA85AIgZ8izTdz6IBEOT!Bj z^8Oq%I6hY5_~u@(Q<}_4?YzgW_6(FZkn?Pw)!^`#@lR2wPTne5BNp5jzk*AWy-&rI|t2s6XV>E3wiIoZ35ZlC5I#%=Sw z9;bZ@j%3Znb01zZ!wbCzOadL*bmCPn2HmsXnGz3J>~)yqA_u2V-lY*XKs4_lJ-JyL zpIPK>E!hEH;TTPoYrXwMTDHOg+g9YwbJ^jkSJAi*VDPn7-j?nM)gPS7v(w2~!GyVrc>;&GNp@?{4(&Gx3!- z0kBShg(CYH{$#6Hv)BQ^;dqFbf8?EP;mkL^OU%JLnPR^8UgoMJUMO~gyS<$q!o_cY zr@F5@6yRv|z!0BCUEL9lXz5H}Pi|D{y<)LXLS|FAa+t43;+2PyB|IrBhx<~k^^jUi zNc+hfCt7bBRc8CLsZ~yN3Y8v@h~tW5-aD*7pI*M+2fwx|@6S$Y1}B{py%fHvjv1sc zh*7zHwC_D@$(s?8B9ECQ1>v+=Qtd5v2~WN^Ovvk0xN5qkq_?4TK2NGFd14h+Cut$Di5x7r0o zWlWUsThl(!F`v`Vd-p(s{}7RGCV!lgeu_9j)$OfLuB!I7u#0UEP#WkuP>Qmi|*Ln(Pp;vbP>&0K?UZU)wz67f6;A?DOfP$9Pt-gw) zd=oMEU4PZEp2=7QE~TUiz7wq6&wW%+1yRO7bIzg$P`P73?G&f#Uh9O{6;@tx)mC~q^Z7E)S-FgW28EKck;CXz8Oy8 zzId$ZKPyyaahGiDP&midpb8%8V$_(uO7Os51j2}uu6a*bDf=u2!pmx8l%RIiQ%MLp z9`a@Lyx{;Lgk~^jz7JSw*}l7+(DKc#^uEbQ$N9QJtw%ARcrO#i-2Hs#Bp>XUpXHpl zz4IkrnCF{mIx7Abr)%{EqszjY`cdEG?&qFw5k?n01bD~4zx`UY`D*-@a#>}>NH_>z z?}j3A14kK`9Tu@Sx?!;y`#hJu9WfJ~Guvkl&1#xG)mKQ3@As_~AHBe3??#M7kM8N4 zO_Se;3h}FjK5X${EY9(zQtrVxC-%Pz?0a|HB6-AO-#RB8RkJ$!UXjG;siFU5_zI}{ zYQ%H2oqU6&4V=}*XNMc)(>}OCZltXKK1^b3e3-Isn_<{ z04HDYHFw!v_6Ccn&QGXnVT79pTLr2{==C+(gS zP(=gpr~J-xBHxqZUynQv2Vmyh!0|e_>FGaXrSre}T0;0hg99%4zc3QyHksme^i&xZWkdWC zqP)XYusIONy@&YU05IBA*+$vrff%|RE62f&Hm9i!&!D~jDx8x%CZkt0aJVj+on0&WAdChnXL=xw1G@ry&6n>&-5H4GUeo*st<+<70LZ4V z2YiB_q5y35=K0Ne?Ih(a3ZzkXsvlOzX)>&i-=n-*AH3c(1QTIQxB?m7yV$=D zjdU9reTv%@nOq-)z-ex?(hS^zz!`3{$_xxe;4HUUBLby4as*J70)8Pf&W%dx1Yus_ z_jCVJ|4u7iDDcP7*CS<*^Z~bd(foK6K0eQFHkyG45crU`j+L8oYPr7>+1-vN`*?!f z9HxV9D*UfVyls-4X^}nxq_>P_Ycs?TqwEHbk2x_~giG_~IGP)ehqkw_K|dkAiD;B3kv3*%F^}qGo11t}f%xs8W@Kq8Z`RzN4Aa z-fZQIRJ%xqmV2=bE%$$@vQkc^(&cglC;F9bWZ6==%W z$k3F3Nd;?V@V!*<{VR&O|y`-bvr7lzYb`0R=yX23dY@?c;vhaS8aXNT~Dz^o? z3l>CD={6ZCIRli9R?(ThOX-?I>1qBrmJi8a;06j9KFT=eIwCUs;jc8+WZj@M}2-sFs)B1DAB&zuXV}8p;FeUYZ ze8@yh{2T+NO||@ixTwN*QPlf4=rfg$lW8suod2}d?d*h~#Ez)%){uV)XM6lF2(!O}??hkp`_UKORImwoY2|ga zJ0mD(Qvl#3vHnintwMRpy0euZszR=-ni)o6viSKHm*(ogjoS99&O65%ADMz2pw{!uMt2>MF!9L;ND= zSi17F4`1~`@9Wvm|CVrVt#+cRO^K@v5NVo{9_f#xv~mc@Y6@sn{em3LsoVV~x~#Jq zKtuzRDZ8QEkmn5X&l84!%dN^}9vCMtG1=##K6yZ*UMS3I&t$Dfcpa$-n+$xP&@^DX5TR8=X%QZ+`l(?f5f;t;#5 z&DR0yF+G4L$Q4bXVAT`oCdBTWR*RZQiC29J-7`Coazoy}Xq7bTQ5Zn0=A%{ZdZ)y( z5tRCPAVbJjwpxs?l%9$v)#mvzwu01SX`mY}{0KO~M%k3@&JdmN3xc-v_nUHcqZP(} zkgVwOMg9-0mKI&9>`{#Bv}%ZW|4Ki^L`yn<2fldaK)}tNR$+F6*693D@x>Z^A+@IS z_liKN2(+Q|Bayat7=%yqi~bV=z3lub@p_|p-A)L1RJR<}wI_^9N$yHDm$8K~D*O;A z?Wt-qrf7)LVeTx=_w(KWxTN`C&5-yuD%> z76rTID5_PJXzE?2z)G#R(vkaX%6K#X6v}zWkA20{vWqU097Aa`mN8HTRXvAH=SGTT7m*A~pqP#dIQ50#R8OkffY;g=m>7Fs@*lRsYVXP~ z0gV1yjDFbaE#DRZeLo2LQb`IZa6|do|F%_1BS}}F;J@a_@j^OP?Gd@Gko`L{130R? ziB7gu#6=VVaPMZy8mRQ5+Ciw&jsvpFxvoI5z(1>cOH}t&NZXMO1L$;p1UDe*q63h0 zu(8VswB)vNfpb=C!O*Px@Js{ftbc+yR`AV^wVh|<$h^{#K8=r#{Q$&3;DQ6zmO%>N57BYGU zUbn(7?&PmBc$yXfPX|+h!;cMlM&KQ*bO%*g{fRW_J_StZCzvpVs+@=!{-lDc4iHtn zlhT)?4|K^4;FRz#s%nha+IJ8yX+r`BtsU zZK-IX63fem2c`)n&dK?*EaYt>56TW~x59z6O2zk?G5)Tslq*k}wYryKf@ZfS^dn6oM@~z1N<#TQQLznRM{7=fFS4~WR}y2#nE1UIw3zPdID zYil$49N2)1H)38O%nN45bK!t2e*!*6*M$pMpJs;R>cWNaLN>#mx^S4Y4w#wD5t;bw zBImI_*G#0MK+UM|9qo))uH4<%NDVOfQUnY$a? z-yT2vn_)HWT%OpiBV`4YUYwDJ)uOb5^<8G(m>TQ?{pz zW{Jq8u44ts$Z9?7E)kuaSy%1`+}I+*Vzwa67BPYs8(EJwBd^xwwTbmO5q_oAZ>Mg< z>lpSD>mCtV`fFXHms$6lA6>6uIqRATCy%QuX*2GD6yZ!SHYUGpQ});#5tubrnU|5J z(v4Z8P7{-92U?}Gg7y_f!bEAWvc>6$vNxDtIhAVSj8v+4!WBWkZEO@pD-J1Dk)Fr5 zG!HklH&}dOASJ!2q*D1|CExyPao=zx&_9&-B>OAKP3VmjYshbl|Mw=fpG0e5vG=5)?s&GcPKD{@-<8 zxlQRzCN9=`mM5@X?`zbf4%D49;4Q9`1u#W;Sh zRc!q2rwS}QL1GuFNHJz+gv69uFa*Q=3p9}4$deoOB$*XboLDRgHRdu@27>tOTXagPnMEswXR_C_HAz5 zRD~<+TU^jxn}e1*t3-=}Dsf1@ODz}mJR)k*g;AWj6?VSONq$ir_~;f{gi16uigt?@ zLuf6|9DA!cV7@_3R!K;0D?$pFrm5LjkR+%f${nMc%YGvG zp;}5g9n|L~ao4Ddu5=tXSE-uF#}K6KHfw&Oj#~&RstR~bkn))%ofHfj zW#Q;H>eFVUzenlOS}JKVS__e5#Q#>lu!3>EPXorQ!+3ZJX9aG}bj5?(I0>(Xx0-mb%o&{HB?7K zF7#Gcl?+#1bQ&!tnrI<-)JDxJ$yQD36rMX@oeQ3{Rf9D57FDJFebiq?u^&=;A9V}` z`l_EX=wu5tRr(pFE3AQPmBW^jiE3TWle}utGI4^}b-Z^^;4?3sC+H>Tx)iKzcnn? zj!{nuqCbPL$@PjbDsmG*!^W$V_{T+RBT2egCm2B45S)6{Dhs8O#Yk*YhR9)PWw4mO zDptL?iXbgfJz%8)cd9)_#-IO>VX*4@Fc6hEXDwNCz26IZ|3^3NBC>$%hY$uR2~O;& z#c8uvUvpZ9SpRp> z(HXX@@toF6J7D3&8l{C)vP%U5@a> zf_k%BV~!q^7SSHf(7c#u9pm zS;4_}=bzn@I>Nz39c2Ai-9#a)=t5mJD zvXt1gzu5T^Y}fzydbJbCc2{Z?vu4q-+HR{xi!qCD|3~FI2@^K6dj4n)`WFYs%up|z z{Yf0Xxtv^i;4HM#2PSa!Fm<13e-~!{>J zVXjC{AE4f5cBHK(t+Yr!(nd}B_xKcocdBsOt!xj`o3=>Z!FMNVFIk}HEBKFcPV^_! zjmL$XWzS+Wjs~dfP=h(MyS5GPysVv3P6AMRm)h1+(o=&`@%0XVT=WItasO?8&d}`i zs^~NjZLRpWe%daO-%m5;yTS)rt7#VT`QPLRLw=Yxfv%=haY;QW`p8^U^wFh6?IB(@ zSeqb8%{XVV`W%*qA1L>g4AEj}zn}rMMwxvhgXi9>g>8VeJ2qE)kWP%#qIq_yp$J9=-zAC2O+QiYg{+e#(4YgU`Y)&B-H1YuM7uv^9(wBWkAx)a@zAy<)r8lC*i6 zou`e{mRVs^w)F|j4Y?Lz>Mb6t1?iJr$i}-E%qS{EO97Erwp4>k zB3FY-LZRv>G=SPiT5wC>46P}5o2Egdf(s3bwN+HK7PKT(qxCk=(C!kt!L5rx%TfRs z(C<%aKFTiDaG~22&A|uqwVSPya1Yl0wAu~SYb>rH)B@amo(7eCkjlau^l}Tdi&iN_ zC&!~GkoXmpgD}~^CsGSqGed(B?@Dck&wRF9KxEaCUa!&&D&33bTXqz}rRO1( zaXQ z`H9_jJ1&4i^S3$$83Ntm@_i@(-Ns4PN5Pn`=d@#1T$3Q3)u6t*ph11rjlMjlL77*r zL74{=vB44!<}PXnt&u&t=S6=8ANo~B&=yH*BNYPWu?1G>PZe#XO;-PM5I z;R?M=Nf#Zc*|!?;)c#(lk7}<)xhZ!;BOC3%)$ma7F8aihZbm$}Yoec(q+2*?fMMEp z>85R0X-z~Nz0=T;xsyk~>J&E%pKy!KMqhqd(-)amTdw|W3+Zugfu#DfI6qD$wW$%q z6BG1e7=i6f)N%cMG=Gw$hb+(p>hqxl&kpJlwCsr9i0??&D}-fNZg&IdIVt)=m%vNi z8!HN#!DG_()fW3eh@!z*f*5-!bGY#!eKK2L%Ww73fr@ko-R?9dab7=tvK!E-HCei1 z-e};ui)xPOI_1vM+w&bmL>WV=Xq`Tdsz2AGdBHIKpwo{1`u>5UpgDXZTTisw??gd> zg_|2X#pg!rZLJctc_WS9G{9+Wr_5t|IX^#M$8FBT>7f()3d$X1H00+e>N(cP`=(48 z^U$=B)5cGNSN~bPDF<`)5pHoUGHf*GQ0`j& zzwDZ&1HvPRGVR7Kyk>wZcfXrS}W)1ki{#miUgfWc|B zQ2)^(K~I-p2mr(7`uD>7bZ$2T=p8HdO-?Bu$_)LmQM& zJD$>O^jOM$%1EP2cYr^G481w*%4h4NxwcG)>E?q}*;h{$%+95C3ycvQvrhlcAx)&R zE=C8+on%QY>1vGTx61XN0++3uuOz@DpX+ z#;@+svn;qrAm?sC6D<2B(*Bg%#KqaW^cSpBZt<0GVW9Vhj(th)9(^KD->?5}w?ixO z%@_v#krocWspm`f38=tSlG+>CY90|^!ejKm`cXc9Oz$kLxJoAK7~j2(J1J_Ce*0g9 z(6NR_CT*F7w{w2glj(JjK7^}I>fbwT(7(M-xIx)FMIo5JUDUf+rAKM&00Wx(FZ2se zDW8@uR_wo|nRKDsg=o z?u6$@VQ9--AA~#Lc{1D%&x7H%cvgg4<5?bViRa5&bV5+Mm ztl_yltm3&S3_92`|!*Qd+>bV|Nq{sIseZWXZ=6ko8{ce2r2uLLKuwNa|;LKIkNC}Jckty!1MOP+wkmLh=#UzE4&p?qY%w) zk1NbTo7rOuZ^AR8Fda`@A==yCpb+hC`?XL&kN#MQR=0gu*aHkNL~p|n&ZDz}`pXzJ zMj2&x)}1`kZos)cETrKXYShCx$}hT&krsFn3ji#0gx3wWz^jpYIBvt3>JnwFciQ|g zY@@t4;8cy-q1s|EKq*fMdENnYi-AMS1r&2kf10258)L1~Lduz_r&HR!`UJX>(<~^} z^jO9?9VKyG(CB2|Q~pAfkY-23AboOOW*EBBcbbdAaKRj;k0W|9F!lBOO775K!6wZ3 z-T_O$D=Q2f!6h3wf`eJ#ojQE{QVbmF6p{3mj$QQ^I`iV%%l319tOx2T}0_RJA13m>M6}dvfYS#y(Ko))*l8dRPdl75H66NuTP6=#_ho zfmF0yx3lj)0|4DmbJBD}1Em%EFwW00o)8#=mA!-*9c`>~*$vF~4~QZJc9m<*I$KzW z05rM%uR;%CKZGRD@`*`C0-PbP6VQe?OfiN_(pn(^aT&ri;}fg&94!wR0Pvh);3Tt@ zw)WJU((y4y9xuu_W{PW>mp^5w|C)pv^8@pZH5TawI$5lD5L4n5#w7Hc3rpd$<;H{d zbv#8C~3t)^L)0b-ehdGrd@8Y_xBEMh&;(tT&7;rsbaNRr<5miTUY}f%$10 zr~c@yw9qq04cu7fa7B{#v(qT~Tx(i9^R!W%d%8XK{8THTm%cROMX%V7JC|^Ru=1EO z8QZU8Mw8;npXc%8RR&PrchaWcobVbxWx#5HDd&AL)0{JKCcKNPEiPCbUNA_w*;YGT zY1F+-C=P1prcpem+E{CK@9v}JXhQ~RIi$C4)QXcY8YirlJ-EUt!sTQ23j@Bb`$%$Q zj`P=Ewyc;%1Xo$$sGB!EPNSkVHeiCi90z1_xW`k41@HhP;)Bl%zBZ?- zcjLAT5`TnB^&i}P0Sl??L_KJVmlK?KYtv$hdi`lk6GYz0APsiNReVAZCV`zntDm!a z2fH}zIB@-@j-6EeK(HJCnh~^H#kCi%_gQ+X*&t~7uLG&9=BWO`tC9q?Kugmu_0+@j z{l0<0^%j`Apq9slp5!~an17V_gV6o)vNJ(RZJKP^WF*@Ad)?nGdx{(-q zAedx7|C%G5AfU&(i7HQ&-rG4YIH92(hqup9#h0*9m=;{>u3nZGP6Cwg1BgnZaSsPO zyFOlgR~W#fu%WJM*on_Q92A#*phBOpZAK7Aw>5NSriSg>+#vjtKI5d}j^5J$9Y#Rd zySgsoZeGu|olAmNVG>yH*g|k@X~V|yV2!wcIWO9CwB8y2DarDAGV9|!ORY5ME(g4g z8o1!d>+u|cDTWmW9M1#N$^L8*EB;RW%8S8FYr{{GQ^5)@W8ni7~VgCwWeM?Kn;W~_u^#}tdTERngzPLeb z$!poRSNy$#ExM@t_r)h$#Zu8ZS4464k8ap zfrSgJ)APaiCFzHq7lPl|q!j+PIv8V>e%g64c!$FdRKpU{hKao3tKcJ&^vljm!8l34 zC_Z_w8GY+F!D|jXbjJ&ZB8;2Ie+XJE0-ms>F~Y66^lES<^pZP&4i-D?@R@k-VMK>$ z?;pXN+zl2!9PWiqGWkZ7pZfk8+-3g*t6z*)i~Z7$+EA<$W_*p>$KAstTp{R>Y;0>7 zn(ng01z=y@hedkG$G|gO3;-%%GtAr9Jvu&>5@vc2Y_RqU)!jWBLK8Njex2g5H;b~nd1OZDMJL=v%f^Rbo1Z@-)QMgh z;b_P=PYjI^1J4cA_DP|u@VKpnE9)OQj!14gIP|U1-<9QsvTQ*HNF}olxujqY7cSqpz(& zQ9980ib6Mu`%twQ!h!-ZQA zLm=iC(ahMCxPkn)$<>+;)I_wXyZxPU`#Tl|IEUs)jV2F>?8HO!L*+uFSMZb(lIXeF zSUYzp2%WM>1{EA|cP5}`zsrvKq3B2fgjNVlsiM#lf$7`Ob-%4ZDvS!>%6p4K(GtAs U-d!GAVj_zb4*FNJpF#Hj0k-CSW&i*H From 24ce9446a848459b70b2d18594b905df9672bb57 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 12 Jun 2021 17:45:32 +0000 Subject: [PATCH 65/70] This is an alternative approach to the use-after-free problem fixed by [193b14a58e378ab3], saved here for historical reference. FossilOrigin-Name: 6796b7a2485eca279db9d777595a886bc0d1dd7ec9551e1797e0032ef5493559 --- manifest | 22 ++++++++++++---------- manifest.uuid | 2 +- src/alter.c | 2 +- src/select.c | 22 +++++++++++++++------- src/sqliteInt.h | 2 +- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 19ea042367..f2d668bfdc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reapply\stwo\srecent\sALTER\sTABLE\serror\schecks\sthat\sturned\sout\sto\sbe\snecessary\nafter\sall.\s\sdbsqlfuzz\sfc5a9deefda00dda914748985155a6d4c44174e5. -D 2021-06-11T13:18:56.772 +C This\sis\san\salternative\sapproach\sto\sthe\suse-after-free\sproblem\sfixed\nby\s[193b14a58e378ab3],\ssaved\shere\sfor\shistorical\sreference. +D 2021-06-12T17:45:32.816 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 3de695d859627b1a80f673c16155260a12af310b5853012da411f81e6f4442a4 +F src/alter.c da02319df16f58f4a86c1b4a7c171ccb87cbee33f408545cff8fe12ac2fc4336 F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -544,12 +544,12 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 96d8a8c19d8dd4a605f55166e3eefe4f8a3cd4d3e9255096b4bc740c75159593 +F src/select.c 371cf15116b20b236f099c15daafd2ab6ef4bba43a263100aef60506f25cb3ff F src/shell.c.in a4bc0e2ba9be798e293790f354dcc0099c6370127eec18cf49cb161b9dae2fbc F src/sqlite.h.in f450394634eac00bc680c0e91582b818359c6ad61149f49f90fb6ecbd526b51f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e -F src/sqliteInt.h c33a2734081287541a8356d2f2e6764c1b9f9c9d1635e8233084205ea7f11f65 +F src/sqliteInt.h 30723f0f0528d080951270df667182d84f3a3bf7e0d4942007c4d38468042359 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1918,9 +1918,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 01f3877c7172d52225705d2461addc6129fe9cdb04e6f643518fc74bb4b526e4 -Q -6f1f2a0a9cd75ca43b81cc325296b843ccefe6f8040da8f2e873f49928423f10 -Q -852ee0e91ceae090157c4ab2805530f5d7985a490ce77f54d7b148f56e466f79 -R 209079f8bae7abdeeccb2384f599febc +P 230fedd923c87741d20caf55f29e8464cc6df344536f9b89331e0a0059a926f7 +R ba0b1c0a7ea04e269896819b2a1250df +T *branch * alternative-oom-fix +T *sym-alternative-oom-fix * +T +closed * +T -sym-trunk * U drh -Z 7b5e924ec5b470cee8adabc26d15dbda +Z af6dd9a5ef0fe38928295fa12b9f4a20 diff --git a/manifest.uuid b/manifest.uuid index 17a890722c..be1fb81af0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -230fedd923c87741d20caf55f29e8464cc6df344536f9b89331e0a0059a926f7 \ No newline at end of file +6796b7a2485eca279db9d777595a886bc0d1dd7ec9551e1797e0032ef5493559 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index de0dd4e4d4..24b0960a26 100644 --- a/src/alter.c +++ b/src/alter.c @@ -811,7 +811,7 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ ** fails if the Select objects on it have already been expanded and ** resolved. */ pCopy = sqlite3WithDup(pParse->db, pWith); - sqlite3WithPush(pParse, pCopy, 1); + pCopy = sqlite3WithPush(pParse, pCopy, 1); } for(i=0; inCte; i++){ Select *p = pWith->a[i].pSelect; diff --git a/src/select.c b/src/select.c index 589c8532d3..660b8302e5 100644 --- a/src/select.c +++ b/src/select.c @@ -5093,21 +5093,29 @@ static struct Cte *searchWith( ** be freed along with the Parse object. In other cases, when ** bFree==0, the With object will be freed along with the SELECT ** statement with which it is associated. +** +** This routine returns a copy of pWith. Or, if bFree is true and +** the pWith object is destroyed immediately due to an OOM condition, +** then this routine return NULL. +** +** If bFree is true, do not continue to use the pWith pointer after +** calling this routine, Instead, use only the return value. */ -void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ +With *sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ if( pWith ){ + if( bFree ){ + pWith = (With*)sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3WithDelete, + pWith); + if( pWith==0 ) return 0; + } if( pParse->nErr==0 ){ assert( pParse->pWith!=pWith ); pWith->pOuter = pParse->pWith; pParse->pWith = pWith; } - if( bFree ){ - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3WithDelete, - pWith); - testcase( pParse->earlyCleanup ); - } } + return pWith; } /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index ad857ab03b..4e99be3843 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4987,7 +4987,7 @@ const char *sqlite3JournalModename(int); void sqlite3CteDelete(sqlite3*,Cte*); With *sqlite3WithAdd(Parse*,With*,Cte*); void sqlite3WithDelete(sqlite3*,With*); - void sqlite3WithPush(Parse*, With*, u8); + With *sqlite3WithPush(Parse*, With*, u8); #else # define sqlite3CteNew(P,T,E,S) ((void*)0) # define sqlite3CteDelete(D,C) From bd0d62c35b431551328d24e6dbaf36e35da8a617 Mon Sep 17 00:00:00 2001 From: larrybr Date: Sun, 13 Jun 2021 08:23:28 +0000 Subject: [PATCH 66/70] Correct link in .ar help. FossilOrigin-Name: de9d0f9548106f5a59c57dbf947fc63c0411b1e975033a4c4097cefbbe86ee5f --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f5d5c51695..99a4c1d70f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\ssqlite3WithPush()\sroutine\smight\sdestroy\sits\ssecond\sargument\sif\sthere\swas\na\sprior\sOOM.\s\sDo\snot\suse\sthe\ssecond\sargument\sof\ssqlite3WithPush()\sif\sthis\nhappens. -D 2021-06-12T18:12:59.775 +C Correct\slink\sin\s.ar\shelp. +D 2021-06-13T08:23:28.322 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 371cf15116b20b236f099c15daafd2ab6ef4bba43a263100aef60506f25cb3ff -F src/shell.c.in a4bc0e2ba9be798e293790f354dcc0099c6370127eec18cf49cb161b9dae2fbc +F src/shell.c.in 586493be0d3a2fc1e6803577d683697dfefc0fb305cc966bb389ce4045cbc19d F src/sqlite.h.in f450394634eac00bc680c0e91582b818359c6ad61149f49f90fb6ecbd526b51f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e @@ -1918,8 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 230fedd923c87741d20caf55f29e8464cc6df344536f9b89331e0a0059a926f7 6796b7a2485eca279db9d777595a886bc0d1dd7ec9551e1797e0032ef5493559 -R ba0b1c0a7ea04e269896819b2a1250df -T +closed 6796b7a2485eca279db9d777595a886bc0d1dd7ec9551e1797e0032ef5493559 -U drh -Z c3c98555039acb2765b853d05e7fc36d +P baa3f96250763b42391fbb4dea283a4b6140fdbf775d85081a9efd6e6258f7b4 +R ef5c9aaeef37f976cb4a94e50d9b811f +U larrybr +Z dc18297140fe7f47c4b68b1ec10754aa diff --git a/manifest.uuid b/manifest.uuid index d99f1db1ce..8cb930ec67 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -baa3f96250763b42391fbb4dea283a4b6140fdbf775d85081a9efd6e6258f7b4 \ No newline at end of file +de9d0f9548106f5a59c57dbf947fc63c0411b1e975033a4c4097cefbbe86ee5f \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 5e1eabfacb..5aa28d0b6a 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3877,7 +3877,7 @@ static const char *(azHelp[]) = { " .ar -tf ARCHIVE # List members of ARCHIVE", " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", " See also:", - " http://sqlite.org/cli.html#sqlar_archive_support", + " http://sqlite.org/cli.html#sqlite_archive_support", #endif #ifndef SQLITE_OMIT_AUTHORIZATION ".auth ON|OFF Show authorizer callbacks", From 7a7cefa0b82f47cbc92a2b422597a1e648f81ca7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 13 Jun 2021 17:55:58 +0000 Subject: [PATCH 67/70] Improved defense against OOM errors in sqliteInitOne(). dbsqlfuzz 429db39cd5777c46479641e8637c48c62890042d FossilOrigin-Name: b6c57e0e2a9658417a0a5548e73007faa59c837b9ad87293bc216feef980717a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/prepare.c | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 99a4c1d70f..2b3e28ace9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correct\slink\sin\s.ar\shelp. -D 2021-06-13T08:23:28.322 +C Improved\sdefense\sagainst\sOOM\serrors\sin\ssqliteInitOne().\ndbsqlfuzz\s429db39cd5777c46479641e8637c48c62890042d +D 2021-06-13T17:55:58.092 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -539,7 +539,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f F src/pragma.c eb42cb9bec189cf18cef5d8fcae56e13bb73ef2b019b198fb48740ced81bce95 F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf -F src/prepare.c d778af9986f3b0107c5b255dcfe2696e8e99e00fb77c5115bbfea4e92c3302e7 +F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P baa3f96250763b42391fbb4dea283a4b6140fdbf775d85081a9efd6e6258f7b4 -R ef5c9aaeef37f976cb4a94e50d9b811f -U larrybr -Z dc18297140fe7f47c4b68b1ec10754aa +P de9d0f9548106f5a59c57dbf947fc63c0411b1e975033a4c4097cefbbe86ee5f +R 3f8a67a4c6e2ce0a9df64fde1e1d98d1 +U drh +Z 76c7bd276946c9855e2f7586c4e2beb7 diff --git a/manifest.uuid b/manifest.uuid index 8cb930ec67..ce4fa88249 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de9d0f9548106f5a59c57dbf947fc63c0411b1e975033a4c4097cefbbe86ee5f \ No newline at end of file +b6c57e0e2a9658417a0a5548e73007faa59c837b9ad87293bc216feef980717a \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index b18716c9e3..6dcb3842ed 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -377,9 +377,11 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ } #endif } + assert( pDb == &(db->aDb[iDb]) ); if( db->mallocFailed ){ rc = SQLITE_NOMEM_BKPT; sqlite3ResetAllSchemasOfConnection(db); + pDb = &db->aDb[iDb]; }else if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){ /* Hack: If the SQLITE_NoSchemaError flag is set, then consider From 0d08402f348a3ce424646643056f393fd1f75096 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 13 Jun 2021 19:14:14 +0000 Subject: [PATCH 68/70] The opcode that preceeds OP_SeekScan is usually OP_IdxGT but can sometimes be OP_IdxGE. Adjust asserts accordingly. Follow-up to [9a2ab6092d644fc3]. dbsqlfuzz e41762333a4d6e90a49e628f488d0873b2dba4c5 FossilOrigin-Name: d6803ed8dc4b1eb4d4dc100728acb4a4aa1479732f0fcb94eb23b7f7702ef65c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 3 ++- test/in4.test | 28 ++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2b3e28ace9..fea2a67ec8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdefense\sagainst\sOOM\serrors\sin\ssqliteInitOne().\ndbsqlfuzz\s429db39cd5777c46479641e8637c48c62890042d -D 2021-06-13T17:55:58.092 +C The\sopcode\sthat\spreceeds\sOP_SeekScan\sis\susually\sOP_IdxGT\sbut\scan\ssometimes\nbe\sOP_IdxGE.\s\sAdjust\sasserts\saccordingly.\s\sFollow-up\sto\n[9a2ab6092d644fc3].\s\sdbsqlfuzz\se41762333a4d6e90a49e628f488d0873b2dba4c5 +D 2021-06-13T19:14:14.260 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 F src/vacuum.c 492422c1463c076473bae1858799c7a0a5fe87a133d1223239447c422cd26286 -F src/vdbe.c 87d29d763c0398d8128ecc9f043aab7108123b15c919ec92d4b57e5e4385818c +F src/vdbe.c 6ece0ee94fa3a95601372efdc4ec6d068cd6cc58e28af8852f3407b90be4b7f8 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 465fcb494db4ca6630fb9c19b2f3dfed597fbe885b0d4204193a5093b0dd7dc6 F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1074,7 +1074,7 @@ F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 F test/in.test 688ed2011d922d83141a45af431601738674a4c0bdde34b6351f688b82a169b3 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test 3ce7e79419bcd7942744bee2394f125b45513186819ffe771c78d04caa547d54 +F test/in4.test addf1416fdbbcf2f082ab7974e4813f38b4759b95699a683a31c37a3fffe7b57 F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f F test/in6.test f5f40d6816a8bb7c784424b58a10ac38efb76ab29127a2c17399e0cbeeda0e4b F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P de9d0f9548106f5a59c57dbf947fc63c0411b1e975033a4c4097cefbbe86ee5f -R 3f8a67a4c6e2ce0a9df64fde1e1d98d1 +P b6c57e0e2a9658417a0a5548e73007faa59c837b9ad87293bc216feef980717a +R a1f22de204f5020e5d4febb4ff68729b U drh -Z 76c7bd276946c9855e2f7586c4e2beb7 +Z c2466d7ec6e514ce193cbbff00ec2eb4 diff --git a/manifest.uuid b/manifest.uuid index ce4fa88249..6f57b37ede 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b6c57e0e2a9658417a0a5548e73007faa59c837b9ad87293bc216feef980717a \ No newline at end of file +d6803ed8dc4b1eb4d4dc100728acb4a4aa1479732f0fcb94eb23b7f7702ef65c \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index cbfec41ae1..4442f7d9f7 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4471,7 +4471,8 @@ case OP_SeekScan: { /* pOp->p2 points to the first instruction past the OP_IdxGT that ** follows the OP_SeekGE. */ assert( pOp->p2>=(int)(pOp-aOp)+2 ); - assert( aOp[pOp->p2-1].opcode==OP_IdxGT ); + assert( aOp[pOp->p2-1].opcode==OP_IdxGT || aOp[pOp->p2-1].opcode==OP_IdxGE ); + testcase( aOp[pOp->p2-1].opcode==OP_IdxGE ); assert( pOp[1].p1==aOp[pOp->p2-1].p1 ); assert( pOp[1].p2==aOp[pOp->p2-1].p2 ); assert( pOp[1].p3==aOp[pOp->p2-1].p3 ); diff --git a/test/in4.test b/test/in4.test index 12b306b644..07bd547707 100644 --- a/test/in4.test +++ b/test/in4.test @@ -441,5 +441,33 @@ do_execsql_test 10.0 { SELECT d FROM t1 WHERE 0=a AND b IN (-17,-4,-3,1,5,25,7798); } {10} +# 2021-06-13 dbsqlfuzz e41762333a4d6e90a49e628f488d0873b2dba4c5 +# The opcode that preceeds OP_SeekScan is usually OP_IdxGT, but can +# sometimes be OP_IdxGE +# +reset_db +do_execsql_test 11.0 { + CREATE TABLE t1(a TEXT, b INT, c INT, d INT); + INSERT INTO t1 VALUES('abc',123,4,5); + INSERT INTO t1 VALUES('xyz',1,'abcdefxyz',99); + CREATE INDEX t1abc ON t1(b,b,c); + ANALYZE sqlite_schema; + INSERT INTO sqlite_stat1 VALUES('t1','t1abc','10000 5 00 2003 10'); + ANALYZE sqlite_schema; +} {} +do_execsql_test 11.1 { + SELECT * FROM t1 + WHERE b IN (345, (SELECT 1 FROM t1 + WHERE b IN (345 NOT GLOB 510) + AND c GLOB 'abc*xyz')) + AND c BETWEEN 'abc' AND 'xyz'; +} {xyz 1 abcdefxyz 99} +do_execsql_test 11.2 { + EXPLAIN SELECT * FROM t1 + WHERE b IN (345, (SELECT 1 FROM t1 + WHERE b IN (345 NOT GLOB 510) + AND c GLOB 'abc*xyz')) + AND c BETWEEN 'abc' AND 'xyz'; +} {/ SeekScan /} finish_test From de5f21d0a8b41f442468fccfd5c693a99419346b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 14 Jun 2021 11:20:30 +0000 Subject: [PATCH 69/70] Avoid allocating oversized column names in the sqllimit1.test module. FossilOrigin-Name: 7068f1f69b4feef49260e80902e6bdae47c21a0daa16c96ed1a0984dd1f14cdc --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/sqllimits1.test | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index fea2a67ec8..2a9d7bb982 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sopcode\sthat\spreceeds\sOP_SeekScan\sis\susually\sOP_IdxGT\sbut\scan\ssometimes\nbe\sOP_IdxGE.\s\sAdjust\sasserts\saccordingly.\s\sFollow-up\sto\n[9a2ab6092d644fc3].\s\sdbsqlfuzz\se41762333a4d6e90a49e628f488d0873b2dba4c5 -D 2021-06-13T19:14:14.260 +C Avoid\sallocating\soversized\scolumn\snames\sin\sthe\ssqllimit1.test\smodule. +D 2021-06-14T11:20:30.394 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1416,7 +1416,7 @@ F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae6a41fb F test/sqldiff1.test 28cd737cf1b0078b1ec1bbf425e674c47785835e -F test/sqllimits1.test 264f4b0f941800ba139d25e33ee919c5d95fea06dfbe8ac291d6811a30984ca5 +F test/sqllimits1.test 3f9030e5d35375ad3b912b4908094aa806335c8e9d804b8ffff70c5e9c664ab2 F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a F test/startup.c 1beb5ca66fcc0fce95c3444db9d1674f90fc605499a574ae2434dcfc10d22805 F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c5 @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b6c57e0e2a9658417a0a5548e73007faa59c837b9ad87293bc216feef980717a -R a1f22de204f5020e5d4febb4ff68729b +P d6803ed8dc4b1eb4d4dc100728acb4a4aa1479732f0fcb94eb23b7f7702ef65c +R 8c7d04711bfedbd418a79102af251070 U drh -Z c2466d7ec6e514ce193cbbff00ec2eb4 +Z d90ad49de9331abfbc8cf1a30420f0ba diff --git a/manifest.uuid b/manifest.uuid index 6f57b37ede..bc9491071d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d6803ed8dc4b1eb4d4dc100728acb4a4aa1479732f0fcb94eb23b7f7702ef65c \ No newline at end of file +7068f1f69b4feef49260e80902e6bdae47c21a0daa16c96ed1a0984dd1f14cdc \ No newline at end of file diff --git a/test/sqllimits1.test b/test/sqllimits1.test index 9bbe6c7000..594c06157f 100644 --- a/test/sqllimits1.test +++ b/test/sqllimits1.test @@ -372,7 +372,7 @@ db eval {DROP TABLE t4} sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 0x7fffffff set strvalue [string repeat A $::SQLITE_LIMIT_LENGTH] do_test sqllimits1-5.16 { - catchsql "SELECT '$strvalue'" + catchsql "SELECT '$strvalue' AS x" } [list 0 $strvalue] do_test sqllimits1-5.17.1 { catchsql "SELECT 'A$strvalue'" @@ -387,7 +387,7 @@ do_test sqllimits1-5.17.3 { } [list 1 {string or blob too big}] set blobvalue [string repeat 41 $::SQLITE_LIMIT_LENGTH] do_test sqllimits1-5.18 { - catchsql "SELECT x'$blobvalue'" + catchsql "SELECT x'$blobvalue' AS x" } [list 0 $strvalue] do_test sqllimits1-5.19 { catchsql "SELECT '41$blobvalue'" From 21571a94c1d0f2d177dd871832ab6202ce9067f1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 14 Jun 2021 14:00:09 +0000 Subject: [PATCH 70/70] An index on the expression "likely(X)" should store the true value of X, even if X is a real number with no fractional part. The optimization of storing some REAL indexed values as INT (see [10d851353c2abead]) should be omitted for index columns that are expressions. [forum:/forumpost/3b940c437a|Forum post 3b940c437a]. FossilOrigin-Name: 791473bc6677c2ae76f558082a4b43ca1eaf9895b76624d5b55d58f2af898ff3 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/delete.c | 16 +++++++++------- test/whereG.test | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 2a9d7bb982..3083a04af6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sallocating\soversized\scolumn\snames\sin\sthe\ssqllimit1.test\smodule. -D 2021-06-14T11:20:30.394 +C An\sindex\son\sthe\sexpression\s"likely(X)"\sshould\sstore\sthe\strue\svalue\sof\sX,\neven\sif\sX\sis\sa\sreal\snumber\swith\sno\sfractional\spart.\s\sThe\soptimization\sof\nstoring\ssome\sREAL\sindexed\svalues\sas\sINT\s(see\s[10d851353c2abead])\sshould\nbe\somitted\sfor\sindex\scolumns\sthat\sare\sexpressions.\n[forum:/forumpost/3b940c437a|Forum\spost\s3b940c437a]. +D 2021-06-14T14:00:09.237 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/ctime.c 3052b6b05ed9ef547a3dd66b8e01bfa9d582e78752ad6ed327da84652641e038 F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c -F src/delete.c 930e63df768dcb197242b1efa0ed9fcdcc9a7b7556c236ee01a9959b61cf527b +F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf F src/expr.c 30a2abf526531ce6bd45fbc85bfec0fc3f6e5a0fb490cd2350855f2fc34dd789 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 @@ -1759,7 +1759,7 @@ F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 F test/whereD.test c1c335e914e28b122e000e9310f02d2be83e1c9dbca2e29f46bd732703944d1b F test/whereE.test 0ac7e61c6225354a980666996539da154991b4325af943a25a9079079c82fb03 F test/whereF.test 926b65519608e3f2aa28720822b9154fb5c7b13519dd78194f434a511ab3dac5 -F test/whereG.test 8f1a753826d07ed7ae107fbec0d482d348bac6d7edf9db9c5736c06b0b3e9961 +F test/whereG.test b2a479f425f7d0a432df7e842e8484560908ef703fe0fd407888ff85e7097238 F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 F test/whereI.test c4bb7e2ca56d49bd8ab5c7bd085b8b83e353922b46904d68aefb3c7468643581 F test/whereJ.test fc05e374cc9f2dc204148d6c06822c380ad388895fe97a6d335b94a26a08aecf @@ -1918,7 +1918,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d6803ed8dc4b1eb4d4dc100728acb4a4aa1479732f0fcb94eb23b7f7702ef65c -R 8c7d04711bfedbd418a79102af251070 +P 7068f1f69b4feef49260e80902e6bdae47c21a0daa16c96ed1a0984dd1f14cdc +R 974ce41a0966560f83eb180996ffcd22 U drh -Z d90ad49de9331abfbc8cf1a30420f0ba +Z f5df566069add941ebed465cd1ba1b9e diff --git a/manifest.uuid b/manifest.uuid index bc9491071d..0c7014c181 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7068f1f69b4feef49260e80902e6bdae47c21a0daa16c96ed1a0984dd1f14cdc \ No newline at end of file +791473bc6677c2ae76f558082a4b43ca1eaf9895b76624d5b55d58f2af898ff3 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index 0a3b2dc16f..dd074bb352 100644 --- a/src/delete.c +++ b/src/delete.c @@ -942,13 +942,15 @@ int sqlite3GenerateIndexKey( continue; } sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iDataCur, j, regBase+j); - /* If the column affinity is REAL but the number is an integer, then it - ** might be stored in the table as an integer (using a compact - ** representation) then converted to REAL by an OP_RealAffinity opcode. - ** But we are getting ready to store this value back into an index, where - ** it should be converted by to INTEGER again. So omit the OP_RealAffinity - ** opcode if it is present */ - sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity); + if( pIdx->aiColumn[j]>=0 ){ + /* If the column affinity is REAL but the number is an integer, then it + ** might be stored in the table as an integer (using a compact + ** representation) then converted to REAL by an OP_RealAffinity opcode. + ** But we are getting ready to store this value back into an index, where + ** it should be converted by to INTEGER again. So omit the + ** OP_RealAffinity opcode if it is present */ + sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity); + } } if( regOut ){ sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut); diff --git a/test/whereG.test b/test/whereG.test index f39f3e8fce..6ca363ed8b 100644 --- a/test/whereG.test +++ b/test/whereG.test @@ -366,5 +366,23 @@ do_execsql_test 11.2.3 { SELECT * FROM t3 JOIN t2 ON x=y AND y='AAA' } {AAA AAA t2} +# 2021-06-14 forum https://sqlite.org/forum/forumpost/3b940c437a +# Affinity problem when a likely() function is used as a column in +# an index. +# +reset_db +do_execsql_test 12.0 { + CREATE TABLE t1(a REAL); + INSERT INTO t1(a) VALUES(123); + CREATE INDEX t1x1 ON t1(likely(a)); + SELECT typeof(likely(a)) FROM t1 NOT INDEXED; + SELECT typeof(likely(a)) FROM t1 INDEXED BY t1x1; +} {real real} +do_execsql_test 12.1 { + CREATE INDEX t1x2 ON t1(abs(a)); + SELECT typeof(abs(a)) FROM t1 NOT INDEXED; + SELECT typeof(abs(a)) FROM t1 INDEXED BY t1x2; +} {real real} + finish_test