From 8fc4a11c94a7ef822d69f6a171583a3a3327f72a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 2 Jan 2019 23:49:47 +0000 Subject: [PATCH 001/306] Fix harmless compiler warnings in the unicode2 logic of FTS3 and FTS5. FossilOrigin-Name: 703029ac6d24860230a8c30fcbf5e7e1da619e84f1cc9b9e65ebc74879a184d2 --- ext/fts3/fts3_unicode2.c | 6 +++--- ext/fts3/unicode/mkunicode.tcl | 6 +++--- ext/fts5/fts5_unicode2.c | 6 +++--- manifest | 18 +++++++++--------- manifest.uuid | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/ext/fts3/fts3_unicode2.c b/ext/fts3/fts3_unicode2.c index 4f92e5265b..c510162496 100644 --- a/ext/fts3/fts3_unicode2.c +++ b/ext/fts3/fts3_unicode2.c @@ -1,5 +1,5 @@ /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -178,8 +178,8 @@ static int remove_diacritic(int c, int bComplex){ 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, 63182, 63242, 63274, 63310, 63368, 63390, }; -#define HIBIT ((char)0x80) - char aChar[] = { +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', 'd', 'e', 'e', 'g', 'h', 'i', diff --git a/ext/fts3/unicode/mkunicode.tcl b/ext/fts3/unicode/mkunicode.tcl index 872ec130e7..7e24aaa46a 100644 --- a/ext/fts3/unicode/mkunicode.tcl +++ b/ext/fts3/unicode/mkunicode.tcl @@ -63,8 +63,8 @@ proc print_rd {map} { } puts "" puts " \};" - puts "#define HIBIT ((char)0x80)" - puts " char aChar\[\] = \{" + puts "#define HIBIT ((unsigned char)0x80)" + puts " unsigned char aChar\[\] = \{" puts -nonewline " '\\0', " set i 1 foreach c $aChar f $aFlag { @@ -838,7 +838,7 @@ proc print_fold_test {zFunc mappings} { proc print_fileheader {} { puts [string trim { /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: diff --git a/ext/fts5/fts5_unicode2.c b/ext/fts5/fts5_unicode2.c index 0b0e9f7a79..6811be8ce5 100644 --- a/ext/fts5/fts5_unicode2.c +++ b/ext/fts5/fts5_unicode2.c @@ -1,5 +1,5 @@ /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -47,8 +47,8 @@ static int fts5_remove_diacritic(int c, int bComplex){ 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, 63182, 63242, 63274, 63310, 63368, 63390, }; -#define HIBIT ((char)0x80) - char aChar[] = { +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', 'd', 'e', 'e', 'g', 'h', 'i', diff --git a/manifest b/manifest index 7ff8c441c8..2e0c89108f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sanother\stest\scase\sto\svacuum-into.test. -D 2019-01-02T16:01:59.068 +C Fix\sharmless\scompiler\swarnings\sin\sthe\sunicode2\slogic\sof\sFTS3\sand\sFTS5. +D 2019-01-02T23:49:47.898 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -97,7 +97,7 @@ F ext/fts3/fts3_tokenizer.c a22bf311a71f3efa9d7012d8cc48fc9b0f3dace7 F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c b1902e9ad47a6569fbb8ecb5ce52f20fe59b590d5c5e3bbdd56b10b03bdf632b -F ext/fts3/fts3_unicode2.c faf0c750a1d0e9c9902f947212fc88f84e9450cddb3d1ffdbacbd0084b91d647 +F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f F ext/fts3/fts3_write.c e36d2f7e8f180e8030e92a5c2d09ccf87021afedcc5148a9d823b496667bf2f2 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 @@ -105,7 +105,7 @@ F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87 F ext/fts3/tool/fts3view.c 202801a2056995b763864d60c2dee744d46f1677 F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 -F ext/fts3/unicode/mkunicode.tcl 2315b3f8c83dcb09091009db01b321fb401d98d8c5489c147c1a7c5a54d21e20 +F ext/fts3/unicode/mkunicode.tcl 49499f7964504438e2b04cca0627827945bb2499154e2d3ec216b22d20b969ae F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 4f5d19b7973dae23de368728f06d3eb1fe9f5cca2990366b40e9379996f35e61 @@ -122,7 +122,7 @@ F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282 F ext/fts5/fts5_test_mi.c 65864ba1e5c34a61d409c4c587e0bbe0466eb4f8f478d85dc42a92caad1338e6 F ext/fts5/fts5_test_tok.c 6a5574354ce61a98737e150fd4f7a002000db0cb4bcd655dc8694cb3e035381d F ext/fts5/fts5_tokenize.c 8b7ef00cf0483740977cc6cf0fd878e6e325d36fd02f2b31959810917347b73d -F ext/fts5/fts5_unicode2.c 3f1bad6f2924ad13e25408f00301edd12d4216388a11daa518cb28f79b337f5e +F ext/fts5/fts5_unicode2.c 16e127cbc95b4a6fca05b6ea7e2a02e5700d4a215e5220b9a33d5c7cee793e87 F ext/fts5/fts5_varint.c a5aceacda04dafcbae725413d7a16818ecd65738 F ext/fts5/fts5_vocab.c fbe38044889b2d2d99babeeef239c620fb0332bb928a84506ac748d81500b354 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 @@ -1795,7 +1795,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 3961995cb56b43f1753c53fc869edf336f1c17ec994d67dc74e44e8e02493894 -R 48b7968067e3b6a49f53de2bbc8d6738 -U dan -Z 7551eb2ed08d86310fd67509eed9279f +P 0465d2fc0d3f8beaa1b6b0bd7bd51d69a524f30d889c9402e7d02cc06164a310 +R 6175d1d1d62ec23c0754be1efbdc53c2 +U drh +Z 6e1c12cf9bbb16fe828167aa04e4f417 diff --git a/manifest.uuid b/manifest.uuid index 355d948ee5..15b22b2b13 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0465d2fc0d3f8beaa1b6b0bd7bd51d69a524f30d889c9402e7d02cc06164a310 \ No newline at end of file +703029ac6d24860230a8c30fcbf5e7e1da619e84f1cc9b9e65ebc74879a184d2 \ No newline at end of file From 232f278084b4cf54f21882248dcd961fc84c22d7 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 3 Jan 2019 00:44:03 +0000 Subject: [PATCH 002/306] Fix the geopoly_svg() function so that it returns NULL when given zero arguments. FossilOrigin-Name: 120cb1768338eb86412fb69d4c7677247775bb37875ab3a98766cffd535f04cf --- ext/rtree/geopoly.c | 4 +++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index f6a31f547b..3adbca7c24 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -395,7 +395,9 @@ static void geopolySvgFunc( int argc, sqlite3_value **argv ){ - GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + GeoPoly *p; + if( argc<1 ) return; + p = geopolyFuncParam(context, argv[0], 0); if( p ){ sqlite3 *db = sqlite3_context_db_handle(context); sqlite3_str *x = sqlite3_str_new(db); diff --git a/manifest b/manifest index 2e0c89108f..565e26bed8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sin\sthe\sunicode2\slogic\sof\sFTS3\sand\sFTS5. -D 2019-01-02T23:49:47.898 +C Fix\sthe\sgeopoly_svg()\sfunction\sso\sthat\sit\sreturns\sNULL\swhen\sgiven\szero\narguments. +D 2019-01-03T00:44:03.987 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -363,7 +363,7 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782 F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c d56ff997f2646b03be742eb85e8206f779d777f3a282fe0da576780ca0e11f20 +F ext/rtree/geopoly.c 603ec9b72cd70cf18541339b6c7d47f304ac0d84c50294be6c6c6ae35acdb0a6 F ext/rtree/rtree.c fae9943b6b6f2bf6a4ddeb192d54fa6d19311119c1388406ef27cf6de38f34aa F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 309afc04d4287542b2cd74f933296832cc681c7b014d9405cb329b62053a5349 @@ -1795,7 +1795,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 0465d2fc0d3f8beaa1b6b0bd7bd51d69a524f30d889c9402e7d02cc06164a310 -R 6175d1d1d62ec23c0754be1efbdc53c2 +P 703029ac6d24860230a8c30fcbf5e7e1da619e84f1cc9b9e65ebc74879a184d2 +R 27ad789d0b8700d6a91681e7bac70229 U drh -Z 6e1c12cf9bbb16fe828167aa04e4f417 +Z e14ce0e496dd84038f55cf2afe147fcb diff --git a/manifest.uuid b/manifest.uuid index 15b22b2b13..5007e61ce1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -703029ac6d24860230a8c30fcbf5e7e1da619e84f1cc9b9e65ebc74879a184d2 \ No newline at end of file +120cb1768338eb86412fb69d4c7677247775bb37875ab3a98766cffd535f04cf \ No newline at end of file From 0d756cc83a889e95871e974c6184fc35953c2f92 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 3 Jan 2019 15:17:01 +0000 Subject: [PATCH 003/306] Fix a problem with the second and subsequent sqlite3rbu_savestate() calls made on an RBU vacuum handle. FossilOrigin-Name: bef216dfa1456a787e3d9c74936ee1c6600827d4e252bd13e7a93046ce07469f --- ext/rbu/rbuvacuum3.test | 63 +++++++++++++++++++++++++++++++++++++++++ ext/rbu/sqlite3rbu.c | 5 +++- manifest | 15 +++++----- manifest.uuid | 2 +- 4 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 ext/rbu/rbuvacuum3.test diff --git a/ext/rbu/rbuvacuum3.test b/ext/rbu/rbuvacuum3.test new file mode 100644 index 0000000000..7e1e337f3c --- /dev/null +++ b/ext/rbu/rbuvacuum3.test @@ -0,0 +1,63 @@ +# 2019 Jan 3 +# +# 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 contains tests for the RBU module. More specifically, it +# contains tests to ensure that the sqlite3rbu_vacuum() API works as +# expected. +# + +source [file join [file dirname [info script]] rbu_common.tcl] +set testprefix rbuvacuum3 + +do_execsql_test 1.0 { + CREATE TABLE t1(a PRIMARY KEY, b, c); + CREATE INDEX i1b ON t1(b); + CREATE INDEX i1c ON t1(c); + + WITH s(i) AS ( + VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100 + ) + INSERT INTO t1 SELECT i, randomblob(100), randomblob(100) FROM s; +} + +forcedelete state.db +do_test 1.1 { + sqlite3rbu_vacuum rbu test.db state.db + while {1} { + set rc [rbu step] + if {$rc!="SQLITE_OK"} break + rbu savestate + } + rbu close +} {SQLITE_DONE} + +do_test 1.2 { + sqlite3rbu_vacuum rbu test.db state.db + while {1} { + set rc [rbu step] + if {$rc!="SQLITE_OK"} break + rbu savestate + } + rbu close +} {SQLITE_DONE} + +do_test 1.3 { + while {1} { + sqlite3rbu_vacuum rbu test.db state.db + set rc [rbu step] + if {$rc!="SQLITE_OK"} break + rbu savestate + rbu close + } + rbu close +} {SQLITE_DONE} + +finish_test diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index 7683c3464b..e86606be99 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -3945,7 +3945,10 @@ int sqlite3rbu_savestate(sqlite3rbu *p){ if( p->eStage==RBU_STAGE_OAL ){ assert( rc!=SQLITE_DONE ); if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); - if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "BEGIN IMMEDIATE", 0, 0, 0); + if( rc==SQLITE_OK ){ + const char *zBegin = rbuIsVacuum(p) ? "BEGIN" : "BEGIN IMMEDIATE"; + rc = sqlite3_exec(p->dbRbu, zBegin, 0, 0, 0); + } if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbMain, "BEGIN IMMEDIATE", 0, 0,0); } diff --git a/manifest b/manifest index 565e26bed8..e0e5a649b0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sgeopoly_svg()\sfunction\sso\sthat\sit\sreturns\sNULL\swhen\sgiven\szero\narguments. -D 2019-01-03T00:44:03.987 +C Fix\sa\sproblem\swith\sthe\ssecond\sand\ssubsequent\ssqlite3rbu_savestate()\scalls\smade\non\san\sRBU\svacuum\shandle. +D 2019-01-03T15:17:01.041 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -350,7 +350,8 @@ F ext/rbu/rbusplit.test b37e7b40b38760881dc9c854bd40b4744c6b6cd74990754eca3bda0f F ext/rbu/rbutemplimit.test 7f408f49b90fa0a720d7599f3aec74a3c85e6cd78e56fdf726ce00af9147a341 F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534 F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b -F ext/rbu/sqlite3rbu.c f722ed4177c9fb73f2f6f116240687ac7603735fa95ea63bff71827929d4c192 +F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc +F ext/rbu/sqlite3rbu.c d643661c7c85e79f4d0bc56c73f6f2dd55c35732dd41f378b0fd3b182a33242d F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -1795,7 +1796,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 703029ac6d24860230a8c30fcbf5e7e1da619e84f1cc9b9e65ebc74879a184d2 -R 27ad789d0b8700d6a91681e7bac70229 -U drh -Z e14ce0e496dd84038f55cf2afe147fcb +P 120cb1768338eb86412fb69d4c7677247775bb37875ab3a98766cffd535f04cf +R 5d2fee07520201670f7bcc9f026ba340 +U dan +Z b549416e8d4beb3bab9f7e64a67b786d diff --git a/manifest.uuid b/manifest.uuid index 5007e61ce1..27fcac3810 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -120cb1768338eb86412fb69d4c7677247775bb37875ab3a98766cffd535f04cf \ No newline at end of file +bef216dfa1456a787e3d9c74936ee1c6600827d4e252bd13e7a93046ce07469f \ No newline at end of file From 20c00823713980df47f51413c22e54294d0a5382 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 3 Jan 2019 15:22:33 +0000 Subject: [PATCH 004/306] Fix a harmless compiler warning in the CSV extension. FossilOrigin-Name: fbcd72565f4425016cebbbf5dfd6aa510234cfb31c785cf364f04fff444aacae --- ext/misc/csv.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/misc/csv.c b/ext/misc/csv.c index 963e41cfe6..09e970ee79 100644 --- a/ext/misc/csv.c +++ b/ext/misc/csv.c @@ -621,7 +621,7 @@ static int csvtabConnect( }else if( pNew->zData ){ pNew->iStart = (int)sRdr.iIn; }else{ - pNew->iStart = ftell(sRdr.in) - sRdr.nIn + sRdr.iIn; + pNew->iStart = (int)(ftell(sRdr.in) - sRdr.nIn + sRdr.iIn); } csv_reader_reset(&sRdr); rc = sqlite3_declare_vtab(db, CSV_SCHEMA); diff --git a/manifest b/manifest index e0e5a649b0..d899755411 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sthe\ssecond\sand\ssubsequent\ssqlite3rbu_savestate()\scalls\smade\non\san\sRBU\svacuum\shandle. -D 2019-01-03T15:17:01.041 +C Fix\sa\sharmless\scompiler\swarning\sin\sthe\sCSV\sextension. +D 2019-01-03T15:22:33.996 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -280,7 +280,7 @@ F ext/misc/carray.c ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c F ext/misc/closure.c 9f8fa11aa6c6e2f6d7296ffa88f103df4b46abd9602bcab3ea2f8fc24f334f63 F ext/misc/completion.c cec672d40604075bb341a7f11ac48393efdcd90a979269b8fe7977ea62d0547f F ext/misc/compress.c dd4f8a6d0baccff3c694757db5b430f3bbd821d8686d1fc24df55cf9f035b189 -F ext/misc/csv.c a8e779a3a0039abecddc6784095cc875d820ea65dcda158daa13e6b43d966e0f +F ext/misc/csv.c 7f047aeb68f5802e7ce6639292095d622a488bb43526ed04810e0649faa71ceb F ext/misc/dbdump.c 12389a10c410fadf1e68eeb382def92d5a7fa9ce7cce4fb86a736fa2bac1000a F ext/misc/eval.c 6ea9b22a5fa0dd973b67ca4e53555be177bc0b7b263aadf1024429457c82c0e3 F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f @@ -1796,7 +1796,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 120cb1768338eb86412fb69d4c7677247775bb37875ab3a98766cffd535f04cf -R 5d2fee07520201670f7bcc9f026ba340 -U dan -Z b549416e8d4beb3bab9f7e64a67b786d +P bef216dfa1456a787e3d9c74936ee1c6600827d4e252bd13e7a93046ce07469f +R 5fe87606abb429d879a36751ce5f3990 +U drh +Z b39dc78fd6c51051a3524b4af5c0cf88 diff --git a/manifest.uuid b/manifest.uuid index 27fcac3810..a1c1e1992b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bef216dfa1456a787e3d9c74936ee1c6600827d4e252bd13e7a93046ce07469f \ No newline at end of file +fbcd72565f4425016cebbbf5dfd6aa510234cfb31c785cf364f04fff444aacae \ No newline at end of file From 94e02d9c2cabefe2ebcef47c4fb68cdb88d3e47a Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 3 Jan 2019 16:00:23 +0000 Subject: [PATCH 005/306] Fix the shmlock.test script so that it works with the Windows restriction that UnlockFile must exactly correspond to a prior LockFile. FossilOrigin-Name: df939c89fa90b7f9ccf961027ca4eca4f987c49eabf530b5719a83e5ab0d346d --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/shmlock.test | 11 +++++++++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d899755411..06d907fa93 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\sin\sthe\sCSV\sextension. -D 2019-01-03T15:22:33.996 +C Fix\sthe\sshmlock.test\sscript\sso\sthat\sit\sworks\swith\sthe\sWindows\srestriction\nthat\sUnlockFile\smust\sexactly\scorrespond\sto\sa\sprior\sLockFile. +D 2019-01-03T16:00:23.389 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -1292,7 +1292,7 @@ F test/shell5.test 23939a4c51f0421330ea61dbd3c74f9c215f5f8d3d1a94846da6ffc777a35 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 -F test/shmlock.test 3d1868f0386923c0592a235f2dd87ae52286b217bc695fbfd9d39a828e7be374 +F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce @@ -1796,7 +1796,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 bef216dfa1456a787e3d9c74936ee1c6600827d4e252bd13e7a93046ce07469f -R 5fe87606abb429d879a36751ce5f3990 +P fbcd72565f4425016cebbbf5dfd6aa510234cfb31c785cf364f04fff444aacae +R 9111955e58c3bd4c245af61d1e729f5d U drh -Z b39dc78fd6c51051a3524b4af5c0cf88 +Z f3364b198a836e6f6f5103c54a1093fa diff --git a/manifest.uuid b/manifest.uuid index a1c1e1992b..f40b6f0ec6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbcd72565f4425016cebbbf5dfd6aa510234cfb31c785cf364f04fff444aacae \ No newline at end of file +df939c89fa90b7f9ccf961027ca4eca4f987c49eabf530b5719a83e5ab0d346d \ No newline at end of file diff --git a/test/shmlock.test b/test/shmlock.test index 6910758b82..89b29fd7ac 100644 --- a/test/shmlock.test +++ b/test/shmlock.test @@ -114,6 +114,11 @@ sqlite3 db0 test.db sqlite3 db1 test.db do_test 3.1 { execsql { SELECT * FROM t1 } db0 } {1 2} do_test 3.2 { execsql { SELECT * FROM t1 } db1 } {1 2} +if {$tcl_platform(platform)=="windows"} { + set isWindows 1 +} else { + set isWindows 0 +} set L(0) {n n n n n n n n} set L(1) {n n n n n n n n} @@ -134,6 +139,10 @@ proc random_lock_test {idx} { if {$locktype=="e"} { for {set l $iSlot} {$l<8 && [lindex $L($idx) $l]=="n"} {incr l} {} set n [expr int(rand()*($l-$iSlot))+1] + # The LockFile() and UnlockFile() apis on windows require that + # every unlock correspond exactly to a prior lock. Hence, we cannot + # lock arbitrary ranges in this test on windows. + if {$::isWindows} {set n 1} # puts "iSlot=$iSlot l=$l L=$L($idx)" # puts "$iSlot $n" } @@ -169,5 +178,3 @@ db0 close db1 close finish_test - - From 1baae57a729dee59b541f34ae48f3f48fb1958b9 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 3 Jan 2019 16:03:48 +0000 Subject: [PATCH 006/306] Fix the csv01.test module so that it works on systems with \r\n line endings. FossilOrigin-Name: 36eaf5a5e51b20699328aae67c2bfd325f81bea342e2b167fddd859a50a26e28 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/csv01.test | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 06d907fa93..440a05e351 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sshmlock.test\sscript\sso\sthat\sit\sworks\swith\sthe\sWindows\srestriction\nthat\sUnlockFile\smust\sexactly\scorrespond\sto\sa\sprior\sLockFile. -D 2019-01-03T16:00:23.389 +C Fix\sthe\scsv01.test\smodule\sso\sthat\sit\sworks\son\ssystems\swith\s\\r\\n\sline\sendings. +D 2019-01-03T16:03:48.841 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -769,7 +769,7 @@ F test/crashM.test d95f59046fa749b0d0822edf18a717788c8f318d F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 F test/createtab.test b5de160630b209c4b8925bdcbbaf48cc90b67fe8 F test/cse.test 277350a26264495e86b1785f34d2d0c8600e021c -F test/csv01.test 5b54e03d74c0e1966b841b0415062457569aacbe0f41962a41454ac01e8d4496 +F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3 F test/cursorhint.test 7bc346788390475e77a345da2b92270d04d35856 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f @@ -1796,7 +1796,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 fbcd72565f4425016cebbbf5dfd6aa510234cfb31c785cf364f04fff444aacae -R 9111955e58c3bd4c245af61d1e729f5d +P df939c89fa90b7f9ccf961027ca4eca4f987c49eabf530b5719a83e5ab0d346d +R 7684241e97a177b5ac495e86afddcce9 U drh -Z f3364b198a836e6f6f5103c54a1093fa +Z 5ac85448b0e42b193903bc8ffd8a40ba diff --git a/manifest.uuid b/manifest.uuid index f40b6f0ec6..d1b24e785c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df939c89fa90b7f9ccf961027ca4eca4f987c49eabf530b5719a83e5ab0d346d \ No newline at end of file +36eaf5a5e51b20699328aae67c2bfd325f81bea342e2b167fddd859a50a26e28 \ No newline at end of file diff --git a/test/csv01.test b/test/csv01.test index eb484f847f..9ba04206b8 100644 --- a/test/csv01.test +++ b/test/csv01.test @@ -218,7 +218,7 @@ do_execsql_test 4.4 { # Bug report on the mailing list # forcedelete csv01.csv -set fd [open csv01.csv w] +set fd [open csv01.csv wb] puts $fd "a,b,c,d\r\n1,2,3,4\r\none,two,three,four\r\n5,6,7,8" close $fd do_execsql_test 5.1 { From e9ad07c0a3967aeed1003181626c10e298aa504e Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 3 Jan 2019 19:12:21 +0000 Subject: [PATCH 007/306] Fix some problems with sqlite3_interrupt() handling in fts5. FossilOrigin-Name: c0eb839a3c23612b93002d2e1fbc41bf5db140775267989f85db52146144750b --- ext/fts5/fts5_index.c | 11 ++++-- ext/fts5/test/fts5interrupt.test | 67 ++++++++++++++++++++++++++++++++ manifest | 15 +++---- manifest.uuid | 2 +- 4 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 ext/fts5/test/fts5interrupt.test diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index da6332ce1d..8fb328a488 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3758,8 +3758,10 @@ static void fts5WriteBtreeTerm( int nTerm, const u8 *pTerm /* First term on new page */ ){ fts5WriteFlushBtree(p, pWriter); - fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); - pWriter->iBtPage = pWriter->writer.pgno; + if( p->rc==SQLITE_OK ){ + fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); + pWriter->iBtPage = pWriter->writer.pgno; + } } /* @@ -3920,6 +3922,7 @@ static void fts5WriteAppendTerm( if( (pPage->buf.n + pPgidx->n + nTerm + 2)>=p->pConfig->pgsz ){ if( pPage->buf.n>4 ){ fts5WriteFlushLeaf(p, pWriter); + if( p->rc!=SQLITE_OK ) return; } fts5BufferGrow(&p->rc, &pPage->buf, nTerm+FTS5_DATA_PADDING); } @@ -3955,6 +3958,7 @@ static void fts5WriteAppendTerm( n = 1 + fts5PrefixCompress(nMin, pPage->term.p, pTerm); } fts5WriteBtreeTerm(p, pWriter, n, pTerm); + if( p->rc!=SQLITE_OK ) return; pPage = &pWriter->writer; } }else{ @@ -4520,6 +4524,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* Write the term for this entry to disk. */ sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist); fts5WriteAppendTerm(p, &writer, (int)strlen(zTerm), (const u8*)zTerm); + if( p->rc!=SQLITE_OK ) break; assert( writer.bFirstRowidInPage==0 ); if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){ @@ -4599,7 +4604,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* TODO2: Doclist terminator written here. */ /* pBuf->p[pBuf->n++] = '\0'; */ assert( pBuf->n<=pBuf->nSpace ); - sqlite3Fts5HashScanNext(pHash); + if( p->rc==SQLITE_OK ) sqlite3Fts5HashScanNext(pHash); } sqlite3Fts5HashClear(pHash); fts5WriteFinish(p, &writer, &pgnoLast); diff --git a/ext/fts5/test/fts5interrupt.test b/ext/fts5/test/fts5interrupt.test new file mode 100644 index 0000000000..ca682852c4 --- /dev/null +++ b/ext/fts5/test/fts5interrupt.test @@ -0,0 +1,67 @@ +# 2019 Jan 4 +# +# 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 SQLite library. The +# focus of this script is testing the FTS5 module. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5interrupt + +# If SQLITE_ENABLE_FTS5 is not defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a); + INSERT INTO t1(t1, rank) VALUES('pgsz', 40); +} +db_save_and_close + +proc progress_handler {args} { + incr ::progress_handler_delay -1 + if {$::progress_handler_delay<=0} { return 1 } + return 0 +} + +foreach {tn sql} { + 1 { INSERT INTO t1(rowid, a) VALUES(0, 'z z z z') } + 2 { COMMIT } +} { + set bDone 0 + for {set i 1} {$bDone==0} {incr i} { + do_test 1.$tn.$i { + db_restore_and_reopen + execsql { + BEGIN; + INSERT INTO t1(rowid, a) VALUES(1, 'a b c d'); + INSERT INTO t1(rowid, a) VALUES(2, 'd e f g'); + INSERT INTO t1(rowid, a) VALUES(3, 'h i j k'); + INSERT INTO t1(rowid, a) VALUES(4, 'l m n o'); + } + + set ::progress_handler_delay $i + db progress 1 progress_handler + set res [catchsql $sql] + db close + if {$res=="0 {}"} { + set bDone 1 + } else { + if {$res!="1 interrupted"} { error "got: $res" } + } + set {} {} + } {} + } +} + +finish_test + diff --git a/manifest b/manifest index 440a05e351..958ecd0826 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\scsv01.test\smodule\sso\sthat\sit\sworks\son\ssystems\swith\s\\r\\n\sline\sendings. -D 2019-01-03T16:03:48.841 +C Fix\ssome\sproblems\swith\ssqlite3_interrupt()\shandling\sin\sfts5. +D 2019-01-03T19:12:21.304 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 1dd1ec0446b3acfc2d7d407eb894762a461613e2695273f48e449bf F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 0eff5bad90838be83c5cc16837ca215a961abe05cfbf741a285ba62a79ad586f F ext/fts5/fts5_hash.c 32be400cf761868c9db33efe81a06eb19a17c5402ad477ee9efb51301546dd55 -F ext/fts5/fts5_index.c d4b950baf42902d1d41a7bc1a374f134074b4bd981e92557a1b7e520a5adb019 +F ext/fts5/fts5_index.c 6694a1ee02fe4dfeecb19b4d7b730003af9d8c1b9b3ed34ffc0ca88ac9fecbfd F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 F ext/fts5/fts5_storage.c 5862f1b785a983acb8420281340f3f424896ab48f396f6fd8540787be7459139 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -181,6 +181,7 @@ F ext/fts5/test/fts5full.test 49b565da02918c06e58f51f0b953b0302b96f155aa68baba24 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b F ext/fts5/test/fts5integrity.test 4317561cd25eca7df16aa1f7d1a700ee958059fa639785f94aba0a84df9ab17b +F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 @@ -1796,7 +1797,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 df939c89fa90b7f9ccf961027ca4eca4f987c49eabf530b5719a83e5ab0d346d -R 7684241e97a177b5ac495e86afddcce9 -U drh -Z 5ac85448b0e42b193903bc8ffd8a40ba +P 36eaf5a5e51b20699328aae67c2bfd325f81bea342e2b167fddd859a50a26e28 +R d8b4aa3857542cdff2aba395a35ff507 +U dan +Z 83b8fb8b597b72d6d3939cc47e4f2492 diff --git a/manifest.uuid b/manifest.uuid index d1b24e785c..695e7e7642 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36eaf5a5e51b20699328aae67c2bfd325f81bea342e2b167fddd859a50a26e28 \ No newline at end of file +c0eb839a3c23612b93002d2e1fbc41bf5db140775267989f85db52146144750b \ No newline at end of file From 2f36262dbf3e07c893111e99330966b55ef22967 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 4 Jan 2019 11:20:14 +0000 Subject: [PATCH 008/306] Fix another fts5 assert() that may fail if the database is corrupt. FossilOrigin-Name: 0888fc2e881d56ccd5222383d1a08cdf16fbd15c40da7ebfc14346be69ffb26a --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5corrupt3.test | 111 ++++++++++++++++++++++++++++++++ manifest | 14 ++-- manifest.uuid | 2 +- 4 files changed, 120 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 8fb328a488..e8c693411b 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4009,7 +4009,7 @@ static void fts5WriteAppendRowid( if( pWriter->bFirstRowidInDoclist || pWriter->bFirstRowidInPage ){ fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid); }else{ - assert( p->rc || iRowid>pWriter->iPrevRowid ); + assert_nc( p->rc || iRowid>pWriter->iPrevRowid ); fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid - pWriter->iPrevRowid); } pWriter->iPrevRowid = iRowid; diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 2d8efc30ea..6d0a30750e 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -2101,6 +2101,117 @@ do_catchsql_test 22.1 { INSERT INTO t1(t1) VALUES('optimize'); } {1 {vtable constructor failed: t1}} +#-------------------------------------------------------------------------- +reset_db +do_test 23.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c24b.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 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 0f 1c 00 05 0e cb 00 0f e8 0e cb 0f bd 0f 30 ...............0 +| 16: 0e e2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3776: 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 30 ...............0 +| 3792: 00 00 00 00 01 03 03 00 03 01 01 01 02 01 01 03 ................ +| 3808: 01 01 33 8c 80 80 80 80 01 03 00 6c 00 00 00 2c ..3........l..., +| 3824: 07 30 62 61 63 6b 75 70 05 02 04 02 05 65 61 6d .0backup.....eam +| 3840: 65 72 05 02 02 02 05 6f 6f 6d 65 72 05 01 02 05 er.....oomer.... +| 3856: 75 6d 6d 65 72 05 02 03 04 0b 0a 09 0f ef 00 14 ummer........... +| 3872: 2a 00 00 00 00 01 02 02 00 02 01 01 01 02 01 01 *............... +| 3888: 81 05 88 80 80 80 80 01 04 00 82 0e 00 00 00 76 ...............v +| 3904: 06 30 61 62 61 63 6b 08 02 07 04 04 6e 64 6f 6e .0aback.....ndon +| 3920: 08 02 05 02 05 63 74 69 76 65 04 02 02 04 02 0b .....ctive...... +| 3936: 02 04 6c 70 68 61 08 02 0a 02 03 74 6f 6d 06 02 ..lpha.....tom.. +| 3952: 02 02 02 09 05 02 69 63 07 02 02 01 06 62 61 63 ......ic.....bac +| 3968: 6b 75 70 08 02 04 02 05 6f 6f 6d 65 72 05 02 02 kup.....oomer... +| 3984: 03 02 08 01 07 63 68 61 6e 6e 65 6c 08 02 03 01 .....channel.... +| 4000: 05 65 6c 70 68 61 08 02 02 01 04 74 65 73 74 08 .elpha.....test. +| 4016: 02 06 04 0a 09 0d 09 0b 07 0b 0d 0c 0a 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 02 61 23 25 23 ......N.....a#%# +| 4048: 27 2b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 '+.....ft.....nd +| 4064: 6f 6e 03 02 00 a0 42 70 05 01 03 00 10 08 13 00 on....Bp........ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 0f ca 00 08 0f 57 00 0f f6 0f ec 0f e0 0f d5 ......W......... +| 16: 0f 57 0f c1 0f b6 0f 70 00 00 00 00 00 00 00 00 .W.....p........ +| 3920: 00 00 00 00 00 00 00 17 05 03 00 35 62 65 61 6d ...........5beam +| 3936: 65 72 20 62 75 6d 6d 65 72 20 62 61 63 6b 75 70 er bummer backup +| 3952: 44 08 04 00 81 0d 65 6c 70 68 61 20 63 68 61 6e D.....elpha chan +| 3968: 6e 65 6c 20 62 61 63 6b 75 70 20 61 62 61 6e 64 nel backup aband +| 3984: 6f 6e 20 74 65 73 74 20 61 62 61 63 6b 20 62 6f on test aback bo +| 4000: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 4016: 61 63 74 69 76 65 09 07 03 00 19 61 74 6f 6d 69 active.....atomi +| 4032: 63 07 06 03 00 15 61 74 6f 6d 00 00 00 0b 19 62 c.....atom.....b +| 4048: 6f 6f 6d 65 72 09 04 03 00 19 61 63 74 69 76 65 oomer.....active +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0a 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 03 04 04 03 00 0e 01 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c24b.db +}]} {} + +do_catchsql_test 23.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 958ecd0826..37ab350954 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssome\sproblems\swith\ssqlite3_interrupt()\shandling\sin\sfts5. -D 2019-01-03T19:12:21.304 +C Fix\sanother\sfts5\sassert()\sthat\smay\sfail\sif\sthe\sdatabase\sis\scorrupt. +D 2019-01-04T11:20:14.309 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 1dd1ec0446b3acfc2d7d407eb894762a461613e2695273f48e449bf F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 0eff5bad90838be83c5cc16837ca215a961abe05cfbf741a285ba62a79ad586f F ext/fts5/fts5_hash.c 32be400cf761868c9db33efe81a06eb19a17c5402ad477ee9efb51301546dd55 -F ext/fts5/fts5_index.c 6694a1ee02fe4dfeecb19b4d7b730003af9d8c1b9b3ed34ffc0ca88ac9fecbfd +F ext/fts5/fts5_index.c 70b147a2c4ca9dc77393a8fe0fa1e03f20aae05c735ce6f0febfefea5b3fa8f8 F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 F ext/fts5/fts5_storage.c 5862f1b785a983acb8420281340f3f424896ab48f396f6fd8540787be7459139 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test dc1c1c284426802c33413f3b06234721abb140a82c2c9438a9543b7f04add9c4 +F ext/fts5/test/fts5corrupt3.test 45a1af5c03a7102b574cc17713a1ae8d5aa6e032130e195887f390453dd47fb4 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1797,7 +1797,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 36eaf5a5e51b20699328aae67c2bfd325f81bea342e2b167fddd859a50a26e28 -R d8b4aa3857542cdff2aba395a35ff507 +P c0eb839a3c23612b93002d2e1fbc41bf5db140775267989f85db52146144750b +R 7fbc4bba2231ea4f7ecdd6bc8ef26dcf U dan -Z 83b8fb8b597b72d6d3939cc47e4f2492 +Z 3e6ed3cf8814a63a4d6dd8efbef7b1b0 diff --git a/manifest.uuid b/manifest.uuid index 695e7e7642..3ca7b89fcf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c0eb839a3c23612b93002d2e1fbc41bf5db140775267989f85db52146144750b \ No newline at end of file +0888fc2e881d56ccd5222383d1a08cdf16fbd15c40da7ebfc14346be69ffb26a \ No newline at end of file From dfe3b583159900285febfeb141b6e75c3fa1411e Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 4 Jan 2019 12:35:50 +0000 Subject: [PATCH 009/306] Fix a typo in a comment used to generate documentation. No functional changes. FossilOrigin-Name: ccc4f7424bc8f37c168333091dd9e3d6f80ccff9e2b06f182df65be59a7e3349 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 37ab350954..638d3c10bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sfts5\sassert()\sthat\smay\sfail\sif\sthe\sdatabase\sis\scorrupt. -D 2019-01-04T11:20:14.309 +C Fix\sa\stypo\sin\sa\scomment\sused\sto\sgenerate\sdocumentation.\s\sNo\sfunctional\schanges. +D 2019-01-04T12:35:50.095 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -583,7 +583,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c 98c7a06d1911e683ee0649979911483ce97fabfd758782be53e537b1d4655664 +F src/vdbe.c 66d077541de6c0d9bf131d8f8a20d5dec583131d48b8b3aa7c1a0a2bed6998fa F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1797,7 +1797,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 c0eb839a3c23612b93002d2e1fbc41bf5db140775267989f85db52146144750b -R 7fbc4bba2231ea4f7ecdd6bc8ef26dcf -U dan -Z 3e6ed3cf8814a63a4d6dd8efbef7b1b0 +P 0888fc2e881d56ccd5222383d1a08cdf16fbd15c40da7ebfc14346be69ffb26a +R df3871aef79e360e9cb9830ce57745fc +U drh +Z 67a6b467f84ee61a1685902a10add770 diff --git a/manifest.uuid b/manifest.uuid index 3ca7b89fcf..8d2ff85692 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0888fc2e881d56ccd5222383d1a08cdf16fbd15c40da7ebfc14346be69ffb26a \ No newline at end of file +ccc4f7424bc8f37c168333091dd9e3d6f80ccff9e2b06f182df65be59a7e3349 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index f8371e8476..14f72d0a36 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3634,7 +3634,7 @@ case OP_OpenDup: { ** the main database is read-only. The ephemeral ** table is deleted automatically when the cursor is closed. ** -** If the cursor P1 is already opened on an ephermal table, the table +** If the cursor P1 is already opened on an ephemeral table, the table ** is cleared (all content is erased). ** ** P2 is the number of columns in the ephemeral table. From 48cd0f28c5a192a903cf717e0789f3402571333e Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 4 Jan 2019 12:46:01 +0000 Subject: [PATCH 010/306] Remove debugging pragmas accidently left in by a prior change. FossilOrigin-Name: 26275fc7e89eb2542a65d01fd271cef016a4a1815bc3845c599cf2f4fbf7513d --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/tkt-80ba201079.test | 2 -- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 638d3c10bf..c6f82155e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sa\scomment\sused\sto\sgenerate\sdocumentation.\s\sNo\sfunctional\schanges. -D 2019-01-04T12:35:50.095 +C Remove\sdebugging\spragmas\saccidently\sleft\sin\sby\sa\sprior\schange. +D 2019-01-04T12:46:01.579 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -1405,7 +1405,7 @@ F test/tkt-752e1646fc.test ea78d88d14fe9866bdd991c634483334639e13bf F test/tkt-78e04e52ea.test 1b5be1bac961833a9fd70fe50738cb4064822c61f82c54f7d488435ec806ea62 F test/tkt-7a31705a7e6.test 9e9c057b6a9497c8f7ba7b16871029414ccf6550e7345d9085d6d71c9a56bb6f F test/tkt-7bbfb7d442.test 7b2cd79c7a17ae6750e75ec1a7846712a69c9d18 -F test/tkt-80ba201079.test 75d22bbfd118025c9504b025679a6840f7518b2947268ecdce14b7af1b7dd7f3 +F test/tkt-80ba201079.test 105a721e6aad0ae3c5946d7615d1e4d03f6145b8 F test/tkt-80e031a00f.test 9ee36348b761bf7c14261e002b75a4c0d5a04d4c F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 @@ -1797,7 +1797,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 0888fc2e881d56ccd5222383d1a08cdf16fbd15c40da7ebfc14346be69ffb26a -R df3871aef79e360e9cb9830ce57745fc +P ccc4f7424bc8f37c168333091dd9e3d6f80ccff9e2b06f182df65be59a7e3349 +R 4716726c16649db3e4492e06f4ea0e14 U drh -Z 67a6b467f84ee61a1685902a10add770 +Z 74ad89f8eaeb20c98be9284b2189ab7e diff --git a/manifest.uuid b/manifest.uuid index 8d2ff85692..1b71d8613c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ccc4f7424bc8f37c168333091dd9e3d6f80ccff9e2b06f182df65be59a7e3349 \ No newline at end of file +26275fc7e89eb2542a65d01fd271cef016a4a1815bc3845c599cf2f4fbf7513d \ No newline at end of file diff --git a/test/tkt-80ba201079.test b/test/tkt-80ba201079.test index b6cc85f348..ea0799b568 100644 --- a/test/tkt-80ba201079.test +++ b/test/tkt-80ba201079.test @@ -110,8 +110,6 @@ do_test tkt-80ba2-200 { } {300 object_change 2048} do_test tkt-80ba2-201 { db eval { -PRAGMA vdbe_debug=on; -PRAGMA vdbe_addoptrace=on; CREATE INDEX timeline_entry_id_idx on timeline(entry_id); SELECT entry_type, entry_types.name, From f25cc4f3c5d983b2d2f4986550c10cb9c2267351 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 4 Jan 2019 14:29:21 +0000 Subject: [PATCH 011/306] If the ".open" command fails in the CLI, reopen to :memory: so that at least some database is available for subsequent commands. FossilOrigin-Name: d7f55c62c3fa053b9b930a044b60076a8278cbf679d8e5116b95f2ff19247f6b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c6f82155e9..c657e4cc1d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sdebugging\spragmas\saccidently\sleft\sin\sby\sa\sprior\schange. -D 2019-01-04T12:46:01.579 +C If\sthe\s".open"\scommand\sfails\sin\sthe\sCLI,\sreopen\sto\s:memory:\sso\sthat\sat\sleast\nsome\sdatabase\sis\savailable\sfor\ssubsequent\scommands. +D 2019-01-04T14:29:21.306 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -513,7 +513,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 5f2f987aacba7548d10781f808e1b933f80abe0b6bc8e9922bc18b1d1faba339 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 4b0be1bfd2d8668e2711f877682361e06b412c53ce7a56303f1f6978ec33eca8 -F src/shell.c.in 207da30342db0b6fac8b2487abd60b059a5ea80cc9494bd1db76a1dd4aae7cca +F src/shell.c.in 0722a9e3a1b23674f07c194b8f71c953c775bad280e7f179a32bf72cd009b569 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1797,7 +1797,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 ccc4f7424bc8f37c168333091dd9e3d6f80ccff9e2b06f182df65be59a7e3349 -R 4716726c16649db3e4492e06f4ea0e14 +P 26275fc7e89eb2542a65d01fd271cef016a4a1815bc3845c599cf2f4fbf7513d +R 652a3765ebc1306263cb8b5a1e383f8c U drh -Z 74ad89f8eaeb20c98be9284b2189ab7e +Z 3910319573f9d65db9fc0dd31e1035b5 diff --git a/manifest.uuid b/manifest.uuid index 1b71d8613c..47d75c1acb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -26275fc7e89eb2542a65d01fd271cef016a4a1815bc3845c599cf2f4fbf7513d \ No newline at end of file +d7f55c62c3fa053b9b930a044b60076a8278cbf679d8e5116b95f2ff19247f6b \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 7048732389..b468c6f79d 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3871,7 +3871,10 @@ static void open_db(ShellState *p, int openFlags){ if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", p->zDbFilename, sqlite3_errmsg(p->db)); - if( openFlags & OPEN_DB_KEEPALIVE ) return; + if( openFlags & OPEN_DB_KEEPALIVE ){ + sqlite3_open(":memory:", &p->db); + return; + } exit(1); } #ifndef SQLITE_OMIT_LOAD_EXTENSION From b042d921280d839ca891cd15ff0d880379c19aaa Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 4 Jan 2019 23:39:37 +0000 Subject: [PATCH 012/306] Give a meaningful error on an attempt to use UPSERT on a virtual table, rather than simply not working. FossilOrigin-Name: fa98748f956cff95fcfda3a513cea4df27aa573ae795a6855c40bfeca661d0b2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/insert.c | 5 +++++ test/misc7.test | 3 +++ 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c657e4cc1d..b3d89c832a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sthe\s".open"\scommand\sfails\sin\sthe\sCLI,\sreopen\sto\s:memory:\sso\sthat\sat\sleast\nsome\sdatabase\sis\savailable\sfor\ssubsequent\scommands. -D 2019-01-04T14:29:21.306 +C Give\sa\smeaningful\serror\son\san\sattempt\sto\suse\sUPSERT\son\sa\svirtual\stable,\nrather\sthan\ssimply\snot\sworking. +D 2019-01-04T23:39:37.788 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -473,7 +473,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 1e0001758cd174177886cdfe23d69c6d6775f1c4e7fe946a041f1ef56ae85bc5 +F src/insert.c 1660fca0a94e173cb63e509b241202bc2f41d3170bfd675b310e366747313d5c F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 008f45dd39cdc7fb9e7e1f61d75a5c97397f8e07427a8879be23e27747d5f948 @@ -1131,7 +1131,7 @@ F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e F test/misc5.test c4aeaa0fa28faa08f2485309c38db4719e6cd1364215d5687a5b96d340a3fa58 F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 -F test/misc7.test 10d639a5e0fdf1bd51ad42be705393a38780ad71b6957110035a4e6c1e5e7f40 +F test/misc7.test 4f21954012e4eb0a923c54a311f38c81bf6798ccdd7b51584db46d4007f63daa F test/misc8.test 8fb0f31d7a8aed484d759773ab8ad12ec746a477f4a67394a4af0e677494c3ca F test/misuse.test 9e7f78402005e833af71dcab32d048003869eca5abcaccc985d4f8dc1d86bcc7 F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152 @@ -1797,7 +1797,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 26275fc7e89eb2542a65d01fd271cef016a4a1815bc3845c599cf2f4fbf7513d -R 652a3765ebc1306263cb8b5a1e383f8c +P d7f55c62c3fa053b9b930a044b60076a8278cbf679d8e5116b95f2ff19247f6b +R 5beb1ec8350b0a1a91f296d11cc5fd2c U drh -Z 3910319573f9d65db9fc0dd31e1035b5 +Z 3cbeefd3dc1028babbc8cae8e545baa5 diff --git a/manifest.uuid b/manifest.uuid index 47d75c1acb..bbb26f905a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7f55c62c3fa053b9b930a044b60076a8278cbf679d8e5116b95f2ff19247f6b \ No newline at end of file +fa98748f956cff95fcfda3a513cea4df27aa573ae795a6855c40bfeca661d0b2 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 46b60e49e7..66cef82fd8 100644 --- a/src/insert.c +++ b/src/insert.c @@ -826,6 +826,11 @@ void sqlite3Insert( } #ifndef SQLITE_OMIT_UPSERT if( pUpsert ){ + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "UPSERT not implemented for virtual table \"%s\"", + pTab->zName); + goto insert_cleanup; + } pTabList->a[0].iCursor = iDataCur; pUpsert->pUpsertSrc = pTabList; pUpsert->regData = regData; diff --git a/test/misc7.test b/test/misc7.test index 5ae8178da5..e75a684099 100644 --- a/test/misc7.test +++ b/test/misc7.test @@ -227,6 +227,9 @@ ifcapable vtab { } } {1} set sqlite_where_trace 0 + do_catchsql_test misc7-10.1 { + INSERT INTO t1(a,b,c) VALUES(12345,2,3) ON CONFLICT(a) DO NOTHING; + } {1 {UPSERT not implemented for virtual table "t1"}} # Specify an ORDER BY clause that cannot be indexed. do_test misc7-11 { From c210c08891e6be1ca140d1b9d4200b21ba9145aa Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 5 Jan 2019 07:17:56 +0000 Subject: [PATCH 013/306] Fix two more problems with corrupt database handling in fts5. FossilOrigin-Name: 444c7c99beb9f8b82963e9784aa2be54124c7011f4771122b4f608c02aa26408 --- ext/fts5/fts5_index.c | 2 +- ext/fts5/fts5_storage.c | 4 +- ext/fts5/test/fts5corrupt3.test | 312 ++++++++++++++++++++++++++++++++ manifest | 18 +- manifest.uuid | 2 +- 5 files changed, 326 insertions(+), 12 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index e8c693411b..262d7618e4 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -2437,7 +2437,7 @@ static void fts5SegIterSeekInit( ** 4) the FTS5INDEX_QUERY_SCAN flag was set and the iterator points ** to an entry with a term greater than or equal to (pTerm/nTerm). */ - assert( p->rc!=SQLITE_OK /* 1 */ + assert_nc( p->rc!=SQLITE_OK /* 1 */ || pIter->pLeaf==0 /* 2 */ || fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)==0 /* 3 */ || (bGe && fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)>0) /* 4 */ diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 0cbb22d0d3..7c119298fc 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -588,7 +588,7 @@ int sqlite3Fts5StorageRebuild(Fts5Storage *p){ Fts5Config *pConfig = p->pConfig; sqlite3_stmt *pScan = 0; Fts5InsertCtx ctx; - int rc; + int rc, rc2; memset(&ctx, 0, sizeof(Fts5InsertCtx)); ctx.pStorage = p; @@ -627,6 +627,8 @@ int sqlite3Fts5StorageRebuild(Fts5Storage *p){ } } sqlite3_free(buf.p); + rc2 = sqlite3_reset(pScan); + if( rc==SQLITE_OK ) rc = rc2; /* Write the averages record */ if( rc==SQLITE_OK ){ diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 6d0a30750e..57f8483b3d 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -2212,6 +2212,318 @@ do_catchsql_test 23.1 { INSERT INTO t1(t1) VALUES('optimize'); } {1 {database disk image is malformed}} +#-------------------------------------------------------------------------- +reset_db +do_test 24.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-b87dfef02880fe.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 1a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 ................ +| 3760: 58 81 96 4d 01 06 01 02 02 03 06 01 02 02 03 06 X..M............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 b2 04 55 85 44 54 e5 34 MIT LOAD..U.DT.4 +| 3216: 94 f4 e5 84 e4 f4 34 15 34 51 e1 f0 50 03 30 f1 ......4.4Q..P.0. +| 3232: 74 f4 d4 95 42 04 c4 f4 14 42 04 55 85 44 54 e5 t...B....B.U.DT. +| 3248: 34 94 f4 e5 85 25 45 24 94 d1 f1 e0 50 03 30 f1 4....%E$....P.0. +| 3264: 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03 03 ......T..%..S... +| 3280: 03 03 03 05 84 24 94 e4 15 25 91 f1 d0 50 03 30 .....$...%...P.0 +| 3296: f1 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03 .......T..%..S.. +| 3312: 03 03 03 03 05 84 e4 f4 34 15 34 51 e1 c0 50 03 ........4.4Q..P. +| 3328: 30 f1 74 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 0.t.....T..%..S. +| 3344: 03 03 03 03 03 05 85 25 45 24 94 d1 81 b0 50 02 .......%E$....P. +| 3360: 50 f1 94 54 e4 14 24 c4 52 05 25 45 24 54 55 84 P..T..$.R.%E$TU. +| 3376: 24 94 e4 15 25 91 81 a0 50 02 50 f1 94 54 e4 14 $...%...P.P..T.. +| 3392: 24 c4 52 05 25 45 24 54 55 84 e4 f4 34 15 34 51 $.R.%E$TU...4.4Q +| 3408: 71 90 50 02 50 f1 74 54 e4 14 24 c4 52 05 25 45 q.P.P.tT..$.R.%E +| 3424: 24 54 55 85 25 45 24 94 d1 a1 80 50 02 90 f1 94 $TU.%E$....P.... +| 3440: 54 e4 14 24 c4 52 04 d4 54 d5 35 95 33 55 84 24 T..$.R..T.5.3U.$ +| 3456: 94 e4 15 25 91 a1 70 50 02 90 f1 94 54 e4 14 24 ...%..pP....T..$ +| 3472: c4 52 04 d4 54 d5 35 95 33 55 84 e4 f4 34 15 34 .R..T.5.3U...4.4 +| 3488: 51 91 60 50 02 90 f1 74 54 e4 14 24 c4 52 04 d4 Q.`P...tT..$.R.. +| 3504: 54 d5 35 95 33 55 85 25 45 24 94 d1 81 50 50 02 T.5.3U.%E$...PP. +| 3520: 50 f1 94 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 84 P..T..$.R..4.... +| 3536: 24 94 e4 15 25 91 81 40 50 02 50 f1 94 54 e4 14 $...%..@P.P..T.. +| 3552: 24 c4 52 04 a5 34 f4 e3 15 84 e4 f4 34 15 34 51 $.R..4......4.4Q +| 3568: 71 30 50 02 50 f1 74 54 e4 14 24 c4 52 04 a5 34 q0P.P.tT..$.R..4 +| 3584: f4 e3 15 85 25 45 24 94 d1 a1 20 50 02 90 f1 94 ....%E$... P.... +| 3600: 54 e4 14 24 c4 52 04 74 54 f5 04 f4 c5 95 84 24 T..$.R.tT......$ +| 3616: 94 e4 15 25 91 a1 10 50 02 90 f1 94 54 e4 14 24 ...%...P....T..$ +| 3632: c4 52 04 74 54 f5 04 f4 c5 95 84 e4 f4 34 15 34 .R.tT........4.4 +| 3648: 51 91 00 50 02 90 f1 74 54 e4 14 24 c4 52 04 74 Q..P...tT..$.R.t +| 3664: 54 f5 04 f4 c5 95 85 25 45 24 94 d1 70 f0 50 02 T......%E$..p.P. +| 3680: 30 f1 94 54 e4 14 24 c5 20 46 54 53 35 58 42 49 0..T..$. 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 97 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 02 02 50 08 5f 17 44 45 42 55 47 CASE...P._.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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-b87dfef02880fe.db +}]} {} + +do_catchsql_test 24.1 { + UPDATE t1 SET b=quote(zeroblob(200)) WHERE a MATCH 'thread*'; +} {0 {}} + +do_catchsql_test 24.2 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 25.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-e3b1b19e4d4bcc.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 00 00 00 00 .....@ ........ +| 32: 00 00 00 00 00 00 00 06 00 00 00 04 00 00 00 00 ................ +| 48: 03 20 54 35 24 54 15 44 52 04 94 e4 44 55 82 07 . T5$T.DR...DU.. +| 64: 43 27 a2 04 f4 e2 07 43 22 87 a2 95 30 30 71 71 C'.....C....00qq +| 80: 11 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 .SQLite format 3 +| 96: 00 10 00 01 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 03 30 01 00 00 10 .....N.....0.... +| 128: 10 04 02 02 00 00 00 00 00 00 00 00 30 00 00 00 ............0... +| 144: 00 00 00 00 00 00 00 00 20 00 00 00 40 00 00 00 ........ ...@... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 d9 44 (id INTEGER PR.D +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f e0 fe 00 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 00 03 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 01 fe 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end crash-e3b1b19e4d4bcc.db +}]} {} + +do_catchsql_test 25.1 { + INSERT INTO t1(t1) VALUES('rebuild'); +} {1 {database disk image is malformed}} + +do_execsql_test 25.2 { + PRAGMA page_size=512; +} + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index b3d89c832a..34a8e16435 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Give\sa\smeaningful\serror\son\san\sattempt\sto\suse\sUPSERT\son\sa\svirtual\stable,\nrather\sthan\ssimply\snot\sworking. -D 2019-01-04T23:39:37.788 +C Fix\stwo\smore\sproblems\swith\scorrupt\sdatabase\shandling\sin\sfts5. +D 2019-01-05T07:17:56.201 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -115,9 +115,9 @@ F ext/fts5/fts5_buffer.c 1dd1ec0446b3acfc2d7d407eb894762a461613e2695273f48e449bf F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 0eff5bad90838be83c5cc16837ca215a961abe05cfbf741a285ba62a79ad586f F ext/fts5/fts5_hash.c 32be400cf761868c9db33efe81a06eb19a17c5402ad477ee9efb51301546dd55 -F ext/fts5/fts5_index.c 70b147a2c4ca9dc77393a8fe0fa1e03f20aae05c735ce6f0febfefea5b3fa8f8 +F ext/fts5/fts5_index.c 7d93b9503e02e57c94ce22e08758723f6d833969495a2c89ac7ca63957ab0053 F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 -F ext/fts5/fts5_storage.c 5862f1b785a983acb8420281340f3f424896ab48f396f6fd8540787be7459139 +F ext/fts5/fts5_storage.c 0455c866b6c6a347229edee66333f5c08ea5f3b4940121d698c300353a73962f F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 65864ba1e5c34a61d409c4c587e0bbe0466eb4f8f478d85dc42a92caad1338e6 F ext/fts5/fts5_test_tok.c 6a5574354ce61a98737e150fd4f7a002000db0cb4bcd655dc8694cb3e035381d @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 45a1af5c03a7102b574cc17713a1ae8d5aa6e032130e195887f390453dd47fb4 +F ext/fts5/test/fts5corrupt3.test bfe27d9e6b4d1346f15cc84a3e411220e1df89c731873124ec6ba9302f814613 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1797,7 +1797,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 d7f55c62c3fa053b9b930a044b60076a8278cbf679d8e5116b95f2ff19247f6b -R 5beb1ec8350b0a1a91f296d11cc5fd2c -U drh -Z 3cbeefd3dc1028babbc8cae8e545baa5 +P fa98748f956cff95fcfda3a513cea4df27aa573ae795a6855c40bfeca661d0b2 +R 147ceafc97353ccc27daff5abe75340f +U dan +Z 57ee5d6eb6a1f6b65219f39ba61a5e10 diff --git a/manifest.uuid b/manifest.uuid index bbb26f905a..1b424e700b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa98748f956cff95fcfda3a513cea4df27aa573ae795a6855c40bfeca661d0b2 \ No newline at end of file +444c7c99beb9f8b82963e9784aa2be54124c7011f4771122b4f608c02aa26408 \ No newline at end of file From 6b86e51eea956e5b3532f4042d8a314556746bef Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 5 Jan 2019 21:09:37 +0000 Subject: [PATCH 014/306] If the OP_ParseSchema opcode with a non-NULL P4 operand does not parse any rows out of the sqlite_master table, that indicates that the sqlite_master table is corrupt, so raise an SQLITE_CORRUPT error. FossilOrigin-Name: 598d7358e7329f0de6e3defc217665909e46874258ac29592ee2fd53e6411cda --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/prepare.c | 2 ++ src/sqliteInt.h | 1 + src/vdbe.c | 7 +++++++ 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 34a8e16435..1c1713d76a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stwo\smore\sproblems\swith\scorrupt\sdatabase\shandling\sin\sfts5. -D 2019-01-05T07:17:56.201 +C If\sthe\sOP_ParseSchema\sopcode\swith\sa\snon-NULL\sP4\soperand\sdoes\snot\sparse\sany\nrows\sout\sof\sthe\ssqlite_master\stable,\sthat\sindicates\sthat\sthe\ssqlite_master\ntable\sis\scorrupt,\sso\sraise\san\sSQLITE_CORRUPT\serror. +D 2019-01-05T21:09:37.530 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -507,7 +507,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c ddc9fc7d9861cf3a1f30660264b76b1ae9e1dce5dbba085cf001d5cb6b41cf8c F src/pragma.c 20811b404b6d302a1bedd4b8af8aab2794c5e87ba1f5cb6b42dbc3266ad9c603 F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 -F src/prepare.c d0918fb8d00b1ebf19655e7f3d28464b3fc3c43c16d36dd06092de02244a5180 +F src/prepare.c 18f1d2801ffb48b83fddf83375389886c788e98fdfb87eabe988cf53893602c7 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 5f2f987aacba7548d10781f808e1b933f80abe0b6bc8e9922bc18b1d1faba339 @@ -517,7 +517,7 @@ F src/shell.c.in 0722a9e3a1b23674f07c194b8f71c953c775bad280e7f179a32bf72cd009b56 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h a86007d427b9a7b97e9f1e1e0911eba3f70e1a3764a0a0aff0efd4d7bb029001 +F src/sqliteInt.h 488f9b86c15d09d42af921e4e2383dac289aa541a59daf78822bfcd656b59ff9 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -583,7 +583,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c 66d077541de6c0d9bf131d8f8a20d5dec583131d48b8b3aa7c1a0a2bed6998fa +F src/vdbe.c 1919d490e97bfc59eab4d43444a53a6717d06137295ed684a25e5df7430d9974 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1797,7 +1797,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 fa98748f956cff95fcfda3a513cea4df27aa573ae795a6855c40bfeca661d0b2 -R 147ceafc97353ccc27daff5abe75340f -U dan -Z 57ee5d6eb6a1f6b65219f39ba61a5e10 +P 444c7c99beb9f8b82963e9784aa2be54124c7011f4771122b4f608c02aa26408 +R 8de40bf74ae55cb339d0834a33043a83 +U drh +Z 0ecb0f548cba4686a2646d7c9efbc968 diff --git a/manifest.uuid b/manifest.uuid index 1b424e700b..a0bb07c982 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -444c7c99beb9f8b82963e9784aa2be54124c7011f4771122b4f608c02aa26408 \ No newline at end of file +598d7358e7329f0de6e3defc217665909e46874258ac29592ee2fd53e6411cda \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index b43a37f1fd..2c5f410253 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -65,6 +65,7 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ UNUSED_PARAMETER2(NotUsed, argc); assert( sqlite3_mutex_held(db->mutex) ); DbClearProperty(db, iDb, DB_Empty); + pData->nInitRow++; if( db->mallocFailed ){ corruptSchema(pData, argv[0], 0); return 1; @@ -176,6 +177,7 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ initData.rc = SQLITE_OK; initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; + initData.nInitRow = 0; sqlite3InitCallback(&initData, 3, (char **)azArg, 0); if( initData.rc ){ rc = initData.rc; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 294f7043fb..17c93285b8 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3362,6 +3362,7 @@ typedef struct { int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */ int rc; /* Result code stored here */ u32 mInitFlags; /* Flags controlling error messages */ + u32 nInitRow; /* Number of rows processed */ } InitData; /* diff --git a/src/vdbe.c b/src/vdbe.c index 14f72d0a36..82ab91e0e2 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5799,9 +5799,16 @@ case OP_ParseSchema: { assert( db->init.busy==0 ); db->init.busy = 1; initData.rc = SQLITE_OK; + initData.nInitRow = 0; assert( !db->mallocFailed ); rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); if( rc==SQLITE_OK ) rc = initData.rc; + if( rc==SQLITE_OK && initData.nInitRow==0 ){ + /* The OP_ParseSchema opcode with a non-NULL P4 argument should parse + ** at least one SQL statement. Any less than that indicates that + ** the sqlite_master table is corrupt. */ + rc = SQLITE_CORRUPT_BKPT; + } sqlite3DbFreeNN(db, zSql); db->init.busy = 0; } From a8e057618abc438ff47e8e490b3e940fddf42c9c Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 5 Jan 2019 21:56:12 +0000 Subject: [PATCH 015/306] Add the exprNodeCopy() routine that will safely memcpy() an Expr node that might be a size-reduced node. FossilOrigin-Name: a874c649960ba2e2b2fd380d08c02a45884a1060d3922be8847729008ca6766e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 1c1713d76a..789f527b47 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sthe\sOP_ParseSchema\sopcode\swith\sa\snon-NULL\sP4\soperand\sdoes\snot\sparse\sany\nrows\sout\sof\sthe\ssqlite_master\stable,\sthat\sindicates\sthat\sthe\ssqlite_master\ntable\sis\scorrupt,\sso\sraise\san\sSQLITE_CORRUPT\serror. -D 2019-01-05T21:09:37.530 +C Add\sthe\sexprNodeCopy()\sroutine\sthat\swill\ssafely\smemcpy()\san\sExpr\snode\sthat\nmight\sbe\sa\ssize-reduced\snode. +D 2019-01-05T21:56:12.090 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -464,7 +464,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9 F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab -F src/expr.c 18ce84bab19ef59eff99a54d83ebefd28dc10d17e617f35c730ff7c8bc2b6ee7 +F src/expr.c 9ad9c40a83c4218d79de19153b7a8ba7810564a123af7e09281927990bea2964 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c aaf28be73ab21e1e8bf4ac6b94269ebc8c93238d1e6997cb44b527b622e8ae6f F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f @@ -1797,7 +1797,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 444c7c99beb9f8b82963e9784aa2be54124c7011f4771122b4f608c02aa26408 -R 8de40bf74ae55cb339d0834a33043a83 +P 598d7358e7329f0de6e3defc217665909e46874258ac29592ee2fd53e6411cda +R edf6239ea759255e3950d6367e524f61 U drh -Z 0ecb0f548cba4686a2646d7c9efbc968 +Z 24d644d970444f08b00aecabd19ab2a7 diff --git a/manifest.uuid b/manifest.uuid index a0bb07c982..a9143ea15c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -598d7358e7329f0de6e3defc217665909e46874258ac29592ee2fd53e6411cda \ No newline at end of file +a874c649960ba2e2b2fd380d08c02a45884a1060d3922be8847729008ca6766e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 91bb7e9e50..8754bbe78e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1099,6 +1099,16 @@ static int exprStructSize(Expr *p){ return EXPR_FULLSIZE; } +/* +** Copy the complete content of an Expr node, taking care not to read +** past the end of the structure for a reduced-size version of the source +** Expr. +*/ +static void exprNodeCopy(Expr *pDest, Expr *pSrc){ + memset(pDest, 0, sizeof(Expr)); + memcpy(pDest, pSrc, exprStructSize(pSrc)); +} + /* ** The dupedExpr*Size() routines each return the number of bytes required ** to store a copy of an expression or expression tree. They differ in @@ -4051,7 +4061,7 @@ expr_code_doover: nExpr = pEList->nExpr; endLabel = sqlite3VdbeMakeLabel(pParse); if( (pX = pExpr->pLeft)!=0 ){ - tempX = *pX; + exprNodeCopy(&tempX, pX); testcase( pX->op==TK_COLUMN ); exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1)); testcase( regFree1==0 ); @@ -4372,13 +4382,12 @@ static void exprCodeBetween( Expr exprX; /* The x subexpression */ int regFree1 = 0; /* Temporary use register */ - memset(&compLeft, 0, sizeof(Expr)); memset(&compRight, 0, sizeof(Expr)); memset(&exprAnd, 0, sizeof(Expr)); assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - exprX = *pExpr->pLeft; + exprNodeCopy(&exprX, pExpr->pLeft); exprAnd.op = TK_AND; exprAnd.pLeft = &compLeft; exprAnd.pRight = &compRight; From dcc2700d7e1c0e4fc885dffbc4406bdc1e4c4e9b Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 6 Jan 2019 02:06:31 +0000 Subject: [PATCH 016/306] The page size becomes fixed as soon as page1 from a non-empty database file is read. FossilOrigin-Name: 6064584d578f0ac7aba3f67912a5d9eb1a3c6001469f6b9becbe68871131f887 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 789f527b47..cc1448a9d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sexprNodeCopy()\sroutine\sthat\swill\ssafely\smemcpy()\san\sExpr\snode\sthat\nmight\sbe\sa\ssize-reduced\snode. -D 2019-01-05T21:56:12.090 +C The\spage\ssize\sbecomes\sfixed\sas\ssoon\sas\spage1\sfrom\sa\snon-empty\sdatabase\sfile\nis\sread. +D 2019-01-06T02:06:31.916 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -453,7 +453,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 11c18d6d4b23570602d6d99db681d5c431917cab9f4321d87c7c31cd583f2964 +F src/btree.c 9632272d3c41c7dab61bd96ae419ee5786b7b49cb14dc75a5550b20758c08893 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c 5ca38181e826bcc35e0176c31a691d897ed0cc708fc935fd51e8023705cdcf1a @@ -1797,7 +1797,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 598d7358e7329f0de6e3defc217665909e46874258ac29592ee2fd53e6411cda -R edf6239ea759255e3950d6367e524f61 +P a874c649960ba2e2b2fd380d08c02a45884a1060d3922be8847729008ca6766e +R 80813d325e813398099f00570b3e6669 U drh -Z 24d644d970444f08b00aecabd19ab2a7 +Z 17d05c9142605382fe42e262b919a21f diff --git a/manifest.uuid b/manifest.uuid index a9143ea15c..0264815520 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a874c649960ba2e2b2fd380d08c02a45884a1060d3922be8847729008ca6766e \ No newline at end of file +6064584d578f0ac7aba3f67912a5d9eb1a3c6001469f6b9becbe68871131f887 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index b6c0a41040..cb8c756225 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3100,6 +3100,7 @@ static int lockBtree(BtShared *pBt){ ){ goto page1_init_failed; } + pBt->btsFlags |= BTS_PAGESIZE_FIXED; assert( (pageSize & 7)==0 ); /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte ** integer at offset 20 is the number of bytes of space at the end of From 418454c63fe1d6f3083542110d17cf561b8f369f Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 7 Jan 2019 15:57:35 +0000 Subject: [PATCH 017/306] For SQLITE_ENABLE_PREUPDATE_HOOK builds, disable the optimization for a REPLACE command on a WITHOUT ROWID table with no indexes, triggers or foreign key constraints that causes SQLite to clobber any existing row without separately checking for it. This optimization causes SQLite to omit the expected pre-update-hook callbacks. FossilOrigin-Name: 6281ef974c0ac7a7133c9e1e04c09fdbd627c019c6ff3227293548caf8283864 --- ext/session/sessionwor.test | 76 +++++++++++++++++++++++++++++-------- manifest | 16 ++++---- manifest.uuid | 2 +- src/insert.c | 7 +++- 4 files changed, 75 insertions(+), 26 deletions(-) diff --git a/ext/session/sessionwor.test b/ext/session/sessionwor.test index 2b2f8ca7e2..0f0b429d7b 100644 --- a/ext/session/sessionwor.test +++ b/ext/session/sessionwor.test @@ -30,27 +30,71 @@ proc test_reset {} { sqlite3 db2 test.db2 } +foreach {tn wo} { + 1 "" + 2 "WITHOUT ROWID" +} { + reset_db -do_execsql_test 1.0 { - CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT ROWID; + do_execsql_test 1.$tn.0 "CREATE TABLE t1(a PRIMARY KEY, b) $wo ;" + + do_iterator_test 1.$tn.1 t1 { + INSERT INTO t1 VALUES('one', 'two'); + } { + {INSERT t1 0 X. {} {t one t two}} + } + + do_iterator_test 1.$tn.2 t1 { + UPDATE t1 SET b='three' + } { + {UPDATE t1 0 X. {t one t two} {{} {} t three}} + } + + do_iterator_test 1.$tn.3 t1 { + REPLACE INTO t1 VALUES('one', 'four'); + } { + {UPDATE t1 0 X. {t one t three} {{} {} t four}} + } + + do_iterator_test 1.$tn.4 t1 { + DELETE FROM t1; + } { + {DELETE t1 0 X. {t one t four} {}} + } } -do_iterator_test 1.1 t1 { - INSERT INTO t1 VALUES('one', 'two'); +foreach {tn wo} { + 1 "" + 2 "WITHOUT ROWID" } { - {INSERT t1 0 X. {} {t one t two}} -} + reset_db -do_iterator_test 1.2 t1 { - UPDATE t1 SET b='three' -} { - {UPDATE t1 0 X. {t one t two} {{} {} t three}} -} - -do_iterator_test 1.3 t1 { - DELETE FROM t1; -} { - {DELETE t1 0 X. {t one t three} {}} + do_execsql_test 2.$tn.0 "CREATE TABLE t1(a INTEGER PRIMARY KEY, b) $wo ;" + + do_iterator_test 1.1 t1 { + INSERT INTO t1 VALUES(1, 'two'); + } { + {INSERT t1 0 X. {} {i 1 t two}} + } + + do_iterator_test 2.$tn.2 t1 { + UPDATE t1 SET b='three' + } { + {UPDATE t1 0 X. {i 1 t two} {{} {} t three}} + } + + do_iterator_test 2.$tn.3 t1 { + REPLACE INTO t1 VALUES(1, 'four'); + } { + {UPDATE t1 0 X. {i 1 t three} {{} {} t four}} + } + + do_iterator_test 2.$tn.4 t1 { + DELETE FROM t1; + } { + {DELETE t1 0 X. {i 1 t four} {}} + } } finish_test + diff --git a/manifest b/manifest index cc1448a9d1..79ebb5546c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\spage\ssize\sbecomes\sfixed\sas\ssoon\sas\spage1\sfrom\sa\snon-empty\sdatabase\sfile\nis\sread. -D 2019-01-06T02:06:31.916 +C For\sSQLITE_ENABLE_PREUPDATE_HOOK\sbuilds,\sdisable\sthe\soptimization\sfor\sa\nREPLACE\scommand\son\sa\sWITHOUT\sROWID\stable\swith\sno\sindexes,\striggers\sor\sforeign\nkey\sconstraints\sthat\scauses\sSQLite\sto\sclobber\sany\sexisting\srow\swithout\nseparately\schecking\sfor\sit.\sThis\soptimization\scauses\sSQLite\sto\somit\sthe\nexpected\spre-update-hook\scallbacks. +D 2019-01-07T15:57:35.664 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -424,7 +424,7 @@ F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181 F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b2953cf48683fb2724169 F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 -F ext/session/sessionwor.test 07f0b304dc4df5454906069140bf6ec67edcaa3c548f3683354003cf2c22b64a +F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d F ext/session/sqlite3session.c f88c4bd0404da56246b08f5d584462f8979ba6aedf8c30762b553f7ae91f51cf F ext/session/sqlite3session.h 54d6356f5769d3695e5f63d719c6ee27671b2614973a2b675a3ff4d30d574233 F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec @@ -473,7 +473,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 1660fca0a94e173cb63e509b241202bc2f41d3170bfd675b310e366747313d5c +F src/insert.c ad8226b25dfe415ed4733a74c87b8d97515154b15efc8df54e13484851d34489 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 008f45dd39cdc7fb9e7e1f61d75a5c97397f8e07427a8879be23e27747d5f948 @@ -1797,7 +1797,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 a874c649960ba2e2b2fd380d08c02a45884a1060d3922be8847729008ca6766e -R 80813d325e813398099f00570b3e6669 -U drh -Z 17d05c9142605382fe42e262b919a21f +P 6064584d578f0ac7aba3f67912a5d9eb1a3c6001469f6b9becbe68871131f887 +R 5891afb5fe0955414602e3a4eee5383a +U dan +Z 154017c0c603e5d693331eba5bef4a7a diff --git a/manifest.uuid b/manifest.uuid index 0264815520..144f32b04c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6064584d578f0ac7aba3f67912a5d9eb1a3c6001469f6b9becbe68871131f887 \ No newline at end of file +6281ef974c0ac7a7133c9e1e04c09fdbd627c019c6ff3227293548caf8283864 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 66cef82fd8..ae5110d8fa 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1712,7 +1712,11 @@ void sqlite3GenerateConstraintChecks( ** (3) There are no secondary indexes on the table ** (4) No delete triggers need to be fired if there is a conflict ** (5) No FK constraint counters need to be updated if a conflict occurs. - */ + ** + ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row + ** must be explicitly deleted in order to ensure any pre-update hook + ** is invoked. */ +#ifndef SQLITE_ENABLE_PREUPDATE_HOOK if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ && pPk==pIdx /* Condition 2 */ && onError==OE_Replace /* Condition 1 */ @@ -1724,6 +1728,7 @@ void sqlite3GenerateConstraintChecks( sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; } +#endif /* ifndef SQLITE_ENABLE_PREUPDATE_HOOK */ /* Check to see if the new index entry will be unique */ sqlite3VdbeVerifyAbortable(v, onError); From d9d7d253fcd3cb1e66b84c4530db8412506f8ee9 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 7 Jan 2019 16:52:00 +0000 Subject: [PATCH 018/306] Fix another potential buffer overread in fts5. FossilOrigin-Name: d0e943d9574c7cab1af4a0fe753a0b5f91ea0e884b91a85b13239144b71f067c --- ext/fts5/fts5_hash.c | 3 +- ext/fts5/test/fts5corrupt3.test | 293 ++++++++++++++++++++++++++++++++ manifest | 14 +- manifest.uuid | 2 +- 4 files changed, 303 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_hash.c b/ext/fts5/fts5_hash.c index 175706151b..7e404a8d22 100644 --- a/ext/fts5/fts5_hash.c +++ b/ext/fts5/fts5_hash.c @@ -483,7 +483,8 @@ int sqlite3Fts5HashQuery( for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ zKey = fts5EntryKey(p); - if( memcmp(zKey, pTerm, nTerm)==0 && zKey[nTerm]==0 ) break; + assert( p->nKey+1==(int)strlen(zKey) ); + if( nTerm==p->nKey+1 && memcmp(zKey, pTerm, nTerm)==0 ) break; } if( p ){ diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 57f8483b3d..7cb8fdb9cc 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -2523,6 +2523,299 @@ do_execsql_test 25.2 { PRAGMA page_size=512; } +#-------------------------------------------------------------------------- +reset_db +do_test 26.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename c30b.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 01 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ..08...........6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 0c 0f 00 05 09 fe 00 0f e6 09 fe 0c 94 0c 23 ...............# +| 16: 0a 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 2544: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 0a ................ +| 2560: 03 00 30 00 00 00 00 01 03 03 00 03 01 01 01 02 ..0............. +| 2576: 01 01 03 01 01 83 72 8c 80 80 80 80 01 04 00 87 ......r......... +| 2592: 68 00 00 01 e4 02 30 30 03 03 06 02 83 0f 30 30 h.....00......00 +| 2608: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2624: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2640: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2656: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2672: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2688: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2704: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2720: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2736: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2752: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2768: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2784: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2800: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2816: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2832: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2848: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2864: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2880: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2896: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2912: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2928: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2944: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2960: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2976: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2992: 30 30 30 30 30 30 30 30 30 30 30 30 30 03 06 01 0000000000000... +| 3008: 01 03 01 08 32 30 31 36 30 36 30 39 03 03 07 01 ....20160609.... +| 3024: 01 34 03 03 05 01 01 35 03 03 04 01 06 62 69 6e .4.....5.....bin +| 3040: 61 72 79 03 07 01 02 02 01 08 63 6f 6d 70 69 6c ary.......compil +| 3056: 65 72 03 03 02 01 03 67 63 63 03 03 03 01 01 78 er.....gcc.....x +| 3072: 03 07 01 01 02 04 06 83 17 0d 06 06 0d 0d 08 0f ................ +| 3088: ef 00 14 2a 00 00 00 00 01 02 02 00 02 01 01 01 ...*............ +| 3104: 02 01 01 6a 88 80 80 80 80 01 04 00 81 58 00 00 ...j.........X.. +| 3120: 00 5f 07 30 62 69 6e 61 72 79 0c 01 03 01 01 06 ._.0binary...... +| 3136: 65 6e 61 62 6c 65 0a 01 01 01 01 01 01 01 01 01 enable.......... +| 3152: 01 01 01 04 66 74 73 34 0a 01 01 01 01 01 04 01 ....fts4........ +| 3168: 35 0d 01 01 01 01 01 01 06 6e 6f 63 61 73 65 0b 5........nocase. +| 3184: 01 03 01 01 05 72 74 72 69 6d 0a 01 03 01 01 01 .....rtrim...... +| 3200: 78 0a 01 01 01 01 01 01 01 01 01 01 01 04 0c 14 x............... +| 3216: 0c 09 0c 0b 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 03 57 34 56 ..threadsafe.W4V +| 3840: 94 64 91 46 85 84 04 76 74 61 62 07 02 04 01 02 .d.F...vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 10 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 1e 4e 1f 1e 00 D..@........N... +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 0e 5b 00 1e 0a 4d 00 0f d8 0f af 0a 4d 0f 74 ..[...M......M.t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e 40 0e 24 0e 08 .a.N./.....@.$.. +| 32: 0d ef 0d d5 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 ...........h.O.5 +| 48: 0d 1b 0c fb 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e ...........x.W.> +| 64: 0c 24 0c 0a 0c 0a 0c 0a 0c 0a 0c 0a 0c 0a 0c 0a .$.............. +| 2624: 00 00 00 00 00 00 00 00 00 00 00 00 00 83 3a 03 ..............:. +| 2640: 06 00 43 86 33 19 43 4f 4d 50 49 4c 45 52 3d 67 ..C.3.COMPILER=g +| 2656: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 2672: 39 58 27 30 30 30 30 30 30 30 30 30 30 30 30 30 9X'0000000000000 +| 2688: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2704: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2720: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2736: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2752: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2768: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2784: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2800: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2816: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2832: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2848: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2864: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2880: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2896: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2912: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2928: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2944: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2960: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2976: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2992: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3008: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3024: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3040: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3056: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3072: 30 30 30 27 42 49 4e 41 52 59 18 24 05 00 25 0f 000'BINARY.$..%. +| 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 42 60 2d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 B`-EMSYS5XNOCASE +| 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 0f 86 00 94 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 00 00 00 7b 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 00 00 00 E FTS5XNOCASE... +| 3728: 62 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 b#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 00 00 00 4a 23 0f 19 45 4e 41 42 RTRIM...J#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 00 00 LE FTS4XBINARY.. +| 3776: 00 31 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 .1#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 00 00 00 18 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 24 15 48 4e 4f 43 41 53 45 1d TAT VT$.HNOCASE. +| 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 00 00 00 29 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 0f 88 00 1e 0e e0 00 0f f8 0f f0 0f b0 0f e0 ................ +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f 80 0f 78 0f 70 .............x.p +| 32: 0f 68 0f 60 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 .h.`.X.P.H.@.8.0 +| 48: 0f 28 0f 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 .(. ............ +| 64: 0e e8 0e e0 0e e0 0e e0 0e e0 0e e0 0e e0 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 0f e8 00 28 12 02 01 01 ...........(.... +| 3984: 00 00 00 28 12 02 01 01 00 00 00 20 12 02 01 01 ...(....... .... +| 4000: 00 00 00 18 12 02 01 01 00 00 00 10 12 02 01 01 ................ +| 4016: 06 03 03 00 12 06 02 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 00 00 00 08 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end c30b.db +}]} {} + +do_catchsql_test 26.1 { + BEGIN; + INSERT INTO t1(t1) VALUES('rebuild'); + INSERT INTO t1(t1) VALUES('integrity-check'); + COMMIT; +} {0 {}} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 79ebb5546c..a721790fdf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sSQLITE_ENABLE_PREUPDATE_HOOK\sbuilds,\sdisable\sthe\soptimization\sfor\sa\nREPLACE\scommand\son\sa\sWITHOUT\sROWID\stable\swith\sno\sindexes,\striggers\sor\sforeign\nkey\sconstraints\sthat\scauses\sSQLite\sto\sclobber\sany\sexisting\srow\swithout\nseparately\schecking\sfor\sit.\sThis\soptimization\scauses\sSQLite\sto\somit\sthe\nexpected\spre-update-hook\scallbacks. -D 2019-01-07T15:57:35.664 +C Fix\sanother\spotential\sbuffer\soverread\sin\sfts5. +D 2019-01-07T16:52:00.409 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -114,7 +114,7 @@ F ext/fts5/fts5_aux.c ca666a3bbe07c5a3bbe9fffaea19c935a1efaf337333e28bad7bdd1971 F ext/fts5/fts5_buffer.c 1dd1ec0446b3acfc2d7d407eb894762a461613e2695273f48e449bfd13e973ff F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 0eff5bad90838be83c5cc16837ca215a961abe05cfbf741a285ba62a79ad586f -F ext/fts5/fts5_hash.c 32be400cf761868c9db33efe81a06eb19a17c5402ad477ee9efb51301546dd55 +F ext/fts5/fts5_hash.c ad22ab3d89828cf3d996f784b7a6452ee16a940aa46abe466a1f14aa3d42bbf2 F ext/fts5/fts5_index.c 7d93b9503e02e57c94ce22e08758723f6d833969495a2c89ac7ca63957ab0053 F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 F ext/fts5/fts5_storage.c 0455c866b6c6a347229edee66333f5c08ea5f3b4940121d698c300353a73962f @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test bfe27d9e6b4d1346f15cc84a3e411220e1df89c731873124ec6ba9302f814613 +F ext/fts5/test/fts5corrupt3.test 8e882b0f8335aa18c0a920577e308970473c77fbf66067ed3e78f4a14657cfb1 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1797,7 +1797,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 6064584d578f0ac7aba3f67912a5d9eb1a3c6001469f6b9becbe68871131f887 -R 5891afb5fe0955414602e3a4eee5383a +P 6281ef974c0ac7a7133c9e1e04c09fdbd627c019c6ff3227293548caf8283864 +R 0cdd4532a9c589c72412270cee72fc08 U dan -Z 154017c0c603e5d693331eba5bef4a7a +Z f423f2e257a932f6f962dad9261c0d88 diff --git a/manifest.uuid b/manifest.uuid index 144f32b04c..011e209584 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6281ef974c0ac7a7133c9e1e04c09fdbd627c019c6ff3227293548caf8283864 \ No newline at end of file +d0e943d9574c7cab1af4a0fe753a0b5f91ea0e884b91a85b13239144b71f067c \ No newline at end of file From 174c21ff06fd8e31b6ad415fdadf5b50c1225443 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 8 Jan 2019 08:02:12 +0000 Subject: [PATCH 019/306] Fix further problems with fts5 and corrupt databases causing integer overflow. FossilOrigin-Name: 673a7dd698eca05bb2909fa01f962a0667361732a6d0e61cf7780ead4a07c967 --- ext/fts5/fts5_buffer.c | 4 +- ext/fts5/fts5_index.c | 8 +- ext/fts5/test/fts5corrupt3.test | 195 ++++++++++++++++++++++++++++++++ manifest | 16 +-- manifest.uuid | 2 +- 5 files changed, 210 insertions(+), 15 deletions(-) diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index b11689745b..7937a97c18 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -17,12 +17,12 @@ int sqlite3Fts5BufferSize(int *pRc, Fts5Buffer *pBuf, u32 nByte){ if( (u32)pBuf->nSpacenSpace ? pBuf->nSpace : 64; + u64 nNew = pBuf->nSpace ? pBuf->nSpace : 64; u8 *pNew; while( nNewp, nNew); + pNew = sqlite3_realloc64(pBuf->p, nNew); if( pNew==0 ){ *pRc = SQLITE_NOMEM; return 1; diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 262d7618e4..c01b1bb0f8 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -2234,10 +2234,10 @@ static void fts5LeafSeek( int szLeaf = pIter->pLeaf->szLeaf; int n = pIter->pLeaf->nn; - int nMatch = 0; - int nKeep = 0; - int nNew = 0; - int iTermOff; + u32 nMatch = 0; + u32 nKeep = 0; + u32 nNew = 0; + u32 iTermOff; int iPgidx; /* Current offset in pgidx */ int bEndOfPage = 0; diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 7cb8fdb9cc..689b072fe3 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -2817,6 +2817,201 @@ do_catchsql_test 26.1 { COMMIT; } {0 {}} +#-------------------------------------------------------------------------- +reset_db +do_test 27.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename timeout-2ca5b0658c98.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 20 01 02 02 02 01 02 02 01 06 64 iler. .........d +| 3408: 62 73 7c cc cc cc cc cc cc cc cc cc cc cc cc cc bs|............. +| 3424: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc ................ +| 3440: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc ................ +| 3456: cc cc cc cc cc cc c4 61 74 07 02 03 01 02 03 01 .......at....... +| 3472: 02 03 02 04 65 62 75 67 04 02 02 01 02 02 01 02 ....ebug........ +| 3488: 02 01 06 65 6e 61 62 6c 65 07 02 02 01 02 02 01 ...enable....... +| 3504: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3520: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3536: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 05 23 ...............# +| 3552: d6 76 36 32 d3 52 e3 42 e3 02 03 23 03 13 63 03 .v62.R.B...#..c. +| 3568: 63 03 95 84 e4 f4 34 15 34 52 60 10 50 04 30 f1 c.....4.4R`.P.0. +| 3584: 74 34 f4 d5 04 94 c4 55 23 d6 76 36 32 d3 52 e3 t4.....U#.v62.R. +| 3600: 42 e3 02 03 23 03 13 63 03 63 03 95 85 25 45 24 B...#..c.c...%E$ +| 3616: 94 d0 d0 00 00 02 40 ee 00 00 ff 80 ff 00 fe 80 ......@......... +| 3632: fe 00 fd 80 fd 00 fc 80 fc 00 fb 80 fb 00 fa 80 ................ +| 3648: fa 00 f9 80 f9 00 f8 80 f8 00 f7 80 f7 00 f6 80 ................ +| 3664: f6 00 f5 80 f5 00 f4 80 f4 00 f8 0f 30 0f 28 0f ............0.(. +| 3680: 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e ............... +| 3696: e0 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 5f e8 54 45 4e OMIT LOAD E_.TEN +| 3248: 53 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f SIONXRTRIM....3. +| 3264: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 31 81 .MAX MEMORY=501. +| 3280: 40 50 02 50 f1 94 54 e4 14 24 c4 52 04 a5 35 f4 @P.P..T..$.R..5. +| 3296: e3 15 84 e4 f4 34 15 34 51 71 30 50 02 50 f1 74 .....4.4Qq0P.P.t +| 3312: 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 85 25 45 24 T..$.R..4....%E$ +| 3328: 94 d1 a1 20 50 02 90 f1 94 54 e4 14 24 c4 52 04 ... P....T..$.R. +| 3344: 74 54 f5 04 f4 c5 95 84 24 94 e4 15 25 91 a1 10 tT......$...%... +| 3360: 50 02 90 f1 94 54 e4 14 24 c4 52 04 74 54 f5 04 P....T..$.R.tT.. +| 3376: f4 c5 95 84 e4 f4 34 15 34 51 91 00 50 02 90 f1 ......4.4Q..P... +| 3392: 74 54 e4 14 24 c4 52 04 74 54 f5 04 f4 c5 95 85 tT..$.R.tT...... +| 3408: 25 45 24 94 d1 70 f0 50 02 30 f1 94 54 e4 14 24 %E$..p.P.0..T..$ +| 3424: c4 52 04 65 45 33 55 84 24 94 e4 15 25 91 70 e0 .R.eE3U.$...%.p. +| 3440: 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 45 33 55 P.0..T..$.R.eE3U +| 3456: 84 e4 f4 34 15 34 51 60 d0 50 02 30 f1 74 54 e4 ...4.4Q`.P.0.tT. +| 3472: 14 24 c4 52 04 65 45 33 55 85 25 45 24 94 d1 70 .$.R.eE3U.%E$..p +| 3488: c0 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 45 33 .P.0..T..$.R.eE3 +| 3504: 45 84 24 94 e4 15 25 91 70 b0 50 02 30 f1 94 54 E.$...%.p.P.0..T +| 3520: e4 14 24 c4 52 04 65 45 33 45 84 e4 f4 34 15 34 ..$.R.eE3E...4.4 +| 3536: 51 60 a0 50 02 30 f1 74 54 e4 14 24 c4 52 04 65 Q`.P.0.tT..$.R.e +| 3552: 45 33 45 85 25 45 24 94 d1 e0 90 50 03 10 f1 94 E3E.%E$....P.... +| 3568: 54 e4 42 4c 45 20 44 42 53 54 41 54 20 56 54 41 T.BLE DBSTAT VTA +| 3584: 42 58 42 49 4e 41 52 59 1e 08 05 00 31 0f 19 45 BXBINARY....1..E +| 3600: e4 14 24 c4 52 04 44 25 35 44 15 42 05 65 42 41 ..$.R.D%5D.B.eBA +| 3616: 54 84 e4 f4 34 15 34 51 d0 70 50 03 10 f1 74 54 T...4.4Q.pP...tT +| 3632: e4 14 24 c4 52 04 44 25 35 44 15 42 05 65 44 14 ..$.R.D%5D.B.eD. +| 3648: 25 85 25 45 24 94 d1 10 60 50 01 70 f1 94 44 54 %.%E$...`P.p..DT +| 3664: 25 54 75 84 24 94 e4 15 25 91 10 50 50 01 70 f1 %Tu.$...%..PP.p. +| 3680: 94 44 54 25 54 75 84 e4 f4 34 15 34 51 00 40 50 .DT%Tu...4.4Q.@P +| 3696: 01 70 f1 74 44 54 25 54 75 85 25 45 24 94 d2 70 .p.tDT%Tu.%E$..p +| 3712: 30 50 04 30 f1 94 34 f4 d5 04 94 c4 55 23 d6 76 0P.0..4.....U#.v +| 3728: 36 32 d3 52 e3 42 e3 02 03 23 03 13 63 03 63 03 62.R.B...#..c.c. +| 3744: 95 84 24 94 e4 15 25 92 70 20 50 04 30 f1 94 34 ..$...%.p P.0..4 +| 3760: f4 d5 04 94 c4 53 30 01 00 00 10 10 04 02 02 00 .....S0......... +| 3776: 00 00 00 00 00 00 00 80 00 00 00 20 00 00 00 10 ........... .... +| 3792: 00 00 00 90 00 00 00 40 00 00 00 00 00 00 00 00 .......@........ +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end timeout-2ca5b0658c98.db +}]} {} + +do_catchsql_test 27.1 { + DELETE FROM t1 WHERE a MATCH 'fts*'; +} {1 {database disk image is malformed}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index a721790fdf..67edf0b280 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\spotential\sbuffer\soverread\sin\sfts5. -D 2019-01-07T16:52:00.409 +C Fix\sfurther\sproblems\swith\sfts5\sand\scorrupt\sdatabases\scausing\sinteger\soverflow. +D 2019-01-08T08:02:12.750 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -111,11 +111,11 @@ F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 4f5d19b7973dae23de368728f06d3eb1fe9f5cca2990366b40e9379996f35e61 F ext/fts5/fts5Int.h 8590e08a485c98a7e3075ed72abe3452fe944a9e58e63dfa51b732cced344cab F ext/fts5/fts5_aux.c ca666a3bbe07c5a3bbe9fffaea19c935a1efaf337333e28bad7bdd1971ffd093 -F ext/fts5/fts5_buffer.c 1dd1ec0446b3acfc2d7d407eb894762a461613e2695273f48e449bfd13e973ff +F ext/fts5/fts5_buffer.c 9567442b5dcb15ec1504e071ff052f35d533129af5fa6e97a163e2e466a18a4d F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 0eff5bad90838be83c5cc16837ca215a961abe05cfbf741a285ba62a79ad586f F ext/fts5/fts5_hash.c ad22ab3d89828cf3d996f784b7a6452ee16a940aa46abe466a1f14aa3d42bbf2 -F ext/fts5/fts5_index.c 7d93b9503e02e57c94ce22e08758723f6d833969495a2c89ac7ca63957ab0053 +F ext/fts5/fts5_index.c 7788ae02cdb18c551dcd99c383c9f30dcc35a1a7264c2420d24254a177a19a1b F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 F ext/fts5/fts5_storage.c 0455c866b6c6a347229edee66333f5c08ea5f3b4940121d698c300353a73962f F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 8e882b0f8335aa18c0a920577e308970473c77fbf66067ed3e78f4a14657cfb1 +F ext/fts5/test/fts5corrupt3.test 2cec78e6447c2be295bb9a123e3794e7fe19558e41241a8c861ec00b42ec4c77 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1797,7 +1797,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 6281ef974c0ac7a7133c9e1e04c09fdbd627c019c6ff3227293548caf8283864 -R 0cdd4532a9c589c72412270cee72fc08 +P d0e943d9574c7cab1af4a0fe753a0b5f91ea0e884b91a85b13239144b71f067c +R 7c19ce2fb585760f8fd1bf04363aabe3 U dan -Z f423f2e257a932f6f962dad9261c0d88 +Z c474e85f1a26d316780e3e94b6be3674 diff --git a/manifest.uuid b/manifest.uuid index 011e209584..16ab335b18 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d0e943d9574c7cab1af4a0fe753a0b5f91ea0e884b91a85b13239144b71f067c \ No newline at end of file +673a7dd698eca05bb2909fa01f962a0667361732a6d0e61cf7780ead4a07c967 \ No newline at end of file From c0f162020ec27bd7cc93c17f3f7e0e91c72f51e4 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 8 Jan 2019 14:28:02 +0000 Subject: [PATCH 020/306] Fix a possible memory leak when trying to UPDATE a corrupt RTREE index. FossilOrigin-Name: 63eb803dbc27077007dbee8def659d1523724eb73f1def1cdb68027e5c20843a --- ext/rtree/rtree.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index ea44ffeffb..83d1b82ab6 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -717,7 +717,6 @@ static int nodeAcquire( pNode->pNext = 0; rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, pRtree->iNodeSize, 0); - nodeReference(pParent); } } @@ -748,6 +747,7 @@ static int nodeAcquire( if( rc==SQLITE_OK ){ if( pNode!=0 ){ + nodeReference(pParent); nodeHashInsert(pRtree, pNode); }else{ rc = SQLITE_CORRUPT_VTAB; diff --git a/manifest b/manifest index 67edf0b280..87e96b2064 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sfurther\sproblems\swith\sfts5\sand\scorrupt\sdatabases\scausing\sinteger\soverflow. -D 2019-01-08T08:02:12.750 +C Fix\sa\spossible\smemory\sleak\swhen\strying\sto\sUPDATE\sa\scorrupt\sRTREE\sindex. +D 2019-01-08T14:28:02.662 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -366,7 +366,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 603ec9b72cd70cf18541339b6c7d47f304ac0d84c50294be6c6c6ae35acdb0a6 -F ext/rtree/rtree.c fae9943b6b6f2bf6a4ddeb192d54fa6d19311119c1388406ef27cf6de38f34aa +F ext/rtree/rtree.c 1fb8a71a2fe3d385256c976faa92f0451eca9f6760dc7ef5962826e61fa3694f F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 309afc04d4287542b2cd74f933296832cc681c7b014d9405cb329b62053a5349 F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 @@ -1797,7 +1797,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 d0e943d9574c7cab1af4a0fe753a0b5f91ea0e884b91a85b13239144b71f067c -R 7c19ce2fb585760f8fd1bf04363aabe3 -U dan -Z c474e85f1a26d316780e3e94b6be3674 +P 673a7dd698eca05bb2909fa01f962a0667361732a6d0e61cf7780ead4a07c967 +R 8b60ad3cb0e573d17f66ab6027826fe9 +U drh +Z 9698f42eb061c3571f9cb42a9d8aa284 diff --git a/manifest.uuid b/manifest.uuid index 16ab335b18..1aa891ede4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -673a7dd698eca05bb2909fa01f962a0667361732a6d0e61cf7780ead4a07c967 \ No newline at end of file +63eb803dbc27077007dbee8def659d1523724eb73f1def1cdb68027e5c20843a \ No newline at end of file From c930b405f0717d5f8626dd846f3ab1d2a7243195 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 8 Jan 2019 15:18:24 +0000 Subject: [PATCH 021/306] Performance improvement on the instr() function, especially for large haystacks. FossilOrigin-Name: ce51f1a2b6a1789a5876e01cf829e45d84f3851d135a2fa5c44a56f948673a60 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/func.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 87e96b2064..8935452168 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spossible\smemory\sleak\swhen\strying\sto\sUPDATE\sa\scorrupt\sRTREE\sindex. -D 2019-01-08T14:28:02.662 +C Performance\simprovement\son\sthe\sinstr()\sfunction,\sespecially\sfor\slarge\nhaystacks. +D 2019-01-08T15:18:24.588 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -467,7 +467,7 @@ F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab F src/expr.c 9ad9c40a83c4218d79de19153b7a8ba7810564a123af7e09281927990bea2964 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c aaf28be73ab21e1e8bf4ac6b94269ebc8c93238d1e6997cb44b527b622e8ae6f -F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f +F src/func.c 6cf832abbc2815fdb46fee654df32a66ab77deb47bf4cff04a5774dafecd497a F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 @@ -1797,7 +1797,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 673a7dd698eca05bb2909fa01f962a0667361732a6d0e61cf7780ead4a07c967 -R 8b60ad3cb0e573d17f66ab6027826fe9 +P 63eb803dbc27077007dbee8def659d1523724eb73f1def1cdb68027e5c20843a +R 174e6d1a2fb646acc0dac426835bced6 U drh -Z 9698f42eb061c3571f9cb42a9d8aa284 +Z 637ee479b8367750ae4cc1eec21d49de diff --git a/manifest.uuid b/manifest.uuid index 1aa891ede4..f89171316d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -63eb803dbc27077007dbee8def659d1523724eb73f1def1cdb68027e5c20843a \ No newline at end of file +ce51f1a2b6a1789a5876e01cf829e45d84f3851d135a2fa5c44a56f948673a60 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 0504a8f026..11598a7adc 100644 --- a/src/func.c +++ b/src/func.c @@ -201,6 +201,7 @@ static void instrFunc( int typeHaystack, typeNeedle; int N = 1; int isText; + unsigned char firstChar; UNUSED_PARAMETER(argc); typeHaystack = sqlite3_value_type(argv[0]); @@ -219,7 +220,10 @@ static void instrFunc( isText = 1; } if( zNeedle==0 || (nHaystack && zHaystack==0) ) return; - while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ + firstChar = zNeedle[0]; + while( nNeedle<=nHaystack + && (zHaystack[0]!=firstChar || memcmp(zHaystack, zNeedle, nNeedle)!=0) + ){ N++; do{ nHaystack--; From 2d77d80a65a2da89d58c04f91aa282d432d5c919 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 8 Jan 2019 20:02:48 +0000 Subject: [PATCH 022/306] Use 64-bit math to compute the sizes of memory allocations in extensions. FossilOrigin-Name: ca67f2ec0e294384c397db438605df1b47aae5f348a8de94f97286997625d169 --- ext/fts3/fts3.c | 36 ++++++------ ext/fts3/fts3_aux.c | 6 +- ext/fts3/fts3_expr.c | 14 ++--- ext/fts3/fts3_hash.c | 4 +- ext/fts3/fts3_icu.c | 4 +- ext/fts3/fts3_snippet.c | 14 ++--- ext/fts3/fts3_term.c | 6 +- ext/fts3/fts3_tokenize_vtab.c | 2 +- ext/fts3/fts3_unicode.c | 4 +- ext/fts5/fts5Int.h | 2 +- ext/fts5/fts5_aux.c | 8 +-- ext/fts5/fts5_buffer.c | 4 +- ext/fts5/fts5_config.c | 8 +-- ext/fts5/fts5_expr.c | 53 +++++++++--------- ext/fts5/fts5_hash.c | 19 +++---- ext/fts5/fts5_index.c | 36 ++++++------ ext/fts5/fts5_main.c | 14 ++--- ext/fts5/fts5_storage.c | 10 ++-- ext/fts5/fts5_test_mi.c | 4 +- ext/fts5/fts5_test_tok.c | 4 +- ext/fts5/fts5_tokenize.c | 7 ++- ext/fts5/fts5_unicode2.c | 1 - ext/fts5/fts5_varint.c | 1 - ext/misc/amatch.c | 10 ++-- ext/misc/closure.c | 6 +- ext/misc/dbdump.c | 2 +- ext/misc/eval.c | 2 +- ext/misc/fileio.c | 8 +-- ext/misc/fuzzer.c | 16 +++--- ext/misc/json1.c | 6 +- ext/misc/memstat.c | 2 +- ext/misc/mmapwarm.c | 1 - ext/misc/nextchar.c | 4 +- ext/misc/percentile.c | 2 +- ext/misc/regexp.c | 6 +- ext/misc/unionvtab.c | 8 +-- ext/misc/vfslog.c | 2 +- ext/misc/zipfile.c | 24 ++++---- ext/rtree/rtree.c | 26 ++++----- ext/session/changeset.c | 6 +- ext/session/changesetfuzz.c | 15 +++-- ext/session/session_speed_test.c | 2 - ext/session/sqlite3session.c | 34 +++++------ manifest | 96 ++++++++++++++++---------------- manifest.uuid | 2 +- 45 files changed, 268 insertions(+), 273 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index fd1c9a5334..e168fae151 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -799,10 +799,10 @@ static void fts3Appendf( ** memory. */ static char *fts3QuoteId(char const *zInput){ - int nRet; + sqlite3_int64 nRet; char *zRet; nRet = 2 + (int)strlen(zInput)*2 + 1; - zRet = sqlite3_malloc(nRet); + zRet = sqlite3_malloc64(nRet); if( zRet ){ int i; char *z = zRet; @@ -983,7 +983,7 @@ static int fts3PrefixParameter( } } - aIndex = sqlite3_malloc(sizeof(struct Fts3Index) * nIndex); + aIndex = sqlite3_malloc64(sizeof(struct Fts3Index) * nIndex); *apIndex = aIndex; if( !aIndex ){ return SQLITE_NOMEM; @@ -1062,7 +1062,7 @@ static int fts3ContentColumns( if( rc==SQLITE_OK ){ const char **azCol; /* Output array */ - int nStr = 0; /* Size of all column names (incl. 0x00) */ + sqlite3_int64 nStr = 0; /* Size of all column names (incl. 0x00) */ int nCol; /* Number of table columns */ int i; /* Used to iterate through columns */ @@ -1072,11 +1072,11 @@ static int fts3ContentColumns( nCol = sqlite3_column_count(pStmt); for(i=0; i0 ); if( bDescDoclist ){ - aOut = sqlite3_malloc(*pnRight + FTS3_VARINT_MAX); + aOut = sqlite3_malloc64((sqlite3_int64)*pnRight + FTS3_VARINT_MAX); if( aOut==0 ) return SQLITE_NOMEM; }else{ aOut = aRight; @@ -2834,8 +2834,8 @@ static int fts3SegReaderCursorAppend( ){ if( (pCsr->nSegment%16)==0 ){ Fts3SegReader **apNew; - int nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); - apNew = (Fts3SegReader **)sqlite3_realloc(pCsr->apSegment, nByte); + sqlite3_int64 nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); + apNew = (Fts3SegReader **)sqlite3_realloc64(pCsr->apSegment, nByte); if( !apNew ){ sqlite3Fts3SegReaderFree(pNew); return SQLITE_NOMEM; @@ -5009,7 +5009,7 @@ static int fts3EvalStart(Fts3Cursor *pCsr){ if( rc==SQLITE_OK && nToken>1 && pTab->bFts4 ){ Fts3TokenAndCost *aTC; Fts3Expr **apOr; - aTC = (Fts3TokenAndCost *)sqlite3_malloc( + aTC = (Fts3TokenAndCost *)sqlite3_malloc64( sizeof(Fts3TokenAndCost) * nToken + sizeof(Fts3Expr *) * nOr * 2 ); @@ -5320,7 +5320,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) ){ Fts3Expr *p; - int nTmp = 0; /* Bytes of temp space */ + sqlite3_int64 nTmp = 0; /* Bytes of temp space */ char *aTmp; /* Temp space for PoslistNearMerge() */ /* Allocate temporary working space. */ @@ -5329,7 +5329,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ nTmp += p->pRight->pPhrase->doclist.nList; } nTmp += p->pPhrase->doclist.nList; - aTmp = sqlite3_malloc(nTmp*2); + aTmp = sqlite3_malloc64(nTmp*2); if( !aTmp ){ *pRc = SQLITE_NOMEM; res = 0; @@ -5671,7 +5671,7 @@ static int fts3EvalGatherStats( for(p=pRoot; p; p=p->pLeft){ Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight); assert( pE->aMI==0 ); - pE->aMI = (u32 *)sqlite3_malloc(pTab->nColumn * 3 * sizeof(u32)); + pE->aMI = (u32 *)sqlite3_malloc64(pTab->nColumn * 3 * sizeof(u32)); if( !pE->aMI ) return SQLITE_NOMEM; memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32)); } diff --git a/ext/fts3/fts3_aux.c b/ext/fts3/fts3_aux.c index 54aea6f789..b9fe71fcf6 100644 --- a/ext/fts3/fts3_aux.c +++ b/ext/fts3/fts3_aux.c @@ -66,7 +66,7 @@ static int fts3auxConnectMethod( char const *zFts3; /* Name of fts3 table */ int nDb; /* Result of strlen(zDb) */ int nFts3; /* Result of strlen(zFts3) */ - int nByte; /* Bytes of space to allocate here */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ int rc; /* value returned by declare_vtab() */ Fts3auxTable *p; /* Virtual table object to return */ @@ -98,7 +98,7 @@ static int fts3auxConnectMethod( if( rc!=SQLITE_OK ) return rc; nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; - p = (Fts3auxTable *)sqlite3_malloc(nByte); + p = (Fts3auxTable *)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); @@ -248,7 +248,7 @@ static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ if( nSize>pCsr->nStat ){ struct Fts3auxColstats *aNew; - aNew = (struct Fts3auxColstats *)sqlite3_realloc(pCsr->aStat, + aNew = (struct Fts3auxColstats *)sqlite3_realloc64(pCsr->aStat, sizeof(struct Fts3auxColstats) * nSize ); if( aNew==0 ) return SQLITE_NOMEM; diff --git a/ext/fts3/fts3_expr.c b/ext/fts3/fts3_expr.c index 9f42b44a71..a8462020e1 100644 --- a/ext/fts3/fts3_expr.c +++ b/ext/fts3/fts3_expr.c @@ -122,8 +122,8 @@ static int fts3isspace(char c){ ** zero the memory before returning a pointer to it. If unsuccessful, ** return NULL. */ -static void *fts3MallocZero(int nByte){ - void *pRet = sqlite3_malloc(nByte); +static void *fts3MallocZero(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); if( pRet ) memset(pRet, 0, nByte); return pRet; } @@ -198,7 +198,7 @@ static int getNextToken( if( rc==SQLITE_OK ){ const char *zToken; int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0; - int nByte; /* total space to allocate */ + sqlite3_int64 nByte; /* total space to allocate */ rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); if( rc==SQLITE_OK ){ @@ -252,8 +252,8 @@ static int getNextToken( ** Enlarge a memory allocation. If an out-of-memory allocation occurs, ** then free the old allocation. */ -static void *fts3ReallocOrFree(void *pOrig, int nNew){ - void *pRet = sqlite3_realloc(pOrig, nNew); +static void *fts3ReallocOrFree(void *pOrig, sqlite3_int64 nNew){ + void *pRet = sqlite3_realloc64(pOrig, nNew); if( !pRet ){ sqlite3_free(pOrig); } @@ -796,7 +796,7 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ if( rc==SQLITE_OK ){ if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ Fts3Expr **apLeaf; - apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); + apLeaf = (Fts3Expr **)sqlite3_malloc64(sizeof(Fts3Expr *) * nMaxDepth); if( 0==apLeaf ){ rc = SQLITE_NOMEM; }else{ @@ -1216,7 +1216,7 @@ static void fts3ExprTestCommon( zExpr = (const char *)sqlite3_value_text(argv[1]); nExpr = sqlite3_value_bytes(argv[1]); nCol = argc-2; - azCol = (char **)sqlite3_malloc(nCol*sizeof(char *)); + azCol = (char **)sqlite3_malloc64(nCol*sizeof(char *)); if( !azCol ){ sqlite3_result_error_nomem(context); goto exprtest_out; diff --git a/ext/fts3/fts3_hash.c b/ext/fts3/fts3_hash.c index 1a32a537b4..63e55b3dc9 100644 --- a/ext/fts3/fts3_hash.c +++ b/ext/fts3/fts3_hash.c @@ -35,8 +35,8 @@ /* ** Malloc and Free functions */ -static void *fts3HashMalloc(int n){ - void *p = sqlite3_malloc(n); +static void *fts3HashMalloc(sqlite3_int64 n){ + void *p = sqlite3_malloc64(n); if( p ){ memset(p, 0, n); } diff --git a/ext/fts3/fts3_icu.c b/ext/fts3/fts3_icu.c index 6f90e1ebad..0848a5aaba 100644 --- a/ext/fts3/fts3_icu.c +++ b/ext/fts3/fts3_icu.c @@ -60,7 +60,7 @@ static int icuCreate( if( argc>0 ){ n = strlen(argv[0])+1; } - p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); + p = (IcuTokenizer *)sqlite3_malloc64(sizeof(IcuTokenizer)+n); if( !p ){ return SQLITE_NOMEM; } @@ -117,7 +117,7 @@ static int icuOpen( nInput = strlen(zInput); } nChar = nInput+1; - pCsr = (IcuCursor *)sqlite3_malloc( + pCsr = (IcuCursor *)sqlite3_malloc64( sizeof(IcuCursor) + /* IcuCursor */ ((nChar+3)&~3) * sizeof(UChar) + /* IcuCursor.aChar[] */ (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index a0771c0b30..ea4edf1428 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -178,7 +178,7 @@ static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ aOut = &p->aMatchinfo[p->nElem+2]; xRet = fts3MIBufferFree; }else{ - aOut = (u32*)sqlite3_malloc(p->nElem * sizeof(u32)); + aOut = (u32*)sqlite3_malloc64(p->nElem * sizeof(u32)); if( aOut ){ xRet = sqlite3_free; if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); @@ -516,7 +516,7 @@ static int fts3BestSnippet( int rc; /* Return Code */ int nList; /* Number of phrases in expression */ SnippetIter sIter; /* Iterates through snippet candidates */ - int nByte; /* Number of bytes of space to allocate */ + sqlite3_int64 nByte; /* Number of bytes of space to allocate */ int iBestScore = -1; /* Best snippet score found so far */ int i; /* Loop counter */ @@ -534,7 +534,7 @@ static int fts3BestSnippet( ** the required space using malloc(). */ nByte = sizeof(SnippetPhrase) * nList; - sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc(nByte); + sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc64(nByte); if( !sIter.aPhrase ){ return SQLITE_NOMEM; } @@ -604,8 +604,8 @@ static int fts3StringAppend( ** appended data. */ if( pStr->n+nAppend+1>=pStr->nAlloc ){ - int nAlloc = pStr->nAlloc+nAppend+100; - char *zNew = sqlite3_realloc(pStr->z, nAlloc); + sqlite3_int64 nAlloc = pStr->nAlloc+(sqlite3_int64)nAppend+100; + char *zNew = sqlite3_realloc64(pStr->z, nAlloc); if( !zNew ){ return SQLITE_NOMEM; } @@ -1121,7 +1121,7 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ /* Allocate and populate the array of LcsIterator objects. The array ** contains one element for each matchable phrase in the query. **/ - aIter = sqlite3_malloc(sizeof(LcsIterator) * pCsr->nPhrase); + aIter = sqlite3_malloc64(sizeof(LcsIterator) * pCsr->nPhrase); if( !aIter ) return SQLITE_NOMEM; memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase); (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); @@ -1566,7 +1566,7 @@ void sqlite3Fts3Offsets( if( rc!=SQLITE_OK ) goto offsets_out; /* Allocate the array of TermOffset iterators. */ - sCtx.aTerm = (TermOffset *)sqlite3_malloc(sizeof(TermOffset)*nToken); + sCtx.aTerm = (TermOffset *)sqlite3_malloc64(sizeof(TermOffset)*nToken); if( 0==sCtx.aTerm ){ rc = SQLITE_NOMEM; goto offsets_out; diff --git a/ext/fts3/fts3_term.c b/ext/fts3/fts3_term.c index aaa2404279..e8372190d4 100644 --- a/ext/fts3/fts3_term.c +++ b/ext/fts3/fts3_term.c @@ -68,9 +68,9 @@ static int fts3termConnectMethod( char const *zFts3; /* Name of fts3 table */ int nDb; /* Result of strlen(zDb) */ int nFts3; /* Result of strlen(zFts3) */ - int nByte; /* Bytes of space to allocate here */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ int rc; /* value returned by declare_vtab() */ - Fts3termTable *p; /* Virtual table object to return */ + Fts3termTable *p; /* Virtual table object to return */ int iIndex = 0; UNUSED_PARAMETER(pCtx); @@ -96,7 +96,7 @@ static int fts3termConnectMethod( if( rc!=SQLITE_OK ) return rc; nByte = sizeof(Fts3termTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; - p = (Fts3termTable *)sqlite3_malloc(nByte); + p = (Fts3termTable *)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); diff --git a/ext/fts3/fts3_tokenize_vtab.c b/ext/fts3/fts3_tokenize_vtab.c index a3d24bc676..b5bf8add02 100644 --- a/ext/fts3/fts3_tokenize_vtab.c +++ b/ext/fts3/fts3_tokenize_vtab.c @@ -122,7 +122,7 @@ static int fts3tokDequoteArray( nByte += (int)(strlen(argv[i]) + 1); } - *pazDequote = azDequote = sqlite3_malloc(sizeof(char *)*argc + nByte); + *pazDequote = azDequote = sqlite3_malloc64(sizeof(char *)*argc + nByte); if( azDequote==0 ){ rc = SQLITE_NOMEM; }else{ diff --git a/ext/fts3/fts3_unicode.c b/ext/fts3/fts3_unicode.c index c02ea3990c..b06d992144 100644 --- a/ext/fts3/fts3_unicode.c +++ b/ext/fts3/fts3_unicode.c @@ -155,7 +155,7 @@ static int unicodeAddExceptions( int *aNew; /* New aiException[] array */ int nNew; /* Number of valid entries in array aNew[] */ - aNew = sqlite3_realloc(p->aiException, (p->nException+nEntry)*sizeof(int)); + aNew = sqlite3_realloc64(p->aiException,(p->nException+nEntry)*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; nNew = p->nException; @@ -344,7 +344,7 @@ static int unicodeNext( /* Grow the output buffer if required. */ if( (zOut-pCsr->zToken)>=(pCsr->nAlloc-4) ){ - char *zNew = sqlite3_realloc(pCsr->zToken, pCsr->nAlloc+64); + char *zNew = sqlite3_realloc64(pCsr->zToken, pCsr->nAlloc+64); if( !zNew ) return SQLITE_NOMEM; zOut = &zNew[zOut - pCsr->zToken]; pCsr->zToken = zNew; diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index b4f4b07285..66d134fdf6 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -309,7 +309,7 @@ int sqlite3Fts5PoslistNext64( ); /* Malloc utility */ -void *sqlite3Fts5MallocZero(int *pRc, int nByte); +void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte); char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn); /* Character set tests (like isspace(), isalpha() etc.) */ diff --git a/ext/fts5/fts5_aux.c b/ext/fts5/fts5_aux.c index 594b981dda..f884ddb328 100644 --- a/ext/fts5/fts5_aux.c +++ b/ext/fts5/fts5_aux.c @@ -268,7 +268,7 @@ static int fts5SentenceFinderAdd(Fts5SFinder *p, int iAdd){ int nNew = p->nFirstAlloc ? p->nFirstAlloc*2 : 64; int *aNew; - aNew = (int*)sqlite3_realloc(p->aFirst, nNew*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aFirst, nNew*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; p->aFirst = aNew; p->nFirstAlloc = nNew; @@ -568,13 +568,13 @@ static int fts5Bm25GetData( int nPhrase; /* Number of phrases in query */ sqlite3_int64 nRow = 0; /* Number of rows in table */ sqlite3_int64 nToken = 0; /* Number of tokens in table */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int i; /* Allocate the Fts5Bm25Data object */ nPhrase = pApi->xPhraseCount(pFts); nByte = sizeof(Fts5Bm25Data) + nPhrase*2*sizeof(double); - p = (Fts5Bm25Data*)sqlite3_malloc(nByte); + p = (Fts5Bm25Data*)sqlite3_malloc64(nByte); if( p==0 ){ rc = SQLITE_NOMEM; }else{ @@ -710,5 +710,3 @@ int sqlite3Fts5AuxInit(fts5_api *pApi){ return rc; } - - diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index 7937a97c18..3cb307a55d 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -244,10 +244,10 @@ int sqlite3Fts5PoslistWriterAppend( return SQLITE_OK; } -void *sqlite3Fts5MallocZero(int *pRc, int nByte){ +void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte){ void *pRet = 0; if( *pRc==SQLITE_OK ){ - pRet = sqlite3_malloc(nByte); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ if( nByte>0 ) *pRc = SQLITE_NOMEM; }else{ diff --git a/ext/fts5/fts5_config.c b/ext/fts5/fts5_config.c index 17fc43e011..b422c95ab0 100644 --- a/ext/fts5/fts5_config.c +++ b/ext/fts5/fts5_config.c @@ -295,7 +295,7 @@ static int fts5ConfigParseSpecial( if( sqlite3_strnicmp("tokenize", zCmd, nCmd)==0 ){ const char *p = (const char*)zArg; - int nArg = (int)strlen(zArg) + 1; + sqlite3_int64 nArg = strlen(zArg) + 1; char **azArg = sqlite3Fts5MallocZero(&rc, sizeof(char*) * nArg); char *pDel = sqlite3Fts5MallocZero(&rc, nArg * 2); char *pSpace = pDel; @@ -425,8 +425,8 @@ static const char *fts5ConfigGobbleWord( ){ const char *zRet = 0; - int nIn = (int)strlen(zIn); - char *zOut = sqlite3_malloc(nIn+1); + sqlite3_int64 nIn = strlen(zIn); + char *zOut = sqlite3_malloc64(nIn+1); assert( *pRc==SQLITE_OK ); *pbQuoted = 0; @@ -529,7 +529,7 @@ int sqlite3Fts5ConfigParse( int rc = SQLITE_OK; /* Return code */ Fts5Config *pRet; /* New object to return */ int i; - int nByte; + sqlite3_int64 nByte; *ppOut = pRet = (Fts5Config*)sqlite3_malloc(sizeof(Fts5Config)); if( pRet==0 ) return SQLITE_NOMEM; diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index b56434e35a..c5bfb08754 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -211,7 +211,7 @@ static int fts5ExprGetToken( return tok; } -static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc((int)t); } +static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc64((sqlite3_int64)t);} static void fts5ParseFree(void *p){ sqlite3_free(p); } int sqlite3Fts5ExprNew( @@ -356,8 +356,8 @@ static int fts5ExprSynonymList( if( sqlite3Fts5IterEof(pIter)==0 && pIter->iRowid==iRowid ){ if( pIter->nData==0 ) continue; if( nIter==nAlloc ){ - int nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; - Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; + Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( aNew==0 ){ rc = SQLITE_NOMEM; goto synonym_poslist_out; @@ -437,8 +437,8 @@ static int fts5ExprPhraseIsMatch( /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pPhrase->nTerm>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; - aIter = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; + aIter = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( !aIter ) return SQLITE_NOMEM; } memset(aIter, 0, sizeof(Fts5PoslistReader) * pPhrase->nTerm); @@ -572,7 +572,7 @@ static int fts5ExprNearIsMatch(int *pRc, Fts5ExprNearset *pNear){ /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pNear->nPhrase>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; + sqlite3_int64 nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; a = (Fts5NearTrimmer*)sqlite3Fts5MallocZero(&rc, nByte); }else{ memset(aStatic, 0, sizeof(aStatic)); @@ -1481,8 +1481,9 @@ Fts5ExprNearset *sqlite3Fts5ParseNearset( return pNear; } if( pNear==0 ){ - int nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); - pRet = sqlite3_malloc(nByte); + sqlite3_int64 nByte; + nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; }else{ @@ -1490,9 +1491,10 @@ Fts5ExprNearset *sqlite3Fts5ParseNearset( } }else if( (pNear->nPhrase % SZALLOC)==0 ){ int nNew = pNear->nPhrase + SZALLOC; - int nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + sqlite3_int64 nByte; - pRet = (Fts5ExprNearset*)sqlite3_realloc(pNear, nByte); + nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + pRet = (Fts5ExprNearset*)sqlite3_realloc64(pNear, nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; } @@ -1556,8 +1558,8 @@ static int fts5ParseTokenize( if( pPhrase && pPhrase->nTerm>0 && (tflags & FTS5_TOKEN_COLOCATED) ){ Fts5ExprTerm *pSyn; - int nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; - pSyn = (Fts5ExprTerm*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; + pSyn = (Fts5ExprTerm*)sqlite3_malloc64(nByte); if( pSyn==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1573,7 +1575,7 @@ static int fts5ParseTokenize( Fts5ExprPhrase *pNew; int nNew = SZALLOC + (pPhrase ? pPhrase->nTerm : 0); - pNew = (Fts5ExprPhrase*)sqlite3_realloc(pPhrase, + pNew = (Fts5ExprPhrase*)sqlite3_realloc64(pPhrase, sizeof(Fts5ExprPhrase) + sizeof(Fts5ExprTerm) * nNew ); if( pNew==0 ){ @@ -1659,9 +1661,9 @@ Fts5ExprPhrase *sqlite3Fts5ParseTerm( if( pAppend==0 ){ if( (pParse->nPhrase % 8)==0 ){ - int nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); + sqlite3_int64 nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); Fts5ExprPhrase **apNew; - apNew = (Fts5ExprPhrase**)sqlite3_realloc(pParse->apPhrase, nByte); + apNew = (Fts5ExprPhrase**)sqlite3_realloc64(pParse->apPhrase, nByte); if( apNew==0 ){ pParse->rc = SQLITE_NOMEM; fts5ExprPhraseFree(sCtx.pPhrase); @@ -1716,8 +1718,10 @@ int sqlite3Fts5ExprClonePhrase( if( rc==SQLITE_OK ){ Fts5Colset *pColsetOrig = pOrig->pNode->pNear->pColset; if( pColsetOrig ){ - int nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); - Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); + sqlite3_int64 nByte; + Fts5Colset *pColset; + nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); + pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); if( pColset ){ memcpy(pColset, pColsetOrig, nByte); } @@ -1837,7 +1841,7 @@ static Fts5Colset *fts5ParseColset( assert( pParse->rc==SQLITE_OK ); assert( iCol>=0 && iColpConfig->nCol ); - pNew = sqlite3_realloc(p, sizeof(Fts5Colset) + sizeof(int)*nCol); + pNew = sqlite3_realloc64(p, sizeof(Fts5Colset) + sizeof(int)*nCol); if( pNew==0 ){ pParse->rc = SQLITE_NOMEM; }else{ @@ -1933,7 +1937,7 @@ Fts5Colset *sqlite3Fts5ParseColset( static Fts5Colset *fts5CloneColset(int *pRc, Fts5Colset *pOrig){ Fts5Colset *pRet; if( pOrig ){ - int nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); + sqlite3_int64 nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); pRet = (Fts5Colset*)sqlite3Fts5MallocZero(pRc, nByte); if( pRet ){ memcpy(pRet, pOrig, nByte); @@ -2087,7 +2091,7 @@ Fts5ExprNode *sqlite3Fts5ParseNode( if( pParse->rc==SQLITE_OK ){ int nChild = 0; /* Number of children of returned node */ - int nByte; /* Bytes of space to allocate for this node */ + sqlite3_int64 nByte; /* Bytes of space to allocate for this node */ assert( (eType!=FTS5_STRING && !pNear) || (eType==FTS5_STRING && !pLeft && !pRight) @@ -2219,7 +2223,7 @@ Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( } static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ - int nByte = 0; + sqlite3_int64 nByte = 0; Fts5ExprTerm *p; char *zQuoted; @@ -2227,7 +2231,7 @@ static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ for(p=pTerm; p; p=p->pSynonym){ nByte += (int)strlen(pTerm->zTerm) * 2 + 3 + 2; } - zQuoted = sqlite3_malloc(nByte); + zQuoted = sqlite3_malloc64(nByte); if( zQuoted ){ int i = 0; @@ -2467,7 +2471,7 @@ static void fts5ExprFunction( } nConfig = 3 + (nArg-iArg); - azConfig = (const char**)sqlite3_malloc(sizeof(char*) * nConfig); + azConfig = (const char**)sqlite3_malloc64(sizeof(char*) * nConfig); if( azConfig==0 ){ sqlite3_result_error_nomem(pCtx); return; @@ -2648,7 +2652,7 @@ struct Fts5PoslistPopulator { Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int bLive){ Fts5PoslistPopulator *pRet; - pRet = sqlite3_malloc(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); + pRet = sqlite3_malloc64(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); if( pRet ){ int i; memset(pRet, 0, sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); @@ -2847,4 +2851,3 @@ int sqlite3Fts5ExprPhraseCollist( return rc; } - diff --git a/ext/fts5/fts5_hash.c b/ext/fts5/fts5_hash.c index 7e404a8d22..e0b91f0977 100644 --- a/ext/fts5/fts5_hash.c +++ b/ext/fts5/fts5_hash.c @@ -90,14 +90,14 @@ int sqlite3Fts5HashNew(Fts5Config *pConfig, Fts5Hash **ppNew, int *pnByte){ if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ - int nByte; + sqlite3_int64 nByte; memset(pNew, 0, sizeof(Fts5Hash)); pNew->pnByte = pnByte; pNew->eDetail = pConfig->eDetail; pNew->nSlot = 1024; nByte = sizeof(Fts5HashEntry*) * pNew->nSlot; - pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc(nByte); + pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc64(nByte); if( pNew->aSlot==0 ){ sqlite3_free(pNew); *ppNew = 0; @@ -165,7 +165,7 @@ static int fts5HashResize(Fts5Hash *pHash){ Fts5HashEntry **apNew; Fts5HashEntry **apOld = pHash->aSlot; - apNew = (Fts5HashEntry**)sqlite3_malloc(nNew*sizeof(Fts5HashEntry*)); + apNew = (Fts5HashEntry**)sqlite3_malloc64(nNew*sizeof(Fts5HashEntry*)); if( !apNew ) return SQLITE_NOMEM; memset(apNew, 0, nNew*sizeof(Fts5HashEntry*)); @@ -259,7 +259,7 @@ int sqlite3Fts5HashWrite( if( p==0 ){ /* Figure out how much space to allocate */ char *zKey; - int nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; + sqlite3_int64 nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; if( nByte<128 ) nByte = 128; /* Grow the Fts5Hash.aSlot[] array if necessary. */ @@ -270,7 +270,7 @@ int sqlite3Fts5HashWrite( } /* Allocate new Fts5HashEntry and add it to the hash table. */ - p = (Fts5HashEntry*)sqlite3_malloc(nByte); + p = (Fts5HashEntry*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, sizeof(Fts5HashEntry)); p->nAlloc = nByte; @@ -309,12 +309,12 @@ int sqlite3Fts5HashWrite( ** + 5 bytes for the new position offset (32-bit max). */ if( (p->nAlloc - p->nData) < (9 + 4 + 1 + 3 + 5) ){ - int nNew = p->nAlloc * 2; + sqlite3_int64 nNew = p->nAlloc * 2; Fts5HashEntry *pNew; Fts5HashEntry **pp; - pNew = (Fts5HashEntry*)sqlite3_realloc(p, nNew); + pNew = (Fts5HashEntry*)sqlite3_realloc64(p, nNew); if( pNew==0 ) return SQLITE_NOMEM; - pNew->nAlloc = nNew; + pNew->nAlloc = (int)nNew; for(pp=&pHash->aSlot[iHash]; *pp!=p; pp=&(*pp)->pHashNext); *pp = pNew; p = pNew; @@ -438,7 +438,7 @@ static int fts5HashEntrySort( int i; *ppSorted = 0; - ap = sqlite3_malloc(sizeof(Fts5HashEntry*) * nMergeSlot); + ap = sqlite3_malloc64(sizeof(Fts5HashEntry*) * nMergeSlot); if( !ap ) return SQLITE_NOMEM; memset(ap, 0, sizeof(Fts5HashEntry*) * nMergeSlot); @@ -535,4 +535,3 @@ void sqlite3Fts5HashScanEntry( *pnDoclist = 0; } } - diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index c01b1bb0f8..268af5e13c 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -573,7 +573,7 @@ static u16 fts5GetU16(const u8 *aIn){ ** If an OOM error is encountered, return NULL and set the error code in ** the Fts5Index handle passed as the first argument. */ -static void *fts5IdxMalloc(Fts5Index *p, int nByte){ +static void *fts5IdxMalloc(Fts5Index *p, sqlite3_int64 nByte){ return sqlite3Fts5MallocZero(&p->rc, nByte); } @@ -673,8 +673,8 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ if( rc==SQLITE_OK ){ u8 *aOut = 0; /* Read blob data into this buffer */ int nByte = sqlite3_blob_bytes(p->pReader); - int nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; - pRet = (Fts5Data*)sqlite3_malloc(nAlloc); + sqlite3_int64 nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; + pRet = (Fts5Data*)sqlite3_malloc64(nAlloc); if( pRet ){ pRet->nn = nByte; aOut = pRet->p = (u8*)&pRet[1]; @@ -849,7 +849,7 @@ static int fts5StructureDecode( int iLvl; int nLevel = 0; int nSegment = 0; - int nByte; /* Bytes of space to allocate at pRet */ + sqlite3_int64 nByte; /* Bytes of space to allocate at pRet */ Fts5Structure *pRet = 0; /* Structure object to return */ /* Grab the cookie value */ @@ -933,12 +933,12 @@ static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){ if( *pRc==SQLITE_OK ){ Fts5Structure *pStruct = *ppStruct; int nLevel = pStruct->nLevel; - int nByte = ( + sqlite3_int64 nByte = ( sizeof(Fts5Structure) + /* Main structure */ sizeof(Fts5StructureLevel) * (nLevel+1) /* aLevel[] array */ ); - pStruct = sqlite3_realloc(pStruct, nByte); + pStruct = sqlite3_realloc64(pStruct, nByte); if( pStruct ){ memset(&pStruct->aLevel[nLevel], 0, sizeof(Fts5StructureLevel)); pStruct->nLevel++; @@ -963,10 +963,10 @@ static void fts5StructureExtendLevel( if( *pRc==SQLITE_OK ){ Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; Fts5StructureSegment *aNew; - int nByte; + sqlite3_int64 nByte; nByte = (pLvl->nSeg + nExtra) * sizeof(Fts5StructureSegment); - aNew = sqlite3_realloc(pLvl->aSeg, nByte); + aNew = sqlite3_realloc64(pLvl->aSeg, nByte); if( aNew ){ if( bInsert==0 ){ memset(&aNew[pLvl->nSeg], 0, sizeof(Fts5StructureSegment) * nExtra); @@ -1480,10 +1480,10 @@ static Fts5DlidxIter *fts5DlidxIterInit( int bDone = 0; for(i=0; p->rc==SQLITE_OK && bDone==0; i++){ - int nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); + sqlite3_int64 nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); Fts5DlidxIter *pNew; - pNew = (Fts5DlidxIter*)sqlite3_realloc(pIter, nByte); + pNew = (Fts5DlidxIter*)sqlite3_realloc64(pIter, nByte); if( pNew==0 ){ p->rc = SQLITE_NOMEM; }else{ @@ -1780,7 +1780,7 @@ static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){ /* If necessary, grow the pIter->aRowidOffset[] array. */ if( iRowidOffset>=pIter->nRowidOffset ){ int nNew = pIter->nRowidOffset + 8; - int *aNew = (int*)sqlite3_realloc(pIter->aRowidOffset, nNew*sizeof(int)); + int *aNew = (int*)sqlite3_realloc64(pIter->aRowidOffset,nNew*sizeof(int)); if( aNew==0 ){ p->rc = SQLITE_NOMEM; break; @@ -2261,15 +2261,15 @@ static void fts5LeafSeek( assert( nKeep>=nMatch ); if( nKeep==nMatch ){ - int nCmp; - int i; - nCmp = MIN(nNew, nTerm-nMatch); + u32 nCmp; + u32 i; + nCmp = (u32)MIN(nNew, nTerm-nMatch); for(i=0; irc==SQLITE_OK && nLvl>=pWriter->nDlidx ){ - Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc( + Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc64( pWriter->aDlidx, sizeof(Fts5DlidxWriter) * nLvl ); if( aDlidx==0 ){ @@ -4648,7 +4648,7 @@ static Fts5Structure *fts5IndexOptimizeStruct( Fts5Structure *pStruct ){ Fts5Structure *pNew = 0; - int nByte = sizeof(Fts5Structure); + sqlite3_int64 nByte = sizeof(Fts5Structure); int nSeg = pStruct->nSegment; int i; @@ -6280,7 +6280,7 @@ static void fts5DecodeFunction( u8 *a = 0; Fts5Buffer s; /* Build up text to return here */ int rc = SQLITE_OK; /* Return code */ - int nSpace = 0; + sqlite3_int64 nSpace = 0; int eDetailNone = (sqlite3_user_data(pCtx)!=0); assert( nArg==2 ); diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index e5ff3936ff..6fc5a90311 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -629,13 +629,13 @@ static int fts5OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ Fts5Table *pTab = (Fts5Table*)pVTab; Fts5Config *pConfig = pTab->pConfig; Fts5Cursor *pCsr = 0; /* New cursor object */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int rc; /* Return code */ rc = fts5NewTransaction(pTab); if( rc==SQLITE_OK ){ nByte = sizeof(Fts5Cursor) + pConfig->nCol * sizeof(int); - pCsr = (Fts5Cursor*)sqlite3_malloc(nByte); + pCsr = (Fts5Cursor*)sqlite3_malloc64(nByte); if( pCsr ){ Fts5Global *pGlobal = pTab->pGlobal; memset(pCsr, 0, nByte); @@ -906,14 +906,14 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ Fts5Config *pConfig = pTab->pConfig; Fts5Sorter *pSorter; int nPhrase; - int nByte; + sqlite3_int64 nByte; int rc; const char *zRank = pCsr->zRank; const char *zRankArgs = pCsr->zRankArgs; nPhrase = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); nByte = sizeof(Fts5Sorter) + sizeof(int) * (nPhrase-1); - pSorter = (Fts5Sorter*)sqlite3_malloc(nByte); + pSorter = (Fts5Sorter*)sqlite3_malloc64(nByte); if( pSorter==0 ) return SQLITE_NOMEM; memset(pSorter, 0, nByte); pSorter->nIdx = nPhrase; @@ -1032,7 +1032,7 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ assert( rc==SQLITE_OK || pCsr->pRankArgStmt==0 ); if( rc==SQLITE_OK ){ if( SQLITE_ROW==sqlite3_step(pStmt) ){ - int nByte; + sqlite3_int64 nByte; pCsr->nRankArg = sqlite3_column_count(pStmt); nByte = sizeof(sqlite3_value*)*pCsr->nRankArg; pCsr->apRankArg = (sqlite3_value**)sqlite3Fts5MallocZero(&rc, nByte); @@ -1776,7 +1776,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); if( pCsr->aInstIter==0 ){ - int nByte = sizeof(Fts5PoslistReader) * nIter; + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nIter; pCsr->aInstIter = (Fts5PoslistReader*)sqlite3Fts5MallocZero(&rc, nByte); } aIter = pCsr->aInstIter; @@ -1811,7 +1811,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ nInst++; if( nInst>=pCsr->nInstAlloc ){ pCsr->nInstAlloc = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32; - aInst = (int*)sqlite3_realloc( + aInst = (int*)sqlite3_realloc64( pCsr->aInst, pCsr->nInstAlloc*sizeof(int)*3 ); if( aInst ){ diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 7c119298fc..a2e34005e1 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -115,7 +115,7 @@ static int fts5StorageGetStmt( char *zBind; int i; - zBind = sqlite3_malloc(1 + nCol*2); + zBind = sqlite3_malloc64(1 + nCol*2); if( zBind ){ for(i=0; inCol * sizeof(i64); /* Fts5Storage.aTotalSize[] */ - *pp = p = (Fts5Storage*)sqlite3_malloc(nByte); + *pp = p = (Fts5Storage*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); @@ -297,7 +297,7 @@ int sqlite3Fts5StorageOpen( if( bCreate ){ if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ int nDefn = 32 + pConfig->nCol*10; - char *zDefn = sqlite3_malloc(32 + pConfig->nCol * 10); + char *zDefn = sqlite3_malloc64(32 + (sqlite3_int64)pConfig->nCol * 10); if( zDefn==0 ){ rc = SQLITE_NOMEM; }else{ @@ -878,7 +878,7 @@ int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ memset(&ctx, 0, sizeof(Fts5IntegrityCtx)); ctx.pConfig = p->pConfig; - aTotalSize = (i64*)sqlite3_malloc(pConfig->nCol * (sizeof(int)+sizeof(i64))); + aTotalSize = (i64*)sqlite3_malloc64(pConfig->nCol*(sizeof(int)+sizeof(i64))); if( !aTotalSize ) return SQLITE_NOMEM; aColSize = (int*)&aTotalSize[pConfig->nCol]; memset(aTotalSize, 0, sizeof(i64) * pConfig->nCol); diff --git a/ext/fts5/fts5_test_mi.c b/ext/fts5/fts5_test_mi.c index 481d09b2ca..6f2d6e7ea2 100644 --- a/ext/fts5/fts5_test_mi.c +++ b/ext/fts5/fts5_test_mi.c @@ -309,7 +309,7 @@ static Fts5MatchinfoCtx *fts5MatchinfoNew( int nPhrase; int i; int nInt; - int nByte; + sqlite3_int64 nByte; int rc; nCol = pApi->xColumnCount(pFts); @@ -330,7 +330,7 @@ static Fts5MatchinfoCtx *fts5MatchinfoNew( nByte = sizeof(Fts5MatchinfoCtx) /* The struct itself */ + sizeof(u32) * nInt /* The p->aRet[] array */ + (i+1); /* The p->zArg string */ - p = (Fts5MatchinfoCtx*)sqlite3_malloc(nByte); + p = (Fts5MatchinfoCtx*)sqlite3_malloc64(nByte); if( p==0 ){ sqlite3_result_error_nomem(pCtx); return 0; diff --git a/ext/fts5/fts5_test_tok.c b/ext/fts5/fts5_test_tok.c index 3ac6e351a5..b5d4162fa8 100644 --- a/ext/fts5/fts5_test_tok.c +++ b/ext/fts5/fts5_test_tok.c @@ -137,7 +137,7 @@ static int fts5tokDequoteArray( nByte += (int)(strlen(argv[i]) + 1); } - *pazDequote = azDequote = sqlite3_malloc(sizeof(char *)*argc + nByte); + *pazDequote = azDequote = sqlite3_malloc64(sizeof(char *)*argc + nByte); if( azDequote==0 ){ rc = SQLITE_NOMEM; }else{ @@ -335,7 +335,7 @@ static int fts5tokCb( if( (pCsr->nRow & (pCsr->nRow-1))==0 ){ int nNew = pCsr->nRow ? pCsr->nRow*2 : 32; Fts5tokRow *aNew; - aNew = (Fts5tokRow*)sqlite3_realloc(pCsr->aRow, nNew*sizeof(Fts5tokRow)); + aNew = (Fts5tokRow*)sqlite3_realloc64(pCsr->aRow, nNew*sizeof(Fts5tokRow)); if( aNew==0 ) return SQLITE_NOMEM; memset(&aNew[pCsr->nRow], 0, sizeof(Fts5tokRow)*(nNew-pCsr->nRow)); pCsr->aRow = aNew; diff --git a/ext/fts5/fts5_tokenize.c b/ext/fts5/fts5_tokenize.c index bbc4485a59..9fced72ba2 100644 --- a/ext/fts5/fts5_tokenize.c +++ b/ext/fts5/fts5_tokenize.c @@ -152,7 +152,7 @@ static int fts5AsciiTokenize( nByte = ie-is; if( nByte>nFold ){ if( pFold!=aFold ) sqlite3_free(pFold); - pFold = sqlite3_malloc(nByte*2); + pFold = sqlite3_malloc64((sqlite3_int64)nByte*2); if( pFold==0 ){ rc = SQLITE_NOMEM; break; @@ -256,7 +256,8 @@ static int fts5UnicodeAddExceptions( int *aNew; if( n>0 ){ - aNew = (int*)sqlite3_realloc(p->aiException, (n+p->nException)*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aiException, + (n+p->nException)*sizeof(int)); if( aNew ){ int nNew = p->nException; const unsigned char *zCsr = (const unsigned char*)z; @@ -490,7 +491,7 @@ static int fts5UnicodeTokenize( /* Grow the output buffer so that there is sufficient space to fit the ** largest possible utf-8 character. */ if( zOut>pEnd ){ - aFold = sqlite3_malloc(nFold*2); + aFold = sqlite3_malloc64((sqlite3_int64)nFold*2); if( aFold==0 ){ rc = SQLITE_NOMEM; goto tokenize_done; diff --git a/ext/fts5/fts5_unicode2.c b/ext/fts5/fts5_unicode2.c index 6811be8ce5..d3981226d1 100644 --- a/ext/fts5/fts5_unicode2.c +++ b/ext/fts5/fts5_unicode2.c @@ -774,4 +774,3 @@ void sqlite3Fts5UnicodeAscii(u8 *aArray, u8 *aAscii){ iTbl++; } } - diff --git a/ext/fts5/fts5_varint.c b/ext/fts5/fts5_varint.c index bb212ab5a8..b249e60c51 100644 --- a/ext/fts5/fts5_varint.c +++ b/ext/fts5/fts5_varint.c @@ -342,4 +342,3 @@ int sqlite3Fts5GetVarintLen(u32 iVal){ if( iVal<(1 << 28) ) return 4; return 5; } - diff --git a/ext/misc/amatch.c b/ext/misc/amatch.c index 142e354f28..7d96ed500a 100644 --- a/ext/misc/amatch.c +++ b/ext/misc/amatch.c @@ -619,7 +619,7 @@ static int amatchLoadOneRule( if( p->rDel==0 || p->rDel>rCost ) p->rDel = rCost; }else { - pRule = sqlite3_malloc( sizeof(*pRule) + nFrom + nTo ); + pRule = sqlite3_malloc64( sizeof(*pRule) + nFrom + nTo ); if( pRule==0 ){ rc = SQLITE_NOMEM; }else{ @@ -738,11 +738,11 @@ static int amatchLoadRules( ** `mno` becomes mno */ static char *amatchDequote(const char *zIn){ - int nIn; /* Size of input string, in bytes */ + sqlite3_int64 nIn; /* Size of input string, in bytes */ char *zOut; /* Output (dequoted) string */ - nIn = (int)strlen(zIn); - zOut = sqlite3_malloc(nIn+1); + nIn = strlen(zIn); + zOut = sqlite3_malloc64(nIn+1); if( zOut ){ char q = zIn[0]; /* Quote character (if any ) */ @@ -1069,7 +1069,7 @@ static void amatchAddWord( } return; } - pWord = sqlite3_malloc( sizeof(*pWord) + nBase + nTail - 1 ); + pWord = sqlite3_malloc64( sizeof(*pWord) + nBase + nTail - 1 ); if( pWord==0 ) return; memset(pWord, 0, sizeof(*pWord)); pWord->rCost = rCost; diff --git a/ext/misc/closure.c b/ext/misc/closure.c index 03f13c0c79..2f83198a76 100644 --- a/ext/misc/closure.c +++ b/ext/misc/closure.c @@ -422,11 +422,11 @@ static closure_avl *queuePull(closure_queue *pQueue){ ** `mno` becomes mno */ static char *closureDequote(const char *zIn){ - int nIn; /* Size of input string, in bytes */ + sqlite3_int64 nIn; /* Size of input string, in bytes */ char *zOut; /* Output (dequoted) string */ - nIn = (int)strlen(zIn); - zOut = sqlite3_malloc(nIn+1); + nIn = strlen(zIn); + zOut = sqlite3_malloc64(nIn+1); if( zOut ){ char q = zIn[0]; /* Quote character (if any ) */ diff --git a/ext/misc/dbdump.c b/ext/misc/dbdump.c index 0b4b4bfafa..157e646bbc 100644 --- a/ext/misc/dbdump.c +++ b/ext/misc/dbdump.c @@ -195,7 +195,7 @@ static char **tableColumnList(DState *p, const char *zTab){ if( nCol>=nAlloc-2 ){ char **azNew; nAlloc = nAlloc*2 + nCol + 10; - azNew = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); + azNew = sqlite3_realloc64(azCol, nAlloc*sizeof(azCol[0])); if( azNew==0 ) goto col_oom; azCol = azNew; azCol[0] = 0; diff --git a/ext/misc/eval.c b/ext/misc/eval.c index e90bfc0100..fd27ed6cc6 100644 --- a/ext/misc/eval.c +++ b/ext/misc/eval.c @@ -44,7 +44,7 @@ static int callback(void *pCtx, int argc, char **argv, char **colnames){ /* Using sqlite3_realloc64() would be better, but it is a recent ** addition and will cause a segfault if loaded by an older version ** of SQLite. */ - zNew = p->nAlloc<=0x7fffffff ? sqlite3_realloc(p->z, (int)p->nAlloc) : 0; + zNew = p->nAlloc<=0x7fffffff ? sqlite3_realloc64(p->z, p->nAlloc) : 0; if( zNew==0 ){ sqlite3_free(p->z); memset(p, 0, sizeof(*p)); diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index 3a4fa18f96..2219aafa0d 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -646,8 +646,8 @@ static int fsdirNext(sqlite3_vtab_cursor *cur){ FsdirLevel *pLvl; if( iNew>=pCur->nLvl ){ int nNew = iNew+1; - int nByte = nNew*sizeof(FsdirLevel); - FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc(pCur->aLvl, nByte); + sqlite3_int64 nByte = nNew*sizeof(FsdirLevel); + FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte); if( aNew==0 ) return SQLITE_NOMEM; memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl)); pCur->aLvl = aNew; @@ -727,7 +727,7 @@ static int fsdirColumn( }else if( S_ISLNK(m) ){ char aStatic[64]; char *aBuf = aStatic; - int nBuf = 64; + sqlite3_int64 nBuf = 64; int n; while( 1 ){ @@ -735,7 +735,7 @@ static int fsdirColumn( if( nzBasis = (char*)&pNew[1]; diff --git a/ext/misc/json1.c b/ext/misc/json1.c index a5b4549165..d99d360b27 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -691,7 +691,7 @@ static JSON_NOINLINE int jsonParseAddNodeExpand( assert( pParse->nNode>=pParse->nAlloc ); if( pParse->oom ) return -1; nNew = pParse->nAlloc*2 + 10; - pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew); + pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew); if( pNew==0 ){ pParse->oom = 1; return -1; @@ -965,7 +965,7 @@ static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ static int jsonParseFindParents(JsonParse *pParse){ u32 *aUp; assert( pParse->aUp==0 ); - aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode ); + aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode ); if( aUp==0 ){ pParse->oom = 1; return SQLITE_NOMEM; @@ -1027,7 +1027,7 @@ static JsonParse *jsonParseCached( pMatch->iHold = iMaxHold+1; return pMatch; } - p = sqlite3_malloc( sizeof(*p) + nJson + 1 ); + p = sqlite3_malloc64( sizeof(*p) + nJson + 1 ); if( p==0 ){ sqlite3_result_error_nomem(pCtx); return 0; diff --git a/ext/misc/memstat.c b/ext/misc/memstat.c index dcd5742fd2..800a86e7a4 100644 --- a/ext/misc/memstat.c +++ b/ext/misc/memstat.c @@ -143,7 +143,7 @@ static int memstatFindSchemas(memstat_cursor *pCur){ } while( sqlite3_step(pStmt)==SQLITE_ROW ){ char **az, *z; - az = sqlite3_realloc(pCur->azDb, sizeof(char*)*(pCur->nDb+1)); + az = sqlite3_realloc64(pCur->azDb, sizeof(char*)*(pCur->nDb+1)); if( az==0 ){ memstatClearSchema(pCur); return SQLITE_NOMEM; diff --git a/ext/misc/mmapwarm.c b/ext/misc/mmapwarm.c index 4e23638a99..970a873f56 100644 --- a/ext/misc/mmapwarm.c +++ b/ext/misc/mmapwarm.c @@ -105,4 +105,3 @@ int sqlite3_mmap_warm(sqlite3 *db, const char *zDb){ return rc; } - diff --git a/ext/misc/nextchar.c b/ext/misc/nextchar.c index 49dfd24f1f..bf44e064e0 100644 --- a/ext/misc/nextchar.c +++ b/ext/misc/nextchar.c @@ -85,7 +85,7 @@ static void nextCharAppend(nextCharContext *p, unsigned c){ if( p->nUsed+1 > p->nAlloc ){ unsigned int *aNew; int n = p->nAlloc*2 + 30; - aNew = sqlite3_realloc(p->aResult, n*sizeof(unsigned int)); + aNew = sqlite3_realloc64(p->aResult, n*sizeof(unsigned int)); if( aNew==0 ){ p->mallocFailed = 1; return; @@ -269,7 +269,7 @@ static void nextCharFunc( sqlite3_result_error_nomem(context); }else{ unsigned char *pRes; - pRes = sqlite3_malloc( c.nUsed*4 + 1 ); + pRes = sqlite3_malloc64( c.nUsed*4 + 1 ); if( pRes==0 ){ sqlite3_result_error_nomem(context); }else{ diff --git a/ext/misc/percentile.c b/ext/misc/percentile.c index a5d7e84913..a8e4981f70 100644 --- a/ext/misc/percentile.c +++ b/ext/misc/percentile.c @@ -151,7 +151,7 @@ static void percentStep(sqlite3_context *pCtx, int argc, sqlite3_value **argv){ /* Allocate and store the Y */ if( p->nUsed>=p->nAlloc ){ unsigned n = p->nAlloc*2 + 250; - double *a = sqlite3_realloc(p->a, sizeof(double)*n); + double *a = sqlite3_realloc64(p->a, sizeof(double)*n); if( a==0 ){ sqlite3_free(p->a); memset(p, 0, sizeof(*p)); diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index b4a8ab5c04..bd82aa5d10 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -225,7 +225,7 @@ static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ pToFree = 0; aStateSet[0].aState = aSpace; }else{ - pToFree = sqlite3_malloc( sizeof(ReStateNumber)*2*pRe->nState ); + pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState ); if( pToFree==0 ) return -1; aStateSet[0].aState = pToFree; } @@ -337,10 +337,10 @@ re_match_end: static int re_resize(ReCompiled *p, int N){ char *aOp; int *aArg; - aOp = sqlite3_realloc(p->aOp, N*sizeof(p->aOp[0])); + aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0])); if( aOp==0 ) return 1; p->aOp = aOp; - aArg = sqlite3_realloc(p->aArg, N*sizeof(p->aArg[0])); + aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0])); if( aArg==0 ) return 1; p->aArg = aArg; p->nAlloc = N; diff --git a/ext/misc/unionvtab.c b/ext/misc/unionvtab.c index 2d2053ce9a..736602316b 100644 --- a/ext/misc/unionvtab.c +++ b/ext/misc/unionvtab.c @@ -250,11 +250,11 @@ struct UnionCsr { ** is attempted but fails, NULL is returned and *pRc is set to ** SQLITE_NOMEM. */ -static void *unionMalloc(int *pRc, int nByte){ +static void *unionMalloc(int *pRc, sqlite3_int64 nByte){ void *pRet; assert( nByte>0 ); if( *pRc==SQLITE_OK ){ - pRet = sqlite3_malloc(nByte); + pRet = sqlite3_malloc64(nByte); if( pRet ){ memset(pRet, 0, nByte); }else{ @@ -276,7 +276,7 @@ static void *unionMalloc(int *pRc, int nByte){ static char *unionStrdup(int *pRc, const char *zIn){ char *zRet = 0; if( zIn ){ - int nByte = (int)strlen(zIn) + 1; + sqlite3_int64 nByte = strlen(zIn) + 1; zRet = unionMalloc(pRc, nByte); if( zRet ){ memcpy(zRet, zIn, nByte); @@ -939,7 +939,7 @@ static int unionConnect( /* Grow the pTab->aSrc[] array if required. */ if( nAlloc<=pTab->nSrc ){ int nNew = nAlloc ? nAlloc*2 : 8; - UnionSrc *aNew = (UnionSrc*)sqlite3_realloc( + UnionSrc *aNew = (UnionSrc*)sqlite3_realloc64( pTab->aSrc, nNew*sizeof(UnionSrc) ); if( aNew==0 ){ diff --git a/ext/misc/vfslog.c b/ext/misc/vfslog.c index b55b06fcf3..24a46a921f 100644 --- a/ext/misc/vfslog.c +++ b/ext/misc/vfslog.c @@ -276,7 +276,7 @@ static VLogLog *vlogLogOpen(const char *zFilename){ && sqlite3_strglob("-mj??????9??", zFilename+nName-12)==0 ){ return 0; /* Do not log master journal files */ } - pTemp = sqlite3_malloc( sizeof(*pLog)*2 + nName + 60 ); + pTemp = sqlite3_malloc64( sizeof(*pLog)*2 + nName + 60 ); if( pTemp==0 ) return 0; pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); sqlite3_mutex_enter(pMutex); diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index e57dc38f30..0b14917cb2 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -358,7 +358,7 @@ static int zipfileConnect( rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA); if( rc==SQLITE_OK ){ - pNew = (ZipfileTab*)sqlite3_malloc(nByte+nFile); + pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile); if( pNew==0 ) return SQLITE_NOMEM; memset(pNew, 0, nByte+nFile); pNew->db = db; @@ -806,7 +806,7 @@ static int zipfileGetEntry( } if( rc==SQLITE_OK ){ - int nAlloc; + sqlite3_int64 nAlloc; ZipfileEntry *pNew; int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]); @@ -818,7 +818,7 @@ static int zipfileGetEntry( nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]); } - pNew = (ZipfileEntry*)sqlite3_malloc(nAlloc); + pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc); if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ @@ -981,11 +981,11 @@ static int zipfileDeflate( u8 **ppOut, int *pnOut, /* Output */ char **pzErr /* OUT: Error message */ ){ - int nAlloc = (int)compressBound(nIn); + sqlite3_int64 nAlloc = compressBound(nIn); u8 *aOut; int rc = SQLITE_OK; - aOut = (u8*)sqlite3_malloc(nAlloc); + aOut = (u8*)sqlite3_malloc64(nAlloc); if( aOut==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1058,7 +1058,7 @@ static int zipfileColumn( if( pCsr->pCurrent->aData ){ aBuf = pCsr->pCurrent->aData; }else{ - aBuf = aFree = sqlite3_malloc(sz); + aBuf = aFree = sqlite3_malloc64(sz); if( aBuf==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1897,14 +1897,14 @@ struct ZipfileCtx { static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){ if( pBuf->n+nByte>pBuf->nAlloc ){ u8 *aNew; - int nNew = pBuf->n ? pBuf->n*2 : 512; + sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512; int nReq = pBuf->n + nByte; while( nNewa, nNew); + aNew = sqlite3_realloc64(pBuf->a, nNew); if( aNew==0 ) return SQLITE_NOMEM; pBuf->a = aNew; - pBuf->nAlloc = nNew; + pBuf->nAlloc = (int)nNew; } return SQLITE_OK; } @@ -2095,7 +2095,7 @@ void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ void zipfileFinal(sqlite3_context *pCtx){ ZipfileCtx *p; ZipfileEOCD eocd; - int nZip; + sqlite3_int64 nZip; u8 *aZip; p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); @@ -2108,14 +2108,14 @@ void zipfileFinal(sqlite3_context *pCtx){ eocd.iOffset = p->body.n; nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ; - aZip = (u8*)sqlite3_malloc(nZip); + aZip = (u8*)sqlite3_malloc64(nZip); if( aZip==0 ){ sqlite3_result_error_nomem(pCtx); }else{ memcpy(aZip, p->body.a, p->body.n); memcpy(&aZip[p->body.n], p->cds.a, p->cds.n); zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]); - sqlite3_result_blob(pCtx, aZip, nZip, zipfileFree); + sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree); } } diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 83d1b82ab6..c998d9506a 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -611,7 +611,7 @@ static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ */ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ RtreeNode *pNode; - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode) + pRtree->iNodeSize); if( pNode ){ memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); pNode->zData = (u8 *)&pNode[1]; @@ -704,7 +704,7 @@ static int nodeAcquire( RTREE_IS_CORRUPT(pRtree); } }else if( pRtree->iNodeSize==sqlite3_blob_bytes(pRtree->pNodeBlob) ){ - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode)+pRtree->iNodeSize); if( !pNode ){ rc = SQLITE_NOMEM; }else{ @@ -1036,7 +1036,7 @@ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ Rtree *pRtree = (Rtree *)pVTab; RtreeCursor *pCsr; - pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor)); + pCsr = (RtreeCursor *)sqlite3_malloc64(sizeof(RtreeCursor)); if( pCsr ){ memset(pCsr, 0, sizeof(RtreeCursor)); pCsr->base.pVtab = pVTab; @@ -1403,7 +1403,7 @@ static RtreeSearchPoint *rtreeEnqueue( RtreeSearchPoint *pNew; if( pCur->nPoint>=pCur->nPointAlloc ){ int nNew = pCur->nPointAlloc*2 + 8; - pNew = sqlite3_realloc(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); + pNew = sqlite3_realloc64(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); if( pNew==0 ) return 0; pCur->aPoint = pNew; pCur->nPointAlloc = nNew; @@ -1805,7 +1805,7 @@ static int rtreeFilter( */ rc = nodeAcquire(pRtree, 1, 0, &pRoot); if( rc==SQLITE_OK && argc>0 ){ - pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc); + pCsr->aConstraint = sqlite3_malloc64(sizeof(RtreeConstraint)*argc); pCsr->nConstraint = argc; if( !pCsr->aConstraint ){ rc = SQLITE_NOMEM; @@ -2376,9 +2376,9 @@ static int splitNodeStartree( int iBestSplit = 0; RtreeDValue fBestMargin = RTREE_ZERO; - int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); + sqlite3_int64 nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); - aaSorted = (int **)sqlite3_malloc(nByte); + aaSorted = (int **)sqlite3_malloc64(nByte); if( !aaSorted ){ return SQLITE_NOMEM; } @@ -2499,7 +2499,7 @@ static int SplitNode( /* Allocate an array and populate it with a copy of pCell and ** all cells from node pLeft. Then zero the original node. */ - aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); + aCell = sqlite3_malloc64((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); if( !aCell ){ rc = SQLITE_NOMEM; goto splitnode_out; @@ -2790,7 +2790,7 @@ static int Reinsert( /* Allocate the buffers used by this operation. The allocation is ** relinquished before this function returns. */ - aCell = (RtreeCell *)sqlite3_malloc(n * ( + aCell = (RtreeCell *)sqlite3_malloc64(n * ( sizeof(RtreeCell) + /* aCell array */ sizeof(int) + /* aOrder array */ sizeof(int) + /* aSpare array */ @@ -3658,7 +3658,7 @@ static int rtreeInit( /* Allocate the sqlite3_vtab structure */ nDb = (int)strlen(argv[1]); nName = (int)strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); if( !pRtree ){ return SQLITE_NOMEM; } @@ -3938,7 +3938,7 @@ static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){ int nNode = sqlite3_column_bytes(pCheck->pGetNode, 0); const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); - pRet = sqlite3_malloc(nNode); + pRet = sqlite3_malloc64(nNode); if( pRet==0 ){ pCheck->rc = SQLITE_NOMEM; }else{ @@ -4371,12 +4371,12 @@ static void rtreeMatchArgFree(void *pArg){ static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx); RtreeMatchArg *pBlob; - int nBlob; + sqlite3_int64 nBlob; int memErr = 0; nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue) + nArg*sizeof(sqlite3_value*); - pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob); + pBlob = (RtreeMatchArg *)sqlite3_malloc64(nBlob); if( !pBlob ){ sqlite3_result_error_nomem(ctx); }else{ diff --git a/ext/session/changeset.c b/ext/session/changeset.c index edb43ff8e5..72f2da41ac 100644 --- a/ext/session/changeset.c +++ b/ext/session/changeset.c @@ -42,7 +42,7 @@ static void usage(const char *argv0){ */ static void readFile(const char *zFilename, int *pSz, void **ppBuf){ FILE *f; - int sz; + sqlite3_int64 sz; void *pBuf; f = fopen(zFilename, "rb"); if( f==0 ){ @@ -50,9 +50,9 @@ static void readFile(const char *zFilename, int *pSz, void **ppBuf){ exit(1); } fseek(f, 0, SEEK_END); - sz = (int)ftell(f); + sz = ftell(f); rewind(f); - pBuf = sqlite3_malloc( sz ? sz : 1 ); + pBuf = sqlite3_malloc64( sz ? sz : 1 ); if( pBuf==0 ){ fprintf(stderr, "cannot allocate %d to hold content of \"%s\"\n", sz, zFilename); diff --git a/ext/session/changesetfuzz.c b/ext/session/changesetfuzz.c index fd887337b4..8cbca80414 100644 --- a/ext/session/changesetfuzz.c +++ b/ext/session/changesetfuzz.c @@ -141,7 +141,7 @@ static void usage(const char *argv0){ */ static void fuzzReadFile(const char *zFilename, int *pSz, void **ppBuf){ FILE *f; - int sz; + sqlite3_int64 sz; void *pBuf; f = fopen(zFilename, "rb"); if( f==0 ){ @@ -149,9 +149,9 @@ static void fuzzReadFile(const char *zFilename, int *pSz, void **ppBuf){ exit(1); } fseek(f, 0, SEEK_END); - sz = (int)ftell(f); + sz = ftell(f); rewind(f); - pBuf = sqlite3_malloc( sz ? sz : 1 ); + pBuf = sqlite3_malloc64( sz ? sz : 1 ); if( pBuf==0 ){ fprintf(stderr, "cannot allocate %d to hold content of \"%s\"\n", sz, zFilename); @@ -340,8 +340,8 @@ struct FuzzChange { /* ** Allocate and return nByte bytes of zeroed memory. */ -static void *fuzzMalloc(int nByte){ - void *pRet = sqlite3_malloc(nByte); +static void *fuzzMalloc(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); if( pRet ){ memset(pRet, 0, nByte); } @@ -631,7 +631,7 @@ static int fuzzParseChangeset( /* If the table-header was successfully parsed, add the new change-group ** to the array and parse the associated changes. */ if( rc==SQLITE_OK ){ - FuzzChangesetGroup **apNew = (FuzzChangesetGroup**)sqlite3_realloc( + FuzzChangesetGroup **apNew = (FuzzChangesetGroup**)sqlite3_realloc64( pParse->apGroup, sizeof(FuzzChangesetGroup*)*(pParse->nGroup+1) ); if( apNew==0 ){ @@ -1214,7 +1214,7 @@ int main(int argc, char **argv){ fuzzPrintGroup(&changeset, changeset.apGroup[i]); } }else{ - pBuf = (u8*)fuzzMalloc(nChangeset*2 + 1024); + pBuf = (u8*)fuzzMalloc((sqlite3_int64)nChangeset*2 + 1024); if( pBuf==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1237,4 +1237,3 @@ int main(int argc, char **argv){ return rc; } - diff --git a/ext/session/session_speed_test.c b/ext/session/session_speed_test.c index 14b97ea07b..405001c694 100644 --- a/ext/session/session_speed_test.c +++ b/ext/session/session_speed_test.c @@ -356,5 +356,3 @@ int main(int argc, char **argv){ return 0; } - - diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 18ae5e0cfd..6f722bab3c 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -363,7 +363,7 @@ static void sessionPutI64(u8 *aBuf, sqlite3_int64 i){ static int sessionSerializeValue( u8 *aBuf, /* If non-NULL, write serialized value here */ sqlite3_value *pValue, /* Value to serialize */ - int *pnWrite /* IN/OUT: Increment by bytes written */ + sqlite3_int64 *pnWrite /* IN/OUT: Increment by bytes written */ ){ int nByte; /* Size of serialized value in bytes */ @@ -904,7 +904,7 @@ static int sessionGrowHash(int bPatchset, SessionTable *pTab){ SessionChange **apNew; int nNew = (pTab->nChange ? pTab->nChange : 128) * 2; - apNew = (SessionChange **)sqlite3_malloc(sizeof(SessionChange *) * nNew); + apNew = (SessionChange **)sqlite3_malloc64(sizeof(SessionChange *) * nNew); if( apNew==0 ){ if( pTab->nChange==0 ){ return SQLITE_ERROR; @@ -970,7 +970,7 @@ static int sessionTableInfo( char *zPragma; sqlite3_stmt *pStmt; int rc; - int nByte; + sqlite3_int64 nByte; int nDbCol = 0; int nThis; int i; @@ -1013,7 +1013,7 @@ static int sessionTableInfo( if( rc==SQLITE_OK ){ nByte += nDbCol * (sizeof(const char *) + sizeof(u8) + 1); - pAlloc = sqlite3_malloc(nByte); + pAlloc = sqlite3_malloc64(nByte); if( pAlloc==0 ){ rc = SQLITE_NOMEM; } @@ -1211,7 +1211,7 @@ static void sessionPreupdateOneChange( ** this is an SQLITE_UPDATE or SQLITE_DELETE), or just the PK ** values (if this is an INSERT). */ SessionChange *pChange; /* New change object */ - int nByte; /* Number of bytes to allocate */ + sqlite3_int64 nByte; /* Number of bytes to allocate */ int i; /* Used to iterate through columns */ assert( rc==SQLITE_OK ); @@ -1236,7 +1236,7 @@ static void sessionPreupdateOneChange( } /* Allocate the change object */ - pChange = (SessionChange *)sqlite3_malloc(nByte); + pChange = (SessionChange *)sqlite3_malloc64(nByte); if( !pChange ){ rc = SQLITE_NOMEM; goto error_out; @@ -1680,7 +1680,7 @@ int sqlite3session_create( *ppSession = 0; /* Allocate and populate the new session object. */ - pNew = (sqlite3_session *)sqlite3_malloc(sizeof(sqlite3_session) + nDb + 1); + pNew = (sqlite3_session *)sqlite3_malloc64(sizeof(sqlite3_session) + nDb + 1); if( !pNew ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(sqlite3_session)); pNew->db = db; @@ -1799,7 +1799,7 @@ int sqlite3session_attach( if( !pTab ){ /* Allocate new SessionTable object. */ - pTab = (SessionTable *)sqlite3_malloc(sizeof(SessionTable) + nName + 1); + pTab = (SessionTable *)sqlite3_malloc64(sizeof(SessionTable) + nName + 1); if( !pTab ){ rc = SQLITE_NOMEM; }else{ @@ -1859,7 +1859,7 @@ static int sessionBufferGrow(SessionBuffer *p, int nByte, int *pRc){ static void sessionAppendValue(SessionBuffer *p, sqlite3_value *pVal, int *pRc){ int rc = *pRc; if( rc==SQLITE_OK ){ - int nByte = 0; + sqlite3_int64 nByte = 0; rc = sessionSerializeValue(0, pVal, &nByte); sessionBufferGrow(p, nByte, &rc); if( rc==SQLITE_OK ){ @@ -2735,7 +2735,7 @@ static int sessionValueSetStr( ** argument to sqlite3ValueSetStr() and have the copy created ** automatically. But doing so makes it difficult to detect any OOM ** error. Hence the code to create the copy externally. */ - u8 *aCopy = sqlite3_malloc(nData+1); + u8 *aCopy = sqlite3_malloc64((sqlite3_int64)nData+1); if( aCopy==0 ) return SQLITE_NOMEM; memcpy(aCopy, aData, nData); sqlite3ValueSetStr(pVal, nData, (char*)aCopy, enc, sqlite3_free); @@ -3348,7 +3348,7 @@ static int sessionChangesetInvert( int iCol; if( 0==apVal ){ - apVal = (sqlite3_value **)sqlite3_malloc(sizeof(apVal[0])*nCol*2); + apVal = (sqlite3_value **)sqlite3_malloc64(sizeof(apVal[0])*nCol*2); if( 0==apVal ){ rc = SQLITE_NOMEM; goto finished_invert; @@ -4621,7 +4621,7 @@ static int sessionChangeMerge( int rc = SQLITE_OK; if( !pExist ){ - pNew = (SessionChange *)sqlite3_malloc(sizeof(SessionChange) + nRec); + pNew = (SessionChange *)sqlite3_malloc64(sizeof(SessionChange) + nRec); if( !pNew ){ return SQLITE_NOMEM; } @@ -4654,8 +4654,8 @@ static int sessionChangeMerge( if( pExist->op==SQLITE_DELETE && pExist->bIndirect ){ *ppNew = pExist; }else{ - int nByte = nRec + pExist->nRecord + sizeof(SessionChange); - pNew = (SessionChange*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = nRec + pExist->nRecord + sizeof(SessionChange); + pNew = (SessionChange*)sqlite3_malloc64(nByte); if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ @@ -4715,14 +4715,14 @@ static int sessionChangeMerge( assert( pNew==0 ); }else{ u8 *aExist = pExist->aRecord; - int nByte; + sqlite3_int64 nByte; u8 *aCsr; /* Allocate a new SessionChange object. Ensure that the aRecord[] ** buffer of the new object is large enough to hold any record that ** may be generated by combining the input records. */ nByte = sizeof(SessionChange) + pExist->nRecord + nRec; - pNew = (SessionChange *)sqlite3_malloc(nByte); + pNew = (SessionChange *)sqlite3_malloc64(nByte); if( !pNew ){ sqlite3_free(pExist); return SQLITE_NOMEM; @@ -4828,7 +4828,7 @@ static int sessionChangesetToHash( if( !pTab ){ SessionTable **ppTab; - pTab = sqlite3_malloc(sizeof(SessionTable) + nCol + nNew+1); + pTab = sqlite3_malloc64(sizeof(SessionTable) + nCol + nNew+1); if( !pTab ){ rc = SQLITE_NOMEM; break; diff --git a/manifest b/manifest index 8935452168..6160f40a14 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprovement\son\sthe\sinstr()\sfunction,\sespecially\sfor\slarge\nhaystacks. -D 2019-01-08T15:18:24.588 +C Use\s64-bit\smath\sto\scompute\sthe\ssizes\sof\smemory\sallocations\sin\sextensions. +D 2019-01-08T20:02:48.571 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -80,23 +80,23 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 6cf87a0f51e67a0479d293a5f5b9d06568ae00da39fe8c4dcf9e8a061e353ff4 +F ext/fts3/fts3.c 4636bd255f1eb1f462f79d77da685e879161bb18605181342dc8675cc69f217c F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 3378157f383540857a466420b8279626204434c3eb0dc948ad9bcd3991fc41f5 -F ext/fts3/fts3_aux.c e9b465f8469acc2cd700a90c0242912a3202e4e4e15df72d7db7f1e3a2222c85 -F ext/fts3/fts3_expr.c 3b1dbceddd8622599f3cc2626897667fe40487aaa1676707d6c37ec5a8422fc1 -F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60 +F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b +F ext/fts3/fts3_expr.c 677055b511a8bee2ae818b32f3f7fc8601411522acd5c6a734489049ec9fe529 +F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf -F ext/fts3/fts3_icu.c deb46f7020d87ea7a14a433fb7a7f4bef42a9652 +F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 68ae118b0f834ea53d2b89e4087fc0f0b8c4ee4e -F ext/fts3/fts3_term.c 9b8065cc70ad514fcc25a7b099ddab8b5333f724dedd57184b7e79238e2b2a39 +F ext/fts3/fts3_snippet.c 3c4654a57f12d05b7249103633dffc77bcf29fe995c72a272b279561732974b1 +F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c 79f2a7fbb3f672fa032e5a432ca274ea3ee93c34 -F ext/fts3/fts3_tokenize_vtab.c a47c2a33de6db00816704315ac0a9afdfa1c71fa5b99f79171c0f7b30861f784 +F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 F ext/fts3/fts3_tokenizer.c a22bf311a71f3efa9d7012d8cc48fc9b0f3dace7 F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 -F ext/fts3/fts3_unicode.c b1902e9ad47a6569fbb8ecb5ce52f20fe59b590d5c5e3bbdd56b10b03bdf632b +F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f F ext/fts3/fts3_write.c e36d2f7e8f180e8030e92a5c2d09ccf87021afedcc5148a9d823b496667bf2f2 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 @@ -109,21 +109,21 @@ F ext/fts3/unicode/mkunicode.tcl 49499f7964504438e2b04cca0627827945bb2499154e2d3 F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 4f5d19b7973dae23de368728f06d3eb1fe9f5cca2990366b40e9379996f35e61 -F ext/fts5/fts5Int.h 8590e08a485c98a7e3075ed72abe3452fe944a9e58e63dfa51b732cced344cab -F ext/fts5/fts5_aux.c ca666a3bbe07c5a3bbe9fffaea19c935a1efaf337333e28bad7bdd1971ffd093 -F ext/fts5/fts5_buffer.c 9567442b5dcb15ec1504e071ff052f35d533129af5fa6e97a163e2e466a18a4d -F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 -F ext/fts5/fts5_expr.c 0eff5bad90838be83c5cc16837ca215a961abe05cfbf741a285ba62a79ad586f -F ext/fts5/fts5_hash.c ad22ab3d89828cf3d996f784b7a6452ee16a940aa46abe466a1f14aa3d42bbf2 -F ext/fts5/fts5_index.c 7788ae02cdb18c551dcd99c383c9f30dcc35a1a7264c2420d24254a177a19a1b -F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 -F ext/fts5/fts5_storage.c 0455c866b6c6a347229edee66333f5c08ea5f3b4940121d698c300353a73962f +F ext/fts5/fts5Int.h 545ae89fcaf0071f721eaa2a494bf0edb68d589d052cd7a611b3f1645329ceed +F ext/fts5/fts5_aux.c 859b63b2482223c7259de3913b3d3cf1af16636bd2ae2b8292ee8a98a90cfdb9 +F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81ef59da7a59 +F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 +F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 +F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 +F ext/fts5/fts5_index.c 8e734f8592ce933cf4189f9818287406d392346576f8f9c2722beb79f2cd826e +F ext/fts5/fts5_main.c 90062ccfc54031ff97660e277d868ec080c5b46e42d784856385b12645e60ed6 +F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 -F ext/fts5/fts5_test_mi.c 65864ba1e5c34a61d409c4c587e0bbe0466eb4f8f478d85dc42a92caad1338e6 -F ext/fts5/fts5_test_tok.c 6a5574354ce61a98737e150fd4f7a002000db0cb4bcd655dc8694cb3e035381d -F ext/fts5/fts5_tokenize.c 8b7ef00cf0483740977cc6cf0fd878e6e325d36fd02f2b31959810917347b73d -F ext/fts5/fts5_unicode2.c 16e127cbc95b4a6fca05b6ea7e2a02e5700d4a215e5220b9a33d5c7cee793e87 -F ext/fts5/fts5_varint.c a5aceacda04dafcbae725413d7a16818ecd65738 +F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee +F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 +F ext/fts5/fts5_tokenize.c 4d904c237707de8fbb8ab98d24d5c55d47204a3f1f35895d8a53a5327079b32c +F ext/fts5/fts5_unicode2.c d8a1528c9a19f79b843c486e5e64bff17d667791ae7f658e11131ebac4b33c59 +F ext/fts5/fts5_varint.c 19ca7c5cf3f36017f44e5bb790f01b111f37791c8a1a49a17711f2b666a629f1 F ext/fts5/fts5_vocab.c fbe38044889b2d2d99babeeef239c620fb0332bb928a84506ac748d81500b354 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba @@ -273,29 +273,29 @@ F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1ded F ext/lsm1/test/lsm1_simple.test ca949efefa102f4644231dcd9291d8cda7699a4ce1006b26e0e3fcb72233f422 F ext/lsm1/tool/mklsm1c.tcl f31561bbee5349f0a554d1ad7236ac1991fc09176626f529f6078e07335398b0 F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f238c240 -F ext/misc/amatch.c c0a6a807a553eaa220bf69fca0353cd1587a3bfb3d2224fa425e3e6efcacc98a +F ext/misc/amatch.c cc9835931fbe46f9c6b8dbb51779c16f169bee50ae372a20532ff5154ebaf5b1 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 F ext/misc/btreeinfo.c 4f0ebf278f46e68e6306c667917766cebc5550fd35d5de17847988e22892d4d2 F ext/misc/carray.c ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c6005 -F ext/misc/closure.c 9f8fa11aa6c6e2f6d7296ffa88f103df4b46abd9602bcab3ea2f8fc24f334f63 +F ext/misc/closure.c 037d055c5a4880d41607a3ea44037f655b5e8ac1bdce305ec497903fd2646960 F ext/misc/completion.c cec672d40604075bb341a7f11ac48393efdcd90a979269b8fe7977ea62d0547f F ext/misc/compress.c dd4f8a6d0baccff3c694757db5b430f3bbd821d8686d1fc24df55cf9f035b189 F ext/misc/csv.c 7f047aeb68f5802e7ce6639292095d622a488bb43526ed04810e0649faa71ceb -F ext/misc/dbdump.c 12389a10c410fadf1e68eeb382def92d5a7fa9ce7cce4fb86a736fa2bac1000a -F ext/misc/eval.c 6ea9b22a5fa0dd973b67ca4e53555be177bc0b7b263aadf1024429457c82c0e3 +F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 +F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c e3153b04433897a18a3d17185845f286892e96fdf87f4301290d09c36ae1759f -F ext/misc/fuzzer.c 7c64b8197bb77b7d64eff7cac7848870235d4c25 +F ext/misc/fileio.c 03ba86d5b3d5c88977a63907de2941ea7723f1930f5f547056f0aff1bf228a25 +F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c 3f017d2659e531d021d015ec5d69ea0b1c71f2e15bf9768b1e149fcdf6c3e0b1 -F ext/misc/memstat.c 941928c6104d8ed569a6c47caa756dc78b8091f7a15f87d3004f3b1e576b10da +F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 +F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 -F ext/misc/mmapwarm.c 70b618f2d0bde43fae288ad0b7498a629f2b6f61b50a27e06fae3cd23c83af29 -F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 +F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 +F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c -F ext/misc/percentile.c 92699c8cd7d517ff610e6037e56506f8904dae2e -F ext/misc/regexp.c a68d25c659bd2d893cd1215667bbf75ecb9dc7d4 +F ext/misc/percentile.c a6a1594c104da2d0ceab38fe609eb2f65529272377827f6f8a2b5c9fa6119e7e +F ext/misc/regexp.c 79345bf03496155a640ee0300d3307296761cebb5e115b4e342cc2fb5861ec10 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 540a169cb0d74f15522a8930b0cccdcb37a4fd071d219a5a083a319fc6e8db77 F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad @@ -308,13 +308,13 @@ F ext/misc/sqlar.c 57d5bc45cd5492208e451f697404be88f8612527d64c9d42f96b325b64983 F ext/misc/stmt.c 8a8dc4675042e4551e4afe99b8d0cc7a4a2fc1a8dacc0a9ce1b1bbff145da93d F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 -F ext/misc/unionvtab.c acf947858054850db2d4a611bfeae072cdc6d9f517b46a993fe1f2f1ea20031e -F ext/misc/vfslog.c fe40fab5c077a40477f7e5eba994309ecac6cc95 +F ext/misc/unionvtab.c 34ee634d09670909563dbde59c5bfb2ac048b27051f65f1aeac918b061d646d8 +F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 F ext/misc/vfsstat.c bf10ef0bc51e1ad6756629e1edb142f7a8db1178 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c 1d731db326c40e11fc608f38132acff31619946c000e85ab8efe75bbedc2a441 +F ext/misc/zipfile.c c1ca8f52330b4564207036b978edac8141c737bf612659bf6f7bee3ddd563a03 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -366,7 +366,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 603ec9b72cd70cf18541339b6c7d47f304ac0d84c50294be6c6c6ae35acdb0a6 -F ext/rtree/rtree.c 1fb8a71a2fe3d385256c976faa92f0451eca9f6760dc7ef5962826e61fa3694f +F ext/rtree/rtree.c 1e0fd7e850cadcfdf83cf6b59077c8a9ecfb79ad6af930b74edf88b456154ab2 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 309afc04d4287542b2cd74f933296832cc681c7b014d9405cb329b62053a5349 F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 @@ -396,8 +396,8 @@ F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 -F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a -F ext/session/changesetfuzz.c 255826ee367781ec4c29a36c7c63e9ee6387dc03a8346cf240feb8d597958b0e +F ext/session/changeset.c d046906a0c9a37862fcd5dbfda5eb08dea361b9abdd959b34358a63fa246164f +F ext/session/changesetfuzz.c 01023c41cfb02e191d144ea8bfdc46443393b62d13873f5fa044fc9886e60142 F ext/session/changesetfuzz1.test 2e1b90d888fbf0eea5e1bd2f1e527a48cc85f8e0ff75df1ec4e320b21f580b3a F ext/session/session1.test 0b2f88995832ea040ae8e83a1ad4afa99c00b85c779d213da73a95ea4113233e F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 @@ -416,7 +416,7 @@ F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6d F ext/session/sessionG.test 3828b944cd1285f4379340fd36f8b64c464fc84df6ff3ccbc95578fd87140b9c F ext/session/sessionH.test a417559f29a7e775950fc5fc82b3d01256a7cbe793ddf1180df234df823d56e2 F ext/session/session_common.tcl 29ec9910aca1e996ca1c8531b8cecabf96eb576aa53de65a8ff03d848b9a2a8b -F ext/session/session_speed_test.c edc1f96fd5e0e4b16eb03e2a73041013d59e8723 +F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 @@ -425,7 +425,7 @@ F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b295 F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d -F ext/session/sqlite3session.c f88c4bd0404da56246b08f5d584462f8979ba6aedf8c30762b553f7ae91f51cf +F ext/session/sqlite3session.c 4c79daf65e89c78dd62fd97a1b2eac3e53be700b29914101453a0d951f7ba9c8 F ext/session/sqlite3session.h 54d6356f5769d3695e5f63d719c6ee27671b2614973a2b675a3ff4d30d574233 F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 @@ -1797,7 +1797,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 63eb803dbc27077007dbee8def659d1523724eb73f1def1cdb68027e5c20843a -R 174e6d1a2fb646acc0dac426835bced6 +P ce51f1a2b6a1789a5876e01cf829e45d84f3851d135a2fa5c44a56f948673a60 +R 938a88bb1780a4f9536e35effec3bbb8 U drh -Z 637ee479b8367750ae4cc1eec21d49de +Z afd7af7f7b88ef891b9e1f98a487b805 diff --git a/manifest.uuid b/manifest.uuid index f89171316d..45a30bc40c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ce51f1a2b6a1789a5876e01cf829e45d84f3851d135a2fa5c44a56f948673a60 \ No newline at end of file +ca67f2ec0e294384c397db438605df1b47aae5f348a8de94f97286997625d169 \ No newline at end of file From 885eeb676b5bf2b6cda8d3449f4eb268fac11ca5 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 9 Jan 2019 02:02:24 +0000 Subject: [PATCH 023/306] Enhance the ALTER TABLE RENAME COLUMN feature so that it works on tables that have redundant UNIQUE and/or PRIMARY KEY constraints. Fix for ticket [bc8d94f0fbd633fd9a051e3] FossilOrigin-Name: f09aa3248e2b4a32ff5b5d37084cb2a27445322cb06a3354cef723f4f0b2cd34 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/alter.c | 10 ++++++++-- src/build.c | 5 +++++ src/sqliteInt.h | 4 +++- test/altercol.test | 26 ++++++++++++++++++++++++++ 6 files changed, 52 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 6160f40a14..d8002eef9c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\s64-bit\smath\sto\scompute\sthe\ssizes\sof\smemory\sallocations\sin\sextensions. -D 2019-01-08T20:02:48.571 +C Enhance\sthe\sALTER\sTABLE\sRENAME\sCOLUMN\sfeature\sso\sthat\sit\sworks\son\stables\nthat\shave\sredundant\sUNIQUE\sand/or\sPRIMARY\sKEY\sconstraints.\nFix\sfor\sticket\s[bc8d94f0fbd633fd9a051e3] +D 2019-01-09T02:02:24.819 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -446,7 +446,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 082286f89160ca2302d51650e173b745ef78c42b6a7ebc3262d9cb166596c7ca +F src/alter.c 9dda6a9cb20634fc4f65101a57ec43692f729164fa60dc1b0c78d344184a8431 F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df @@ -456,7 +456,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 9632272d3c41c7dab61bd96ae419ee5786b7b49cb14dc75a5550b20758c08893 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 -F src/build.c 5ca38181e826bcc35e0176c31a691d897ed0cc708fc935fd51e8023705cdcf1a +F src/build.c 2a1b80dbe783649d4cc59e33e08fc7e563f15e05ec0f6365c441d45e16bcd481 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -517,7 +517,7 @@ F src/shell.c.in 0722a9e3a1b23674f07c194b8f71c953c775bad280e7f179a32bf72cd009b56 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 488f9b86c15d09d42af921e4e2383dac289aa541a59daf78822bfcd656b59ff9 +F src/sqliteInt.h 57f7bfa8a64e6f37e256ab4137e22cd74b9cde1e8669d44bba46c13105b4d27e F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -615,7 +615,7 @@ F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3 F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400433 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 -F test/altercol.test 313ed080ed61691c52cd87053129889f71582d6d0efebdd5f3edad2a98c66874 +F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1a31ad F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b @@ -1797,7 +1797,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 ce51f1a2b6a1789a5876e01cf829e45d84f3851d135a2fa5c44a56f948673a60 -R 938a88bb1780a4f9536e35effec3bbb8 +P ca67f2ec0e294384c397db438605df1b47aae5f348a8de94f97286997625d169 +R af2c1cedc8f3f69cab4d85bf53ec7003 U drh -Z afd7af7f7b88ef891b9e1f98a487b805 +Z 39f916b96ea6a4b0b2d0a87edcd02ba6 diff --git a/manifest.uuid b/manifest.uuid index 45a30bc40c..c64e6eee02 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ca67f2ec0e294384c397db438605df1b47aae5f348a8de94f97286997625d169 \ No newline at end of file +f09aa3248e2b4a32ff5b5d37084cb2a27445322cb06a3354cef723f4f0b2cd34 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index e0cae968b6..a47e18daf1 100644 --- a/src/alter.c +++ b/src/alter.c @@ -961,7 +961,6 @@ static int renameParseSql( rc = sqlite3RunParser(p, zSql, &zErr); assert( p->zErrMsg==0 ); assert( rc!=SQLITE_OK || zErr==0 ); - assert( (0!=p->pNewTable) + (0!=p->pNewIndex) + (0!=p->pNewTrigger)<2 ); p->zErrMsg = zErr; if( db->mallocFailed ) rc = SQLITE_NOMEM; if( rc==SQLITE_OK @@ -1181,11 +1180,15 @@ static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ */ static void renameParseCleanup(Parse *pParse){ sqlite3 *db = pParse->db; + Index *pIdx; if( pParse->pVdbe ){ sqlite3VdbeFinalize(pParse->pVdbe); } sqlite3DeleteTable(db, pParse->pNewTable); - if( pParse->pNewIndex ) sqlite3FreeIndex(db, pParse->pNewIndex); + while( (pIdx = pParse->pNewIndex)!=0 ){ + pParse->pNewIndex = pIdx->pNext; + sqlite3FreeIndex(db, pIdx); + } sqlite3DeleteTrigger(db, pParse->pNewTrigger); sqlite3DbFree(db, pParse->zErrMsg); renameTokenFree(db, pParse->pRename); @@ -1296,6 +1299,9 @@ static void renameColumnFunc( for(pIdx=sParse.pNewTable->pIndex; pIdx; pIdx=pIdx->pNext){ sqlite3WalkExprList(&sWalker, pIdx->aColExpr); } + for(pIdx=sParse.pNewIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3WalkExprList(&sWalker, pIdx->aColExpr); + } } for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){ diff --git a/src/build.c b/src/build.c index ab90e12d24..68e708129e 100644 --- a/src/build.c +++ b/src/build.c @@ -3467,6 +3467,11 @@ void sqlite3CreateIndex( } } if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; + if( IN_RENAME_OBJECT ){ + pIndex->pNext = pParse->pNewIndex; + pParse->pNewIndex = pIndex; + pIndex = 0; + } goto exit_create_index; } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 17c93285b8..9bc8160db9 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3134,7 +3134,9 @@ struct Parse { Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ const char *zTail; /* All SQL text past the last semicolon parsed */ Table *pNewTable; /* A table being constructed by CREATE TABLE */ - Index *pNewIndex; /* An index being constructed by CREATE INDEX */ + Index *pNewIndex; /* An index being constructed by CREATE INDEX. + ** Also used to hold redundant UNIQUE constraints + ** during a RENAME COLUMN */ Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ #ifndef SQLITE_OMIT_VIRTUALTABLE diff --git a/test/altercol.test b/test/altercol.test index 6810aabf4e..d71a9b06e4 100644 --- a/test/altercol.test +++ b/test/altercol.test @@ -778,6 +778,32 @@ do_execsql_test 19.1 { {CREATE VIEW v2(e) AS SELECT coalesce(t2.c,t1.f) FROM t1, t2 WHERE t1.b=t2.d} } +# 2019-01-08: https://www.sqlite.org/src/tktview/bc8d94f0fbd633fd9a051e3 +# +# ALTER TABLE RENAME COLUMN does not work for tables that have redundant +# UNIQUE constraints. +# +sqlite3 db :memory: +do_execsql_test 20.100 { + CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA)); + ALTER TABLE t1 RENAME aaa TO bbb; + SELECT sql FROM sqlite_master WHERE name='t1'; +} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))}} +do_execsql_test 20.105 { + DROP TABLE t1; + CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA))WITHOUT ROWID; + ALTER TABLE t1 RENAME aaa TO bbb; + SELECT sql FROM sqlite_master WHERE name='t1'; +} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))WITHOUT ROWID}} +do_execsql_test 20.110 { + DROP TABLE t1; + CREATE TABLE t1(aa UNIQUE,bb UNIQUE,cc UNIQUE,UNIQUE(aA),PRIMARY KEY(bB),UNIQUE(cC)); + ALTER TABLE t1 RENAME aa TO xx; + ALTER TABLE t1 RENAME bb TO yy; + ALTER TABLE t1 RENAME cc TO zz; + SELECT sql FROM sqlite_master WHERE name='t1'; +} {{CREATE TABLE t1(xx UNIQUE,yy UNIQUE,zz UNIQUE,UNIQUE(xx),PRIMARY KEY(yy),UNIQUE(zz))}} + finish_test From 3e08ba4521c29df5c8b64692548ecdbe33ebf888 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 9 Jan 2019 11:06:03 +0000 Subject: [PATCH 024/306] Small simplification to the dbstat virtual table. FossilOrigin-Name: 9d4c156fa26f80bb8f88b6ad8f24520a15af296de9c110604f6bd42c257455a0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/dbstat.c | 6 ++---- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index d8002eef9c..b1e25001ac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sALTER\sTABLE\sRENAME\sCOLUMN\sfeature\sso\sthat\sit\sworks\son\stables\nthat\shave\sredundant\sUNIQUE\sand/or\sPRIMARY\sKEY\sconstraints.\nFix\sfor\sticket\s[bc8d94f0fbd633fd9a051e3] -D 2019-01-09T02:02:24.819 +C Small\ssimplification\sto\sthe\sdbstat\svirtual\stable. +D 2019-01-09T11:06:03.627 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -462,7 +462,7 @@ F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 -F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9 +F src/dbstat.c 71f0bb9c38eac48812ed32cf926a6a41bf5d7f285740a2dcf5c3cbb67fbc2f1b F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab F src/expr.c 9ad9c40a83c4218d79de19153b7a8ba7810564a123af7e09281927990bea2964 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 @@ -1797,7 +1797,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 ca67f2ec0e294384c397db438605df1b47aae5f348a8de94f97286997625d169 -R af2c1cedc8f3f69cab4d85bf53ec7003 +P f09aa3248e2b4a32ff5b5d37084cb2a27445322cb06a3354cef723f4f0b2cd34 +R 904b5dbe2cf1d3f367b8019199e2bad4 U drh -Z 39f916b96ea6a4b0b2d0a87edcd02ba6 +Z 7d313c98edbc8f55ad96808211d5313e diff --git a/manifest.uuid b/manifest.uuid index c64e6eee02..2822ebe46a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f09aa3248e2b4a32ff5b5d37084cb2a27445322cb06a3354cef723f4f0b2cd34 \ No newline at end of file +9d4c156fa26f80bb8f88b6ad8f24520a15af296de9c110604f6bd42c257455a0 \ No newline at end of file diff --git a/src/dbstat.c b/src/dbstat.c index a6e521bee0..c9a8bb3e2f 100644 --- a/src/dbstat.c +++ b/src/dbstat.c @@ -602,7 +602,6 @@ static int statFilter( StatTable *pTab = (StatTable*)(pCursor->pVtab); char *zSql; int rc = SQLITE_OK; - char *zMaster; if( idxNum==1 ){ const char *zDbase = (const char*)sqlite3_value_text(argv[0]); @@ -618,13 +617,12 @@ static int statFilter( statResetCsr(pCsr); sqlite3_finalize(pCsr->pStmt); pCsr->pStmt = 0; - zMaster = pCsr->iDb==1 ? "sqlite_temp_master" : "sqlite_master"; zSql = sqlite3_mprintf( "SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type" " UNION ALL " "SELECT name, rootpage, type" - " FROM \"%w\".%s WHERE rootpage!=0" - " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName, zMaster); + " FROM \"%w\".sqlite_master WHERE rootpage!=0" + " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName); if( zSql==0 ){ return SQLITE_NOMEM_BKPT; }else{ From 8eaf565febd3c1cce858b723859bf2aaff950643 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 9 Jan 2019 11:19:41 +0000 Subject: [PATCH 025/306] Improved database corruption detection in the dbstat virtual table. FossilOrigin-Name: fc5ecc88f8a0855ba90039177ee284721b2035e4de56a1024e323216f011f0af --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/dbstat.c | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b1e25001ac..b54c3baa5b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\ssimplification\sto\sthe\sdbstat\svirtual\stable. -D 2019-01-09T11:06:03.627 +C Improved\sdatabase\scorruption\sdetection\sin\sthe\sdbstat\svirtual\stable. +D 2019-01-09T11:19:41.490 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -462,7 +462,7 @@ F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 -F src/dbstat.c 71f0bb9c38eac48812ed32cf926a6a41bf5d7f285740a2dcf5c3cbb67fbc2f1b +F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab F src/expr.c 9ad9c40a83c4218d79de19153b7a8ba7810564a123af7e09281927990bea2964 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 @@ -1797,7 +1797,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 f09aa3248e2b4a32ff5b5d37084cb2a27445322cb06a3354cef723f4f0b2cd34 -R 904b5dbe2cf1d3f367b8019199e2bad4 +P 9d4c156fa26f80bb8f88b6ad8f24520a15af296de9c110604f6bd42c257455a0 +R 08f271c3d2a22f68d05d7a10015b5079 U drh -Z 7d313c98edbc8f55ad96808211d5313e +Z 03110852217ebc64011b15a7274dc701 diff --git a/manifest.uuid b/manifest.uuid index 2822ebe46a..5bb62bdd14 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9d4c156fa26f80bb8f88b6ad8f24520a15af296de9c110604f6bd42c257455a0 \ No newline at end of file +fc5ecc88f8a0855ba90039177ee284721b2035e4de56a1024e323216f011f0af \ No newline at end of file diff --git a/src/dbstat.c b/src/dbstat.c index c9a8bb3e2f..9b72fb147c 100644 --- a/src/dbstat.c +++ b/src/dbstat.c @@ -531,6 +531,10 @@ statNextRestart: goto statNextRestart; /* Tail recursion */ } pCsr->iPage++; + if( pCsr->iPage>=ArraySize(pCsr->aPage) ){ + statResetCsr(pCsr); + return SQLITE_CORRUPT_BKPT; + } assert( p==&pCsr->aPage[pCsr->iPage-1] ); if( p->iCell==p->nCell ){ From 1757fed87f0705c8df065e5d697e989acd295a29 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 9 Jan 2019 14:49:58 +0000 Subject: [PATCH 026/306] Adjustments to the page cache to try to avoid harmless TSAN warnings. FossilOrigin-Name: 383437be276719ac1c72688ae81017c63907ac561f2ffb8e42c43b012248f294 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pcache1.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b54c3baa5b..231a6b52c0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdatabase\scorruption\sdetection\sin\sthe\sdbstat\svirtual\stable. -D 2019-01-09T11:19:41.490 +C Adjustments\sto\sthe\spage\scache\sto\stry\sto\savoid\sharmless\sTSAN\swarnings. +D 2019-01-09T14:49:58.180 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -504,7 +504,7 @@ F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y a3c0db595bc642c6ee1d72869842f7f5b0b6ebeb91c21d0a7cba631d27e7afbd F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c ddc9fc7d9861cf3a1f30660264b76b1ae9e1dce5dbba085cf001d5cb6b41cf8c +F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c 20811b404b6d302a1bedd4b8af8aab2794c5e87ba1f5cb6b42dbc3266ad9c603 F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 F src/prepare.c 18f1d2801ffb48b83fddf83375389886c788e98fdfb87eabe988cf53893602c7 @@ -1797,7 +1797,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 9d4c156fa26f80bb8f88b6ad8f24520a15af296de9c110604f6bd42c257455a0 -R 08f271c3d2a22f68d05d7a10015b5079 +P fc5ecc88f8a0855ba90039177ee284721b2035e4de56a1024e323216f011f0af +R 6ed50b6875990a4b9a765f1f68bf10cd U drh -Z 03110852217ebc64011b15a7274dc701 +Z 1ecb4b75bf2b55e36bc746d9d8508d17 diff --git a/manifest.uuid b/manifest.uuid index 5bb62bdd14..5e612f6fff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fc5ecc88f8a0855ba90039177ee284721b2035e4de56a1024e323216f011f0af \ No newline at end of file +383437be276719ac1c72688ae81017c63907ac561f2ffb8e42c43b012248f294 \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index 13903216f6..72e81bb2b2 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -168,6 +168,7 @@ struct PCache1 { unsigned int nMax; /* Configured "cache_size" value */ unsigned int n90pct; /* nMax*9/10 */ unsigned int iMaxKey; /* Largest key seen since xTruncate() */ + unsigned int nPurgeableDummy; /* pnPurgeable points here when not used*/ /* Hash table of all pages. The following variables may only be accessed ** when the accessor is holding the PGroup mutex. @@ -785,8 +786,7 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; pCache->pnPurgeable = &pGroup->nPurgeable; }else{ - static unsigned int dummyCurrentPage; - pCache->pnPurgeable = &dummyCurrentPage; + pCache->pnPurgeable = &pCache->nPurgeableDummy; } pcache1LeaveMutex(pGroup); if( pCache->nHash==0 ){ From a47e45f734d793d82421c383bfa90547436989f6 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 9 Jan 2019 21:12:23 +0000 Subject: [PATCH 027/306] Fix an out-of-bounds read in SQL function fts5_decode() that could occur if it was passed a corrupt record. FossilOrigin-Name: 931278b257b12ac14fc8fbc82c6dc88ce4ac4b8e0d668543e68f0289d825daa1 --- ext/fts5/fts5_index.c | 6 +- ext/fts5/test/fts5corrupt3.test | 155 ++++++++++++++++++++++++++++++++ manifest | 16 ++-- manifest.uuid | 2 +- 4 files changed, 169 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 268af5e13c..90dc0a5a9e 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -6409,7 +6409,7 @@ static void fts5DecodeFunction( nDoclist = (iTermOff ? iTermOff : szLeaf) - iOff; fts5DecodeDoclist(&rc, &s, &a[iOff], nDoclist); - while( iPgidxOffterm.n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } term.n = nByte; } iOff += fts5GetVarint32(&a[iOff], nByte); diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 689b072fe3..fd9d14b1ed 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -23,6 +23,7 @@ ifcapable !fts5 { return } sqlite3_fts5_may_be_corrupt 1 +database_may_be_corrupt proc create_t1 {} { expr srand(0) @@ -3012,6 +3013,160 @@ do_catchsql_test 27.1 { DELETE FROM t1 WHERE a MATCH 'fts*'; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 28.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-e2d47e0624a42c.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 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 20 ....c.....g.... +| 4048: 10 16 80 10 60 10 20 30 10 16 90 10 60 10 20 40 ....`. 0....`. @ +| 4064: 40 60 60 60 80 80 70 10 30 01 40 30 90 00 90 00 @```..p.0.@0.... +| 4080: 00 01 12 40 00 00 00 00 10 10 10 00 10 10 10 10 ...@............ +| page 3 offset 8192 +| 0: a0 00 00 00 30 fe c0 00 ff a0 ff 30 fe 00 00 00 ....0......0.... +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 01 01 68 .d...e...f.....h +| 4048: 01 01 01 01 01 69 01 01 01 04 06 06 06 04 04 04 .....i.......... +| 4064: 06 06 07 01 03 00 14 03 09 09 09 0f 0a 03 00 24 ...............$ +| 4080: 00 00 00 00 01 01 01 00 01 01 01 01 0a 00 00 00 ................ +| page 8 offset 28672 +| 0: 01 0f fa 00 0f fa 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 1f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-e2d47e0624a42c.db +}]} {} + +do_catchsql_test 28.1 { + SELECT count( fts5_decode(id, block) ) FROM t2_data; +} {1 {database disk image is malformed}} + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 231a6b52c0..5b957af45f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjustments\sto\sthe\spage\scache\sto\stry\sto\savoid\sharmless\sTSAN\swarnings. -D 2019-01-09T14:49:58.180 +C Fix\san\sout-of-bounds\sread\sin\sSQL\sfunction\sfts5_decode()\sthat\scould\soccur\sif\sit\nwas\spassed\sa\scorrupt\srecord. +D 2019-01-09T21:12:23.663 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81e F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 8e734f8592ce933cf4189f9818287406d392346576f8f9c2722beb79f2cd826e +F ext/fts5/fts5_index.c a84ed47b00a7d34fe5946efc7d8d5dba50e26cf821bf9c686afc33cae73b48d4 F ext/fts5/fts5_main.c 90062ccfc54031ff97660e277d868ec080c5b46e42d784856385b12645e60ed6 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 2cec78e6447c2be295bb9a123e3794e7fe19558e41241a8c861ec00b42ec4c77 +F ext/fts5/test/fts5corrupt3.test 4edf6bb965f8d5904bcb67f161b016f0ec0c7c2b59c33481c95c026f56ba4968 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1797,7 +1797,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 fc5ecc88f8a0855ba90039177ee284721b2035e4de56a1024e323216f011f0af -R 6ed50b6875990a4b9a765f1f68bf10cd -U drh -Z 1ecb4b75bf2b55e36bc746d9d8508d17 +P 383437be276719ac1c72688ae81017c63907ac561f2ffb8e42c43b012248f294 +R 8ad4f3de39b0d698bd5f67551c47ae40 +U dan +Z b5825c689cd4ca9fefd29a23584fe712 diff --git a/manifest.uuid b/manifest.uuid index 5e612f6fff..cc87fc95dc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -383437be276719ac1c72688ae81017c63907ac561f2ffb8e42c43b012248f294 \ No newline at end of file +931278b257b12ac14fc8fbc82c6dc88ce4ac4b8e0d668543e68f0289d825daa1 \ No newline at end of file From c49d43a787ae451df9e5483f6cef5f41aa95ed84 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 10 Jan 2019 01:12:43 +0000 Subject: [PATCH 028/306] Fix the fts3DecodeIntArray() function so that it will not read off the end of the buffer it is handed. Any unread integers are set to zero. FossilOrigin-Name: 666cf8f6b39ae1f72e82b45e9cacba23caf61370ca0c695b3b14452accbb1a0d --- ext/fts3/fts3_write.c | 16 +++++++++------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 2ff9f04da8..7535c36592 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -3327,14 +3327,16 @@ static void fts3DecodeIntArray( const char *zBuf, /* The BLOB containing the varints */ int nBuf /* size of the BLOB */ ){ - int i, j; - UNUSED_PARAMETER(nBuf); - for(i=j=0; i Date: Thu, 10 Jan 2019 13:56:08 +0000 Subject: [PATCH 029/306] Use the new SQLITE_IDXTYPE_IPK values (3) on Index.idxType to indicate the fake INTEGER PRIMARY KEY index used during query planning. FossilOrigin-Name: e22d2f905fe840bea51b536ebedc9b637190ea0a37f16559668d99a61e971411 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/sqliteInt.h | 3 ++- src/where.c | 9 +++++---- test/fts3fuzz001.test | 2 +- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 67428b3e6c..5fb74c2faa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sfts3DecodeIntArray()\sfunction\sso\sthat\sit\swill\snot\sread\soff\sthe\send\nof\sthe\sbuffer\sit\sis\shanded.\s\sAny\sunread\sintegers\sare\sset\sto\szero. -D 2019-01-10T01:12:43.917 +C Use\sthe\snew\sSQLITE_IDXTYPE_IPK\svalues\s(3)\son\sIndex.idxType\sto\sindicate\sthe\nfake\sINTEGER\sPRIMARY\sKEY\sindex\sused\sduring\squery\splanning. +D 2019-01-10T13:56:08.124 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -517,7 +517,7 @@ F src/shell.c.in 0722a9e3a1b23674f07c194b8f71c953c775bad280e7f179a32bf72cd009b56 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 57f7bfa8a64e6f37e256ab4137e22cd74b9cde1e8669d44bba46c13105b4d27e +F src/sqliteInt.h 829bebd46e570fc1a22923df111417145b394b9c198a9c68c2d7b9a4243b9c29 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -597,7 +597,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 -F src/where.c 981412c27abb9378d3024eae6f3040abd3c16db722f5ef8a7d613141ea2aea78 +F src/where.c 7a1db797b6576d66424845666b122f8bc3eda0f2eb8b21518baf40407bbdf6ac F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 @@ -930,7 +930,7 @@ F test/fts3expr5.test f9abfffbf5e53d48a33e12a1e8f8ba2c551c9b49 F test/fts3fault.test 9fb7d6266a38806de841f7244bac1b0fe3a1477184bbb10b172d19d2ca6ad692 F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 -F test/fts3fuzz001.test dea922cb318324baa0f5092c64c5f677a63e446924cce00a36289455f8b1fa18 +F test/fts3fuzz001.test 5069b96ca71cc44a223c75725c088e9b6fb3286967048f57063244b53b4d4380 F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a @@ -1797,7 +1797,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 931278b257b12ac14fc8fbc82c6dc88ce4ac4b8e0d668543e68f0289d825daa1 -R e543c7822807d0414916bad4b832fc3e +P 666cf8f6b39ae1f72e82b45e9cacba23caf61370ca0c695b3b14452accbb1a0d +R b4a33c44b98098920d5ea67635d615ee U drh -Z dca4f26f9f844ed901c4c2b939969898 +Z 91befd19851fb8d3389285e1801b2392 diff --git a/manifest.uuid b/manifest.uuid index 59c0dc2695..87284cc96a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -666cf8f6b39ae1f72e82b45e9cacba23caf61370ca0c695b3b14452accbb1a0d \ No newline at end of file +e22d2f905fe840bea51b536ebedc9b637190ea0a37f16559668d99a61e971411 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 9bc8160db9..d701e3fe3e 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2243,7 +2243,7 @@ struct Index { u16 nKeyCol; /* Number of columns forming the key */ u16 nColumn; /* Number of columns stored in the index */ u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - unsigned idxType:2; /* 1==UNIQUE, 2==PRIMARY KEY, 0==CREATE INDEX */ + unsigned idxType:2; /* 0:Normal 1:UNIQUE, 2:PRIMARY KEY, 3:IPK */ unsigned bUnordered:1; /* Use this index for == or IN queries only */ unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */ unsigned isResized:1; /* True if resizeIndexObject() has been called */ @@ -2268,6 +2268,7 @@ struct Index { #define SQLITE_IDXTYPE_APPDEF 0 /* Created using CREATE INDEX */ #define SQLITE_IDXTYPE_UNIQUE 1 /* Implements a UNIQUE constraint */ #define SQLITE_IDXTYPE_PRIMARYKEY 2 /* Is the PRIMARY KEY for the table */ +#define SQLITE_IDXTYPE_IPK 3 /* INTEGER PRIMARY KEY index */ /* Return true if index X is a PRIMARY KEY index */ #define IsPrimaryKeyIndex(X) ((X)->idxType==SQLITE_IDXTYPE_PRIMARYKEY) diff --git a/src/where.c b/src/where.c index 9c01927472..be86816af2 100644 --- a/src/where.c +++ b/src/where.c @@ -2210,7 +2210,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ rc = whereLoopXfer(db, p, pTemplate); if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ Index *pIndex = p->u.btree.pIndex; - if( pIndex && pIndex->tnum==0 ){ + if( pIndex && pIndex->idxType==SQLITE_IDXTYPE_IPK ){ p->u.btree.pIndex = 0; } } @@ -2377,8 +2377,8 @@ static int whereRangeVectorLen( ** terms only. If it is modified, this value is restored before this ** function returns. ** -** If pProbe->tnum==0, that means pIndex is a fake index used for the -** INTEGER PRIMARY KEY. +** If pProbe->idxType==SQLITE_IDXTYPE_IPK, that means pIndex is +** a fake index used for the INTEGER PRIMARY KEY. */ static int whereLoopAddBtreeIndex( WhereLoopBuilder *pBuilder, /* The WhereLoop factory */ @@ -2878,6 +2878,7 @@ static int whereLoopAddBtree( sPk.onError = OE_Replace; sPk.pTable = pTab; sPk.szIdxRow = pTab->szTabRow; + sPk.idxType = SQLITE_IDXTYPE_IPK; aiRowEstPk[0] = pTab->nRowLogEst; aiRowEstPk[1] = 0; pFirst = pSrc->pTab->pIndex; @@ -2968,7 +2969,7 @@ static int whereLoopAddBtree( b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); - if( pProbe->tnum<=0 ){ + if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ /* Integer primary key index */ pNew->wsFlags = WHERE_IPK; diff --git a/test/fts3fuzz001.test b/test/fts3fuzz001.test index 2f144ab4ba..aa85eb72ca 100644 --- a/test/fts3fuzz001.test +++ b/test/fts3fuzz001.test @@ -102,7 +102,7 @@ do_test fts3fuzz001-120 { catchsql { INSERT INTO t1(t1) VALUES('optimize'); } -} {0 {}} +} {1 {database disk image is malformed}} do_test fts3fuzz001-121 { catchsql { INSERT INTO t1(t1) VALUES('integrity-check'); From 69ab18d2132720f793f9afd84528f450fce1c874 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 10 Jan 2019 14:33:15 +0000 Subject: [PATCH 030/306] More aggressive early detection of orphaned and malformed autoindexes when parsing the schema. FossilOrigin-Name: 10f9e39d6ed2413fa9abc6c82da3ed48f32a42b6190b6219fca7faf850d05113 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/prepare.c | 14 +++++--------- test/dbfuzz001.test | 2 +- test/fts3corrupt4.test | 2 +- test/fts3fuzz001.test | 1 + 6 files changed, 18 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 5fb74c2faa..86c77ee269 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sthe\snew\sSQLITE_IDXTYPE_IPK\svalues\s(3)\son\sIndex.idxType\sto\sindicate\sthe\nfake\sINTEGER\sPRIMARY\sKEY\sindex\sused\sduring\squery\splanning. -D 2019-01-10T13:56:08.124 +C More\saggressive\searly\sdetection\sof\sorphaned\sand\smalformed\sautoindexes\swhen\nparsing\sthe\sschema. +D 2019-01-10T14:33:15.650 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -507,7 +507,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c 20811b404b6d302a1bedd4b8af8aab2794c5e87ba1f5cb6b42dbc3266ad9c603 F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 -F src/prepare.c 18f1d2801ffb48b83fddf83375389886c788e98fdfb87eabe988cf53893602c7 +F src/prepare.c 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 5f2f987aacba7548d10781f808e1b933f80abe0b6bc8e9922bc18b1d1faba339 @@ -778,7 +778,7 @@ F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68 F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b10 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e -F test/dbfuzz001.test 96b52856ffce5442e404847de33487db5ce49aa27778497a42328d5acf6859d7 +F test/dbfuzz001.test 5659cbbc01e38678c119c8a58071cac59d0d6c71837a385f3d1838012f12e1e1 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c b8ed9b32a1f287505e55970e55203bedcb9170f137ecefa2254033c9faccdfba F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 @@ -914,7 +914,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test eff323c4f93b211424d17f01ac6ace8772fbb712b5c9c578192cedd450023c4b +F test/fts3corrupt4.test 8771f5bad51bf1deb3f8b9564e3ff1e162ca126bcaf7104a81e04fbd15b96f7d F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -930,7 +930,7 @@ F test/fts3expr5.test f9abfffbf5e53d48a33e12a1e8f8ba2c551c9b49 F test/fts3fault.test 9fb7d6266a38806de841f7244bac1b0fe3a1477184bbb10b172d19d2ca6ad692 F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 -F test/fts3fuzz001.test 5069b96ca71cc44a223c75725c088e9b6fb3286967048f57063244b53b4d4380 +F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56 F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a @@ -1797,7 +1797,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 666cf8f6b39ae1f72e82b45e9cacba23caf61370ca0c695b3b14452accbb1a0d -R b4a33c44b98098920d5ea67635d615ee +P e22d2f905fe840bea51b536ebedc9b637190ea0a37f16559668d99a61e971411 +R 64c1cd3a0456b79f6db2107bcf4df283 U drh -Z 91befd19851fb8d3389285e1801b2392 +Z 9aefb36e88b8370b347777351dfba576 diff --git a/manifest.uuid b/manifest.uuid index 87284cc96a..f08bf3b8ab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e22d2f905fe840bea51b536ebedc9b637190ea0a37f16559668d99a61e971411 \ No newline at end of file +10f9e39d6ed2413fa9abc6c82da3ed48f32a42b6190b6219fca7faf850d05113 \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index 2c5f410253..cfe4a7e33f 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -119,15 +119,11 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ */ Index *pIndex; pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); - if( pIndex==0 ){ - /* This can occur if there exists an index on a TEMP table which - ** has the same name as another index on a permanent index. Since - ** the permanent table is hidden by the TEMP table, we can also - ** safely ignore the index on the permanent table. - */ - /* Do Nothing */; - }else if( sqlite3GetInt32(argv[1], &pIndex->tnum)==0 ){ - corruptSchema(pData, argv[0], "invalid rootpage"); + if( pIndex==0 + || sqlite3GetInt32(argv[1],&pIndex->tnum)==0 + || pIndex->tnum<2 + ){ + corruptSchema(pData, argv[0], pIndex?"invalid rootpage":"orphan index"); } } return 0; diff --git a/test/dbfuzz001.test b/test/dbfuzz001.test index 0c19b06180..70c7997684 100644 --- a/test/dbfuzz001.test +++ b/test/dbfuzz001.test @@ -168,7 +168,7 @@ do_test dbfuzz001-100 { | 496: 01 0d 3f 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 ..?..H.T........ | end c4.db }] - db eval {PRAGMA integrity_check} + db eval {PRAGMA writable_schema=on; PRAGMA integrity_check} } {/Fragmentation of 384 bytes reported as 0 on page 8/} # The DELETE query below deletes the very last cell from page 8. diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 2718aefcf4..3ff2bed99d 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -247,6 +247,6 @@ do_test 5.0 { do_catchsql_test 5.1 { SELECT * FROM t1 WHERE t1 MATCH 'abandon'; -} {1 {database disk image is malformed}} +} {1 {malformed database schema (sqlite_autoindey_t1_segdir_1) - orphan index}} finish_test diff --git a/test/fts3fuzz001.test b/test/fts3fuzz001.test index aa85eb72ca..41b22d33da 100644 --- a/test/fts3fuzz001.test +++ b/test/fts3fuzz001.test @@ -90,6 +90,7 @@ do_test fts3fuzz001-100 { | end c6.db }] catchsql { + PRAGMA writable_schema=on; -- disable schema corruption detection INSERT INTO t1(t1) SELECT x FROM t2; } } {1 {database disk image is malformed}} From c80864d77aa1fe06ca7589bafe66ea2b2d350649 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 10 Jan 2019 15:17:32 +0000 Subject: [PATCH 031/306] Fix further problems with fts5 handling corrupt databases. FossilOrigin-Name: 83c467d7af63bd2e7800aff4fe9b09dbd75557460b75a9e07205dfae7e28312c --- ext/fts5/fts5_index.c | 4 + ext/fts5/fts5_vocab.c | 2 +- ext/fts5/test/fts5corrupt3.test | 345 ++++++++++++++++++++++++++++++++ manifest | 18 +- manifest.uuid | 2 +- 5 files changed, 360 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 90dc0a5a9e..c767899e02 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -6424,6 +6424,10 @@ static void fts5DecodeFunction( }else{ iEnd = szLeaf; } + if( iEnd>szLeaf ){ + rc = FTS5_CORRUPT; + goto decode_out; + } if( bFirst==0 ){ iOff += fts5GetVarint32(&a[iOff], nByte); diff --git a/ext/fts5/fts5_vocab.c b/ext/fts5/fts5_vocab.c index e475d0772f..c9dbe3b868 100644 --- a/ext/fts5/fts5_vocab.c +++ b/ext/fts5/fts5_vocab.c @@ -521,7 +521,6 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int iCol = -1; while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){ int ii = FTS5_POS2COLUMN(iPos); - pCsr->aCnt[ii]++; if( iCol!=ii ){ if( ii>=nCol ){ rc = FTS5_CORRUPT; @@ -530,6 +529,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ pCsr->aDoc[ii]++; iCol = ii; } + pCsr->aCnt[ii]++; } }else if( eDetail==FTS5_DETAIL_COLUMNS ){ while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff,&iPos) ){ diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index fd9d14b1ed..6d3be1df8a 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -3166,6 +3166,351 @@ do_catchsql_test 28.1 { SELECT count( fts5_decode(id, block) ) FROM t2_data; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 29.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-e114c036e13dde.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 08 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 06 0d b6 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d b6 00 00 00 00 00 00 ...k............ +| 3504: 00 00 00 00 00 00 56 07 06 17 1f 1f 01 7d 74 61 ......V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c af 00 0f e6 0f ef 0c af 00 00 ................ +| 3232: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 86 ................ +| 3248: 2f 84 80 80 80 80 01 04 00 8c 62 00 00 03 12 02 /.........b..... +| 3264: 30 30 01 04 05 03 01 04 05 03 01 04 05 03 1f 02 00.............. +| 3280: 03 01 02 03 01 02 03 01 08 35 30 30 30 30 30 30 .........5000000 +| 3296: 30 1c 02 04 01 02 04 01 02 04 01 01 36 01 02 04 0...........6... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 05 63 6c 61 6e ............clan +| 3392: 67 01 02 03 01 02 03 01 02 03 02 07 6f 6d 70 69 g...........ompi +| 3408: 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 62 ler...........db +| 3424: 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 65 stat...........e +| 3440: 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 6e bug...........en +| 3456: 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 02 able............ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3520: 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 04 .....xtension... +| 3536: 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 03 ........fts4.... +| 3552: 01 02 01 02 03 04 01 35 0d 02 03 01 02 03 01 02 .......5........ +| 3568: 03 01 07 67 65 6f 70 6f 6c 79 10 02 03 01 02 03 ...geopoly...... +| 3584: 01 02 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 .....json1...... +| 3600: 01 02 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 .....load....... +| 3616: 02 03 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 ....max......... +| 3632: 02 05 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 ..emory......... +| 3648: 04 04 73 79 73 35 16 02 03 01 02 03 01 02 03 01 ..sys5.......... +| 3664: 06 6e 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 .nocase......... +| 3680: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3696: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3712: 06 01 02 02 03 06 01 02 02 03 06 01 12 02 03 06 ................ +| 3728: 01 02 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 .....omit....... +| 3744: 02 02 01 05 72 74 72 65 65 19 02 03 01 02 03 01 ....rtree....... +| 3760: 02 03 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 ....im.......... +| 3776: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3792: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3808: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3824: 02 02 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 ....threadsafe.. +| 3840: 02 01 02 02 01 02 02 01 04 76 74 61 62 07 02 04 .........vtab... +| 3856: 01 02 04 01 02 04 01 01 78 01 06 01 01 02 01 06 ........x....... +| 3872: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3888: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3904: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3920: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3936: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3952: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3968: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3984: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 4000: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 4016: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4032: 01 01 02 01 06 01 01 02 01 06 01 01 02 04 18 13 ................ +| 4048: 0c 44 10 12 11 0f 47 13 0f 0c 12 10 0f 0e 10 0f .D....G......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 57 24 24 0f D..@.......$W$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 1f 00 0f df 0f bd 0f 9b 0f 89 ....$........... +| 16: 0f 76 0f 63 0f 44 0f 24 0f 04 0e ec 0e d3 0e ba .v.c.D.$........ +| 32: 0e a2 0e 89 0e 70 e5 50 e3 90 e1 d0 e0 40 de a0 .....p.P.....@.. +| 48: dd 00 db 50 d9 90 d7 ea ca ea be d0 d6 40 d4 a0 ...P.........@.. +| 64: d3 00 d1 00 ce f0 cc e0 ca e0 c8 d0 c6 c0 c5 30 ...............0 +| 80: c3 90 c1 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3088: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 ................ +| 3104: 24 05 00 25 0f 19 54 48 52 45 41 44 53 41 46 45 $..%..THREADSAFE +| 3120: 3d 30 58 42 49 4e 41 52 59 18 23 05 00 25 0f 19 =0XBINARY.#..%.. +| 3136: 54 48 52 45 41 44 53 41 46 45 3d 30 58 4e 4f 43 THREADSAFE=0XNOC +| 3152: 41 53 45 17 22 05 00 25 0f 17 54 48 52 45 41 44 ASE....%..THREAD +| 3168: 53 41 46 45 3d 30 05 00 33 0f 19 4f 4d 49 54 20 SAFE=0..3..OMIT +| 3184: 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 58 42 LOAD EXTENSIONXB +| 3200: 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f 4d 49 54 INARY. ..3..OMIT +| 3216: 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 58 LOAD EXTENSIONX +| 3232: 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 4f 4d 49 NOCASE....3..OMI +| 3248: 54 20 4c f4 14 42 04 55 85 44 54 e5 34 94 f4 e5 T L..B.U.DT.4... +| 3264: 85 25 45 24 94 d1 f1 e0 50 03 30 f1 94 d4 15 82 .%E$....P.0..... +| 3280: 04 d4 54 d4 f5 25 93 d3 53 03 03 03 03 03 03 05 ..T..%..S....... +| 3296: 84 24 94 e4 15 25 91 f1 d0 50 03 30 f1 94 d4 15 .$...%...P.0.... +| 3312: 82 04 d4 54 d4 f5 25 93 d3 53 03 03 03 03 03 03 ...T..%..S...... +| 3328: 05 84 e4 f4 34 15 34 51 e1 c0 50 03 30 f1 74 d4 ....4.4Q..P.0.t. +| 3344: 15 82 04 d4 54 d4 f2 90 f1 74 54 e4 14 24 c4 52 ....T....tT..$.R +| 3360: 04 74 54 f5 04 f4 c5 95 85 25 45 24 94 d1 70 f0 .tT......%E$..p. +| 3376: 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 45 33 55 P.0..T..$.R.eE3U +| 3392: 84 24 94 e4 15 25 91 70 e0 50 02 30 f1 94 54 e4 .$...%.p.P.0..T. +| 3408: 14 24 c4 52 04 65 45 33 55 84 e4 f4 34 15 34 51 .$.R.eE3U...4.4Q +| 3424: 60 d0 50 02 30 f1 74 54 e4 14 24 c4 52 04 65 45 `.P.0.tT..$.R.eE +| 3440: 33 55 85 25 45 24 94 d1 70 c0 50 02 30 f1 94 54 3U.%E$..p.P.0..T +| 3456: e4 14 24 c4 52 04 65 45 33 45 84 24 94 e4 15 25 ..$.R.eE3E.$...% +| 3472: 91 70 b0 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 .p.P.0..T..$.R.e +| 3488: 45 33 45 84 e4 f4 34 15 34 51 60 a0 74 54 e4 14 E3E...4.4Q`.tT.. +| 3504: 24 c4 52 04 65 45 33 45 85 25 45 24 94 d1 e0 90 $.R.eE3E.%E$.... +| 3520: 50 03 10 f1 94 54 e4 14 24 c4 52 04 44 25 35 44 P....T..$.R.D%5D +| 3536: 15 42 05 65 44 14 25 84 24 94 e4 15 25 91 e0 80 .B.eD.%.$...%... +| 3552: 50 03 10 f1 94 54 e4 14 24 c4 52 04 44 25 35 44 P....T..$.R.D%5D +| 3568: 15 42 05 65 44 14 25 84 e4 f4 34 15 34 51 d0 70 .B.eD.%...4.4Q.p +| 3584: 50 03 10 f1 74 54 e4 14 24 c4 52 04 44 25 35 44 P...tT..$.R.D%5D +| 3600: 15 42 05 65 44 14 25 85 25 45 24 94 d1 10 60 50 .B.eD.%.%E$...`P +| 3616: 01 70 f1 94 44 54 25 54 75 84 24 94 e4 15 25 91 .p..DT%Tu.$...%. +| 3632: 10 50 50 01 70 f1 94 44 54 25 54 75 84 e4 f4 34 .PP.p..DT%Tu...4 +| 3648: 15 34 51 00 40 50 01 70 f1 74 44 54 25 54 75 85 .4Q.@P.p.tDT%Tu. +| 3664: 25 45 24 94 d2 00 30 50 03 50 f1 94 34 f4 d5 04 %E$...0P.P..4... +| 3680: 94 c4 55 23 d6 36 c6 16 e6 72 d3 62 e3 02 e3 05 ..U#.6...r.b.... +| 3696: 84 24 94 e4 15 25 92 00 20 50 03 50 f1 94 34 f4 .$...%.. P.P..4. +| 3712: d5 04 94 c4 55 23 d6 36 c6 16 e6 72 d3 62 e3 02 ....U#.6...r.b.. +| 3728: e3 05 84 e4 f4 34 15 34 51 f0 10 50 03 50 f1 74 .....4.4Q..P.P.t +| 3744: 34 f4 d5 04 94 c4 55 23 d6 36 c6 16 e6 72 d3 62 4.....U#.6...r.b +| 3760: e3 02 e3 05 85 25 45 24 94 d0 d0 00 00 02 40 ee .....%E$......@. +| 3776: 00 00 ff 80 ff 00 fe 80 fe 00 fd 80 fd 00 fc 80 ................ +| 3792: fc 00 fb 80 fb 00 fa 80 fa 00 f9 80 f9 00 f8 80 ................ +| 3808: f8 00 f7 80 f7 00 f6 80 f6 00 f5 80 f5 00 f4 80 ................ +| 3824: f4 00 f3 80 f3 00 f2 80 f2 00 f1 80 f1 00 f0 80 ................ +| 3840: f0 00 ef 80 ef 00 ee 80 ee 00 00 00 00 00 00 00 ................ +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 05 01 01 ................ +| 4080: 06 02 03 00 12 05 01 01 06 01 03 00 12 05 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-e114c036e13dde.db +}]} {} + +do_catchsql_test 29.1 { + CREATE VIRTUAL TABLE t3 USING fts5vocab('t1','col'); +} {0 {}} +do_catchsql_test 29.2 { + SELECT rowid, quote(term), * FROM t3 WHERE term=='nocase'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 30.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-eef41e30b388a0.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 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 00 00 66 46 08 08 0f ef 00 14 2a 00 00 00 ....fF......*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 02 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 04 ..h.......i..... +| 4064: 04 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 52 06 66 72 06 82 06 90 .a b cd R.fr.... +| page 5 offset 16384 +| 0: d0 00 00 00 30 fe 80 00 ff 80 ff 00 fe 00 00 00 ....0........... +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-eef41e30b388a0.db +}]} {} + +do_catchsql_test 30.1 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 86c77ee269..0482062965 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\saggressive\searly\sdetection\sof\sorphaned\sand\smalformed\sautoindexes\swhen\nparsing\sthe\sschema. -D 2019-01-10T14:33:15.650 +C Fix\sfurther\sproblems\swith\sfts5\shandling\scorrupt\sdatabases. +D 2019-01-10T15:17:32.879 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81e F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c a84ed47b00a7d34fe5946efc7d8d5dba50e26cf821bf9c686afc33cae73b48d4 +F ext/fts5/fts5_index.c 8663717e84a7b5006c24fb35b5dd438e153281e41f846fb2ecdbab0584750281 F ext/fts5/fts5_main.c 90062ccfc54031ff97660e277d868ec080c5b46e42d784856385b12645e60ed6 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -124,7 +124,7 @@ F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3 F ext/fts5/fts5_tokenize.c 4d904c237707de8fbb8ab98d24d5c55d47204a3f1f35895d8a53a5327079b32c F ext/fts5/fts5_unicode2.c d8a1528c9a19f79b843c486e5e64bff17d667791ae7f658e11131ebac4b33c59 F ext/fts5/fts5_varint.c 19ca7c5cf3f36017f44e5bb790f01b111f37791c8a1a49a17711f2b666a629f1 -F ext/fts5/fts5_vocab.c fbe38044889b2d2d99babeeef239c620fb0332bb928a84506ac748d81500b354 +F ext/fts5/fts5_vocab.c 217451108ad526820f6743f9d9be231a692a4f14e1349d526f82c61f42e9fc13 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 4edf6bb965f8d5904bcb67f161b016f0ec0c7c2b59c33481c95c026f56ba4968 +F ext/fts5/test/fts5corrupt3.test c50be432a544a98761202b9814f40e17c5ef007bf351ec22474015d828f354d6 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1797,7 +1797,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 e22d2f905fe840bea51b536ebedc9b637190ea0a37f16559668d99a61e971411 -R 64c1cd3a0456b79f6db2107bcf4df283 -U drh -Z 9aefb36e88b8370b347777351dfba576 +P 10f9e39d6ed2413fa9abc6c82da3ed48f32a42b6190b6219fca7faf850d05113 +R 72fda51f0f3fbf7bf16292ae38b5ad54 +U dan +Z 0a29b0d3fdcd0377c1379ed4158ea092 diff --git a/manifest.uuid b/manifest.uuid index f08bf3b8ab..29dce9f4de 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10f9e39d6ed2413fa9abc6c82da3ed48f32a42b6190b6219fca7faf850d05113 \ No newline at end of file +83c467d7af63bd2e7800aff4fe9b09dbd75557460b75a9e07205dfae7e28312c \ No newline at end of file From 25e3073741c2bc23b846bd74dc50334295dd2c1a Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 10 Jan 2019 17:08:20 +0000 Subject: [PATCH 032/306] Avoid use-after-free and double-free errors that could occur if an fts5 table is modified in certain ways while there are active cursors. FossilOrigin-Name: 3291b2a6fe6f38ae91b933e5cd2bf7d97432374b4fb1fccd92b4bd759b02ee06 --- ext/fts5/fts5_index.c | 3 --- ext/fts5/test/fts5corrupt3.test | 34 +++++++++++++++++++++++++++++++++ ext/fts5/test/fts5update.test | 19 ++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 62 insertions(+), 12 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index c767899e02..88505fc18b 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -512,7 +512,6 @@ struct Fts5Iter { Fts5IndexIter base; /* Base class containing output vars */ Fts5Index *pIndex; /* Index that owns this iterator */ - Fts5Structure *pStruct; /* Database structure for this iterator */ Fts5Buffer poslist; /* Buffer containing current poslist */ Fts5Colset *pColset; /* Restrict matches to these columns */ @@ -2758,7 +2757,6 @@ static void fts5MultiIterFree(Fts5Iter *pIter){ for(i=0; inSeg; i++){ fts5SegIterClear(&pIter->aSeg[i]); } - fts5StructureRelease(pIter->pStruct); fts5BufferFree(&pIter->poslist); sqlite3_free(pIter); } @@ -3404,7 +3402,6 @@ static void fts5MultiIterNew( if( pNew==0 ) return; pNew->bRev = (0!=(flags & FTS5INDEX_QUERY_DESC)); pNew->bSkipEmpty = (0!=(flags & FTS5INDEX_QUERY_SKIPEMPTY)); - pNew->pStruct = pStruct; pNew->pColset = pColset; fts5StructureRef(pStruct); if( (flags & FTS5INDEX_QUERY_NOOUTPUT)==0 ){ diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 6d3be1df8a..f2b8b20ecd 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -3512,6 +3512,40 @@ do_catchsql_test 30.1 { SELECT fts5_decode(id, block) FROM t1_data; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 31.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 8192 pagesize 4096 filename crash-7629f35f11d48e.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 02 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 01 0f c7 00 0f c7 00 00 ................ +| 4032: 00 00 00 00 00 00 00 37 01 06 17 15 15 01 53 74 .......7......St +| 4048: 61 62 6c 65 64 75 61 6c 64 75 61 6c 02 43 52 45 abledualdual.CRE +| 4064: 41 54 45 20 54 41 42 4c 45 20 64 75 61 6c 28 64 ATE TABLE dual(d +| 4080: 75 6d 6d 79 20 76 61 72 28 31 29 29 0d 00 00 00 ummy var(1)).... +| page 2 offset 4096 +| 0: 01 0f fb 00 0f fb 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 03 01 02 0f 58 ...............X +| end crash-7629f35f11d48e.db +}]} {} + +do_execsql_test 31.1 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<72) + INSERT INTO t1(a) SELECT randomblob(2829) FROM c; + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} + +do_catchsql_test 31.2 { + DELETE FROM t1 WHERE a MATCH X'6620e574f32a'; +} {0 {}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/ext/fts5/test/fts5update.test b/ext/fts5/test/fts5update.test index b558c2fb7d..913c06e863 100644 --- a/ext/fts5/test/fts5update.test +++ b/ext/fts5/test/fts5update.test @@ -115,5 +115,24 @@ do_execsql_test 2.2.integrity { INSERT INTO x2(x2) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# +do_execsql_test 3.0 { + CREATE VIRTUAL TABLE x3 USING fts5(x, detail=%DETAIL%); + INSERT INTO x3 VALUES('one'); + INSERT INTO x3 VALUES('two'); + INSERT INTO x3 VALUES('one'); + INSERT INTO x3 VALUES('two'); + INSERT INTO x3 VALUES('one'); +} + +do_test 3.1 { + db eval { SELECT * FROM x3('one') } { + db eval { + INSERT INTO x3(x3) VALUES('optimize'); + } + } +} {} + } finish_test diff --git a/manifest b/manifest index 0482062965..b9b27db601 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sfurther\sproblems\swith\sfts5\shandling\scorrupt\sdatabases. -D 2019-01-10T15:17:32.879 +C Avoid\suse-after-free\sand\sdouble-free\serrors\sthat\scould\soccur\sif\san\sfts5\stable\nis\smodified\sin\scertain\sways\swhile\sthere\sare\sactive\scursors. +D 2019-01-10T17:08:20.419 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81e F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 8663717e84a7b5006c24fb35b5dd438e153281e41f846fb2ecdbab0584750281 +F ext/fts5/fts5_index.c ec0ca720bf3d564adc659791c6a9e7b98b019b4083882b4ea9173e1870035645 F ext/fts5/fts5_main.c 90062ccfc54031ff97660e277d868ec080c5b46e42d784856385b12645e60ed6 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test c50be432a544a98761202b9814f40e17c5ef007bf351ec22474015d828f354d6 +F ext/fts5/test/fts5corrupt3.test 87c1289b4d9520f3ca5ca62d5ecf7926d09da8336d1d40a37aa52303ae5bcd06 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -215,7 +215,7 @@ F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e F ext/fts5/test/fts5unicode3.test 590c72e18195bda2446133f9d82d04a4e89d094bba58c75ae10f4afc6faa0744 F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef58d3abddf27147b687 F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d -F ext/fts5/test/fts5update.test 0737876e20e97a6a6abf45de19fc99315727bcee6a83fadcada1cc080b9aa8f0 +F ext/fts5/test/fts5update.test 8486224b6174c71e459a467f49a9bb67a7656fd54a995b48be1b0dc3bdcf18af F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a F ext/fts5/test/fts5vocab.test 26e069050d6fb389e67f7a9402421948233152ae433e6b8da47cf15d3b5a8d26 F ext/fts5/test/fts5vocab2.test 5472d6cd852fe848876892c48a754c82af018bf08ca16f1f167db59dc64586f7 @@ -1797,7 +1797,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 10f9e39d6ed2413fa9abc6c82da3ed48f32a42b6190b6219fca7faf850d05113 -R 72fda51f0f3fbf7bf16292ae38b5ad54 +P 83c467d7af63bd2e7800aff4fe9b09dbd75557460b75a9e07205dfae7e28312c +R 3351e2aae6403322cbe69ee0af9a55bf U dan -Z 0a29b0d3fdcd0377c1379ed4158ea092 +Z 309e7dae9990d8d0bb0ac224fef52616 diff --git a/manifest.uuid b/manifest.uuid index 29dce9f4de..f9705c3603 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -83c467d7af63bd2e7800aff4fe9b09dbd75557460b75a9e07205dfae7e28312c \ No newline at end of file +3291b2a6fe6f38ae91b933e5cd2bf7d97432374b4fb1fccd92b4bd759b02ee06 \ No newline at end of file From f7d687c9d3f4ef36a8bfba2f635e852115cad006 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 10 Jan 2019 18:35:09 +0000 Subject: [PATCH 033/306] Fix a memory leak in fts5. FossilOrigin-Name: ff3b011f17f4f02e486f3c8de607f62eddf3b86562e2df82dba57ea166994b65 --- ext/fts5/fts5_index.c | 1 - ext/fts5/test/fts5update.test | 5 +++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 88505fc18b..dd70a460bf 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3403,7 +3403,6 @@ static void fts5MultiIterNew( pNew->bRev = (0!=(flags & FTS5INDEX_QUERY_DESC)); pNew->bSkipEmpty = (0!=(flags & FTS5INDEX_QUERY_SKIPEMPTY)); pNew->pColset = pColset; - fts5StructureRef(pStruct); if( (flags & FTS5INDEX_QUERY_NOOUTPUT)==0 ){ fts5IterSetOutputCb(&p->rc, pNew); } diff --git a/ext/fts5/test/fts5update.test b/ext/fts5/test/fts5update.test index 913c06e863..0cbfe3499a 100644 --- a/ext/fts5/test/fts5update.test +++ b/ext/fts5/test/fts5update.test @@ -134,5 +134,10 @@ do_test 3.1 { } } {} + } + +reset_db +do_catchsql_test 4.0 { CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); } {0 {}} +do_catchsql_test 4.1 { DELETE FROM t1 WHERE t1 MATCH 'f*'; } {0 {}} finish_test diff --git a/manifest b/manifest index b9b27db601..2e046311ed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\suse-after-free\sand\sdouble-free\serrors\sthat\scould\soccur\sif\san\sfts5\stable\nis\smodified\sin\scertain\sways\swhile\sthere\sare\sactive\scursors. -D 2019-01-10T17:08:20.419 +C Fix\sa\smemory\sleak\sin\sfts5. +D 2019-01-10T18:35:09.737 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81e F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c ec0ca720bf3d564adc659791c6a9e7b98b019b4083882b4ea9173e1870035645 +F ext/fts5/fts5_index.c 89ebc3ca91f815059456913dc628f2f1401265efc2bd4a7ff4979f3e46c94515 F ext/fts5/fts5_main.c 90062ccfc54031ff97660e277d868ec080c5b46e42d784856385b12645e60ed6 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -215,7 +215,7 @@ F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e F ext/fts5/test/fts5unicode3.test 590c72e18195bda2446133f9d82d04a4e89d094bba58c75ae10f4afc6faa0744 F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef58d3abddf27147b687 F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d -F ext/fts5/test/fts5update.test 8486224b6174c71e459a467f49a9bb67a7656fd54a995b48be1b0dc3bdcf18af +F ext/fts5/test/fts5update.test 3f0e75ba7640adfdb89953ce9d5a807cb7525c60cf3ebaaa15257510773e66c8 F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a F ext/fts5/test/fts5vocab.test 26e069050d6fb389e67f7a9402421948233152ae433e6b8da47cf15d3b5a8d26 F ext/fts5/test/fts5vocab2.test 5472d6cd852fe848876892c48a754c82af018bf08ca16f1f167db59dc64586f7 @@ -1797,7 +1797,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 83c467d7af63bd2e7800aff4fe9b09dbd75557460b75a9e07205dfae7e28312c -R 3351e2aae6403322cbe69ee0af9a55bf +P 3291b2a6fe6f38ae91b933e5cd2bf7d97432374b4fb1fccd92b4bd759b02ee06 +R 1c33165edc9b45e32730d6e6266f1175 U dan -Z 309e7dae9990d8d0bb0ac224fef52616 +Z d890b0290cb03fc4b57662bf241ecd9a diff --git a/manifest.uuid b/manifest.uuid index f9705c3603..094f107087 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3291b2a6fe6f38ae91b933e5cd2bf7d97432374b4fb1fccd92b4bd759b02ee06 \ No newline at end of file +ff3b011f17f4f02e486f3c8de607f62eddf3b86562e2df82dba57ea166994b65 \ No newline at end of file From 6ca98ad6b1ed5f1d0d4f66824c914f495ae8053c Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 10 Jan 2019 19:26:52 +0000 Subject: [PATCH 034/306] Fix a memory leak in fts5 that could occur if scalar function fts5_decode() was passed a corrupt record. FossilOrigin-Name: 240f1c0c92cad8a1c19438b38489aedb831f62a4603c53f22367e876d8f644ff --- ext/fts5/fts5_index.c | 4 +- ext/fts5/test/fts5corrupt3.test | 172 ++++++++++++++++++++++++++++++++ manifest | 14 +-- manifest.uuid | 2 +- 4 files changed, 182 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index dd70a460bf..4cd5e5e23e 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -6422,14 +6422,14 @@ static void fts5DecodeFunction( } if( iEnd>szLeaf ){ rc = FTS5_CORRUPT; - goto decode_out; + break; } if( bFirst==0 ){ iOff += fts5GetVarint32(&a[iOff], nByte); if( nByte>term.n ){ rc = FTS5_CORRUPT; - goto decode_out; + break; } term.n = nByte; } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index f2b8b20ecd..00cda24220 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -3546,6 +3546,178 @@ do_catchsql_test 31.2 { DELETE FROM t1 WHERE a MATCH X'6620e574f32a'; } {0 {}} +#------------------------------------------------------------------------- +reset_db +do_test 32.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-e2d47e0624a42c.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 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 20 ....c.....g.... +| 4048: 10 16 80 10 60 10 20 30 10 16 90 10 60 10 20 40 ....`. 0....`. @ +| 4064: 40 60 60 60 80 80 70 10 30 01 40 30 90 00 90 00 @```..p.0.@0.... +| 4080: 00 01 12 40 00 00 00 00 10 10 10 00 10 10 10 10 ...@............ +| page 3 offset 8192 +| 0: a0 00 00 00 30 fe c0 00 ff a0 ff 30 fe 00 00 00 ....0......0.... +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 01 01 68 .d...e...f.....h +| 4048: 01 01 01 01 01 69 01 01 01 04 06 06 06 04 04 04 .....i.......... +| 4064: 06 06 07 01 03 00 14 03 09 09 09 0f 0a 03 00 24 ...............$ +| 4080: 00 00 00 00 01 01 01 00 01 01 01 01 0a 00 00 00 ................ +| page 8 offset 28672 +| 0: 01 0f fa 00 0f fa 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 1f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-e2d47e0624a42c.db +}]} {} + +do_catchsql_test 32.1 { + SELECT snippet(t1, -1, '.', '..', '[', ']'), + highlight(t1, 2, '[', ']') + FROM t1('g + h') + WHERE rank MATCH 'bm25(1.0, 1.0)' ORDER BY rank; +} {1 {vtable constructor failed: t1}} + +do_catchsql_test 32.2 { + SELECT * FROM t3; +} {1 {database disk image is malformed}} + +do_catchsql_test 32.3 { + SELECT * FROM t4; +} {1 {database disk image is malformed}} + +do_catchsql_test 32.4 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +do_catchsql_test 32.5 { + SELECT fts5_decode(id, block) FROM t2_data; +} {1 {database disk image is malformed}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 2e046311ed..a953760970 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sin\sfts5. -D 2019-01-10T18:35:09.737 +C Fix\sa\smemory\sleak\sin\sfts5\sthat\scould\soccur\sif\sscalar\sfunction\sfts5_decode()\nwas\spassed\sa\scorrupt\srecord. +D 2019-01-10T19:26:52.167 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81e F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 89ebc3ca91f815059456913dc628f2f1401265efc2bd4a7ff4979f3e46c94515 +F ext/fts5/fts5_index.c 7e617122cd695c57ded21fab4b43bf5acb5f65bd2e5566f233c61c46c510d356 F ext/fts5/fts5_main.c 90062ccfc54031ff97660e277d868ec080c5b46e42d784856385b12645e60ed6 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 87c1289b4d9520f3ca5ca62d5ecf7926d09da8336d1d40a37aa52303ae5bcd06 +F ext/fts5/test/fts5corrupt3.test 94efe10c851dafcccb2a9c05c2859ba1d5e4bb7396a14a9a5027356ef02a9159 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1797,7 +1797,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 3291b2a6fe6f38ae91b933e5cd2bf7d97432374b4fb1fccd92b4bd759b02ee06 -R 1c33165edc9b45e32730d6e6266f1175 +P ff3b011f17f4f02e486f3c8de607f62eddf3b86562e2df82dba57ea166994b65 +R b33ddb6eb6b1e8d7beda0d7f4cf1c6ff U dan -Z d890b0290cb03fc4b57662bf241ecd9a +Z 93525fbb63cb2b21b9f3ec0fe983cfac diff --git a/manifest.uuid b/manifest.uuid index 094f107087..159c366cfd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ff3b011f17f4f02e486f3c8de607f62eddf3b86562e2df82dba57ea166994b65 \ No newline at end of file +240f1c0c92cad8a1c19438b38489aedb831f62a4603c53f22367e876d8f644ff \ No newline at end of file From e65b9c6a5e2ff7a1de7bed378fe09157ce8e8525 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Jan 2019 13:03:06 +0000 Subject: [PATCH 035/306] Separate makefile targets for "dbfuzz2", "dbfuzz2-asan", and "dbfuzz2-msan". FossilOrigin-Name: ea119641a7edcd0e1ec14371d93e35f860971888bd98cb0019253358a2ef123b --- Makefile.in | 22 ++++++++++++++++++---- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/dbfuzz2.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 13 deletions(-) diff --git a/Makefile.in b/Makefile.in index 3d9a566505..4eec340b0f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -682,12 +682,26 @@ DBFUZZ2_OPTS = \ -DSQLITE_ENABLE_DBSTAT_VTAB \ -DSQLITE_ENABLE_RTREE \ -DSQLITE_ENABLE_FTS4 \ - -DSQLITE_EANBLE_FTS5 + -DSQLITE_ENABLE_FTS5 -dbfuzz2: $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h +dbfuzz2$(TEXE): $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + $(CC) $(OPT_FEATURE_FLAGS) $(OPTS) -I. -g -O0 \ + -DSTANDALONE -o dbfuzz2 \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) + mkdir -p dbfuzz2-dir + cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir + +dbfuzz2-asan: $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h clang-6.0 $(OPT_FEATURE_FLAGS) $(OPTS) -I. -g -O0 \ - -fsanitize=fuzzer,undefined,address -o dbfuzz2 \ - $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c + -fsanitize=fuzzer,undefined,address -o dbfuzz2-asan \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) + mkdir -p dbfuzz2-dir + cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir + +dbfuzz2-msan: $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + clang-6.0 $(OPT_FEATURE_FLAGS) $(OPTS) -I. -g -O0 \ + -fsanitize=fuzzer,undefined,memory -o dbfuzz2-msan \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) mkdir -p dbfuzz2-dir cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir diff --git a/manifest b/manifest index a953760970..aea19fe247 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -C Fix\sa\smemory\sleak\sin\sfts5\sthat\scould\soccur\sif\sscalar\sfunction\sfts5_decode()\nwas\spassed\sa\scorrupt\srecord. -D 2019-01-10T19:26:52.167 +C Separate\smakefile\stargets\sfor\s"dbfuzz2",\s"dbfuzz2-asan",\sand\s"dbfuzz2-msan". +D 2019-01-11T13:03:06.705 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 +F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 3c4c7e94419ff28cb68850188c9d153b343aed4c5ebed5965426232ed67ff9d9 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee @@ -780,7 +780,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 5659cbbc01e38678c119c8a58071cac59d0d6c71837a385f3d1838012f12e1e1 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c b8ed9b32a1f287505e55970e55203bedcb9170f137ecefa2254033c9faccdfba +F test/dbfuzz2.c e89fbe07f8188ff0b9a2cb5c742af23a69f81a0d101d0c104151e3459508ebf3 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1797,7 +1797,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 ff3b011f17f4f02e486f3c8de607f62eddf3b86562e2df82dba57ea166994b65 -R b33ddb6eb6b1e8d7beda0d7f4cf1c6ff -U dan -Z 93525fbb63cb2b21b9f3ec0fe983cfac +P 240f1c0c92cad8a1c19438b38489aedb831f62a4603c53f22367e876d8f644ff +R 97cd1020543aae6c3b535334385150bf +U drh +Z dd51adc1b571f184664beeec5f4ba112 diff --git a/manifest.uuid b/manifest.uuid index 159c366cfd..5a6181fd64 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -240f1c0c92cad8a1c19438b38489aedb831f62a4603c53f22367e876d8f644ff \ No newline at end of file +ea119641a7edcd0e1ec14371d93e35f860971888bd98cb0019253358a2ef123b \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 9e3aca2527..b71561b2e5 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -137,3 +137,49 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ *pArgc = j; return 0; } + +#ifdef STANDALONE +/* +** Read an entire file into memory. Space to hold the file comes +** from malloc(). +*/ +static unsigned char *readFile(const char *zName, int *pnByte){ + FILE *in = fopen(zName, "rb"); + long nIn; + size_t nRead; + unsigned char *pBuf; + if( in==0 ) return 0; + fseek(in, 0, SEEK_END); + nIn = ftell(in); + rewind(in); + pBuf = malloc( nIn+1 ); + if( pBuf==0 ){ fclose(in); return 0; } + nRead = fread(pBuf, nIn, 1, in); + fclose(in); + if( nRead!=1 ){ + free(pBuf); + return 0; + } + pBuf[nIn] = 0; + if( pnByte ) *pnByte = nIn; + return pBuf; +} +#endif /* STANDALONE */ + +#ifdef STANDALONE +int main(int argc, char **argv){ + int i; + int prevAmt = -1; + LLVMFuzzerInitialize(&argc, &argv); + for(i=1; i Date: Fri, 11 Jan 2019 13:32:23 +0000 Subject: [PATCH 036/306] The keywords TRUE and FALSE should only act as boolean literal values if unquoted. FossilOrigin-Name: 5547f39de993c708f72301ef25df190a2f007e0c4253799bdd9e86bb1ae41777 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 8 ++++---- src/parse.y | 3 +-- src/sqliteInt.h | 2 ++ src/util.c | 7 ++++++- 6 files changed, 23 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index aea19fe247..1b305cadb8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Separate\smakefile\stargets\sfor\s"dbfuzz2",\s"dbfuzz2-asan",\sand\s"dbfuzz2-msan". -D 2019-01-11T13:03:06.705 +C The\skeywords\sTRUE\sand\sFALSE\sshould\sonly\sact\sas\sboolean\sliteral\svalues\sif\nunquoted. +D 2019-01-11T13:32:23.943 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -464,7 +464,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab -F src/expr.c 9ad9c40a83c4218d79de19153b7a8ba7810564a123af7e09281927990bea2964 +F src/expr.c 01aa7e667b65fc18ccbe41d00c9a114cb2658831be13d9847a376a88ba2f3ae9 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c aaf28be73ab21e1e8bf4ac6b94269ebc8c93238d1e6997cb44b527b622e8ae6f F src/func.c 6cf832abbc2815fdb46fee654df32a66ab77deb47bf4cff04a5774dafecd497a @@ -501,7 +501,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 75e0f3cfa3962c714f519f8a3d1e67ecca1c91de0e010a036b988e40ce9e4c73 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y a3c0db595bc642c6ee1d72869842f7f5b0b6ebeb91c21d0a7cba631d27e7afbd +F src/parse.y e801b38c434b9cb30506dcf8e16b5641a5d54f26ca957a8313372c5156ded86e F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 @@ -517,7 +517,7 @@ F src/shell.c.in 0722a9e3a1b23674f07c194b8f71c953c775bad280e7f179a32bf72cd009b56 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 829bebd46e570fc1a22923df111417145b394b9c198a9c68c2d7b9a4243b9c29 +F src/sqliteInt.h 348bc49c8e03865d1bdbe350e3e5708af972210d92307c5b467caa25544705c0 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -581,7 +581,7 @@ F src/trigger.c 77546bf525854aa4dc09f3a0450fa801c3e99d5f13a3eb2efd07bfe521e3b5d6 F src/update.c 4e630e47852e206d0b29ec63ea0402e0b7ba328a1c19dd645ae8ac7bd0a378cf F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 -F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157 +F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca F src/vdbe.c 1919d490e97bfc59eab4d43444a53a6717d06137295ed684a25e5df7430d9974 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 @@ -1797,7 +1797,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 240f1c0c92cad8a1c19438b38489aedb831f62a4603c53f22367e876d8f644ff -R 97cd1020543aae6c3b535334385150bf +P ea119641a7edcd0e1ec14371d93e35f860971888bd98cb0019253358a2ef123b +R 4eecebacc4e6734941d82a3d523ec21e U drh -Z dd51adc1b571f184664beeec5f4ba112 +Z b60d127ddfa423bbb0ec667e5145ee61 diff --git a/manifest.uuid b/manifest.uuid index 5a6181fd64..5949cbaa10 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea119641a7edcd0e1ec14371d93e35f860971888bd98cb0019253358a2ef123b \ No newline at end of file +5547f39de993c708f72301ef25df190a2f007e0c4253799bdd9e86bb1ae41777 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 8754bbe78e..c03caa6c6b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -780,8 +780,7 @@ Expr *sqlite3ExprAlloc( if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n); pNew->u.zToken[pToken->n] = 0; if( dequote && sqlite3Isquote(pNew->u.zToken[0]) ){ - if( pNew->u.zToken[0]=='"' ) pNew->flags |= EP_DblQuoted; - sqlite3Dequote(pNew->u.zToken); + sqlite3DequoteExpr(pNew); } } } @@ -1812,8 +1811,9 @@ int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ */ int sqlite3ExprIdToTrueFalse(Expr *pExpr){ assert( pExpr->op==TK_ID || pExpr->op==TK_STRING ); - if( sqlite3StrICmp(pExpr->u.zToken, "true")==0 - || sqlite3StrICmp(pExpr->u.zToken, "false")==0 + if( !ExprHasProperty(pExpr, EP_Quoted) + && (sqlite3StrICmp(pExpr->u.zToken, "true")==0 + || sqlite3StrICmp(pExpr->u.zToken, "false")==0) ){ pExpr->op = TK_TRUEFALSE; return 1; diff --git a/src/parse.y b/src/parse.y index 3f9384c86c..d75ba611dc 100644 --- a/src/parse.y +++ b/src/parse.y @@ -955,8 +955,7 @@ idlist(A) ::= nm(Y). memcpy(p->u.zToken, t.z, t.n); p->u.zToken[t.n] = 0; if( sqlite3Isquote(p->u.zToken[0]) ){ - if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; - sqlite3Dequote(p->u.zToken); + sqlite3DequoteExpr(p); } #if SQLITE_MAX_EXPR_DEPTH>0 p->nHeight = 1; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d701e3fe3e..fe0bd62261 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2522,6 +2522,7 @@ struct Expr { #define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ #define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ #define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ +#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ /* ** The EP_Propagate mask is a set of properties that automatically propagate @@ -3814,6 +3815,7 @@ char *sqlite3VMPrintf(sqlite3*,const char*, va_list); void sqlite3SetString(char **, sqlite3*, const char*); void sqlite3ErrorMsg(Parse*, const char*, ...); void sqlite3Dequote(char*); +void sqlite3DequoteExpr(Expr*); void sqlite3TokenInit(Token*,char*); int sqlite3KeywordCode(const unsigned char*, int); int sqlite3RunParser(Parse*, const char*, char **); diff --git a/src/util.c b/src/util.c index 54f9b93887..8432d897f9 100644 --- a/src/util.c +++ b/src/util.c @@ -238,7 +238,7 @@ void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ ** dequoted string, exclusive of the zero terminator, if dequoting does ** occur. ** -** 2002-Feb-14: This routine is extended to remove MS-Access style +** 2002-02-14: This routine is extended to remove MS-Access style ** brackets from around identifiers. For example: "[a-b-c]" becomes ** "a-b-c". */ @@ -264,6 +264,11 @@ void sqlite3Dequote(char *z){ } z[j] = 0; } +void sqlite3DequoteExpr(Expr *p){ + assert( sqlite3Isquote(p->u.zToken[0]) ); + p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted; + sqlite3Dequote(p->u.zToken); +} /* ** Generate a Token object from a string From 26391eeefe25dcaacb34e18e7042a890f05d15d1 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Jan 2019 14:22:33 +0000 Subject: [PATCH 037/306] Add the "dbfuzz2" target to main.mk. Remove an unused local variable from dbfuzz2.c. FossilOrigin-Name: 05c7609cfd02f49114876267d7090f4e0ea2467f3aa7c65019c5986ec8f60a87 --- main.mk | 14 ++++++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- test/dbfuzz2.c | 1 - 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/main.mk b/main.mk index 65c2c9dc23..9ec0a6dbe6 100644 --- a/main.mk +++ b/main.mk @@ -574,6 +574,20 @@ dbfuzz$(EXE): $(TOP)/test/dbfuzz.c sqlite3.c sqlite3.h $(DBFUZZ_OPT) $(TOP)/test/dbfuzz.c sqlite3.c \ $(TLIBS) $(THREADLIB) +DBFUZZ2_OPTS = \ + -DSQLITE_THREADSAFE=0 \ + -DSQLITE_OMIT_LOAD_EXTENSION \ + -DSQLITE_ENABLE_DESERIALIZE \ + -DSQLITE_DEBUG \ + -DSQLITE_ENABLE_DBSTAT_VTAB \ + -DSQLITE_ENABLE_RTREE \ + -DSQLITE_ENABLE_FTS4 \ + -DSQLITE_ENABLE_FTS5 + +dbfuzz2$(EXE): $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + $(TCCX) -I. -g -O0 -DSTANDALONE -o dbfuzz2$(EXE) \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) $(THREADLIB) + fuzzcheck$(EXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h $(TOP)/test/ossfuzz.c $(TCCX) -o fuzzcheck$(EXE) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ -DSQLITE_ENABLE_MEMSYS5 $(FUZZCHECK_OPT) -DSQLITE_OSS_FUZZ \ diff --git a/manifest b/manifest index 1b305cadb8..3a592fd6d0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\skeywords\sTRUE\sand\sFALSE\sshould\sonly\sact\sas\sboolean\sliteral\svalues\sif\nunquoted. -D 2019-01-11T13:32:23.943 +C Add\sthe\s"dbfuzz2"\starget\sto\smain.mk.\s\sRemove\san\sunused\slocal\svariable\nfrom\sdbfuzz2.c. +D 2019-01-11T14:22:33.979 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -434,7 +434,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk cca1ecdd5dfe4579ded84e5abdd38e1866bbb8b8cf58d1a24496e9b1b65580d7 +F main.mk 8456b6b4a5ecdb7b6b59283236b3be6393bc7eed6cbda3bcf1d552e1a63e03ff F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -780,7 +780,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 5659cbbc01e38678c119c8a58071cac59d0d6c71837a385f3d1838012f12e1e1 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c e89fbe07f8188ff0b9a2cb5c742af23a69f81a0d101d0c104151e3459508ebf3 +F test/dbfuzz2.c a1221da27dd1a08900f25471fea65dc43abba2c110c03a815760744ccde9d8d0 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1797,7 +1797,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 ea119641a7edcd0e1ec14371d93e35f860971888bd98cb0019253358a2ef123b -R 4eecebacc4e6734941d82a3d523ec21e +P 5547f39de993c708f72301ef25df190a2f007e0c4253799bdd9e86bb1ae41777 +R ab42d90b18d096a2e03d11a8df7c0b73 U drh -Z b60d127ddfa423bbb0ec667e5145ee61 +Z 7e967bef866c326fb525219eb419a5f5 diff --git a/manifest.uuid b/manifest.uuid index 5949cbaa10..0bd9ede018 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5547f39de993c708f72301ef25df190a2f007e0c4253799bdd9e86bb1ae41777 \ No newline at end of file +05c7609cfd02f49114876267d7090f4e0ea2467f3aa7c65019c5986ec8f60a87 \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index b71561b2e5..9ce1d2249a 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -169,7 +169,6 @@ static unsigned char *readFile(const char *zName, int *pnByte){ #ifdef STANDALONE int main(int argc, char **argv){ int i; - int prevAmt = -1; LLVMFuzzerInitialize(&argc, &argv); for(i=1; i Date: Fri, 11 Jan 2019 14:38:47 +0000 Subject: [PATCH 038/306] Add the --vdbe-debug command-line option to dbfuzz2. FossilOrigin-Name: 599b4df43c64ce295517c804b6bb4c3ab77d77e0ba585dc0657274f55489a3b1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz2.c | 29 ++++++++++++++++++++++++++--- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 3a592fd6d0..f4b38ef12a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"dbfuzz2"\starget\sto\smain.mk.\s\sRemove\san\sunused\slocal\svariable\nfrom\sdbfuzz2.c. -D 2019-01-11T14:22:33.979 +C Add\sthe\s--vdbe-debug\scommand-line\soption\sto\sdbfuzz2. +D 2019-01-11T14:38:47.236 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -780,7 +780,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 5659cbbc01e38678c119c8a58071cac59d0d6c71837a385f3d1838012f12e1e1 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c a1221da27dd1a08900f25471fea65dc43abba2c110c03a815760744ccde9d8d0 +F test/dbfuzz2.c b31e0383472d88d25c0f2143e6f86ccef699703d3cee0d5865cef062e42ccf4b F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1797,7 +1797,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 5547f39de993c708f72301ef25df190a2f007e0c4253799bdd9e86bb1ae41777 -R ab42d90b18d096a2e03d11a8df7c0b73 +P 05c7609cfd02f49114876267d7090f4e0ea2467f3aa7c65019c5986ec8f60a87 +R 59f8d809003217ffe40e8229e82747b7 U drh -Z 7e967bef866c326fb525219eb419a5f5 +Z 065fa37efdf7cf83e88a09444acc4d6c diff --git a/manifest.uuid b/manifest.uuid index 0bd9ede018..879d48c37b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -05c7609cfd02f49114876267d7090f4e0ea2467f3aa7c65019c5986ec8f60a87 \ No newline at end of file +599b4df43c64ce295517c804b6bb4c3ab77d77e0ba585dc0657274f55489a3b1 \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 9ce1d2249a..0bf0f0888b 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -64,6 +64,9 @@ static const char *azSql[] = { /* Output verbosity level. 0 means complete silence */ int eVerbosity = 0; +/* True to activate PRAGMA vdbe_debug=on */ +static int bVdbeDebug = 0; + /* libFuzzer invokes this routine with fuzzed database files (in aData). ** This routine run SQLite against the malformed database to see if it ** can provoke a failure or malfunction. @@ -87,6 +90,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ sqlite3_deserialize(db, "main", a, nByte, nByte, SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE); + if( bVdbeDebug ){ + sqlite3_exec(db, "PRAGMA vdbe_debug=ON", 0, 0, 0); + } for(i=0; i=1 ){ printf("%s\n", azSql[i]); @@ -109,11 +115,24 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ return 0; } +/* +** Return the number of "v" characters in a string. Return 0 if there +** are any characters in the string other than "v". +*/ +static int numberOfVChar(const char *z){ + int N = 0; + while( z[0] && z[0]=='v' ){ + z++; + N++; + } + return z[0]==0 ? N : 0; +} + /* libFuzzer invokes this routine once when the executable starts, to ** process the command-line arguments. */ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ - int i, j; + int i, j, n; int argc = *pArgc; char **newArgv; char **argv = *pArgv; @@ -125,8 +144,12 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ if( z[0]=='-' ){ z++; if( z[0]=='-' ) z++; - if( strcmp(z,"v")==0 ){ - eVerbosity++; + if( z[0]=='v' && (n = numberOfVChar(z))>0 ){ + eVerbosity += n; + continue; + } + if( strcmp(z,"vdbe-debug")==0 ){ + bVdbeDebug = 1; continue; } } From f10ce63651927b471a965adfd7519d4d14d09392 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Jan 2019 14:46:44 +0000 Subject: [PATCH 039/306] Fix PRAGMA integrity_check so that it does not cancel the PRAGMA vdbe_debug setting. FossilOrigin-Name: aaa3a19f8cf5ba7003634e4610abc7832354af91d7c7f65469218678f66bcd46 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f4b38ef12a..277e116957 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--vdbe-debug\scommand-line\soption\sto\sdbfuzz2. -D 2019-01-11T14:38:47.236 +C Fix\sPRAGMA\sintegrity_check\sso\sthat\sit\sdoes\snot\scancel\sthe\sPRAGMA\svdbe_debug\nsetting. +D 2019-01-11T14:46:44.854 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -453,7 +453,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 9632272d3c41c7dab61bd96ae419ee5786b7b49cb14dc75a5550b20758c08893 +F src/btree.c 735e0cfc61678f063bc95e12971270206ee61b6c66406d25b3997ad17f823c02 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c 2a1b80dbe783649d4cc59e33e08fc7e563f15e05ec0f6365c441d45e16bcd481 @@ -1797,7 +1797,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 05c7609cfd02f49114876267d7090f4e0ea2467f3aa7c65019c5986ec8f60a87 -R 59f8d809003217ffe40e8229e82747b7 +P 599b4df43c64ce295517c804b6bb4c3ab77d77e0ba585dc0657274f55489a3b1 +R 45f241f3ac79b1a38c0ec8dd550770ca U drh -Z 065fa37efdf7cf83e88a09444acc4d6c +Z 879b7cd1fe883a82b97b58fcaeacbfc6 diff --git a/manifest.uuid b/manifest.uuid index 879d48c37b..3b2436e323 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -599b4df43c64ce295517c804b6bb4c3ab77d77e0ba585dc0657274f55489a3b1 \ No newline at end of file +aaa3a19f8cf5ba7003634e4610abc7832354af91d7c7f65469218678f66bcd46 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index cb8c756225..a5b62143d2 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9804,7 +9804,7 @@ char *sqlite3BtreeIntegrityCheck( Pgno i; IntegrityCk sCheck; BtShared *pBt = p->pBt; - int savedDbFlags = pBt->db->flags; + u64 savedDbFlags = pBt->db->flags; char zErr[100]; VVA_ONLY( int nRef ); From 2a58dbde30bf17497aaf77711496bf01cf72b90e Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Jan 2019 16:44:16 +0000 Subject: [PATCH 040/306] Improved detection of cell corruption in sqlite3VdbeRecordCompareWithSkip(). FossilOrigin-Name: fa47f4c6589c431cf678560ac33dea6b695052012bea2096b2c92869ed51c688 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeaux.c | 8 ++++---- test/fuzzdata7.db | Bin 16412672 -> 16412672 bytes 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 277e116957..8b7906c380 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sPRAGMA\sintegrity_check\sso\sthat\sit\sdoes\snot\scancel\sthe\sPRAGMA\svdbe_debug\nsetting. -D 2019-01-11T14:46:44.854 +C Improved\sdetection\sof\scell\scorruption\sin\ssqlite3VdbeRecordCompareWithSkip(). +D 2019-01-11T16:44:16.395 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -587,7 +587,7 @@ F src/vdbe.c 1919d490e97bfc59eab4d43444a53a6717d06137295ed684a25e5df7430d9974 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 -F src/vdbeaux.c b230f12642040c5ede19f092d9ad7510f75add84888e66a00108948dec574fd2 +F src/vdbeaux.c eb444562f0adbfb7e07b5a2a7ce4b21231c4c9d6d5b32411fcf806223b2bf6c5 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f @@ -987,7 +987,7 @@ F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db c8c5ef745ce43eb24d6903bff63ddc336464b6b4f9dfae817e7ec2ea0e541dbd +F test/fuzzdata7.db 8b478751a84cf559f6167eaee0210d5e9b93387c31437e71b46500d976c87e18 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1797,7 +1797,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 599b4df43c64ce295517c804b6bb4c3ab77d77e0ba585dc0657274f55489a3b1 -R 45f241f3ac79b1a38c0ec8dd550770ca +P aaa3a19f8cf5ba7003634e4610abc7832354af91d7c7f65469218678f66bcd46 +R c1b2c21631b6036f54a7027eb0d2a822 U drh -Z 879b7cd1fe883a82b97b58fcaeacbfc6 +Z 43ceb2c15935294e45a456ae6f63de4d diff --git a/manifest.uuid b/manifest.uuid index 3b2436e323..3a05c60a06 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aaa3a19f8cf5ba7003634e4610abc7832354af91d7c7f65469218678f66bcd46 \ No newline at end of file +fa47f4c6589c431cf678560ac33dea6b695052012bea2096b2c92869ed51c688 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index bd67b88589..1125cfd1a3 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -4251,12 +4251,12 @@ int sqlite3VdbeRecordCompareWithSkip( }else{ idx1 = getVarint32(aKey1, szHdr1); d1 = szHdr1; - if( d1>(unsigned)nKey1 ){ - pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; - return 0; /* Corruption */ - } i = 0; } + if( d1>(unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField diff --git a/test/fuzzdata7.db b/test/fuzzdata7.db index 01c825ce4f32b89bcac2e1788086a88785b01550..df356df47ca39b47521afe96322038bbc14e05d6 100644 GIT binary patch delta 789 zcmYMw)0Pkb007a=w%csmwrw}rws)(^wr$(CZQFJ|)mwAU{ecO3^g3M7Ka&Du1O@~Y znHTWCh%>v@jg>P*U@#IwLP{tJEny_Agp=?RK_W^di7Zhhszj6M5<_B2EQu{~B(B7h z_>w>pN}wc?#F9jkN-{|l>FBv4GWRlF1MY2jZ$u2o0r{t2{l1K7N zKFKcyq@Wa%!cs(vN--%eC8VU3lG0K}%1SvYFBPPsRFcY4MXE|QsV+67rqq(!Qb+1a zJ*h7Zq@gsD#?nNZ%D+F&q`9<^meNXEOB-n`?WDbQkdD$xI!hPnD&3^J^pKv?OL|Km z=_~!DzYLIpGDrr?5DAiC87jkMxF{oJq>Pf$GDgPAI2kV!WTH%x$udQz$~2iSGi0XB zlG!px=E^*oFAHR$ERw~tM3%}jSuQJNrL2Z74+qP|+PxWwq-~>H>6EWz&sY${IgbGzW zc+TdIrvgI<3`ass7zr!kB)mkBh!RO6OB9JJ(ImRWkeCunVoMx}EAb@0B#?v>Ac-Wg zB$1?&Op;3qNhzr$wWN`>l1|b~2FWOyB(r3ZtddQ#OAg5?xg@vbk-U;m@=F0JD21f3 z6p^A*Oo~gOl#r5AN=i!^DJ$iqyi|~iQb{UH6{#xKq`K6Qno>(@OC6~z^`yQukcQGo z8cP#tD$S(1{QqeoEv1#TmNwE>+DUuqARVQXbe1mCRk}%c=^;I(m-LoC(pUOPe;FVH zWsnS(Au?2kNstVe5i(Lni85No$XFRC<7I+Olu0sKrpQ#8Cevkx%#>L&Tjt1InJ4pQ zfdtD!StN@kM3%@>StiS6g{+iSvRc;2T3ILSWrJ*#O|n_G$X3}V+hvFBlwGo0_Q+n@ zC;R1q9F#+HSdPe1IVQ*Dgq)O9a$3&FSve=?<$_$4OLAGR$W^%}*X4%Xlv{FJ?#Nxa zC->!nJd{WBSf0pJc_z>0g}jtk@><@=TX`q%<%4{bPx4v5$XEF$-{pt=lwa~&{_Nmy GNVk92SY>kn From 2bd207ff6d3a1c83f133293a96ea691a0adb318c Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Jan 2019 17:19:59 +0000 Subject: [PATCH 041/306] Omit errors about missing SAVEPOINTs when aborting the .archive command in the CLI. FossilOrigin-Name: 2a47387ba6aa3c294607b7641aa1c4cf70a7b27a861e1098c2f79a38e5b7036a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8b7906c380..ed09660150 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sof\scell\scorruption\sin\ssqlite3VdbeRecordCompareWithSkip(). -D 2019-01-11T16:44:16.395 +C Omit\serrors\sabout\smissing\sSAVEPOINTs\swhen\saborting\sthe\s.archive\scommand\nin\sthe\sCLI. +D 2019-01-11T17:19:59.217 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -513,7 +513,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 5f2f987aacba7548d10781f808e1b933f80abe0b6bc8e9922bc18b1d1faba339 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 4b0be1bfd2d8668e2711f877682361e06b412c53ce7a56303f1f6978ec33eca8 -F src/shell.c.in 0722a9e3a1b23674f07c194b8f71c953c775bad280e7f179a32bf72cd009b569 +F src/shell.c.in b3cd745b53439674fdc3dc4db12e094d11cff91495be68bb09ac52726084b583 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1797,7 +1797,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 aaa3a19f8cf5ba7003634e4610abc7832354af91d7c7f65469218678f66bcd46 -R c1b2c21631b6036f54a7027eb0d2a822 +P fa47f4c6589c431cf678560ac33dea6b695052012bea2096b2c92869ed51c688 +R 254a1d7a527962cc4514f37b0edd1520 U drh -Z 43ceb2c15935294e45a456ae6f63de4d +Z 38fa272dba858ffd290fec63f7de6047 diff --git a/manifest.uuid b/manifest.uuid index 3a05c60a06..3dc0f9fce6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa47f4c6589c431cf678560ac33dea6b695052012bea2096b2c92869ed51c688 \ No newline at end of file +2a47387ba6aa3c294607b7641aa1c4cf70a7b27a861e1098c2f79a38e5b7036a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index b468c6f79d..747965b0de 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -5749,7 +5749,7 @@ static int arCreateOrUpdateCommand( } end_ar_transaction: if( rc!=SQLITE_OK ){ - arExecSql(pAr, "ROLLBACK TO ar; RELEASE ar;"); + sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); }else{ rc = arExecSql(pAr, "RELEASE ar;"); if( pAr->bZip && pAr->zFile ){ From 1735f91df4db4d012154af319245392555c01911 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Jan 2019 17:20:25 +0000 Subject: [PATCH 042/306] Improved detection and reporting of errors in the readfile() extension SQL function. FossilOrigin-Name: d2f0b5a483869d39f5c5814c9d6df3d3b8a46d582b4dcf0cf11e23b707c4213e --- ext/misc/fileio.c | 33 +++++++++++++++++++++++++++++---- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index 2219aafa0d..34fa0b92c8 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -121,22 +121,47 @@ SQLITE_EXTENSION_INIT1 /* ** Set the result stored by context ctx to a blob containing the -** contents of file zName. +** contents of file zName. Or, leave the result unchanged (NULL) +** if the file does not exist or is unreadable. +** +** If the file exceeds the SQLite blob size limit, through an +** SQLITE_TOOBIG error. +** +** Throw an SQLITE_IOERR if there are difficulties pulling the file +** off of disk. */ static void readFileContents(sqlite3_context *ctx, const char *zName){ FILE *in; - long nIn; + sqlite3_int64 nIn; void *pBuf; + sqlite3 *db; + int mxBlob; in = fopen(zName, "rb"); - if( in==0 ) return; + if( in==0 ){ + /* File does not exist or is unreadable. Leave the result set to NULL. */ + return; + } fseek(in, 0, SEEK_END); nIn = ftell(in); rewind(in); + db = sqlite3_context_db_handle(ctx); + mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1); + if( nIn>mxBlob ){ + sqlite3_result_error_code(ctx, SQLITE_TOOBIG); + fclose(in); + return; + } pBuf = sqlite3_malloc( nIn ); - if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ + if( pBuf==0 ){ + sqlite3_result_error_nomem(ctx); + fclose(in); + return; + } + if( 1==fread(pBuf, nIn, 1, in) ){ sqlite3_result_blob(ctx, pBuf, nIn, sqlite3_free); }else{ + sqlite3_result_error_code(ctx, SQLITE_IOERR); sqlite3_free(pBuf); } fclose(in); diff --git a/manifest b/manifest index ed09660150..5ba485eeb9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\serrors\sabout\smissing\sSAVEPOINTs\swhen\saborting\sthe\s.archive\scommand\nin\sthe\sCLI. -D 2019-01-11T17:19:59.217 +C Improved\sdetection\sand\sreporting\sof\serrors\sin\sthe\sreadfile()\sextension\sSQL\nfunction. +D 2019-01-11T17:20:25.808 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -285,7 +285,7 @@ F ext/misc/csv.c 7f047aeb68f5802e7ce6639292095d622a488bb43526ed04810e0649faa71ce F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c 03ba86d5b3d5c88977a63907de2941ea7723f1930f5f547056f0aff1bf228a25 +F ext/misc/fileio.c 801d2ac9faff0d7d59c1f595dc26d32920a793f4291d81322b1837d0b3e160f0 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1797,7 +1797,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 fa47f4c6589c431cf678560ac33dea6b695052012bea2096b2c92869ed51c688 -R 254a1d7a527962cc4514f37b0edd1520 +P 2a47387ba6aa3c294607b7641aa1c4cf70a7b27a861e1098c2f79a38e5b7036a +R 129c4eddb5f6e683d9d87be4a27619ca U drh -Z 38fa272dba858ffd290fec63f7de6047 +Z 79baa7f42e4c59f65e60be610fef78d9 diff --git a/manifest.uuid b/manifest.uuid index 3dc0f9fce6..5f136bcdf5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2a47387ba6aa3c294607b7641aa1c4cf70a7b27a861e1098c2f79a38e5b7036a \ No newline at end of file +d2f0b5a483869d39f5c5814c9d6df3d3b8a46d582b4dcf0cf11e23b707c4213e \ No newline at end of file From e6370e9c29f3edff1c903d8c87a7b513b7ab5317 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Jan 2019 17:41:23 +0000 Subject: [PATCH 043/306] Fix a problem handling a negative value in the "number-of-pages" database header field. Also a problem with running "REINDEX tbl" against a virtual table for which the SQL passed to sqlite3_declare_vtab() contains PRIMARY KEY or UNIQUE constraints. FossilOrigin-Name: 556dd8922f65af93084ee725c638b8dc696b611dd508c212a3b507d6ca474031 --- ext/rtree/rtree1.test | 14 +++++ manifest | 21 +++---- manifest.uuid | 2 +- src/btree.c | 8 +-- src/build.c | 14 +++-- test/corruptL.test | 136 ++++++++++++++++++++++++++++++++++++++++++ test/resetdb.test | 4 +- 7 files changed, 176 insertions(+), 23 deletions(-) create mode 100644 test/corruptL.test diff --git a/ext/rtree/rtree1.test b/ext/rtree/rtree1.test index bdaad542d2..77494573b6 100644 --- a/ext/rtree/rtree1.test +++ b/ext/rtree/rtree1.test @@ -647,5 +647,19 @@ do_execsql_test 16.130 { SELECT * FROM rt1 WHERE id IN (1, 2, 3, 4); } {1 1.0 2.0 aux1 2 2.0 3.0 aux2 3 3.0 4.0 aux3 4 4.0 5.0 aux4} +reset_db +do_execsql_test 17.0 { + CREATE VIRTUAL TABLE t1 USING rtree(id, x1 PRIMARY KEY, x2, y1, y2); + CREATE VIRTUAL TABLE t2 USING rtree(id, x1, x2, y1, y2 UNIQUE); +} +do_execsql_test 17.1 { + REINDEX t1; + REINDEX t2; +} {} + +do_execsql_test 17.2 { + REINDEX; +} {} + expand_all_sql db finish_test diff --git a/manifest b/manifest index 5ba485eeb9..03c73091dc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sand\sreporting\sof\serrors\sin\sthe\sreadfile()\sextension\sSQL\nfunction. -D 2019-01-11T17:20:25.808 +C Fix\sa\sproblem\shandling\sa\snegative\svalue\sin\sthe\s"number-of-pages"\sdatabase\nheader\sfield.\sAlso\sa\sproblem\swith\srunning\s"REINDEX\stbl"\sagainst\sa\svirtual\ntable\sfor\swhich\sthe\sSQL\spassed\sto\ssqlite3_declare_vtab()\scontains\sPRIMARY\sKEY\nor\sUNIQUE\sconstraints. +D 2019-01-11T17:41:23.958 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -368,7 +368,7 @@ F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 603ec9b72cd70cf18541339b6c7d47f304ac0d84c50294be6c6c6ae35acdb0a6 F ext/rtree/rtree.c 1e0fd7e850cadcfdf83cf6b59077c8a9ecfb79ad6af930b74edf88b456154ab2 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 309afc04d4287542b2cd74f933296832cc681c7b014d9405cb329b62053a5349 +F ext/rtree/rtree1.test 7573134f1b4f59df36c1b0a6de51268fd3b9c714d91f3811482263e734e416ea F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b @@ -453,10 +453,10 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 735e0cfc61678f063bc95e12971270206ee61b6c66406d25b3997ad17f823c02 +F src/btree.c 789380da841ec283bf75c8b3e2c6423fed63ac16193b247cd43335f07e95f355 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 -F src/build.c 2a1b80dbe783649d4cc59e33e08fc7e563f15e05ec0f6365c441d45e16bcd481 +F src/build.c b1e24f1deedee07955cad9c56928cdafa7df1615746688e817bfe0b020a68576 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -754,6 +754,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 +F test/corruptL.test 7992f33562c23eb24430521ab70e59bc17829969fc70c8f8bf2bab573dc73616 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf @@ -1216,7 +1217,7 @@ F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 F test/releasetest.tcl b290d538ffcb2ff711f09eadc7396c1a42580f3fb078605471dc8875ca0b4d1e x -F test/resetdb.test 373a9eb8fcbd58bf87affec6a88c6353038f98a5d25be5ab75a0b9636c462a36 +F test/resetdb.test 117519739a9570d1152161bd72bb8a40d1a39599b011467a478e2b9fa1eec2a1 F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 @@ -1797,7 +1798,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 2a47387ba6aa3c294607b7641aa1c4cf70a7b27a861e1098c2f79a38e5b7036a -R 129c4eddb5f6e683d9d87be4a27619ca -U drh -Z 79baa7f42e4c59f65e60be610fef78d9 +P d2f0b5a483869d39f5c5814c9d6df3d3b8a46d582b4dcf0cf11e23b707c4213e +R dbf44d113e88de2949ee12fc8ce79fce +U dan +Z 9cbae88a29b6f7b02805446f3dcaf9cf diff --git a/manifest.uuid b/manifest.uuid index 5f136bcdf5..8f9b34e752 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d2f0b5a483869d39f5c5814c9d6df3d3b8a46d582b4dcf0cf11e23b707c4213e \ No newline at end of file +556dd8922f65af93084ee725c638b8dc696b611dd508c212a3b507d6ca474031 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index a5b62143d2..43c71ec71d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3004,9 +3004,9 @@ static int newDatabase(BtShared*); static int lockBtree(BtShared *pBt){ int rc; /* Result code from subfunctions */ MemPage *pPage1; /* Page 1 of the database file */ - int nPage; /* Number of pages in the database */ - int nPageFile = 0; /* Number of pages in the database file */ - int nPageHeader; /* Number of pages in the database according to hdr */ + u32 nPage; /* Number of pages in the database */ + u32 nPageFile = 0; /* Number of pages in the database file */ + u32 nPageHeader; /* Number of pages in the database according to hdr */ assert( sqlite3_mutex_held(pBt->mutex) ); assert( pBt->pPage1==0 ); @@ -3019,7 +3019,7 @@ static int lockBtree(BtShared *pBt){ ** a valid database file. */ nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); - sqlite3PagerPagecount(pBt->pPager, &nPageFile); + sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile); if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ nPage = nPageFile; } diff --git a/src/build.c b/src/build.c index 68e708129e..0d734c1075 100644 --- a/src/build.c +++ b/src/build.c @@ -4423,13 +4423,15 @@ static int collationMatch(const char *zColl, Index *pIndex){ */ #ifndef SQLITE_OMIT_REINDEX static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ - Index *pIndex; /* An index associated with pTab */ + if( !IsVirtual(pTab) ){ + Index *pIndex; /* An index associated with pTab */ - for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ - if( zColl==0 || collationMatch(zColl, pIndex) ){ - int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3RefillIndex(pParse, pIndex, -1); + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( zColl==0 || collationMatch(zColl, pIndex) ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + } } } } diff --git a/test/corruptL.test b/test/corruptL.test new file mode 100644 index 0000000000..31add032b8 --- /dev/null +++ b/test/corruptL.test @@ -0,0 +1,136 @@ +# 2019-01-11 +# +# 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. +# +#*********************************************************************** +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix corruptL + +database_may_be_corrupt + +#------------------------------------------------------------------------- +reset_db +do_test 1.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 356352 pagesize 4096 filename crash-acaae0347204ae.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 d0 00 00 00 .....@ ........ +| 32: 40 00 ea 00 00 00 00 00 00 40 00 00 00 40 00 00 @........@...@.. +| 96: 00 00 00 00 0d 00 00 00 04 0e 9c 00 0f ad 0f 4f ...............O +| 112: 0e fc 0e 9c 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3728: 00 00 00 00 00 00 00 00 00 00 00 00 5e 04 07 17 ............^... +| 3744: 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 72 .....tablet1_par +| 3760: 65 6e 74 74 31 5f 70 61 72 65 6e 74 04 43 52 45 entt1_parent.CRE +| 3776: 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 61 ATE TABLE .t1_pa +| 3792: 72 65 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 rent.(nodeno INT +| 3808: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3824: 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 03 06 17 ,parentnode)Q... +| 3840: 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 65 ....tablet1_node +| 3856: 74 31 5f 6e 6f 64 65 03 43 52 45 41 54 45 20 54 t1_node.CREATE T +| 3872: 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 6e ABLE .t1_node.(n +| 3888: 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 odeno INTEGER PR +| 3904: 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 5c IMARY KEY,data). +| 3920: 02 07 17 1d 1d 01 81 0b 74 61 62 6c 65 74 31 5f ........tablet1_ +| 3936: 72 6f 77 69 64 74 31 5f 72 6f 77 69 64 02 43 52 rowidt1_rowid.CR +| 3952: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 72 EATE TABLE .t1_r +| 3968: 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 45 owid.(rowid INTE +| 3984: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY, +| 4000: 6e 6f 64 65 6e 6f 2c 61 30 2c 61 31 29 51 01 07 nodeno,a0,a1)Q.. +| 4016: 17 11 11 08 81 0f 74 61 62 6c 65 74 31 74 31 43 ......tablet1t1C +| 4032: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 4048: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 BLE t1 USING rtr +| 4064: 65 65 28 69 64 2c 78 30 20 50 52 49 4d 41 52 59 ee(id,x0 PRIMARY +| 4080: 20 4b 45 59 2c 70 61 72 65 6e 74 6e 6f 64 65 29 KEY,parentnode) +| page 2 offset 4096 +| 0: 51 03 06 17 1b 1b 01 7b 74 61 62 6c 65 74 31 5f Q.......tablet1_ +| 16: 6e 6f 64 65 74 31 5f 6e 6f 64 65 03 43 52 45 41 nodet1_node.CREA +| 32: 54 45 20 54 41 42 4c 45 20 22 74 31 5f 6e 6f 64 TE TABLE .t1_nod +| 48: 65 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45 e.(nodeno INTEGE +| 64: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 64 61 R PRIMARY KEY,da +| 80: 74 61 29 5c 02 07 17 1d 1d 01 81 0b 74 61 62 6c ta).........tabl +| 96: 65 74 31 5f 72 6f 77 69 64 74 31 5f 72 6f 77 69 et1_rowidt1_rowi +| 112: 64 02 43 52 45 41 54 45 20 54 41 42 4c 45 00 00 d.CREATE TABLE.. +| 128: 01 0a 02 00 00 00 01 0e 0d 00 00 00 00 24 0e 0d .............$.. +| 144: 0c 1a 06 85 50 46 60 27 70 08 00 00 00 00 00 00 ....PF`'p....... +| 3824: 00 00 00 00 00 00 00 0d 0e 05 00 09 1d 00 74 6f ..............to +| 3840: 79 20 68 61 6c 66 10 0d 05 00 09 23 00 62 6f 74 y half.....#.bot +| 3856: 74 6f 6d 20 68 61 6c 66 0f 0c 05 00 09 21 00 72 tom half.....!.r +| 3872: 69 67 68 74 20 68 61 6c 66 0e 0b 05 00 09 1f 00 ight half....... +| 3888: 6c 65 66 74 20 43 15 f6 e6 f6 46 50 34 35 24 54 left C....FP45$T +| 3904: 15 44 52 05 44 14 24 c4 52 02 27 43 15 f6 e6 f6 .DR.D.$.R.'C.... +| 3920: 46 52 22 8e 6f 64 65 6e 6f 20 49 4e 54 45 47 45 FR..odeno INTEGE +| 3936: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 64 61 R PRIMARY KEY,da +| 3952: 74 61 29 5c 02 07 17 1d 1d 01 81 0b 74 61 62 6c ta).........tabl +| 3968: 65 74 31 5f 72 6f 74 74 6f 6d 20 65 64 67 65 0f et1_rottom edge. +| 3984: 07 05 00 09 21 00 72 69 67 68 74 20 65 64 67 65 ....!.right edge +| 4000: 0e 06 05 00 09 1f 00 6c 65 66 74 20 65 64 67 65 .......left edge +| 4016: 0b 05 05 00 09 19 00 63 65 6e 74 65 72 17 04 05 .......center... +| 4032: 00 09 31 00 75 70 70 65 72 2d 72 69 67 68 74 20 ..1.upper-right +| 4048: 63 6f 72 6e 65 72 17 03 05 00 09 31 00 6c 6f 77 corner.....1.low +| 4064: 65 72 2d 72 69 67 68 74 20 63 6f 72 6e 65 72 16 er-right corner. +| 4080: 02 05 00 09 2f 00 75 70 70 65 72 2d 6c 65 66 74 ..../.upper-left +| page 3 offset 8192 +| 0: 20 63 6f 72 6e 65 72 16 01 05 00 09 2f 01 8c 6f corner...../..o +| 16: 77 65 72 2d 6c 53 51 4c 69 74 65 20 66 6f 72 6d wer-lSQLite form +| 32: 61 74 20 33 00 10 00 01 01 00 40 20 20 00 00 00 at 3......@ ... +| 48: 00 00 00 00 2f 00 00 0d eb 13 00 00 00 03 00 00 ..../........... +| 64: 00 04 00 00 00 00 00 00 00 06 00 00 00 01 00 00 ................ +| 80: 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 ................ +| page 6 offset 20480 +| 128: 00 00 00 00 00 00 00 00 97 3d 04 ae 7c 01 00 00 .........=..|... +| 624: 00 00 00 00 00 00 21 97 3d 04 ae 7c 01 00 00 00 ......!.=..|.... +| 1120: 00 00 00 00 00 20 97 3d 04 ae 7c 01 00 00 00 00 ..... .=..|..... +| 1616: 00 00 00 00 1f 97 3d 04 ae 7c 01 00 00 00 00 00 ......=..|...... +| 2112: 00 00 00 1e 97 3d 04 ae 7c 01 00 00 00 00 00 00 .....=..|....... +| 2608: 00 00 1d 97 d3 d0 4a e7 c0 00 00 00 00 00 00 00 ......J......... +| 3088: 00 00 00 00 00 00 00 00 00 00 00 00 01 f3 00 00 ................ +| 3600: 23 97 3d 04 ae 7c 01 00 00 00 00 00 00 00 00 00 #.=..|.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 26 ...............& +| page 8 offset 28672 +| 0: 0d 00 00 00 01 04 30 00 04 30 00 00 00 00 00 00 ......0..0...... +| 1072: 97 4d 1e 14 00 ae 7c 00 00 00 00 00 00 00 00 00 .M....|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................ +| page 10 offset 36864 +| 0: 0d 00 00 00 01 04 30 00 04 30 00 00 00 00 00 00 ......0..0...... +| 1072: 9a ee c1 80 fd 78 1f ce 1b ae eb b4 00 00 00 00 .....x.......... +| 1088: 13 20 ff 20 00 70 00 00 00 60 50 00 00 00 11 e0 . . .p...`P..... +| 1104: 00 00 00 70 00 00 00 60 50 05 35 14 c6 97 46 52 ...p...`P.5...FR +| 1120: 06 66 f7 26 d6 17 42 03 30 01 00 00 10 10 04 02 .f.&..B.0....... +| 1136: 02 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 .........@...... +| 1152: 00 00 00 00 00 40 00 00 00 40 00 00 00 00 00 00 .....@...@...... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 ................ +| page 12 offset 45056 +| 0: 0d 00 00 00 01 04 30 00 04 30 e1 b4 30 97 4d 46 ......0..0..0.MF +| 16: 14 00 ae 7c 00 00 00 00 00 00 00 03 00 00 43 00 ...|..........C. +| page 47 offset 188416 +| 2512: 00 00 00 00 00 00 00 00 be 00 00 00 00 00 00 00 ................ +| page 87 offset 352256 +| 2512: 00 00 00 00 00 00 00 00 aa 00 00 00 00 00 00 00 ................ +| end crash-acaae0347204ae.db +}]} {} + +do_catchsql_test 1.1 { + PRAGMA cell_size_check = off; + DROP INDEX t1x1; +} {1 {no such index: t1x1}} + +do_catchsql_test 1.2 { + SELECT sum(s+length(b)) FROM t1 WHERE a IN (110,10,150) AND q IS NULL; +} {1 {no such table: t1}} + +do_catchsql_test 1.3 { + REINDEX t1; +} {1 {unable to identify the object to be reindexed}} + +finish_test diff --git a/test/resetdb.test b/test/resetdb.test index de2dfcffa3..9d249235e8 100644 --- a/test/resetdb.test +++ b/test/resetdb.test @@ -70,12 +70,12 @@ do_test 200 { UPDATE sqlite_dbpage SET data=randomblob(4096) WHERE pgno=1; PRAGMA quick_check; } -} {1 {unsupported file format}} +} {1 {file is not a database}} do_test 201 { catchsql { PRAGMA quick_check; } db2 -} {1 {unsupported file format}} +} {1 {file is not a database}} do_test 210 { # Reset the database file using SQLITE_DBCONFIG_RESET_DATABASE From 0ad63e5e0cc74c7fd20d0862d1cf457691db72de Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Jan 2019 19:27:55 +0000 Subject: [PATCH 044/306] Fix another problem with corrupt databases in fts5. FossilOrigin-Name: 9bf811ea89a133d481a86407683a7518e909eccb7aa3aa02f7932bdb33387572 --- ext/fts5/fts5_varint.c | 2 +- ext/fts5/test/fts5corrupt3.test | 200 ++++++++++++++++++++++++++++++++ manifest | 14 +-- manifest.uuid | 2 +- 4 files changed, 209 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_varint.c b/ext/fts5/fts5_varint.c index b249e60c51..12fac2d485 100644 --- a/ext/fts5/fts5_varint.c +++ b/ext/fts5/fts5_varint.c @@ -76,7 +76,7 @@ int sqlite3Fts5GetVarint32(const unsigned char *p, u32 *v){ u8 n; p -= 2; n = sqlite3Fts5GetVarint(p, &v64); - *v = (u32)v64; + *v = ((u32)v64) & 0x7FFFFFFF; assert( n>3 && n<=9 ); return n; } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 00cda24220..e8a2f0938a 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -3718,6 +3718,206 @@ do_catchsql_test 32.5 { SELECT fts5_decode(id, block) FROM t2_data; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 33.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-fed6e90021ba5d.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 08 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 06 0d b6 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d b6 00 00 00 00 00 00 ...k............ +| 3504: 00 00 00 00 00 00 56 07 06 17 1f 1f 01 7d 74 61 ......V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 8a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsi.et1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c af 00 0f e6 0f ef 0c af 00 00 ................ +| 3232: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 86 ................ +| 3248: 2f 84 80 80 80 80 01 04 00 8c 62 00 00 03 12 02 /.........b..... +| 3264: 30 30 01 04 05 03 01 04 05 03 01 04 05 03 1f 02 00.............. +| 3280: 03 01 02 03 01 02 03 01 08 35 30 30 30 30 30 30 .........5000000 +| 3296: 30 1c 02 04 01 0e ee ca ec ea ea ab e4 f5 ca b1 0............... +| 3312: ac ee ec de ef 3e ee ca ee ec f2 f8 0f f0 0f e8 .....>.......... +| 3328: 0f e0 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 ................ +| 3344: 0f a0 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 ...........x.p.h +| 3360: 0f 60 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 .`.X.P.H.@.8.0.( +| 3376: 0f 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 . .............. +| 3392: 0e e0 02 03 01 02 03 01 02 03 02 07 6f 6d 70 69 ............ompi +| 3408: 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 62 ler...........db +| 3424: 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 65 stat...........e +| 3440: 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 6e bug...........en +| 3456: 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 02 able............ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3520: 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 04 .....xtension... +| 3536: 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 03 ........fts4.... +| 3552: 01 02 01 02 03 04 01 35 0d 02 03 01 02 03 01 02 .......5........ +| 3568: 03 01 07 67 65 6f 70 6f 6c 79 10 02 03 01 02 03 ...geopoly...... +| 3584: 01 02 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 .....json1...... +| 3600: 01 02 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 .....load....... +| 3616: 02 03 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 ....max......... +| 3632: 02 05 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 ..emory......... +| 3648: 04 04 73 79 73 35 16 02 03 01 02 03 01 02 03 01 ..sys5.......... +| 3664: 06 6e 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 .nocase......... +| 3680: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3696: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3712: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3728: 01 02 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 .....omit....... +| 3744: 02 02 01 05 72 74 72 65 65 19 02 03 01 02 03 01 ....rtree....... +| 3760: 02 03 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 ....im.......... +| 3776: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3792: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3808: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3824: 02 02 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 ....threadsafe.. +| 3840: 02 01 02 02 01 02 02 01 04 76 74 61 62 07 02 04 .........vtab... +| 3856: 01 02 04 01 02 04 01 01 78 01 06 01 01 02 01 06 ........x....... +| 3872: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3888: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3904: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3920: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3936: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3952: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3968: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3984: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 4000: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 4016: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4032: 01 01 02 01 06 01 01 02 01 06 01 01 02 04 18 13 ................ +| 4048: 0c 44 10 12 11 0f 47 13 0f 0c 12 10 0f 0e 10 0f .D....G......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 57 24 24 0f D..@.......$W$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 1f 00 0f df 0f bd 0f 9b 0f 89 ....$........... +| 16: 0f 76 0f 63 0f 44 0f 24 0f 04 0e ec 0e d3 0e ba .v.c.D.$........ +| 32: 0e a2 0e 89 0e 70 0e 55 0e 39 0e 1d 0e 04 0d ea .....p.U.9...... +| 48: 0d d0 0d b5 0d 99 0d 7d 0d 64 0d 4a 0d 30 0d 10 .........d.J.0.. +| 64: 0c ef 0c ce 0c ae 54 d5 35 95 33 55 84 24 94 e4 ......T.5.3U.$.. +| 80: 15 25 91 a1 70 50 02 90 f1 94 54 e4 14 24 c4 52 .%..pP....T..$.R +| 96: 04 d4 54 d5 35 95 33 55 84 e4 f4 34 15 34 51 91 ..T.5.3U...4.4Q. +| 112: 60 50 02 90 f1 74 54 e4 14 24 c4 52 04 d4 54 d5 `P...tT..$.R..T. +| 128: 35 95 33 55 85 25 45 24 94 d1 81 50 50 02 50 f1 5.3U.%E$...PP.P. +| 144: 94 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 84 24 94 .T..$.R..4....$. +| 160: e4 15 25 91 81 40 50 02 50 f1 94 54 e4 14 24 c4 ..%..@P.P..T..$. +| 176: 52 04 a5 34 f4 e3 15 84 e4 f4 34 15 34 51 71 30 R..4......4.4Qq0 +| 192: 50 02 50 f1 74 54 e4 14 24 c4 52 04 ae 4f 41 33 P.P.tT..$.R..OA3 +| 208: 55 85 25 45 24 94 d1 a1 20 50 02 90 f1 94 54 e4 U.%E$... P....T. +| 224: 14 24 c4 52 04 74 54 f5 04 f4 c5 95 84 24 94 e4 .$.R.tT......$.. +| 240: 15 25 91 a1 10 50 02 90 f1 94 54 e4 14 24 c4 52 .%...P....T..$.R +| 256: 04 74 54 f5 04 f4 c5 95 84 e4 f4 34 15 34 51 91 .tT........4.4Q. +| 272: 00 50 02 90 f1 74 54 e4 14 24 c4 52 04 74 54 f5 .P...tT..$.R.tT. +| 288: 04 f4 c5 95 85 25 45 24 94 d1 70 f0 50 02 30 f1 .....%E$..p.P.0. +| 304: 94 54 e4 14 24 c4 52 04 65 45 33 55 84 24 94 e4 .T..$.R.eE3U.$.. +| 320: 15 25 91 70 e0 50 02 30 f1 94 54 e4 40 0f 38 0f .%.p.P.0..T.@.8. +| 336: 30 0f 28 0f 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e 0.(. ........... +| 352: f0 0e e8 0e e0 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 05 01 01 ................ +| 4080: 06 02 03 00 12 05 01 01 06 01 03 00 12 05 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 52 59 11 05 05 00 ..........RY.... +| 16: 17 0f 19 44 45 42 55 47 58 4e 4f 43 41 53 45 10 ...DEBUGXNOCASE. +| 32: 04 05 00 17 0f 17 44 45 42 55 47 58 52 54 52 49 ......DEBUGXRTRI +| 48: 4d 20 03 05 00 35 0f 19 43 4f 4d 50 49 4c 45 52 M ...5..COMPILER +| 64: 3d 63 6c 61 6e 67 2d 36 2e 30 2e 30 58 42 49 4e =clang-6.0.0XBIN +| 80: 41 52 59 20 02 05 00 35 0f 19 43 4f 4d 50 49 4c ARY ...5..COMPIL +| 96: 45 52 3d 63 6c 61 6e 67 2d 36 2e 30 2e 30 58 4e ER=clang-6.0.0XN +| 112: 4f 43 41 53 45 1f 01 05 00 35 0f 17 43 4f 4d 50 OCASE....5..COMP +| 128: 49 4c 45 52 3d 63 6c 61 6e 67 2d 36 2e 30 2e 30 ILER=clang-6.0.0 +| 144: 58 52 54 52 49 4d 0d 00 00 00 24 0e e0 00 0f 6f XRTRIM....$....o +| 160: 6e 74 65 6e 74 05 43 52 45 41 54 45 20 54 41 42 ntent.CREATE TAB +| 176: 4c 45 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 LE 't1_content'( +| 192: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 208: 52 59 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 RY KEY, c0, c1, +| 224: 63 32 29 69 04 07 17 19 19 01 81 2d 74 61 62 6c c2)i.......-tabl +| 240: 65 74 31 5f 69 64 78 74 31 5f 69 64 78 04 43 52 et1_idxt1_idx.CR +| 256: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 EATE TABLE 't1_i +| 272: 64 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c dx'(segid, term, +| 288: 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b pgno, PRIMARY K +| 304: 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 EY(segid, term)) +| 320: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 03 WITHOUT ROWIDU. +| 336: 07 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 .......tablet1_d +| 352: 61 74 61 74 31 5f 64 61 74 61 03 43 52 45 41 54 atat1_data.CREAT +| 368: 45 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 E TABLE 't1_data +| 384: 27 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 '(id INTEGER PRI +| 400: 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 MARY KEY, block +| 416: 42 4c 4f 42 29 38 02 06 17 11 11 08 5f 74 61 62 BLOB)8......_tab +| 432: 6c 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 let1t1CREATE VIR +| 448: 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 TUAL TABLE t1 US +| 464: 49 4e 47 20 66 74 73 35 28 61 2c 62 2c 63 29 00 ING fts5(a,b,c). +| 480: 00 00 39 00 00 00 00 00 00 00 00 00 00 00 00 00 ..9............. +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-fed6e90021ba5d.db +}]} {} + +do_execsql_test 33.1 { + CREATE VIRTUAL TABLE t2 USING fts5vocab('t1','row'); + CREATE VIRTUAL TABLE t3 USING fts5vocab('t1','col'); + CREATE VIRTUAL TABLE t4 USING fts5vocab('t1','instance'); +} + +do_catchsql_test 33.2 { + SELECT * FROM t2; +} {1 {database disk image is malformed}} + +do_catchsql_test 33.3 { + SELECT * FROM t2, t3, t4 WHERE t2.term=t3.term AND t3.term=t4.term; +} {1 {database disk image is malformed}} + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 03c73091dc..7a6f0192ae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\shandling\sa\snegative\svalue\sin\sthe\s"number-of-pages"\sdatabase\nheader\sfield.\sAlso\sa\sproblem\swith\srunning\s"REINDEX\stbl"\sagainst\sa\svirtual\ntable\sfor\swhich\sthe\sSQL\spassed\sto\ssqlite3_declare_vtab()\scontains\sPRIMARY\sKEY\nor\sUNIQUE\sconstraints. -D 2019-01-11T17:41:23.958 +C Fix\sanother\sproblem\swith\scorrupt\sdatabases\sin\sfts5. +D 2019-01-11T19:27:55.738 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -123,7 +123,7 @@ F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f546 F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 F ext/fts5/fts5_tokenize.c 4d904c237707de8fbb8ab98d24d5c55d47204a3f1f35895d8a53a5327079b32c F ext/fts5/fts5_unicode2.c d8a1528c9a19f79b843c486e5e64bff17d667791ae7f658e11131ebac4b33c59 -F ext/fts5/fts5_varint.c 19ca7c5cf3f36017f44e5bb790f01b111f37791c8a1a49a17711f2b666a629f1 +F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 F ext/fts5/fts5_vocab.c 217451108ad526820f6743f9d9be231a692a4f14e1349d526f82c61f42e9fc13 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 94efe10c851dafcccb2a9c05c2859ba1d5e4bb7396a14a9a5027356ef02a9159 +F ext/fts5/test/fts5corrupt3.test 0154d077d52abc5bdc0253e3722d487a5ccb4e72ea29b387267c1d066a0f412e F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1798,7 +1798,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 d2f0b5a483869d39f5c5814c9d6df3d3b8a46d582b4dcf0cf11e23b707c4213e -R dbf44d113e88de2949ee12fc8ce79fce +P 556dd8922f65af93084ee725c638b8dc696b611dd508c212a3b507d6ca474031 +R 7473af17dc4555dbf9176ad099ed4c71 U dan -Z 9cbae88a29b6f7b02805446f3dcaf9cf +Z 448e7c1f18a3679588f0fd2c3c306d12 diff --git a/manifest.uuid b/manifest.uuid index 8f9b34e752..cec3d0a902 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -556dd8922f65af93084ee725c638b8dc696b611dd508c212a3b507d6ca474031 \ No newline at end of file +9bf811ea89a133d481a86407683a7518e909eccb7aa3aa02f7932bdb33387572 \ No newline at end of file From 90294961da64434c4fbb495567b39bf560b9531b Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Jan 2019 21:34:25 +0000 Subject: [PATCH 045/306] Fix a segfault in fts3 prompted by a corrupted database. FossilOrigin-Name: 2d7b1d1d41ff69d5465fcb861420816ecb066c25a9015eefdab5fae15a2e1c9f --- ext/fts3/fts3.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3corrupt4.test | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index e168fae151..5266749fcc 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2899,7 +2899,7 @@ static int fts3SegReaderCursor( /* If zTerm is not NULL, and this segment is not stored entirely on its ** root node, the range of leaves scanned can be reduced. Do this. */ - if( iStartBlock && zTerm ){ + if( iStartBlock && zTerm && zRoot ){ sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0); rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi); if( rc!=SQLITE_OK ) goto finished; diff --git a/manifest b/manifest index 7a6f0192ae..470d02d5d0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sproblem\swith\scorrupt\sdatabases\sin\sfts5. -D 2019-01-11T19:27:55.738 +C Fix\sa\ssegfault\sin\sfts3\sprompted\sby\sa\scorrupted\sdatabase. +D 2019-01-11T21:34:25.388 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 4636bd255f1eb1f462f79d77da685e879161bb18605181342dc8675cc69f217c +F ext/fts3/fts3.c 6b5029db69b237410d9075501c6b78af4207ae5ae3fb7e00a1196748a09fc365 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 3378157f383540857a466420b8279626204434c3eb0dc948ad9bcd3991fc41f5 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b @@ -915,7 +915,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 8771f5bad51bf1deb3f8b9564e3ff1e162ca126bcaf7104a81e04fbd15b96f7d +F test/fts3corrupt4.test 74be7ccb774acaa8c9439d61fcc52293165b58f685a3da46ca0b47daf056bbc0 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1798,7 +1798,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 556dd8922f65af93084ee725c638b8dc696b611dd508c212a3b507d6ca474031 -R 7473af17dc4555dbf9176ad099ed4c71 +P 9bf811ea89a133d481a86407683a7518e909eccb7aa3aa02f7932bdb33387572 +R 7de3d4e810f34d86eb896dd11b818c69 U dan -Z 448e7c1f18a3679588f0fd2c3c306d12 +Z ccc0acffc69d2f9d8637b69b833e79a2 diff --git a/manifest.uuid b/manifest.uuid index cec3d0a902..e371e765ed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9bf811ea89a133d481a86407683a7518e909eccb7aa3aa02f7932bdb33387572 \ No newline at end of file +2d7b1d1d41ff69d5465fcb861420816ecb066c25a9015eefdab5fae15a2e1c9f \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 3ff2bed99d..46e9311703 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -249,4 +249,20 @@ do_catchsql_test 5.1 { SELECT * FROM t1 WHERE t1 MATCH 'abandon'; } {1 {malformed database schema (sqlite_autoindey_t1_segdir_1) - orphan index}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 6.0 { + CREATE VIRTUAL TABLE Table0 USING fts3(); + INSERT INTO Table0_segdir VALUES(1,NULL,1,NULL,NULL,NULL); +} + +do_catchsql_test 6.1 { + SELECT * FROM Table0 WHERE Table0 MATCH 'a'; +} {0 {}} + +do_catchsql_test 6.2 { + INSERT INTO Table0(Table0) VALUES('optimize'); +} {0 {}} + finish_test From 73bce667015ebf61438a009ef19db0d06842ed07 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Jan 2019 23:08:56 +0000 Subject: [PATCH 046/306] Use 64-bit APIs in the fileio.c extension. FossilOrigin-Name: b49d56a0faf012978c50fb8662125ea21bdf5054fddf5975644cbc941c153e70 --- ext/misc/fileio.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index 34fa0b92c8..b15e0fda1b 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -152,14 +152,14 @@ static void readFileContents(sqlite3_context *ctx, const char *zName){ fclose(in); return; } - pBuf = sqlite3_malloc( nIn ); + pBuf = sqlite3_malloc64( nIn ); if( pBuf==0 ){ sqlite3_result_error_nomem(ctx); fclose(in); return; } if( 1==fread(pBuf, nIn, 1, in) ){ - sqlite3_result_blob(ctx, pBuf, nIn, sqlite3_free); + sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free); }else{ sqlite3_result_error_code(ctx, SQLITE_IOERR); sqlite3_free(pBuf); diff --git a/manifest b/manifest index 470d02d5d0..5693f8b56e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\ssegfault\sin\sfts3\sprompted\sby\sa\scorrupted\sdatabase. -D 2019-01-11T21:34:25.388 +C Use\s64-bit\sAPIs\sin\sthe\sfileio.c\sextension. +D 2019-01-11T23:08:56.606 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -285,7 +285,7 @@ F ext/misc/csv.c 7f047aeb68f5802e7ce6639292095d622a488bb43526ed04810e0649faa71ce F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c 801d2ac9faff0d7d59c1f595dc26d32920a793f4291d81322b1837d0b3e160f0 +F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1798,7 +1798,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 9bf811ea89a133d481a86407683a7518e909eccb7aa3aa02f7932bdb33387572 -R 7de3d4e810f34d86eb896dd11b818c69 -U dan -Z ccc0acffc69d2f9d8637b69b833e79a2 +P 2d7b1d1d41ff69d5465fcb861420816ecb066c25a9015eefdab5fae15a2e1c9f +R 369c79d3bd1762fbb2cb49f98fa30478 +U drh +Z 385f2a9fc9254c3d34f344d45598a89d diff --git a/manifest.uuid b/manifest.uuid index e371e765ed..b7daaf0b55 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2d7b1d1d41ff69d5465fcb861420816ecb066c25a9015eefdab5fae15a2e1c9f \ No newline at end of file +b49d56a0faf012978c50fb8662125ea21bdf5054fddf5975644cbc941c153e70 \ No newline at end of file From a2dc7494ef94292c30316626d89336d41e134692 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 12 Jan 2019 00:07:48 +0000 Subject: [PATCH 047/306] Indicate that the database may be corrupt in the fts3corrupt4.test test script. FossilOrigin-Name: 473626d5579dd19023abccaf7c1822ac0c883a0b98904837ea096fa16e4f41c4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fts3corrupt4.test | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 5693f8b56e..a14a86e4c1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\s64-bit\sAPIs\sin\sthe\sfileio.c\sextension. -D 2019-01-11T23:08:56.606 +C Indicate\sthat\sthe\sdatabase\smay\sbe\scorrupt\sin\sthe\sfts3corrupt4.test\stest\sscript. +D 2019-01-12T00:07:48.245 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -915,7 +915,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 74be7ccb774acaa8c9439d61fcc52293165b58f685a3da46ca0b47daf056bbc0 +F test/fts3corrupt4.test 7094ffbd5bbc3852969bd85dc5bed35319f3bbda210e8f2163c74a6b79beb712 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1798,7 +1798,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 2d7b1d1d41ff69d5465fcb861420816ecb066c25a9015eefdab5fae15a2e1c9f -R 369c79d3bd1762fbb2cb49f98fa30478 +P b49d56a0faf012978c50fb8662125ea21bdf5054fddf5975644cbc941c153e70 +R d7baf6ef9c921644c5ac1b95e49ce18a U drh -Z 385f2a9fc9254c3d34f344d45598a89d +Z dc7b71948f94b54a621938748cbb435f diff --git a/manifest.uuid b/manifest.uuid index b7daaf0b55..202dd5e070 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b49d56a0faf012978c50fb8662125ea21bdf5054fddf5975644cbc941c153e70 \ No newline at end of file +473626d5579dd19023abccaf7c1822ac0c883a0b98904837ea096fa16e4f41c4 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 46e9311703..9996ee049b 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -252,6 +252,7 @@ do_catchsql_test 5.1 { #------------------------------------------------------------------------- reset_db +database_may_be_corrupt do_execsql_test 6.0 { CREATE VIRTUAL TABLE Table0 USING fts3(); INSERT INTO Table0_segdir VALUES(1,NULL,1,NULL,NULL,NULL); From 3e534eac193a746a6f2e71796c7ad31c5d93016b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 12 Jan 2019 00:12:33 +0000 Subject: [PATCH 048/306] Improved shadow table corruption detection in the matchinfo() function of FTS3. FossilOrigin-Name: 567be3bb1e8b6477f3bf1c7b4cd6ec066fba69d0dcf8785632e244ce25db639f --- ext/fts3/fts3.c | 12 ++++++------ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 5266749fcc..28037822bc 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -5599,7 +5599,7 @@ static void fts3EvalRestart( ** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase ** expression nodes. */ -static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ +static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ if( pExpr ){ Fts3Phrase *pPhrase = pExpr->pPhrase; if( pPhrase && pPhrase->doclist.pList ){ @@ -5607,7 +5607,7 @@ static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ char *p = pPhrase->doclist.pList; assert( *p ); - while( 1 ){ + do{ u8 c = 0; int iCnt = 0; while( 0xFE & (*p | c) ){ @@ -5623,11 +5623,11 @@ static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ if( *p==0x00 ) break; p++; p += fts3GetVarint32(p, &iCol); - } + }while( iColpLeft); - fts3EvalUpdateCounts(pExpr->pRight); + fts3EvalUpdateCounts(pExpr->pLeft, nCol); + fts3EvalUpdateCounts(pExpr->pRight, nCol); } } @@ -5697,7 +5697,7 @@ static int fts3EvalGatherStats( ); if( rc==SQLITE_OK && pCsr->isEof==0 ){ - fts3EvalUpdateCounts(pRoot); + fts3EvalUpdateCounts(pRoot, pTab->nColumn); } } diff --git a/manifest b/manifest index a14a86e4c1..8bde999f80 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Indicate\sthat\sthe\sdatabase\smay\sbe\scorrupt\sin\sthe\sfts3corrupt4.test\stest\sscript. -D 2019-01-12T00:07:48.245 +C Improved\sshadow\stable\scorruption\sdetection\sin\sthe\smatchinfo()\sfunction\sof\sFTS3. +D 2019-01-12T00:12:33.531 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 6b5029db69b237410d9075501c6b78af4207ae5ae3fb7e00a1196748a09fc365 +F ext/fts3/fts3.c 51313386427f23d5aa3e09688272f4e6bcf2fb28700687ee2676af37f0a7afe0 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 3378157f383540857a466420b8279626204434c3eb0dc948ad9bcd3991fc41f5 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b @@ -1798,7 +1798,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 b49d56a0faf012978c50fb8662125ea21bdf5054fddf5975644cbc941c153e70 -R d7baf6ef9c921644c5ac1b95e49ce18a +P 473626d5579dd19023abccaf7c1822ac0c883a0b98904837ea096fa16e4f41c4 +R 73d136a154272e99ebd73161aec00794 U drh -Z dc7b71948f94b54a621938748cbb435f +Z 9657b145f08b5b72d177903d9527e803 diff --git a/manifest.uuid b/manifest.uuid index 202dd5e070..595be57670 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -473626d5579dd19023abccaf7c1822ac0c883a0b98904837ea096fa16e4f41c4 \ No newline at end of file +567be3bb1e8b6477f3bf1c7b4cd6ec066fba69d0dcf8785632e244ce25db639f \ No newline at end of file From 5d4589014a71960310af35a8a3412b2930eb84a2 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 12 Jan 2019 00:45:20 +0000 Subject: [PATCH 049/306] Improved detection of shadow table corruption in the fts5_decode() SQL function. FossilOrigin-Name: b74e5f3f3057ee7a98ebcb14ca0751048eacbec8fca3e11e241883029a57ecdf --- ext/fts5/fts5_index.c | 8 ++++++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 4cd5e5e23e..b16dd2befc 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -6398,6 +6398,10 @@ static void fts5DecodeFunction( }else{ iOff = szLeaf; } + if( iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodePoslist(&rc, &s, &a[4], iOff-4); /* Decode any more doclist data that appears on the page before the @@ -6434,6 +6438,10 @@ static void fts5DecodeFunction( term.n = nByte; } iOff += fts5GetVarint32(&a[iOff], nByte); + if( iOff+nByte>n ){ + rc = FTS5_CORRUPT; + break; + } fts5BufferAppendBlob(&rc, &term, nByte, &a[iOff]); iOff += nByte; diff --git a/manifest b/manifest index 8bde999f80..b32d251a69 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sshadow\stable\scorruption\sdetection\sin\sthe\smatchinfo()\sfunction\sof\sFTS3. -D 2019-01-12T00:12:33.531 +C Improved\sdetection\sof\sshadow\stable\scorruption\sin\sthe\sfts5_decode()\sSQL\sfunction. +D 2019-01-12T00:45:20.077 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81e F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 7e617122cd695c57ded21fab4b43bf5acb5f65bd2e5566f233c61c46c510d356 +F ext/fts5/fts5_index.c d1d037dc235802a60af58b8fcffbbb42f4696a318b71d335902ace3d3c9aa27a F ext/fts5/fts5_main.c 90062ccfc54031ff97660e277d868ec080c5b46e42d784856385b12645e60ed6 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -1798,7 +1798,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 473626d5579dd19023abccaf7c1822ac0c883a0b98904837ea096fa16e4f41c4 -R 73d136a154272e99ebd73161aec00794 +P 567be3bb1e8b6477f3bf1c7b4cd6ec066fba69d0dcf8785632e244ce25db639f +R aca3cf5715dc297643eea292d3459238 U drh -Z 9657b145f08b5b72d177903d9527e803 +Z eefd0c074ad030760bd94a241383811e diff --git a/manifest.uuid b/manifest.uuid index 595be57670..d422dfc859 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -567be3bb1e8b6477f3bf1c7b4cd6ec066fba69d0dcf8785632e244ce25db639f \ No newline at end of file +b74e5f3f3057ee7a98ebcb14ca0751048eacbec8fca3e11e241883029a57ecdf \ No newline at end of file From b4439eef10940384ddcd4518b6aed814952f4086 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 12 Jan 2019 14:58:35 +0000 Subject: [PATCH 050/306] Fix a problem with corrupt database handling in the fts3 matchinfo() function. FossilOrigin-Name: 703646b1b5c84d550fe0d74e399c0eeb729da1d263e4693320f69e6509678985 --- ext/fts3/fts3_snippet.c | 16 ++- manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 291 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 310 insertions(+), 15 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index ea4edf1428..1c41139111 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -852,7 +852,7 @@ static int fts3ColumnlistCount(char **ppCollist){ /* ** This function gathers 'y' or 'b' data for a single phrase. */ -static void fts3ExprLHits( +static int fts3ExprLHits( Fts3Expr *pExpr, /* Phrase expression node */ MatchInfo *p /* Matchinfo context */ ){ @@ -882,25 +882,29 @@ static void fts3ExprLHits( if( *pIter!=0x01 ) break; pIter++; pIter += fts3GetVarint32(pIter, &iCol); + if( iCol>=p->nCol ) return FTS_CORRUPT_VTAB; } + return SQLITE_OK; } /* ** Gather the results for matchinfo directives 'y' and 'b'. */ -static void fts3ExprLHitGather( +static int fts3ExprLHitGather( Fts3Expr *pExpr, MatchInfo *p ){ + int rc = SQLITE_OK; assert( (pExpr->pLeft==0)==(pExpr->pRight==0) ); if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){ if( pExpr->pLeft ){ - fts3ExprLHitGather(pExpr->pLeft, p); - fts3ExprLHitGather(pExpr->pRight, p); + rc = fts3ExprLHitGather(pExpr->pLeft, p); + if( rc==SQLITE_OK ) rc = fts3ExprLHitGather(pExpr->pRight, p); }else{ - fts3ExprLHits(pExpr, p); + rc = fts3ExprLHits(pExpr, p); } } + return rc; } /* @@ -1272,7 +1276,7 @@ static int fts3MatchinfoValues( case FTS3_MATCHINFO_LHITS: { int nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); memset(pInfo->aMatchinfo, 0, nZero); - fts3ExprLHitGather(pCsr->pExpr, pInfo); + rc = fts3ExprLHitGather(pCsr->pExpr, pInfo); break; } diff --git a/manifest b/manifest index b32d251a69..4b727a553b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sof\sshadow\stable\scorruption\sin\sthe\sfts5_decode()\sSQL\sfunction. -D 2019-01-12T00:45:20.077 +C Fix\sa\sproblem\swith\scorrupt\sdatabase\shandling\sin\sthe\sfts3\smatchinfo()\sfunction. +D 2019-01-12T14:58:35.735 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -89,7 +89,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 3c4654a57f12d05b7249103633dffc77bcf29fe995c72a272b279561732974b1 +F ext/fts3/fts3_snippet.c bea8038175ff19bcc27b8a1d0bf12ee0a482b995029ea125b105c43eaebc8098 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c 79f2a7fbb3f672fa032e5a432ca274ea3ee93c34 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 @@ -915,7 +915,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 7094ffbd5bbc3852969bd85dc5bed35319f3bbda210e8f2163c74a6b79beb712 +F test/fts3corrupt4.test 6c5fe11f2692c6fb72358d2379eb2c7f9381b35484ea4f671df4591ec20c4485 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1798,7 +1798,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 567be3bb1e8b6477f3bf1c7b4cd6ec066fba69d0dcf8785632e244ce25db639f -R aca3cf5715dc297643eea292d3459238 -U drh -Z eefd0c074ad030760bd94a241383811e +P b74e5f3f3057ee7a98ebcb14ca0751048eacbec8fca3e11e241883029a57ecdf +R 98e913aa4c07553cef3ed2e17fb44150 +U dan +Z 266b463aec482d4a998de77b92e76d8b diff --git a/manifest.uuid b/manifest.uuid index d422dfc859..549592d46f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b74e5f3f3057ee7a98ebcb14ca0751048eacbec8fca3e11e241883029a57ecdf \ No newline at end of file +703646b1b5c84d550fe0d74e399c0eeb729da1d263e4693320f69e6509678985 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 9996ee049b..da3e99242a 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -266,4 +266,295 @@ do_catchsql_test 6.2 { INSERT INTO Table0(Table0) VALUES('optimize'); } {0 {}} +#------------------------------------------------------------------------- +reset_db +do_test 7.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-04bb6e7c811ce9.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 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 72 04 43 52 45 41 54 45 20 54 _segdir.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 00 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 67 42 06 r sint occaecgB. +| 3712: 37 57 06 96 46 17 46 17 42 06 e6 f6 e2 07 07 26 7W..F.F.B......& +| 3728: f6 96 46 56 e7 42 c2 a0 60 30 05 b6 36 96 c6 c7 ..FV.B..`0..6... +| 3744: 56 d2 06 46 f6 c6 f7 26 52 06 57 52 06 67 56 7c V..F...&R.WR.gV| +| 3760: 65 3f 04 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 e?. nulla pariat +| 3776: 75 72 2e 42 05 04 00 81 09 44 75 69 73 20 61 75 ur.B.....Duis au +| 3792: 74 65 20 69 72 75 72 65 20 64 6f 6c 6f 72 20 69 te irure dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 73 65 2b 04 03 00 5d 6e 69 73 69 it esse+...]nisi +| 3856: 20 75 74 20 61 6c 69 71 75 69 70 20 65 78 20 65 ut aliquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 61 6c 69 dolore magna ali +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 72 12 29 psum dolor sir.) +| 4064: 0d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 .et, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 30 00 10 17 50 30 80 20 00 00 ......0...P0. .. +| 16: 27 46 50 30 20 50 00 00 27 56 c0 30 30 a0 00 10 'FP0 P..'V.00... +| 32: 17 40 90 20 70 00 10 20 00 10 30 00 00 27 66 50 .@. p.. ..0..'fP +| 48: 60 30 60 00 20 a0 00 10 16 f0 30 50 90 08 20 a0 `0`. .....0P.. . +| 64: 20 80 20 80 80 81 78 40 20 40 03 02 03 23 53 10 . ...x@ @...#S. +| 80: 00 16 11 30 10 60 40 00 10 c0 00 10 40 00 00 00 ...0.`@.....@... +| 96: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 78 24 ..............x$ +| 112: 41 71 83 37 10 27 97 60 10 40 00 00 16 41 10 10 Aq.7.'.`.@...A.. +| 128: 40 00 10 30 90 00 30 20 50 00 10 30 00 20 70 00 @..0..0 P..0. p. +| 144: 00 16 51 b0 10 90 00 10 40 70 00 10 30 80 00 10 ..Q.....@p..0... +| 160: 50 30 00 10 b0 00 10 40 00 10 20 00 10 b0 00 00 P0.....@.. ..... +| 176: 16 60 30 60 50 00 00 16 90 f0 10 30 00 10 60 00 .`0`P......0..`. +| 192: 30 40 40 40 00 30 30 90 00 00 16 c0 c0 10 20 00 0@@@.00....... . +| 208: 10 80 00 10 b0 00 50 c0 00 00 16 d0 90 20 b0 00 ......P...... .. +| 224: 10 50 00 50 80 00 00 16 e0 c0 30 80 00 10 20 00 .P.P......0... . +| 240: 20 60 00 10 60 00 00 16 f0 60 70 40 00 10 60 00 `..`....`p@..`. +| 256: 00 17 00 60 60 70 00 10 70 00 00 17 10 60 30 70 ...``p..p....`0p +| 272: 00 50 50 00 00 17 20 30 50 70 00 00 17 30 c0 10 .PP... 0Pp...0.. +| 288: 50 00 10 20 00 50 30 00 10 20 00 00 17 40 30 20 P.. .P0.. ...@0 +| 304: 50 00 00 17 50 a0 20 70 00 10 20 a0 00 10 30 00 P...P. p.. ...0. +| 320: 00 17 60 70 30 60 00 20 90 30 08 52 60 10 80 80 ..`p0`. .0.R`... +| 336: 80 80 81 78 a3 e3 02 03 63 63 50 00 26 16 40 30 ...x....ccP.&.@0 +| 352: 30 40 00 20 86 97 06 97 36 36 96 e6 70 30 10 80 0@. ....66..p0.. +| 368: 00 10 56 c6 97 17 56 10 30 20 c0 00 50 26 97 00 ..V...V.0 ..P&.. +| 384: 30 40 40 00 10 36 d6 57 40 30 10 60 00 10 36 e6 0@@..6.W@0.`..6. +| 400: 96 d0 30 80 90 00 10 37 57 46 50 30 50 30 00 00 ..0....7WFP0P0.. +| 416: 66 36 96 c6 c7 56 d0 30 60 20 00 10 66 f6 d6 d6 f6...V.0` ..f... +| 432: f6 46 f0 30 40 70 00 20 96 e7 36 56 37 46 57 47 .F.0@p. ..6V7FWG +| 448: 57 20 30 10 70 00 50 47 17 56 17 40 30 40 80 00 W 0.p.PG.V.@0@.. +| 464: 10 47 56 c7 06 10 30 80 40 00 20 77 06 96 46 17 .GV...0.@. w..F. +| 480: 46 17 40 30 70 50 00 00 86 46 57 36 57 27 56 e7 F.@0pP...FW6W'V. +| 496: 40 30 80 70 00 10 16 f0 30 20 30 00 20 36 c6 f7 @0.p....0 0. 6.. +| 512: 20 60 10 40 00 40 50 00 50 16 50 60 20 a0 00 40 `.@.@P.P.P` ..@ +| 528: 30 00 10 37 56 97 30 30 50 20 00 00 26 56 10 30 0..7V.00P ..&V.0 +| 544: 40 60 00 10 66 97 57 36 d6 f6 40 30 20 40 00 10 @`..f.W6..@0 @.. +| 560: 36 c6 97 40 30 10 90 00 15 35 14 c6 97 46 52 06 6..@0....5...FR. +| 576: 66 f7 26 d6 17 42 03 30 01 00 00 10 10 04 02 02 f.&..B.0........ +| 592: 00 00 00 00 00 00 00 00 70 00 00 00 00 00 00 00 ........p....... +| 608: 00 00 00 00 60 00 00 00 40 00 00 00 00 00 00 00 ....`...@....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 00 00 91 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 02 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 30 03 03 00 01 01 73 06 l......n0.....s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 03 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 03 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 02 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 02 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 13 .......0 251..a. +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 03 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 01 70 00 03 01 80 00 05 03 00 01 ......p......... +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 00 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 07 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| page 8 offset 28672 +| 0: 6f ee cd e1 f1 ee 1a ca be ed ee ec de ac f1 cb o............... +| 16: f1 ee 1a ce de ee f1 ee 0a cc de ed ae 90 87 88 ................ +| 32: ec 5e dc ec fc 11 72 32 75 0a da be ec ed eb de .^....r2u....... +| 48: ce c1 aa e0 ae ec 1f c1 ee 99 c2 aa e0 a9 ad 15 ................ +| 64: 0e ec ab ef 1e e0 48 ad 15 04 24 80 00 00 00 00 ......H...$..... +| 80: 00 00 00 00 e0 00 00 00 04 2c 80 00 10 42 4e c1 .........,...BN. +| 96: 20 4b 45 59 2c 6e 6f 64 65 6e 6f 2c 61 30 29 46 KEY,nodeno,a0)F +| 112: 02 06 17 11 11 08 7b 74 61 62 6c 65 74 31 74 31 .......tablet1t1 +| 128: 43 52 45 41 54 e1 ec eb ea eb eb ac ee ce be de CREAT........... +| 144: ee f1 ee 1a ca ba de 47 80 30 00 14 90 47 70 30 .......G.0...Gp0 +| 160: 00 11 60 47 60 30 00 15 f0 47 50 30 00 10 f0 47 ..`G`0...GP0...G +| 176: 40 30 00 11 f0 47 45 20 30 00 11 d0 45 10 30 00 @0...GE 0...E.0. +| 192: 12 10 45 00 30 00 14 e0 44 f0 30 00 11 e0 44 e0 ..E.0...D.0...D. +| 208: 30 00 12 a0 44 d0 30 00 15 e0 44 c0 30 00 10 40 0...D.0...D.0..@ +| 224: 44 b0 30 00 15 10 44 a0 30 00 14 c0 44 90 30 00 D.0...D.0...D.0. +| 240: 16 20 44 80 30 00 52 45 41 54 45 20 54 41 42 4c . D.0.REATE TABL +| 256: 45 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 E 't1_content'(i +| 272: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 288: 59 20 4b 45 59 2c 20 63 30 29 69 03 07 17 19 19 Y KEY, c0)i..... +| 304: 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 ..-tablet1_idxt1 +| 320: 5f 69 64 78 03 43 52 45 41 54 45 20 54 41 42 4c _idx.CREATE TABL +| 336: 45 20 27 70 31 5f 69 64 78 03 6e 69 6d 03 03 03 E 'p1_idx.nim... +| 352: 00 01 03 73 73 65 03 05 0b 00 02 01 74 03 08 0b ...sse......t... +| 368: 00 01 01 74 03 02 09 00 01 01 75 03 06 04 00 01 ...t......u..... +| 384: 01 78 03 04 05 00 02 07 63 65 70 74 65 75 72 03 .x......cepteur. +| 400: 07 02 00 02 0a 65 72 63 69 74 61 74 69 6f 6e 03 .....ercitation. +| 416: 03 09 00 00 06 66 75 67 69 61 74 03 06 05 00 00 .....fugiat..... +| 432: 02 69 64 03 08 0a 00 01 01 6e 07 05 06 04 00 03 .id......n...... +| 448: 03 00 02 08 63 69 64 69 64 75 6e 74 03 02 06 00 ....cididunt.... +| 464: 01 04 70 73 75 6d 03 01 03 00 01 04 72 75 72 65 ..psum......rure +| 480: 03 05 04 00 00 06 6c 61 62 6f 72 65 03 02 08 00 ......labore.... +| 496: 05 02 69 73 03 03 0b 00 05 02 75 6d 03 08 0c 00 ..is......um.... +| 512: 01 04 6f 72 65 6d 03 01 02 00 00 05 6d 61 67 6e ..orem......magn +| 528: 61 03 02 0b 00 01 04 69 6e 69 6d 03 03 05 00 01 a......inim..... +| 544: 05 6f 6c 6c 69 74 03 08 08 00 00 04 6e 69 73 69 .ollit......nisi +| 560: 03 04 02 00 01 02 6f 6e 03 07 06 00 02 05 73 74 ......on......st +| 576: 72 75 64 03 03 08 00 01 04 75 6c 6c 61 03 06 06 rud......ulla... +| 592: 00 00 08 6f 63 63 61 65 63 61 74 03 07 04 00 01 ...occaecat..... +| 608: 06 66 66 69 63 69 61 03 08 06 00 00 08 70 61 72 .fficia......par +| 624: 69 61 74 75 72 03 06 07 00 01 07 72 6f ed ce de iatur......ro... +| 640: 69 64 65 6e 74 03 07 07 00 00 03 71 75 69 03 08 ident......qui.. +| 656: 05 00 03 01 73 03 03 07 00 00 0d 72 65 70 72 65 ....s......repre +| 672: 68 65 6e 64 65 72 69 74 03 05 07 00 00 03 73 65 henderit......se +| 688: 64 03 02 02 00 01 03 69 6e 74 03 07 03 00 02 01 d......int...... +| 704: 74 03 01 05 00 01 03 75 6e 74 03 08 02 00 00 06 t......unt...... +| 720: 74 65 6d 70 6f 72 03 02 05 00 00 07 75 6c 6c 61 tempor......ulla +| 736: 6d 63 6f 03 03 0a 00 01 01 74 09 02 07 00 01 02 mco......t...... +| 752: 00 01 03 00 00 05 76 65 6c 69 74 03 05 0a 00 02 ......velit..... +| 768: 04 6e 69 61 6d 03 03 06 00 01 08 6f 6c 75 70 74 .niam......olupt +| 784: 61 74 65 03 05 09 00 0a 00 00 00 03 0f eb 00 0f ate............. +| 800: fb 0f f3 0f eb 00 00 00 00 00 00 00 00 00 00 00 ................ +| end crash-04bb6e7c811ce9.db +}]} {} + +do_catchsql_test 7.1 { + SELECT matchinfo(t1,'y') FROM t1 WHERE t1 MATCH 'e*'; +} {1 {database disk image is malformed}} + finish_test From 6214d93993a545b578e7139951f07840e049ee45 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 12 Jan 2019 16:19:23 +0000 Subject: [PATCH 051/306] Fix an off-by-one error on a Goto in the code generator, that only causes problems for a REPLACE on an INTEGER PRIMARY KEY in non-debug builds. Test case in TH3. FossilOrigin-Name: e35eb8776ed539afe1d5db099470ab1124d8dd2db73ee5db7c811f8df9a9576e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/insert.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4b727a553b..0a8428337f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\scorrupt\sdatabase\shandling\sin\sthe\sfts3\smatchinfo()\sfunction. -D 2019-01-12T14:58:35.735 +C Fix\san\soff-by-one\serror\son\sa\sGoto\sin\sthe\scode\sgenerator,\sthat\sonly\ncauses\sproblems\sfor\sa\sREPLACE\son\san\sINTEGER\sPRIMARY\sKEY\sin\snon-debug\nbuilds.\s\sTest\scase\sin\sTH3. +D 2019-01-12T16:19:23.737 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -473,7 +473,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c ad8226b25dfe415ed4733a74c87b8d97515154b15efc8df54e13484851d34489 +F src/insert.c ce295c50a49b626d96d668a915220d02fe372e27ad7dd2bfef297b0335c40488 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 008f45dd39cdc7fb9e7e1f61d75a5c97397f8e07427a8879be23e27747d5f948 @@ -1798,7 +1798,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 b74e5f3f3057ee7a98ebcb14ca0751048eacbec8fca3e11e241883029a57ecdf -R 98e913aa4c07553cef3ed2e17fb44150 -U dan -Z 266b463aec482d4a998de77b92e76d8b +P 703646b1b5c84d550fe0d74e399c0eeb729da1d263e4693320f69e6509678985 +R 33928fdfc39020f42a0a3865c5b478a5 +U drh +Z 736006b46cd8bfa783c1ce2a472d94bc diff --git a/manifest.uuid b/manifest.uuid index 549592d46f..222169c308 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -703646b1b5c84d550fe0d74e399c0eeb729da1d263e4693320f69e6509678985 \ No newline at end of file +e35eb8776ed539afe1d5db099470ab1124d8dd2db73ee5db7c811f8df9a9576e \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index ae5110d8fa..4f7b19b562 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1842,7 +1842,7 @@ void sqlite3GenerateConstraintChecks( /* If the IPK constraint is a REPLACE, run it last */ if( ipkTop ){ - sqlite3VdbeGoto(v, ipkTop+1); + sqlite3VdbeGoto(v, ipkTop); VdbeComment((v, "Do IPK REPLACE")); sqlite3VdbeJumpHere(v, ipkBottom); } From 951d1651259a891f2c6b02e7e78596a0ab2b3820 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 12 Jan 2019 20:55:36 +0000 Subject: [PATCH 052/306] Fix another problem with handling corrupt records in fts5_decode(). FossilOrigin-Name: 726e398b9ddc15ea1b67c40e2a12ddf5d04428a866699588c5fa1af75af846e1 --- ext/fts5/fts5_index.c | 3 + ext/fts5/test/fts5corrupt3.test | 133 ++++++++++++++++++++++++++++++++ manifest | 16 ++-- manifest.uuid | 2 +- 4 files changed, 145 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index b16dd2befc..426cf61660 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -6387,6 +6387,9 @@ static void fts5DecodeFunction( iPgidxOff = szLeaf = fts5GetU16(&a[2]); if( iPgidxOffn ){ + rc = FTS5_CORRUPT; + goto decode_out; } } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index e8a2f0938a..71e8273f61 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -3917,6 +3917,139 @@ do_catchsql_test 33.3 { SELECT * FROM t2, t3, t4 WHERE t2.term=t3.term AND t3.term=t4.term; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 34.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-a60a9da4c8932f.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 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 20 68 20 69 0d 00 00 00 03 0f e8 ...t. h i....... +| 3904: 00 0f f8 0f f0 0f e8 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 00 ................ +| 4080: 60 20 30 01 20 30 00 30 60 10 30 01 20 30 00 30 ` 0. 0.0`.0. 0.0 +| page 6 offset 20480 +| 0: a0 00 00 00 10 ff 40 00 ff 00 00 00 00 00 00 00 ......@......... +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 00 00 00 00 00 00 00 00 00 11 87 89 06 26 ...............& +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 44 00 06 06 07 01 03 00 14 03 09 09 09 0f ..D............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-a60a9da4c8932f.db +}]} {} + +do_catchsql_test 34.1 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +do_catchsql_test 34.2 { + SELECT fts5_decode(id, block) FROM t2_data; +} {1 {database disk image is malformed}} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 0a8428337f..dfed755035 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\soff-by-one\serror\son\sa\sGoto\sin\sthe\scode\sgenerator,\sthat\sonly\ncauses\sproblems\sfor\sa\sREPLACE\son\san\sINTEGER\sPRIMARY\sKEY\sin\snon-debug\nbuilds.\s\sTest\scase\sin\sTH3. -D 2019-01-12T16:19:23.737 +C Fix\sanother\sproblem\swith\shandling\scorrupt\srecords\sin\sfts5_decode(). +D 2019-01-12T20:55:36.227 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81e F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c d1d037dc235802a60af58b8fcffbbb42f4696a318b71d335902ace3d3c9aa27a +F ext/fts5/fts5_index.c ba68cfbd786ff50d84c23c841ac44063a5f939b37ae9e320bcbaf2baabc34608 F ext/fts5/fts5_main.c 90062ccfc54031ff97660e277d868ec080c5b46e42d784856385b12645e60ed6 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 0154d077d52abc5bdc0253e3722d487a5ccb4e72ea29b387267c1d066a0f412e +F ext/fts5/test/fts5corrupt3.test 7a4112d9e65be24493cd916a4937610525c352f5f5bc0424d37b434d0b72b9f6 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1798,7 +1798,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 703646b1b5c84d550fe0d74e399c0eeb729da1d263e4693320f69e6509678985 -R 33928fdfc39020f42a0a3865c5b478a5 -U drh -Z 736006b46cd8bfa783c1ce2a472d94bc +P e35eb8776ed539afe1d5db099470ab1124d8dd2db73ee5db7c811f8df9a9576e +R 10f763a13c1f98de996ba1b8ed3891ab +U dan +Z 8380d015f98fd49fe625440a5996cdb3 diff --git a/manifest.uuid b/manifest.uuid index 222169c308..2886212452 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e35eb8776ed539afe1d5db099470ab1124d8dd2db73ee5db7c811f8df9a9576e \ No newline at end of file +726e398b9ddc15ea1b67c40e2a12ddf5d04428a866699588c5fa1af75af846e1 \ No newline at end of file From a79bcf358bcf84f0d42f091da132be82412ca120 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 12 Jan 2019 21:30:26 +0000 Subject: [PATCH 053/306] Prevent unsigned 32-bit integer overflow from leading to a buffer overread inside of an assert(). The problem fixed here is no reachable in production code. FossilOrigin-Name: 0f850a25d67a752fe1e9059c0c3f78e00c222113e556a7605fd3c50817b573cb --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeaux.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index dfed755035..284b6f827a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sproblem\swith\shandling\scorrupt\srecords\sin\sfts5_decode(). -D 2019-01-12T20:55:36.227 +C Prevent\sunsigned\s32-bit\sinteger\soverflow\sfrom\sleading\sto\sa\sbuffer\soverread\ninside\sof\san\sassert().\s\sThe\sproblem\sfixed\shere\sis\sno\sreachable\sin\sproduction\ncode. +D 2019-01-12T21:30:26.399 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -587,7 +587,7 @@ F src/vdbe.c 1919d490e97bfc59eab4d43444a53a6717d06137295ed684a25e5df7430d9974 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 -F src/vdbeaux.c eb444562f0adbfb7e07b5a2a7ce4b21231c4c9d6d5b32411fcf806223b2bf6c5 +F src/vdbeaux.c 6e8cf4dd3cf095231af8ecf3c1b986f37e0bad9d7db255d53c1ea6766af7c986 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f @@ -1798,7 +1798,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 e35eb8776ed539afe1d5db099470ab1124d8dd2db73ee5db7c811f8df9a9576e -R 10f763a13c1f98de996ba1b8ed3891ab -U dan -Z 8380d015f98fd49fe625440a5996cdb3 +P 726e398b9ddc15ea1b67c40e2a12ddf5d04428a866699588c5fa1af75af846e1 +R 8923f98ae861c2545d072606e0c54a90 +U drh +Z 4318e33986f46462cf28ea3b5c858257 diff --git a/manifest.uuid b/manifest.uuid index 2886212452..7adf65b3f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -726e398b9ddc15ea1b67c40e2a12ddf5d04428a866699588c5fa1af75af846e1 \ No newline at end of file +0f850a25d67a752fe1e9059c0c3f78e00c222113e556a7605fd3c50817b573cb \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 1125cfd1a3..1af8a6f111 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3883,8 +3883,8 @@ static int vdbeRecordCompareDebug( ** Use that approximation to avoid the more expensive call to ** sqlite3VdbeSerialTypeLen() in the common case. */ - if( d1+serial_type1+2>(u32)nKey1 - && d1+sqlite3VdbeSerialTypeLen(serial_type1)>(u32)nKey1 + if( d1+(u64)serial_type1+2>(u64)nKey1 + && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 ){ break; } From a1bd5c6aae64da59b5ef91f0fd08200cec8de359 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 13 Jan 2019 00:58:57 +0000 Subject: [PATCH 054/306] Move a local variable declaration into the outermost scope in which it is used. This fixes an ASAN warning. FossilOrigin-Name: ac3b6021d9437ab1c027850d321f0a3e575b008763d8d515e2347f7d4e7c294b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/alter.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 284b6f827a..ced5390f3c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prevent\sunsigned\s32-bit\sinteger\soverflow\sfrom\sleading\sto\sa\sbuffer\soverread\ninside\sof\san\sassert().\s\sThe\sproblem\sfixed\shere\sis\sno\sreachable\sin\sproduction\ncode. -D 2019-01-12T21:30:26.399 +C Move\sa\slocal\svariable\sdeclaration\sinto\sthe\soutermost\sscope\sin\swhich\sit\nis\sused.\sThis\sfixes\san\sASAN\swarning. +D 2019-01-13T00:58:57.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -446,7 +446,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 9dda6a9cb20634fc4f65101a57ec43692f729164fa60dc1b0c78d344184a8431 +F src/alter.c 8ac946d83b7888faf1707e4fdc9b37e61ec83325bb3d6b1a6d382d3287d0c8d8 F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df @@ -1798,7 +1798,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 726e398b9ddc15ea1b67c40e2a12ddf5d04428a866699588c5fa1af75af846e1 -R 8923f98ae861c2545d072606e0c54a90 +P 0f850a25d67a752fe1e9059c0c3f78e00c222113e556a7605fd3c50817b573cb +R d1042653a3404af381612d805e6f7ade U drh -Z 4318e33986f46462cf28ea3b5c858257 +Z c1dc9aa41961f051bb56f64dcc557e3c diff --git a/manifest.uuid b/manifest.uuid index 7adf65b3f4..ce21ac2791 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0f850a25d67a752fe1e9059c0c3f78e00c222113e556a7605fd3c50817b573cb \ No newline at end of file +ac3b6021d9437ab1c027850d321f0a3e575b008763d8d515e2347f7d4e7c294b \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index a47e18daf1..07fe6e757a 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1081,6 +1081,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ Trigger *pNew = pParse->pNewTrigger; TriggerStep *pStep; NameContext sNC; + SrcList sSrc; int rc = SQLITE_OK; memset(&sNC, 0, sizeof(sNC)); @@ -1111,7 +1112,6 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ if( pTarget==0 ){ rc = SQLITE_ERROR; }else if( SQLITE_OK==(rc = sqlite3ViewGetColumnNames(pParse, pTarget)) ){ - SrcList sSrc; memset(&sSrc, 0, sizeof(sSrc)); sSrc.nSrc = 1; sSrc.a[0].zName = pStep->zTarget; From 0f1bf4c1acb724d0a90c4ecc8fea76f9406719f9 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 13 Jan 2019 20:17:21 +0000 Subject: [PATCH 055/306] Improved detection of database corruption while balancing pages from an auto_vacuum database with overflow pages. Test cases in TH3. FossilOrigin-Name: 35f04235c477501390acea126d07a730d81d03cdf7abcd82d861e397b3f75b0f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 31 +++++++++++++++---------------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index ced5390f3c..0a6ad88ff3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Move\sa\slocal\svariable\sdeclaration\sinto\sthe\soutermost\sscope\sin\swhich\sit\nis\sused.\sThis\sfixes\san\sASAN\swarning. -D 2019-01-13T00:58:57.018 +C Improved\sdetection\sof\sdatabase\scorruption\swhile\sbalancing\spages\sfrom\san\nauto_vacuum\sdatabase\swith\soverflow\spages.\s\sTest\scases\sin\sTH3. +D 2019-01-13T20:17:21.006 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -453,7 +453,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 789380da841ec283bf75c8b3e2c6423fed63ac16193b247cd43335f07e95f355 +F src/btree.c d2ee84255b7372e6a70447f3e260eadfca38d25b1039cf88341df4225cbb3e0e F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c b1e24f1deedee07955cad9c56928cdafa7df1615746688e817bfe0b020a68576 @@ -1798,7 +1798,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 0f850a25d67a752fe1e9059c0c3f78e00c222113e556a7605fd3c50817b573cb -R d1042653a3404af381612d805e6f7ade +P ac3b6021d9437ab1c027850d321f0a3e575b008763d8d515e2347f7d4e7c294b +R b3c41bca6e263f72d137d37d5ad93455 U drh -Z c1dc9aa41961f051bb56f64dcc557e3c +Z db68a7c462e1085d4719c3b28e40f5d1 diff --git a/manifest.uuid b/manifest.uuid index ce21ac2791..fad6c71ba5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ac3b6021d9437ab1c027850d321f0a3e575b008763d8d515e2347f7d4e7c294b \ No newline at end of file +35f04235c477501390acea126d07a730d81d03cdf7abcd82d861e397b3f75b0f \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 43c71ec71d..6b8bb0d01b 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1066,7 +1066,7 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ #else /* if defined SQLITE_OMIT_AUTOVACUUM */ #define ptrmapPut(w,x,y,z,rc) #define ptrmapGet(w,x,y,z) SQLITE_OK - #define ptrmapPutOvflPtr(x, y, rc) + #define ptrmapPutOvflPtr(x, y, z, rc) #endif /* @@ -1359,18 +1359,20 @@ static u16 cellSize(MemPage *pPage, int iCell){ #ifndef SQLITE_OMIT_AUTOVACUUM /* -** If the cell pCell, part of page pPage contains a pointer -** to an overflow page, insert an entry into the pointer-map -** for the overflow page. +** The cell pCell is currently part of page pSrc but will ultimately be part +** of pPage. (pSrc and pPager are often the same.) If pCell contains a +** pointer to an overflow page, insert an entry into the pointer-map for +** the overflow page that will be valid after pCell has been moved to pPage. */ -static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ +static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ CellInfo info; if( *pRC ) return; assert( pCell!=0 ); pPage->xParseCell(pPage, pCell, &info); if( info.nLocalaDataEnd, pCell, pCell+info.nLocal) ){ + if( SQLITE_WITHIN(pSrc->aDataEnd, pCell, pCell+info.nLocal) ){ + testcase( pSrc!=pPage ); *pRC = SQLITE_CORRUPT_BKPT; return; } @@ -3491,7 +3493,7 @@ static int setChildPtrmaps(MemPage *pPage){ for(i=0; ileaf ){ Pgno childPgno = get4byte(pCell); @@ -6677,7 +6679,7 @@ static void insertCell( /* The cell may contain a pointer to an overflow page. If so, write ** the entry for the overflow page into the pointer map. */ - ptrmapPutOvflPtr(pPage, pCell, pRC); + ptrmapPutOvflPtr(pPage, pPage, pCell, pRC); } #endif } @@ -7093,7 +7095,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ if( ISAUTOVACUUM ){ ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); if( szCell>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pNew, pCell, &rc); } } @@ -7316,10 +7318,6 @@ static int balance_nonroot( assert( sqlite3_mutex_held(pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); -#if 0 - TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno)); -#endif - /* At this point pParent may have at most one overflow cell. And if ** this overflow cell is present, it must be the cell with ** index iParentIdx. This scenario comes about when this function @@ -7785,7 +7783,8 @@ static int balance_nonroot( ** populated, not here. */ if( ISAUTOVACUUM ){ - MemPage *pNew = apNew[0]; + MemPage *pOld; + MemPage *pNew = pOld = apNew[0]; u8 *aOld = pNew->aData; int cntOldNext = pNew->nCell + pNew->nOverflow; int usableSize = pBt->usableSize; @@ -7795,7 +7794,7 @@ static int balance_nonroot( for(i=0; inCell + pOld->nOverflow + !leafData; aOld = pOld->aData; } @@ -7818,7 +7817,7 @@ static int balance_nonroot( ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); } if( cachedCellSize(&b,i)>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pOld, pCell, &rc); } if( rc ) goto balance_cleanup; } From f202c6cdcfdc96fb2959133903d3ed5026b733d2 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 13 Jan 2019 20:17:52 +0000 Subject: [PATCH 056/306] Relax the minimum size database file constraint on the dbtotxt utility program. FossilOrigin-Name: 97e723d746eeb2159f5bf1701532271ac6a4620879c82d496f4499c178b64479 --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/dbtotxt.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 0a6ad88ff3..1707c6d4e5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sof\sdatabase\scorruption\swhile\sbalancing\spages\sfrom\san\nauto_vacuum\sdatabase\swith\soverflow\spages.\s\sTest\scases\sin\sTH3. -D 2019-01-13T20:17:21.006 +C Relax\sthe\sminimum\ssize\sdatabase\sfile\sconstraint\son\sthe\sdbtotxt\sutility\sprogram. +D 2019-01-13T20:17:52.605 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -1706,7 +1706,7 @@ F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 F tool/cg_anno.tcl f95b0006c52cf7f0496b506343415b6ee3cdcdd3 x F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/dbhash.c a06228aa21ebc4e6ea8daa486601d938499238a5 -F tool/dbtotxt.c 126da0c130f446106d0e9894d0d86640214d5a7f159c99985088e51cde4f5a09 +F tool/dbtotxt.c 04e25f26be7c7743cdfb4111a8483de0b111925d6afeeb7559ade0ceb73f7f52 F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 @@ -1798,7 +1798,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 ac3b6021d9437ab1c027850d321f0a3e575b008763d8d515e2347f7d4e7c294b -R b3c41bca6e263f72d137d37d5ad93455 +P 35f04235c477501390acea126d07a730d81d03cdf7abcd82d861e397b3f75b0f +R a7199e598cf59242d3490ce34402fc8b U drh -Z db68a7c462e1085d4719c3b28e40f5d1 +Z e0556037eed9424da9e46a11c6d6dc83 diff --git a/manifest.uuid b/manifest.uuid index fad6c71ba5..3454a21595 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35f04235c477501390acea126d07a730d81d03cdf7abcd82d861e397b3f75b0f \ No newline at end of file +97e723d746eeb2159f5bf1701532271ac6a4620879c82d496f4499c178b64479 \ No newline at end of file diff --git a/tool/dbtotxt.c b/tool/dbtotxt.c index 41bcb4cdeb..ddc9e34196 100644 --- a/tool/dbtotxt.c +++ b/tool/dbtotxt.c @@ -93,8 +93,8 @@ int main(int argc, char **argv){ fseek(in, 0, SEEK_END); szFile = ftell(in); rewind(in); - if( szFile<512 ){ - fprintf(stderr, "File too short. Minimum size is 512 bytes.\n"); + if( szFile<100 ){ + fprintf(stderr, "File too short. Minimum size is 100 bytes.\n"); exit(1); } if( fread(aHdr, 100, 1, in)!=1 ){ From b10a50e7f829f7038242db6f52b557e7624df412 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 13 Jan 2019 20:23:34 +0000 Subject: [PATCH 057/306] In dbfuzz2, avoid using a malloc in the LLVMFuzzerInitialize() initializer routine, so that no memory leaks are reported. Also, show the version of SQLite being used when the -v option is on. FossilOrigin-Name: 824f93246988ffa213bbd41a7de08886999b1a8ae00fdf6b9767acb6e3ec6a1f --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz2.c | 12 +++++------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 1707c6d4e5..748233bc00 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Relax\sthe\sminimum\ssize\sdatabase\sfile\sconstraint\son\sthe\sdbtotxt\sutility\sprogram. -D 2019-01-13T20:17:52.605 +C In\sdbfuzz2,\savoid\susing\sa\smalloc\sin\sthe\sLLVMFuzzerInitialize()\sinitializer\nroutine,\sso\sthat\sno\smemory\sleaks\sare\sreported.\s\sAlso,\sshow\sthe\sversion\sof\nSQLite\sbeing\sused\swhen\sthe\s-v\soption\sis\son. +D 2019-01-13T20:23:34.262 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -781,7 +781,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 5659cbbc01e38678c119c8a58071cac59d0d6c71837a385f3d1838012f12e1e1 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c b31e0383472d88d25c0f2143e6f86ccef699703d3cee0d5865cef062e42ccf4b +F test/dbfuzz2.c cf600006051826b4c923471a0f502813d5e10f27bc627fac5a7d26c831765364 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1798,7 +1798,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 35f04235c477501390acea126d07a730d81d03cdf7abcd82d861e397b3f75b0f -R a7199e598cf59242d3490ce34402fc8b +P 97e723d746eeb2159f5bf1701532271ac6a4620879c82d496f4499c178b64479 +R 018cc9497956b71ce50ebe4039e4c70b U drh -Z e0556037eed9424da9e46a11c6d6dc83 +Z e7be8d96bead9a75143219194f67e213 diff --git a/manifest.uuid b/manifest.uuid index 3454a21595..db2e7a643b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -97e723d746eeb2159f5bf1701532271ac6a4620879c82d496f4499c178b64479 \ No newline at end of file +824f93246988ffa213bbd41a7de08886999b1a8ae00fdf6b9767acb6e3ec6a1f \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 0bf0f0888b..212327ff6b 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -134,11 +134,7 @@ static int numberOfVChar(const char *z){ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ int i, j, n; int argc = *pArgc; - char **newArgv; char **argv = *pArgv; - newArgv = malloc( sizeof(char*)*(argc+1) ); - if( newArgv==0 ) return 0; - newArgv[0] = argv[0]; for(i=j=1; i0 ){ + printf("SQLite %s\n", sqlite3_sourceid()); + } return 0; } #endif /*STANDALONE*/ From d12db3dabb11873ba51e3e090e818d645c6d33d8 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 14 Jan 2019 05:48:10 +0000 Subject: [PATCH 058/306] Avoid reading off the front of a page buffer when balancing a corrupt btree page. FossilOrigin-Name: cb50509020d952fa9efed8df7fa08b07b71ae9bdbdefea216b6e660863291039 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 9 ++++++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 748233bc00..12937cedc5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sdbfuzz2,\savoid\susing\sa\smalloc\sin\sthe\sLLVMFuzzerInitialize()\sinitializer\nroutine,\sso\sthat\sno\smemory\sleaks\sare\sreported.\s\sAlso,\sshow\sthe\sversion\sof\nSQLite\sbeing\sused\swhen\sthe\s-v\soption\sis\son. -D 2019-01-13T20:23:34.262 +C Avoid\sreading\soff\sthe\sfront\sof\sa\spage\sbuffer\swhen\sbalancing\sa\scorrupt\nbtree\spage. +D 2019-01-14T05:48:10.140 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -453,7 +453,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c d2ee84255b7372e6a70447f3e260eadfca38d25b1039cf88341df4225cbb3e0e +F src/btree.c a1030989a43bb21fde08fbe26e201009b70956560e5663317106f75c45937ac9 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c b1e24f1deedee07955cad9c56928cdafa7df1615746688e817bfe0b020a68576 @@ -1798,7 +1798,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 97e723d746eeb2159f5bf1701532271ac6a4620879c82d496f4499c178b64479 -R 018cc9497956b71ce50ebe4039e4c70b +P 824f93246988ffa213bbd41a7de08886999b1a8ae00fdf6b9767acb6e3ec6a1f +R 2f2adf3a3a2ba32a22ec63d497830a09 U drh -Z e7be8d96bead9a75143219194f67e213 +Z 39dac29da4f114d88e1d1d0c8c22da61 diff --git a/manifest.uuid b/manifest.uuid index db2e7a643b..ee5a202d5e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -824f93246988ffa213bbd41a7de08886999b1a8ae00fdf6b9767acb6e3ec6a1f \ No newline at end of file +cb50509020d952fa9efed8df7fa08b07b71ae9bdbdefea216b6e660863291039 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 6b8bb0d01b..85c942d248 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6663,9 +6663,16 @@ static void insertCell( assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); assert( idx+sz <= (int)pPage->pBt->usableSize ); pPage->nFree -= (u16)(2 + sz); - memcpy(&data[idx], pCell, sz); if( iChild ){ + /* In a corrupt database where an entry in the cell index section of + ** a btree page has a value of 3 or less, the pCell value might point + ** as many as 4 bytes in front of the start of the aData buffer for + ** the source page. Make sure this does not cause problems by not + ** reading the first 4 bytes */ + memcpy(&data[idx+4], pCell+4, sz-4); put4byte(&data[idx], iChild); + }else{ + memcpy(&data[idx], pCell, sz); } pIns = pPage->aCellIdx + i*2; memmove(pIns+2, pIns, 2*(pPage->nCell - i)); From 68c1f9ce9a33d745205d21261cb44124dde057bc Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 14 Jan 2019 11:56:13 +0000 Subject: [PATCH 059/306] Have fts3 ignore empty sets of parenthesis if built with SQLITE_ENABLE_FTS3_PARENTHESIS. FossilOrigin-Name: c93c6b45a317c40eb5c0abb6620d21f5821a601632c791e11e5ce62e039eccda --- ext/fts3/fts3_expr.c | 1 - manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts3expr5.test | 19 +++++++++++++++++++ 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_expr.c b/ext/fts3/fts3_expr.c index a8462020e1..5775fbca3c 100644 --- a/ext/fts3/fts3_expr.c +++ b/ext/fts3/fts3_expr.c @@ -497,7 +497,6 @@ static int getNextNode( int nConsumed = 0; pParse->nNest++; rc = fts3ExprParse(pParse, zInput+1, nInput-1, ppExpr, &nConsumed); - if( rc==SQLITE_OK && !*ppExpr ){ rc = SQLITE_DONE; } *pnConsumed = (int)(zInput - z) + 1 + nConsumed; return rc; }else if( *zInput==')' ){ diff --git a/manifest b/manifest index 12937cedc5..6ad24704e2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sreading\soff\sthe\sfront\sof\sa\spage\sbuffer\swhen\sbalancing\sa\scorrupt\nbtree\spage. -D 2019-01-14T05:48:10.140 +C Have\sfts3\signore\sempty\ssets\sof\sparenthesis\sif\sbuilt\swith\nSQLITE_ENABLE_FTS3_PARENTHESIS. +D 2019-01-14T11:56:13.183 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -84,7 +84,7 @@ F ext/fts3/fts3.c 51313386427f23d5aa3e09688272f4e6bcf2fb28700687ee2676af37f0a7af F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 3378157f383540857a466420b8279626204434c3eb0dc948ad9bcd3991fc41f5 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b -F ext/fts3/fts3_expr.c 677055b511a8bee2ae818b32f3f7fc8601411522acd5c6a734489049ec9fe529 +F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 @@ -927,7 +927,7 @@ F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c7 F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 F test/fts3expr4.test cac5dd815fe6b5921741abdccdde3b7f50b86394de91e13308ee7986859c4a9f -F test/fts3expr5.test f9abfffbf5e53d48a33e12a1e8f8ba2c551c9b49 +F test/fts3expr5.test 1368738e3298a7ce0dee3a44d6ebb8f468b2a76f3d1dd18d4ea6d8bc2eeccc1b F test/fts3fault.test 9fb7d6266a38806de841f7244bac1b0fe3a1477184bbb10b172d19d2ca6ad692 F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 @@ -1798,7 +1798,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 824f93246988ffa213bbd41a7de08886999b1a8ae00fdf6b9767acb6e3ec6a1f -R 2f2adf3a3a2ba32a22ec63d497830a09 -U drh -Z 39dac29da4f114d88e1d1d0c8c22da61 +P cb50509020d952fa9efed8df7fa08b07b71ae9bdbdefea216b6e660863291039 +R 513c5d5d05a7bf68768d7506be1c538c +U dan +Z 3cd69cc1dca89ff927ba89ca9d578a1e diff --git a/manifest.uuid b/manifest.uuid index ee5a202d5e..fab212f009 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb50509020d952fa9efed8df7fa08b07b71ae9bdbdefea216b6e660863291039 \ No newline at end of file +c93c6b45a317c40eb5c0abb6620d21f5821a601632c791e11e5ce62e039eccda \ No newline at end of file diff --git a/test/fts3expr5.test b/test/fts3expr5.test index 1e0985108e..8673abb73b 100644 --- a/test/fts3expr5.test +++ b/test/fts3expr5.test @@ -22,6 +22,10 @@ ifcapable !fts3 { return } +proc test_fts3expr {expr} { + db one {SELECT fts3_exprtest('simple', $expr, 'a', 'b', 'c')} +} + #------------------------------------------------------------------------- # Various forms of empty phrase expressions. # @@ -45,4 +49,19 @@ do_execsql_test 1.5 { SELECT rowid FROM t0 WHERE x MATCH '""""'; } {} +#------------------------------------------------------------------------- +# Various forms of empty phrase expressions. +# +set sqlite_fts3_enable_parentheses 1 +do_test 2.0 { + test_fts3expr {(a:123)(b:234)()(c:456)} +} {AND {AND {PHRASE 0 0 123} {PHRASE 1 0 234}} {PHRASE 2 0 456}} +do_test 2.1 { + test_fts3expr {(a:123)(b:234)(c:456)} +} {AND {AND {PHRASE 0 0 123} {PHRASE 1 0 234}} {PHRASE 2 0 456}} +do_test 2.2 { + list [catch { test_fts3expr {"123" AND ( )} } msg] $msg +} {1 {Error parsing expression}} + finish_test + From 4067ce7d540454978a970abb2042fc143af0397e Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 14 Jan 2019 13:32:15 +0000 Subject: [PATCH 060/306] When parsing a corrupt record using sqlite3VdbeRecordUnpack(), make sure that the resulting UnpackedRecord object is completely initialized, to avoid (harmless) MSAN warnings. FossilOrigin-Name: ddc3697efd61830fad55c6bf7f9115f4a7f53e08838eba5a82e1406c7a721665 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeaux.c | 7 +++++++ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 6ad24704e2..27bc56d4ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sfts3\signore\sempty\ssets\sof\sparenthesis\sif\sbuilt\swith\nSQLITE_ENABLE_FTS3_PARENTHESIS. -D 2019-01-14T11:56:13.183 +C When\sparsing\sa\scorrupt\srecord\susing\ssqlite3VdbeRecordUnpack(),\smake\ssure\nthat\sthe\sresulting\sUnpackedRecord\sobject\sis\scompletely\sinitialized,\sto\savoid\n(harmless)\sMSAN\swarnings. +D 2019-01-14T13:32:15.811 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -587,7 +587,7 @@ F src/vdbe.c 1919d490e97bfc59eab4d43444a53a6717d06137295ed684a25e5df7430d9974 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 -F src/vdbeaux.c 6e8cf4dd3cf095231af8ecf3c1b986f37e0bad9d7db255d53c1ea6766af7c986 +F src/vdbeaux.c c0c3c0820cd4f85f449876a068258f0691c5dbaa5b3f9e3dfa652f56ec101578 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f @@ -1798,7 +1798,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 cb50509020d952fa9efed8df7fa08b07b71ae9bdbdefea216b6e660863291039 -R 513c5d5d05a7bf68768d7506be1c538c -U dan -Z 3cd69cc1dca89ff927ba89ca9d578a1e +P c93c6b45a317c40eb5c0abb6620d21f5821a601632c791e11e5ce62e039eccda +R 3507d4ff938f8a3f9aade20909b41836 +U drh +Z 2333778276c1cc3925abbf197e14cec8 diff --git a/manifest.uuid b/manifest.uuid index fab212f009..afc2d770a1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c93c6b45a317c40eb5c0abb6620d21f5821a601632c791e11e5ce62e039eccda \ No newline at end of file +ddc3697efd61830fad55c6bf7f9115f4a7f53e08838eba5a82e1406c7a721665 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 1af8a6f111..57b3db8c1a 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3818,6 +3818,13 @@ void sqlite3VdbeRecordUnpack( pMem++; if( (++u)>=p->nField ) break; } + if( d>nKey && u ){ + assert( CORRUPT_DB ); + /* In a corrupt record entry, the last pMem might have been set up using + ** uninitialized memory. Overwrite its value with NULL, to prevent + ** warnings from MSAN. */ + sqlite3VdbeMemSetNull(pMem-1); + } assert( u<=pKeyInfo->nKeyField + 1 ); p->nField = u; } From 94ec92a1f7c3aef3be16e00d53c1b876e1cd832c Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 14 Jan 2019 15:09:00 +0000 Subject: [PATCH 061/306] Fix a problem with querying a corrupt fts3 database. FossilOrigin-Name: 65e50706a017751d72d0f9c7f575955194977decd0acf13aaca90c3cb925f20e --- ext/fts3/fts3_write.c | 4 +- manifest | 16 ++-- manifest.uuid | 2 +- test/fts3corrupt4.test | 203 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 215 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 7535c36592..0b06669589 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -2961,7 +2961,9 @@ int sqlite3Fts3SegReaderStep( }else{ iDelta = iDocid - iPrev; } - assert( iDelta>0 || (nDoclist==0 && iDelta==iDocid) ); + if( iDelta<=0 && (nDoclist>0 || iDelta!=iDocid) ){ + return FTS_CORRUPT_VTAB; + } assert( nDoclist>0 || iDelta==iDocid ); nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); diff --git a/manifest b/manifest index 27bc56d4ea..c7dab056d4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sparsing\sa\scorrupt\srecord\susing\ssqlite3VdbeRecordUnpack(),\smake\ssure\nthat\sthe\sresulting\sUnpackedRecord\sobject\sis\scompletely\sinitialized,\sto\savoid\n(harmless)\sMSAN\swarnings. -D 2019-01-14T13:32:15.811 +C Fix\sa\sproblem\swith\squerying\sa\scorrupt\sfts3\sdatabase. +D 2019-01-14T15:09:00.865 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -98,7 +98,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 18726fbd2aab23ff069d9d61b532e8c38bb2f66cfa61d8550537850971526210 +F ext/fts3/fts3_write.c 9d9c77ee985010d568e4b4d5122e6d5e2924f98e0bd04daf65af88fe9295d622 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -915,7 +915,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 6c5fe11f2692c6fb72358d2379eb2c7f9381b35484ea4f671df4591ec20c4485 +F test/fts3corrupt4.test 8399202555dc336e6514c906f15e8064ce9fe30ae07628adbd79867203f5301b F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1798,7 +1798,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 c93c6b45a317c40eb5c0abb6620d21f5821a601632c791e11e5ce62e039eccda -R 3507d4ff938f8a3f9aade20909b41836 -U drh -Z 2333778276c1cc3925abbf197e14cec8 +P ddc3697efd61830fad55c6bf7f9115f4a7f53e08838eba5a82e1406c7a721665 +R 323e1cd08a3be7f38cddf21d9d1321a4 +U dan +Z 3562fb49b192c80a18f1b43105c29727 diff --git a/manifest.uuid b/manifest.uuid index afc2d770a1..d7aaa4c8bb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ddc3697efd61830fad55c6bf7f9115f4a7f53e08838eba5a82e1406c7a721665 \ No newline at end of file +65e50706a017751d72d0f9c7f575955194977decd0acf13aaca90c3cb925f20e \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index da3e99242a..d6ad0a9005 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -557,4 +557,207 @@ do_catchsql_test 7.1 { SELECT matchinfo(t1,'y') FROM t1 WHERE t1 MATCH 'e*'; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 8.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-7948058d822acb.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 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 72 04 43 52 45 41 54 45 20 54 _segdir.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 00 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 67 42 06 r sint occaecgB. +| 3712: 37 57 06 96 46 17 46 17 42 06 e6 f6 e2 07 07 26 7W..F.F.B......& +| 3728: f6 96 46 56 e7 42 c2 a0 60 30 05 b6 36 96 c6 c7 ..FV.B..`0..6... +| 3744: 56 d2 06 46 f6 c6 f7 26 52 06 57 52 06 67 56 7c V..F...&R.WR.gV| +| 3760: 65 3f 04 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 e?. nulla pariat +| 3776: 75 72 2e 42 05 04 00 81 09 44 75 69 73 20 61 75 ur.B.....Duis au +| 3792: 74 65 20 69 72 75 72 65 20 64 6f 6c 6f 72 20 69 te irure dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 73 65 2b 04 03 00 5d 6e 69 73 69 it esse+...]nisi +| 3856: 20 75 74 20 61 7c 69 71 75 69 70 20 65 78 20 65 ut a|iquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 61 6c 69 dolore magna ali +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 psum dolor sit a +| 4064: 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 met, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 00 00 91 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 02 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 30 03 03 00 01 01 73 06 l......n0.....s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 03 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 03 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 02 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 02 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 13 .......0 251..a. +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 03 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 07 00 01 03 00 80 00 15 03 00 01 ................ +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 00 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 07 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 40 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 .@....e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-7948058d822acb.db +}]} {} + +do_catchsql_test 8.1 { + SELECT matchinfo(t1,'x') FROM t1 WHERE t1 MATCH 'e*'; +} {1 {database disk image is malformed}} + finish_test + + From f8a488bb6b89b1657badfff3e77add3be8fc9333 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 14 Jan 2019 15:35:15 +0000 Subject: [PATCH 062/306] Fix a problem causing a crash if an fts5vocab table was created to query an fts3/4 FTS index. FossilOrigin-Name: 9cd64ce453e4435d80117b8610c22a0a4b53cd6e84b39815e70e684f6b0295c8 --- ext/fts5/fts5_main.c | 12 ++++++------ ext/fts5/test/fts5vocab2.test | 32 ++++++++++++++++++++++++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 6fc5a90311..07934ebdfc 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -2244,13 +2244,13 @@ Fts5Index *sqlite3Fts5IndexFromCsrid( Fts5Config **ppConfig /* OUT: Configuration object */ ){ Fts5Cursor *pCsr; - Fts5Table *pTab; - pCsr = fts5CursorFromCsrid(pGlobal, iCsrId); - pTab = (Fts5Table*)pCsr->base.pVtab; - *ppConfig = pTab->pConfig; - - return pTab->pIndex; + if( pCsr ){ + Fts5Table *pTab = (Fts5Table*)pCsr->base.pVtab; + *ppConfig = pTab->pConfig; + return pTab->pIndex; + } + return 0; } /* diff --git a/ext/fts5/test/fts5vocab2.test b/ext/fts5/test/fts5vocab2.test index f906b7ce90..45d657146f 100644 --- a/ext/fts5/test/fts5vocab2.test +++ b/ext/fts5/test/fts5vocab2.test @@ -202,4 +202,36 @@ do_execsql_test 3.5 { SELECT * FROM v1; } {} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE v1 USING fts5vocab(nosuchtable, col); +} + +do_catchsql_test 4.1 { + SELECT * FROM v1 WHERE term=='nosuchterm'; +} {1 {no such fts5 table: main.nosuchtable}} + +do_execsql_test 4.2.1 { + CREATE TABLE nosuchtable(nosuchtable, y, z); +} +do_catchsql_test 4.2.2 { + SELECT * FROM v1 WHERE term=='nosuchterm'; +} {1 {no such fts5 table: main.nosuchtable}} + +ifcapable fts3 { + do_execsql_test 4.3.1 { + DROP TABLE nosuchtable; + CREATE VIRTUAL TABLE nosuchtable USING fts3(a, b); + } {} + do_catchsql_test 4.3.2 { + SELECT * FROM v1 WHERE term=='nosuchterm'; + } {1 {no such fts5 table: main.nosuchtable}} + do_catchsql_test 4.3.3 { + INSERT INTO nosuchtable VALUES('id', '*id'); + SELECT * FROM v1 WHERE term=='nosuchterm'; + } {1 {no such fts5 table: main.nosuchtable}} +} + finish_test diff --git a/manifest b/manifest index c7dab056d4..e2f5a2b408 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\squerying\sa\scorrupt\sfts3\sdatabase. -D 2019-01-14T15:09:00.865 +C Fix\sa\sproblem\scausing\sa\scrash\sif\san\sfts5vocab\stable\swas\screated\sto\squery\san\nfts3/4\sFTS\sindex. +D 2019-01-14T15:35:15.573 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -116,7 +116,7 @@ F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe1 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 F ext/fts5/fts5_index.c ba68cfbd786ff50d84c23c841ac44063a5f939b37ae9e320bcbaf2baabc34608 -F ext/fts5/fts5_main.c 90062ccfc54031ff97660e277d868ec080c5b46e42d784856385b12645e60ed6 +F ext/fts5/fts5_main.c ea863c28474f9a3903f37f27fc1894fa0a4eb786435f0b95575fa496d0886e22 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -218,7 +218,7 @@ F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db638 F ext/fts5/test/fts5update.test 3f0e75ba7640adfdb89953ce9d5a807cb7525c60cf3ebaaa15257510773e66c8 F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a F ext/fts5/test/fts5vocab.test 26e069050d6fb389e67f7a9402421948233152ae433e6b8da47cf15d3b5a8d26 -F ext/fts5/test/fts5vocab2.test 5472d6cd852fe848876892c48a754c82af018bf08ca16f1f167db59dc64586f7 +F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 @@ -1798,7 +1798,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 ddc3697efd61830fad55c6bf7f9115f4a7f53e08838eba5a82e1406c7a721665 -R 323e1cd08a3be7f38cddf21d9d1321a4 +P 65e50706a017751d72d0f9c7f575955194977decd0acf13aaca90c3cb925f20e +R 13fb83cbbd4ed093aa980d87f465f513 U dan -Z 3562fb49b192c80a18f1b43105c29727 +Z de4b903b843670f3eeae239fb952f2f8 diff --git a/manifest.uuid b/manifest.uuid index d7aaa4c8bb..18b7701301 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -65e50706a017751d72d0f9c7f575955194977decd0acf13aaca90c3cb925f20e \ No newline at end of file +9cd64ce453e4435d80117b8610c22a0a4b53cd6e84b39815e70e684f6b0295c8 \ No newline at end of file From 4ead96348e5aacfcf480aae141d0ab8dccfa4760 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 14 Jan 2019 16:16:30 +0000 Subject: [PATCH 063/306] Add the "prefixes" table-valued function in the ext/misc folder. FossilOrigin-Name: f0fd2163fc23a555ef03af43294a14fcabae6921f52e64c979286c745b4f6218 --- ext/misc/prefixes.c | 265 ++++++++++++++++++++++++++++++++++++++++++++ manifest | 13 ++- manifest.uuid | 2 +- 3 files changed, 273 insertions(+), 7 deletions(-) create mode 100644 ext/misc/prefixes.c diff --git a/ext/misc/prefixes.c b/ext/misc/prefixes.c new file mode 100644 index 0000000000..b74cb61a67 --- /dev/null +++ b/ext/misc/prefixes.c @@ -0,0 +1,265 @@ +/* +** 2018-04-19 +** +** 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 a table-valued function: +** +** prefixes('abcdefg') +** +** The function has a single (non-HIDDEN) column named prefix that takes +** on all prefixes of the string in its argument, including an empty string +** and the input string itself. The order of prefixes is from longest +** to shortest. +*/ +#if !defined(SQLITEINT_H) +#include "sqlite3ext.h" +#endif +SQLITE_EXTENSION_INIT1 +#include +#include + +/* prefixes_vtab is a subclass of sqlite3_vtab which is +** underlying representation of the virtual table +*/ +typedef struct prefixes_vtab prefixes_vtab; +struct prefixes_vtab { + sqlite3_vtab base; /* Base class - must be first */ + /* No additional fields are necessary */ +}; + +/* prefixes_cursor is a subclass of sqlite3_vtab_cursor which will +** serve as the underlying representation of a cursor that scans +** over rows of the result +*/ +typedef struct prefixes_cursor prefixes_cursor; +struct prefixes_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3_int64 iRowid; /* The rowid */ + char *zStr; /* Original string to be prefixed */ + int nStr; /* Length of the string in bytes */ +}; + +/* +** The prefixesConnect() method is invoked to create a new +** template virtual table. +** +** Think of this routine as the constructor for prefixes_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the prefixes_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against the virtual table will look like. +*/ +static int prefixesConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + prefixes_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE prefixes(prefix TEXT, original_string TEXT HIDDEN)" + ); + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +/* +** This method is the destructor for prefixes_vtab objects. +*/ +static int prefixesDisconnect(sqlite3_vtab *pVtab){ + prefixes_vtab *p = (prefixes_vtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Constructor for a new prefixes_cursor object. +*/ +static int prefixesOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + prefixes_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Destructor for a prefixes_cursor. +*/ +static int prefixesClose(sqlite3_vtab_cursor *cur){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + sqlite3_free(pCur->zStr); + sqlite3_free(pCur); + return SQLITE_OK; +} + + +/* +** Advance a prefixes_cursor to its next row of output. +*/ +static int prefixesNext(sqlite3_vtab_cursor *cur){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + pCur->iRowid++; + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the prefixes_cursor +** is currently pointing. +*/ +static int prefixesColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + switch( i ){ + case 0: + sqlite3_result_text(ctx, pCur->zStr, pCur->nStr - (int)pCur->iRowid, + 0); + break; + default: + sqlite3_result_text(ctx, pCur->zStr, pCur->nStr, 0); + break; + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int prefixesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int prefixesEof(sqlite3_vtab_cursor *cur){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + return pCur->iRowid>pCur->nStr; +} + +/* +** This method is called to "rewind" the prefixes_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to prefixesColumn() or prefixesRowid() or +** prefixesEof(). +*/ +static int prefixesFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + prefixes_cursor *pCur = (prefixes_cursor *)pVtabCursor; + sqlite3_free(pCur->zStr); + if( argc>0 ){ + pCur->zStr = sqlite3_mprintf("%s", sqlite3_value_text(argv[0])); + pCur->nStr = pCur->zStr ? (int)strlen(pCur->zStr) : 0; + }else{ + pCur->zStr = 0; + pCur->nStr = 0; + } + pCur->iRowid = 0; + return SQLITE_OK; +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +*/ +static int prefixesBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + /* Search for a usable equality constraint against column 1 + ** (original_string) and use it if at all possible */ + int i; + const struct sqlite3_index_constraint *p; + + for(i=0, p=pIdxInfo->aConstraint; inConstraint; i++, p++){ + if( p->iColumn!=1 ) continue; + if( p->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( !p->usable ) continue; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->estimatedCost = (double)10; + pIdxInfo->estimatedRows = 10; + return SQLITE_OK; + } + pIdxInfo->estimatedCost = (double)1000000000; + pIdxInfo->estimatedRows = 1000000000; + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** virtual table. +*/ +static sqlite3_module prefixesModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ prefixesConnect, + /* xBestIndex */ prefixesBestIndex, + /* xDisconnect */ prefixesDisconnect, + /* xDestroy */ 0, + /* xOpen */ prefixesOpen, + /* xClose */ prefixesClose, + /* xFilter */ prefixesFilter, + /* xNext */ prefixesNext, + /* xEof */ prefixesEof, + /* xColumn */ prefixesColumn, + /* xRowid */ prefixesRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0 +}; + + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_prefixes_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + rc = sqlite3_create_module(db, "prefixes", &prefixesModule, 0); + return rc; +} diff --git a/manifest b/manifest index e2f5a2b408..172ea75f99 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\scausing\sa\scrash\sif\san\sfts5vocab\stable\swas\screated\sto\squery\san\nfts3/4\sFTS\sindex. -D 2019-01-14T15:35:15.573 +C Add\sthe\s"prefixes"\stable-valued\sfunction\sin\sthe\sext/misc\sfolder. +D 2019-01-14T16:16:30.437 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -295,6 +295,7 @@ F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224 F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c F ext/misc/percentile.c a6a1594c104da2d0ceab38fe609eb2f65529272377827f6f8a2b5c9fa6119e7e +F ext/misc/prefixes.c ac95cf723927b9e4b6f2b45eec743986259e3c2618f92ffa9fd780e13c75f70e F ext/misc/regexp.c 79345bf03496155a640ee0300d3307296761cebb5e115b4e342cc2fb5861ec10 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 540a169cb0d74f15522a8930b0cccdcb37a4fd071d219a5a083a319fc6e8db77 @@ -1798,7 +1799,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 65e50706a017751d72d0f9c7f575955194977decd0acf13aaca90c3cb925f20e -R 13fb83cbbd4ed093aa980d87f465f513 -U dan -Z de4b903b843670f3eeae239fb952f2f8 +P 9cd64ce453e4435d80117b8610c22a0a4b53cd6e84b39815e70e684f6b0295c8 +R e9e76e5c2ca649c80198f4ce0b8026d6 +U drh +Z 111aac904e6040781b0bacf239392c1f diff --git a/manifest.uuid b/manifest.uuid index 18b7701301..f3da4967d9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9cd64ce453e4435d80117b8610c22a0a4b53cd6e84b39815e70e684f6b0295c8 \ No newline at end of file +f0fd2163fc23a555ef03af43294a14fcabae6921f52e64c979286c745b4f6218 \ No newline at end of file From 9274ad898fdff78fe1838361844ee483e5cc00ed Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 14 Jan 2019 19:13:30 +0000 Subject: [PATCH 064/306] Fix a problem causing some Tcl test cases to fail with errors like "expected: [], got: []". FossilOrigin-Name: 11b8a4cba747ca214fe3506caa3b711c87be4d55412754e673cc0603afefb086 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/tester.tcl | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 172ea75f99..424e846b4f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"prefixes"\stable-valued\sfunction\sin\sthe\sext/misc\sfolder. -D 2019-01-14T16:16:30.437 +C Fix\sa\sproblem\scausing\ssome\sTcl\stest\scases\sto\sfail\swith\serrors\slike\s"expected:\s[],\sgot:\s[]". +D 2019-01-14T19:13:30.596 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b @@ -1368,7 +1368,7 @@ F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl fa5656391e3b477508abe12b3b81f019b2e71397399ab38a2f32d8d7f3bf8e56 +F test/tester.tcl aafcd5b0bc0f7f5c0fc95fb09964ac1055e371d00881c30b42280e9d5e956206 F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1799,7 +1799,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 9cd64ce453e4435d80117b8610c22a0a4b53cd6e84b39815e70e684f6b0295c8 -R e9e76e5c2ca649c80198f4ce0b8026d6 -U drh -Z 111aac904e6040781b0bacf239392c1f +P f0fd2163fc23a555ef03af43294a14fcabae6921f52e64c979286c745b4f6218 +R 238e457d65f075aa5a49baa7e28c3f0b +U dan +Z 9ed1f14f70bf3f4d25df868a0ff2534c diff --git a/manifest.uuid b/manifest.uuid index f3da4967d9..a9f6a5e408 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f0fd2163fc23a555ef03af43294a14fcabae6921f52e64c979286c745b4f6218 \ No newline at end of file +11b8a4cba747ca214fe3506caa3b711c87be4d55412754e673cc0603afefb086 \ No newline at end of file diff --git a/test/tester.tcl b/test/tester.tcl index 14808d9cd9..99f20875f4 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -941,6 +941,12 @@ proc do_execsql_test {args} { set result "" } elseif {[llength $args]==3} { foreach {testname sql result} $args {} + + # With some versions of Tcl on windows, if $result is all whitespace but + # contains some CR/LF characters, the [list {*}$result] below returns a + # copy of $result instead of a zero length string. Not clear exactly why + # this is. The following is a workaround. + if {[llength $result]==0} { set result "" } } else { error [string trim { wrong # args: should be "do_execsql_test ?-db DB? testname sql ?result?" From 9c039d9f2e8d0ed9645c7ea419e24f08a268fb95 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 14 Jan 2019 20:44:00 +0000 Subject: [PATCH 065/306] Add scalar function "prefix_length()" to ext/misc/prefixes.c. FossilOrigin-Name: 0bf1550507d9d3c8a41f8a50db3a59bf808f0a4e24637dc0905d35579305eca7 --- Makefile.in | 1 + Makefile.msc | 1 + ext/misc/prefixes.c | 52 +++++++++++++++++++++++++++ main.mk | 1 + manifest | 21 +++++------ manifest.uuid | 2 +- src/test1.c | 2 ++ test/prefixes.test | 88 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 test/prefixes.test diff --git a/Makefile.in b/Makefile.in index 4eec340b0f..219fc4f0ca 100644 --- a/Makefile.in +++ b/Makefile.in @@ -452,6 +452,7 @@ TESTSRC += \ $(TOP)/ext/misc/nextchar.c \ $(TOP)/ext/misc/normalize.c \ $(TOP)/ext/misc/percentile.c \ + $(TOP)/ext/misc/prefixes.c \ $(TOP)/ext/misc/regexp.c \ $(TOP)/ext/misc/remember.c \ $(TOP)/ext/misc/series.c \ diff --git a/Makefile.msc b/Makefile.msc index 179215ecf4..a4f0e1ef64 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1527,6 +1527,7 @@ TESTEXT = \ $(TOP)\ext\misc\nextchar.c \ $(TOP)\ext\misc\normalize.c \ $(TOP)\ext\misc\percentile.c \ + $(TOP)\ext\misc\prefixes.c \ $(TOP)\ext\misc\regexp.c \ $(TOP)\ext\misc\remember.c \ $(TOP)\ext\misc\series.c \ diff --git a/ext/misc/prefixes.c b/ext/misc/prefixes.c index b74cb61a67..a2f5b3289d 100644 --- a/ext/misc/prefixes.c +++ b/ext/misc/prefixes.c @@ -249,6 +249,53 @@ static sqlite3_module prefixesModule = { /* xShadowName */ 0 }; +/* +** This is a copy of the SQLITE_SKIP_UTF8(zIn) macro in sqliteInt.h. +** +** Assuming zIn points to the first byte of a UTF-8 character, +** advance zIn to point to the first byte of the next UTF-8 character. +*/ +#define PREFIX_SKIP_UTF8(zIn) { \ + if( (*(zIn++))>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){ zIn++; } \ + } \ +} + +/* +** Implementation of function prefix_length(). This function accepts two +** strings as arguments and returns the length in characters (not bytes), +** of the longest prefix shared by the two strings. For example: +** +** prefix_length('abcdxxx', 'abcyy') == 3 +** prefix_length('abcdxxx', 'bcyyy') == 0 +** prefix_length('abcdxxx', 'ab') == 2 +** prefix_length('ab', 'abcd') == 2 +** +** This function assumes the input is well-formed utf-8. If it is not, +** it is possible for this function to return -1. +*/ +static void prefixLengthFunc( + sqlite3_context *ctx, + int nVal, + sqlite3_value **apVal +){ + int nByte; /* Number of bytes to compare */ + int nRet = 0; /* Return value */ + const unsigned char *zL = sqlite3_value_text(apVal[0]); + const unsigned char *zR = sqlite3_value_text(apVal[1]); + int nL = sqlite3_value_bytes(apVal[0]); + int nR = sqlite3_value_bytes(apVal[1]); + int i; + + nByte = (nL > nR ? nL : nR); + for(i=0; i],\sgot:\s[]". -D 2019-01-14T19:13:30.596 +C Add\sscalar\sfunction\s"prefix_length()"\sto\sext/misc/prefixes.c. +D 2019-01-14T20:44:00.309 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in 45a3fef4d325ac0220c2172aeec4e4321da351f073f3b8e8ddea655f49ef6f2b +F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc 3c4c7e94419ff28cb68850188c9d153b343aed4c5ebed5965426232ed67ff9d9 +F Makefile.msc 54c5921b0c65c49ea8fb5010e763c181526d6cdc1109c7ab7115c4f5bb71e13c F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee F VERSION 453e2f4529ca208196d5567db28d549d7151f79efd33f6e6cfe6e613e583a0be F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -295,7 +295,7 @@ F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224 F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c F ext/misc/percentile.c a6a1594c104da2d0ceab38fe609eb2f65529272377827f6f8a2b5c9fa6119e7e -F ext/misc/prefixes.c ac95cf723927b9e4b6f2b45eec743986259e3c2618f92ffa9fd780e13c75f70e +F ext/misc/prefixes.c 1eb85b7b64b8adf5cbb18a72c51a8f2910a7bc0fd5fbc81a9213ba4af2d51811 F ext/misc/regexp.c 79345bf03496155a640ee0300d3307296761cebb5e115b4e342cc2fb5861ec10 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 540a169cb0d74f15522a8930b0cccdcb37a4fd071d219a5a083a319fc6e8db77 @@ -435,7 +435,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 8456b6b4a5ecdb7b6b59283236b3be6393bc7eed6cbda3bcf1d552e1a63e03ff +F main.mk 20d344434cec07680fb7d7e66f6401b0f3bf915277018ac93d229b8f73678216 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -523,7 +523,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c e72862a271348d779672b45a730c33fd0c535e630ff927e8ce4a0c908d1d28c6 -F src/test1.c f78dcd39d5cad63d33306bb963354f976007968bc95c45bc9fdfaeb2e1ec0eae +F src/test1.c 64cdc914a77102e008dfae7adaa4ded54c2d4953d1464ea8709805a2aab755eb F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6 @@ -1199,6 +1199,7 @@ F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c F test/pragma4.test 52d8186f9e8d09b87189432cdd401dfa66d0b32445e837fa19046c8ae7621b0e F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 +F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 F test/printf.test a3e559bc9d922e7fe44e9d05c6965fee34fe3bc28300a4248c6a063425246ffd F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb @@ -1799,7 +1800,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 f0fd2163fc23a555ef03af43294a14fcabae6921f52e64c979286c745b4f6218 -R 238e457d65f075aa5a49baa7e28c3f0b +P 11b8a4cba747ca214fe3506caa3b711c87be4d55412754e673cc0603afefb086 +R 32ab1d3eba68373a1b0b1f4de28ca909 U dan -Z 9ed1f14f70bf3f4d25df868a0ff2534c +Z fb1a50e31aa836559e45fed0b6204d9c diff --git a/manifest.uuid b/manifest.uuid index a9f6a5e408..e315bc4b42 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -11b8a4cba747ca214fe3506caa3b711c87be4d55412754e673cc0603afefb086 \ No newline at end of file +0bf1550507d9d3c8a41f8a50db3a59bf808f0a4e24637dc0905d35579305eca7 \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index def9c7e2fd..1fd48fec6b 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7141,6 +7141,7 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( extern int sqlite3_ieee_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_nextchar_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_percentile_init(sqlite3*,char**,const sqlite3_api_routines*); + extern int sqlite3_prefixes_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_regexp_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_remember_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_series_init(sqlite3*,char**,const sqlite3_api_routines*); @@ -7166,6 +7167,7 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( { "ieee754", sqlite3_ieee_init }, { "nextchar", sqlite3_nextchar_init }, { "percentile", sqlite3_percentile_init }, + { "prefixes", sqlite3_prefixes_init }, { "regexp", sqlite3_regexp_init }, { "remember", sqlite3_remember_init }, { "series", sqlite3_series_init }, diff --git a/test/prefixes.test b/test/prefixes.test new file mode 100644 index 0000000000..2080905805 --- /dev/null +++ b/test/prefixes.test @@ -0,0 +1,88 @@ +# 2018-01-15 +# +# 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 SQLite library. The +# focus of this file is prefixes.c extension +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix unionvtab + +ifcapable !vtab { + finish_test + return +} + +load_static_extension db prefixes + +foreach {tn zLeft zRight expected} { + 1 abcdxxx abcyy 3 + 2 abcdxxx bcyyy 0 + 3 abcdxxx ab 2 + 4 ab abcd 2 + + 5 "xyz\u1234xz" "xyz\u1234xy" 5 + 6 "xyz\u1234" "xyz\u1234xy" 4 + 7 "xyz\u1234" "xyz\u1234" 4 + 8 "xyz\u1234xy" "xyz\u1234" 4 + 9 "xyz\u1234xy" "xyz\u1233" 3 + 10 "xyz\u1234xy" "xyz\u1235" 3 +} { + do_execsql_test 1.$tn { SELECT prefix_length($zLeft, $zRight) } $expected +} + + +do_execsql_test 2.0 { + CREATE TABLE t1(k TEXT UNIQUE, v INTEGER); + INSERT INTO t1 VALUES + ('aback', 1), + ('abaft', 2), + ('abandon', 3), + ('abandoned', 4), + ('abandoning', 5), + ('abandonment', 6), + ('abandons', 7), + ('abase', 8), + ('abased', 9), + ('abasement', 10), + ('abasements', 11), + ('abases', 12), + ('abash', 13), + ('abashed', 14), + ('abashes', 15), + ('abashing', 16), + ('abasing', 17), + ('abate', 18), + ('abated', 19), + ('abatement', 20), + ('abatements', 21); +} + +foreach {tn INPUT expected} { + 1 abatementt abatement + 2 abashet abash + 3 abandonio abandon + 4 abasemenu abase +} { + do_execsql_test 2.$tn { + WITH finder(str) AS ( + SELECT (SELECT max(k) FROM t1 WHERE k<=$INPUT) + UNION ALL + SELECT ( + SELECT max(k) FROM t1 + WHERE k<=substr($INPUT, 1, prefix_length(finder.str, $INPUT)) + ) FROM finder WHERE length(finder.str)>0 + ) + SELECT str FROM finder WHERE length(str)==prefix_length(str, $INPUT) LIMIT 1 + } $expected +} + +finish_test From 58ed374370522f7da3ec6d81d3c968e172399bb1 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 15 Jan 2019 14:31:01 +0000 Subject: [PATCH 066/306] Fix a problem triggered by DELETE statements with WHERE clauses that use the OR-optimization on some virtual tables. FossilOrigin-Name: ecf5caa7e9825a8b03d15ee525ec68be78c55926ddfaca27a040a7614caf0e85 --- ext/rtree/rtree6.test | 10 ++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 3 ++- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ext/rtree/rtree6.test b/ext/rtree/rtree6.test index 0cf6efacbc..bc9ff84298 100644 --- a/ext/rtree/rtree6.test +++ b/ext/rtree/rtree6.test @@ -15,6 +15,7 @@ if {![info exists testdir]} { set testdir [file join [file dirname [info script]] .. .. test] } source $testdir/tester.tcl +set testprefix rtree6 ifcapable {!rtree || rtree_int_only} { finish_test @@ -167,5 +168,14 @@ do_execsql_test rtree6-3.5 { x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>1.1 } {} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE t1 USING rtree(id,x0,x1,y0,y1); +} +do_execsql_test 4.1 { + DELETE FROM t1 WHERE x0>1 AND x1<2 OR y0<92; +} + expand_all_sql db finish_test diff --git a/manifest b/manifest index 6b9aea40c0..3233dc5ce1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sscalar\sfunction\s"prefix_length()"\sto\sext/misc/prefixes.c. -D 2019-01-14T20:44:00.309 +C Fix\sa\sproblem\striggered\sby\sDELETE\sstatements\swith\sWHERE\sclauses\sthat\suse\sthe\nOR-optimization\son\ssome\svirtual\stables. +D 2019-01-15T14:31:01.754 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -374,7 +374,7 @@ F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e5 F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2e55d3142 -F ext/rtree/rtree6.test c8623cf9facccd74987e63709c4573545bfe541d929722e1ca8a549d5b03ad11 +F ext/rtree/rtree6.test 1252a0439da01d2f1f5cbbdeeb80455a2d68b9bae2a9787937b167a5e3957828 F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf @@ -598,7 +598,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 -F src/where.c 7a1db797b6576d66424845666b122f8bc3eda0f2eb8b21518baf40407bbdf6ac +F src/where.c dc293ea4230adf9a323fb2e5750eff565347567a3cd6538f7d0fa93b11c2baae F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 @@ -1800,7 +1800,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 11b8a4cba747ca214fe3506caa3b711c87be4d55412754e673cc0603afefb086 -R 32ab1d3eba68373a1b0b1f4de28ca909 +P 0bf1550507d9d3c8a41f8a50db3a59bf808f0a4e24637dc0905d35579305eca7 +R 2c397297f134bc6152efa0485df52b10 U dan -Z fb1a50e31aa836559e45fed0b6204d9c +Z 19d23f22b9b5c0ebccb0826a548951f8 diff --git a/manifest.uuid b/manifest.uuid index e315bc4b42..844ff99792 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0bf1550507d9d3c8a41f8a50db3a59bf808f0a4e24637dc0905d35579305eca7 \ No newline at end of file +ecf5caa7e9825a8b03d15ee525ec68be78c55926ddfaca27a040a7614caf0e85 \ No newline at end of file diff --git a/src/where.c b/src/where.c index be86816af2..bb9787fcee 100644 --- a/src/where.c +++ b/src/where.c @@ -4919,9 +4919,10 @@ WhereInfo *sqlite3WhereBegin( if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ int wsFlags = pWInfo->a[0].pWLoop->wsFlags; int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + assert( !(wsFlags & WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pTab) ); if( bOnerow || ( 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) - && 0==(wsFlags & WHERE_VIRTUALTABLE) + && !IsVirtual(pTabList->a[0].pTab) && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) )){ pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; From e2dcc42e1f5bbbd3388ac824627116d0d6583996 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 15 Jan 2019 14:44:23 +0000 Subject: [PATCH 067/306] Fix a harmless memory leak in the Lemon parser generator utility program. FossilOrigin-Name: 1caff0fb0b2051e205e7a8cfd5dadf92680c52a88a441ded95b1ea6542db5f83 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/lemon.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 3233dc5ce1..0e8202c27b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\striggered\sby\sDELETE\sstatements\swith\sWHERE\sclauses\sthat\suse\sthe\nOR-optimization\son\ssome\svirtual\stables. -D 2019-01-15T14:31:01.754 +C Fix\sa\sharmless\smemory\sleak\sin\sthe\sLemon\sparser\sgenerator\sutility\sprogram. +D 2019-01-15T14:44:23.568 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -1719,7 +1719,7 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 8fd515b97522ae4b1aa6ca9847439f005d4cbaf6eb0eb416b694dba77c0263f0 F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c c9ba01f6729c892ae3e0f55c8a2d694a7e6ec3dd3aa280b411a008ef69b410cd +F tool/lemon.c 900a15b9efba9890d10e7959914db94c4ad5162912127f061c4328add122d6fb F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 @@ -1800,7 +1800,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 0bf1550507d9d3c8a41f8a50db3a59bf808f0a4e24637dc0905d35579305eca7 -R 2c397297f134bc6152efa0485df52b10 -U dan -Z 19d23f22b9b5c0ebccb0826a548951f8 +P ecf5caa7e9825a8b03d15ee525ec68be78c55926ddfaca27a040a7614caf0e85 +R 24b5673f620d25b1c990e7636a167c13 +U drh +Z 0a407a7b0060b0ce7132652c6f1c1d18 diff --git a/manifest.uuid b/manifest.uuid index 844ff99792..82d0b3eaec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ecf5caa7e9825a8b03d15ee525ec68be78c55926ddfaca27a040a7614caf0e85 \ No newline at end of file +1caff0fb0b2051e205e7a8cfd5dadf92680c52a88a441ded95b1ea6542db5f83 \ No newline at end of file diff --git a/tool/lemon.c b/tool/lemon.c index 7f0e557535..7ef99fd525 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -4674,6 +4674,7 @@ void ReportTable( /* Append any addition code the user desires */ tplt_print(out,lemp,lemp->extracode,&lineno); + acttab_free(pActtab); fclose(in); fclose(out); return; From 2d4e720579192f378a3e407e390010de38bfcdcd Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 15 Jan 2019 15:18:58 +0000 Subject: [PATCH 068/306] Have fts5 reject attempts to insert a non-integer, non-null value into a rowid column with SQLITE_MISMATCH. FossilOrigin-Name: 4a9483f81e9ca1aa41d6ca33cb3171370418ccc71fdee9741bbf6f694bf4fbaa --- ext/fts5/fts5_main.c | 75 +++++++++++++++++++---------------- ext/fts5/test/fts5update.test | 14 +++++++ manifest | 16 ++++---- manifest.uuid | 2 +- 4 files changed, 63 insertions(+), 44 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 07934ebdfc..3e35f8e939 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1497,9 +1497,8 @@ static int fts5UpdateMethod( assert( pVtab->zErrMsg==0 ); assert( nArg==1 || nArg==(2+pConfig->nCol+2) ); - assert( nArg==1 - || sqlite3_value_type(apVal[1])==SQLITE_INTEGER - || sqlite3_value_type(apVal[1])==SQLITE_NULL + assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER + || sqlite3_value_type(apVal[0])==SQLITE_NULL ); assert( pTab->pConfig->pzErrmsg==0 ); pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; @@ -1556,42 +1555,48 @@ static int fts5UpdateMethod( rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0); } - /* INSERT */ - else if( eType0!=SQLITE_INTEGER ){ - /* If this is a REPLACE, first remove the current entry (if any) */ - if( eConflict==SQLITE_REPLACE - && sqlite3_value_type(apVal[1])==SQLITE_INTEGER - ){ - i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); - } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - } - - /* UPDATE */ + /* INSERT or UPDATE */ else{ - i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ - i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ - if( iOld!=iNew ){ - if( eConflict==SQLITE_REPLACE ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); - } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - }else{ - rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - } - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *pRowid); - } + int eType1 = sqlite3_value_numeric_type(apVal[1]); + + if( eType1!=SQLITE_INTEGER && eType1!=SQLITE_NULL ){ + rc = SQLITE_MISMATCH; + } + + else if( eType0!=SQLITE_INTEGER ){ + /* If this is a REPLACE, first remove the current entry (if any) */ + if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){ + i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); } - }else{ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); fts5StorageInsert(&rc, pTab, apVal, pRowid); } + + /* UPDATE */ + else{ + i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ + i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ + if( eType1==SQLITE_INTEGER && iOld!=iNew ){ + if( eConflict==SQLITE_REPLACE ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + }else{ + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal,*pRowid); + } + } + }else{ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + fts5StorageInsert(&rc, pTab, apVal, pRowid); + } + } } } diff --git a/ext/fts5/test/fts5update.test b/ext/fts5/test/fts5update.test index 0cbfe3499a..75598b47e5 100644 --- a/ext/fts5/test/fts5update.test +++ b/ext/fts5/test/fts5update.test @@ -134,6 +134,20 @@ do_test 3.1 { } } {} +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE x4 USING fts5(a, detail=%DETAIL%); + INSERT INTO x4 VALUES('one two three'); + INSERT INTO x4(rowid, a) VALUES('2', 'one two three'); + INSERT INTO x4(rowid, a) VALUES('3.0', 'one two three'); +} +do_catchsql_test 4.1 { + INSERT INTO x4(rowid, a) VALUES('four', 'one two three'); +} {1 {datatype mismatch}} + +do_catchsql_test 4.2 { + UPDATE x4 SET rowid = 'four' WHERE rowid=1; +} {1 {datatype mismatch}} + } diff --git a/manifest b/manifest index 0e8202c27b..fef92f42f2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\smemory\sleak\sin\sthe\sLemon\sparser\sgenerator\sutility\sprogram. -D 2019-01-15T14:44:23.568 +C Have\sfts5\sreject\sattempts\sto\sinsert\sa\snon-integer,\snon-null\svalue\sinto\sa\srowid\ncolumn\swith\sSQLITE_MISMATCH. +D 2019-01-15T15:18:58.151 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -116,7 +116,7 @@ F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe1 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 F ext/fts5/fts5_index.c ba68cfbd786ff50d84c23c841ac44063a5f939b37ae9e320bcbaf2baabc34608 -F ext/fts5/fts5_main.c ea863c28474f9a3903f37f27fc1894fa0a4eb786435f0b95575fa496d0886e22 +F ext/fts5/fts5_main.c 55236fb77546bec22bedad309033564ce32c96c001dee82d09d310bcc8c113b6 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -215,7 +215,7 @@ F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e F ext/fts5/test/fts5unicode3.test 590c72e18195bda2446133f9d82d04a4e89d094bba58c75ae10f4afc6faa0744 F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef58d3abddf27147b687 F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d -F ext/fts5/test/fts5update.test 3f0e75ba7640adfdb89953ce9d5a807cb7525c60cf3ebaaa15257510773e66c8 +F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a F ext/fts5/test/fts5vocab.test 26e069050d6fb389e67f7a9402421948233152ae433e6b8da47cf15d3b5a8d26 F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 @@ -1800,7 +1800,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 ecf5caa7e9825a8b03d15ee525ec68be78c55926ddfaca27a040a7614caf0e85 -R 24b5673f620d25b1c990e7636a167c13 -U drh -Z 0a407a7b0060b0ce7132652c6f1c1d18 +P 1caff0fb0b2051e205e7a8cfd5dadf92680c52a88a441ded95b1ea6542db5f83 +R dde41c2e6d11e160883df838e31ee31e +U dan +Z c636d84f1aab6db98e73b3c69339d51d diff --git a/manifest.uuid b/manifest.uuid index 82d0b3eaec..7a25541b4c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1caff0fb0b2051e205e7a8cfd5dadf92680c52a88a441ded95b1ea6542db5f83 \ No newline at end of file +4a9483f81e9ca1aa41d6ca33cb3171370418ccc71fdee9741bbf6f694bf4fbaa \ No newline at end of file From a7839317940fc8856732d7c33495c5f2be1c60c1 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 15 Jan 2019 16:14:31 +0000 Subject: [PATCH 069/306] Fix a buffer overread in fts3 caused by a corrupt record. FossilOrigin-Name: e54efd60c20bbfc5d70ddb9e1dd6ffb68cbbcfa57b4f07cb104767ef08c1a559 --- ext/fts3/fts3.c | 6 +- ext/fts3/fts3Int.h | 2 + manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 224 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 238 insertions(+), 12 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 28037822bc..74552a91c1 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2264,10 +2264,9 @@ static int fts3PoslistPhraseMerge( p += sqlite3Fts3PutVarint(p, iCol1); } - assert( *p1!=POS_END && *p1!=POS_COLUMN ); - assert( *p2!=POS_END && *p2!=POS_COLUMN ); fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2; fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2; + if( iPos1<0 || iPos2<0 ) break; while( 1 ){ if( iPos2==iPos1+nToken @@ -4616,9 +4615,10 @@ static int fts3EvalIncrPhraseNext( if( bEof==0 ){ int nList = 0; int nByte = a[p->nToken-1].nList; - char *aDoclist = sqlite3_malloc(nByte+1); + char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); if( !aDoclist ) return SQLITE_NOMEM; memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); + memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); for(i=0; i<(p->nToken-1); i++){ if( a[i].bIgnore==0 ){ diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 077bad7f54..d029625c9f 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -95,6 +95,8 @@ SQLITE_EXTENSION_INIT3 */ #define FTS3_VARINT_MAX 10 +#define FTS3_BUFFER_PADDING 8 + /* ** FTS4 virtual tables may maintain multiple indexes - one index of all terms ** in the document set and zero or more prefix indexes. All indexes are stored diff --git a/manifest b/manifest index fef92f42f2..663f100437 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sfts5\sreject\sattempts\sto\sinsert\sa\snon-integer,\snon-null\svalue\sinto\sa\srowid\ncolumn\swith\sSQLITE_MISMATCH. -D 2019-01-15T15:18:58.151 +C Fix\sa\sbuffer\soverread\sin\sfts3\scaused\sby\sa\scorrupt\srecord. +D 2019-01-15T16:14:31.249 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -80,9 +80,9 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 51313386427f23d5aa3e09688272f4e6bcf2fb28700687ee2676af37f0a7afe0 +F ext/fts3/fts3.c 9f441b5c3e3b09fa355007002dfa2648fa38b82e235c3e941cf17c9d8b0a870a F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 3378157f383540857a466420b8279626204434c3eb0dc948ad9bcd3991fc41f5 +F ext/fts3/fts3Int.h 6c666f314caaeb8fe8e4c1a2d84f8b34406647429a43e8f475b0b0074ad41861 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 @@ -916,7 +916,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 8399202555dc336e6514c906f15e8064ce9fe30ae07628adbd79867203f5301b +F test/fts3corrupt4.test a49f4e23e0b8184e103e3fe3ff624666f4c28806a494ab44f66395e55daccab1 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1800,7 +1800,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 1caff0fb0b2051e205e7a8cfd5dadf92680c52a88a441ded95b1ea6542db5f83 -R dde41c2e6d11e160883df838e31ee31e +P 4a9483f81e9ca1aa41d6ca33cb3171370418ccc71fdee9741bbf6f694bf4fbaa +R c08a0fc65da30a4181ea7ef94170dd19 U dan -Z c636d84f1aab6db98e73b3c69339d51d +Z 7b2b8c23f29eb40d2cf0317fef59d263 diff --git a/manifest.uuid b/manifest.uuid index 7a25541b4c..b2bc2e26e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a9483f81e9ca1aa41d6ca33cb3171370418ccc71fdee9741bbf6f694bf4fbaa \ No newline at end of file +e54efd60c20bbfc5d70ddb9e1dd6ffb68cbbcfa57b4f07cb104767ef08c1a559 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index d6ad0a9005..8afff93e0f 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -758,6 +758,230 @@ do_catchsql_test 8.1 { SELECT matchinfo(t1,'x') FROM t1 WHERE t1 MATCH 'e*'; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 9.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-e1c6cbfdf643e9.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 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 0d a4 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 67 64 69 72 egdir_1t1_segdir +| 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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 39 00 00 00 00 00 (a,b,c)...9..... +| 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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 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 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 35 58 54 45 4e 53 49 4f IT LOAD 5XTENSIO +| 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 1f 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 44 4e 41 42 4c 45 20 46 54 53 35 58 .#..DNABLE 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 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 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 01 00 01 ................ +| 3520: 02 00 01 02 00 01 02 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 03 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 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 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 0a 12 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 e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 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 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-e1c6cbfdf643e9.db +}]} {} + +do_execsql_test 9.1 { + SELECT count(*) FROM t1 WHERE t1 MATCH '"json1 enable"'; +} {1} + + finish_test From 1a39d2bb5cb1a72f5e91aaabfd94fc0e9759bf82 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 15 Jan 2019 18:14:27 +0000 Subject: [PATCH 070/306] Handle SQL NULL values without crashing in the fts5 snippet() and highlight() functions. FossilOrigin-Name: a5e9cc794f17566160c4b2b5791601a744a21ace987b19ff8a5816fd78dce56a --- ext/fts5/fts5_aux.c | 2 +- ext/fts5/test/fts5ak.test | 8 ++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_aux.c b/ext/fts5/fts5_aux.c index f884ddb328..7d4f3e6ec2 100644 --- a/ext/fts5/fts5_aux.c +++ b/ext/fts5/fts5_aux.c @@ -136,7 +136,7 @@ static void fts5HighlightAppend( HighlightContext *p, const char *z, int n ){ - if( *pRc==SQLITE_OK ){ + if( *pRc==SQLITE_OK && z ){ if( n<0 ) n = (int)strlen(z); p->zOut = sqlite3_mprintf("%z%.*s", p->zOut, n, z); if( p->zOut==0 ) *pRc = SQLITE_NOMEM; diff --git a/ext/fts5/test/fts5ak.test b/ext/fts5/test/fts5ak.test index cab0ae2d3e..0a3cd6a783 100644 --- a/ext/fts5/test/fts5ak.test +++ b/ext/fts5/test/fts5ak.test @@ -144,6 +144,14 @@ do_execsql_test 3.1 { {[a b c d e]} } +do_execsql_test 3.2 { + SELECT highlight(ft, 0, NULL, NULL) FROM ft WHERE ft MATCH 'a+b+c AND c+d+e'; +} { + {a b c x c d e} + {a b c c d e} + {a b c d e} +} + } finish_test diff --git a/manifest b/manifest index 663f100437..a031138cf5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverread\sin\sfts3\scaused\sby\sa\scorrupt\srecord. -D 2019-01-15T16:14:31.249 +C Handle\sSQL\sNULL\svalues\swithout\scrashing\sin\sthe\sfts5\ssnippet()\sand\shighlight()\nfunctions. +D 2019-01-15T18:14:27.654 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -110,7 +110,7 @@ F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a0 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 4f5d19b7973dae23de368728f06d3eb1fe9f5cca2990366b40e9379996f35e61 F ext/fts5/fts5Int.h 545ae89fcaf0071f721eaa2a494bf0edb68d589d052cd7a611b3f1645329ceed -F ext/fts5/fts5_aux.c 859b63b2482223c7259de3913b3d3cf1af16636bd2ae2b8292ee8a98a90cfdb9 +F ext/fts5/fts5_aux.c 4353df5d71a8f84ae94ed9c5c9199d1594b8efc9476c4d617fbd8db8b291e3a7 F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81ef59da7a59 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 @@ -138,7 +138,7 @@ F ext/fts5/test/fts5ag.test 7816f25a0707578f08145ab539fc0ca025f8951e788b28a6a18a F ext/fts5/test/fts5ah.test 27b5a33bfd0363ca8a4dc659e6e2a5df3dea1c3c5b04bc51ca6aeb1277bd9b21 F ext/fts5/test/fts5ai.test d837c42249c0d8ad1a2912270e22cf2f303790a611f85c0be3a58e42a3696e3d F ext/fts5/test/fts5aj.test 745020852d85f5dd49d11cb7ad11d3cc6dafc4fe6d6d24bc0875ac8f43ee4149 -F ext/fts5/test/fts5ak.test 0d41cbf04e70249c84670e1782aa8972e4f67d91c9bc6205d0ba7c34e159481b +F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60a7b8825b60a6 F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 F ext/fts5/test/fts5alter.test 5565f7e4605512b69171ac18ca84398603f9f6456dbe377beeca97e83cc242cd F ext/fts5/test/fts5auto.test 78989e6527ce69c9eddbef7392fea5c10b0010cd2b2ae68eec7bc869c471e691 @@ -1800,7 +1800,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 4a9483f81e9ca1aa41d6ca33cb3171370418ccc71fdee9741bbf6f694bf4fbaa -R c08a0fc65da30a4181ea7ef94170dd19 +P e54efd60c20bbfc5d70ddb9e1dd6ffb68cbbcfa57b4f07cb104767ef08c1a559 +R a124f0daa14c3fb69b1fe1525949e0b1 U dan -Z 7b2b8c23f29eb40d2cf0317fef59d263 +Z ecde6a04eb591dee1e34e260f38af44d diff --git a/manifest.uuid b/manifest.uuid index b2bc2e26e5..cd6278d5c5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e54efd60c20bbfc5d70ddb9e1dd6ffb68cbbcfa57b4f07cb104767ef08c1a559 \ No newline at end of file +a5e9cc794f17566160c4b2b5791601a744a21ace987b19ff8a5816fd78dce56a \ No newline at end of file From dfb5c963a0b643a6179de67f419f2019c4eb5dee Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 15 Jan 2019 20:51:35 +0000 Subject: [PATCH 071/306] Fix a problem with ALTER TABLE and vector assignments in UPDATE statements within triggers. FossilOrigin-Name: cc6cd7531fee39b4c2a9f522f1089c1d79254a9e25acae59468322031f94c25a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 4 ++++ test/altertab2.test | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a031138cf5..e3b5d1c13f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Handle\sSQL\sNULL\svalues\swithout\scrashing\sin\sthe\sfts5\ssnippet()\sand\shighlight()\nfunctions. -D 2019-01-15T18:14:27.654 +C Fix\sa\sproblem\swith\sALTER\sTABLE\sand\svector\sassignments\sin\sUPDATE\sstatements\nwithin\striggers. +D 2019-01-15T20:51:35.919 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -465,7 +465,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab -F src/expr.c 01aa7e667b65fc18ccbe41d00c9a114cb2658831be13d9847a376a88ba2f3ae9 +F src/expr.c 716a241833ce105b02650f53495d0bd7aaa62a543e93611a6d25f4232ae51e24 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c aaf28be73ab21e1e8bf4ac6b94269ebc8c93238d1e6997cb44b527b622e8ae6f F src/func.c 6cf832abbc2815fdb46fee654df32a66ab77deb47bf4cff04a5774dafecd497a @@ -621,7 +621,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a -F test/altertab2.test 814369c72a7ed777ab2acf3f17fcff5ecb724816eb7c6659f40ef87b09521c99 +F test/altertab2.test 4e40836ce90c9533e03be8417f3b02c2655ea96c375769cda9caaed464f234ea F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1800,7 +1800,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 e54efd60c20bbfc5d70ddb9e1dd6ffb68cbbcfa57b4f07cb104767ef08c1a559 -R a124f0daa14c3fb69b1fe1525949e0b1 +P a5e9cc794f17566160c4b2b5791601a744a21ace987b19ff8a5816fd78dce56a +R b78aa35497a642b92b0b693ff5436269 U dan -Z ecde6a04eb591dee1e34e260f38af44d +Z a8ab20166831e403dfa2b39b553a8df3 diff --git a/manifest.uuid b/manifest.uuid index cd6278d5c5..2eb2119808 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a5e9cc794f17566160c4b2b5791601a744a21ace987b19ff8a5816fd78dce56a \ No newline at end of file +cc6cd7531fee39b4c2a9f522f1089c1d79254a9e25acae59468322031f94c25a \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c03caa6c6b..b595c0adb3 100644 --- a/src/expr.c +++ b/src/expr.c @@ -465,6 +465,7 @@ Expr *sqlite3ExprForVectorField( }else{ if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; pRet = sqlite3ExprDup(pParse->db, pVector, 0); + sqlite3RenameTokenRemap(pParse, pRet, pVector); } return pRet; } @@ -1668,6 +1669,9 @@ ExprList *sqlite3ExprListAppendVector( } vector_append_error: + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, pExpr); + } sqlite3ExprDelete(db, pExpr); sqlite3IdListDelete(db, pColumns); return pList; diff --git a/test/altertab2.test b/test/altertab2.test index 45a91537d0..2c828be994 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -142,4 +142,40 @@ foreach {tn schema} { } $expect } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE TABLE t1(a,b,c,d,e,f); + CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN + UPDATE t1 SET (c,d)=(a,b); + END; +} + +do_execsql_test 4.1 { + ALTER TABLE t1 RENAME TO t1x; + SELECT sql FROM sqlite_master WHERE type = 'trigger'; +} { +{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.a NOT NULL BEGIN + UPDATE "t1x" SET (c,d)=(a,b); + END} +} + +do_execsql_test 4.2 { + ALTER TABLE t1x RENAME a TO aaa; + SELECT sql FROM sqlite_master WHERE type = 'trigger'; +} { +{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN + UPDATE "t1x" SET (c,d)=(aaa,b); + END} +} + +do_execsql_test 4.3 { + ALTER TABLE t1x RENAME d TO ddd; + SELECT sql FROM sqlite_master WHERE type = 'trigger'; +} { +{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN + UPDATE "t1x" SET (c,ddd)=(aaa,b); + END} +} + finish_test From 4ccb41fc999170823e6c064f5aecd87123a94a44 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 16 Jan 2019 11:38:06 +0000 Subject: [PATCH 072/306] Fix a memory leak that could occur in fts3 when handling a corrupt database. FossilOrigin-Name: 65cebb06a0afcbcb4157c3d518a62ed188b1e90d9e9b69d88fece484bcb6e380 --- ext/fts3/fts3_write.c | 5 +- manifest | 14 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 229 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 240 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 0b06669589..df3c07eeb7 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -1615,6 +1615,7 @@ int sqlite3Fts3SegReaderNew( #endif if( iStartLeaf==0 ){ + if( iEndLeaf!=0 ) return FTS_CORRUPT_VTAB; nExtra = nRoot + FTS3_NODE_PADDING; } @@ -3744,7 +3745,7 @@ static int nodeReaderNext(NodeReader *p){ p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nSuffix); if( nPrefix>p->iOff || nSuffix>p->nNode-p->iOff ){ - return SQLITE_CORRUPT_VTAB; + return FTS_CORRUPT_VTAB; } blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); if( rc==SQLITE_OK ){ @@ -3754,7 +3755,7 @@ static int nodeReaderNext(NodeReader *p){ if( p->iChild==0 ){ p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); if( (p->nNode-p->iOff)nDoclist ){ - return SQLITE_CORRUPT_VTAB; + return FTS_CORRUPT_VTAB; } p->aDoclist = &p->aNode[p->iOff]; p->iOff += p->nDoclist; diff --git a/manifest b/manifest index e3b5d1c13f..2f65c2103b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sALTER\sTABLE\sand\svector\sassignments\sin\sUPDATE\sstatements\nwithin\striggers. -D 2019-01-15T20:51:35.919 +C Fix\sa\smemory\sleak\sthat\scould\soccur\sin\sfts3\swhen\shandling\sa\scorrupt\sdatabase. +D 2019-01-16T11:38:06.827 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -98,7 +98,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 9d9c77ee985010d568e4b4d5122e6d5e2924f98e0bd04daf65af88fe9295d622 +F ext/fts3/fts3_write.c f33df1670b97be82a217d7b9400def27464e54aab41f7e016eaf057498f09f64 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -916,7 +916,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test a49f4e23e0b8184e103e3fe3ff624666f4c28806a494ab44f66395e55daccab1 +F test/fts3corrupt4.test d52602717c13f4d02760a2fb50a046e755df07514fe934ad6a7f604c51a66f6b F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1800,7 +1800,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 a5e9cc794f17566160c4b2b5791601a744a21ace987b19ff8a5816fd78dce56a -R b78aa35497a642b92b0b693ff5436269 +P cc6cd7531fee39b4c2a9f522f1089c1d79254a9e25acae59468322031f94c25a +R 9d97df2ed07a429d41da3f8f4293bdef U dan -Z a8ab20166831e403dfa2b39b553a8df3 +Z 6b7ccb309f8678351899affe1574755c diff --git a/manifest.uuid b/manifest.uuid index 2eb2119808..caf6c0c605 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc6cd7531fee39b4c2a9f522f1089c1d79254a9e25acae59468322031f94c25a \ No newline at end of file +65cebb06a0afcbcb4157c3d518a62ed188b1e90d9e9b69d88fece484bcb6e380 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 8afff93e0f..ecb43bfb84 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -981,6 +981,235 @@ do_execsql_test 9.1 { SELECT count(*) FROM t1 WHERE t1 MATCH '"json1 enable"'; } {1} +#------------------------------------------------------------------------- +reset_db +do_test 10.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-c3a971f0061039.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 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 0d a4 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 67 64 69 72 egdir_1t1_segdir +| 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 30 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY0KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 39 00 00 00 00 00 (a,b,c)...9..... +| 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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 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 1f MEMSYS5 ENABLE. +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 43 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXCINARY. ..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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 09 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 46 20 47 45 ....)..ENABLF 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| 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 09 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 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 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 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 03 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 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 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 02 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: 10 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 02 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 e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 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 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-c3a971f0061039.db +}]} {} + +do_catchsql_test 10.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) + INSERT OR IGNORE INTO t1(a,c) SELECT x,null FROM c + UNION ALL SELECT 180-x,printf('[%,d]',x*-5844627) FROM c; +} {0 {}} + +do_catchsql_test 10.3 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + finish_test From fb8ac325d769248e45eaa056adf4da9960bdd9c3 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 16 Jan 2019 12:05:22 +0000 Subject: [PATCH 073/306] Avoid a dangling pointer comparison when renaming a table that has a trigger that itself contains a window function with an (illegal) column reference in a FOLLOWING expression. FossilOrigin-Name: d45bee36f2c1091a2d32c16ca8921bf4e7c9e40c46d0a36fbcb179ecfafcfbf0 --- manifest | 14 ++++++------ manifest.uuid | 2 +- src/window.c | 1 + test/altertab2.test | 55 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2f65c2103b..f6365765ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sthat\scould\soccur\sin\sfts3\swhen\shandling\sa\scorrupt\sdatabase. -D 2019-01-16T11:38:06.827 +C Avoid\sa\sdangling\spointer\scomparison\swhen\srenaming\sa\stable\sthat\shas\sa\strigger\nthat\sitself\scontains\sa\swindow\sfunction\swith\san\s(illegal)\scolumn\sreference\sin\sa\nFOLLOWING\sexpression. +D 2019-01-16T12:05:22.604 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -602,7 +602,7 @@ F src/where.c dc293ea4230adf9a323fb2e5750eff565347567a3cd6538f7d0fa93b11c2baae F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 -F src/window.c f4a9ac8396395a9e281e182dd32fc9b3b19f6762a9eef468137369def3ad9a2c +F src/window.c 5950fb4dd9fd5dcefffd082fa2b8832ca8bef2d2297a151929ce06aeb4f58139 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -621,7 +621,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a -F test/altertab2.test 4e40836ce90c9533e03be8417f3b02c2655ea96c375769cda9caaed464f234ea +F test/altertab2.test d0c8e6bd57bc793b28c67fd0cc2b34f039eca63e0717d5a20b90de72db16d4f4 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1800,7 +1800,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 cc6cd7531fee39b4c2a9f522f1089c1d79254a9e25acae59468322031f94c25a -R 9d97df2ed07a429d41da3f8f4293bdef +P 65cebb06a0afcbcb4157c3d518a62ed188b1e90d9e9b69d88fece484bcb6e380 +R fc37f453249cb59477400146e257a7aa U dan -Z 6b7ccb309f8678351899affe1574755c +Z f0bcf5ec07a101d656c599001621d54c diff --git a/manifest.uuid b/manifest.uuid index caf6c0c605..a12f6bda28 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -65cebb06a0afcbcb4157c3d518a62ed188b1e90d9e9b69d88fece484bcb6e380 \ No newline at end of file +d45bee36f2c1091a2d32c16ca8921bf4e7c9e40c46d0a36fbcb179ecfafcfbf0 \ No newline at end of file diff --git a/src/window.c b/src/window.c index c510c73aaf..18a4f7054c 100644 --- a/src/window.c +++ b/src/window.c @@ -881,6 +881,7 @@ void sqlite3WindowListDelete(sqlite3 *db, Window *p){ */ static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ if( 0==sqlite3ExprIsConstant(pExpr) ){ + if( IN_RENAME_OBJECT ) sqlite3RenameExprUnmap(pParse, pExpr); sqlite3ExprDelete(pParse->db, pExpr); pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0); } diff --git a/test/altertab2.test b/test/altertab2.test index 2c828be994..f1f131c236 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -178,4 +178,59 @@ do_execsql_test 4.3 { END} } +#------------------------------------------------------------------------- +do_execsql_test 5.0 { + CREATE TABLE t2(a); + CREATE TRIGGER r2 AFTER INSERT ON t2 WHEN new.a NOT NULL BEGIN + SELECT a, rank() OVER w1 FROM t2 + WINDOW w1 AS ( + PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING + ), + w2 AS ( + PARTITION BY b + ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + ); + END; +} {} + +do_catchsql_test 5.0.1 { + INSERT INTO t2 VALUES(1); +} {1 {no such column: b}} + +do_execsql_test 5.1 { + ALTER TABLE t2 RENAME TO t2x; + SELECT sql FROM sqlite_master WHERE name = 'r2'; +} { + {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.a NOT NULL BEGIN + SELECT a, rank() OVER w1 FROM "t2x" + WINDOW w1 AS ( + PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING + ), + w2 AS ( + PARTITION BY b + ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + ); + END} +} + +do_execsql_test 5.2 { + ALTER TABLE t2x RENAME a TO aaaa; + SELECT sql FROM sqlite_master WHERE name = 'r2'; +} { + {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.aaaa NOT NULL BEGIN + SELECT aaaa, rank() OVER w1 FROM "t2x" + WINDOW w1 AS ( + PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING + ), + w2 AS ( + PARTITION BY b + ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + ); + END} +} + +do_catchsql_test 5.3 { + INSERT INTO t2x VALUES(1); +} {1 {no such column: b}} + finish_test From 5e970a8f40b1923558fc86cfe21b1bcc9a0064c2 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 16 Jan 2019 14:58:37 +0000 Subject: [PATCH 074/306] Fix a problem with renaming a column that is used as part of an ORDER BY on a compound SELECT within a database view or trigger. FossilOrigin-Name: b4b5741366578b25ec6e4c415ab8239215e53b1c900be613575f40a826cfccc9 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/resolve.c | 28 ++++++++++++++++++++++++++-- test/altertab2.test | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f6365765ec..89bed7bd9f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sa\sdangling\spointer\scomparison\swhen\srenaming\sa\stable\sthat\shas\sa\strigger\nthat\sitself\scontains\sa\swindow\sfunction\swith\san\s(illegal)\scolumn\sreference\sin\sa\nFOLLOWING\sexpression. -D 2019-01-16T12:05:22.604 +C Fix\sa\sproblem\swith\srenaming\sa\scolumn\sthat\sis\sused\sas\spart\sof\san\sORDER\sBY\son\sa\ncompound\sSELECT\swithin\sa\sdatabase\sview\sor\strigger. +D 2019-01-16T14:58:37.269 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -511,7 +511,7 @@ F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 F src/prepare.c 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 5f2f987aacba7548d10781f808e1b933f80abe0b6bc8e9922bc18b1d1faba339 +F src/resolve.c 4bfb39273d61cc20634fb3bd8d37a60391546fcef63b19ec11c60b3f79011fa7 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 4b0be1bfd2d8668e2711f877682361e06b412c53ce7a56303f1f6978ec33eca8 F src/shell.c.in b3cd745b53439674fdc3dc4db12e094d11cff91495be68bb09ac52726084b583 @@ -621,7 +621,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a -F test/altertab2.test d0c8e6bd57bc793b28c67fd0cc2b34f039eca63e0717d5a20b90de72db16d4f4 +F test/altertab2.test 1a4dffbd353754c8df1e96af8cf2e0755cb0a33854ee31191260fb64a95b8e6b F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1800,7 +1800,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 65cebb06a0afcbcb4157c3d518a62ed188b1e90d9e9b69d88fece484bcb6e380 -R fc37f453249cb59477400146e257a7aa +P d45bee36f2c1091a2d32c16ca8921bf4e7c9e40c46d0a36fbcb179ecfafcfbf0 +R 3f45003a2534f045f311767a554afd37 U dan -Z f0bcf5ec07a101d656c599001621d54c +Z 31011417b8e1bcc509ea69d09d6af708 diff --git a/manifest.uuid b/manifest.uuid index a12f6bda28..82eb438425 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d45bee36f2c1091a2d32c16ca8921bf4e7c9e40c46d0a36fbcb179ecfafcfbf0 \ No newline at end of file +b4b5741366578b25ec6e4c415ab8239215e53b1c900be613575f40a826cfccc9 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 23d30f29f1..3a5b467ad7 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1138,12 +1138,36 @@ static int resolveCompoundOrderBy( }else{ iCol = resolveAsName(pParse, pEList, pE); if( iCol==0 ){ - pDup = sqlite3ExprDup(db, pE, 0); + /* Now test if expression pE matches one of the values returned + ** by pSelect. In the usual case this is done by duplicating the + ** expression, resolving any symbols in it, and then comparing + ** it against each expression returned by the SELECT statement. + ** 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( !db->mallocFailed ){ assert(pDup); iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); } - sqlite3ExprDelete(db, pDup); + if( IN_RENAME_OBJECT ){ + if( iCol>0 ){ + pItem->done = 1; + break; + } + }else{ + sqlite3ExprDelete(db, pDup); + } } } if( iCol>0 ){ diff --git a/test/altertab2.test b/test/altertab2.test index f1f131c236..c825841fe4 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -233,4 +233,36 @@ do_catchsql_test 5.3 { INSERT INTO t2x VALUES(1); } {1 {no such column: b}} +#------------------------------------------------------------------------- + +do_execsql_test 6.0 { + CREATE TABLE t3(a,b,c,d); + CREATE TRIGGER r3 AFTER INSERT ON t3 WHEN new.a NOT NULL BEGIN + SELECT a,b,c FROM t3 EXCEPT SELECT a,b,c FROM t3 ORDER BY a; + SELECT rowid, * FROM t3; + END; +} {} + +do_execsql_test 6.1 { + ALTER TABLE t3 RENAME TO t3x; + SELECT sql FROM sqlite_master WHERE name = 'r3'; +} { + {CREATE TRIGGER r3 AFTER INSERT ON "t3x" WHEN new.a NOT NULL BEGIN + SELECT a,b,c FROM "t3x" EXCEPT SELECT a,b,c FROM "t3x" ORDER BY a; + SELECT rowid, * FROM "t3x"; + END} +} + +do_execsql_test 6.2 { + ALTER TABLE t3x RENAME a TO abcd; + SELECT sql FROM sqlite_master WHERE name = 'r3'; +} { + {CREATE TRIGGER r3 AFTER INSERT ON "t3x" WHEN new.abcd NOT NULL BEGIN + SELECT abcd,b,c FROM "t3x" EXCEPT SELECT abcd,b,c FROM "t3x" ORDER BY abcd; + SELECT rowid, * FROM "t3x"; + END} +} + finish_test + + From 375afb8bda4d6583ba600a7716406bfcb6d53014 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 16 Jan 2019 19:26:31 +0000 Subject: [PATCH 075/306] Fix a problem in the code generator for sorting results with SRT_EphemTab and a LIMIT clause. FossilOrigin-Name: 49fcde2f1f981ac0c75728bed3444e7c1d3167311db282d3375c96ce090b2210 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/select.c | 8 +++++++- test/select1.test | 21 ++++++++++++++++++++- test/with1.test | 8 ++++++++ 5 files changed, 45 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 89bed7bd9f..3db5f06718 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\srenaming\sa\scolumn\sthat\sis\sused\sas\spart\sof\san\sORDER\sBY\son\sa\ncompound\sSELECT\swithin\sa\sdatabase\sview\sor\strigger. -D 2019-01-16T14:58:37.269 +C Fix\sa\sproblem\sin\sthe\scode\sgenerator\sfor\ssorting\sresults\swith\sSRT_EphemTab\nand\sa\sLIMIT\sclause. +D 2019-01-16T19:26:31.946 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -513,7 +513,7 @@ F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 4bfb39273d61cc20634fb3bd8d37a60391546fcef63b19ec11c60b3f79011fa7 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 4b0be1bfd2d8668e2711f877682361e06b412c53ce7a56303f1f6978ec33eca8 +F src/select.c 5cbd6ab60bd017cf5857f9153680a64d04678a9d2a0ea56b90cae2f61deb18b3 F src/shell.c.in b3cd745b53439674fdc3dc4db12e094d11cff91495be68bb09ac52726084b583 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1256,7 +1256,7 @@ F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test 2e760bab8f3658b3b97debcf52860d0d2e20aa6cbe8b40e678ddb99871a15491 +F test/select1.test 7d41f354998524070317207d4e2b68e725e4cf14a57835fc746d4bea686a8714 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054 F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328 @@ -1681,7 +1681,7 @@ F test/window4.test c5d6bf3403e4ade2f19df2afe4c16f29fb817c392c6c1c8017edb7165c19 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e F test/window6.test 5eae4ae7a590ccf1e605880969ca0bad3955616ac91cad3031baea38748badb3 F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b -F test/with1.test 64fcb1a81685b8a67da61af260a2d8f2afbf3530d39fa451831faf5a9ba6ea45 +F test/with1.test 4776e8a57739b1dd33c7cb2c9f17fede6b55634f53323fbf8bb538228b644dbf F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab F test/with3.test 8d26920c88283e0a473ceebd3451554922108ce7b2a6a1157c47eb0a7011212c F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 @@ -1800,7 +1800,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 d45bee36f2c1091a2d32c16ca8921bf4e7c9e40c46d0a36fbcb179ecfafcfbf0 -R 3f45003a2534f045f311767a554afd37 -U dan -Z 31011417b8e1bcc509ea69d09d6af708 +P b4b5741366578b25ec6e4c415ab8239215e53b1c900be613575f40a826cfccc9 +R 0b3ae1bb0170c7a60eab725b603dd04a +U drh +Z d03311c2231f5748ca9f82049f7d8880 diff --git a/manifest.uuid b/manifest.uuid index 82eb438425..35d0e3b6ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b4b5741366578b25ec6e4c415ab8239215e53b1c900be613575f40a826cfccc9 \ No newline at end of file +49fcde2f1f981ac0c75728bed3444e7c1d3167311db282d3375c96ce090b2210 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 827eff0062..7d384398b3 100644 --- a/src/select.c +++ b/src/select.c @@ -1457,7 +1457,12 @@ static void generateSortTail( regRow = pDest->iSdst; }else{ regRowid = sqlite3GetTempReg(pParse); - regRow = sqlite3GetTempRange(pParse, nColumn); + if( eDest==SRT_EphemTab || eDest==SRT_Table ){ + regRow = sqlite3GetTempReg(pParse); + nColumn = 0; + }else{ + regRow = sqlite3GetTempRange(pParse, nColumn); + } } nKey = pOrderBy->nExpr - pSort->nOBSat; if( pSort->sortFlags & SORTFLAG_UseSorter ){ @@ -1537,6 +1542,7 @@ static void generateSortTail( switch( eDest ){ case SRT_Table: case SRT_EphemTab: { + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq, regRow); sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid); sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); diff --git a/test/select1.test b/test/select1.test index 7023a6e65d..468f118c41 100644 --- a/test/select1.test +++ b/test/select1.test @@ -1080,5 +1080,24 @@ do_test select1-16.1 { do_catchsql_test select1-16.2 { SELECT 1 FROM sqlite_master LIMIT 1,#1; } {1 {near "#1": syntax error}} - + +# 2019-01-16 Chromium bug 922312 +# Sorting with a LIMIT clause using SRT_EphemTab and SRT_Table +# +do_execsql_test select1-17.1 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(x); INSERT INTO t1 VALUES(1); + CREATE TABLE t2(y,z); INSERT INTO t2 VALUES(2,3); + CREATE INDEX t2y ON t2(y); + SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 ORDER BY y,z); +} {1 2 3} +do_execsql_test select1-17.2 { + SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 ORDER BY y,z LIMIT 4); +} {1 2 3} +do_execsql_test select1-17.3 { + SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 + UNION ALL SELECT * FROM t2 WHERE y=3 ORDER BY y,z LIMIT 4); +} {1 2 3} + finish_test diff --git a/test/with1.test b/test/with1.test index 517d85809c..f9dfbb6bb1 100644 --- a/test/with1.test +++ b/test/with1.test @@ -1056,6 +1056,14 @@ do_execsql_test 21.1 { ) SELECT * FROM t21 AS tA, t21 AS tB } {1 1 1 1} +do_execsql_test 21.1b { + /* This variant from chromium bug 922312 on 2019-01-16 */ + WITH RECURSIVE t21(a,b) AS ( + WITH t21(x) AS (VALUES(1)) + SELECT x, x FROM t21 ORDER BY 1 LIMIT 5 + ) + SELECT * FROM t21 AS tA, t21 AS tB +} {1 1 1 1} do_execsql_test 21.2 { SELECT printf('', EXISTS (WITH RECURSIVE Table0 AS (WITH Table0 AS (SELECT DISTINCT 1) From e011ee28309f489703fc29365837b1e791b461c7 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 16 Jan 2019 19:44:09 +0000 Subject: [PATCH 076/306] Fix a problem in the fts3 matchinfo() function with corrupt database handling. FossilOrigin-Name: 24ed5fb6aea30b098d2faf3cf9d638933e518657217e903239ffaa1e25d34f66 --- ext/fts3/fts3_snippet.c | 13 ++- manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 223 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 241 insertions(+), 13 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 1c41139111..4ab60c1d80 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -1121,6 +1121,7 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int i; int iCol; int nToken = 0; + int rc = SQLITE_OK; /* Allocate and populate the array of LcsIterator objects. The array ** contains one element for each matchable phrase in the query. @@ -1141,13 +1142,16 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int nLive = 0; /* Number of iterators in aIter not at EOF */ for(i=0; inPhrase; i++){ - int rc; LcsIterator *pIt = &aIter[i]; rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead); - if( rc!=SQLITE_OK ) return rc; + if( rc!=SQLITE_OK ) goto matchinfo_lcs_out; if( pIt->pRead ){ pIt->iPos = pIt->iPosOffset; - fts3LcsIteratorAdvance(&aIter[i]); + fts3LcsIteratorAdvance(pIt); + if( pIt->pRead==0 ){ + rc = FTS_CORRUPT_VTAB; + goto matchinfo_lcs_out; + } nLive++; } } @@ -1179,8 +1183,9 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ pInfo->aMatchinfo[iCol] = nLcs; } + matchinfo_lcs_out: sqlite3_free(aIter); - return SQLITE_OK; + return rc; } /* diff --git a/manifest b/manifest index 3db5f06718..f8985735aa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sthe\scode\sgenerator\sfor\ssorting\sresults\swith\sSRT_EphemTab\nand\sa\sLIMIT\sclause. -D 2019-01-16T19:26:31.946 +C Fix\sa\sproblem\sin\sthe\sfts3\smatchinfo()\sfunction\swith\scorrupt\sdatabase\shandling. +D 2019-01-16T19:44:09.299 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -89,7 +89,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c bea8038175ff19bcc27b8a1d0bf12ee0a482b995029ea125b105c43eaebc8098 +F ext/fts3/fts3_snippet.c 17af214e8b0a5b12ff4c4986767785aec824c5bf412612716cbfff5ed0d51327 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c 79f2a7fbb3f672fa032e5a432ca274ea3ee93c34 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 @@ -916,7 +916,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test d52602717c13f4d02760a2fb50a046e755df07514fe934ad6a7f604c51a66f6b +F test/fts3corrupt4.test 6be332f78efc460b33dd4a216595f33a9a47f7267b246814a56eff3124752024 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1800,7 +1800,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 b4b5741366578b25ec6e4c415ab8239215e53b1c900be613575f40a826cfccc9 -R 0b3ae1bb0170c7a60eab725b603dd04a -U drh -Z d03311c2231f5748ca9f82049f7d8880 +P 49fcde2f1f981ac0c75728bed3444e7c1d3167311db282d3375c96ce090b2210 +R e10c8270e6a4762be5d375dc46d1facb +U dan +Z 45a76f21c4e762a5579bae4bb6c1267c diff --git a/manifest.uuid b/manifest.uuid index 35d0e3b6ce..9e7e361681 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -49fcde2f1f981ac0c75728bed3444e7c1d3167311db282d3375c96ce090b2210 \ No newline at end of file +24ed5fb6aea30b098d2faf3cf9d638933e518657217e903239ffaa1e25d34f66 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index ecb43bfb84..7ce8aeb95b 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -1210,6 +1210,229 @@ do_catchsql_test 10.3 { INSERT INTO t1(t1) VALUES('optimize'); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 11.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-843cb8447eaf14.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 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 0d a4 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 67 64 69 72 egdir_1t1_segdir +| 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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 39 00 00 00 00 00 (a,b,c)...9..... +| 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 d4 ...t.[.@.$...... +| 48: dd bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 35 99 0c 78 0c 57 0c 3e 0c 24 0c 0a ....5..x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 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 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 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 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 01 00 01 ................ +| 3520: 02 00 01 02 00 01 02 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 03 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 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 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 a2 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 e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 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 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-843cb8447eaf14.db +}]} {} + +do_catchsql_test 11.1 { + SELECT rowid, quote(matchinfo(t1,'pcxybs')) FROM t1 WHERE t1 MATCH 'e*' +} {1 {database disk image is malformed}} + finish_test From 8b20e4a3ebc5e7a1f9df1037ac8c1839b55435f4 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 16 Jan 2019 20:48:13 +0000 Subject: [PATCH 077/306] Fix a problem with fix [b4b57413]. FossilOrigin-Name: ca7b7aaed010ec67bec5355a9ac1d7f229d6d5f2ba2d796b76f5e908b1267688 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/resolve.c | 2 +- test/altertab2.test | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f8985735aa..d30cd22f6d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sthe\sfts3\smatchinfo()\sfunction\swith\scorrupt\sdatabase\shandling. -D 2019-01-16T19:44:09.299 +C Fix\sa\sproblem\swith\sfix\s[b4b57413]. +D 2019-01-16T20:48:13.541 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -511,7 +511,7 @@ F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 F src/prepare.c 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 4bfb39273d61cc20634fb3bd8d37a60391546fcef63b19ec11c60b3f79011fa7 +F src/resolve.c a40867ce07a9b58121d6f9a8fc969555d3c9bdcb6c2b5fc202670815af8dbd91 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 5cbd6ab60bd017cf5857f9153680a64d04678a9d2a0ea56b90cae2f61deb18b3 F src/shell.c.in b3cd745b53439674fdc3dc4db12e094d11cff91495be68bb09ac52726084b583 @@ -621,7 +621,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a -F test/altertab2.test 1a4dffbd353754c8df1e96af8cf2e0755cb0a33854ee31191260fb64a95b8e6b +F test/altertab2.test b80f1b4c1f8346326b9ba35ad741544c1a9610c82187e49b08f84b869d5f01db F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1800,7 +1800,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 49fcde2f1f981ac0c75728bed3444e7c1d3167311db282d3375c96ce090b2210 -R e10c8270e6a4762be5d375dc46d1facb +P 24ed5fb6aea30b098d2faf3cf9d638933e518657217e903239ffaa1e25d34f66 +R 517a448534cc4b6034034d2b08e4e979 U dan -Z 45a76f21c4e762a5579bae4bb6c1267c +Z 547d0b49d1156d2841b1ae4c65318cc5 diff --git a/manifest.uuid b/manifest.uuid index 9e7e361681..5606b4160a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -24ed5fb6aea30b098d2faf3cf9d638933e518657217e903239ffaa1e25d34f66 \ No newline at end of file +ca7b7aaed010ec67bec5355a9ac1d7f229d6d5f2ba2d796b76f5e908b1267688 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 3a5b467ad7..da2febb1fe 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1163,7 +1163,7 @@ static int resolveCompoundOrderBy( if( IN_RENAME_OBJECT ){ if( iCol>0 ){ pItem->done = 1; - break; + continue; } }else{ sqlite3ExprDelete(db, pDup); diff --git a/test/altertab2.test b/test/altertab2.test index c825841fe4..22995744a4 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -263,6 +263,49 @@ do_execsql_test 6.2 { END} } +#------------------------------------------------------------------------- +reset_db + +do_execsql_test 7.0 { + CREATE TABLE t1(a,b,c,d,e,f); + INSERT INTO t1 VALUES(1,2,3,4,5,6); + CREATE TABLE t2(x,y,z); +} + +do_execsql_test 7.1 { + SELECT a,b,c FROM t1 UNION SELECT d,e,f FROM t1 ORDER BY b,c; +} {1 2 3 4 5 6} + +do_execsql_test 7.2 { + CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2 + SELECT a,b,c FROM t1 UNION SELECT d,e,f FROM t1 ORDER BY b,c; + END; + INSERT INTO t1 VALUES(2,3,4,5,6,7); + SELECT * FROM t2; +} {1 2 3 2 3 4 4 5 6 5 6 7} + +do_execsql_test 7.3 { + ALTER TABLE t1 RENAME TO xyzzy; + SELECT sql FROM sqlite_master WHERE name='r1' +} { + {CREATE TRIGGER r1 AFTER INSERT ON "xyzzy" BEGIN + INSERT INTO t2 + SELECT a,b,c FROM "xyzzy" UNION SELECT d,e,f FROM "xyzzy" ORDER BY b,c; + END} +} + +do_execsql_test 7.3 { + ALTER TABLE xyzzy RENAME c TO ccc; + SELECT sql FROM sqlite_master WHERE name='r1' +} { + {CREATE TRIGGER r1 AFTER INSERT ON "xyzzy" BEGIN + INSERT INTO t2 + SELECT a,b,ccc FROM "xyzzy" UNION SELECT d,e,f FROM "xyzzy" ORDER BY b,ccc; + END} +} + + finish_test From f20bbc5f69186e9f04b498b7de2488f3c02f7364 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Jan 2019 01:06:00 +0000 Subject: [PATCH 078/306] Fix a failure in sqlite3ExprCompare() FossilOrigin-Name: 835e2cc55feea2f2426c99816c27f9c35d2fd4cdd9bf1c7f46f889ecfd222778 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d30cd22f6d..190034c8bb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sfix\s[b4b57413]. -D 2019-01-16T20:48:13.541 +C Fix\sa\sfailure\sin\ssqlite3ExprCompare() +D 2019-01-17T01:06:00.385 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -465,7 +465,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab -F src/expr.c 716a241833ce105b02650f53495d0bd7aaa62a543e93611a6d25f4232ae51e24 +F src/expr.c b660eb4d6d273946a8341efb9d38320ddceb9c2931d04478c74b85c35e053a5e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c aaf28be73ab21e1e8bf4ac6b94269ebc8c93238d1e6997cb44b527b622e8ae6f F src/func.c 6cf832abbc2815fdb46fee654df32a66ab77deb47bf4cff04a5774dafecd497a @@ -1800,7 +1800,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 24ed5fb6aea30b098d2faf3cf9d638933e518657217e903239ffaa1e25d34f66 -R 517a448534cc4b6034034d2b08e4e979 -U dan -Z 547d0b49d1156d2841b1ae4c65318cc5 +P ca7b7aaed010ec67bec5355a9ac1d7f229d6d5f2ba2d796b76f5e908b1267688 +R 6444c875e3596c3cccf96b67bd262660 +U drh +Z f35694c9fb454eab54fdef5fbf3c7e42 diff --git a/manifest.uuid b/manifest.uuid index 5606b4160a..ec66b43c37 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ca7b7aaed010ec67bec5355a9ac1d7f229d6d5f2ba2d796b76f5e908b1267688 \ No newline at end of file +835e2cc55feea2f2426c99816c27f9c35d2fd4cdd9bf1c7f46f889ecfd222778 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b595c0adb3..ed53fc7f98 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4858,9 +4858,11 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ if( sqlite3WindowCompare(pParse,pA->y.pWin,pB->y.pWin)!=0 ) return 2; } #endif + }else if( pA->op==TK_NULL ){ + return 0; }else if( pA->op==TK_COLLATE ){ if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; - }else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ + }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ return 2; } } From 30fdb45da018bb37d4a97a1b68e5b6d99b427332 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Jan 2019 03:43:38 +0000 Subject: [PATCH 079/306] Ensure that the variable-length integer decoder in FTS3 never tries to left-shift a negative number. FossilOrigin-Name: 10ffc1fe006a1766ff2f1ffc6129786afb86b6b1f8d3a17334e8ecb838d37b9c --- ext/fts3/fts3.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 74552a91c1..fc533af5bd 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -338,7 +338,7 @@ int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ } #define GETVARINT_STEP(v, ptr, shift, mask1, mask2, var, ret) \ - v = (v & mask1) | ( (*(ptr++)) << shift ); \ + v = (v & mask1) | ( (*(const unsigned char*)(ptr++)) << shift ); \ if( (v & mask2)==0 ){ var = v; return ret; } #define GETVARINT_INIT(v, ptr, shift, mask1, mask2, var, ret) \ v = (*ptr++); \ diff --git a/manifest b/manifest index 190034c8bb..b7653b366c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfailure\sin\ssqlite3ExprCompare() -D 2019-01-17T01:06:00.385 +C Ensure\sthat\sthe\svariable-length\sinteger\sdecoder\sin\sFTS3\snever\stries\sto\nleft-shift\sa\snegative\snumber. +D 2019-01-17T03:43:38.171 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 9f441b5c3e3b09fa355007002dfa2648fa38b82e235c3e941cf17c9d8b0a870a +F ext/fts3/fts3.c 230bfe6509b576c7a82e23e3775fe030586ef5f2135d1b556a99c4c224dee1f0 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 6c666f314caaeb8fe8e4c1a2d84f8b34406647429a43e8f475b0b0074ad41861 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b @@ -1800,7 +1800,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 ca7b7aaed010ec67bec5355a9ac1d7f229d6d5f2ba2d796b76f5e908b1267688 -R 6444c875e3596c3cccf96b67bd262660 +P 835e2cc55feea2f2426c99816c27f9c35d2fd4cdd9bf1c7f46f889ecfd222778 +R 9f028c8159b02a591c16bf06dddc2550 U drh -Z f35694c9fb454eab54fdef5fbf3c7e42 +Z 19969df9ee55c88019bc6a9775b0786b diff --git a/manifest.uuid b/manifest.uuid index ec66b43c37..c08e46f3d4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -835e2cc55feea2f2426c99816c27f9c35d2fd4cdd9bf1c7f46f889ecfd222778 \ No newline at end of file +10ffc1fe006a1766ff2f1ffc6129786afb86b6b1f8d3a17334e8ecb838d37b9c \ No newline at end of file From 04fcef00eed718bcaea0ef6c9172500a27a1052e Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Jan 2019 04:40:04 +0000 Subject: [PATCH 080/306] Fix a corner-case for the logic that cause an insert of a NULL into an INTEGER PRIMARY KEY column to be converted into a valid integer key, when the NULL results from a CASE expression that lacks an ELSE clause. FossilOrigin-Name: 9a425051e7ba59e797636f5cf32b5f6efafdb21c8d5300e099b8008b829c1439 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/insert.c | 14 +++++--------- test/insert.test | 9 +++++++++ 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index b7653b366c..2f9f98ce6e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\svariable-length\sinteger\sdecoder\sin\sFTS3\snever\stries\sto\nleft-shift\sa\snegative\snumber. -D 2019-01-17T03:43:38.171 +C Fix\sa\scorner-case\sfor\sthe\slogic\sthat\scause\san\sinsert\sof\sa\sNULL\sinto\san\nINTEGER\sPRIMARY\sKEY\scolumn\sto\sbe\sconverted\sinto\sa\svalid\sinteger\skey,\nwhen\sthe\sNULL\sresults\sfrom\sa\sCASE\sexpression\sthat\slacks\san\sELSE\sclause. +D 2019-01-17T04:40:04.666 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -474,7 +474,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c ce295c50a49b626d96d668a915220d02fe372e27ad7dd2bfef297b0335c40488 +F src/insert.c b9c5f7a390e9ef4b19b9a85820c15ecf5d065a935bae507a6305be61c18f4814 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 008f45dd39cdc7fb9e7e1f61d75a5c97397f8e07427a8879be23e27747d5f948 @@ -1034,7 +1034,7 @@ F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d2 F test/indexexpr2.test 8dd1f8f936cc4d246af605366886bbd251848b411378eb60887361d5302d9f54 F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test 5604b1ff5675cc84c34a5b315792b958f48c32edccc0dafcc81d3b776270b70a +F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 F test/insert4.test 46bead5f39e181850ee56adcf49d3a3157c460c52249211714612ac89fe34835 @@ -1800,7 +1800,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 835e2cc55feea2f2426c99816c27f9c35d2fd4cdd9bf1c7f46f889ecfd222778 -R 9f028c8159b02a591c16bf06dddc2550 +P 10ffc1fe006a1766ff2f1ffc6129786afb86b6b1f8d3a17334e8ecb838d37b9c +R e2e1ef23c5b3651d2c8187cd4ce88146 U drh -Z 19969df9ee55c88019bc6a9775b0786b +Z eedec3f5327fb3e6e94971123303b0d3 diff --git a/manifest.uuid b/manifest.uuid index c08e46f3d4..564a0b8a35 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10ffc1fe006a1766ff2f1ffc6129786afb86b6b1f8d3a17334e8ecb838d37b9c \ No newline at end of file +9a425051e7ba59e797636f5cf32b5f6efafdb21c8d5300e099b8008b829c1439 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 4f7b19b562..7301d87a1d 100644 --- a/src/insert.c +++ b/src/insert.c @@ -953,16 +953,12 @@ void sqlite3Insert( }else if( pSelect ){ sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); }else{ - VdbeOp *pOp; - sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); - pOp = sqlite3VdbeGetOp(v, -1); - assert( pOp!=0 ); - if( pOp->opcode==OP_Null && !IsVirtual(pTab) ){ + Expr *pIpk = pList->a[ipkColumn].pExpr; + if( pIpk->op==TK_NULL && !IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); appendFlag = 1; - pOp->opcode = OP_NewRowid; - pOp->p1 = iDataCur; - pOp->p2 = regRowid; - pOp->p3 = regAutoinc; + }else{ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); } } /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid diff --git a/test/insert.test b/test/insert.test index 1337105e25..01c7016d84 100644 --- a/test/insert.test +++ b/test/insert.test @@ -449,6 +449,15 @@ do_execsql_test insert-13.1 { SELECT * FROM t13 ORDER BY +b; } {2 0 6 2 1 5} +# 2019-01-17. From the chromium fuzzer. +# +do_execsql_test insert-14.1 { + DROP TABLE IF EXISTS t14; + CREATE TABLE t14(x INTEGER PRIMARY KEY); + INSERT INTO t14 VALUES(CASE WHEN 1 THEN null END); + SELECT x FROM t14; +} {1} + integrity_check insert-99.0 finish_test From 0ad7aa818283c82c550cdf18c7f897341b66f39f Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Jan 2019 14:34:46 +0000 Subject: [PATCH 081/306] Limit the size of SrcList objects to 200 entries (compile-time configurable using -DSQLITE_MAX_SRCLIST=n). The maximum number of tables in a join has always been 64, so this is not a real constraint on capability. Limiting the size of a SrcList prevents DOS attacks (discovered by OSSFuzz) using crazy nexted CTE joins. FossilOrigin-Name: 7cac614d5df55eb092b863163483b6782b942b21bd15fd787576fef5619fa849 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 23 +++++++++++++++++++++++ test/join.test | 32 +++++++++++++++++++------------- test/with1.test | 20 ++++++++++++++++++++ 5 files changed, 71 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 2f9f98ce6e..27d2ab24de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scorner-case\sfor\sthe\slogic\sthat\scause\san\sinsert\sof\sa\sNULL\sinto\san\nINTEGER\sPRIMARY\sKEY\scolumn\sto\sbe\sconverted\sinto\sa\svalid\sinteger\skey,\nwhen\sthe\sNULL\sresults\sfrom\sa\sCASE\sexpression\sthat\slacks\san\sELSE\sclause. -D 2019-01-17T04:40:04.666 +C Limit\sthe\ssize\sof\sSrcList\sobjects\sto\s200\sentries\s(compile-time\sconfigurable\nusing\s-DSQLITE_MAX_SRCLIST=n).\s\sThe\smaximum\snumber\sof\stables\sin\sa\sjoin\shas\nalways\sbeen\s64,\sso\sthis\sis\snot\sa\sreal\sconstraint\son\scapability.\s\sLimiting\sthe\nsize\sof\sa\sSrcList\sprevents\sDOS\sattacks\s(discovered\sby\sOSSFuzz)\susing\scrazy\nnexted\sCTE\sjoins. +D 2019-01-17T14:34:46.282 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -457,7 +457,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a1030989a43bb21fde08fbe26e201009b70956560e5663317106f75c45937ac9 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 -F src/build.c b1e24f1deedee07955cad9c56928cdafa7df1615746688e817bfe0b020a68576 +F src/build.c eb0ab28d8e7ab0e567d67a86208abd2409f8a378a1333e209a72fde95c407d37 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -1053,7 +1053,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 62372ad3ddcc5d0eb8ff9097dcb0aad8961bf1b9cb45ba634f6e284695126f9a -F test/join.test 2ad9d7fe10e0cc06bc7803c22e5533be11cdadbc592f5f95d789a873b57a5a66 +F test/join.test b6f771f4db4b8cee20ef79936f16efa351d2e90563a01aa1ab789e3052262350 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1681,7 +1681,7 @@ F test/window4.test c5d6bf3403e4ade2f19df2afe4c16f29fb817c392c6c1c8017edb7165c19 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e F test/window6.test 5eae4ae7a590ccf1e605880969ca0bad3955616ac91cad3031baea38748badb3 F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b -F test/with1.test 4776e8a57739b1dd33c7cb2c9f17fede6b55634f53323fbf8bb538228b644dbf +F test/with1.test ff15177e0ee6d3c8f89cf309410148f2f1bd4f0d67224223455b95460a577ebb F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab F test/with3.test 8d26920c88283e0a473ceebd3451554922108ce7b2a6a1157c47eb0a7011212c F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 @@ -1800,7 +1800,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 10ffc1fe006a1766ff2f1ffc6129786afb86b6b1f8d3a17334e8ecb838d37b9c -R e2e1ef23c5b3651d2c8187cd4ce88146 +P 9a425051e7ba59e797636f5cf32b5f6efafdb21c8d5300e099b8008b829c1439 +R f3aab0ca635e2360149e2d627d6e008d U drh -Z eedec3f5327fb3e6e94971123303b0d3 +Z a156b7037d7ea15cc025fd5eab01a1d7 diff --git a/manifest.uuid b/manifest.uuid index 564a0b8a35..dedb24b220 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a425051e7ba59e797636f5cf32b5f6efafdb21c8d5300e099b8008b829c1439 \ No newline at end of file +7cac614d5df55eb092b863163483b6782b942b21bd15fd787576fef5619fa849 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 0d734c1075..ce7014683c 100644 --- a/src/build.c +++ b/src/build.c @@ -3823,6 +3823,18 @@ int sqlite3IdListIndex(IdList *pList, const char *zName){ return -1; } +/* +** Maximum size of a SrcList object. +** The SrcList object is used to represent the FROM clause of a +** SELECT statement, and the query planner cannot deal with more +** than 64 tables in a join. So any value larger than 64 here +** is sufficient for most uses. Smaller values, like say 10, are +** appropriate for small and memory-limited applications. +*/ +#ifndef SQLITE_MAX_SRCLIST +# define SQLITE_MAX_SRCLIST 200 +#endif + /* ** Expand the space allocated for the given SrcList object by ** creating nExtra new slots beginning at iStart. iStart is zero based. @@ -3861,6 +3873,17 @@ SrcList *sqlite3SrcListEnlarge( SrcList *pNew; int nAlloc = pSrc->nSrc*2+nExtra; int nGot; + + if( pSrc->nSrc+nExtra>=SQLITE_MAX_SRCLIST ){ + /* FIXME: Return a better error than SQLITE_NOMEM when the size + ** of a SrcList object gets to be too big. To fix this will require + ** replumbing to pass Parse* instead of sqlite3* as the first parameter + ** to the SrcList allocators. As this never comes up in real-world + ** usage, the fix is a low priority. */ + sqlite3OomFault(db); + return pSrc; + } + if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST; pNew = sqlite3DbRealloc(db, pSrc, sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); if( pNew==0 ){ diff --git a/test/join.test b/test/join.test index 8c6f463bca..b17acb28f3 100644 --- a/test/join.test +++ b/test/join.test @@ -671,20 +671,26 @@ jointest join-12.5 65 {1 {at most 64 tables in a join}} jointest join-12.6 66 {1 {at most 64 tables in a join}} jointest join-12.7 127 {1 {at most 64 tables in a join}} jointest join-12.8 128 {1 {at most 64 tables in a join}} -jointest join-12.9 1000 {1 {at most 64 tables in a join}} -# If SQLite is built with SQLITE_MEMDEBUG, then the huge number of realloc() -# calls made by the following test cases are too time consuming to run. -# Without SQLITE_MEMDEBUG, realloc() is fast enough that these are not -# a problem. -ifcapable pragma&&compileoption_diags { - if {[lsearch [db eval {PRAGMA compile_options}] MEMDEBUG]<0} { - jointest join-12.10 65534 {1 {at most 64 tables in a join}} - jointest join-12.11 65535 {1 {too many references to "t14": max 65535}} - jointest join-12.12 65536 {1 {too many references to "t14": max 65535}} - jointest join-12.13 65537 {1 {too many references to "t14": max 65535}} - } -} +# As of 2019-01-17, the number of elements in a SrcList is limited +# to 200. The following tests still run, but the answer is now +# an SQLITE_NOMEM error. +# +# jointest join-12.9 1000 {1 {at most 64 tables in a join}} +# +# If SQLite is built with SQLITE_MEMDEBUG, then the huge number of realloc() +# calls made by the following test cases are too time consuming to run. +# Without SQLITE_MEMDEBUG, realloc() is fast enough that these are not +# a problem. +# +# ifcapable pragma&&compileoption_diags { +# if {[lsearch [db eval {PRAGMA compile_options}] MEMDEBUG]<0} { +# jointest join-12.10 65534 {1 {at most 64 tables in a join}} +# jointest join-12.11 65535 {1 {too many references to "t14": max 65535}} +# jointest join-12.12 65536 {1 {too many references to "t14": max 65535}} +# jointest join-12.13 65537 {1 {too many references to "t14": max 65535}} +# } +# } #------------------------------------------------------------------------- diff --git a/test/with1.test b/test/with1.test index f9dfbb6bb1..83ea44b439 100644 --- a/test/with1.test +++ b/test/with1.test @@ -1071,4 +1071,24 @@ do_execsql_test 21.2 { SELECT * FROM Table0 NATURAL JOIN Table0)); } {{}} +# 2019-01-17 +# Make sure crazy nexted CTE joins terminate with an error quickly. +# +do_catchsql_test 22.1 { + WITH RECURSIVE c AS ( + WITH RECURSIVE c AS ( + WITH RECURSIVE c AS ( + WITH RECURSIVE c AS ( + WITH c AS (VALUES(0)) + SELECT 1 FROM c LEFT JOIN c ON ltrim(1) + ) + SELECT 1 FROM c,c,c,c,c,c,c,c,c + ) + SELECT 2 FROM c,c,c,c,c,c,c,c,c + ) + SELECT 3 FROM c,c,c,c,c,c,c,c,c + ) + SELECT 4 FROM c,c,c,c,c,c,c,c,c; +} {1 {out of memory}} + finish_test From 29c992cb049c0fbf3185082d3f81dd76c13e746d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Jan 2019 15:40:41 +0000 Subject: [PATCH 082/306] Revamp the SrcList allocator routines to be methods of Parse instead of being methods of the "sqlite3" object, so that they can leave better error messages when the SrcList object grows too large. FossilOrigin-Name: df08d472b090b212fb77ce2aae0e1ffe79ae5db4b1accf55e6fdb18e8b0a7098 --- manifest | 28 ++++++++++++++-------------- manifest.uuid | 2 +- src/build.c | 46 +++++++++++++++++++++++++--------------------- src/delete.c | 2 +- src/fkey.c | 4 ++-- src/parse.y | 16 ++++++++-------- src/select.c | 15 ++++++--------- src/sqliteInt.h | 4 ++-- src/trigger.c | 2 +- src/window.c | 3 +-- test/with1.test | 2 +- 11 files changed, 62 insertions(+), 62 deletions(-) diff --git a/manifest b/manifest index 27d2ab24de..165aebdb5e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Limit\sthe\ssize\sof\sSrcList\sobjects\sto\s200\sentries\s(compile-time\sconfigurable\nusing\s-DSQLITE_MAX_SRCLIST=n).\s\sThe\smaximum\snumber\sof\stables\sin\sa\sjoin\shas\nalways\sbeen\s64,\sso\sthis\sis\snot\sa\sreal\sconstraint\son\scapability.\s\sLimiting\sthe\nsize\sof\sa\sSrcList\sprevents\sDOS\sattacks\s(discovered\sby\sOSSFuzz)\susing\scrazy\nnexted\sCTE\sjoins. -D 2019-01-17T14:34:46.282 +C Revamp\sthe\sSrcList\sallocator\sroutines\sto\sbe\smethods\sof\sParse\sinstead\sof\nbeing\smethods\sof\sthe\s"sqlite3"\sobject,\sso\sthat\sthey\scan\sleave\sbetter\serror\nmessages\swhen\sthe\sSrcList\sobject\sgrows\stoo\slarge. +D 2019-01-17T15:40:41.525 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -457,17 +457,17 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a1030989a43bb21fde08fbe26e201009b70956560e5663317106f75c45937ac9 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 -F src/build.c eb0ab28d8e7ab0e567d67a86208abd2409f8a378a1333e209a72fde95c407d37 +F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 -F src/delete.c 209cd8345b15d1843abeff2d91a6d9c765cf32ff4abcb24411c38fe08e18baab +F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c b660eb4d6d273946a8341efb9d38320ddceb9c2931d04478c74b85c35e053a5e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c aaf28be73ab21e1e8bf4ac6b94269ebc8c93238d1e6997cb44b527b622e8ae6f +F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/func.c 6cf832abbc2815fdb46fee654df32a66ab77deb47bf4cff04a5774dafecd497a F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a @@ -502,7 +502,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 75e0f3cfa3962c714f519f8a3d1e67ecca1c91de0e010a036b988e40ce9e4c73 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y e801b38c434b9cb30506dcf8e16b5641a5d54f26ca957a8313372c5156ded86e +F src/parse.y 489673ac424c1d3ec3c97f65df572652b32a47bbcee5be1492ad7d4874d47430 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 @@ -513,12 +513,12 @@ F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c a40867ce07a9b58121d6f9a8fc969555d3c9bdcb6c2b5fc202670815af8dbd91 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 5cbd6ab60bd017cf5857f9153680a64d04678a9d2a0ea56b90cae2f61deb18b3 +F src/select.c f7260c833c87c52ac187bc160ccc675a67d5a226cacd7eb1cdcb3c3ff25bde76 F src/shell.c.in b3cd745b53439674fdc3dc4db12e094d11cff91495be68bb09ac52726084b583 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 348bc49c8e03865d1bdbe350e3e5708af972210d92307c5b467caa25544705c0 +F src/sqliteInt.h a2330a569d8c5461aa35fe3ad29a1885e13ddfd07088a3e833131490c3a99ca9 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -578,7 +578,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c c8af4feebd8bf5a4d60a14018d91f61013f658ec864dfce7661bae73d86b3191 F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d -F src/trigger.c 77546bf525854aa4dc09f3a0450fa801c3e99d5f13a3eb2efd07bfe521e3b5d6 +F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 4e630e47852e206d0b29ec63ea0402e0b7ba328a1c19dd645ae8ac7bd0a378cf F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 @@ -602,7 +602,7 @@ F src/where.c dc293ea4230adf9a323fb2e5750eff565347567a3cd6538f7d0fa93b11c2baae F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 -F src/window.c 5950fb4dd9fd5dcefffd082fa2b8832ca8bef2d2297a151929ce06aeb4f58139 +F src/window.c 1f4f7c69f23992b91c82e71fe47dd4e3ed70ceae12ce5ca6a1e757fdb158dcae F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1681,7 +1681,7 @@ F test/window4.test c5d6bf3403e4ade2f19df2afe4c16f29fb817c392c6c1c8017edb7165c19 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e F test/window6.test 5eae4ae7a590ccf1e605880969ca0bad3955616ac91cad3031baea38748badb3 F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b -F test/with1.test ff15177e0ee6d3c8f89cf309410148f2f1bd4f0d67224223455b95460a577ebb +F test/with1.test f1fcc3e35e5c8729f63bb91c4122c05130ce65838f72156c973cac1d1a29b9e4 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab F test/with3.test 8d26920c88283e0a473ceebd3451554922108ce7b2a6a1157c47eb0a7011212c F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 @@ -1800,7 +1800,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 9a425051e7ba59e797636f5cf32b5f6efafdb21c8d5300e099b8008b829c1439 -R f3aab0ca635e2360149e2d627d6e008d +P 7cac614d5df55eb092b863163483b6782b942b21bd15fd787576fef5619fa849 +R da09aa743220f427a887585645e049c3 U drh -Z a156b7037d7ea15cc025fd5eab01a1d7 +Z ff9e28f4d3d071b71e3451811b9f6688 diff --git a/manifest.uuid b/manifest.uuid index dedb24b220..8b5cfe7559 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cac614d5df55eb092b863163483b6782b942b21bd15fd787576fef5619fa849 \ No newline at end of file +df08d472b090b212fb77ce2aae0e1ffe79ae5db4b1accf55e6fdb18e8b0a7098 \ No newline at end of file diff --git a/src/build.c b/src/build.c index ce7014683c..64585f85f9 100644 --- a/src/build.c +++ b/src/build.c @@ -3851,11 +3851,12 @@ int sqlite3IdListIndex(IdList *pList, const char *zName){ ** the iStart value would be 0. The result then would ** be: nil, nil, nil, A, B. ** -** If a memory allocation fails the SrcList is unchanged. The -** db->mallocFailed flag will be set to true. +** If a memory allocation fails or the SrcList becomes too large, leave +** the original SrcList unchanged, return NULL, and leave an error message +** in pParse. */ SrcList *sqlite3SrcListEnlarge( - sqlite3 *db, /* Database connection to notify of OOM errors */ + Parse *pParse, /* Parsing context into which errors are reported */ SrcList *pSrc, /* The SrcList to be enlarged */ int nExtra, /* Number of new slots to add to pSrc->a[] */ int iStart /* Index in pSrc->a[] of first new slot */ @@ -3873,22 +3874,19 @@ SrcList *sqlite3SrcListEnlarge( SrcList *pNew; int nAlloc = pSrc->nSrc*2+nExtra; int nGot; + sqlite3 *db = pParse->db; if( pSrc->nSrc+nExtra>=SQLITE_MAX_SRCLIST ){ - /* FIXME: Return a better error than SQLITE_NOMEM when the size - ** of a SrcList object gets to be too big. To fix this will require - ** replumbing to pass Parse* instead of sqlite3* as the first parameter - ** to the SrcList allocators. As this never comes up in real-world - ** usage, the fix is a low priority. */ - sqlite3OomFault(db); - return pSrc; + sqlite3ErrorMsg(pParse, "too many FROM clause terms, max: %d", + SQLITE_MAX_SRCLIST); + return 0; } if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST; pNew = sqlite3DbRealloc(db, pSrc, sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); if( pNew==0 ){ assert( db->mallocFailed ); - return pSrc; + return 0; } pSrc = pNew; nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1; @@ -3917,7 +3915,8 @@ SrcList *sqlite3SrcListEnlarge( ** Append a new table name to the given SrcList. Create a new SrcList if ** need be. A new entry is created in the SrcList even if pTable is NULL. ** -** A SrcList is returned, or NULL if there is an OOM error. The returned +** A SrcList is returned, or NULL if there is an OOM error or if the +** SrcList grows to large. The returned ** SrcList might be the same as the SrcList that was input or it might be ** a new one. If an OOM error does occurs, then the prior value of pList ** that is input to this routine is automatically freed. @@ -3948,27 +3947,32 @@ SrcList *sqlite3SrcListEnlarge( ** before being added to the SrcList. */ SrcList *sqlite3SrcListAppend( - sqlite3 *db, /* Connection to notify of malloc failures */ + Parse *pParse, /* Parsing context, in which errors are reported */ SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ Token *pTable, /* Table to append */ Token *pDatabase /* Database of the table */ ){ struct SrcList_item *pItem; + sqlite3 *db; assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */ - assert( db!=0 ); + assert( pParse!=0 ); + assert( pParse->db!=0 ); + db = pParse->db; if( pList==0 ){ - pList = sqlite3DbMallocRawNN(db, sizeof(SrcList) ); + pList = sqlite3DbMallocRawNN(pParse->db, sizeof(SrcList) ); if( pList==0 ) return 0; pList->nAlloc = 1; pList->nSrc = 1; memset(&pList->a[0], 0, sizeof(pList->a[0])); pList->a[0].iCursor = -1; }else{ - pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc); - } - if( db->mallocFailed ){ - sqlite3SrcListDelete(db, pList); - return 0; + SrcList *pNew = sqlite3SrcListEnlarge(pParse, pList, 1, pList->nSrc); + if( pNew==0 ){ + sqlite3SrcListDelete(db, pList); + return 0; + }else{ + pList = pNew; + } } pItem = &pList->a[pList->nSrc-1]; if( pDatabase && pDatabase->z==0 ){ @@ -4057,7 +4061,7 @@ SrcList *sqlite3SrcListAppendFromTerm( ); goto append_from_error; } - p = sqlite3SrcListAppend(db, p, pTable, pDatabase); + p = sqlite3SrcListAppend(pParse, p, pTable, pDatabase); if( p==0 ){ goto append_from_error; } diff --git a/src/delete.c b/src/delete.c index 0525dfd3f7..e3a0abc2c0 100644 --- a/src/delete.c +++ b/src/delete.c @@ -117,7 +117,7 @@ void sqlite3MaterializeView( sqlite3 *db = pParse->db; int iDb = sqlite3SchemaToIndex(db, pView->pSchema); pWhere = sqlite3ExprDup(db, pWhere, 0); - pFrom = sqlite3SrcListAppend(db, 0, 0, 0); + pFrom = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pFrom ){ assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); diff --git a/src/fkey.c b/src/fkey.c index b7af4d4734..9633c41449 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -1014,7 +1014,7 @@ void sqlite3FkCheck( /* Create a SrcList structure containing the child table. We need the ** child table as a SrcList for sqlite3WhereBegin() */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ struct SrcList_item *pItem = pSrc->a; pItem->pTab = pFKey->pFrom; @@ -1291,7 +1291,7 @@ static Trigger *fkActionTrigger( } pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), - sqlite3SrcListAppend(db, 0, &tFrom, 0), + sqlite3SrcListAppend(pParse, 0, &tFrom, 0), pWhere, 0, 0, 0, 0, 0 ); diff --git a/src/parse.y b/src/parse.y index d75ba611dc..95dfc028fc 100644 --- a/src/parse.y +++ b/src/parse.y @@ -690,26 +690,26 @@ dbnm(A) ::= DOT nm(X). {A = X;} %type fullname {SrcList*} %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} fullname(A) ::= nm(X). { - A = sqlite3SrcListAppend(pParse->db,0,&X,0); + A = sqlite3SrcListAppend(pParse,0,&X,0); if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &X); } fullname(A) ::= nm(X) DOT nm(Y). { - A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); + A = sqlite3SrcListAppend(pParse,0,&X,&Y); if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &Y); } %type xfullname {SrcList*} %destructor xfullname {sqlite3SrcListDelete(pParse->db, $$);} xfullname(A) ::= nm(X). - {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/} + {A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/} xfullname(A) ::= nm(X) DOT nm(Y). - {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/} + {A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/} xfullname(A) ::= nm(X) DOT nm(Y) AS nm(Z). { - A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/ + A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/ if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z); } xfullname(A) ::= nm(X) AS nm(Z). { - A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/ + A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/ if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z); } @@ -1216,7 +1216,7 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); } expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] { - SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); + SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&Y,&Z); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); if( E ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E); A = sqlite3PExpr(pParse, TK_IN, A, 0); @@ -1287,7 +1287,7 @@ paren_exprlist(A) ::= LP exprlist(X) RP. {A = X;} cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) ON nm(Y) LP sortlist(Z) RP where_opt(W). { sqlite3CreateIndex(pParse, &X, &D, - sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, + sqlite3SrcListAppend(pParse,0,&Y,0), Z, U, &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF); if( IN_RENAME_OBJECT && pParse->pNewIndex ){ sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &Y); diff --git a/src/select.c b/src/select.c index 7d384398b3..3b9a0c3756 100644 --- a/src/select.c +++ b/src/select.c @@ -3960,11 +3960,9 @@ static int flattenSubquery( jointype = pSubitem->fg.jointype; }else{ assert( pParent!=p ); /* 2nd and subsequent times through the loop */ - pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - if( pSrc==0 ){ - assert( db->mallocFailed ); - break; - } + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* The subquery uses a single slot of the FROM clause of the outer @@ -3983,10 +3981,9 @@ static int flattenSubquery( ** for the two elements in the FROM clause of the subquery. */ if( nSubSrc>1 ){ - pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1); - if( db->mallocFailed ){ - break; - } + pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* Transfer the FROM clause terms from the subquery into the diff --git a/src/sqliteInt.h b/src/sqliteInt.h index fe0bd62261..00991a969c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3929,8 +3929,8 @@ void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*); void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); int sqlite3IdListIndex(IdList*,const char*); -SrcList *sqlite3SrcListEnlarge(sqlite3*, SrcList*, int, int); -SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*); +SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); +SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, Token*, Select*, Expr*, IdList*); void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); diff --git a/src/trigger.c b/src/trigger.c index 617afd9e72..c37f76da72 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -731,7 +731,7 @@ static SrcList *targetSrcList( int iDb; /* Index of the database to use */ SrcList *pSrc; /* SrcList to be returned */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ assert( pSrc->nSrc>0 ); pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); diff --git a/src/window.c b/src/window.c index 18a4f7054c..bb9bfa93e6 100644 --- a/src/window.c +++ b/src/window.c @@ -823,8 +823,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ pSub = sqlite3SelectNew( pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0 ); - p->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - assert( p->pSrc || db->mallocFailed ); + p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); diff --git a/test/with1.test b/test/with1.test index 83ea44b439..9566b67cd3 100644 --- a/test/with1.test +++ b/test/with1.test @@ -1089,6 +1089,6 @@ do_catchsql_test 22.1 { SELECT 3 FROM c,c,c,c,c,c,c,c,c ) SELECT 4 FROM c,c,c,c,c,c,c,c,c; -} {1 {out of memory}} +} {1 {at most 64 tables in a join}} finish_test From 25fb50674f17198acfee9ac96ff5309adce37291 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 17 Jan 2019 17:39:15 +0000 Subject: [PATCH 083/306] Fix problems with joining two or more fts5_vocab tables that access the same underlying fts5 table. FossilOrigin-Name: 49956395e14b61f6bf839e59ae7dd95eb32ebf32f3d16388844de6621b9c2d98 --- ext/fts5/fts5Int.h | 16 ++- ext/fts5/fts5_main.c | 202 +++++++++++++++++------------------ ext/fts5/fts5_vocab.c | 61 ++++++----- ext/fts5/test/fts5vocab.test | 43 ++++++++ manifest | 20 ++-- manifest.uuid | 2 +- 6 files changed, 198 insertions(+), 146 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 66d134fdf6..4855abe5b2 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -520,9 +520,19 @@ int sqlite3Fts5PutVarint(unsigned char *p, u64 v); /************************************************************************** -** Interface to code in fts5.c. +** Interface to code in fts5_main.c. */ +/* +** Virtual-table object. +*/ +typedef struct Fts5Table Fts5Table; +struct Fts5Table { + sqlite3_vtab base; /* Base class used by SQLite core */ + Fts5Config *pConfig; /* Virtual table configuration */ + Fts5Index *pIndex; /* Full-text index */ +}; + int sqlite3Fts5GetTokenizer( Fts5Global*, const char **azArg, @@ -532,7 +542,9 @@ int sqlite3Fts5GetTokenizer( char **pzErr ); -Fts5Index *sqlite3Fts5IndexFromCsrid(Fts5Global*, i64, Fts5Config **); +Fts5Table *sqlite3Fts5TableFromCsrid(Fts5Global*, i64); + +int sqlite3Fts5FlushToDisk(Fts5Table*); /* ** End of interface to code in fts5.c. diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 3e35f8e939..bb342344d4 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -28,8 +28,8 @@ int sqlite3_fts5_may_be_corrupt = 1; typedef struct Fts5Auxdata Fts5Auxdata; typedef struct Fts5Auxiliary Fts5Auxiliary; typedef struct Fts5Cursor Fts5Cursor; +typedef struct Fts5FullTable Fts5FullTable; typedef struct Fts5Sorter Fts5Sorter; -typedef struct Fts5Table Fts5Table; typedef struct Fts5TokenizerModule Fts5TokenizerModule; /* @@ -110,13 +110,8 @@ struct Fts5TokenizerModule { Fts5TokenizerModule *pNext; /* Next registered tokenizer module */ }; -/* -** Virtual-table object. -*/ -struct Fts5Table { - sqlite3_vtab base; /* Base class used by SQLite core */ - Fts5Config *pConfig; /* Virtual table configuration */ - Fts5Index *pIndex; /* Full-text index */ +struct Fts5FullTable { + Fts5Table p; /* Public class members from fts5Int.h */ Fts5Storage *pStorage; /* Document store */ Fts5Global *pGlobal; /* Global (connection wide) data */ Fts5Cursor *pSortCsr; /* Sort data from this cursor */ @@ -254,7 +249,7 @@ struct Fts5Auxdata { #define FTS5_SAVEPOINT 5 #define FTS5_RELEASE 6 #define FTS5_ROLLBACKTO 7 -static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ +static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){ switch( op ){ case FTS5_BEGIN: assert( p->ts.eState==0 ); @@ -306,18 +301,18 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ /* ** Return true if pTab is a contentless table. */ -static int fts5IsContentless(Fts5Table *pTab){ - return pTab->pConfig->eContent==FTS5_CONTENT_NONE; +static int fts5IsContentless(Fts5FullTable *pTab){ + return pTab->p.pConfig->eContent==FTS5_CONTENT_NONE; } /* ** Delete a virtual table handle allocated by fts5InitVtab(). */ -static void fts5FreeVtab(Fts5Table *pTab){ +static void fts5FreeVtab(Fts5FullTable *pTab){ if( pTab ){ - sqlite3Fts5IndexClose(pTab->pIndex); + sqlite3Fts5IndexClose(pTab->p.pIndex); sqlite3Fts5StorageClose(pTab->pStorage); - sqlite3Fts5ConfigFree(pTab->pConfig); + sqlite3Fts5ConfigFree(pTab->p.pConfig); sqlite3_free(pTab); } } @@ -326,7 +321,7 @@ static void fts5FreeVtab(Fts5Table *pTab){ ** The xDisconnect() virtual table method. */ static int fts5DisconnectMethod(sqlite3_vtab *pVtab){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -337,7 +332,7 @@ static int fts5DestroyMethod(sqlite3_vtab *pVtab){ Fts5Table *pTab = (Fts5Table*)pVtab; int rc = sqlite3Fts5DropAll(pTab->pConfig); if( rc==SQLITE_OK ){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); } return rc; } @@ -366,28 +361,28 @@ static int fts5InitVtab( const char **azConfig = (const char**)argv; int rc = SQLITE_OK; /* Return code */ Fts5Config *pConfig = 0; /* Results of parsing argc/argv */ - Fts5Table *pTab = 0; /* New virtual table object */ + Fts5FullTable *pTab = 0; /* New virtual table object */ /* Allocate the new vtab object and parse the configuration */ - pTab = (Fts5Table*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Table)); + pTab = (Fts5FullTable*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5FullTable)); if( rc==SQLITE_OK ){ rc = sqlite3Fts5ConfigParse(pGlobal, db, argc, azConfig, &pConfig, pzErr); assert( (rc==SQLITE_OK && *pzErr==0) || pConfig==0 ); } if( rc==SQLITE_OK ){ - pTab->pConfig = pConfig; + pTab->p.pConfig = pConfig; pTab->pGlobal = pGlobal; } /* Open the index sub-system */ if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->pIndex, pzErr); + rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->p.pIndex, pzErr); } /* Open the storage sub-system */ if( rc==SQLITE_OK ){ rc = sqlite3Fts5StorageOpen( - pConfig, pTab->pIndex, bCreate, &pTab->pStorage, pzErr + pConfig, pTab->p.pIndex, bCreate, &pTab->pStorage, pzErr ); } @@ -400,8 +395,8 @@ static int fts5InitVtab( if( rc==SQLITE_OK ){ assert( pConfig->pzErrmsg==0 ); pConfig->pzErrmsg = pzErr; - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); - sqlite3Fts5IndexRollback(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + sqlite3Fts5IndexRollback(pTab->p.pIndex); pConfig->pzErrmsg = 0; } @@ -614,7 +609,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ return SQLITE_OK; } -static int fts5NewTransaction(Fts5Table *pTab){ +static int fts5NewTransaction(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->base.pVtab==(sqlite3_vtab*)pTab ) return SQLITE_OK; @@ -626,8 +621,8 @@ static int fts5NewTransaction(Fts5Table *pTab){ ** Implementation of xOpen method. */ static int fts5OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ - Fts5Table *pTab = (Fts5Table*)pVTab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVTab; + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = 0; /* New cursor object */ sqlite3_int64 nByte; /* Bytes of space to allocate */ int rc; /* Return code */ @@ -673,7 +668,7 @@ static void fts5CsrNewrow(Fts5Cursor *pCsr){ } static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); Fts5Auxdata *pData; Fts5Auxdata *pNext; @@ -717,7 +712,7 @@ static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ */ static int fts5CloseMethod(sqlite3_vtab_cursor *pCursor){ if( pCursor ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; Fts5Cursor **pp; @@ -774,7 +769,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){ ** Set the FTS5CSR_REQUIRE_RESEEK flag on all FTS5_PLAN_MATCH cursors ** open on table pTab. */ -static void fts5TripCursors(Fts5Table *pTab){ +static void fts5TripCursors(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->ePlan==FTS5_PLAN_MATCH @@ -801,11 +796,11 @@ static int fts5CursorReseek(Fts5Cursor *pCsr, int *pbSkip){ int rc = SQLITE_OK; assert( *pbSkip==0 ); if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_RESEEK) ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int bDesc = pCsr->bDesc; i64 iRowid = sqlite3Fts5ExprRowid(pCsr->pExpr); - rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->pIndex, iRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->p.pIndex, iRowid, bDesc); if( rc==SQLITE_OK && iRowid!=sqlite3Fts5ExprRowid(pCsr->pExpr) ){ *pbSkip = 1; } @@ -902,8 +897,12 @@ static int fts5PrepareStatement( return rc; } -static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ - Fts5Config *pConfig = pTab->pConfig; +static int fts5CursorFirstSorted( + Fts5FullTable *pTab, + Fts5Cursor *pCsr, + int bDesc +){ + Fts5Config *pConfig = pTab->p.pConfig; Fts5Sorter *pSorter; int nPhrase; sqlite3_int64 nByte; @@ -950,10 +949,10 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ return rc; } -static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ +static int fts5CursorFirst(Fts5FullTable *pTab, Fts5Cursor *pCsr, int bDesc){ int rc; Fts5Expr *pExpr = pCsr->pExpr; - rc = sqlite3Fts5ExprFirst(pExpr, pTab->pIndex, pCsr->iFirstRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pExpr, pTab->p.pIndex, pCsr->iFirstRowid, bDesc); if( sqlite3Fts5ExprEof(pExpr) ){ CsrFlagSet(pCsr, FTS5CSR_EOF); } @@ -968,7 +967,7 @@ static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ ** parameters. */ static int fts5SpecialMatch( - Fts5Table *pTab, + Fts5FullTable *pTab, Fts5Cursor *pCsr, const char *zQuery ){ @@ -979,18 +978,18 @@ static int fts5SpecialMatch( while( z[0]==' ' ) z++; for(n=0; z[n] && z[n]!=' '; n++); - assert( pTab->base.zErrMsg==0 ); + assert( pTab->p.base.zErrMsg==0 ); pCsr->ePlan = FTS5_PLAN_SPECIAL; if( 0==sqlite3_strnicmp("reads", z, n) ){ - pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->pIndex); + pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->p.pIndex); } else if( 0==sqlite3_strnicmp("id", z, n) ){ pCsr->iSpecial = pCsr->iCsrId; } else{ /* An unrecognized directive. Return an error message. */ - pTab->base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); + pTab->p.base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); rc = SQLITE_ERROR; } @@ -1002,7 +1001,7 @@ static int fts5SpecialMatch( ** pTab. If one is found, return a pointer to the corresponding Fts5Auxiliary ** structure. Otherwise, if no such function exists, return NULL. */ -static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ +static Fts5Auxiliary *fts5FindAuxiliary(Fts5FullTable *pTab, const char *zName){ Fts5Auxiliary *pAux; for(pAux=pTab->pGlobal->pAux; pAux; pAux=pAux->pNext){ @@ -1015,8 +1014,8 @@ static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ static int fts5FindRankFunction(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; Fts5Auxiliary *pAux = 0; const char *zRank = pCsr->zRank; @@ -1054,8 +1053,8 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ if( rc==SQLITE_OK ){ pAux = fts5FindAuxiliary(pTab, zRank); if( pAux==0 ){ - assert( pTab->base.zErrMsg==0 ); - pTab->base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); + assert( pTab->p.base.zErrMsg==0 ); + pTab->p.base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); rc = SQLITE_ERROR; } } @@ -1130,8 +1129,8 @@ static int fts5FilterMethod( int nVal, /* Number of elements in apVal */ sqlite3_value **apVal /* Arguments for the indexing scheme */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; /* Error code */ int iVal = 0; /* Counter for apVal[] */ @@ -1160,8 +1159,8 @@ static int fts5FilterMethod( assert( pCsr->zRank==0 ); assert( pCsr->zRankArgs==0 ); - assert( pzErrmsg==0 || pzErrmsg==&pTab->base.zErrMsg ); - pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pzErrmsg==0 || pzErrmsg==&pTab->p.base.zErrMsg ); + pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Decode the arguments passed through to this function. ** @@ -1227,7 +1226,7 @@ static int fts5FilterMethod( ** but a request for an internal parameter. */ rc = fts5SpecialMatch(pTab, pCsr, &zExpr[1]); }else{ - char **pzErr = &pTab->base.zErrMsg; + char **pzErr = &pTab->p.base.zErrMsg; rc = sqlite3Fts5ExprNew(pConfig, iCol, zExpr, &pCsr->pExpr, pzErr); if( rc==SQLITE_OK ){ if( bOrderByRank ){ @@ -1250,7 +1249,7 @@ static int fts5FilterMethod( ** by rowid (ePlan==FTS5_PLAN_ROWID). */ pCsr->ePlan = (pRowidEq ? FTS5_PLAN_ROWID : FTS5_PLAN_SCAN); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->base.zErrMsg + pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->p.base.zErrMsg ); if( rc==SQLITE_OK ){ if( pCsr->ePlan==FTS5_PLAN_ROWID ){ @@ -1333,12 +1332,12 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ /* If the cursor does not yet have a statement handle, obtain one now. */ if( pCsr->pStmt==0 ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int eStmt = fts5StmtType(pCsr); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->base.zErrMsg:0) + pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->p.base.zErrMsg:0) ); - assert( rc!=SQLITE_OK || pTab->base.zErrMsg==0 ); + assert( rc!=SQLITE_OK || pTab->p.base.zErrMsg==0 ); assert( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_CONTENT) ); } @@ -1360,11 +1359,11 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ return rc; } -static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ +static void fts5SetVtabError(Fts5FullTable *p, const char *zFormat, ...){ va_list ap; /* ... printf arguments */ va_start(ap, zFormat); - assert( p->base.zErrMsg==0 ); - p->base.zErrMsg = sqlite3_vmprintf(zFormat, ap); + assert( p->p.base.zErrMsg==0 ); + p->p.base.zErrMsg = sqlite3_vmprintf(zFormat, ap); va_end(ap); } @@ -1384,11 +1383,11 @@ static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ ** more commands are added to this function. */ static int fts5SpecialInsert( - Fts5Table *pTab, /* Fts5 table object */ + Fts5FullTable *pTab, /* Fts5 table object */ const char *zCmd, /* Text inserted into table-name column */ sqlite3_value *pVal /* Value inserted into rank column */ ){ - Fts5Config *pConfig = pTab->pConfig; + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; int bError = 0; @@ -1423,9 +1422,9 @@ static int fts5SpecialInsert( pConfig->bPrefixIndex = sqlite3_value_int(pVal); #endif }else{ - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5ConfigSetValue(pTab->pConfig, zCmd, pVal, &bError); + rc = sqlite3Fts5ConfigSetValue(pTab->p.pConfig, zCmd, pVal, &bError); } if( rc==SQLITE_OK ){ if( bError ){ @@ -1439,7 +1438,7 @@ static int fts5SpecialInsert( } static int fts5SpecialDelete( - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal ){ int rc = SQLITE_OK; @@ -1453,7 +1452,7 @@ static int fts5SpecialDelete( static void fts5StorageInsert( int *pRc, - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal, i64 *piRowid ){ @@ -1487,8 +1486,8 @@ static int fts5UpdateMethod( sqlite3_value **apVal, /* Array of arguments */ sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; + Fts5Config *pConfig = pTab->p.pConfig; int eType0; /* value_type() of apVal[0] */ int rc = SQLITE_OK; /* Return code */ @@ -1500,8 +1499,8 @@ static int fts5UpdateMethod( assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER || sqlite3_value_type(apVal[0])==SQLITE_NULL ); - assert( pTab->pConfig->pzErrmsg==0 ); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pTab->p.pConfig->pzErrmsg==0 ); + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Put any active cursors into REQUIRE_SEEK state. */ fts5TripCursors(pTab); @@ -1542,7 +1541,7 @@ static int fts5UpdateMethod( /* Filter out attempts to run UPDATE or DELETE on contentless tables. ** This is not suported. */ if( eType0==SQLITE_INTEGER && fts5IsContentless(pTab) ){ - pTab->base.zErrMsg = sqlite3_mprintf( + pTab->p.base.zErrMsg = sqlite3_mprintf( "cannot %s contentless fts5 table: %s", (nArg>1 ? "UPDATE" : "DELETE from"), pConfig->zName ); @@ -1600,7 +1599,7 @@ static int fts5UpdateMethod( } } - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -1609,12 +1608,12 @@ static int fts5UpdateMethod( */ static int fts5SyncMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_SYNC, 0); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; fts5TripCursors(pTab); rc = sqlite3Fts5StorageSync(pTab->pStorage); - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -1622,8 +1621,8 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){ ** Implementation of xBegin() method. */ static int fts5BeginMethod(sqlite3_vtab *pVtab){ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_BEGIN, 0); - fts5NewTransaction((Fts5Table*)pVtab); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_BEGIN, 0); + fts5NewTransaction((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -1634,7 +1633,7 @@ static int fts5BeginMethod(sqlite3_vtab *pVtab){ */ static int fts5CommitMethod(sqlite3_vtab *pVtab){ UNUSED_PARAM(pVtab); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_COMMIT, 0); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_COMMIT, 0); return SQLITE_OK; } @@ -1644,7 +1643,7 @@ static int fts5CommitMethod(sqlite3_vtab *pVtab){ */ static int fts5RollbackMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_ROLLBACK, 0); rc = sqlite3Fts5StorageRollback(pTab->pStorage); return rc; @@ -1668,13 +1667,13 @@ static int fts5ApiColumnTotalSize( sqlite3_int64 *pnToken ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageSize(pTab->pStorage, iCol, pnToken); } static int fts5ApiRowCount(Fts5Context *pCtx, i64 *pnRow){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageRowCount(pTab->pStorage, pnRow); } @@ -1709,7 +1708,7 @@ static int fts5ApiColumnText( ){ int rc = SQLITE_OK; Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - if( fts5IsContentless((Fts5Table*)(pCsr->base.pVtab)) ){ + if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) ){ *pz = 0; *pn = 0; }else{ @@ -1903,8 +1902,8 @@ static int fts5ColumnSizeCb( static int fts5ApiColumnSize(Fts5Context *pCtx, int iCol, int *pnToken){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_DOCSIZE) ){ @@ -2160,7 +2159,7 @@ static int fts5ApiQueryPhrase( int(*xCallback)(const Fts5ExtensionApi*, Fts5Context*, void*) ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int rc; Fts5Cursor *pNew = 0; @@ -2237,23 +2236,17 @@ static void fts5ApiCallback( /* -** Given cursor id iId, return a pointer to the corresponding Fts5Index +** Given cursor id iId, return a pointer to the corresponding Fts5Table ** object. Or NULL If the cursor id does not exist. -** -** If successful, set *ppConfig to point to the associated config object -** before returning. */ -Fts5Index *sqlite3Fts5IndexFromCsrid( +Fts5Table *sqlite3Fts5TableFromCsrid( Fts5Global *pGlobal, /* FTS5 global context for db handle */ - i64 iCsrId, /* Id of cursor to find */ - Fts5Config **ppConfig /* OUT: Configuration object */ + i64 iCsrId /* Id of cursor to find */ ){ Fts5Cursor *pCsr; pCsr = fts5CursorFromCsrid(pGlobal, iCsrId); if( pCsr ){ - Fts5Table *pTab = (Fts5Table*)pCsr->base.pVtab; - *ppConfig = pTab->pConfig; - return pTab->pIndex; + return (Fts5Table*)pCsr->base.pVtab; } return 0; } @@ -2335,8 +2328,8 @@ static int fts5ColumnMethod( sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ int iCol /* Index of column to read value from */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; @@ -2388,7 +2381,7 @@ static int fts5FindFunctionMethod( void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ void **ppArg /* OUT: User data for *pxFunc */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; Fts5Auxiliary *pAux; UNUSED_PARAM(nUnused); @@ -2410,21 +2403,24 @@ static int fts5RenameMethod( sqlite3_vtab *pVtab, /* Virtual table handle */ const char *zName /* New name of table */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; return sqlite3Fts5StorageRename(pTab->pStorage, zName); } +int sqlite3Fts5FlushToDisk(Fts5Table *pTab){ + fts5TripCursors((Fts5FullTable*)pTab); + return sqlite3Fts5StorageSync(((Fts5FullTable*)pTab)->pStorage); +} + /* ** The xSavepoint() method. ** ** Flush the contents of the pending-terms table to disk. */ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_SAVEPOINT, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_SAVEPOINT, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -2433,11 +2429,9 @@ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** This is a no-op. */ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_RELEASE, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_RELEASE, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -2446,7 +2440,7 @@ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** Discard the contents of the pending terms table. */ static int fts5RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ fts5CheckTransactionState(pTab, FTS5_ROLLBACKTO, iSavepoint); fts5TripCursors(pTab); diff --git a/ext/fts5/fts5_vocab.c b/ext/fts5/fts5_vocab.c index c9dbe3b868..4c597b0e1e 100644 --- a/ext/fts5/fts5_vocab.c +++ b/ext/fts5/fts5_vocab.c @@ -55,7 +55,7 @@ struct Fts5VocabTable { struct Fts5VocabCursor { sqlite3_vtab_cursor base; sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ - Fts5Index *pIndex; /* Associated FTS5 index */ + Fts5Table *pFts5; /* Associated FTS5 table */ int bEof; /* True if this cursor is at EOF */ Fts5IndexIter *pIter; /* Term/rowid iterator object */ @@ -64,7 +64,6 @@ struct Fts5VocabCursor { char *zLeTerm; /* (term <= $zLeTerm) paramater, or NULL */ /* These are used by 'col' tables only */ - Fts5Config *pConfig; /* Fts5 table configuration */ int iCol; i64 *aCnt; i64 *aDoc; @@ -327,8 +326,7 @@ static int fts5VocabOpenMethod( sqlite3_vtab_cursor **ppCsr ){ Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; - Fts5Index *pIndex = 0; - Fts5Config *pConfig = 0; + Fts5Table *pFts5 = 0; Fts5VocabCursor *pCsr = 0; int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; @@ -347,31 +345,34 @@ static int fts5VocabOpenMethod( if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ i64 iId = sqlite3_column_int64(pStmt, 0); - pIndex = sqlite3Fts5IndexFromCsrid(pTab->pGlobal, iId, &pConfig); + pFts5 = sqlite3Fts5TableFromCsrid(pTab->pGlobal, iId); } - if( rc==SQLITE_OK && pIndex==0 ){ - rc = sqlite3_finalize(pStmt); - pStmt = 0; - if( rc==SQLITE_OK ){ - pVTab->zErrMsg = sqlite3_mprintf( - "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl - ); - rc = SQLITE_ERROR; + if( rc==SQLITE_OK ){ + if( pFts5==0 ){ + rc = sqlite3_finalize(pStmt); + pStmt = 0; + if( rc==SQLITE_OK ){ + pVTab->zErrMsg = sqlite3_mprintf( + "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl + ); + rc = SQLITE_ERROR; + } + }else{ + rc = sqlite3Fts5FlushToDisk(pFts5); } } if( rc==SQLITE_OK ){ - int nByte = pConfig->nCol * sizeof(i64) * 2 + sizeof(Fts5VocabCursor); + int nByte = pFts5->pConfig->nCol * sizeof(i64)*2 + sizeof(Fts5VocabCursor); pCsr = (Fts5VocabCursor*)sqlite3Fts5MallocZero(&rc, nByte); } if( pCsr ){ - pCsr->pIndex = pIndex; + pCsr->pFts5 = pFts5; pCsr->pStmt = pStmt; - pCsr->pConfig = pConfig; pCsr->aCnt = (i64*)&pCsr[1]; - pCsr->aDoc = &pCsr->aCnt[pConfig->nCol]; + pCsr->aDoc = &pCsr->aCnt[pFts5->pConfig->nCol]; }else{ sqlite3_finalize(pStmt); } @@ -387,6 +388,7 @@ static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ sqlite3_free(pCsr->zLeTerm); pCsr->nLeTerm = -1; pCsr->zLeTerm = 0; + pCsr->bEof = 0; } /* @@ -425,7 +427,7 @@ static int fts5VocabInstanceNewTerm(Fts5VocabCursor *pCsr){ } static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int rc = SQLITE_OK; Fts5IndexIter *pIter = pCsr->pIter; i64 *pp = &pCsr->iInstPos; @@ -460,7 +462,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; Fts5VocabTable *pTab = (Fts5VocabTable*)pCursor->pVtab; int rc = SQLITE_OK; - int nCol = pCsr->pConfig->nCol; + int nCol = pCsr->pFts5->pConfig->nCol; pCsr->rowid++; @@ -498,7 +500,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ assert( pTab->eType==FTS5_VOCAB_COL || pTab->eType==FTS5_VOCAB_ROW ); while( rc==SQLITE_OK ){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; const u8 *pPos; int nPos; /* Position list */ i64 iPos = 0; /* 64-bit position read from poslist */ int iOff = 0; /* Current offset within position list */ @@ -569,7 +571,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK && pCsr->bEof==0 && pTab->eType==FTS5_VOCAB_COL ){ while( pCsr->aDoc[pCsr->iCol]==0 ) pCsr->iCol++; - assert( pCsr->iColpConfig->nCol ); + assert( pCsr->iColpFts5->pConfig->nCol ); } return rc; } @@ -627,14 +629,15 @@ static int fts5VocabFilterMethod( } if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexQuery(pCsr->pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); + Fts5Index *pIndex = pCsr->pFts5->pIndex; + rc = sqlite3Fts5IndexQuery(pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); } if( rc==SQLITE_OK && eType==FTS5_VOCAB_INSTANCE ){ rc = fts5VocabInstanceNewTerm(pCsr); } - if( rc==SQLITE_OK - && !pCsr->bEof - && (eType!=FTS5_VOCAB_INSTANCE || pCsr->pConfig->eDetail!=FTS5_DETAIL_NONE) + if( rc==SQLITE_OK && !pCsr->bEof + && (eType!=FTS5_VOCAB_INSTANCE + || pCsr->pFts5->pConfig->eDetail!=FTS5_DETAIL_NONE) ){ rc = fts5VocabNextMethod(pCursor); } @@ -657,7 +660,7 @@ static int fts5VocabColumnMethod( int iCol /* Index of column to read value from */ ){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int eType = ((Fts5VocabTable*)(pCursor->pVtab))->eType; i64 iVal = 0; @@ -669,7 +672,7 @@ static int fts5VocabColumnMethod( assert( iCol==1 || iCol==2 || iCol==3 ); if( iCol==1 ){ if( eDetail!=FTS5_DETAIL_NONE ){ - const char *z = pCsr->pConfig->azCol[pCsr->iCol]; + const char *z = pCsr->pFts5->pConfig->azCol[pCsr->iCol]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } }else if( iCol==2 ){ @@ -697,8 +700,8 @@ static int fts5VocabColumnMethod( }else if( eDetail==FTS5_DETAIL_COLUMNS ){ ii = (int)pCsr->iInstPos; } - if( ii>=0 && iipConfig->nCol ){ - const char *z = pCsr->pConfig->azCol[ii]; + if( ii>=0 && iipFts5->pConfig->nCol ){ + const char *z = pCsr->pFts5->pConfig->azCol[ii]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } break; diff --git a/ext/fts5/test/fts5vocab.test b/ext/fts5/test/fts5vocab.test index 69c87ac3a0..4281259c01 100644 --- a/ext/fts5/test/fts5vocab.test +++ b/ext/fts5/test/fts5vocab.test @@ -479,6 +479,49 @@ do_test 9.6 { expr [lsearch $e2 SorterSort]<0 } 0 +#------------------------------------------------------------------------- +do_execsql_test 10.0 { + CREATE VIRTUAL TABLE ft USING fts5(a, b, c); + CREATE VIRTUAL TABLE t2 USING fts5vocab('ft','row'); + CREATE VIRTUAL TABLE t3 USING fts5vocab('ft','row'); +} +do_execsql_test 10.1 { + BEGIN; + INSERT INTO ft(b) VALUES('x y'); +} + +do_execsql_test 10.2 { + SELECT t2.term FROM t2; +} {x y} + +do_execsql_test 10.3 { + SELECT t2.term, t3.term FROM t2, t3; +} {x x x y y x y y} + +do_execsql_test 10.4 { + COMMIT; +} + +do_execsql_test 10.5 { + BEGIN; + INSERT INTO ft(a) VALUES('1 2 3'); + INSERT INTO ft(a) VALUES('4 5 6'); + INSERT INTO ft(a) VALUES('1 2 3'); + INSERT INTO ft(a) VALUES('4 5 6'); + INSERT INTO ft(a) VALUES('1 2 3'); + INSERT INTO ft(a) VALUES('4 5 6'); +} + +do_test 10.6 { + set res [list] + db eval { SELECT rowid FROM ft('4') } x { + db eval { SELECT * FROM t2 } + lappend res $x(rowid) + } + db eval COMMIT + set res +} {3 5 7} finish_test + diff --git a/manifest b/manifest index 165aebdb5e..ef735406a6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Revamp\sthe\sSrcList\sallocator\sroutines\sto\sbe\smethods\sof\sParse\sinstead\sof\nbeing\smethods\sof\sthe\s"sqlite3"\sobject,\sso\sthat\sthey\scan\sleave\sbetter\serror\nmessages\swhen\sthe\sSrcList\sobject\sgrows\stoo\slarge. -D 2019-01-17T15:40:41.525 +C Fix\sproblems\swith\sjoining\stwo\sor\smore\sfts5_vocab\stables\sthat\saccess\sthe\ssame\nunderlying\sfts5\stable. +D 2019-01-17T17:39:15.725 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -109,14 +109,14 @@ F ext/fts3/unicode/mkunicode.tcl 49499f7964504438e2b04cca0627827945bb2499154e2d3 F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 4f5d19b7973dae23de368728f06d3eb1fe9f5cca2990366b40e9379996f35e61 -F ext/fts5/fts5Int.h 545ae89fcaf0071f721eaa2a494bf0edb68d589d052cd7a611b3f1645329ceed +F ext/fts5/fts5Int.h 28a99786582ef2a49db6be8eead420ad4d16fbb6635560ded2455628686a1ba9 F ext/fts5/fts5_aux.c 4353df5d71a8f84ae94ed9c5c9199d1594b8efc9476c4d617fbd8db8b291e3a7 F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81ef59da7a59 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 F ext/fts5/fts5_index.c ba68cfbd786ff50d84c23c841ac44063a5f939b37ae9e320bcbaf2baabc34608 -F ext/fts5/fts5_main.c 55236fb77546bec22bedad309033564ce32c96c001dee82d09d310bcc8c113b6 +F ext/fts5/fts5_main.c 4a7ebaa5a23e932289355c05fbfc0f5b99d8d087e2f4c9e7b7a723c7b8ac9f02 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -124,7 +124,7 @@ F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3 F ext/fts5/fts5_tokenize.c 4d904c237707de8fbb8ab98d24d5c55d47204a3f1f35895d8a53a5327079b32c F ext/fts5/fts5_unicode2.c d8a1528c9a19f79b843c486e5e64bff17d667791ae7f658e11131ebac4b33c59 F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 217451108ad526820f6743f9d9be231a692a4f14e1349d526f82c61f42e9fc13 +F ext/fts5/fts5_vocab.c 132fcaf09cab683f1b118836fe3c2224e2b1d7407f303afb67a19995df112604 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 @@ -217,7 +217,7 @@ F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a -F ext/fts5/test/fts5vocab.test 26e069050d6fb389e67f7a9402421948233152ae433e6b8da47cf15d3b5a8d26 +F ext/fts5/test/fts5vocab.test aaa7aa9365659969be81be4296ede1bbf3e3ef4be65f88f6910943e29704730a F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 @@ -1800,7 +1800,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 7cac614d5df55eb092b863163483b6782b942b21bd15fd787576fef5619fa849 -R da09aa743220f427a887585645e049c3 -U drh -Z ff9e28f4d3d071b71e3451811b9f6688 +P df08d472b090b212fb77ce2aae0e1ffe79ae5db4b1accf55e6fdb18e8b0a7098 +R 021bdc30f655c6978c4bd93d46d69176 +U dan +Z 18a97be91ce9d4bc1de03d5d92d2c08a diff --git a/manifest.uuid b/manifest.uuid index 8b5cfe7559..24a534fe5f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df08d472b090b212fb77ce2aae0e1ffe79ae5db4b1accf55e6fdb18e8b0a7098 \ No newline at end of file +49956395e14b61f6bf839e59ae7dd95eb32ebf32f3d16388844de6621b9c2d98 \ No newline at end of file From f66da6ce8ed88e1d9275773d4199b31866c1c8a3 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 17 Jan 2019 19:11:10 +0000 Subject: [PATCH 084/306] Fix a buffer overwrite that could occur when running an fts5 prefix query against a corrupt database. FossilOrigin-Name: 3910b5639d5c96d1840d4feeea64d3a55073531b7365a4e75d9cda6f119f3cfc --- ext/fts5/fts5_index.c | 11 +- ext/fts5/test/fts5corrupt3.test | 218 ++++++++++++++++++++++++++++++++ manifest | 14 +- manifest.uuid | 2 +- 4 files changed, 235 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 426cf61660..259ae3566b 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4959,6 +4959,8 @@ static void fts5MergePrefixLists( int iOff2 = 0; u8 *a1 = &i1.aPoslist[i1.nSize]; u8 *a2 = &i2.aPoslist[i2.nSize]; + int nCopy; + u8 *aCopy; i64 iPrev = 0; Fts5PoslistWriter writer; @@ -5002,11 +5004,16 @@ static void fts5MergePrefixLists( if( iPos1!=iPrev ){ sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos1); } - fts5BufferSafeAppendBlob(&tmp, &a1[iOff1], i1.nPoslist-iOff1); + aCopy = &a1[iOff1]; + nCopy = i1.nPoslist - iOff1; }else{ assert( iPos2>=0 && iPos2!=iPrev ); sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); - fts5BufferSafeAppendBlob(&tmp, &a2[iOff2], i2.nPoslist-iOff2); + aCopy = &a2[iOff2]; + nCopy = i2.nPoslist - iOff2; + } + if( nCopy>0 ){ + fts5BufferSafeAppendBlob(&tmp, aCopy, nCopy); } /* WRITEPOSLISTSIZE */ diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 71e8273f61..cf5aed1e5d 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -4051,6 +4051,224 @@ do_catchsql_test 34.2 { SELECT fts5_decode(id, block) FROM t2_data; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 35.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-ae135cb10977c7.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 3d ......0000000..= +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 07 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0e fc 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........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 01 2f 0d d5 ...t.[.@.$.../.. +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 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 8f DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 57 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000WBINARY....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 17 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 59 4e 4f 43 41 53 45 17 LE RTREEYNOCASE. +| 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 4f 41 42 4c NARY....)..EOABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 51 53 45 E GEOPOLYXNOCQSE +| 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 1d 05 E FTS5XNOCASE... +| 3728: 00 23 0f a4 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 55 53 34 58 42 49 4e 41 52 59 17 0b LE FUS4XBINARY.. +| 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-ae135cb10977c7.db +}]} {} + +do_catchsql_test 35.1 { + SELECT * FROM t1 WHERE t1 MATCH 'e*'; +} {1 {database disk image is malformed}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index ef735406a6..e366fd4b51 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\swith\sjoining\stwo\sor\smore\sfts5_vocab\stables\sthat\saccess\sthe\ssame\nunderlying\sfts5\stable. -D 2019-01-17T17:39:15.725 +C Fix\sa\sbuffer\soverwrite\sthat\scould\soccur\swhen\srunning\san\sfts5\sprefix\squery\nagainst\sa\scorrupt\sdatabase. +D 2019-01-17T19:11:10.179 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81e F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c ba68cfbd786ff50d84c23c841ac44063a5f939b37ae9e320bcbaf2baabc34608 +F ext/fts5/fts5_index.c 21aec4818901e73563fdc787ed0fa3c3bc2cd6d58b93aae06aad2ffaec097e4a F ext/fts5/fts5_main.c 4a7ebaa5a23e932289355c05fbfc0f5b99d8d087e2f4c9e7b7a723c7b8ac9f02 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 7a4112d9e65be24493cd916a4937610525c352f5f5bc0424d37b434d0b72b9f6 +F ext/fts5/test/fts5corrupt3.test f9d02f7da0e638dc6b61f4efa4f6467090e6b5487ae80fce2ff3b4f7e3533123 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1800,7 +1800,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 df08d472b090b212fb77ce2aae0e1ffe79ae5db4b1accf55e6fdb18e8b0a7098 -R 021bdc30f655c6978c4bd93d46d69176 +P 49956395e14b61f6bf839e59ae7dd95eb32ebf32f3d16388844de6621b9c2d98 +R ccdd711ece291779868bf4b998109e13 U dan -Z 18a97be91ce9d4bc1de03d5d92d2c08a +Z 3e6c4473b6a0336dbaa6dadc398f3df8 diff --git a/manifest.uuid b/manifest.uuid index 24a534fe5f..a197c3e10b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -49956395e14b61f6bf839e59ae7dd95eb32ebf32f3d16388844de6621b9c2d98 \ No newline at end of file +3910b5639d5c96d1840d4feeea64d3a55073531b7365a4e75d9cda6f119f3cfc \ No newline at end of file From aa0f2d0efad49391f44be9ee16c2df61a355c32c Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Jan 2019 19:33:16 +0000 Subject: [PATCH 085/306] Add the SQLITE_ENABLE_EARLY_CURSOR_CLOSE compile-time option which causes read cursors to be closed after their usefulness ends during a two-pass UPDATE. FossilOrigin-Name: 7def6c8edd85f19ee09038e01541f75b1f71ca39b9fb782b8f0fcac89207c353 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e366fd4b51..2e4ba44155 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverwrite\sthat\scould\soccur\swhen\srunning\san\sfts5\sprefix\squery\nagainst\sa\scorrupt\sdatabase. -D 2019-01-17T19:11:10.179 +C Add\sthe\sSQLITE_ENABLE_EARLY_CURSOR_CLOSE\scompile-time\soption\swhich\scauses\nread\scursors\sto\sbe\sclosed\safter\stheir\susefulness\sends\sduring\sa\stwo-pass\nUPDATE. +D 2019-01-17T19:33:16.502 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -598,7 +598,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 -F src/where.c dc293ea4230adf9a323fb2e5750eff565347567a3cd6538f7d0fa93b11c2baae +F src/where.c c5d201699d03be61c35bc04b96e481b1c8dc68177617ca1db156ef7409da2fae F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 @@ -1800,7 +1800,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 49956395e14b61f6bf839e59ae7dd95eb32ebf32f3d16388844de6621b9c2d98 -R ccdd711ece291779868bf4b998109e13 -U dan -Z 3e6c4473b6a0336dbaa6dadc398f3df8 +P 3910b5639d5c96d1840d4feeea64d3a55073531b7365a4e75d9cda6f119f3cfc +R b6dbc6b0d1ca56280f7f7c766f04179b +U drh +Z bba3575bd34040149ab6eabc06009268 diff --git a/manifest.uuid b/manifest.uuid index a197c3e10b..8cd49ad797 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3910b5639d5c96d1840d4feeea64d3a55073531b7365a4e75d9cda6f119f3cfc \ No newline at end of file +7def6c8edd85f19ee09038e01541f75b1f71ca39b9fb782b8f0fcac89207c353 \ No newline at end of file diff --git a/src/where.c b/src/where.c index bb9787fcee..8be95bcd29 100644 --- a/src/where.c +++ b/src/where.c @@ -5262,6 +5262,29 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } +#ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE + /* Close all of the cursors that were opened by sqlite3WhereBegin. + ** Except, do not close cursors that will be reused by the OR optimization + ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors + ** created for the ONEPASS optimization. + */ + if( (pTab->tabFlags & TF_Ephemeral)==0 + && pTab->pSelect==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + ){ + int ws = pLoop->wsFlags; + if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); + } + if( (ws & WHERE_INDEXED)!=0 + && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 + && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] + ){ + sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); + } + } +#endif + /* If this scan uses an index, make VDBE code substitutions to read data ** from the index instead of from the table where possible. In some cases ** this optimization prevents the table from ever being read, which can From 934d4f7bac2b43c7888dab130bdcf45ee302c535 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 17 Jan 2019 20:06:56 +0000 Subject: [PATCH 086/306] Fix another corruption related crash in fts5. FossilOrigin-Name: 4538d9afe4e6360e20c7b474e77314e5ad293453e1edbe356bf6ea84c05857ee --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5corrupt3.test | 220 ++++++++++++++++++++++++++++++++ manifest | 16 +-- manifest.uuid | 2 +- 4 files changed, 230 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 259ae3566b..66ab9be4df 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -1652,7 +1652,7 @@ static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){ int nNew; /* Bytes of new data */ iOff += fts5GetVarint32(&a[iOff], nNew); - if( iOff+nNew>pIter->pLeaf->nn || nKeep>pIter->term.n ){ + if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n ){ p->rc = FTS5_CORRUPT; return; } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index cf5aed1e5d..851b61186a 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -4269,6 +4269,226 @@ do_catchsql_test 35.1 { SELECT * FROM t1 WHERE t1 MATCH 'e*'; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 36.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-a6651222df1bd1.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 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........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 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 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 11 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: 80 80 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 00 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 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 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 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 14 2a 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 16 00 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 30 00 00 00 11 02 01 .........0...... +| 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 0e 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 13 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: 00 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 02 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 00 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 03 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 64 61 62 ............0dab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 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 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 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 08 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 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 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: 14 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 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 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 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 0c e9 ................ +| end crash-a6651222df1bd1.db +}]} {} + +do_catchsql_test 36.1 { + INSERT INTO t1(b) VALUES( + x'78de3fa24af3733ca8769291a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bfef346e6a'); +} {1 {database disk image is malformed}} + + + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 2e4ba44155..e34ee3cfcd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_ENABLE_EARLY_CURSOR_CLOSE\scompile-time\soption\swhich\scauses\nread\scursors\sto\sbe\sclosed\safter\stheir\susefulness\sends\sduring\sa\stwo-pass\nUPDATE. -D 2019-01-17T19:33:16.502 +C Fix\sanother\scorruption\srelated\scrash\sin\sfts5. +D 2019-01-17T20:06:56.273 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81e F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 21aec4818901e73563fdc787ed0fa3c3bc2cd6d58b93aae06aad2ffaec097e4a +F ext/fts5/fts5_index.c 53e064ad16036993ce9b2db77ba7e47f7a9a921b142091c268d5146caebd237a F ext/fts5/fts5_main.c 4a7ebaa5a23e932289355c05fbfc0f5b99d8d087e2f4c9e7b7a723c7b8ac9f02 F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test f9d02f7da0e638dc6b61f4efa4f6467090e6b5487ae80fce2ff3b4f7e3533123 +F ext/fts5/test/fts5corrupt3.test 806be09750de7a30714bda8be6f0cc59d9f8ff97ed5a58f8f9be1beb8d8ef896 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1800,7 +1800,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 3910b5639d5c96d1840d4feeea64d3a55073531b7365a4e75d9cda6f119f3cfc -R b6dbc6b0d1ca56280f7f7c766f04179b -U drh -Z bba3575bd34040149ab6eabc06009268 +P 7def6c8edd85f19ee09038e01541f75b1f71ca39b9fb782b8f0fcac89207c353 +R 0203f075a93c65b2c620f82ced420a7f +U dan +Z 61d202964eb5c45df93f88308f4c5ddc diff --git a/manifest.uuid b/manifest.uuid index 8cd49ad797..1a1ce01d87 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7def6c8edd85f19ee09038e01541f75b1f71ca39b9fb782b8f0fcac89207c353 \ No newline at end of file +4538d9afe4e6360e20c7b474e77314e5ad293453e1edbe356bf6ea84c05857ee \ No newline at end of file From 21908b2166875fcaf92b194c00719d9031da5fa6 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Jan 2019 20:19:35 +0000 Subject: [PATCH 087/306] Disable the xfer-optimization if the two tables have the same root page due to schema corruption. FossilOrigin-Name: f31b3bd2a6a8aa35a6454f37f3a4b4595e2ad74256cd180439019ab4c6c2059e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/insert.c | 3 ++- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e34ee3cfcd..26cc80d2fe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\scorruption\srelated\scrash\sin\sfts5. -D 2019-01-17T20:06:56.273 +C Disable\sthe\sxfer-optimization\sif\sthe\stwo\stables\shave\sthe\ssame\sroot\spage\ndue\sto\sschema\scorruption. +D 2019-01-17T20:19:35.692 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -474,7 +474,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c b9c5f7a390e9ef4b19b9a85820c15ecf5d065a935bae507a6305be61c18f4814 +F src/insert.c 3ed9ceaa4b7d56a6f2613355e1cd1ae5cfe31712bce2bf5aa93c5f1f130704b2 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 008f45dd39cdc7fb9e7e1f61d75a5c97397f8e07427a8879be23e27747d5f948 @@ -1800,7 +1800,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 7def6c8edd85f19ee09038e01541f75b1f71ca39b9fb782b8f0fcac89207c353 -R 0203f075a93c65b2c620f82ced420a7f -U dan -Z 61d202964eb5c45df93f88308f4c5ddc +P 4538d9afe4e6360e20c7b474e77314e5ad293453e1edbe356bf6ea84c05857ee +R 1c1e27e2357c56f2bb977a6efb879c84 +U drh +Z 0284d310ab1495a4ce2bbd9adcb7356d diff --git a/manifest.uuid b/manifest.uuid index 1a1ce01d87..926a1ab586 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4538d9afe4e6360e20c7b474e77314e5ad293453e1edbe356bf6ea84c05857ee \ No newline at end of file +f31b3bd2a6a8aa35a6454f37f3a4b4595e2ad74256cd180439019ab4c6c2059e \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 7301d87a1d..a69e625a11 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2208,7 +2208,8 @@ static int xferOptimization( if( pSrc==0 ){ return 0; /* FROM clause does not contain a real table */ } - if( pSrc==pDest ){ + if( pSrc->tnum==pDest->tnum && pSrc->pSchema==pDest->pSchema ){ + testcase( pSrc!=pDest ); /* Possible due to bad sqlite_master.rootpage */ return 0; /* tab1 and tab2 may not be the same table */ } if( HasRowid(pDest)!=HasRowid(pSrc) ){ From 3cb79202f8c55d2dd7f7f635244d7c841ab70ad4 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Jan 2019 14:53:15 +0000 Subject: [PATCH 088/306] Use the full 64-bit integer value in the argument to randomblob(). FossilOrigin-Name: 05df5f7aeaf2132810452e8871132d1e66650a841991cb2a9ce32f2d03e20bf4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/func.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 26cc80d2fe..14bcf53acd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sthe\sxfer-optimization\sif\sthe\stwo\stables\shave\sthe\ssame\sroot\spage\ndue\sto\sschema\scorruption. -D 2019-01-17T20:19:35.692 +C Use\sthe\sfull\s64-bit\sinteger\svalue\sin\sthe\sargument\sto\srandomblob(). +D 2019-01-18T14:53:15.315 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -468,7 +468,7 @@ F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c b660eb4d6d273946a8341efb9d38320ddceb9c2931d04478c74b85c35e053a5e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 -F src/func.c 6cf832abbc2815fdb46fee654df32a66ab77deb47bf4cff04a5774dafecd497a +F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 @@ -1800,7 +1800,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 4538d9afe4e6360e20c7b474e77314e5ad293453e1edbe356bf6ea84c05857ee -R 1c1e27e2357c56f2bb977a6efb879c84 +P f31b3bd2a6a8aa35a6454f37f3a4b4595e2ad74256cd180439019ab4c6c2059e +R 97498d3c71bde004a7d802e0afc968d0 U drh -Z 0284d310ab1495a4ce2bbd9adcb7356d +Z 04e8cef97e0ba118422a1f7fd8c6430e diff --git a/manifest.uuid b/manifest.uuid index 926a1ab586..99709bda97 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f31b3bd2a6a8aa35a6454f37f3a4b4595e2ad74256cd180439019ab4c6c2059e \ No newline at end of file +05df5f7aeaf2132810452e8871132d1e66650a841991cb2a9ce32f2d03e20bf4 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 11598a7adc..8b1d4416a4 100644 --- a/src/func.c +++ b/src/func.c @@ -514,11 +514,11 @@ static void randomBlob( int argc, sqlite3_value **argv ){ - int n; + sqlite3_int64 n; unsigned char *p; assert( argc==1 ); UNUSED_PARAMETER(argc); - n = sqlite3_value_int(argv[0]); + n = sqlite3_value_int64(argv[0]); if( n<1 ){ n = 1; } From 0e14e987069924a90bb20a466cc0c3314dbda822 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 18 Jan 2019 16:06:18 +0000 Subject: [PATCH 089/306] Fix a fairly obscure problem allowing an "ALTER TABLE RENAME col TO ..." statement to modify the schema in such a way as to break a reference within a trigger program. FossilOrigin-Name: 64bec9e6214c6932fab5a3fb8c569ae14cd2d603bd0f8b26104815c3bb9d396a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/alter.c | 3 ++- test/altertab2.test | 27 +++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 14bcf53acd..b33f791026 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sthe\sfull\s64-bit\sinteger\svalue\sin\sthe\sargument\sto\srandomblob(). -D 2019-01-18T14:53:15.315 +C Fix\sa\sfairly\sobscure\sproblem\sallowing\san\s"ALTER\sTABLE\sRENAME\scol\sTO\s..."\sstatement\sto\smodify\sthe\sschema\sin\ssuch\sa\sway\sas\sto\sbreak\sa\sreference\swithin\sa\strigger\sprogram. +D 2019-01-18T16:06:18.719 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -447,7 +447,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 8ac946d83b7888faf1707e4fdc9b37e61ec83325bb3d6b1a6d382d3287d0c8d8 +F src/alter.c cb691d6cd330312b7951c9d3bc0bc29804bbe80beac1cdd137d824b119b6f28a F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df @@ -621,7 +621,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a -F test/altertab2.test b80f1b4c1f8346326b9ba35ad741544c1a9610c82187e49b08f84b869d5f01db +F test/altertab2.test 67dd9806e7dafaea26f3b6fcaa4e909f690d6ac71373545577ece7f96a4ea817 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1800,7 +1800,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 f31b3bd2a6a8aa35a6454f37f3a4b4595e2ad74256cd180439019ab4c6c2059e -R 97498d3c71bde004a7d802e0afc968d0 -U drh -Z 04e8cef97e0ba118422a1f7fd8c6430e +P 05df5f7aeaf2132810452e8871132d1e66650a841991cb2a9ce32f2d03e20bf4 +R f8fd80d19fb63224c47a5c696f5a7a57 +U dan +Z 4f2ee8716e9e64841d044a5ee936a34b diff --git a/manifest.uuid b/manifest.uuid index 99709bda97..cfd314bede 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -05df5f7aeaf2132810452e8871132d1e66650a841991cb2a9ce32f2d03e20bf4 \ No newline at end of file +64bec9e6214c6932fab5a3fb8c569ae14cd2d603bd0f8b26104815c3bb9d396a \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 07fe6e757a..e186338587 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1081,7 +1081,6 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ Trigger *pNew = pParse->pNewTrigger; TriggerStep *pStep; NameContext sNC; - SrcList sSrc; int rc = SQLITE_OK; memset(&sNC, 0, sizeof(sNC)); @@ -1112,6 +1111,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ if( pTarget==0 ){ rc = SQLITE_ERROR; }else if( SQLITE_OK==(rc = sqlite3ViewGetColumnNames(pParse, pTarget)) ){ + SrcList sSrc; memset(&sSrc, 0, sizeof(sSrc)); sSrc.nSrc = 1; sSrc.a[0].zName = pStep->zTarget; @@ -1143,6 +1143,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ } sNC.ncFlags = 0; } + sNC.pSrcList = 0; } } } diff --git a/test/altertab2.test b/test/altertab2.test index 22995744a4..7a247d90e9 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -305,6 +305,33 @@ do_execsql_test 7.3 { END} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 8.0 { + CREATE TABLE t1(a, b, c); + CREATE TABLE t2(a, b, c); + CREATE TABLE t3(d, e, f); + CREATE VIEW v1 AS SELECT * FROM t1; + CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN + UPDATE t2 SET a = new.d; + SELECT a, b, c FROM v1; + END; +} + +do_execsql_test 8.1 { + INSERT INTO t3 VALUES(1, 2, 3); +} + +# The following ALTER TABLE fails as if column "t1.a" is renamed the "a" +# in the "SELECT a, b, c FROM v1" within the trigger can no longer be +# resolved. But at one point there was a bug allowing the ALTER TABLE +# succeed. Which meant the subsequent INSERT statement would fail. +do_catchsql_test 8.2 { + ALTER TABLE t1 RENAME a TO aaa; +} {1 {error in trigger tr after rename: no such column: a}} +do_execsql_test 8.3 { + INSERT INTO t3 VALUES(4, 5, 6); +} finish_test From e3b89d2c5ffbe633327c22bfd44ccf20197fe5a3 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Jan 2019 17:53:50 +0000 Subject: [PATCH 090/306] Handle oversize floating point values carefully when converting to integers for the '%' binary operator. FossilOrigin-Name: 048add13fc10e69ae504a49c4663612381d928b2cf1f9cdab4ff34bd40f601a3 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index b33f791026..98deb1f9cd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfairly\sobscure\sproblem\sallowing\san\s"ALTER\sTABLE\sRENAME\scol\sTO\s..."\sstatement\sto\smodify\sthe\sschema\sin\ssuch\sa\sway\sas\sto\sbreak\sa\sreference\swithin\sa\strigger\sprogram. -D 2019-01-18T16:06:18.719 +C Handle\soversize\sfloating\spoint\svalues\scarefully\swhen\sconverting\sto\sintegers\nfor\sthe\s'%'\sbinary\soperator. +D 2019-01-18T17:53:50.691 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -584,7 +584,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c 1919d490e97bfc59eab4d43444a53a6717d06137295ed684a25e5df7430d9974 +F src/vdbe.c 090d40c688b56b4602fb196a78e9d17213f381984258131c1e8f665636ca35ac F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1800,7 +1800,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 05df5f7aeaf2132810452e8871132d1e66650a841991cb2a9ce32f2d03e20bf4 -R f8fd80d19fb63224c47a5c696f5a7a57 -U dan -Z 4f2ee8716e9e64841d044a5ee936a34b +P 64bec9e6214c6932fab5a3fb8c569ae14cd2d603bd0f8b26104815c3bb9d396a +R 23c489a2ae8dd47d8c5f4c714346499a +U drh +Z de4950d4f9709c315a07de45d8efeea5 diff --git a/manifest.uuid b/manifest.uuid index cfd314bede..addd26dfcd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -64bec9e6214c6932fab5a3fb8c569ae14cd2d603bd0f8b26104815c3bb9d396a \ No newline at end of file +048add13fc10e69ae504a49c4663612381d928b2cf1f9cdab4ff34bd40f601a3 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 82ab91e0e2..2c2b0ee272 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1583,8 +1583,8 @@ fp_math: break; } default: { - iA = (i64)rA; - iB = (i64)rB; + iA = sqlite3VdbeIntValue(pIn1); + iB = sqlite3VdbeIntValue(pIn2); if( iA==0 ) goto arithmetic_result_is_null; if( iA==-1 ) iA = 1; rB = (double)(iB % iA); From ed968fa4cb464906e5b0f5148f1f21038a311728 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Jan 2019 18:52:17 +0000 Subject: [PATCH 091/306] Avoid integer overflow when computing the array of a bounding box with the rtree_i32 virtual table. FossilOrigin-Name: b352f1590d20a574b0681e011ececcf4f41fa5b157503d330e03939404aca0e9 --- ext/rtree/rtree.c | 10 +++++----- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index c998d9506a..73d06614f4 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1999,11 +1999,11 @@ static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ #endif { switch( pRtree->nDim ){ - case 5: area = p->aCoord[9].i - p->aCoord[8].i; - case 4: area *= p->aCoord[7].i - p->aCoord[6].i; - case 3: area *= p->aCoord[5].i - p->aCoord[4].i; - case 2: area *= p->aCoord[3].i - p->aCoord[2].i; - default: area *= p->aCoord[1].i - p->aCoord[0].i; + case 5: area = (i64)p->aCoord[9].i - (i64)p->aCoord[8].i; + case 4: area *= (i64)p->aCoord[7].i - (i64)p->aCoord[6].i; + case 3: area *= (i64)p->aCoord[5].i - (i64)p->aCoord[4].i; + case 2: area *= (i64)p->aCoord[3].i - (i64)p->aCoord[2].i; + default: area *= (i64)p->aCoord[1].i - (i64)p->aCoord[0].i; } } return area; diff --git a/manifest b/manifest index 98deb1f9cd..68493ce6fd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Handle\soversize\sfloating\spoint\svalues\scarefully\swhen\sconverting\sto\sintegers\nfor\sthe\s'%'\sbinary\soperator. -D 2019-01-18T17:53:50.691 +C Avoid\sinteger\soverflow\swhen\scomputing\sthe\sarray\sof\sa\sbounding\sbox\swith\nthe\srtree_i32\svirtual\stable. +D 2019-01-18T18:52:17.846 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -367,7 +367,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 603ec9b72cd70cf18541339b6c7d47f304ac0d84c50294be6c6c6ae35acdb0a6 -F ext/rtree/rtree.c 1e0fd7e850cadcfdf83cf6b59077c8a9ecfb79ad6af930b74edf88b456154ab2 +F ext/rtree/rtree.c 57729cc19f3832e5f9051556af44ed264b5bd54b01543cd7e50d5143817b964c F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 7573134f1b4f59df36c1b0a6de51268fd3b9c714d91f3811482263e734e416ea F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 @@ -1800,7 +1800,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 64bec9e6214c6932fab5a3fb8c569ae14cd2d603bd0f8b26104815c3bb9d396a -R 23c489a2ae8dd47d8c5f4c714346499a +P 048add13fc10e69ae504a49c4663612381d928b2cf1f9cdab4ff34bd40f601a3 +R e49ae49db0664dd0c8b772aad1d691d5 U drh -Z de4950d4f9709c315a07de45d8efeea5 +Z 4d9234620ea890ef5add226a9e9b7814 diff --git a/manifest.uuid b/manifest.uuid index addd26dfcd..348d378f01 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -048add13fc10e69ae504a49c4663612381d928b2cf1f9cdab4ff34bd40f601a3 \ No newline at end of file +b352f1590d20a574b0681e011ececcf4f41fa5b157503d330e03939404aca0e9 \ No newline at end of file From 451297752c90784f42e5d16b6ccd816fce4a3139 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 18 Jan 2019 19:26:48 +0000 Subject: [PATCH 092/306] Fix problems causing undefined left-shift operations in the fts3 snippet() function. FossilOrigin-Name: b90dbaed3092236e97f9796fa63989a3648060e16189e1267c430f4a7e799fac --- ext/fts3/fts3_snippet.c | 8 +++++++- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts3snippet.test | 5 +++++ 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 4ab60c1d80..58419536ae 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -433,7 +433,8 @@ static void fts3SnippetDetails( int j; u64 mPhrase = (u64)1 << i; u64 mPos = (u64)1 << (iCsr - iStart); - assert( iCsr>=iStart ); + assert( iCsr>=iStart && (iCsr - iStart)<=64 ); + assert( i>=0 && i<=64 ); if( (mCover|mCovered)&mPhrase ){ iScore++; }else{ @@ -660,6 +661,7 @@ static int fts3SnippetShift( for(nLeft=0; !(hlmask & ((u64)1 << nLeft)); nLeft++); for(nRight=0; !(hlmask & ((u64)1 << (nSnippet-1-nRight))); nRight++); + assert( (nSnippet-1-nRight)<=63 && (nSnippet-1-nRight)>=0 ); nDesired = (nLeft-nRight)/2; /* Ideally, the start of the snippet should be pushed forward in the @@ -1433,6 +1435,10 @@ void sqlite3Fts3Snippet( return; } + /* Limit the snippet length to 64 tokens. */ + if( nToken<-64 ) nToken = -64; + if( nToken>+64 ) nToken = +64; + for(nSnippet=1; 1; nSnippet++){ int iSnip; /* Loop counter 0..nSnippet-1 */ diff --git a/manifest b/manifest index 68493ce6fd..af8ade47d7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sinteger\soverflow\swhen\scomputing\sthe\sarray\sof\sa\sbounding\sbox\swith\nthe\srtree_i32\svirtual\stable. -D 2019-01-18T18:52:17.846 +C Fix\sproblems\scausing\sundefined\sleft-shift\soperations\sin\sthe\sfts3\ssnippet()\nfunction. +D 2019-01-18T19:26:48.918 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -89,7 +89,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 17af214e8b0a5b12ff4c4986767785aec824c5bf412612716cbfff5ed0d51327 +F ext/fts3/fts3_snippet.c 54ac8f4602924c0c57f933e60140ef243976382b80d7c0d8df5a924010803ef8 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c 79f2a7fbb3f672fa032e5a432ca274ea3ee93c34 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 @@ -945,7 +945,7 @@ F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba16 F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test 8cf586fe4b6878192602a81a665448aacbbad80ade0867bb5299d40e73584311 +F test/fts3snippet.test dace744104d1a44dc12dc9dd10b8d7542342df503d96942b7c4a55034e761789 F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d @@ -1800,7 +1800,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 048add13fc10e69ae504a49c4663612381d928b2cf1f9cdab4ff34bd40f601a3 -R e49ae49db0664dd0c8b772aad1d691d5 -U drh -Z 4d9234620ea890ef5add226a9e9b7814 +P b352f1590d20a574b0681e011ececcf4f41fa5b157503d330e03939404aca0e9 +R cf317d4e595abdb01b27661d8f9d1df1 +U dan +Z 1d119c13c18ffa9046c8d95a13a2ae82 diff --git a/manifest.uuid b/manifest.uuid index 348d378f01..8a56f6fdf9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b352f1590d20a574b0681e011ececcf4f41fa5b157503d330e03939404aca0e9 \ No newline at end of file +b90dbaed3092236e97f9796fa63989a3648060e16189e1267c430f4a7e799fac \ No newline at end of file diff --git a/test/fts3snippet.test b/test/fts3snippet.test index 4a0b7873d5..ebcdb8cffd 100644 --- a/test/fts3snippet.test +++ b/test/fts3snippet.test @@ -555,6 +555,11 @@ do_test 4.2 { }] } {64} +do_test 4.3 { + llength [db one { + SELECT snippet(t4, '', '', '', 0, 150) FROM t4 WHERE t4 MATCH 'E' + }] +} {64} From d00ad9a6561174ec7214af82e21b7a9a313ae156 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Jan 2019 19:33:56 +0000 Subject: [PATCH 093/306] Typecasts added to the GeoPoly extension to avoid harmless UBSAN warnings. FossilOrigin-Name: a1f6a093ac4a2de8c5b02c30fe57e09770460fd5bdddfe9c7a9a24fb83a6b491 --- ext/rtree/geopoly.c | 91 +++++++++++++++++++++++++-------------------- manifest | 14 +++---- manifest.uuid | 2 +- 3 files changed, 58 insertions(+), 49 deletions(-) diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index 3adbca7c24..d93eca2309 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -124,6 +124,14 @@ struct GeoPoly { */ #define GEOPOLY_SZ(N) (sizeof(GeoPoly) + sizeof(GeoCoord)*2*((N)-4)) +/* Macros to access coordinates of a GeoPoly. +** We have to use these macros, rather than just say p->a[i] in order +** to silence (incorrect) UBSAN warnings if the array index is too large. +*/ +#define GeoX(P,I) (((GeoCoord*)(P)->a)[(I)*2]) +#define GeoY(P,I) (((GeoCoord*)(P)->a)[(I)*2+1]) + + /* ** State of a parse of a GeoJSON input. */ @@ -316,8 +324,9 @@ static GeoPoly *geopolyFuncParam( memcpy(p->hdr, a, nByte); if( a[0] != *(unsigned char*)&x ){ int ii; - for(ii=0; iia[ii]); + for(ii=0; iihdr[0] ^= 1; } @@ -376,9 +385,9 @@ static void geopolyJsonFunc( int i; sqlite3_str_append(x, "[", 1); for(i=0; inVertex; i++){ - sqlite3_str_appendf(x, "[%!g,%!g],", p->a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "[%!g,%!g],", GeoX(p,i), GeoY(p,i)); } - sqlite3_str_appendf(x, "[%!g,%!g]]", p->a[0], p->a[1]); + sqlite3_str_appendf(x, "[%!g,%!g]]", GeoX(p,0), GeoY(p,0)); sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); sqlite3_free(p); } @@ -405,10 +414,10 @@ static void geopolySvgFunc( char cSep = '\''; sqlite3_str_appendf(x, "a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "%c%g,%g", cSep, GeoX(p,i), GeoY(p,i)); cSep = ' '; } - sqlite3_str_appendf(x, " %g,%g'", p->a[0], p->a[1]); + sqlite3_str_appendf(x, " %g,%g'", GeoX(p,0), GeoY(p,0)); for(i=1; inVertex; ii++){ - x0 = p->a[ii*2]; - y0 = p->a[ii*2+1]; + x0 = GeoX(p,ii); + y0 = GeoY(p,ii); x1 = (GeoCoord)(A*x0 + B*y0 + E); y1 = (GeoCoord)(C*x0 + D*y0 + F); - p->a[ii*2] = x1; - p->a[ii*2+1] = y1; + GeoX(p,ii) = x1; + GeoY(p,ii) = y1; } sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); @@ -477,12 +486,12 @@ static double geopolyArea(GeoPoly *p){ double rArea = 0.0; int ii; for(ii=0; iinVertex-1; ii++){ - rArea += (p->a[ii*2] - p->a[ii*2+2]) /* (x0 - x1) */ - * (p->a[ii*2+1] + p->a[ii*2+3]) /* (y0 + y1) */ + rArea += (GeoX(p,ii) - GeoX(p,ii+1)) /* (x0 - x1) */ + * (GeoY(p,ii) + GeoY(p,ii+1)) /* (y0 + y1) */ * 0.5; } - rArea += (p->a[ii*2] - p->a[0]) /* (xN - x0) */ - * (p->a[ii*2+1] + p->a[1]) /* (yN + y0) */ + rArea += (GeoX(p,ii) - GeoX(p,0)) /* (xN - x0) */ + * (GeoY(p,ii) + GeoY(p,0)) /* (yN + y0) */ * 0.5; return rArea; } @@ -529,13 +538,13 @@ static void geopolyCcwFunc( if( p ){ if( geopolyArea(p)<0.0 ){ int ii, jj; - for(ii=2, jj=p->nVertex*2 - 2; iia[ii]; - p->a[ii] = p->a[jj]; - p->a[jj] = t; - t = p->a[ii+1]; - p->a[ii+1] = p->a[jj+1]; - p->a[jj+1] = t; + for(ii=1, jj=p->nVertex-1; iihdr, @@ -595,8 +604,8 @@ static void geopolyRegularFunc( p->hdr[3] = n&0xff; for(i=0; ia[i*2] = x - r*geopolySine(rAngle-0.5*GEOPOLY_PI); - p->a[i*2+1] = y + r*geopolySine(rAngle); + GeoX(p,i) = x - r*geopolySine(rAngle-0.5*GEOPOLY_PI); + GeoY(p,i) = y + r*geopolySine(rAngle); } sqlite3_result_blob(context, p->hdr, 4+8*n, SQLITE_TRANSIENT); sqlite3_free(p); @@ -633,13 +642,13 @@ static GeoPoly *geopolyBBox( } if( p ){ int ii; - mnX = mxX = p->a[0]; - mnY = mxY = p->a[1]; + mnX = mxX = GeoX(p,0); + mnY = mxY = GeoY(p,0); for(ii=1; iinVertex; ii++){ - double r = p->a[ii*2]; + double r = GeoX(p,ii); if( rmxX ) mxX = (float)r; - r = p->a[ii*2+1]; + r = GeoY(p,ii); if( rmxY ) mxY = (float)r; } @@ -659,14 +668,14 @@ static GeoPoly *geopolyBBox( pOut->hdr[1] = 0; pOut->hdr[2] = 0; pOut->hdr[3] = 4; - pOut->a[0] = mnX; - pOut->a[1] = mnY; - pOut->a[2] = mxX; - pOut->a[3] = mnY; - pOut->a[4] = mxX; - pOut->a[5] = mxY; - pOut->a[6] = mnX; - pOut->a[7] = mxY; + GeoX(pOut,0) = mnX; + GeoY(pOut,0) = mnY; + GeoX(pOut,1) = mxX; + GeoY(pOut,1) = mnY; + GeoX(pOut,2) = mxX; + GeoY(pOut,2) = mxY; + GeoX(pOut,3) = mnX; + GeoY(pOut,3) = mxY; }else{ sqlite3_free(p); aCoord[0].f = mnX; @@ -804,14 +813,14 @@ static void geopolyContainsPointFunc( int ii; if( p1==0 ) return; for(ii=0; iinVertex-1; ii++){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[ii*2+2],p1->a[ii*2+3]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,ii+1),GeoY(p1,ii+1)); if( v==2 ) break; cnt += v; } if( v!=2 ){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[0],p1->a[1]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,0), GeoY(p1,0)); } if( v==2 ){ sqlite3_result_int(context, 1); @@ -933,10 +942,10 @@ static void geopolyAddSegments( unsigned int i; GeoCoord *x; for(i=0; i<(unsigned)pPoly->nVertex-1; i++){ - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], x[2], x[3], side, i); } - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], pPoly->a[0], pPoly->a[1], side, i); } diff --git a/manifest b/manifest index af8ade47d7..0cf7d7a966 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\scausing\sundefined\sleft-shift\soperations\sin\sthe\sfts3\ssnippet()\nfunction. -D 2019-01-18T19:26:48.918 +C Typecasts\sadded\sto\sthe\sGeoPoly\sextension\sto\savoid\sharmless\sUBSAN\swarnings. +D 2019-01-18T19:33:56.463 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -366,7 +366,7 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782 F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c 603ec9b72cd70cf18541339b6c7d47f304ac0d84c50294be6c6c6ae35acdb0a6 +F ext/rtree/geopoly.c 061432bddc38c4c10c7e4ce940d581c886d65bb5814b4b65b46ad046aa85eaa2 F ext/rtree/rtree.c 57729cc19f3832e5f9051556af44ed264b5bd54b01543cd7e50d5143817b964c F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 7573134f1b4f59df36c1b0a6de51268fd3b9c714d91f3811482263e734e416ea @@ -1800,7 +1800,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 b352f1590d20a574b0681e011ececcf4f41fa5b157503d330e03939404aca0e9 -R cf317d4e595abdb01b27661d8f9d1df1 -U dan -Z 1d119c13c18ffa9046c8d95a13a2ae82 +P b90dbaed3092236e97f9796fa63989a3648060e16189e1267c430f4a7e799fac +R 38e7ed21c3ba7e18d21fd38b5b228c8f +U drh +Z 71c939a2336f695a4bb7bcd852576d14 diff --git a/manifest.uuid b/manifest.uuid index 8a56f6fdf9..2ebe496726 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b90dbaed3092236e97f9796fa63989a3648060e16189e1267c430f4a7e799fac \ No newline at end of file +a1f6a093ac4a2de8c5b02c30fe57e09770460fd5bdddfe9c7a9a24fb83a6b491 \ No newline at end of file From 4c1c79035f6089340b194ae4fa81111245501de9 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 18 Jan 2019 20:15:02 +0000 Subject: [PATCH 094/306] Avoid passing a NULL pointer to memcpy in fts5, even if the database is corrupt. FossilOrigin-Name: acccc9808f52009b2c7794770c8b7efe2ce861fa184d32e287e7114c74e2b522 --- ext/fts5/fts5_vocab.c | 5 +- ext/fts5/test/fts5corrupt3.test | 153 ++++++++++++++++++++++++++++++++ manifest | 16 ++-- manifest.uuid | 2 +- 4 files changed, 166 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_vocab.c b/ext/fts5/fts5_vocab.c index 4c597b0e1e..d2006ad69a 100644 --- a/ext/fts5/fts5_vocab.c +++ b/ext/fts5/fts5_vocab.c @@ -560,7 +560,10 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK ){ zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); - if( nTerm!=pCsr->term.n || memcmp(zTerm, pCsr->term.p, nTerm) ){ + assert_nc( nTerm>0 ); + if( nTerm!=pCsr->term.n + || (nTerm>0 && memcmp(zTerm, pCsr->term.p, nTerm)) + ){ break; } if( sqlite3Fts5IterEof(pCsr->pIter) ) break; diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 851b61186a..58055bddb8 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -4486,6 +4486,159 @@ do_catchsql_test 36.1 { x'78de3fa24af3733ca8769291a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bfef346e6a'); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 37.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename null-memcmp-param-1..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 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 66 74 34 74 34 43 .....utablft4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 64 44 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G dDs5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 01 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 5a 02 01 01 62 01 .t.....0a.Z...b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 02 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 04 ..h.......i..... +| 4064: 04 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 30 69 .a b cd e fg h0i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end null-memcmp-param-1..db +}]} {} + +do_catchsql_test 37.1 { + SELECT * FROM t3; +} {1 {database disk image is malformed}} + diff --git a/manifest b/manifest index 0cf7d7a966..b269ee1451 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Typecasts\sadded\sto\sthe\sGeoPoly\sextension\sto\savoid\sharmless\sUBSAN\swarnings. -D 2019-01-18T19:33:56.463 +C Avoid\spassing\sa\sNULL\spointer\sto\smemcpy\sin\sfts5,\seven\sif\sthe\sdatabase\sis\scorrupt. +D 2019-01-18T20:15:02.171 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -124,7 +124,7 @@ F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3 F ext/fts5/fts5_tokenize.c 4d904c237707de8fbb8ab98d24d5c55d47204a3f1f35895d8a53a5327079b32c F ext/fts5/fts5_unicode2.c d8a1528c9a19f79b843c486e5e64bff17d667791ae7f658e11131ebac4b33c59 F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 132fcaf09cab683f1b118836fe3c2224e2b1d7407f303afb67a19995df112604 +F ext/fts5/fts5_vocab.c 359bb80c12df798d68f95ccad8b93c1bd94dd89ff57b78802de8bceac2856db2 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 806be09750de7a30714bda8be6f0cc59d9f8ff97ed5a58f8f9be1beb8d8ef896 +F ext/fts5/test/fts5corrupt3.test ee4d73da5fbbbc7f51c3a5c98234097631d5a388e0bffb81922a0c31cc59afe9 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1800,7 +1800,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 b90dbaed3092236e97f9796fa63989a3648060e16189e1267c430f4a7e799fac -R 38e7ed21c3ba7e18d21fd38b5b228c8f -U drh -Z 71c939a2336f695a4bb7bcd852576d14 +P a1f6a093ac4a2de8c5b02c30fe57e09770460fd5bdddfe9c7a9a24fb83a6b491 +R 67ecb637d41eb7fd795e5d068af3d1c6 +U dan +Z 09faca79923bb204f29912e39af0f85d diff --git a/manifest.uuid b/manifest.uuid index 2ebe496726..4da3c4807b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1f6a093ac4a2de8c5b02c30fe57e09770460fd5bdddfe9c7a9a24fb83a6b491 \ No newline at end of file +acccc9808f52009b2c7794770c8b7efe2ce861fa184d32e287e7114c74e2b522 \ No newline at end of file From a86b20820de16a8ca370e597217987f484376d51 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 18 Jan 2019 21:03:15 +0000 Subject: [PATCH 095/306] Fix an infinite loop caused by a corrupt database in fts3. Also an undefined left-shift in fts5. FossilOrigin-Name: 55c5d72af9510e2f27c33544d804a58d4282b0efb384ead38484129ce91b574f --- ext/fts3/fts3.c | 19 ++- ext/fts5/fts5_buffer.c | 2 +- ext/fts5/test/fts5corrupt3.test | 12 ++ manifest | 18 +- manifest.uuid | 2 +- test/fts3corrupt4.test | 288 ++++++++++++++++++++++++++++++++ 6 files changed, 325 insertions(+), 16 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index fc533af5bd..4e6186ee64 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2135,7 +2135,7 @@ static int fts3PutColNumber(char **pp, int iCol){ ** updated appropriately. The caller is responsible for insuring ** that there is enough space in *pp to hold the complete output. */ -static void fts3PoslistMerge( +static int fts3PoslistMerge( char **pp, /* Output buffer */ char **pp1, /* Left input list */ char **pp2 /* Right input list */ @@ -2148,11 +2148,17 @@ static void fts3PoslistMerge( int iCol1; /* The current column index in pp1 */ int iCol2; /* The current column index in pp2 */ - if( *p1==POS_COLUMN ) fts3GetVarint32(&p1[1], &iCol1); + if( *p1==POS_COLUMN ){ + fts3GetVarint32(&p1[1], &iCol1); + if( iCol1==0 ) return FTS_CORRUPT_VTAB; + } else if( *p1==POS_END ) iCol1 = POSITION_LIST_END; else iCol1 = 0; - if( *p2==POS_COLUMN ) fts3GetVarint32(&p2[1], &iCol2); + if( *p2==POS_COLUMN ){ + fts3GetVarint32(&p2[1], &iCol2); + if( iCol2==0 ) return FTS_CORRUPT_VTAB; + } else if( *p2==POS_END ) iCol2 = POSITION_LIST_END; else iCol2 = 0; @@ -2200,6 +2206,7 @@ static void fts3PoslistMerge( *pp = p; *pp1 = p1 + 1; *pp2 = p2 + 1; + return SQLITE_OK; } /* @@ -2492,6 +2499,7 @@ static int fts3DoclistOrMerge( char *a2, int n2, /* Second doclist */ char **paOut, int *pnOut /* OUT: Malloc'd doclist */ ){ + int rc = SQLITE_OK; sqlite3_int64 i1 = 0; sqlite3_int64 i2 = 0; sqlite3_int64 iPrev = 0; @@ -2546,7 +2554,8 @@ static int fts3DoclistOrMerge( if( p2 && p1 && iDiff==0 ){ fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1); - fts3PoslistMerge(&p, &p1, &p2); + rc = fts3PoslistMerge(&p, &p1, &p2); + if( rc ) break; fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1); fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2); }else if( !p2 || (p1 && iDiff<0) ){ @@ -2563,7 +2572,7 @@ static int fts3DoclistOrMerge( *paOut = aOut; *pnOut = (int)(p-aOut); assert( *pnOut<=n1+n2+FTS3_VARINT_MAX-1 ); - return SQLITE_OK; + return rc; } /* diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index 3cb307a55d..90d9f20336 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -52,7 +52,7 @@ void sqlite3Fts5Put32(u8 *aBuf, int iVal){ } int sqlite3Fts5Get32(const u8 *aBuf){ - return (aBuf[0] << 24) + (aBuf[1] << 16) + (aBuf[2] << 8) + aBuf[3]; + return (int)((((u32)aBuf[0])<<24) + (aBuf[1]<<16) + (aBuf[2]<<8) + aBuf[3]); } /* diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 58055bddb8..0be321b33f 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -4639,6 +4639,18 @@ do_catchsql_test 37.1 { SELECT * FROM t3; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 37.0 { + CREATE VIRTUAL TABLE t1 USING fts5(b, c); + INSERT INTO t1 VALUES('a', 'b'); + SELECT quote(block) FROM t1_data WHERE rowid=10; +} {X'000000000101010001010101'} + +do_execsql_test 37.1 { + UPDATE t1_data SET block = X'FFFFFFFF0101010001010101' WHERE rowid = 10; + SELECT rowid FROM t1('a'); +} {1} diff --git a/manifest b/manifest index b269ee1451..f871155605 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\spassing\sa\sNULL\spointer\sto\smemcpy\sin\sfts5,\seven\sif\sthe\sdatabase\sis\scorrupt. -D 2019-01-18T20:15:02.171 +C Fix\san\sinfinite\sloop\scaused\sby\sa\scorrupt\sdatabase\sin\sfts3.\sAlso\san\sundefined\nleft-shift\sin\sfts5. +D 2019-01-18T21:03:15.103 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 230bfe6509b576c7a82e23e3775fe030586ef5f2135d1b556a99c4c224dee1f0 +F ext/fts3/fts3.c ec300b0af6989840c624976969bdfabdb252df517d743c8ca19cef3cd0cbc1ce F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 6c666f314caaeb8fe8e4c1a2d84f8b34406647429a43e8f475b0b0074ad41861 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b @@ -111,7 +111,7 @@ F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 4f5d19b7973dae23de368728f06d3eb1fe9f5cca2990366b40e9379996f35e61 F ext/fts5/fts5Int.h 28a99786582ef2a49db6be8eead420ad4d16fbb6635560ded2455628686a1ba9 F ext/fts5/fts5_aux.c 4353df5d71a8f84ae94ed9c5c9199d1594b8efc9476c4d617fbd8db8b291e3a7 -F ext/fts5/fts5_buffer.c 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81ef59da7a59 +F ext/fts5/fts5_buffer.c 61f48c4921461dcd3b101eadf2c9e5641dbe7e6470bc60252bee2e42e70ef638 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test ee4d73da5fbbbc7f51c3a5c98234097631d5a388e0bffb81922a0c31cc59afe9 +F ext/fts5/test/fts5corrupt3.test 44c0cb3cd7f5c272f299bcd900f270885148181f9148cdfe302e96b6d94b69c3 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -916,7 +916,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 6be332f78efc460b33dd4a216595f33a9a47f7267b246814a56eff3124752024 +F test/fts3corrupt4.test cea5a082ed539a17f5898d490ed4fddec98974bb8efa69ad43feacc5461266a6 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1800,7 +1800,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 a1f6a093ac4a2de8c5b02c30fe57e09770460fd5bdddfe9c7a9a24fb83a6b491 -R 67ecb637d41eb7fd795e5d068af3d1c6 +P acccc9808f52009b2c7794770c8b7efe2ce861fa184d32e287e7114c74e2b522 +R b6df85dc9f6904cfafdd0878423404f3 U dan -Z 09faca79923bb204f29912e39af0f85d +Z 02967187b0cc842cc3b4f78d29f768f7 diff --git a/manifest.uuid b/manifest.uuid index 4da3c4807b..50a9d74473 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -acccc9808f52009b2c7794770c8b7efe2ce861fa184d32e287e7114c74e2b522 \ No newline at end of file +55c5d72af9510e2f27c33544d804a58d4282b0efb384ead38484129ce91b574f \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 7ce8aeb95b..239fe9dda3 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -1433,6 +1433,294 @@ do_catchsql_test 11.1 { SELECT rowid, quote(matchinfo(t1,'pcxybs')) FROM t1 WHERE t1 MATCH 'e*' } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 12.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c81b.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 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ..08...........! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 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 62 2c 72 6f 6f 74 ock INTEGEb,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 67 64 69 72 egdir_1t1_segdir +| 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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 39 00 00 00 00 00 (a,b,c)...9..... +| 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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 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 46 4e 41 ABLE GEOPOLY FNA +| 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 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 0f 25 READSAFE=0.$...% +| 3088: 19 58 54 48 52 45 41 44 53 41 46 45 3d 30 42 49 .XTHREADSAFE=0BI +| 3104: 4e 41 52 59 18 23 05 00 0f 25 19 58 54 48 52 45 NARY.#...%.XTHRE +| 3120: 41 44 53 41 46 45 3d 30 4e 4f 43 41 53 45 17 22 ADSAFE=0NOCASE.. +| 3136: 05 00 0f 25 17 58 54 48 52 45 41 44 53 41 46 45 ...%.XTHREADSAFE +| 3152: 3d 30 52 54 52 49 4d 1f 21 05 00 0f 33 19 58 4f =0RTRIM.!...3.XO +| 3168: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3184: 4f 4e 42 49 4e 41 52 59 1f 20 05 00 0f 33 19 58 ONBINARY. ...3.X +| 3200: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3216: 49 4f 4e 4e 4f 43 41 53 45 1e 1f 05 00 0f 33 17 IONNOCASE.....3. +| 3232: 58 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e XOMIT LOAD EXTEN +| 3248: 53 49 4f 4e 52 54 52 49 4d 1f 1e 05 00 0f 33 19 SIONRTRIM.....3. +| 3264: 58 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 XMAX MEMORY=5000 +| 3280: 30 30 30 30 42 49 4e 41 52 59 1f 1d 05 00 0f 33 0000BINARY.....3 +| 3296: 19 58 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 .XMAX MEMORY=500 +| 3312: 30 30 30 30 30 4e 4f 43 41 53 45 1e 1c 05 00 0f 00000NOCASE..... +| 3328: 33 17 58 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 3.XMAX MEMORY=50 +| 3344: 30 30 30 30 30 30 52 54 52 49 4d 18 1b 05 00 0f 000000RTRIM..... +| 3360: 25 19 58 45 4e 41 42 4c 45 20 52 54 52 45 45 42 %.XENABLE RTREEB +| 3376: 49 4e 41 52 59 18 1a 05 00 0f 25 19 58 45 4e 41 INARY.....%.XENA +| 3392: 42 4c 45 20 52 54 52 45 45 4e 4f 43 41 53 45 17 BLE RTREENOCASE. +| 3408: 19 05 00 0f 25 17 58 45 4e 41 42 4c 45 20 52 54 ....%.XENABLE RT +| 3424: 52 45 45 52 54 52 49 4d 1a 18 05 00 0f 29 19 58 REERTRIM.....).X +| 3440: 45 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 42 49 ENABLE MEMSYS5BI +| 3456: 4e 41 52 59 1a 17 05 00 0f 29 19 58 45 4e 41 42 NARY.....).XENAB +| 3472: 4c 45 20 4d 45 4d 53 59 53 35 4e 4f 43 41 53 45 LE MEMSYS5NOCASE +| 3488: 19 16 05 00 0f 29 17 58 45 4e 41 42 4c 45 20 4d .....).XENABLE M +| 3504: 45 4d 53 59 53 35 52 54 52 49 4d 18 15 05 00 0f EMSYS5RTRIM..... +| 3520: 25 19 58 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 42 %.XENABLE JSON1B +| 3536: 49 4e 41 52 59 18 14 05 00 0f 25 19 58 45 4e 41 INARY.....%.XENA +| 3552: 42 4c 45 20 4a 53 4f 4e 31 4e 4f 43 41 53 45 17 BLE JSON1NOCASE. +| 3568: 13 05 00 0f 25 17 58 45 4e 41 42 4c 45 20 4a 53 ....%.XENABLE JS +| 3584: 4f 4e 31 52 54 52 49 4d 1a 12 05 00 0f 29 19 58 ON1RTRIM.....).X +| 3600: 45 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 42 49 ENABLE GEOPOLYBI +| 3616: 4e 41 52 59 1a 11 05 00 0f 29 19 58 45 4e 41 1e NARY.....).XENA. +| 3632: 4c 45 20 47 45 4f 50 4f 4c 59 4e 4f 43 41 53 45 LE GEOPOLYNOCASE +| 3648: 19 10 05 00 0f 29 17 58 45 4e 41 42 4c 45 20 47 .....).XENABLE G +| 3664: 45 4f 50 4f 4c 59 52 54 52 49 4d 17 0f 05 00 0f EOPOLYRTRIM..... +| 3680: 23 19 58 45 4e 41 42 4c 45 20 46 54 53 35 42 49 #.XENABLE FTS5BI +| 3696: 4e 41 52 59 17 0e 05 00 0f 23 19 58 55 4e 41 42 NARY.....#.XUNAB +| 3712: 4c 45 20 46 54 53 35 4e 4f 43 41 53 45 16 0d 05 LE FTS5NOCASE... +| 3728: 00 0f 23 17 58 45 4e 41 42 4c 45 20 46 54 53 35 ..#.XENABLE FTS5 +| 3744: 52 54 52 49 4d 17 0c 05 00 0f 23 19 58 45 4e 41 RTRIM.....#.XENA +| 3760: 42 4c 45 20 46 54 53 34 42 49 4e 41 52 59 17 0b BLE FTS4BINARY.. +| 3776: 05 00 0f 23 19 58 45 4e 41 42 4c 45 20 46 54 53 ...#.XENABLE FTS +| 3792: 35 4e 4f 43 40 53 45 16 0a 05 00 0f 23 17 58 45 5NOC@SE.....#.XE +| 3808: 4e 41 42 4c 45 20 46 54 53 34 52 54 52 49 4d 1e NABLE FTS4RTRIM. +| 3824: 09 05 00 0f 31 19 58 45 4e 41 42 4c 35 20 44 42 ....1.XENABL5 DB +| 3840: 53 54 41 54 20 56 54 41 42 42 49 4e 41 52 59 1e STAT VTABBINARY. +| 3856: 08 05 00 0f 31 19 58 45 4e 41 42 4c 45 20 44 42 ....1.XENABLE DB +| 3872: 53 54 41 54 20 56 54 41 42 4e 4f 43 41 53 45 1d STAT VTABNOCASE. +| 3888: 07 05 00 0f 31 17 58 45 4e 41 42 4c 45 20 44 42 ....1.XENABLE DB +| 3904: 53 54 41 54 20 56 54 41 42 52 54 52 49 4d 11 06 STAT VTABRTRIM.. +| 3920: 05 00 0f 17 19 58 44 45 42 55 47 42 49 4e 41 52 .....XDEBUGBINAR +| 3936: 59 11 05 05 00 0f 17 19 58 44 45 42 55 47 4e 4f Y.......XDEBUGNO +| 3952: 43 41 53 45 10 04 05 00 0f 17 17 58 44 45 42 55 CASE.......XDEBU +| 3968: 47 52 54 52 49 4d 27 03 05 00 0f 43 19 58 43 4f GRTRIM'....C.XCO +| 3984: 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 MPILER=gcc-5.4.0 +| 4000: 20 32 30 31 36 30 36 30 39 42 49 4e 41 52 59 27 20160609BINARY' +| 4016: 02 05 00 0f 43 19 58 43 4f 4d 50 49 4c 45 52 3d ....C.XCOMPILER= +| 4032: 67 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 gcc-5.4.0 201606 +| 4048: 30 39 4e 4f 43 41 53 45 26 01 05 00 0f 43 17 58 09NOCASE&....C.X +| 4064: 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 COMPILER=gcc-5.4 +| 4080: 2e 30 20 32 30 31 36 30 36 30 39 52 54 52 49 4d .0 20160609RTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 03 07 bb 00 0c ad 0b a0 07 bb 00 00 ................ +| 1968: 00 00 00 00 00 00 00 00 00 00 00 87 62 03 08 08 ............b... +| 1984: 01 08 08 17 8f 34 02 30 20 39 38 30 00 01 30 1e .....4.0 980..0. +| 2000: 01 01 01 06 00 01 01 01 06 00 01 01 01 06 00 1f ................ +| 2016: 01 01 03 00 01 01 01 03 00 01 01 01 03 00 00 08 ................ +| 2032: 32 30 31 36 30 36 30 39 0f 01 01 01 07 00 01 01 20160609........ +| 2048: 01 07 00 01 01 01 07 00 00 01 34 0f 01 01 01 05 ..........4..... +| 2064: 00 01 01 01 05 00 01 01 01 05 00 00 01 35 0f 01 .............5.. +| 2080: 01 01 04 00 01 01 01 04 00 01 01 01 04 00 01 07 ................ +| 2096: 30 30 30 30 30 30 30 0f 1c 01 01 04 00 01 01 01 0000000......... +| 2112: 04 00 01 01 01 04 00 00 06 62 69 6e 61 72 79 3c .........binary< +| 2128: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 2144: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 2160: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 2176: 02 00 03 01 02 02 00 03 01 02 02 00 00 08 63 6f ..............co +| 2192: 6d 70 69 6c 65 72 0f 01 01 01 02 00 01 01 01 02 mpiler.......... +| 2208: 00 01 01 01 02 00 00 06 64 62 73 74 61 74 0f 07 ........dbstat.. +| 2224: 01 01 03 00 01 01 01 03 00 01 01 01 03 00 01 04 ................ +| 2240: 65 62 75 67 0f 04 01 01 02 00 01 01 01 02 00 01 ebug............ +| 2256: 01 01 02 00 00 03 65 6e 61 05 11 01 01 02 00 03 ......ena....... +| 2272: 03 62 6c 35 05 09 01 01 02 00 05 01 65 5a 07 01 .bl5........eZ.. +| 2288: 01 02 00 01 01 01 02 00 02 01 01 02 00 01 01 01 ................ +| 2304: 02 00 01 01 01 02 00 01 01 01 02 00 02 01 01 02 ................ +| 2320: 00 01 01 01 02 00 02 01 01 02 00 01 01 01 02 00 ................ +| 2336: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 2352: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 2368: 01 02 00 01 01 01 02 00 01 08 78 74 65 6e 73 69 ..........xtensi +| 2384: 6f 6e 0f 1f 01 01 04 00 01 01 01 04 00 01 01 01 on.............. +| 2400: 04 00 00 04 66 74 73 34 0a 0a 01 01 03 00 02 01 ....fts4........ +| 2416: 01 03 00 03 01 35 14 0b 01 01 03 00 02 01 01 03 .....5.......... +| 2432: 00 01 01 01 03 00 01 01 01 03 00 00 03 67 63 63 .............gcc +| 2448: 0f 01 01 01 03 00 01 01 01 03 00 01 01 01 03 00 ................ +| 2464: 01 06 65 6f 70 6f 6c 79 0f 10 01 01 03 00 01 01 ..eopoly........ +| 2480: 01 04 00 01 01 01 03 00 00 05 6a 73 6f 6e 31 0f ..........json1. +| 2496: 13 01 01 03 00 01 01 01 03 00 01 01 01 03 00 00 ................ +| 2512: 02 6c 65 05 11 01 01 03 00 01 03 6f 61 64 0f 1f .le........oad.. +| 2528: 01 01 03 00 01 01 01 03 00 01 01 01 03 00 00 03 ................ +| 2544: 6d 61 78 0f 1c 01 01 02 00 01 01 01 02 00 01 01 max............. +| 2560: 01 02 00 01 05 65 6d 6f 72 79 0f 1c 01 01 03 00 .....emory...... +| 2576: 01 01 01 03 00 01 01 01 03 00 03 04 73 79 73 35 ............sys5 +| 2592: 0f 16 01 01 03 00 01 01 01 03 00 01 01 01 03 00 ................ +| 2608: 00 03 6e 6f 63 05 0b 01 02 02 00 03 03 61 73 65 ..noc........ase +| 2624: 37 02 01 02 02 00 03 01 02 02 00 03 01 02 02 00 7............... +| 2640: 06 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 2656: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 2672: 02 02 00 03 01 02 02 00 00 04 6f 6d 69 74 0f 1f ..........omit.. +| 2688: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 00 05 ................ +| 2704: 72 74 72 65 65 0f 19 01 01 03 00 01 01 01 03 00 rtree........... +| 2720: 01 01 01 03 00 03 02 69 6d 3c 01 01 02 02 00 03 .......im<...... +| 2736: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 2752: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 2768: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 2784: 00 03 01 02 02 00 00 02 73 65 05 0b 01 02 03 00 ........se...... +| 2800: 00 0a 74 68 72 65 61 64 73 61 66 65 0f 22 01 01 ..threadsafe.... +| 2816: 02 00 01 01 01 02 00 01 01 01 02 00 00 06 75 6e ..............un +| 2832: 61 62 6c 65 05 0e 01 01 02 00 00 04 76 74 61 62 able........vtab +| 2848: 0f 07 01 01 04 00 01 01 01 04 00 01 01 01 04 00 ................ +| 2864: 00 01 78 6c 01 02 00 01 02 00 01 02 00 01 02 00 ..xl............ +| 2880: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 2896: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 2912: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 2928: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 2944: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 2960: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 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: 11 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 00 f6 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 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: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 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 03 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 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 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 02 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 03 0f ee 00 0f fb 0f f5 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06 04 ................ +| 4080: 08 01 01 02 03 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 e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 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 0c f4 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 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end c81b.db +}]} {} + +do_catchsql_test 12.1 { + SELECT rowid, quote(matchinfo(t1,'pcxybspcxybs')) + FROM t1 WHERE t1 MATCH 'e*e*' +} {1 {database disk image is malformed}} finish_test From 6e0a75a2b8867e0597377d6a11b064b5d27b3a88 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 18 Jan 2019 21:12:32 +0000 Subject: [PATCH 096/306] Fix a crash in the fts5vocab module caused by including a "term < NULL" term in a WHERE clause. FossilOrigin-Name: 9e717c4377c0116a5d36815fbc30f8b8803f14770d30be361feb27cc5b5b537b --- ext/fts5/fts5_vocab.c | 2 +- ext/fts5/test/fts5vocab.test | 19 +++++++++++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_vocab.c b/ext/fts5/fts5_vocab.c index d2006ad69a..bfb6821280 100644 --- a/ext/fts5/fts5_vocab.c +++ b/ext/fts5/fts5_vocab.c @@ -560,7 +560,6 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK ){ zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); - assert_nc( nTerm>0 ); if( nTerm!=pCsr->term.n || (nTerm>0 && memcmp(zTerm, pCsr->term.p, nTerm)) ){ @@ -621,6 +620,7 @@ static int fts5VocabFilterMethod( } if( pLe ){ const char *zCopy = (const char *)sqlite3_value_text(pLe); + if( zCopy==0 ) zCopy = ""; pCsr->nLeTerm = sqlite3_value_bytes(pLe); pCsr->zLeTerm = sqlite3_malloc(pCsr->nLeTerm+1); if( pCsr->zLeTerm==0 ){ diff --git a/ext/fts5/test/fts5vocab.test b/ext/fts5/test/fts5vocab.test index 4281259c01..a1bf2a4ede 100644 --- a/ext/fts5/test/fts5vocab.test +++ b/ext/fts5/test/fts5vocab.test @@ -523,5 +523,24 @@ do_test 10.6 { set res } {3 5 7} +do_execsql_test 10.6.1 { + SELECT * FROM t2 WHERE termNULL; +} +do_execsql_test 10.6.3 { + SELECT * FROM t2 WHERE term=NULL; +} +do_execsql_test 10.7.1 { + SELECT * FROM t2 WHERE term?; +} +do_execsql_test 10.7.3 { + SELECT * FROM t2 WHERE term=?; +} + finish_test diff --git a/manifest b/manifest index f871155605..4a58150d2e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sinfinite\sloop\scaused\sby\sa\scorrupt\sdatabase\sin\sfts3.\sAlso\san\sundefined\nleft-shift\sin\sfts5. -D 2019-01-18T21:03:15.103 +C Fix\sa\scrash\sin\sthe\sfts5vocab\smodule\scaused\sby\sincluding\sa\s"term\s<\sNULL"\sterm\nin\sa\sWHERE\sclause. +D 2019-01-18T21:12:32.602 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -124,7 +124,7 @@ F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3 F ext/fts5/fts5_tokenize.c 4d904c237707de8fbb8ab98d24d5c55d47204a3f1f35895d8a53a5327079b32c F ext/fts5/fts5_unicode2.c d8a1528c9a19f79b843c486e5e64bff17d667791ae7f658e11131ebac4b33c59 F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 359bb80c12df798d68f95ccad8b93c1bd94dd89ff57b78802de8bceac2856db2 +F ext/fts5/fts5_vocab.c 10a3ef4325f65537a2985148f8695476301fa2543fbfd183f28eff0a824faf3f F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 @@ -217,7 +217,7 @@ F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a -F ext/fts5/test/fts5vocab.test aaa7aa9365659969be81be4296ede1bbf3e3ef4be65f88f6910943e29704730a +F ext/fts5/test/fts5vocab.test 648fb2fe86b55e08295e34504704718d92fba3e2cf3e1f5d72fa3682df4cd0f0 F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 @@ -1800,7 +1800,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 acccc9808f52009b2c7794770c8b7efe2ce861fa184d32e287e7114c74e2b522 -R b6df85dc9f6904cfafdd0878423404f3 +P 55c5d72af9510e2f27c33544d804a58d4282b0efb384ead38484129ce91b574f +R 85576c98e4a9bc4cebd1d1250bc88947 U dan -Z 02967187b0cc842cc3b4f78d29f768f7 +Z d48b5a3416d6d2456cec986de9a7bacd diff --git a/manifest.uuid b/manifest.uuid index 50a9d74473..294b92e3c0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -55c5d72af9510e2f27c33544d804a58d4282b0efb384ead38484129ce91b574f \ No newline at end of file +9e717c4377c0116a5d36815fbc30f8b8803f14770d30be361feb27cc5b5b537b \ No newline at end of file From 225b05795f9f9963e8c9431e3a4f1b0503a45ec1 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 18 Jan 2019 21:17:08 +0000 Subject: [PATCH 097/306] Fix a memory leak introduced by [55c5d72a]. FossilOrigin-Name: fbd681dce2905d8b8ad7948ba684b0b62d6c04be0f7a2992ee7d6836a99010de --- ext/fts3/fts3.c | 4 ++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 4e6186ee64..e980596506 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2569,6 +2569,10 @@ static int fts3DoclistOrMerge( } } + if( rc!=SQLITE_OK ){ + sqlite3_free(aOut); + p = aOut = 0; + } *paOut = aOut; *pnOut = (int)(p-aOut); assert( *pnOut<=n1+n2+FTS3_VARINT_MAX-1 ); diff --git a/manifest b/manifest index 4a58150d2e..361b0df9a3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\sin\sthe\sfts5vocab\smodule\scaused\sby\sincluding\sa\s"term\s<\sNULL"\sterm\nin\sa\sWHERE\sclause. -D 2019-01-18T21:12:32.602 +C Fix\sa\smemory\sleak\sintroduced\sby\s[55c5d72a]. +D 2019-01-18T21:17:08.541 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c ec300b0af6989840c624976969bdfabdb252df517d743c8ca19cef3cd0cbc1ce +F ext/fts3/fts3.c 90352639eb4465fdfa0a122c70ce17a9ea2dbbeab1576daf9be637aa199b3fd9 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 6c666f314caaeb8fe8e4c1a2d84f8b34406647429a43e8f475b0b0074ad41861 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b @@ -1800,7 +1800,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 55c5d72af9510e2f27c33544d804a58d4282b0efb384ead38484129ce91b574f -R 85576c98e4a9bc4cebd1d1250bc88947 +P 9e717c4377c0116a5d36815fbc30f8b8803f14770d30be361feb27cc5b5b537b +R b49a74f5cdb5574f8f9ffaf07b939964 U dan -Z d48b5a3416d6d2456cec986de9a7bacd +Z 36f366ba2e0450a8c9dac1df7e806f68 diff --git a/manifest.uuid b/manifest.uuid index 294b92e3c0..46acdb450c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e717c4377c0116a5d36815fbc30f8b8803f14770d30be361feb27cc5b5b537b \ No newline at end of file +fbd681dce2905d8b8ad7948ba684b0b62d6c04be0f7a2992ee7d6836a99010de \ No newline at end of file From 93b6c1666dfe43b77653d11512ba391a82f66094 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 19 Jan 2019 14:07:37 +0000 Subject: [PATCH 098/306] Fix a problem with using ALTER TABLE to rename a table or column when the database schema contains a trigger or view that itself contains an expression " AND 0". FossilOrigin-Name: 908ff7fffa302255a74e2334ca3a1779ed43acb0268fce5a83a56fd16794dc88 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- test/altertab2.test | 9 +++++++++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 361b0df9a3..249f7c45e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sintroduced\sby\s[55c5d72a]. -D 2019-01-18T21:17:08.541 +C Fix\sa\sproblem\swith\susing\sALTER\sTABLE\sto\srename\sa\stable\sor\scolumn\swhen\sthe\ndatabase\sschema\scontains\sa\strigger\sor\sview\sthat\sitself\scontains\san\sexpression\n\s"\sAND\s0". +D 2019-01-19T14:07:37.859 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -465,7 +465,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c b660eb4d6d273946a8341efb9d38320ddceb9c2931d04478c74b85c35e053a5e +F src/expr.c 9c30765910bdff9d68ac580a4f2dc790da82308cb7798e57dc9e4bf5717d557c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 @@ -621,7 +621,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a -F test/altertab2.test 67dd9806e7dafaea26f3b6fcaa4e909f690d6ac71373545577ece7f96a4ea817 +F test/altertab2.test 2465aac70cedb14335a45e39fef9f7118e4726b6cb1614db36cba014f63bdec2 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1800,7 +1800,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 9e717c4377c0116a5d36815fbc30f8b8803f14770d30be361feb27cc5b5b537b -R b49a74f5cdb5574f8f9ffaf07b939964 +P fbd681dce2905d8b8ad7948ba684b0b62d6c04be0f7a2992ee7d6836a99010de +R 4dc710322bda0f3a50b91a09e11f061c U dan -Z 36f366ba2e0450a8c9dac1df7e806f68 +Z 11f28a1d0915a0356096f9db53cd0521 diff --git a/manifest.uuid b/manifest.uuid index 46acdb450c..5586dd5536 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbd681dce2905d8b8ad7948ba684b0b62d6c04be0f7a2992ee7d6836a99010de \ No newline at end of file +908ff7fffa302255a74e2334ca3a1779ed43acb0268fce5a83a56fd16794dc88 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ed53fc7f98..bdb925f01c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -850,7 +850,7 @@ Expr *sqlite3PExpr( Expr *pRight /* Right operand */ ){ Expr *p; - if( op==TK_AND && pParse->nErr==0 ){ + if( op==TK_AND && pParse->nErr==0 && !IN_RENAME_OBJECT ){ /* Take advantage of short-circuit false optimization for AND */ p = sqlite3ExprAnd(pParse->db, pLeft, pRight); }else{ diff --git a/test/altertab2.test b/test/altertab2.test index 7a247d90e9..df395e1d18 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -333,6 +333,15 @@ do_execsql_test 8.3 { INSERT INTO t3 VALUES(4, 5, 6); } +do_execsql_test 8.1 { + CREATE TABLE t4(a, b); + CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2; +} +do_execsql_test 8.2 { + ALTER TABLE t4 RENAME a TO c; + SELECT sql FROM sqlite_master WHERE name = 'v4' +} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (c=1 AND 0) OR b=2}} + finish_test From b8852ae083d8e8ea60ca331f4c3b5619dda00aac Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 19 Jan 2019 15:27:09 +0000 Subject: [PATCH 099/306] Remove a broken assert() triggered by a "PRAGMA max_page_count = N" invocation, where N is larger than the number of pages in the database image, but smaller than the number of pages in the database file. FossilOrigin-Name: 7cd56cad5efead5097e9918c87313bb46e583fe62bae0df1be60e10117e2c3cb --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 5 ++++- test/fallocate.test | 9 +++++++++ 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 249f7c45e9..0aac2b1d0b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\susing\sALTER\sTABLE\sto\srename\sa\stable\sor\scolumn\swhen\sthe\ndatabase\sschema\scontains\sa\strigger\sor\sview\sthat\sitself\scontains\san\sexpression\n\s"\sAND\s0". -D 2019-01-19T14:07:37.859 +C Remove\sa\sbroken\sassert()\striggered\sby\sa\s"PRAGMA\smax_page_count\s=\sN"\ninvocation,\swhere\sN\sis\slarger\sthan\sthe\snumber\sof\spages\sin\sthe\sdatabase\simage,\nbut\ssmaller\sthan\sthe\snumber\sof\spages\sin\sthe\sdatabase\sfile. +D 2019-01-19T15:27:09.978 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -500,7 +500,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0 F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 75e0f3cfa3962c714f519f8a3d1e67ecca1c91de0e010a036b988e40ce9e4c73 +F src/pager.c 857dde3e525f665cfab23b6765bf04ca6638c0759ae7da6d63acfb463e230aa6 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 489673ac424c1d3ec3c97f65df572652b32a47bbcee5be1492ad7d4874d47430 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee @@ -839,7 +839,7 @@ F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac F test/expr.test 7cb55e80aeb41d65fec968c08212505123063fea60bdc355d764d747670e9eea F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 -F test/fallocate.test 07416bd593a116d5893cb244f45a94d5c6fe030561df3bd972e6135f8106e509 +F test/fallocate.test d552828d38cf08c528fadf341df8611378470db02b1a579fa5747b076bece5ea F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 @@ -1800,7 +1800,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 fbd681dce2905d8b8ad7948ba684b0b62d6c04be0f7a2992ee7d6836a99010de -R 4dc710322bda0f3a50b91a09e11f061c +P 908ff7fffa302255a74e2334ca3a1779ed43acb0268fce5a83a56fd16794dc88 +R 971a974acc09c728c7f8cfea14ce9be5 U dan -Z 11f28a1d0915a0356096f9db53cd0521 +Z dcdc09de7eecf89af5550e10c8853994 diff --git a/manifest.uuid b/manifest.uuid index 5586dd5536..d490d28a52 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -908ff7fffa302255a74e2334ca3a1779ed43acb0268fce5a83a56fd16794dc88 \ No newline at end of file +7cd56cad5efead5097e9918c87313bb46e583fe62bae0df1be60e10117e2c3cb \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index e252a4b7a1..e2a12fbff7 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3839,7 +3839,10 @@ int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){ pPager->mxPgno = mxPage; } assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */ - assert( pPager->mxPgno>=pPager->dbSize ); /* OP_MaxPgcnt enforces this */ + /* assert( pPager->mxPgno>=pPager->dbSize ); */ + /* OP_MaxPgcnt ensures that the parameter passed to this function is not + ** less than the total number of valid pages in the database. But this + ** may be less than Pager.dbSize, and so the assert() above is not valid */ return pPager->mxPgno; } diff --git a/test/fallocate.test b/test/fallocate.test index 0c971c08c1..5d55704ee7 100644 --- a/test/fallocate.test +++ b/test/fallocate.test @@ -70,6 +70,15 @@ do_test fallocate-1.7 { } {1024} do_test fallocate-1.8 { execsql { COMMIT } } {} +do_test 1.8 { + set nPg [db one {PRAGMA page_count}] + set nFile [expr [file size test.db] / 1024] + list [expr $nPg<100] [expr $nFile>100] +} {1 1} + +do_execsql_test 1.9 { + PRAGMA max_page_count = 100; +} {} #------------------------------------------------------------------------- # The following tests - fallocate-2.* - test that things work in WAL From 27a037354c9bc67a65f84e45584dc67c24c15f58 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 19 Jan 2019 15:55:27 +0000 Subject: [PATCH 100/306] Avoid a division-by-zero error in fts5 caused by a corrupt database. FossilOrigin-Name: 928e622178bd004be52b2271ac554176aebe9d6e115ecac4e7072eccbb4262b5 --- ext/fts5/fts5_aux.c | 1 + ext/fts5/fts5_storage.c | 6 ++++++ ext/fts5/test/fts5corrupt3.test | 28 ++++++++++++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 44 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_aux.c b/ext/fts5/fts5_aux.c index 7d4f3e6ec2..94f75a08c8 100644 --- a/ext/fts5/fts5_aux.c +++ b/ext/fts5/fts5_aux.c @@ -586,6 +586,7 @@ static int fts5Bm25GetData( /* Calculate the average document length for this FTS5 table */ if( rc==SQLITE_OK ) rc = pApi->xRowCount(pFts, &nRow); + assert( rc!=SQLITE_OK || nRow>0 ); if( rc==SQLITE_OK ) rc = pApi->xColumnTotalSize(pFts, -1, &nToken); if( rc==SQLITE_OK ) p->avgdl = (double)nToken / (double)nRow; diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index a2e34005e1..c6dda28c54 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -1078,7 +1078,13 @@ int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnToken){ int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow){ int rc = fts5StorageLoadTotals(p, 0); if( rc==SQLITE_OK ){ + /* nTotalRow being zero does not necessarily indicate a corrupt + ** database - it might be that the FTS5 table really does contain zero + ** rows. However this function is only called from the xRowCount() API, + ** and there is no way for that API to be invoked if the table contains + ** no rows. Hence the FTS5_CORRUPT return. */ *pnRow = p->nTotalRow; + if( p->nTotalRow<=0 ) rc = FTS5_CORRUPT; } return rc; } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 0be321b33f..cb30a45b15 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -4652,6 +4652,34 @@ do_execsql_test 37.1 { SELECT rowid FROM t1('a'); } {1} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 38.0 { + CREATE VIRTUAL TABLE t1 USING fts5(b, c); + INSERT INTO t1 VALUES('a', 'b'); + INSERT INTO t1 VALUES('a', 'b'); + SELECT quote(block) FROM t1_data WHERE rowid=1; +} {X'020202'} + +do_execsql_test 38.1 { + SELECT * FROM t1('a b') ORDER BY rank; +} {a b a b} + +do_execsql_test 38.2 { + UPDATE t1_data SET block = X'000202' WHERE rowid=1; +} +breakpoint +do_catchsql_test 38.3 { + SELECT * FROM t1('a b') ORDER BY rank; +} {1 {database disk image is malformed}} + +db close +sqlite3 db test.db +do_catchsql_test 38.4 { + SELECT * FROM t1('a b') ORDER BY rank; +} {1 {database disk image is malformed}} + + sqlite3_fts5_may_be_corrupt 0 diff --git a/manifest b/manifest index 0aac2b1d0b..44325e095c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sbroken\sassert()\striggered\sby\sa\s"PRAGMA\smax_page_count\s=\sN"\ninvocation,\swhere\sN\sis\slarger\sthan\sthe\snumber\sof\spages\sin\sthe\sdatabase\simage,\nbut\ssmaller\sthan\sthe\snumber\sof\spages\sin\sthe\sdatabase\sfile. -D 2019-01-19T15:27:09.978 +C Avoid\sa\sdivision-by-zero\serror\sin\sfts5\scaused\sby\sa\scorrupt\sdatabase. +D 2019-01-19T15:55:27.886 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -110,14 +110,14 @@ F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a0 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 4f5d19b7973dae23de368728f06d3eb1fe9f5cca2990366b40e9379996f35e61 F ext/fts5/fts5Int.h 28a99786582ef2a49db6be8eead420ad4d16fbb6635560ded2455628686a1ba9 -F ext/fts5/fts5_aux.c 4353df5d71a8f84ae94ed9c5c9199d1594b8efc9476c4d617fbd8db8b291e3a7 +F ext/fts5/fts5_aux.c c93e943a172de7ac20547158f4eb1fc7729e6807883c71a1cc5be96fa157d69b F ext/fts5/fts5_buffer.c 61f48c4921461dcd3b101eadf2c9e5641dbe7e6470bc60252bee2e42e70ef638 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 F ext/fts5/fts5_index.c 53e064ad16036993ce9b2db77ba7e47f7a9a921b142091c268d5146caebd237a F ext/fts5/fts5_main.c 4a7ebaa5a23e932289355c05fbfc0f5b99d8d087e2f4c9e7b7a723c7b8ac9f02 -F ext/fts5/fts5_storage.c 00db5029ee470172c1a79d7182808b678ee21b7ea1f63618bcb0591bf8cf7f8a +F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 44c0cb3cd7f5c272f299bcd900f270885148181f9148cdfe302e96b6d94b69c3 +F ext/fts5/test/fts5corrupt3.test b9ca1b79300cbc655b998188464774214bf003b7994338acb421fe8b3cff0975 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1800,7 +1800,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 908ff7fffa302255a74e2334ca3a1779ed43acb0268fce5a83a56fd16794dc88 -R 971a974acc09c728c7f8cfea14ce9be5 +P 7cd56cad5efead5097e9918c87313bb46e583fe62bae0df1be60e10117e2c3cb +R ce6dd7c281d4e63f810428007f9405ad U dan -Z dcdc09de7eecf89af5550e10c8853994 +Z f7b3453d78000e6a39688d7713d9192b diff --git a/manifest.uuid b/manifest.uuid index d490d28a52..c3df826ed8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cd56cad5efead5097e9918c87313bb46e583fe62bae0df1be60e10117e2c3cb \ No newline at end of file +928e622178bd004be52b2271ac554176aebe9d6e115ecac4e7072eccbb4262b5 \ No newline at end of file From 8ed07d1274ce924779e769eedb647f11bc729259 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 20 Jan 2019 00:03:59 +0000 Subject: [PATCH 101/306] Add the --max-stack option to dbfuzz2. FossilOrigin-Name: c11ae4fed89484f0a0061002861b5d599bbda8e40a1f0c33fdbe8cb072134d5c --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/dbfuzz2.c | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 44325e095c..e36df26896 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sa\sdivision-by-zero\serror\sin\sfts5\scaused\sby\sa\scorrupt\sdatabase. -D 2019-01-19T15:55:27.886 +C Add\sthe\s--max-stack\soption\sto\sdbfuzz2. +D 2019-01-20T00:03:59.818 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -782,7 +782,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 5659cbbc01e38678c119c8a58071cac59d0d6c71837a385f3d1838012f12e1e1 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c cf600006051826b4c923471a0f502813d5e10f27bc627fac5a7d26c831765364 +F test/dbfuzz2.c 047e69ddf0353c3cf6db67c46ec83bbe743b7cfca36af735d63b078f75cbcca7 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1800,7 +1800,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 7cd56cad5efead5097e9918c87313bb46e583fe62bae0df1be60e10117e2c3cb -R ce6dd7c281d4e63f810428007f9405ad -U dan -Z f7b3453d78000e6a39688d7713d9192b +P 928e622178bd004be52b2271ac554176aebe9d6e115ecac4e7072eccbb4262b5 +R 15aa3d19a54804c9c76653f8590163ad +U drh +Z 7cb1a953620d3f856a072e0ae1692e4d diff --git a/manifest.uuid b/manifest.uuid index c3df826ed8..9db2b04410 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -928e622178bd004be52b2271ac554176aebe9d6e115ecac4e7072eccbb4262b5 \ No newline at end of file +c11ae4fed89484f0a0061002861b5d599bbda8e40a1f0c33fdbe8cb072134d5c \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 212327ff6b..287eb26153 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include "sqlite3.h" /* @@ -148,6 +150,23 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ bVdbeDebug = 1; continue; } + if( strcmp(z,"max-stack")==0 ){ + struct rlimit x,y; + if( i+1==argc ){ + fprintf(stderr, "missing argument to %s\n", argv[i]); + exit(1); + } + memset(&x,0,sizeof(x)); + getrlimit(RLIMIT_STACK, &x); + y.rlim_cur = atoi(argv[++i]); + y.rlim_max = x.rlim_cur; + setrlimit(RLIMIT_STACK, &y); + memset(&y,0,sizeof(y)); + getrlimit(RLIMIT_STACK, &y); + printf("Stack size limit changed from %d to %d\n", + (int)x.rlim_cur, (int)y.rlim_cur); + continue; + } } argv[j++] = argv[i]; } From 5976552a72f33438c293ab0584d981909955e866 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Jan 2019 13:47:55 +0000 Subject: [PATCH 102/306] Add the --max-data and --max-as options to dbfuzz2. Also cause dbfuzz2 to show its maximum RSS size upon exit in standalone mode with the -v option. FossilOrigin-Name: 7ce93e824a954d1e0cf8d7343e59a2660175f42bd4dac02aed8ad77644e7eb2f --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz2.c | 30 ++++++++++++++++++++++++------ 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index e36df26896..d62dc2913c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--max-stack\soption\sto\sdbfuzz2. -D 2019-01-20T00:03:59.818 +C Add\sthe\s--max-data\sand\s--max-as\soptions\sto\sdbfuzz2.\s\sAlso\scause\sdbfuzz2\sto\nshow\sits\smaximum\sRSS\ssize\supon\sexit\sin\sstandalone\smode\swith\sthe\s-v\soption. +D 2019-01-21T13:47:55.219 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -782,7 +782,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 5659cbbc01e38678c119c8a58071cac59d0d6c71837a385f3d1838012f12e1e1 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 047e69ddf0353c3cf6db67c46ec83bbe743b7cfca36af735d63b078f75cbcca7 +F test/dbfuzz2.c 849f0c48a3f0b637cc67e98792fe7a3f253e5b393b1b6e30e265353643d605df F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1800,7 +1800,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 928e622178bd004be52b2271ac554176aebe9d6e115ecac4e7072eccbb4262b5 -R 15aa3d19a54804c9c76653f8590163ad +P c11ae4fed89484f0a0061002861b5d599bbda8e40a1f0c33fdbe8cb072134d5c +R 2f9904d8b345cb626df3da030d41edf3 U drh -Z 7cb1a953620d3f856a072e0ae1692e4d +Z cfbcc5b43fc2946dea53aa13418e36dd diff --git a/manifest.uuid b/manifest.uuid index 9db2b04410..2f5facabf5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c11ae4fed89484f0a0061002861b5d599bbda8e40a1f0c33fdbe8cb072134d5c \ No newline at end of file +7ce93e824a954d1e0cf8d7343e59a2660175f42bd4dac02aed8ad77644e7eb2f \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 287eb26153..4a2ea4379e 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -150,21 +150,34 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ bVdbeDebug = 1; continue; } - if( strcmp(z,"max-stack")==0 ){ + if( strcmp(z,"max-stack")==0 + || strcmp(z,"max-data")==0 + || strcmp(z,"max-as")==0 + ){ struct rlimit x,y; + int resource = RLIMIT_STACK; + char *zType = "RLIMIT_STACK"; if( i+1==argc ){ fprintf(stderr, "missing argument to %s\n", argv[i]); exit(1); } + if( z[4]=='d' ){ + resource = RLIMIT_DATA; + zType = "RLIMIT_DATA"; + } + if( z[4]=='a' ){ + resource = RLIMIT_AS; + zType = "RLIMIT_AS"; + } memset(&x,0,sizeof(x)); - getrlimit(RLIMIT_STACK, &x); + getrlimit(resource, &x); y.rlim_cur = atoi(argv[++i]); y.rlim_max = x.rlim_cur; - setrlimit(RLIMIT_STACK, &y); + setrlimit(resource, &y); memset(&y,0,sizeof(y)); - getrlimit(RLIMIT_STACK, &y); - printf("Stack size limit changed from %d to %d\n", - (int)x.rlim_cur, (int)y.rlim_cur); + getrlimit(resource, &y); + printf("%s changed from %d to %d\n", + zType, (int)x.rlim_cur, (int)y.rlim_cur); continue; } } @@ -217,7 +230,12 @@ int main(int argc, char **argv){ } } if( eVerbosity>0 ){ + struct rusage x; printf("SQLite %s\n", sqlite3_sourceid()); + memset(&x, 0, sizeof(x)); + if( getrusage(RUSAGE_SELF, &x)==0 ){ + printf("Maximum RSS = %ld KB\n", x.ru_maxrss); + } } return 0; } From 7c04c692043c55f057038d244d4333b327e1147d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Jan 2019 14:49:14 +0000 Subject: [PATCH 103/306] Minor fix the fallocate.test module change from [7cd56cad5efead5] FossilOrigin-Name: 94fb7a47003c3c1a52e833e98d27399cfec5382afde2b3990e8223c8bff7cfa0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fallocate.test | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index d62dc2913c..6cb249b1ed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--max-data\sand\s--max-as\soptions\sto\sdbfuzz2.\s\sAlso\scause\sdbfuzz2\sto\nshow\sits\smaximum\sRSS\ssize\supon\sexit\sin\sstandalone\smode\swith\sthe\s-v\soption. -D 2019-01-21T13:47:55.219 +C Minor\sfix\sthe\sfallocate.test\smodule\schange\sfrom\s[7cd56cad5efead5] +D 2019-01-21T14:49:14.297 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -839,7 +839,7 @@ F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac F test/expr.test 7cb55e80aeb41d65fec968c08212505123063fea60bdc355d764d747670e9eea F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 -F test/fallocate.test d552828d38cf08c528fadf341df8611378470db02b1a579fa5747b076bece5ea +F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 @@ -1800,7 +1800,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 c11ae4fed89484f0a0061002861b5d599bbda8e40a1f0c33fdbe8cb072134d5c -R 2f9904d8b345cb626df3da030d41edf3 +P 7ce93e824a954d1e0cf8d7343e59a2660175f42bd4dac02aed8ad77644e7eb2f +R 8d761b62dd0c9c09d0317b68e3be1aff U drh -Z cfbcc5b43fc2946dea53aa13418e36dd +Z 825753ba4f6b25b31a6a5697f19e6232 diff --git a/manifest.uuid b/manifest.uuid index 2f5facabf5..4087d49b53 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ce93e824a954d1e0cf8d7343e59a2660175f42bd4dac02aed8ad77644e7eb2f \ No newline at end of file +94fb7a47003c3c1a52e833e98d27399cfec5382afde2b3990e8223c8bff7cfa0 \ No newline at end of file diff --git a/test/fallocate.test b/test/fallocate.test index 5d55704ee7..3e154482bc 100644 --- a/test/fallocate.test +++ b/test/fallocate.test @@ -70,15 +70,15 @@ do_test fallocate-1.7 { } {1024} do_test fallocate-1.8 { execsql { COMMIT } } {} -do_test 1.8 { +do_test fallocate-1.8 { set nPg [db one {PRAGMA page_count}] set nFile [expr [file size test.db] / 1024] list [expr $nPg<100] [expr $nFile>100] } {1 1} -do_execsql_test 1.9 { +do_execsql_test fallocate-1.9 { PRAGMA max_page_count = 100; -} {} +} {100} #------------------------------------------------------------------------- # The following tests - fallocate-2.* - test that things work in WAL From 50b910a8b59c755e039e473a326ae1535dab80bd Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Jan 2019 14:55:03 +0000 Subject: [PATCH 104/306] Add the --memtrace option to the CLI. FossilOrigin-Name: a1e12fa2a8eb5648a96cc2d8d39899d6f87c5e2269cec7de486964c8b915e724 --- Makefile.in | 1 + Makefile.msc | 1 + ext/misc/memtrace.c | 107 ++++++++++++++++++++++++++++++++++++++++++++ main.mk | 1 + manifest | 19 ++++---- manifest.uuid | 2 +- src/shell.c.in | 5 +++ 7 files changed, 126 insertions(+), 10 deletions(-) create mode 100644 ext/misc/memtrace.c diff --git a/Makefile.in b/Makefile.in index 219fc4f0ca..43fb38a46f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1068,6 +1068,7 @@ SHELL_SRC = \ $(TOP)/ext/expert/sqlite3expert.c \ $(TOP)/ext/expert/sqlite3expert.h \ $(TOP)/ext/misc/zipfile.c \ + $(TOP)/ext/misc/memtrace.c \ $(TOP)/src/test_windirent.c shell.c: $(SHELL_SRC) $(TOP)/tool/mkshellc.tcl diff --git a/Makefile.msc b/Makefile.msc index a4f0e1ef64..fdd1f98f9c 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2131,6 +2131,7 @@ SHELL_SRC = \ $(TOP)\ext\misc\completion.c \ $(TOP)\ext\expert\sqlite3expert.c \ $(TOP)\ext\expert\sqlite3expert.h \ + $(TOP)\ext\misc\memtrace.c \ $(TOP)\src\test_windirent.c # If use of zlib is enabled, add the "zipfile.c" source file. diff --git a/ext/misc/memtrace.c b/ext/misc/memtrace.c new file mode 100644 index 0000000000..76b8d72138 --- /dev/null +++ b/ext/misc/memtrace.c @@ -0,0 +1,107 @@ +/* +** 2019-01-21 +** +** 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 an extension that uses the SQLITE_CONFIG_MALLOC +** mechanism to add a tracing layer on top of SQLite. If this extension +** is registered prior to sqlite3_initialize(), it will cause all memory +** allocation activities to be logged on standard output, or to some other +** FILE specified by the initializer. +** +** This file needs to be compiled into the application that uses it. +** +** This extension is used to implement the --memtrace option of the +** command-line shell. +*/ +#include +#include +#include + +/* The original memory allocation routines */ +static sqlite3_mem_methods memtraceBase; +static FILE *memtraceOut; + +/* Methods that trace memory allocations */ +static void *memtraceMalloc(int n){ + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", + memtraceBase.xRoundup(n)); + } + return memtraceBase.xMalloc(n); +} +static void memtraceFree(void *p){ + if( p==0 ) return; + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); + } + memtraceBase.xFree(p); +} +static void *memtraceRealloc(void *p, int n){ + if( p==0 ) return memtraceMalloc(n); + if( n==0 ){ + memtraceFree(p); + return 0; + } + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", + memtraceBase.xSize(p), memtraceBase.xRoundup(n)); + } + return memtraceBase.xRealloc(p, n); +} +static int memtraceSize(void *p){ + return memtraceBase.xSize(p); +} +static int memtraceRoundup(int n){ + return memtraceBase.xRoundup(n); +} +static int memtraceInit(void *p){ + return memtraceBase.xInit(p); +} +static void memtraceShutdown(void *p){ + memtraceBase.xShutdown(p); +} + +/* The substitute memory allocator */ +static sqlite3_mem_methods ersaztMethods = { + memtraceMalloc, + memtraceFree, + memtraceRealloc, + memtraceSize, + memtraceRoundup, + memtraceInit, + memtraceShutdown +}; + +/* Begin tracing memory allocations to out. */ +int sqlite3MemTraceActivate(FILE *out){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc==0 ){ + rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); + } + } + memtraceOut = out; + return rc; +} + +/* Deactivate memory tracing */ +int sqlite3MemTraceDeactivate(void){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc!=0 ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + memset(&memtraceBase, 0, sizeof(memtraceBase)); + } + } + memtraceOut = 0; + return rc; +} diff --git a/main.mk b/main.mk index 474d710b5d..9667db3253 100644 --- a/main.mk +++ b/main.mk @@ -734,6 +734,7 @@ SHELL_SRC = \ $(TOP)/ext/expert/sqlite3expert.c \ $(TOP)/ext/expert/sqlite3expert.h \ $(TOP)/ext/misc/zipfile.c \ + $(TOP)/ext/misc/memtrace.c \ $(TOP)/src/test_windirent.c shell.c: $(SHELL_SRC) $(TOP)/tool/mkshellc.tcl diff --git a/manifest b/manifest index 6cb249b1ed..cf1907c512 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,10 @@ -C Minor\sfix\sthe\sfallocate.test\smodule\schange\sfrom\s[7cd56cad5efead5] -D 2019-01-21T14:49:14.297 +C Add\sthe\s--memtrace\soption\sto\sthe\sCLI. +D 2019-01-21T14:55:03.278 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 +F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc 54c5921b0c65c49ea8fb5010e763c181526d6cdc1109c7ab7115c4f5bb71e13c +F Makefile.msc e04060b2138cefc198809d7adad70aebb4a667520b9133fe07a90a1769522dc7 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee F VERSION 453e2f4529ca208196d5567db28d549d7151f79efd33f6e6cfe6e613e583a0be F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -290,6 +290,7 @@ F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d +F ext/misc/memtrace.c a485c778b6ee2806d540c7114d55a54518ef3bbacbcc65922099bd432ee4db10 F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba @@ -435,7 +436,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 20d344434cec07680fb7d7e66f6401b0f3bf915277018ac93d229b8f73678216 +F main.mk 468c42acafaf69ae8d514d40cae78343b1d825aabd82e0368f6a3bcf8e4d2469 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -514,7 +515,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c a40867ce07a9b58121d6f9a8fc969555d3c9bdcb6c2b5fc202670815af8dbd91 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c f7260c833c87c52ac187bc160ccc675a67d5a226cacd7eb1cdcb3c3ff25bde76 -F src/shell.c.in b3cd745b53439674fdc3dc4db12e094d11cff91495be68bb09ac52726084b583 +F src/shell.c.in 58b94d2473d84f457dfee94bd0dac3173d39dfdfad058c1c4042a157ec43c4fa F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1800,7 +1801,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 7ce93e824a954d1e0cf8d7343e59a2660175f42bd4dac02aed8ad77644e7eb2f -R 8d761b62dd0c9c09d0317b68e3be1aff +P 94fb7a47003c3c1a52e833e98d27399cfec5382afde2b3990e8223c8bff7cfa0 +R 796d1a1cec3656ad5a4e8f8f2ef69f6e U drh -Z 825753ba4f6b25b31a6a5697f19e6232 +Z ff9c08eb91d733ddc4125da6599985b2 diff --git a/manifest.uuid b/manifest.uuid index 4087d49b53..16039bc6fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -94fb7a47003c3c1a52e833e98d27399cfec5382afde2b3990e8223c8bff7cfa0 \ No newline at end of file +a1e12fa2a8eb5648a96cc2d8d39899d6f87c5e2269cec7de486964c8b915e724 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 747965b0de..84c9cab189 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -937,6 +937,7 @@ INCLUDE ../ext/misc/shathree.c INCLUDE ../ext/misc/fileio.c INCLUDE ../ext/misc/completion.c INCLUDE ../ext/misc/appendvfs.c +INCLUDE ../ext/misc/memtrace.c #ifdef SQLITE_HAVE_ZLIB INCLUDE ../ext/misc/zipfile.c INCLUDE ../ext/misc/sqlar.c @@ -8879,6 +8880,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ ** command, so ignore them */ break; #endif + }else if( strcmp(z, "-memtrace")==0 ){ + sqlite3MemTraceActivate(stderr); } } verify_uninitialized(); @@ -9025,6 +9028,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ i+=2; }else if( strcmp(z,"-mmap")==0 ){ i++; + }else if( strcmp(z,"-memtrace")==0 ){ + i++; #ifdef SQLITE_ENABLE_SORTER_REFERENCES }else if( strcmp(z,"-sorterref")==0 ){ i++; From e6c628e98ca26a3f3cc3b2d832ef118a1eac16dc Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Jan 2019 16:01:17 +0000 Subject: [PATCH 105/306] Make sure the extra bytes allocated for the saved cursor position by check-in [160b1e31c0f27257] are initialized to zero. FossilOrigin-Name: 2737564929e86ead84a3ff6512369268198d38b46e3e02866f8ce34babc76cb9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index cf1907c512..e9cdd94d23 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--memtrace\soption\sto\sthe\sCLI. -D 2019-01-21T14:55:03.278 +C Make\ssure\sthe\sextra\sbytes\sallocated\sfor\sthe\ssaved\scursor\sposition\sby\ncheck-in\s[160b1e31c0f27257]\sare\sinitialized\sto\szero. +D 2019-01-21T16:01:17.355 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c a1030989a43bb21fde08fbe26e201009b70956560e5663317106f75c45937ac9 +F src/btree.c 73f282db4563a61e5da794a4c39f287eaceca08697a25012440b431f9cf7d2b6 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc @@ -1801,7 +1801,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 94fb7a47003c3c1a52e833e98d27399cfec5382afde2b3990e8223c8bff7cfa0 -R 796d1a1cec3656ad5a4e8f8f2ef69f6e +P a1e12fa2a8eb5648a96cc2d8d39899d6f87c5e2269cec7de486964c8b915e724 +R cd18f6fcba214d13eca31f05c5601fa3 U drh -Z ff9c08eb91d733ddc4125da6599985b2 +Z 4ba833054d03b20d4e41cb91457b1977 diff --git a/manifest.uuid b/manifest.uuid index 16039bc6fd..1a4533da0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1e12fa2a8eb5648a96cc2d8d39899d6f87c5e2269cec7de486964c8b915e724 \ No newline at end of file +2737564929e86ead84a3ff6512369268198d38b46e3e02866f8ce34babc76cb9 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 85c942d248..bec3eebebe 100644 --- a/src/btree.c +++ b/src/btree.c @@ -672,6 +672,7 @@ static int saveCursorKey(BtCursor *pCur){ if( pKey ){ rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); if( rc==SQLITE_OK ){ + memset(((u8*)pKey)+pCur->nKey, 0, 9+8); pCur->pKey = pKey; }else{ sqlite3_free(pKey); From ac30553f760afd2e7e54e6781841bed156ca14c7 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 21 Jan 2019 16:12:20 +0000 Subject: [PATCH 106/306] Remove a faulty assert() from fts3. FossilOrigin-Name: 6c33a303ebbb0f5193ead535280ba63118e14fb4f9977ce80dc716a0b082ec99 --- ext/fts3/fts3.c | 1 - manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 225 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 234 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index e980596506..04c6cf5656 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -5619,7 +5619,6 @@ static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ int iCol = 0; char *p = pPhrase->doclist.pList; - assert( *p ); do{ u8 c = 0; int iCnt = 0; diff --git a/manifest b/manifest index e9cdd94d23..9d933caea7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\sextra\sbytes\sallocated\sfor\sthe\ssaved\scursor\sposition\sby\ncheck-in\s[160b1e31c0f27257]\sare\sinitialized\sto\szero. -D 2019-01-21T16:01:17.355 +C Remove\sa\sfaulty\sassert()\sfrom\sfts3. +D 2019-01-21T16:12:20.742 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 90352639eb4465fdfa0a122c70ce17a9ea2dbbeab1576daf9be637aa199b3fd9 +F ext/fts3/fts3.c 63602028ef499f90448c0181467710120daebda5569cb288646c63ff99e01989 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 6c666f314caaeb8fe8e4c1a2d84f8b34406647429a43e8f475b0b0074ad41861 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b @@ -917,7 +917,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test cea5a082ed539a17f5898d490ed4fddec98974bb8efa69ad43feacc5461266a6 +F test/fts3corrupt4.test 47e55245fac0af72a7d3670757d2b9b915b067384a0d91edcb6b5c4e8cfdf304 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1801,7 +1801,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 a1e12fa2a8eb5648a96cc2d8d39899d6f87c5e2269cec7de486964c8b915e724 -R cd18f6fcba214d13eca31f05c5601fa3 -U drh -Z 4ba833054d03b20d4e41cb91457b1977 +P 2737564929e86ead84a3ff6512369268198d38b46e3e02866f8ce34babc76cb9 +R 8f73050e62de1935ea1fd301063b6651 +U dan +Z 0789966e5e90d1692bb1cc4df96080d6 diff --git a/manifest.uuid b/manifest.uuid index 1a4533da0b..1f6df474a8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2737564929e86ead84a3ff6512369268198d38b46e3e02866f8ce34babc76cb9 \ No newline at end of file +6c33a303ebbb0f5193ead535280ba63118e14fb4f9977ce80dc716a0b082ec99 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 239fe9dda3..8b9973c4d3 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -1722,6 +1722,231 @@ do_catchsql_test 12.1 { FROM t1 WHERE t1 MATCH 'e*e*' } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 13.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-c666cfde112dee.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 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 07 00 00 00 01 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 0d a4 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 62 2c 72 6f 6f 74 ock INTEGEb,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 67 64 69 72 egdir_1t1_segdir +| 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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 39 00 00 00 00 00 (a,b,c)...9..... +| 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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 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 23 00 20 32 30 31 36 30 36 30 39 20 44 45 42 4#. 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 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 53 49 4d 18 1b 05 00 25 00000XRTSIM....% +| 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 52 4c 45 20 4a 53 4f ...%..ENARLE 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 1e 4c NARY....)..ENA.L +| 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 59 e5 58 .#..ENABLE FTY.X +| 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 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 2f 30 20 32 30 31 36 30 36 30 cc-5.4/0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| 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 41 00 04 6c 6f 61 64 03 25 1c 00 n1.%.A..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 02 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 f2 03 00 01 03 00 01 03 00 01 bstat........... +| 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 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 57 02 00 .............W.. +| 3504: 01 02 00 01 01 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 64 6e 73 69 6f .........xtdnsio +| 3552: 6e 09 1f 04 00 01 04 00 01 03 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 57 63 63 09 01 03 ..........Wcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 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 02 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 e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 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 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-c666cfde112dee.db +}]} {} + +do_catchsql_test 13.1 { + SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; +} {0 {0 0}} + + + finish_test From 129371553c0c543a26678a12680c484ea0e8ad09 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 21 Jan 2019 17:57:31 +0000 Subject: [PATCH 107/306] Avoid deferencing a freed pointer following an OOM or SQLITE_CORRUPT error in the fts3 xDestroy method. FossilOrigin-Name: 505ed9a47825240979338a24044559613fbbd2a7850bdff70c7164da054ec63d --- ext/fts3/fts3.c | 19 ++++++++++++------- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3fault.test | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 04c6cf5656..267f85163b 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -561,13 +561,18 @@ static int fts3DestroyMethod(sqlite3_vtab *pVtab){ sqlite3 *db = p->db; /* Database handle */ /* Drop the shadow tables */ - if( p->zContentTbl==0 ){ - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_content'", zDb, p->zName); - } - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segments'", zDb,p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segdir'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_docsize'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_stat'", zDb, p->zName); + fts3DbExec(&rc, db, + "DROP TABLE IF EXISTS %Q.'%q_segments';" + "DROP TABLE IF EXISTS %Q.'%q_segdir';" + "DROP TABLE IF EXISTS %Q.'%q_docsize';" + "DROP TABLE IF EXISTS %Q.'%q_stat';" + "%s DROP TABLE IF EXISTS %Q.'%q_content';", + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + (p->zContentTbl ? "--" : ""), zDb,p->zName + ); /* If everything has worked, invoke fts3DisconnectMethod() to free the ** memory associated with the Fts3Table structure and return SQLITE_OK. diff --git a/manifest b/manifest index 9d933caea7..f5e6099afd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sfaulty\sassert()\sfrom\sfts3. -D 2019-01-21T16:12:20.742 +C Avoid\sdeferencing\sa\sfreed\spointer\sfollowing\san\sOOM\sor\sSQLITE_CORRUPT\serror\sin\nthe\sfts3\sxDestroy\smethod. +D 2019-01-21T17:57:31.980 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 63602028ef499f90448c0181467710120daebda5569cb288646c63ff99e01989 +F ext/fts3/fts3.c 560cc692cf054c3599b462836c4ed5cfc015fb49cf42e9700a84f7df84dbd181 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 6c666f314caaeb8fe8e4c1a2d84f8b34406647429a43e8f475b0b0074ad41861 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b @@ -930,7 +930,7 @@ F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 F test/fts3expr4.test cac5dd815fe6b5921741abdccdde3b7f50b86394de91e13308ee7986859c4a9f F test/fts3expr5.test 1368738e3298a7ce0dee3a44d6ebb8f468b2a76f3d1dd18d4ea6d8bc2eeccc1b -F test/fts3fault.test 9fb7d6266a38806de841f7244bac1b0fe3a1477184bbb10b172d19d2ca6ad692 +F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56 @@ -1801,7 +1801,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 2737564929e86ead84a3ff6512369268198d38b46e3e02866f8ce34babc76cb9 -R 8f73050e62de1935ea1fd301063b6651 +P 6c33a303ebbb0f5193ead535280ba63118e14fb4f9977ce80dc716a0b082ec99 +R e88cdc4de46d06ba3ca3ee3037135e9c U dan -Z 0789966e5e90d1692bb1cc4df96080d6 +Z 87d80b21089859763e2507d5a0c47674 diff --git a/manifest.uuid b/manifest.uuid index 1f6df474a8..63bdb65e8a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6c33a303ebbb0f5193ead535280ba63118e14fb4f9977ce80dc716a0b082ec99 \ No newline at end of file +505ed9a47825240979338a24044559613fbbd2a7850bdff70c7164da054ec63d \ No newline at end of file diff --git a/test/fts3fault.test b/test/fts3fault.test index 996a108dfd..707e884fa4 100644 --- a/test/fts3fault.test +++ b/test/fts3fault.test @@ -240,4 +240,20 @@ do_faultsim_test 10.1 -prep { faultsim_test_result {0 {}} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 11.0 { + CREATE VIRTUAL TABLE t1 USING fts3(a, b); +} +faultsim_save_and_close + +do_faultsim_test 11 -faults oom* -prep { + faultsim_restore_and_reopen +} -body { + execsql { DROP TABLE t1 } +} -test { + faultsim_test_result {0 {}} +} + + finish_test From 87c3ad453781bbfbce6b78e1216a92d1687bddc1 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Jan 2019 23:18:22 +0000 Subject: [PATCH 108/306] Enhance the btree search routine so that it does early detection of impossibly large keys and thereby avoids a large malloc() call. FossilOrigin-Name: 3ecaaee69f49e43d38047b7d53b82689eba7f7d33541fcac3c32b6dc8a568458 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f5e6099afd..ce5d58bd97 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sdeferencing\sa\sfreed\spointer\sfollowing\san\sOOM\sor\sSQLITE_CORRUPT\serror\sin\nthe\sfts3\sxDestroy\smethod. -D 2019-01-21T17:57:31.980 +C Enhance\sthe\sbtree\ssearch\sroutine\sso\sthat\sit\sdoes\searly\sdetection\sof\s\nimpossibly\slarge\skeys\sand\sthereby\savoids\sa\slarge\smalloc()\scall. +D 2019-01-21T23:18:22.833 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 73f282db4563a61e5da794a4c39f287eaceca08697a25012440b431f9cf7d2b6 +F src/btree.c 315ccbc0d23ec50c4b65c35bc64ff89f20575ab25a5605a01ae726461ba5dc6f F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc @@ -1801,7 +1801,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 6c33a303ebbb0f5193ead535280ba63118e14fb4f9977ce80dc716a0b082ec99 -R e88cdc4de46d06ba3ca3ee3037135e9c -U dan -Z 87d80b21089859763e2507d5a0c47674 +P 505ed9a47825240979338a24044559613fbbd2a7850bdff70c7164da054ec63d +R e2e2c083d84dd4ed74c396601ff8b668 +U drh +Z e752d990073956697e5a14d1f923521d diff --git a/manifest.uuid b/manifest.uuid index 63bdb65e8a..eaf6920801 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -505ed9a47825240979338a24044559613fbbd2a7850bdff70c7164da054ec63d \ No newline at end of file +3ecaaee69f49e43d38047b7d53b82689eba7f7d33541fcac3c32b6dc8a568458 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index bec3eebebe..c42f80f70d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5475,7 +5475,7 @@ int sqlite3BtreeMovetoUnpacked( testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ testcase( nCell==2 ); /* Minimum legal index key size */ - if( nCell<2 ){ + if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){ rc = SQLITE_CORRUPT_PAGE(pPage); goto moveto_finish; } From 9b13365bbadb5e16da3579fcb8941799760817c1 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Jan 2019 02:34:35 +0000 Subject: [PATCH 109/306] Ensure that a key comparison does not read a collating sequence past the end of the KeyInfo, even if the key field of an index is corrupted by having a string in the last column instead of the ROWID. FossilOrigin-Name: 058a8006dceda78a894ea9446f057aa60b6d38e96506d4d91bda0ee2f9314ba3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 9 ++++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index ce5d58bd97..b5b6515872 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sbtree\ssearch\sroutine\sso\sthat\sit\sdoes\searly\sdetection\sof\s\nimpossibly\slarge\skeys\sand\sthereby\savoids\sa\slarge\smalloc()\scall. -D 2019-01-21T23:18:22.833 +C Ensure\sthat\sa\skey\scomparison\sdoes\snot\sread\sa\scollating\ssequence\spast\sthe\nend\sof\sthe\sKeyInfo,\seven\sif\sthe\skey\sfield\sof\san\sindex\sis\scorrupted\sby\shaving\na\sstring\sin\sthe\slast\scolumn\sinstead\sof\sthe\sROWID. +D 2019-01-22T02:34:35.566 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -589,7 +589,7 @@ F src/vdbe.c 090d40c688b56b4602fb196a78e9d17213f381984258131c1e8f665636ca35ac F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 -F src/vdbeaux.c c0c3c0820cd4f85f449876a068258f0691c5dbaa5b3f9e3dfa652f56ec101578 +F src/vdbeaux.c f6cd3f538697aff71f1ef92a769feb18173eb9df80372f570d741a237ea30628 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f @@ -1801,7 +1801,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 505ed9a47825240979338a24044559613fbbd2a7850bdff70c7164da054ec63d -R e2e2c083d84dd4ed74c396601ff8b668 +P 3ecaaee69f49e43d38047b7d53b82689eba7f7d33541fcac3c32b6dc8a568458 +R f385ece7541b622a43ba00abbbceac4f U drh -Z e752d990073956697e5a14d1f923521d +Z 76c735b46ba59f636dafee5ffda43520 diff --git a/manifest.uuid b/manifest.uuid index eaf6920801..cea1bb0d78 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3ecaaee69f49e43d38047b7d53b82689eba7f7d33541fcac3c32b6dc8a568458 \ No newline at end of file +058a8006dceda78a894ea9446f057aa60b6d38e96506d4d91bda0ee2f9314ba3 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 57b3db8c1a..a8e337ae3c 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3902,7 +3902,8 @@ static int vdbeRecordCompareDebug( /* Do the comparison */ - rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], pKeyInfo->aColl[i]); + rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], + pKeyInfo->nAllField>i ? pKeyInfo->aColl[i] : 0); if( rc!=0 ){ assert( mem1.szMalloc==0 ); /* See comment below */ if( pKeyInfo->aSortOrder[i] ){ @@ -4333,10 +4334,12 @@ int sqlite3VdbeRecordCompareWithSkip( mem1.n = (serial_type - 12) / 2; testcase( (d1+mem1.n)==(unsigned)nKey1 ); testcase( (d1+mem1.n+1)==(unsigned)nKey1 ); - if( (d1+mem1.n) > (unsigned)nKey1 ){ + if( (d1+mem1.n) > (unsigned)nKey1 + || (pKeyInfo = pPKey2->pKeyInfo)->nAllField<=i + ){ pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; return 0; /* Corruption */ - }else if( (pKeyInfo = pPKey2->pKeyInfo)->aColl[i] ){ + }else if( pKeyInfo->aColl[i] ){ mem1.enc = pKeyInfo->enc; mem1.db = pKeyInfo->db; mem1.flags = MEM_Str; From 2c7a73eaea4a5c482fcdeb59d548df0464cd3d69 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 22 Jan 2019 12:21:28 +0000 Subject: [PATCH 110/306] Fix another segfault caused by a corrupt fts3 database. FossilOrigin-Name: ba3b8412726548a0716c1a2d67260c3b7e31956474f4cd4ce607cf2cebc667dd --- ext/fts3/fts3_write.c | 5 + manifest | 16 ++-- manifest.uuid | 2 +- test/fts3corrupt4.test | 205 ++++++++++++++++++++++++++++++++++++++++- 4 files changed, 218 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index df3c07eeb7..3e195c3deb 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -2255,6 +2255,11 @@ static int fts3SegWriterAdd( nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); nSuffix = nTerm-nPrefix; + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + /* Figure out how many bytes are required by this new entry */ nReq = sqlite3Fts3VarintLen(nPrefix) + /* varint containing prefix size */ sqlite3Fts3VarintLen(nSuffix) + /* varint containing suffix size */ diff --git a/manifest b/manifest index b5b6515872..56d89ae44d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sa\skey\scomparison\sdoes\snot\sread\sa\scollating\ssequence\spast\sthe\nend\sof\sthe\sKeyInfo,\seven\sif\sthe\skey\sfield\sof\san\sindex\sis\scorrupted\sby\shaving\na\sstring\sin\sthe\slast\scolumn\sinstead\sof\sthe\sROWID. -D 2019-01-22T02:34:35.566 +C Fix\sanother\ssegfault\scaused\sby\sa\scorrupt\sfts3\sdatabase. +D 2019-01-22T12:21:28.175 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -98,7 +98,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c f33df1670b97be82a217d7b9400def27464e54aab41f7e016eaf057498f09f64 +F ext/fts3/fts3_write.c 4f9d51326e9b020c1e44e86ac7d2e85c38a47f2464bb894ce080726afb352224 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -917,7 +917,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 47e55245fac0af72a7d3670757d2b9b915b067384a0d91edcb6b5c4e8cfdf304 +F test/fts3corrupt4.test 9cc4ae536c28eef2d5a01ca2e128dd9237bd162beb9774a0314b3b34ee5f2053 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1801,7 +1801,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 3ecaaee69f49e43d38047b7d53b82689eba7f7d33541fcac3c32b6dc8a568458 -R f385ece7541b622a43ba00abbbceac4f -U drh -Z 76c735b46ba59f636dafee5ffda43520 +P 058a8006dceda78a894ea9446f057aa60b6d38e96506d4d91bda0ee2f9314ba3 +R a7502ca2669e6df14a57f581f838d7d9 +U dan +Z 21217ff1c201496284c94d42e339d5c2 diff --git a/manifest.uuid b/manifest.uuid index cea1bb0d78..5093f93fe9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -058a8006dceda78a894ea9446f057aa60b6d38e96506d4d91bda0ee2f9314ba3 \ No newline at end of file +ba3b8412726548a0716c1a2d67260c3b7e31956474f4cd4ce607cf2cebc667dd \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 8b9973c4d3..e38425be95 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -1945,8 +1945,211 @@ do_catchsql_test 13.1 { SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; } {0 {0 0}} +#------------------------------------------------------------------------- +reset_db +do_test 14.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-f7b636a855e1d2.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 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 25 04 43 52 45 41 54 45 20 54 _segdi%.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 01 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 61 74 20 r sint occaecat +| 3712: 63 75 70 69 64 61 74 61 74 20 6e 6f 6e 20 70 72 cupidatat non pr +| 3728: 6f 69 64 65 6e 74 2c 2a 06 03 00 5b 63 69 6c 6c oident,*...[cill +| 3744: 75 6d 20 64 6f 6c 6f 72 65 20 65 75 20 66 75 67 um dolore eu fug +| 3760: 69 61 74 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 iat nulla pariat +| 3776: 75 72 2e 43 05 04 00 81 09 44 75 69 73 20 61 75 ur.C.....Duis au +| 3792: 74 65 20 69 72 75 72 65 20 64 6f 6c 6f 72 20 69 te irure dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 73 65 2b 14 03 00 5d 6e 69 73 69 it esse+...]nisi +| 3856: 20 75 74 20 61 6c 69 71 75 69 70 20 65 78 20 65 ut aliquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 61 6c 69 dolore magna ali +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 psum dolor sit a +| 4064: 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 met, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 09 00 01 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 01 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 03 03 03 00 01 01 73 06 l......n......s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 13 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 04 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 03 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 02 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 13 .......0 251..a. +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 03 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 07 00 01 03 08 00 01 05 03 00 01 ................ +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 00 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 08 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 73 03 08 0b 00 01 01 74 se......s......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-f7b636a855e1d2.db +}]} {} +do_execsql_test 14.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} + +do_catchsql_test 14.2 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} finish_test - From 247c1b4a0bef2dcefffb96ce228136c63564be75 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Jan 2019 13:45:48 +0000 Subject: [PATCH 111/306] Make sure cursors are opened on all indexes for an UPDATE OR REPLACE regardless of whether or not the indexes are partial or contain columns that might need to be updated. FossilOrigin-Name: e148cdad35520e6684cfeba23b003f60b55f83a6bf621aff16be8aa5612cdcee --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/update.c | 5 ++--- test/update2.test | 16 ++++++++++++++++ 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 56d89ae44d..b5a208b609 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\ssegfault\scaused\sby\sa\scorrupt\sfts3\sdatabase. -D 2019-01-22T12:21:28.175 +C Make\ssure\scursors\sare\sopened\son\sall\sindexes\sfor\san\sUPDATE\sOR\sREPLACE\nregardless\sof\swhether\sor\snot\sthe\sindexes\sare\spartial\sor\scontain\scolumns\nthat\smight\sneed\sto\sbe\supdated. +D 2019-01-22T13:45:48.673 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -580,7 +580,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c c8af4feebd8bf5a4d60a14018d91f61013f658ec864dfce7661bae73d86b3191 F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 -F src/update.c 4e630e47852e206d0b29ec63ea0402e0b7ba328a1c19dd645ae8ac7bd0a378cf +F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 @@ -1565,7 +1565,7 @@ F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 F test/update.test 1148de8d913e9817717990603aadeca07aab9ddbb10a30f167cbfd8d3a3ccb60 -F test/update2.test 5e67667e1c54017d964e626db765cf8bedcf87483c184f4c575bdb8c1dd2313e +F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upsert1.test 994bde41800bb77dbe32fcd2e1f6c4b49cc9f2c6cd345731c774dff02b51c110 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c @@ -1801,7 +1801,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 058a8006dceda78a894ea9446f057aa60b6d38e96506d4d91bda0ee2f9314ba3 -R a7502ca2669e6df14a57f581f838d7d9 -U dan -Z 21217ff1c201496284c94d42e339d5c2 +P ba3b8412726548a0716c1a2d67260c3b7e31956474f4cd4ce607cf2cebc667dd +R 7ce2d510eb9d051132c78a15e023756d +U drh +Z d4e1fff084d7bc0803e5ba0a13f2d0e8 diff --git a/manifest.uuid b/manifest.uuid index 5093f93fe9..e35c40c4db 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ba3b8412726548a0716c1a2d67260c3b7e31956474f4cd4ce607cf2cebc667dd \ No newline at end of file +e148cdad35520e6684cfeba23b003f60b55f83a6bf621aff16be8aa5612cdcee \ No newline at end of file diff --git a/src/update.c b/src/update.c index 0cf15a091a..132837d44f 100644 --- a/src/update.c +++ b/src/update.c @@ -354,6 +354,7 @@ void sqlite3Update( ** being updated. Fill in aRegIdx[] with a register number that will hold ** the key for accessing each index. */ + if( onError==OE_Replace ) bReplace = 1; for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int reg; if( chngKey || hasFK>1 || pIdx==pPk @@ -367,9 +368,7 @@ void sqlite3Update( if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){ reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; - if( (onError==OE_Replace) - || (onError==OE_Default && pIdx->onError==OE_Replace) - ){ + if( onError==OE_Default && pIdx->onError==OE_Replace ){ bReplace = 1; } break; diff --git a/test/update2.test b/test/update2.test index a6c3113400..41a7224d7a 100644 --- a/test/update2.test +++ b/test/update2.test @@ -216,4 +216,20 @@ do_execsql_test 6.2 { SELECT * FROM d1; } {3 2} +# 2019-01-22 Bug in UPDATE OR REPLACE discovered by the +# Matt Denton's LPM fuzzer +# +do_execsql_test 7.100 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x,y); + CREATE UNIQUE INDEX t1x1 ON t1(x) WHERE x IS NOT NULL; + INSERT INTO t1(x) VALUES(NULL),(NULL); + CREATE INDEX t1x2 ON t1(y); + SELECT quote(x), quote(y), '|' FROM t1; +} {NULL NULL | NULL NULL |} +do_execsql_test 7.110 { + UPDATE OR REPLACE t1 SET x=1; + SELECT quote(x), quote(y), '|' FROM t1; +} {1 NULL |} + finish_test From 6ca644818b163eaebae657f816f907335ed0b068 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Jan 2019 16:06:20 +0000 Subject: [PATCH 112/306] Enhancements to deserialize: (1) Add the SQLITE_FCNTL_SIZE_LIMIT file control to set a maximum size for an in-memory database, defaulting to SQLITE_MEMDB_DEFAULT_MAXSIZE or 1GiB. (2) Honor the SQLITE_DESERIALIZE_READONLY flag. (3) Enhance the TCL interface to support -maxsize N and -readonly BOOLEAN. (4) Add the --maxsize option to the ".open" command and on the command-line for the CLI. FossilOrigin-Name: 30f08d58882819a69e353bcc1b6b349664bbfbe00aa1c115ba44a9fd899fcc5b --- manifest | 20 +++++++++--------- manifest.uuid | 2 +- src/memdb.c | 38 +++++++++++++++++++++++++++++---- src/shell.c.in | 18 ++++++++++++++++ src/sqlite.h.in | 10 +++++++++ src/tclsqlite.c | 55 ++++++++++++++++++++++++++++++++++++------------ test/memdb1.test | 27 +++++++++++++++++++++++- 7 files changed, 140 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index b5a208b609..c29935bcfc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\scursors\sare\sopened\son\sall\sindexes\sfor\san\sUPDATE\sOR\sREPLACE\nregardless\sof\swhether\sor\snot\sthe\sindexes\sare\spartial\sor\scontain\scolumns\nthat\smight\sneed\sto\sbe\supdated. -D 2019-01-22T13:45:48.673 +C Enhancements\sto\sdeserialize:\s(1)\sAdd\sthe\sSQLITE_FCNTL_SIZE_LIMIT\sfile\scontrol\nto\sset\sa\smaximum\ssize\sfor\san\sin-memory\sdatabase,\sdefaulting\sto\s\nSQLITE_MEMDB_DEFAULT_MAXSIZE\sor\s1GiB.\s\s(2)\sHonor\sthe\sSQLITE_DESERIALIZE_READONLY\nflag.\s(3)\sEnhance\sthe\sTCL\sinterface\sto\ssupport\s-maxsize\sN\sand\s-readonly\sBOOLEAN.\n(4)\sAdd\sthe\s--maxsize\soption\sto\sthe\s".open"\scommand\sand\son\sthe\scommand-line\sfor\nthe\sCLI. +D 2019-01-22T16:06:20.120 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -485,7 +485,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c cb4013d56fa71c79c498717cbc47b27dd1c7653fd866584b2071ae04114eec46 +F src/memdb.c 25d36740e40ed3f3758c17bd6ed7db099a6b1d8033d7ea7058496774ac14d8c4 F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661 F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81 F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604 @@ -515,15 +515,15 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c a40867ce07a9b58121d6f9a8fc969555d3c9bdcb6c2b5fc202670815af8dbd91 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c f7260c833c87c52ac187bc160ccc675a67d5a226cacd7eb1cdcb3c3ff25bde76 -F src/shell.c.in 58b94d2473d84f457dfee94bd0dac3173d39dfdfad058c1c4042a157ec43c4fa -F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f +F src/shell.c.in 7649cd10a1ad8bf4caf78e501db97e96bb4c4f35120b8dd2c3f983e859ea1325 +F src/sqlite.h.in 8ded85ecaa768afd196b24201382ccdf00e5bab6861e30549cd750bebd273a0b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 F src/sqliteInt.h a2330a569d8c5461aa35fe3ad29a1885e13ddfd07088a3e833131490c3a99ca9 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c e72862a271348d779672b45a730c33fd0c535e630ff927e8ce4a0c908d1d28c6 +F src/tclsqlite.c 6b19e7562195aaf881f3e35e2472dc01ae3cb156961db5126c3d616744729b7e F src/test1.c 64cdc914a77102e008dfae7adaa4ded54c2d4953d1464ea8709805a2aab755eb F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1120,7 +1120,7 @@ F test/malloctraceviewer.tcl b7a54595270c1d201abf1c3f3d461f27eaf24cdef623ad08a0f F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 -F test/memdb1.test 61aa1dbdeea6320791d2ff42a9a6149d5716be674bf06ee0ffa0aad1bf3eb5f8 +F test/memdb1.test 0632e6ea56c48e3c6e9b0c73e120310bad8f93762543f809e267888f5a37943f F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 @@ -1801,7 +1801,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 ba3b8412726548a0716c1a2d67260c3b7e31956474f4cd4ce607cf2cebc667dd -R 7ce2d510eb9d051132c78a15e023756d +P e148cdad35520e6684cfeba23b003f60b55f83a6bf621aff16be8aa5612cdcee +R 9d6d2798c27f659933ba85e19f8b3d4e U drh -Z d4e1fff084d7bc0803e5ba0a13f2d0e8 +Z aaf32ec586902c86687ff793f750210d diff --git a/manifest.uuid b/manifest.uuid index e35c40c4db..012ba884b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e148cdad35520e6684cfeba23b003f60b55f83a6bf621aff16be8aa5612cdcee \ No newline at end of file +30f08d58882819a69e353bcc1b6b349664bbfbe00aa1c115ba44a9fd899fcc5b \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index 7723d40525..c6603a1c81 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -34,13 +34,19 @@ typedef struct MemFile MemFile; struct MemFile { sqlite3_file base; /* IO methods */ sqlite3_int64 sz; /* Size of the file */ - sqlite3_int64 szMax; /* Space allocated to aData */ + sqlite3_int64 szAlloc; /* Space allocated to aData */ + sqlite3_int64 szMax; /* Maximum allowed size of the file */ unsigned char *aData; /* content of the file */ int nMmap; /* Number of memory mapped pages */ unsigned mFlags; /* Flags */ int eLock; /* Most recent lock against this file */ }; +/* The default maximum size of an in-memory database */ +#ifndef SQLITE_MEMDB_DEFAULT_MAXSIZE +# define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 +#endif + /* ** Methods for MemFile */ @@ -160,10 +166,15 @@ static int memdbEnlarge(MemFile *p, sqlite3_int64 newSz){ if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ return SQLITE_FULL; } + if( newSz>p->szMax ){ + return SQLITE_FULL; + } + newSz *= 2; + if( newSz>p->szMax ) newSz = p->szMax; pNew = sqlite3_realloc64(p->aData, newSz); if( pNew==0 ) return SQLITE_NOMEM; p->aData = pNew; - p->szMax = newSz; + p->szAlloc = newSz; return SQLITE_OK; } @@ -177,10 +188,11 @@ static int memdbWrite( sqlite_int64 iOfst ){ MemFile *p = (MemFile *)pFile; + if( p->mFlags & SQLITE_DESERIALIZE_READONLY ) return SQLITE_READONLY; if( iOfst+iAmt>p->sz ){ int rc; - if( iOfst+iAmt>p->szMax - && (rc = memdbEnlarge(p, (iOfst+iAmt)*2))!=SQLITE_OK + if( iOfst+iAmt>p->szAlloc + && (rc = memdbEnlarge(p, iOfst+iAmt))!=SQLITE_OK ){ return rc; } @@ -250,6 +262,19 @@ static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz); rc = SQLITE_OK; } + if( op==SQLITE_FCNTL_SIZE_LIMIT ){ + sqlite3_int64 iLimit = *(sqlite3_int64*)pArg; + if( iLimitsz ){ + if( iLimit<0 ){ + iLimit = p->szMax; + }else{ + iLimit = p->sz; + } + } + p->szMax = iLimit; + *(sqlite3_int64*)pArg = iLimit; + rc = SQLITE_OK; + } return rc; } @@ -311,6 +336,7 @@ static int memdbOpen( assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ *pOutFlags = flags | SQLITE_OPEN_MEMORY; p->base.pMethods = &memdb_io_methods; + p->szMax = SQLITE_MEMDB_DEFAULT_MAXSIZE; return SQLITE_OK; } @@ -560,7 +586,11 @@ int sqlite3_deserialize( }else{ p->aData = pData; p->sz = szDb; + p->szAlloc = szBuf; p->szMax = szBuf; + if( p->szMaxszMax = SQLITE_MEMDB_DEFAULT_MAXSIZE; + } p->mFlags = mFlags; rc = SQLITE_OK; } diff --git a/src/shell.c.in b/src/shell.c.in index 84c9cab189..ac2ee1981b 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1025,6 +1025,7 @@ struct ShellState { int showHeader; /* True to show column names in List or Column mode */ int nCheck; /* Number of ".check" commands run */ unsigned shellFlgs; /* Various flags */ + sqlite3_int64 szMax; /* --maxsize argument to .open */ char *zDestTable; /* Name of destination table when MODE_Insert */ char *zTempFile; /* Temporary file that might need deleting */ char zTestcase[30]; /* Name of current test case */ @@ -3449,6 +3450,7 @@ static const char *(azHelp[]) = { #ifdef SQLITE_ENABLE_DESERIALIZE " --deserialize Load into memory useing sqlite3_deserialize()", " --hexdb Load the output of \"dbtotxt\" as an in-memory database", + " --maxsize N Maximum size for --hexdb or --deserialized database", #endif " --new Initialize FILE to an empty database", " --readonly Open FILE readonly", @@ -3927,6 +3929,9 @@ static void open_db(ShellState *p, int openFlags){ if( rc ){ utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); } + if( p->szMax>0 ){ + sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); + } } #endif } @@ -6841,6 +6846,7 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_free(p->zFreeOnClose); p->zFreeOnClose = 0; p->openMode = SHELL_OPEN_UNSPEC; + p->szMax = 0; /* Check for command-line arguments */ for(iName=1; iNameopenMode = SHELL_OPEN_DESERIALIZE; }else if( optionMatch(z, "hexdb") ){ p->openMode = SHELL_OPEN_HEXDB; + }else if( optionMatch(z, "maxsize") && iName+1szMax = integerValue(azArg[++iName]); #endif /* SQLITE_ENABLE_DESERIALIZE */ }else if( z[0]=='-' ){ utf8_printf(stderr, "unknown option: %s\n", z); @@ -8549,6 +8557,9 @@ static const char zOptions[] = " -column set output mode to 'column'\n" " -cmd COMMAND run \"COMMAND\" before reading stdin\n" " -csv set output mode to 'csv'\n" +#if defined(SQLITE_ENABLE_DESERIALIZE) + " -deserialize open the database using sqlite3_deserialize()\n" +#endif " -echo print commands before execution\n" " -init FILENAME read/process named file\n" " -[no]header turn headers on or off\n" @@ -8561,6 +8572,9 @@ static const char zOptions[] = " -line set output mode to 'line'\n" " -list set output mode to 'list'\n" " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" +#if defined(SQLITE_ENABLE_DESERIALIZE) + " -maxsize N maximum size for a --deserialize database\n" +#endif " -mmap N default mmap size set to N\n" #ifdef SQLITE_ENABLE_MULTIPLEX " -multiplex enable the multiplexor VFS\n" @@ -8871,6 +8885,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ #ifdef SQLITE_ENABLE_DESERIALIZE }else if( strcmp(z,"-deserialize")==0 ){ data.openMode = SHELL_OPEN_DESERIALIZE; + }else if( strcmp(z,"-maxsize")==0 && i+1[[SQLITE_FCNTL_SIZE_LIMIT]] +** The [SQLITE_FCNTL_SIZE_LIMIT] opcode is used by in-memory VFS that +** implements [sqlite3_deserialize()] to set an upper bound on the size +** of the in-memory database. The argument is a pointer to a [sqlite3_int64]. +** If the integer pointed to is negative, then it is filled in with the +** current limit. Otherwise the limit is set to the larger of the value +** of the integer pointed to and the current database size. The integer +** pointed to is set to the new limit. +** **
  • [[SQLITE_FCNTL_CHUNK_SIZE]] ** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS ** extends and truncates the database file in chunks of a size specified @@ -1131,6 +1140,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 +#define SQLITE_FCNTL_SIZE_LIMIT 36 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 3982ead7be..eb3bedf9d4 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -2418,7 +2418,7 @@ static int SQLITE_TCLAPI DbObjCmd( } /* - ** $db deserialize ?DATABASE? VALUE + ** $db deserialize ?-maxsize N? ?-readonly BOOL? ?DATABASE? VALUE ** ** Reopen DATABASE (default "main") using the content in $VALUE */ @@ -2428,38 +2428,65 @@ static int SQLITE_TCLAPI DbObjCmd( (char*)0); rc = TCL_ERROR; #else - const char *zSchema; - Tcl_Obj *pValue; + const char *zSchema = 0; + Tcl_Obj *pValue = 0; unsigned char *pBA; unsigned char *pData; int len, xrc; - - if( objc==3 ){ - zSchema = 0; - pValue = objv[2]; - }else if( objc==4 ){ - zSchema = Tcl_GetString(objv[2]); - pValue = objv[3]; - }else{ + sqlite3_int64 mxSize = 0; + int i; + int isReadonly = 0; + + + if( objc<3 ){ Tcl_WrongNumArgs(interp, 2, objv, "?DATABASE? VALUE"); rc = TCL_ERROR; break; } + for(i=2; i0 ){ Tcl_AppendResult(interp, "out of memory", (char*)0); rc = TCL_ERROR; }else{ + int flags; if( len>0 ) memcpy(pData, pBA, len); - xrc = sqlite3_deserialize(pDb->db, zSchema, pData, len, len, - SQLITE_DESERIALIZE_FREEONCLOSE | - SQLITE_DESERIALIZE_RESIZEABLE); + if( isReadonly ){ + flags = SQLITE_DESERIALIZE_FREEONCLOSE | SQLITE_DESERIALIZE_READONLY; + }else{ + flags = SQLITE_DESERIALIZE_FREEONCLOSE | SQLITE_DESERIALIZE_RESIZEABLE; + } + xrc = sqlite3_deserialize(pDb->db, zSchema, pData, len, len, flags); if( xrc ){ Tcl_AppendResult(interp, "unable to set MEMDB content", (char*)0); rc = TCL_ERROR; } + if( mxSize>0 ){ + sqlite3_file_control(pDb->db, zSchema,SQLITE_FCNTL_SIZE_LIMIT,&mxSize); + } } +deserialize_error: #endif break; } diff --git a/test/memdb1.test b/test/memdb1.test index 771d5e42fa..3d1a1f9a63 100644 --- a/test/memdb1.test +++ b/test/memdb1.test @@ -72,6 +72,31 @@ do_execsql_test 140 { PRAGMA page_count; } {2} +do_test 150 { + catch {db deserialize -unknown 1 $db1} msg + set msg +} {unknown option: -unknown} +do_test 151 { + db deserialize -readonly 1 $db1 + db eval {SELECT * FROM t1} +} {1 2} +do_test 152 { + catchsql {INSERT INTO t1 VALUES(3,4);} +} {1 {attempt to write a readonly database}} + +breakpoint +do_test 160 { + db deserialize -maxsize 32768 $db1 + db eval {SELECT * FROM t1} +} {1 2} +do_test 161 { + db eval {INSERT INTO t1 VALUES(3,4); SELECT * FROM t1} +} {1 2 3 4} +do_test 162 { + catchsql {INSERT INTO t1 VALUES(5,randomblob(100000))} +} {1 {database or disk is full}} + + # Build a largish on-disk database and serialize it. Verify that the # serialization works. # @@ -154,7 +179,7 @@ do_test 600 { do_test 610 { set rc [catch {db deserialize a b c} msg] lappend rc $msg -} {1 {wrong # args: should be "db deserialize ?DATABASE? VALUE"}} +} {1 {unknown option: a}} do_test 620 { set rc [catch {db serialize a b} msg] lappend rc $msg From 178edcd774d21a1eab9e2b92d76c60950c4da894 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Jan 2019 16:11:31 +0000 Subject: [PATCH 113/306] Update dbfuzz2 to set a maximum database size of 100MiB by default, but with the new --max-db-size N option to change that limit. FossilOrigin-Name: 21d6bb78ef2979d011b917d2d6519d7cd0009fcad83ed23ab2e9a5e02d8e51ab --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz2.c | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index c29935bcfc..f2c5f3afe2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\sdeserialize:\s(1)\sAdd\sthe\sSQLITE_FCNTL_SIZE_LIMIT\sfile\scontrol\nto\sset\sa\smaximum\ssize\sfor\san\sin-memory\sdatabase,\sdefaulting\sto\s\nSQLITE_MEMDB_DEFAULT_MAXSIZE\sor\s1GiB.\s\s(2)\sHonor\sthe\sSQLITE_DESERIALIZE_READONLY\nflag.\s(3)\sEnhance\sthe\sTCL\sinterface\sto\ssupport\s-maxsize\sN\sand\s-readonly\sBOOLEAN.\n(4)\sAdd\sthe\s--maxsize\soption\sto\sthe\s".open"\scommand\sand\son\sthe\scommand-line\sfor\nthe\sCLI. -D 2019-01-22T16:06:20.120 +C Update\sdbfuzz2\sto\sset\sa\smaximum\sdatabase\ssize\sof\s100MiB\sby\sdefault,\sbut\nwith\sthe\snew\s--max-db-size\sN\soption\sto\schange\sthat\slimit. +D 2019-01-22T16:11:31.841 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -783,7 +783,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 5659cbbc01e38678c119c8a58071cac59d0d6c71837a385f3d1838012f12e1e1 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 849f0c48a3f0b637cc67e98792fe7a3f253e5b393b1b6e30e265353643d605df +F test/dbfuzz2.c ffd2d85cab49936959b8ee6073498bcb827d5670c7286e4b40b06e433b32a94a F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1801,7 +1801,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 e148cdad35520e6684cfeba23b003f60b55f83a6bf621aff16be8aa5612cdcee -R 9d6d2798c27f659933ba85e19f8b3d4e +P 30f08d58882819a69e353bcc1b6b349664bbfbe00aa1c115ba44a9fd899fcc5b +R c0a93c2de998a25ade80e52d3493d401 U drh -Z aaf32ec586902c86687ff793f750210d +Z e95af0696f8de39c19179e79f984dce6 diff --git a/manifest.uuid b/manifest.uuid index 012ba884b1..d1fd09b93a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -30f08d58882819a69e353bcc1b6b349664bbfbe00aa1c115ba44a9fd899fcc5b \ No newline at end of file +21d6bb78ef2979d011b917d2d6519d7cd0009fcad83ed23ab2e9a5e02d8e51ab \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 4a2ea4379e..30a55943e8 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -69,6 +69,9 @@ int eVerbosity = 0; /* True to activate PRAGMA vdbe_debug=on */ static int bVdbeDebug = 0; +/* Maximum size of the in-memory database file */ +static sqlite3_int64 szMax = 104857600; + /* libFuzzer invokes this routine with fuzzed database files (in aData). ** This routine run SQLite against the malformed database to see if it ** can provoke a failure or malfunction. @@ -78,6 +81,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ sqlite3 *db; int rc; int i; + sqlite3_int64 x; if( eVerbosity>=1 ){ printf("************** nByte=%d ***************\n", (int)nByte); @@ -92,6 +96,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ sqlite3_deserialize(db, "main", a, nByte, nByte, SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE); + x = szMax; + sqlite3_file_control(db, "main", SQLITE_FCNTL_SIZE_LIMIT, &x); if( bVdbeDebug ){ sqlite3_exec(db, "PRAGMA vdbe_debug=ON", 0, 0, 0); } @@ -150,6 +156,14 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ bVdbeDebug = 1; continue; } + if( strcmp(z,"max-db-size")==0 ){ + if( i+1==argc ){ + fprintf(stderr, "missing argument to %s\n", argv[i]); + exit(1); + } + szMax = strtol(argv[++i], 0, 0); + continue; + } if( strcmp(z,"max-stack")==0 || strcmp(z,"max-data")==0 || strcmp(z,"max-as")==0 From f186f0b0588a9f4641d865eb0bf07c29c7324265 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Jan 2019 16:43:47 +0000 Subject: [PATCH 114/306] Fix the SQLITE_DESERIALIZE_READONLY feature so that it does not cause an assertion fault in the pager. FossilOrigin-Name: b9eccef7825c61980678599358b62bc394283124653061ce163ead0c653f481d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/memdb.c | 7 ++++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f2c5f3afe2..183742428d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sdbfuzz2\sto\sset\sa\smaximum\sdatabase\ssize\sof\s100MiB\sby\sdefault,\sbut\nwith\sthe\snew\s--max-db-size\sN\soption\sto\schange\sthat\slimit. -D 2019-01-22T16:11:31.841 +C Fix\sthe\sSQLITE_DESERIALIZE_READONLY\sfeature\sso\sthat\sit\sdoes\snot\scause\nan\sassertion\sfault\sin\sthe\spager. +D 2019-01-22T16:43:47.471 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -485,7 +485,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 25d36740e40ed3f3758c17bd6ed7db099a6b1d8033d7ea7058496774ac14d8c4 +F src/memdb.c 6099be387f1161e07b20e5ea5118348a6fb7eb55edcb487d6bea15ee917b37e4 F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661 F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81 F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604 @@ -1801,7 +1801,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 30f08d58882819a69e353bcc1b6b349664bbfbe00aa1c115ba44a9fd899fcc5b -R c0a93c2de998a25ade80e52d3493d401 +P 21d6bb78ef2979d011b917d2d6519d7cd0009fcad83ed23ab2e9a5e02d8e51ab +R c10e509bd08fe49c65bda07d588ac180 U drh -Z e95af0696f8de39c19179e79f984dce6 +Z 2cd758b83be35b67f60e995e64492823 diff --git a/manifest.uuid b/manifest.uuid index d1fd09b93a..fb21bdab47 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -21d6bb78ef2979d011b917d2d6519d7cd0009fcad83ed23ab2e9a5e02d8e51ab \ No newline at end of file +b9eccef7825c61980678599358b62bc394283124653061ce163ead0c653f481d \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index c6603a1c81..e7366961f3 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -188,7 +188,7 @@ static int memdbWrite( sqlite_int64 iOfst ){ MemFile *p = (MemFile *)pFile; - if( p->mFlags & SQLITE_DESERIALIZE_READONLY ) return SQLITE_READONLY; + if( NEVER(p->mFlags & SQLITE_DESERIALIZE_READONLY) ) return SQLITE_READONLY; if( iOfst+iAmt>p->sz ){ int rc; if( iOfst+iAmt>p->szAlloc @@ -238,6 +238,11 @@ static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ */ static int memdbLock(sqlite3_file *pFile, int eLock){ MemFile *p = (MemFile *)pFile; + if( eLock>SQLITE_LOCK_SHARED + && (p->mFlags & SQLITE_DESERIALIZE_READONLY)!=0 + ){ + return SQLITE_READONLY; + } p->eLock = eLock; return SQLITE_OK; } From c5ea2d474d00c78683ec2739aaeddb8bab2d5e16 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Jan 2019 16:44:59 +0000 Subject: [PATCH 115/306] Use _strdup() instead of strdup() on Windows builds of the CLI, to avoid a compiler warning reported on the mailing list. FossilOrigin-Name: a7126a4f4fb4e3e25be95d673323f835252bb2b427469616046a90b2acf64071 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 183742428d..b2d0d15e4f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sSQLITE_DESERIALIZE_READONLY\sfeature\sso\sthat\sit\sdoes\snot\scause\nan\sassertion\sfault\sin\sthe\spager. -D 2019-01-22T16:43:47.471 +C Use\s_strdup()\sinstead\sof\sstrdup()\son\sWindows\sbuilds\sof\sthe\sCLI,\sto\savoid\na\scompiler\swarning\sreported\son\sthe\smailing\slist. +D 2019-01-22T16:44:59.908 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -515,7 +515,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c a40867ce07a9b58121d6f9a8fc969555d3c9bdcb6c2b5fc202670815af8dbd91 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c f7260c833c87c52ac187bc160ccc675a67d5a226cacd7eb1cdcb3c3ff25bde76 -F src/shell.c.in 7649cd10a1ad8bf4caf78e501db97e96bb4c4f35120b8dd2c3f983e859ea1325 +F src/shell.c.in 58f69c9143d9635a3d71a32c3d4cb6fad4de4f0ca400c098fa76ff83e3ec58cb F src/sqlite.h.in 8ded85ecaa768afd196b24201382ccdf00e5bab6861e30549cd750bebd273a0b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1801,7 +1801,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 21d6bb78ef2979d011b917d2d6519d7cd0009fcad83ed23ab2e9a5e02d8e51ab -R c10e509bd08fe49c65bda07d588ac180 +P b9eccef7825c61980678599358b62bc394283124653061ce163ead0c653f481d +R 31c47432b5b5a86301fd8f9558738dd0 U drh -Z 2cd758b83be35b67f60e995e64492823 +Z 1ebf6a23a577431713cfd419e4185fab diff --git a/manifest.uuid b/manifest.uuid index fb21bdab47..36be5092b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b9eccef7825c61980678599358b62bc394283124653061ce163ead0c653f481d \ No newline at end of file +a7126a4f4fb4e3e25be95d673323f835252bb2b427469616046a90b2acf64071 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index ac2ee1981b..07afdf8d94 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -138,6 +138,9 @@ typedef unsigned char u8; # ifndef unlink # define unlink _unlink # endif +# ifndef strdup +# define strdup _strdup +# endif # undef popen # define popen _popen # undef pclose From 8e4fe01dda7240dd6550406f9d3e9f56f6fc0ccf Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 22 Jan 2019 20:18:29 +0000 Subject: [PATCH 116/306] Do not run shmlock.test as part of the journaltest permutation. FossilOrigin-Name: 5b7d0c784e6467154d9549af0163d788b69d5e5a6478a735834cdea945e7dbb7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/permutations.test | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b2d0d15e4f..171771983c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\s_strdup()\sinstead\sof\sstrdup()\son\sWindows\sbuilds\sof\sthe\sCLI,\sto\savoid\na\scompiler\swarning\sreported\son\sthe\smailing\slist. -D 2019-01-22T16:44:59.908 +C Do\snot\srun\sshmlock.test\sas\spart\sof\sthe\sjournaltest\spermutation. +D 2019-01-22T20:18:29.964 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -1192,7 +1192,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 61c0f61d9b26ebb4643b2ed848e9b3f55492f74e0addab66c7dcd70b081d7b03 +F test/permutations.test 5b729823f3f4b8a488c64dee3484cfb4e924ee0713c7eef1da3ed99ea8573d80 F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb06960db30 F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1801,7 +1801,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 b9eccef7825c61980678599358b62bc394283124653061ce163ead0c653f481d -R 31c47432b5b5a86301fd8f9558738dd0 -U drh -Z 1ebf6a23a577431713cfd419e4185fab +P a7126a4f4fb4e3e25be95d673323f835252bb2b427469616046a90b2acf64071 +R c630cbdb66e598fc219bc0d3a705f7c5 +U dan +Z 37fc7c7d51dd1b501bcf4c294997ad5b diff --git a/manifest.uuid b/manifest.uuid index 36be5092b5..1ce79dbf1f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a7126a4f4fb4e3e25be95d673323f835252bb2b427469616046a90b2acf64071 \ No newline at end of file +5b7d0c784e6467154d9549af0163d788b69d5e5a6478a735834cdea945e7dbb7 \ No newline at end of file diff --git a/test/permutations.test b/test/permutations.test index bb522f0b73..ab4f9a434f 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -966,7 +966,7 @@ test_suite "journaltest" -description { async4.test bigfile.test backcompat.test e_wal* fstat.test mmap2.test pager1.test syscall.test tkt3457.test *malloc* mmap* multiplex* nolock* pager2.test *fault* rowal* snapshot* superlock* symlink.test - delete_db.test + delete_db.test shmlock.test }] if {[info commands register_demovfs] != ""} { From ccfa550922549e75e68a0e2b3ea862cdbb391e45 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 22 Jan 2019 21:17:40 +0000 Subject: [PATCH 117/306] Fix a buffer overrun that could occur in fts5 if a prefix query is made on a corrupt database. FossilOrigin-Name: 1abc4415648e69362061e9f9a4f2c1d419ba33801999b377650d8b9a4d2d3a7c --- ext/fts5/fts5.h | 8 +- ext/fts5/fts5Int.h | 2 +- ext/fts5/fts5_index.c | 2 +- ext/fts5/fts5_main.c | 5 + ext/fts5/test/fts5corrupt3.test | 217 ++++++++++++++++++++++++++++++++ manifest | 20 +-- manifest.uuid | 2 +- 7 files changed, 237 insertions(+), 19 deletions(-) diff --git a/ext/fts5/fts5.h b/ext/fts5/fts5.h index 8273785b15..f0b7d558dd 100644 --- a/ext/fts5/fts5.h +++ b/ext/fts5/fts5.h @@ -120,12 +120,8 @@ struct Fts5PhraseIter { ** ** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. The exception is if the table was created -** with the offsets=0 option specified. In this case *piOff is always -** set to -1. -** -** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) -** if an error occurs. +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 4855abe5b2..629bcf062a 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -274,7 +274,7 @@ void sqlite3Fts5Put32(u8*, int); int sqlite3Fts5Get32(const u8*); #define FTS5_POS2COLUMN(iPos) (int)(iPos >> 32) -#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0xFFFFFFFF) +#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0x7FFFFFFF) typedef struct Fts5PoslistReader Fts5PoslistReader; struct Fts5PoslistReader { diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 66ab9be4df..165d094009 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5122,7 +5122,7 @@ static void fts5SetupPrefixIter( } fts5MultiIterFree(p1); - pData = fts5IdxMalloc(p, sizeof(Fts5Data) + doclist.n); + pData = fts5IdxMalloc(p, sizeof(Fts5Data)+doclist.n+FTS5_DATA_ZERO_PADDING); if( pData ){ pData->p = (u8*)&pData[1]; pData->nn = pData->szLeaf = doclist.n; diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index bb342344d4..c98df4f469 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1777,6 +1777,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ int rc = SQLITE_OK; Fts5PoslistReader *aIter; /* One iterator for each phrase */ int nIter; /* Number of iterators/phrases */ + int nCol = ((Fts5Table*)pCsr->base.pVtab)->pConfig->nCol; nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); if( pCsr->aInstIter==0 ){ @@ -1830,6 +1831,10 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ aInst[0] = iBest; aInst[1] = FTS5_POS2COLUMN(aIter[iBest].iPos); aInst[2] = FTS5_POS2OFFSET(aIter[iBest].iPos); + if( aInst[1]<0 || aInst[1]>=nCol ){ + rc = FTS5_CORRUPT; + break; + } sqlite3Fts5PoslistReaderNext(&aIter[iBest]); } } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index cb30a45b15..5c88399c0a 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -4679,6 +4679,223 @@ do_catchsql_test 38.4 { SELECT * FROM t1('a b') ORDER BY rank; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 38.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-fd2a1313e5b5e9.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 b8 31 5f 63 6f 6e 74 !...table.1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 01 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 ec 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 01 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 60 35 30 30 30 30 MAX 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 44 4d 4f 52 59 3d 35 30 30 30 .MAX MDMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 16 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 05 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 10 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 05 f1 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-fd2a1313e5b5e9.db +}]} {} + +do_catchsql_test 38.1 { + UPDATE t1 SET b=quote(zeroblob(200)) WHERE t1 MATCH 'thread*'; +} {1 {database disk image is malformed}} diff --git a/manifest b/manifest index 171771983c..d7e5761310 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\srun\sshmlock.test\sas\spart\sof\sthe\sjournaltest\spermutation. -D 2019-01-22T20:18:29.964 +C Fix\sa\sbuffer\soverrun\sthat\scould\soccur\sin\sfts5\sif\sa\sprefix\squery\sis\smade\son\sa\scorrupt\sdatabase. +D 2019-01-22T21:17:40.002 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -108,15 +108,15 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 F ext/fts3/unicode/mkunicode.tcl 49499f7964504438e2b04cca0627827945bb2499154e2d3ec216b22d20b969ae F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h 4f5d19b7973dae23de368728f06d3eb1fe9f5cca2990366b40e9379996f35e61 -F ext/fts5/fts5Int.h 28a99786582ef2a49db6be8eead420ad4d16fbb6635560ded2455628686a1ba9 +F ext/fts5/fts5.h fed314270c1a61de3a0e373b11c2f8228b1c76ce59447dd96d0b6fae7d66399b +F ext/fts5/fts5Int.h 9db5f02e2b33b289275f95720f3dc65bb323e55971a932361b26ee497c710e0c F ext/fts5/fts5_aux.c c93e943a172de7ac20547158f4eb1fc7729e6807883c71a1cc5be96fa157d69b F ext/fts5/fts5_buffer.c 61f48c4921461dcd3b101eadf2c9e5641dbe7e6470bc60252bee2e42e70ef638 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 53e064ad16036993ce9b2db77ba7e47f7a9a921b142091c268d5146caebd237a -F ext/fts5/fts5_main.c 4a7ebaa5a23e932289355c05fbfc0f5b99d8d087e2f4c9e7b7a723c7b8ac9f02 +F ext/fts5/fts5_index.c ae896f5994d9ff99a5c0b3e2037c23b978553b4b509e25b5e1d96169192fc38e +F ext/fts5/fts5_main.c df4ba0a9d879de50f59662abc081209fe7a5eec87f1338e0462beeeba7830585 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test b9ca1b79300cbc655b998188464774214bf003b7994338acb421fe8b3cff0975 +F ext/fts5/test/fts5corrupt3.test 1bdb1c689e2200e3f4dfe08ee4e19479c2afc0954e1f4fbeab994ee9138f4da5 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1801,7 +1801,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 a7126a4f4fb4e3e25be95d673323f835252bb2b427469616046a90b2acf64071 -R c630cbdb66e598fc219bc0d3a705f7c5 +P 5b7d0c784e6467154d9549af0163d788b69d5e5a6478a735834cdea945e7dbb7 +R d7e93766809bcec9daa4ddc60a83b397 U dan -Z 37fc7c7d51dd1b501bcf4c294997ad5b +Z 02fdab69cf41a0a31460ea7596c7743c diff --git a/manifest.uuid b/manifest.uuid index 1ce79dbf1f..2c1ad98d03 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b7d0c784e6467154d9549af0163d788b69d5e5a6478a735834cdea945e7dbb7 \ No newline at end of file +1abc4415648e69362061e9f9a4f2c1d419ba33801999b377650d8b9a4d2d3a7c \ No newline at end of file From 4c7bdd159755ab03afff1825def5e7b88ac1ed4b Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 23 Jan 2019 12:19:22 +0000 Subject: [PATCH 118/306] Fix a buffer overwrite triggered by a prefix query on a corrupt fts5 table. FossilOrigin-Name: 1d8172a94bce2d067027685e5aa1dc8f5d5d55b5da0832ad2836f6939de68c8f --- ext/fts5/fts5_buffer.c | 2 +- ext/fts5/fts5_index.c | 1 + ext/fts5/test/fts5corrupt3.test | 218 +++++++++++++++++++++++++++++++- manifest | 16 +-- manifest.uuid | 2 +- 5 files changed, 228 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index 90d9f20336..61eb105fe7 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -183,7 +183,7 @@ int sqlite3Fts5PoslistNext64( iOff = ((i64)iVal) << 32; fts5FastGetVarint32(a, i, iVal); } - *piOff = iOff + (iVal-2); + *piOff = iOff + ((iVal-2) & 0x7FFFFFFF); *pi = i; return 0; } diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 165d094009..57fce0a7bd 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5021,6 +5021,7 @@ static void fts5MergePrefixLists( fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n); fts5DoclistIterNext(&i1); fts5DoclistIterNext(&i2); + assert( out.n<=(p1->n+p2->n+9) ); if( i1.aPoslist==0 || i2.aPoslist==0 ) break; } } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 5c88399c0a..1181330dcc 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -4895,8 +4895,224 @@ do_test 38.0 { do_catchsql_test 38.1 { UPDATE t1 SET b=quote(zeroblob(200)) WHERE t1 MATCH 'thread*'; -} {1 {database disk image is malformed}} +} {0 {}} +#------------------------------------------------------------------------- +reset_db +do_test 39.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash-e650fe95502908.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 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........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 32 2c 32 2c 33 ,b,prefix=.2,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 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 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: 80 80 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 ff 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: 80 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 00 f1 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 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 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 14 2a 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 16 00 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 30 00 00 00 11 02 01 .........0...... +| 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 0e 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: 00 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 02 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 00 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 81 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 61 80 80 80 11 03 00 3c 00 00 ......a......<.. +| 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 03 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 71 .......6.....2tq +| 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 0b 89 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 80 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 f4 01 02 03 01 03 66 .....0eac......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 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 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 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 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 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 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: 05 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 2d .....2th......2- +| 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 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 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 03 ................ +| 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 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end crash-e650fe95502908.db +}]} {} + +do_execsql_test 39.1 { + SELECT rowid FROM t1('t*'); +} {1 2 3} sqlite3_fts5_may_be_corrupt 0 diff --git a/manifest b/manifest index d7e5761310..718ccc2854 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverrun\sthat\scould\soccur\sin\sfts5\sif\sa\sprefix\squery\sis\smade\son\sa\scorrupt\sdatabase. -D 2019-01-22T21:17:40.002 +C Fix\sa\sbuffer\soverwrite\striggered\sby\sa\sprefix\squery\son\sa\scorrupt\sfts5\stable. +D 2019-01-23T12:19:22.098 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -111,11 +111,11 @@ F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h fed314270c1a61de3a0e373b11c2f8228b1c76ce59447dd96d0b6fae7d66399b F ext/fts5/fts5Int.h 9db5f02e2b33b289275f95720f3dc65bb323e55971a932361b26ee497c710e0c F ext/fts5/fts5_aux.c c93e943a172de7ac20547158f4eb1fc7729e6807883c71a1cc5be96fa157d69b -F ext/fts5/fts5_buffer.c 61f48c4921461dcd3b101eadf2c9e5641dbe7e6470bc60252bee2e42e70ef638 +F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306fb9727046 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c ae896f5994d9ff99a5c0b3e2037c23b978553b4b509e25b5e1d96169192fc38e +F ext/fts5/fts5_index.c 13e7ef5686a95470a7d136f3ddcedbb59edc81388c032032cb691160bed3affd F ext/fts5/fts5_main.c df4ba0a9d879de50f59662abc081209fe7a5eec87f1338e0462beeeba7830585 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 1bdb1c689e2200e3f4dfe08ee4e19479c2afc0954e1f4fbeab994ee9138f4da5 +F ext/fts5/test/fts5corrupt3.test b86d644cad3b2a2b5886ec5e6cf9b80903cfe1f6458fe3422be6e79b93e0e790 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1801,7 +1801,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 5b7d0c784e6467154d9549af0163d788b69d5e5a6478a735834cdea945e7dbb7 -R d7e93766809bcec9daa4ddc60a83b397 +P 1abc4415648e69362061e9f9a4f2c1d419ba33801999b377650d8b9a4d2d3a7c +R 0baabbcf477468e2b69335f87d712e01 U dan -Z 02fdab69cf41a0a31460ea7596c7743c +Z 6522022d703f7d994429368b0b708ee0 diff --git a/manifest.uuid b/manifest.uuid index 2c1ad98d03..ab7ba3b1f1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1abc4415648e69362061e9f9a4f2c1d419ba33801999b377650d8b9a4d2d3a7c \ No newline at end of file +1d8172a94bce2d067027685e5aa1dc8f5d5d55b5da0832ad2836f6939de68c8f \ No newline at end of file From d99950310ff4477be8df292744e91d783897263e Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 23 Jan 2019 16:59:24 +0000 Subject: [PATCH 119/306] Fix problems with sub-selects in WINDOW definitions. Also rename-column operations when the column being renamed appears in a WINDOW definition that is part of a VIEW or TRIGGER. FossilOrigin-Name: 0387cb3add992b2028efe4f2100188d8f9fdfdcb233329857aa4b46a293cfc97 --- manifest | 21 ++++++++++---------- manifest.uuid | 2 +- src/expr.c | 1 + src/resolve.c | 13 ++++++++++++- src/walker.c | 29 ++++++++++++++++++++++++---- test/altertab2.test | 35 ++++++++++++++++++--------------- test/altertab3.test | 47 +++++++++++++++++++++++++++++++++++++++++++++ test/window1.test | 28 +++++++++++++++++++++++++++ 8 files changed, 144 insertions(+), 32 deletions(-) create mode 100644 test/altertab3.test diff --git a/manifest b/manifest index 718ccc2854..62302c0303 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverwrite\striggered\sby\sa\sprefix\squery\son\sa\scorrupt\sfts5\stable. -D 2019-01-23T12:19:22.098 +C Fix\sproblems\swith\ssub-selects\sin\sWINDOW\sdefinitions.\sAlso\srename-column\soperations\swhen\sthe\scolumn\sbeing\srenamed\sappears\sin\sa\sWINDOW\sdefinition\sthat\sis\spart\sof\sa\sVIEW\sor\sTRIGGER. +D 2019-01-23T16:59:24.350 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -466,7 +466,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 9c30765910bdff9d68ac580a4f2dc790da82308cb7798e57dc9e4bf5717d557c +F src/expr.c 4bc508644845d2c9fb870e808df125b233a8d93d132c2184f8db0a034864325a F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 @@ -512,7 +512,7 @@ F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 F src/prepare.c 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c a40867ce07a9b58121d6f9a8fc969555d3c9bdcb6c2b5fc202670815af8dbd91 +F src/resolve.c 12fca5d0b5474ae42e7c32e9f631a4937ac065ab755c56d7636857c376dd2057 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c f7260c833c87c52ac187bc160ccc675a67d5a226cacd7eb1cdcb3c3ff25bde76 F src/shell.c.in 58f69c9143d9635a3d71a32c3d4cb6fad4de4f0ca400c098fa76ff83e3ec58cb @@ -598,7 +598,7 @@ F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 +F src/walker.c ec63d6e2857a542523bcc1472e9817c4da003f4c450ea4885f6e41b4b577a64a F src/where.c c5d201699d03be61c35bc04b96e481b1c8dc68177617ca1db156ef7409da2fae F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 @@ -622,7 +622,8 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a -F test/altertab2.test 2465aac70cedb14335a45e39fef9f7118e4726b6cb1614db36cba014f63bdec2 +F test/altertab2.test 7bedde2e6e71fdecd7a2af64b696cd0b3d3a344f5cf1db6785d9e3b5665193cf +F test/altertab3.test b27923ad48b05f70364ddd8f4bdb6ee5e411e13d23badb74ccff048648b11986 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1672,7 +1673,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 9003bb759662f905ef5a34fb9305016edf0fe506e961e5e570b6487f8b2b7cd0 +F test/window1.test 2798c8249e0f122c9bacce6aa7324765a5cd9106e49e7aacc81f6033d281577b F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 @@ -1801,7 +1802,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 1abc4415648e69362061e9f9a4f2c1d419ba33801999b377650d8b9a4d2d3a7c -R 0baabbcf477468e2b69335f87d712e01 +P 1d8172a94bce2d067027685e5aa1dc8f5d5d55b5da0832ad2836f6939de68c8f +R 6c9c2637612c06986c005a8ea0b9a370 U dan -Z 6522022d703f7d994429368b0b708ee0 +Z 6cff79c887bd13174b7d97ad18aec26e diff --git a/manifest.uuid b/manifest.uuid index ab7ba3b1f1..5af7758155 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1d8172a94bce2d067027685e5aa1dc8f5d5d55b5da0832ad2836f6939de68c8f \ No newline at end of file +0387cb3add992b2028efe4f2100188d8f9fdfdcb233329857aa4b46a293cfc97 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index bdb925f01c..ec71326e45 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5366,6 +5366,7 @@ void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ w.xSelectCallback2 = analyzeAggregatesInSelectEnd; w.walkerDepth = 0; w.u.pNC = pNC; + w.pParse = 0; assert( pNC->pSrcList!=0 ); sqlite3WalkExpr(&w, pExpr); } diff --git a/src/resolve.c b/src/resolve.c index da2febb1fe..b2da946a94 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -858,10 +858,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #ifndef SQLITE_OMIT_WINDOWFUNC if( pExpr->y.pWin ){ Select *pSel = pNC->pWinSelect; + sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); sqlite3WalkExprList(pWalker, pExpr->y.pWin->pPartition); sqlite3WalkExprList(pWalker, pExpr->y.pWin->pOrderBy); sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); - sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); if( 0==pSel->pWin || 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->y.pWin) ){ @@ -1536,6 +1536,17 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } + if( IN_RENAME_OBJECT ){ + Window *pWin; + for(pWin=p->pWinDefn; pWin; pWin=pWin->pNextWin){ + if( sqlite3ResolveExprListNames(&sNC, pWin->pOrderBy) + || sqlite3ResolveExprListNames(&sNC, pWin->pPartition) + ){ + return WRC_Abort; + } + } + } + /* If this is part of a compound SELECT, check that it has the right ** number of expressions in the select list. */ if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ diff --git a/src/walker.c b/src/walker.c index c31d94f0bf..4950c8d4b0 100644 --- a/src/walker.c +++ b/src/walker.c @@ -17,6 +17,22 @@ #include +#if !defined(SQLITE_OMIT_WINDOWFUNC) +/* +** Walk all expressions linked into the list of Window objects passed +** as the second argument. +*/ +static int walkWindowList(Walker *pWalker, Window *pList){ + Window *pWin; + for(pWin=pList; pWin; pWin=pWin->pNextWin){ + if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; + } + return WRC_Continue; +} +#endif + /* ** Walk an expression tree. Invoke the callback once for each node ** of the expression, while descending. (In other words, the callback @@ -56,10 +72,7 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ } #ifndef SQLITE_OMIT_WINDOWFUNC if( ExprHasProperty(pExpr, EP_WinFunc) ){ - Window *pWin = pExpr->y.pWin; - if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; - if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; - if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; + if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; } #endif } @@ -99,6 +112,14 @@ int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; +#if !defined(SQLITE_OMIT_WINDOWFUNC) && !defined(SQLITE_OMIT_ALTERTABLE) + { + Parse *pParse = pWalker->pParse; + if( pParse && IN_RENAME_OBJECT ){ + if( walkWindowList(pWalker, p->pWinDefn) ) return WRC_Abort; + } + } +#endif return WRC_Continue; } diff --git a/test/altertab2.test b/test/altertab2.test index df395e1d18..be55de9ee6 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -182,33 +182,35 @@ do_execsql_test 4.3 { do_execsql_test 5.0 { CREATE TABLE t2(a); CREATE TRIGGER r2 AFTER INSERT ON t2 WHEN new.a NOT NULL BEGIN - SELECT a, rank() OVER w1 FROM t2 + SELECT a, sum(a) OVER w1 FROM t2 WINDOW w1 AS ( - PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING + PARTITION BY a ORDER BY a + ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING ), w2 AS ( - PARTITION BY b - ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + PARTITION BY a + ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ); END; } {} -do_catchsql_test 5.0.1 { +do_execsql_test 5.0.1 { INSERT INTO t2 VALUES(1); -} {1 {no such column: b}} +} {} do_execsql_test 5.1 { ALTER TABLE t2 RENAME TO t2x; SELECT sql FROM sqlite_master WHERE name = 'r2'; } { {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.a NOT NULL BEGIN - SELECT a, rank() OVER w1 FROM "t2x" + SELECT a, sum(a) OVER w1 FROM "t2x" WINDOW w1 AS ( - PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING + PARTITION BY a ORDER BY a + ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING ), w2 AS ( - PARTITION BY b - ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + PARTITION BY a + ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ); END} } @@ -218,20 +220,21 @@ do_execsql_test 5.2 { SELECT sql FROM sqlite_master WHERE name = 'r2'; } { {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.aaaa NOT NULL BEGIN - SELECT aaaa, rank() OVER w1 FROM "t2x" + SELECT aaaa, sum(aaaa) OVER w1 FROM "t2x" WINDOW w1 AS ( - PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING + PARTITION BY aaaa ORDER BY aaaa + ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING ), w2 AS ( - PARTITION BY b - ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + PARTITION BY aaaa + ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ); END} } -do_catchsql_test 5.3 { +do_execsql_test 5.3 { INSERT INTO t2x VALUES(1); -} {1 {no such column: b}} +} {} #------------------------------------------------------------------------- diff --git a/test/altertab3.test b/test/altertab3.test new file mode 100644 index 0000000000..9a5c92eccf --- /dev/null +++ b/test/altertab3.test @@ -0,0 +1,47 @@ +# 2019 January 23 +# +# 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. +# +#************************************************************************* +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix altertab3 + +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b); + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY a); + END; +} + +do_execsql_test 1.1 { + ALTER TABLE t1 RENAME a TO aaa; +} + +do_execsql_test 1.2 { + SELECT sql FROM sqlite_master WHERE name='tr1' +} {{CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY aaa); + END}} + +do_execsql_test 1.3 { + INSERT INTO t1 VALUES(1, 2); +} + + +finish_test + + diff --git a/test/window1.test b/test/window1.test index 463c2b59f0..2c504205e5 100644 --- a/test/window1.test +++ b/test/window1.test @@ -673,4 +673,32 @@ do_execsql_test 15.2 { ) x WHERE x+x; } {} +#------------------------------------------------------------------------- + +do_execsql_test 16.0 { + CREATE TABLE t7(a,b); + INSERT INTO t7(rowid, a, b) VALUES + (1, 1, 3), + (2, 10, 4), + (3, 100, 2); +} + +do_execsql_test 16.1 { + SELECT rowid, sum(a) OVER (PARTITION BY b IN (SELECT rowid FROM t7)) FROM t7; +} { + 2 10 + 1 101 + 3 101 +} + +do_execsql_test 16.2 { + SELECT rowid, sum(a) OVER w1 FROM t7 + WINDOW w1 AS (PARTITION BY b IN (SELECT rowid FROM t7)); +} { + 2 10 + 1 101 + 3 101 +} + + finish_test From f8f47dd8c5d3f9c06789bb8cfbf73348c830a973 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 23 Jan 2019 19:17:05 +0000 Subject: [PATCH 120/306] Fix another fts5 crash that can occur if the database is corrupted. FossilOrigin-Name: 44ce8baa47192be03c8f11777904c3c07fa5cc5c97b6d8e81572d380995ac688 --- ext/fts5/fts5_index.c | 58 +++++---- ext/fts5/test/fts5corrupt3.test | 224 ++++++++++++++++++++++++++++++++ manifest | 14 +- manifest.uuid | 2 +- 4 files changed, 265 insertions(+), 33 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 57fce0a7bd..eced245baa 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4127,7 +4127,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ int i; Fts5Buffer buf; memset(&buf, 0, sizeof(Fts5Buffer)); - for(i=0; inSeg; i++){ + for(i=0; inSeg && p->rc==SQLITE_OK; i++){ Fts5SegIter *pSeg = &pIter->aSeg[i]; if( pSeg->pSeg==0 ){ /* no-op */ @@ -4147,33 +4147,41 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ iLeafRowid = FTS5_SEGMENT_ROWID(iId, pSeg->iTermLeafPgno); pData = fts5DataRead(p, iLeafRowid); if( pData ){ - fts5BufferZero(&buf); - fts5BufferGrow(&p->rc, &buf, pData->nn); - fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); - fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); - fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); - fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff, &pData->p[iOff]); - if( p->rc==SQLITE_OK ){ - /* Set the szLeaf field */ - fts5PutU16(&buf.p[2], (u16)buf.n); - } + if( iOff>pData->szLeaf ){ + /* This can occur if the pages that the segments occupy overlap - if + ** a single page has been assigned to more than one segment. In + ** this case a prior iteration of this loop may have corrupted the + ** segment currently being trimmed. */ + p->rc = FTS5_CORRUPT; + }else{ + fts5BufferZero(&buf); + fts5BufferGrow(&p->rc, &buf, pData->nn); + fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); + fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); + fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff,&pData->p[iOff]); + if( p->rc==SQLITE_OK ){ + /* Set the szLeaf field */ + fts5PutU16(&buf.p[2], (u16)buf.n); + } - /* Set up the new page-index array */ - fts5BufferAppendVarint(&p->rc, &buf, 4); - if( pSeg->iLeafPgno==pSeg->iTermLeafPgno - && pSeg->iEndofDoclistszLeaf - ){ - int nDiff = pData->szLeaf - pSeg->iEndofDoclist; - fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); - fts5BufferAppendBlob(&p->rc, &buf, - pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] - ); - } + /* Set up the new page-index array */ + fts5BufferAppendVarint(&p->rc, &buf, 4); + if( pSeg->iLeafPgno==pSeg->iTermLeafPgno + && pSeg->iEndofDoclistszLeaf + ){ + int nDiff = pData->szLeaf - pSeg->iEndofDoclist; + fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); + fts5BufferAppendBlob(&p->rc, &buf, + pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] + ); + } + pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; + fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); + fts5DataWrite(p, iLeafRowid, buf.p, buf.n); + } fts5DataRelease(pData); - pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; - fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); - fts5DataWrite(p, iLeafRowid, buf.p, buf.n); } } } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 1181330dcc..61208d6c97 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -5114,6 +5114,230 @@ do_execsql_test 39.1 { SELECT rowid FROM t1('t*'); } {1 2 3} +#------------------------------------------------------------------------- +reset_db +do_test 40.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash2.txt.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 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 52 6c 65 (a)V.......taRle +| 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 73 73 !...tablet1_doss +| 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 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........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 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 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 75 73 34 03 02 02 01 04 6e .....4fus4.....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 05 62 03 04 0a 19 8c 80 80 ....tab.b....... +| 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: 80 80 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 ff 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: 80 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 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 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 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 11 03 00 16 00 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 30 00 00 00 11 02 01 .........0...... +| 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 0e 03 00 3c 00 00 00 16 02 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: 00 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 02 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 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 06 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 03 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 00 01 05 04 15 84 80 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 10 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: bd 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 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 05 52 08 04 01 ...0n.......R... +| 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 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 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 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 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 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 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 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end crash2.txt.db +}]} {} + +do_execsql_test 40.1 { + BEGIN; + INSERT INTO t1(b) VALUES(X'819192e578de3fa24af3733ca8769291a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bf'); + INSERT INTO t1(b) VALUES(X'c8ae0d0e7c3175946e62ba2b449511d4eb504079984a20f77969f62206c9f3d7ea25358ab705e6978627290b6d48db9032f815a06a79a4f4b809841a0942eed12954ed166f666111812a508abc3bec87958846edaec0a6fe14564bc0a4b78f1c35ebcacca6bae29cc37ae9b59d8a2d7593af1e47dda0ece2268a98d20febafad037964f139851f9a57f48b3706b01721769071991412044cd6006f1d72eb6eb4aa5ad77e378176db8c15575fbeee47165e38a7c6c5a557ac2dfe11813976eaf6741cf593a9e457053a3c34cddfbe605a6e25419f993de8374fafcd3636509d8416a51dc7bcc14cfca322ae343078f47e23522431c17d0da0c033'); + INSERT INTO t1(b) VALUES(X'dc29a94e873a45a4243fce9b912aaefbadf1d0423e0345793874b356eeb500b92fb05284c1601fe9bad3143f72162f10242cec27c44ebf764c8fc9fb0824e32c4161472a4f914f579e0e8274f08ca1a02e59b9d8eec1f31061f9ccb9ed97a6f06534e991f7992c761489e6a7724f6e9c2b581e77487ded3a986d53c4419bbd3e9747cee300e670dd7294874c77e2ed48da68eaa6c3ec954a09ac410493d98e34d6686e54fbbe80696705f10e040c66093efb40746b33600685c94c664c7942835a9e954866121d5dcfb2cb12e92521ea3df175ee17072502dad9b9c1565f801b2179799011eb7418bfa00323e3157589e648ff7378be233c79b7'); +} + +do_catchsql_test 40.2 { + INSERT INTO t1(a,b) VALUES(1,11),(2,22),(3, true ),(4,44); +} {1 {database disk image is malformed}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 62302c0303..6fc6f50116 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\swith\ssub-selects\sin\sWINDOW\sdefinitions.\sAlso\srename-column\soperations\swhen\sthe\scolumn\sbeing\srenamed\sappears\sin\sa\sWINDOW\sdefinition\sthat\sis\spart\sof\sa\sVIEW\sor\sTRIGGER. -D 2019-01-23T16:59:24.350 +C Fix\sanother\sfts5\scrash\sthat\scan\soccur\sif\sthe\sdatabase\sis\scorrupted. +D 2019-01-23T19:17:05.201 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 13e7ef5686a95470a7d136f3ddcedbb59edc81388c032032cb691160bed3affd +F ext/fts5/fts5_index.c 9f2eaae470461015ce175e8616c8b601e73b9bfc26e7d83afea1ec5242b3d0f8 F ext/fts5/fts5_main.c df4ba0a9d879de50f59662abc081209fe7a5eec87f1338e0462beeeba7830585 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test b86d644cad3b2a2b5886ec5e6cf9b80903cfe1f6458fe3422be6e79b93e0e790 +F ext/fts5/test/fts5corrupt3.test 0ca5b954f4b5498ca4850d2458f809c45ca4d1d4f936428a64bc046795761391 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1802,7 +1802,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 1d8172a94bce2d067027685e5aa1dc8f5d5d55b5da0832ad2836f6939de68c8f -R 6c9c2637612c06986c005a8ea0b9a370 +P 0387cb3add992b2028efe4f2100188d8f9fdfdcb233329857aa4b46a293cfc97 +R f2949632b0c8dd6250b3de3ff30ae3f1 U dan -Z 6cff79c887bd13174b7d97ad18aec26e +Z 76fed8aa680544a51accd6f3b00ea74a diff --git a/manifest.uuid b/manifest.uuid index 5af7758155..4fc7fe89f9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0387cb3add992b2028efe4f2100188d8f9fdfdcb233329857aa4b46a293cfc97 \ No newline at end of file +44ce8baa47192be03c8f11777904c3c07fa5cc5c97b6d8e81572d380995ac688 \ No newline at end of file From e3dadac591ff43340db5421af23d05457fee4688 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Jan 2019 19:25:59 +0000 Subject: [PATCH 121/306] Stricter enforcement of cell sizes when doing balancing operations on the btree, in order to catch file corruption sooner. FossilOrigin-Name: 12713f320b2c1def273dd8b7833dddaaad5331aba779d4b1ec9aa949814f38fe --- manifest | 14 ++-- manifest.uuid | 2 +- src/btree.c | 204 +++++++++++++++++++++++++++++++++++++------------- 3 files changed, 161 insertions(+), 59 deletions(-) diff --git a/manifest b/manifest index 6fc6f50116..571862ca07 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sfts5\scrash\sthat\scan\soccur\sif\sthe\sdatabase\sis\scorrupted. -D 2019-01-23T19:17:05.201 +C Stricter\senforcement\sof\scell\ssizes\swhen\sdoing\sbalancing\soperations\son\sthe\nbtree,\sin\sorder\sto\scatch\sfile\scorruption\ssooner. +D 2019-01-23T19:25:59.893 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 315ccbc0d23ec50c4b65c35bc64ff89f20575ab25a5605a01ae726461ba5dc6f +F src/btree.c 60fa67e135492b83c78517502cdd64dd1028da3fb5958cc130d94ba75f140b55 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc @@ -1802,7 +1802,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 0387cb3add992b2028efe4f2100188d8f9fdfdcb233329857aa4b46a293cfc97 -R f2949632b0c8dd6250b3de3ff30ae3f1 -U dan -Z 76fed8aa680544a51accd6f3b00ea74a +P 44ce8baa47192be03c8f11777904c3c07fa5cc5c97b6d8e81572d380995ac688 +R 394e54d0902bcab8f75c7f1ab86066f4 +U drh +Z 2303e2a69753b4d3e54ffe2a91200226 diff --git a/manifest.uuid b/manifest.uuid index 4fc7fe89f9..bfd0254909 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -44ce8baa47192be03c8f11777904c3c07fa5cc5c97b6d8e81572d380995ac688 \ No newline at end of file +12713f320b2c1def273dd8b7833dddaaad5331aba779d4b1ec9aa949814f38fe \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index c42f80f70d..83b50f2529 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6693,9 +6693,72 @@ static void insertCell( } } +/* +** The following parameters determine how many adjacent pages get involved +** in a balancing operation. NN is the number of neighbors on either side +** of the page that participate in the balancing operation. NB is the +** total number of pages that participate, including the target page and +** NN neighbors on either side. +** +** The minimum value of NN is 1 (of course). Increasing NN above 1 +** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance +** in exchange for a larger degradation in INSERT and UPDATE performance. +** The value of NN appears to give the best results overall. +** +** (Later:) The description above makes it seem as if these values are +** tunable - as if you could change them and recompile and it would all work. +** But that is unlikely. NB has been 3 since the inception of SQLite and +** we have never tested any other value. +*/ +#define NN 1 /* Number of neighbors on either side of pPage */ +#define NB 3 /* (NN*2+1): Total pages involved in the balance */ + /* ** A CellArray object contains a cache of pointers and sizes for a ** consecutive sequence of cells that might be held on multiple pages. +** +** The cells in this array are the divider cell or cells from the pParent +** page plus up to three child pages. There are a total of nCell cells. +** +** pRef is a pointer to one of the pages that contributes cells. This is +** used to access information such as MemPage.intKey and MemPage.pBt->pageSize +** which should be common to all pages that contribute cells to this array. +** +** apCell[] and szCell[] hold, respectively, pointers to the start of each +** cell and the size of each cell. Some of the apCell[] pointers might refer +** to overflow cells. In other words, some apCel[] pointers might not point +** to content area of the pages. +** +** A szCell[] of zero means the size of that cell has not yet been computed. +** +** The cells come from as many as four different pages: +** +** ----------- +** | Parent | +** ----------- +** / | \ +** / | \ +** --------- --------- --------- +** |Child-1| |Child-2| |Child-3| +** --------- --------- --------- +** +** The order of cells is in the array is: +** +** 1. All cells from Child-1 in order +** 2. The first divider cell from Parent +** 3. All cells from Child-2 in order +** 4. The second divider cell from Parent +** 5. All cells from Child-3 in order +** +** The apEnd[] array holds pointer to the end of page for Child-1, the +** Parent, Child-2, the Parent (again), and Child-3. The ixNx[] array +** holds the number of cells contained in each of these 5 stages, and +** all stages to the left. Hence: +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 plus 1 for first divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells +** ixNx[4] = Total number of cells. */ typedef struct CellArray CellArray; struct CellArray { @@ -6703,6 +6766,8 @@ struct CellArray { MemPage *pRef; /* Reference page */ u8 **apCell; /* All cells begin balanced */ u16 *szCell; /* Local size of all cells in apCell[] */ + u8 *apEnd[NB*2]; /* MemPage.aDataEnd values */ + int ixNx[NB*2]; /* Index of at which we move to the next apEnd[] */ }; /* @@ -6753,37 +6818,58 @@ static u16 cachedCellSize(CellArray *p, int N){ ** responsibility of the caller to set it correctly. */ static int rebuildPage( - MemPage *pPg, /* Edit this page */ + CellArray *pCArray, /* Content to be added to page pPg */ + int iFirst, /* First cell in pCArray to use */ int nCell, /* Final number of cells on page */ - u8 **apCell, /* Array of cells */ - u16 *szCell /* Array of cell sizes */ + MemPage *pPg /* The page to be reconstructed */ ){ const int hdr = pPg->hdrOffset; /* Offset of header on pPg */ u8 * const aData = pPg->aData; /* Pointer to data for pPg */ const int usableSize = pPg->pBt->usableSize; u8 * const pEnd = &aData[usableSize]; - int i; + int i = iFirst; /* Which cell to copy from pCArray*/ + int j; /* Start of cell content area */ + int iEnd = i+nCell; /* Loop terminator */ u8 *pCellptr = pPg->aCellIdx; u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); u8 *pData; + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pSrcEnd; /* Current pCArray->apEnd[k] value */ - i = get2byte(&aData[hdr+5]); - memcpy(&pTmp[i], &aData[i], usableSize - i); + assert( iixNx[k]<=i && ALWAYS(kapEnd[k]; pData = pEnd; - for(i=0; iapCell[i]; + u16 sz = pCArray->szCell[i]; + assert( sz>0 ); if( SQLITE_WITHIN(pCell,aData,pEnd) ){ - if( ((uptr)(pCell+szCell[i]))>(uptr)pEnd ) return SQLITE_CORRUPT_BKPT; + if( ((uptr)(pCell+sz))>(uptr)pEnd ) return SQLITE_CORRUPT_BKPT; pCell = &pTmp[pCell - aData]; + }else if( (uptr)(pCell+sz)>(uptr)pSrcEnd + && (uptr)(pCell)<(uptr)pSrcEnd + ){ + return SQLITE_CORRUPT_BKPT; } - pData -= szCell[i]; + + pData -= sz; put2byte(pCellptr, (pData - aData)); pCellptr += 2; if( pData < pCellptr ) return SQLITE_CORRUPT_BKPT; - memcpy(pData, pCell, szCell[i]); - assert( szCell[i]==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); - testcase( szCell[i]!=pPg->xCellSize(pPg,pCell) ); + memcpy(pData, pCell, sz); + assert( sz==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + testcase( sz!=pPg->xCellSize(pPg,pCell) ); + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pSrcEnd = pCArray->apEnd[k]; + } } /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ @@ -6798,12 +6884,11 @@ static int rebuildPage( } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function attempts to -** add the cells stored in the array to page pPg. If it cannot (because -** the page needs to be defragmented before the cells will fit), non-zero -** is returned. Otherwise, if the cells are added successfully, zero is -** returned. +** The pCArray objects contains pointers to b-tree cells and the cell sizes. +** This function attempts to add the cells stored in the array to page pPg. +** If it cannot (because the page needs to be defragmented before the cells +** will fit), non-zero is returned. Otherwise, if the cells are added +** successfully, zero is returned. ** ** Argument pCellptr points to the first entry in the cell-pointer array ** (part of page pPg) to populate. After cell apCell[0] is written to the @@ -6825,18 +6910,23 @@ static int rebuildPage( static int pageInsertArray( MemPage *pPg, /* Page to add cells to */ u8 *pBegin, /* End of cell-pointer array */ - u8 **ppData, /* IN/OUT: Page content -area pointer */ + u8 **ppData, /* IN/OUT: Page content-area pointer */ u8 *pCellptr, /* Pointer to cell-pointer area */ int iFirst, /* Index of first cell to add */ int nCell, /* Number of cells to add to pPg */ CellArray *pCArray /* Array of cells */ ){ - int i; - u8 *aData = pPg->aData; - u8 *pData = *ppData; - int iEnd = iFirst + nCell; + int i = iFirst; /* Loop counter - cell index to insert */ + u8 *aData = pPg->aData; /* Complete page */ + u8 *pData = *ppData; /* Content area. A subset of aData[] */ + int iEnd = iFirst + nCell; /* End of loop. One past last cell to ins */ + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pEnd; /* Maximum extent of cell data */ assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ - for(i=iFirst; iixNx[k]<=i && ALWAYS(kapEnd[k]; + while( 1 /*Exit by break*/ ){ int sz, rc; u8 *pSlot; sz = cachedCellSize(pCArray, i); @@ -6851,20 +6941,33 @@ static int pageInsertArray( assert( (pSlot+sz)<=pCArray->apCell[i] || pSlot>=(pCArray->apCell[i]+sz) || CORRUPT_DB ); + if( (uptr)(pCArray->apCell[i]+sz)>(uptr)pEnd + && (uptr)(pCArray->apCell[i])<(uptr)pEnd + ){ + assert( CORRUPT_DB ); + (void)SQLITE_CORRUPT_BKPT; + return 1; + } memmove(pSlot, pCArray->apCell[i], sz); put2byte(pCellptr, (pSlot - aData)); pCellptr += 2; + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pEnd = pCArray->apEnd[k]; + } } *ppData = pData; return 0; } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function adds the -** space associated with each cell in the array that is currently stored -** within the body of pPg to the pPg free-list. The cell-pointers and other -** fields of the page are not updated. +** The pCArray object contains pointers to b-tree cells and their sizes. +** +** This function adds the space associated with each cell in the array +** that is currently stored within the body of pPg to the pPg free-list. +** The cell-pointers and other fields of the page are not updated. ** ** This function returns the total number of cells added to the free-list. */ @@ -6914,9 +7017,9 @@ static int pageFreeArray( } /* -** apCell[] and szCell[] contains pointers to and sizes of all cells in the -** pages being balanced. The current page, pPg, has pPg->nCell cells starting -** with apCell[iOld]. After balancing, this page should hold nNew cells +** pCArray contains pointers to and sizes of all cells in the pages being +** balanced. The current page, pPg, has pPg->nCell cells starting with +** pCArray->apCell[iOld]. After balancing, this page should hold nNew cells ** starting at apCell[iNew]. ** ** This routine makes the necessary adjustments to pPg so that it contains @@ -7016,24 +7119,9 @@ static int editPage( editpage_fail: /* Unable to edit this page. Rebuild it from scratch instead. */ populateCellCache(pCArray, iNew, nNew); - return rebuildPage(pPg, nNew, &pCArray->apCell[iNew], &pCArray->szCell[iNew]); + return rebuildPage(pCArray, iNew, nNew, pPg); } -/* -** The following parameters determine how many adjacent pages get involved -** in a balancing operation. NN is the number of neighbors on either side -** of the page that participate in the balancing operation. NB is the -** total number of pages that participate, including the target page and -** NN neighbors on either side. -** -** The minimum value of NN is 1 (of course). Increasing NN above 1 -** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance -** in exchange for a larger degradation in INSERT and UPDATE performance. -** The value of NN appears to give the best results overall. -*/ -#define NN 1 /* Number of neighbors on either side of pPage */ -#define NB (NN*2+1) /* Total pages involved in the balance */ - #ifndef SQLITE_OMIT_QUICKBALANCE /* @@ -7083,12 +7171,22 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ u8 *pCell = pPage->apOvfl[0]; u16 szCell = pPage->xCellSize(pPage, pCell); u8 *pStop; + CellArray b; assert( sqlite3PagerIswriteable(pNew->pDbPage) ); assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); - rc = rebuildPage(pNew, 1, &pCell, &szCell); - if( NEVER(rc) ) return rc; + b.nCell = 1; + b.pRef = pPage; + b.apCell = &pCell; + b.szCell = &szCell; + b.apEnd[0] = pPage->aDataEnd; + b.ixNx[0] = 2; + rc = rebuildPage(&b, 0, 1, pNew); + if( NEVER(rc) ){ + releasePage(pNew); + return rc; + } pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; /* If this is an auto-vacuum database, update the pointer map @@ -7568,6 +7666,10 @@ static int balance_nonroot( usableSpace = pBt->usableSize - 12 + leafCorrection; for(i=0; iaDataEnd; + b.apEnd[i*2+1] = pParent->aDataEnd; + b.ixNx[i*2] = cntOld[i]; + b.ixNx[i*2+1] = cntOld[i]+1; szNew[i] = usableSpace - p->nFree; for(j=0; jnOverflow; j++){ szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); From a5f9f42a0e4e58911ec26b7180dd1e098cdd00ca Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 23 Jan 2019 19:50:46 +0000 Subject: [PATCH 122/306] Fix a problem with renaming a table within a schema that contains a composite query that uses a column alias as an ORDER BY term. FossilOrigin-Name: 2ca6b8f84ec07e313aa4e1c0894827401b418dcc4221e9c54c384f1c3893952a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 37 +++++++++++++++++-------------------- test/altertab3.test | 21 +++++++++++++++++++++ 4 files changed, 47 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 571862ca07..138e222a0e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Stricter\senforcement\sof\scell\ssizes\swhen\sdoing\sbalancing\soperations\son\sthe\nbtree,\sin\sorder\sto\scatch\sfile\scorruption\ssooner. -D 2019-01-23T19:25:59.893 +C Fix\sa\sproblem\swith\srenaming\sa\stable\swithin\sa\sschema\sthat\scontains\sa\scomposite\squery\sthat\suses\sa\scolumn\salias\sas\san\sORDER\sBY\sterm. +D 2019-01-23T19:50:46.730 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -512,7 +512,7 @@ F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 F src/prepare.c 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 12fca5d0b5474ae42e7c32e9f631a4937ac065ab755c56d7636857c376dd2057 +F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c f7260c833c87c52ac187bc160ccc675a67d5a226cacd7eb1cdcb3c3ff25bde76 F src/shell.c.in 58f69c9143d9635a3d71a32c3d4cb6fad4de4f0ca400c098fa76ff83e3ec58cb @@ -623,7 +623,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a F test/altertab2.test 7bedde2e6e71fdecd7a2af64b696cd0b3d3a344f5cf1db6785d9e3b5665193cf -F test/altertab3.test b27923ad48b05f70364ddd8f4bdb6ee5e411e13d23badb74ccff048648b11986 +F test/altertab3.test 94152c25eaf5fc7ce2a20ce660c0fc014f40089625a12f74f4c224929b7d1b25 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1802,7 +1802,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 44ce8baa47192be03c8f11777904c3c07fa5cc5c97b6d8e81572d380995ac688 -R 394e54d0902bcab8f75c7f1ab86066f4 -U drh -Z 2303e2a69753b4d3e54ffe2a91200226 +P 12713f320b2c1def273dd8b7833dddaaad5331aba779d4b1ec9aa949814f38fe +R 6a3b0c4e7e1f7bf7bc1dc93e72839241 +U dan +Z 41dbe4c761083f3a99006e306f2f6874 diff --git a/manifest.uuid b/manifest.uuid index bfd0254909..5793f5b65d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -12713f320b2c1def273dd8b7833dddaaad5331aba779d4b1ec9aa949814f38fe \ No newline at end of file +2ca6b8f84ec07e313aa4e1c0894827401b418dcc4221e9c54c384f1c3893952a \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index b2da946a94..86fd543d03 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1160,12 +1160,7 @@ static int resolveCompoundOrderBy( assert(pDup); iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); } - if( IN_RENAME_OBJECT ){ - if( iCol>0 ){ - pItem->done = 1; - continue; - } - }else{ + if( !IN_RENAME_OBJECT ){ sqlite3ExprDelete(db, pDup); } } @@ -1173,21 +1168,23 @@ static int resolveCompoundOrderBy( if( iCol>0 ){ /* Convert the ORDER BY term into an integer column number iCol, ** taking care to preserve the COLLATE clause if it exists */ - Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); - if( pNew==0 ) return 1; - pNew->flags |= EP_IntValue; - pNew->u.iValue = iCol; - if( pItem->pExpr==pE ){ - pItem->pExpr = pNew; - }else{ - Expr *pParent = pItem->pExpr; - assert( pParent->op==TK_COLLATE ); - while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; - assert( pParent->pLeft==pE ); - pParent->pLeft = pNew; + if( !IN_RENAME_OBJECT ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return 1; + pNew->flags |= EP_IntValue; + pNew->u.iValue = iCol; + if( pItem->pExpr==pE ){ + pItem->pExpr = pNew; + }else{ + Expr *pParent = pItem->pExpr; + assert( pParent->op==TK_COLLATE ); + while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; + assert( pParent->pLeft==pE ); + pParent->pLeft = pNew; + } + sqlite3ExprDelete(db, pE); + pItem->u.x.iOrderByCol = (u16)iCol; } - sqlite3ExprDelete(db, pE); - pItem->u.x.iOrderByCol = (u16)iCol; pItem->done = 1; }else{ moreToDo = 1; diff --git a/test/altertab3.test b/test/altertab3.test index 9a5c92eccf..5c274861fa 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -41,7 +41,28 @@ do_execsql_test 1.3 { INSERT INTO t1 VALUES(1, 2); } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 2.0 { + CREATE TABLE t1(a,b,c); + CREATE TABLE t2(a,b,c); + CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN + SELECT a,b, a name FROM t1 + INTERSECT + SELECT a,b,c FROM t1 WHERE b>='d' ORDER BY name; + SELECT new.c; + END; +} +do_execsql_test 2.1 { + ALTER TABLE t1 RENAME TO t1x; + SELECT sql FROM sqlite_master WHERE name = 'r1'; +} {{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.a NOT NULL BEGIN + SELECT a,b, a name FROM "t1x" + INTERSECT + SELECT a,b,c FROM "t1x" WHERE b>='d' ORDER BY name; + SELECT new.c; + END}} finish_test From b4738ddb203867d9573555cb271463bab1e69a31 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 23 Jan 2019 20:31:56 +0000 Subject: [PATCH 123/306] Fix an assert() in vdbemem.c that could fire if the database was corrupt. FossilOrigin-Name: a70958cd7d5cf750c293537856918e5789013b70f6a827f724d83559b38629c8 --- manifest | 14 +++---- manifest.uuid | 2 +- src/vdbemem.c | 2 +- test/corruptL.test | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 138e222a0e..6272a5d9ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\srenaming\sa\stable\swithin\sa\sschema\sthat\scontains\sa\scomposite\squery\sthat\suses\sa\scolumn\salias\sas\san\sORDER\sBY\sterm. -D 2019-01-23T19:50:46.730 +C Fix\san\sassert()\sin\svdbemem.c\sthat\scould\sfire\sif\sthe\sdatabase\swas\scorrupt. +D 2019-01-23T20:31:56.371 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -591,7 +591,7 @@ F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 F src/vdbeaux.c f6cd3f538697aff71f1ef92a769feb18173eb9df80372f570d741a237ea30628 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9 +F src/vdbemem.c fdf49ecf8e4b81cd3593b8c4c3b34c1a0cf0e21d8b2897b89ed2d3a476ad1961 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa @@ -757,7 +757,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 -F test/corruptL.test 7992f33562c23eb24430521ab70e59bc17829969fc70c8f8bf2bab573dc73616 +F test/corruptL.test 8b2a8cf20fbd0b225cc3dea431e2c945878148a9df998d8f4134588be359057f F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf @@ -1802,7 +1802,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 12713f320b2c1def273dd8b7833dddaaad5331aba779d4b1ec9aa949814f38fe -R 6a3b0c4e7e1f7bf7bc1dc93e72839241 +P 2ca6b8f84ec07e313aa4e1c0894827401b418dcc4221e9c54c384f1c3893952a +R e8fdc8836590ceb99c45f46a404f58f1 U dan -Z 41dbe4c761083f3a99006e306f2f6874 +Z f16217977338f606c6b57b218fc2ad12 diff --git a/manifest.uuid b/manifest.uuid index 5793f5b65d..47f7724e21 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2ca6b8f84ec07e313aa4e1c0894827401b418dcc4221e9c54c384f1c3893952a \ No newline at end of file +a70958cd7d5cf750c293537856918e5789013b70f6a827f724d83559b38629c8 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index db8feddfb2..8493df753f 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -243,7 +243,7 @@ SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ ** if unable to complete the resizing. */ int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ - assert( szNew>0 ); + assert( CORRUPT_DB || szNew>0 ); assert( (pMem->flags & MEM_Dyn)==0 || pMem->szMalloc==0 ); if( pMem->szMalloc Date: Thu, 24 Jan 2019 04:44:54 +0000 Subject: [PATCH 124/306] Remove an unreachable branch. FossilOrigin-Name: 4c976f171342ba2d39779279c28f3bc088572c440922e3e4421a3bf541263360 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/walker.c | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 6272a5d9ea..2ab0ee5d32 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\svdbemem.c\sthat\scould\sfire\sif\sthe\sdatabase\swas\scorrupt. -D 2019-01-23T20:31:56.371 +C Remove\san\sunreachable\sbranch. +D 2019-01-24T04:44:54.947 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -598,7 +598,7 @@ F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c ec63d6e2857a542523bcc1472e9817c4da003f4c450ea4885f6e41b4b577a64a +F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c c5d201699d03be61c35bc04b96e481b1c8dc68177617ca1db156ef7409da2fae F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 @@ -1802,7 +1802,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 2ca6b8f84ec07e313aa4e1c0894827401b418dcc4221e9c54c384f1c3893952a -R e8fdc8836590ceb99c45f46a404f58f1 -U dan -Z f16217977338f606c6b57b218fc2ad12 +P a70958cd7d5cf750c293537856918e5789013b70f6a827f724d83559b38629c8 +R 325ad37749432671fa3f84ec38afb2d4 +U drh +Z ccb753204103f489ac3e8af31c380337 diff --git a/manifest.uuid b/manifest.uuid index 47f7724e21..12f129f175 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a70958cd7d5cf750c293537856918e5789013b70f6a827f724d83559b38629c8 \ No newline at end of file +4c976f171342ba2d39779279c28f3bc088572c440922e3e4421a3bf541263360 \ No newline at end of file diff --git a/src/walker.c b/src/walker.c index 4950c8d4b0..eff3585250 100644 --- a/src/walker.c +++ b/src/walker.c @@ -116,7 +116,9 @@ int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ { Parse *pParse = pWalker->pParse; if( pParse && IN_RENAME_OBJECT ){ - if( walkWindowList(pWalker, p->pWinDefn) ) return WRC_Abort; + int rc = walkWindowList(pWalker, p->pWinDefn); + assert( rc==WRC_Continue ); + return rc; } } #endif From 55469bbafb242b9b3c0b844e26a199d5c53b6f87 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Jan 2019 13:36:47 +0000 Subject: [PATCH 125/306] Use memmove() instead of memcpy() in a place where buffers might overlap if the database file is badly corrupted, to prevent warnings from ASAN and valgrind. FossilOrigin-Name: 65ad6c55f1ba9bc2f75afffa3adaf19f145fad7ac9a00ccce6372e9a2cc4341b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 6 +++++- test/fuzzdata7.db | Bin 16412672 -> 16417792 bytes 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2ab0ee5d32..e41cd61dbd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunreachable\sbranch. -D 2019-01-24T04:44:54.947 +C Use\smemmove()\sinstead\sof\smemcpy()\sin\sa\splace\swhere\sbuffers\smight\soverlap\nif\sthe\sdatabase\sfile\sis\sbadly\scorrupted,\sto\sprevent\swarnings\nfrom\sASAN\sand\svalgrind. +D 2019-01-24T13:36:47.895 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 60fa67e135492b83c78517502cdd64dd1028da3fb5958cc130d94ba75f140b55 +F src/btree.c 58574154361f57da015436f53d9107dde74387b3b939c7a7ef6a7998b5dfb1af F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc @@ -991,7 +991,7 @@ F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db 8b478751a84cf559f6167eaee0210d5e9b93387c31437e71b46500d976c87e18 +F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1802,7 +1802,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 a70958cd7d5cf750c293537856918e5789013b70f6a827f724d83559b38629c8 -R 325ad37749432671fa3f84ec38afb2d4 +P 4c976f171342ba2d39779279c28f3bc088572c440922e3e4421a3bf541263360 +R 000be4db53a8c0e7cae754221c18d732 U drh -Z ccb753204103f489ac3e8af31c380337 +Z 82bc0dd19e737236a8e3e2d652801672 diff --git a/manifest.uuid b/manifest.uuid index 12f129f175..cd41ad9f84 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4c976f171342ba2d39779279c28f3bc088572c440922e3e4421a3bf541263360 \ No newline at end of file +65ad6c55f1ba9bc2f75afffa3adaf19f145fad7ac9a00ccce6372e9a2cc4341b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 83b50f2529..b68bca12a9 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8351,7 +8351,11 @@ static int btreeOverwriteContent( if( memcmp(pDest, ((u8*)pX->pData) + iOffset, iAmt)!=0 ){ int rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ) return rc; - memcpy(pDest, ((u8*)pX->pData) + iOffset, iAmt); + /* In a corrupt database, it is possible for the source and destination + ** buffers to overlap. This is harmless since the database is already + ** corrupt but it does cause valgrind and ASAN warnings. So use + ** memmove(). */ + memmove(pDest, ((u8*)pX->pData) + iOffset, iAmt); } } return SQLITE_OK; diff --git a/test/fuzzdata7.db b/test/fuzzdata7.db index df356df47ca39b47521afe96322038bbc14e05d6..f994daa2d09cce93dd59d63244501f6dad9c66bf 100644 GIT binary patch delta 17248 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 LnBFh85%vE89lqpP From 936ade4dba52cd4e69324442ef4a81e87c286dd5 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Jan 2019 14:16:20 +0000 Subject: [PATCH 126/306] Change a integer variable in sqlite3VdbeRecordUnpack() to unsigned in order to avoid any possibility of an integer overflow. FossilOrigin-Name: 1b536f6fd8d58800042f130842f0586aaa357841ee0d1b690a9815c865d50826 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e41cd61dbd..5e2dcbc59c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\smemmove()\sinstead\sof\smemcpy()\sin\sa\splace\swhere\sbuffers\smight\soverlap\nif\sthe\sdatabase\sfile\sis\sbadly\scorrupted,\sto\sprevent\swarnings\nfrom\sASAN\sand\svalgrind. -D 2019-01-24T13:36:47.895 +C Change\sa\sinteger\svariable\sin\ssqlite3VdbeRecordUnpack()\sto\sunsigned\sin\sorder\nto\savoid\sany\spossibility\sof\san\sinteger\soverflow. +D 2019-01-24T14:16:20.388 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -589,7 +589,7 @@ F src/vdbe.c 090d40c688b56b4602fb196a78e9d17213f381984258131c1e8f665636ca35ac F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 -F src/vdbeaux.c f6cd3f538697aff71f1ef92a769feb18173eb9df80372f570d741a237ea30628 +F src/vdbeaux.c 11ded95e16dc340625d1e321430349b7d1cbcfc2bd09dda455e7a4c6c2fa102e F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c fdf49ecf8e4b81cd3593b8c4c3b34c1a0cf0e21d8b2897b89ed2d3a476ad1961 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f @@ -1802,7 +1802,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 4c976f171342ba2d39779279c28f3bc088572c440922e3e4421a3bf541263360 -R 000be4db53a8c0e7cae754221c18d732 +P 65ad6c55f1ba9bc2f75afffa3adaf19f145fad7ac9a00ccce6372e9a2cc4341b +R 044fae2f8d5b50f222adeecb83c19999 U drh -Z 82bc0dd19e737236a8e3e2d652801672 +Z a7a11efee3ef8017d4f6272584568b02 diff --git a/manifest.uuid b/manifest.uuid index cd41ad9f84..72ab28b76f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -65ad6c55f1ba9bc2f75afffa3adaf19f145fad7ac9a00ccce6372e9a2cc4341b \ No newline at end of file +1b536f6fd8d58800042f130842f0586aaa357841ee0d1b690a9815c865d50826 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index a8e337ae3c..4738dba932 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3794,7 +3794,7 @@ void sqlite3VdbeRecordUnpack( UnpackedRecord *p /* Populate this structure before returning. */ ){ const unsigned char *aKey = (const unsigned char *)pKey; - int d; + u32 d; u32 idx; /* Offset in aKey[] to read from */ u16 u; /* Unsigned loop counter */ u32 szHdr; From b0c4c949966415a7f31d3862213527fd2d8ab0e7 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 24 Jan 2019 15:16:17 +0000 Subject: [PATCH 127/306] Fix a potential problem with "INSERT INTO ... SELECT * FROM" (or VACUUM) statements on a corrupted database. FossilOrigin-Name: db4b4c2c1e9f1adacfb1b2fedb717a4d8bb0a299c3b11835404a99fcd67bf24b --- manifest | 18 +++--- manifest.uuid | 2 +- src/btree.c | 7 ++- test/corruptL.test | 146 ++++++++++++++++++++++++++++++++++++++++++++ test/dbfuzz001.test | 11 +++- 5 files changed, 168 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 5e2dcbc59c..f8c4c1a3d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sa\sinteger\svariable\sin\ssqlite3VdbeRecordUnpack()\sto\sunsigned\sin\sorder\nto\savoid\sany\spossibility\sof\san\sinteger\soverflow. -D 2019-01-24T14:16:20.388 +C Fix\sa\spotential\sproblem\swith\s"INSERT\sINTO\s...\sSELECT\s*\sFROM"\s(or\sVACUUM)\sstatements\son\sa\scorrupted\sdatabase. +D 2019-01-24T15:16:17.305 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 58574154361f57da015436f53d9107dde74387b3b939c7a7ef6a7998b5dfb1af +F src/btree.c 21eb929285901255cf0af2f8e2e9ee41c77e0620e031ddad3d065cfaf95583fd F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc @@ -757,7 +757,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 -F test/corruptL.test 8b2a8cf20fbd0b225cc3dea431e2c945878148a9df998d8f4134588be359057f +F test/corruptL.test 05e4e193bdd56896bae94d1d1f73a29ff41c9c2bafe32bd390d547c5bfa38f34 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf @@ -782,7 +782,7 @@ F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68 F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b10 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e -F test/dbfuzz001.test 5659cbbc01e38678c119c8a58071cac59d0d6c71837a385f3d1838012f12e1e1 +F test/dbfuzz001.test 9617fb870f7d655c27994749955efee5d93a641c082dce4c59059796ff81145e F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c ffd2d85cab49936959b8ee6073498bcb827d5670c7286e4b40b06e433b32a94a F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 @@ -1802,7 +1802,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 65ad6c55f1ba9bc2f75afffa3adaf19f145fad7ac9a00ccce6372e9a2cc4341b -R 044fae2f8d5b50f222adeecb83c19999 -U drh -Z a7a11efee3ef8017d4f6272584568b02 +P 1b536f6fd8d58800042f130842f0586aaa357841ee0d1b690a9815c865d50826 +R fc284f1d3ce3f15ef50f8cba68163dd7 +U dan +Z 7614ae7f2756b52b23d2b92aadbeffdc diff --git a/manifest.uuid b/manifest.uuid index 72ab28b76f..ea068faa4d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1b536f6fd8d58800042f130842f0586aaa357841ee0d1b690a9815c865d50826 \ No newline at end of file +db4b4c2c1e9f1adacfb1b2fedb717a4d8bb0a299c3b11835404a99fcd67bf24b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index b68bca12a9..401f02eeba 100644 --- a/src/btree.c +++ b/src/btree.c @@ -804,11 +804,12 @@ static int btreeMoveto( UnpackedRecord *pIdxKey; /* Unpacked index key */ if( pKey ){ + KeyInfo *pKeyInfo = pCur->pKeyInfo; assert( nKey==(i64)(int)nKey ); - pIdxKey = sqlite3VdbeAllocUnpackedRecord(pCur->pKeyInfo); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; - sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey); - if( pIdxKey->nField==0 ){ + sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); + if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ rc = SQLITE_CORRUPT_BKPT; goto moveto_done; } diff --git a/test/corruptL.test b/test/corruptL.test index c90562e564..ee16b9c1df 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -230,4 +230,150 @@ do_catchsql_test 2.2 { SELECT b,c FROM t1 ORDER BY a; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 3.0 { + CREATE TABLE t1(a, b, c, d INTEGER PRIMARY KEY); + CREATE TABLE t2(a, b, c, d INTEGER PRIMARY KEY); + + INSERT INTO t1(a, b, c, d) VALUES (1, 2, 3, 100), (4, 5, 6, 101); + INSERT INTO t2(a, b, c, d) VALUES (1, 100, 3, 1000), (4, 101, 6, 1001); + + CREATE INDEX t1a ON t1(a); + CREATE INDEX t2a ON t2(a, b, c); + + PRAGMA writable_schema = 1; + UPDATE sqlite_master SET sql = 'CREATE INDEX t2a ON t2(a)' WHERE name='t2a'; +} + +db close +sqlite3 db test.db + +do_catchsql_test 3.1 { + INSERT INTO t1 SELECT * FROM t2; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 4.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 4096 pagesize 512 filename crash-6b48ba69806134.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: 02 00 01 01 00 40 20 20 00 ff ff ff ff 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 05 00 eb 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c ................ +| 96: 00 2e 2c 50 0d 00 00 00 06 01 06 00 01 da 01 b0 ..,P............ +| 112: 05 56 01 86 01 2a 01 06 00 00 00 00 00 00 00 00 .V...*.......... +| 128: 00 ff 00 00 ff ff ff e1 00 00 00 00 00 00 00 00 ................ +| 144: 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 ................ +| 160: 00 00 00 00 00 00 00 00 f2 00 00 00 00 00 00 00 ................ +| 176: 00 00 f9 ff ff ff ff ff ff ff 00 00 00 00 00 fb ................ +| 208: 00 00 00 00 00 00 00 00 1e 00 00 00 fe 00 00 00 ................ +| 224: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ca 00 ................ +| 256: 00 00 00 00 ef ff 22 07 06 17 11 11 01 31 74 61 .............1ta +| 272: 62 6c 65 74 38 38 74 04 43 52 45 41 54 45 20 54 blet88t.CREATE T +| 288: 41 42 4c 45 20 74 34 28 87 29 2a 06 06 17 13 11 ABLE t4(.)*..... +| 304: 01 3f 69 4f 64 65 78 74 33 78 74 33 05 43 52 45 .?iOdext3xt3.CRE +| 320: 41 54 45 20 49 6e 44 45 58 20 74 33 78 20 4f 4e ATE InDEX t3x ON +| 336: 20 74 33 28 78 29 2e 04 06 17 15 11 01 45 69 6e t3(x).......Ein +| 352: 64 65 2e 74 32 63 64 74 3d 05 43 52 45 41 54 45 de.t2cdt=.CREATE +| 368: 20 49 4e 44 45 58 20 74 32 63 64 20 4f 4e 20 74 INDEX t2cd ON t +| 384: 32 28 0a 0c 44 29 28 05 06 17 11 11 01 3d 74 61 2(..D)(......=ta +| 400: 62 6c 65 d4 33 74 33 04 43 52 45 41 54 45 20 54 ble.3t3.CREATE T +| 416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29 ABLE t3(c,x,e,f) +| 432: 28 02 06 17 11 11 01 3d 74 61 62 6c 65 74 32 74 (......=tablet2t +| 448: 32 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 2.CREATE TABLE t +| 464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11 2(c,d,e,f)$..... +| 480: 01 35 74 60 62 6c 65 74 31 74 31 02 43 52 45 41 .5t`blet1t1.CREA +| 496: 54 45 20 54 41 42 4c 45 20 74 30 28 61 2c 62 29 TE TABLE t0(a,b) +| page 2 offset 512 +| 0: 0d 00 ff 11 04 01 cf 00 01 fa 01 f3 01 de 01 cf ................ +| 32: 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 13 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 20 00 00 ............. .. +| 64: 00 00 00 00 00 00 f8 ff ff ff 00 00 00 00 00 00 ................ +| 160: 01 64 00 00 00 00 00 80 ff ff ff 00 00 00 00 00 .d.............. +| 176: 00 00 00 00 00 00 00 00 1f 00 00 00 00 00 00 03 ................ +| 192: 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 ..@............. +| 288: 00 00 00 00 00 00 ff ff ff e9 00 00 00 00 00 00 ................ +| 336: 01 00 00 ff ff 00 00 00 00 00 00 00 00 00 00 00 ................ +| 368: 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ............... +| 384: 00 de ff 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 464: 00 00 00 00 00 13 76 65 6e 65 69 67 68 74 13 03 ......veneight.. +| 480: 03 40 07 07 14 00 54 45 20 49 4e 44 45 58 20 74 .@....TE INDEX t +| 496: 32 63 64 20 4f 4e 20 74 32 28 0a 0c 44 09 01 02 2cd ON t2(..D... +| page 3 offset 1024 +| 0: 0d 00 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 aa ....H.T......... +| 16: 30 34 28 87 29 2a 06 06 17 13 11 01 3f 69 4f 64 04(.)*......?iOd +| 32: 65 79 74 33 78 74 33 6d 6d 6d 6d 6d 6d 7d 6d 6d eyt3xt3mmmmmm.mm +| 48: 6d 41 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d mAmmmmmmmmmmmmmm +| 64: 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 66 6d 6d 6d 6d mmmmmmmmmmmfmmmm +| 80: 6d 4e 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d mNmmmmmmmmmmmmmm +| 96: 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d mmmmmmmmmmmmmmmm +| 112: 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d mmmmmmmmmmmmmmmm +| 128: 6d 6d 6d 6d 6d 00 00 00 00 00 00 00 00 00 00 00 mmmmm........... +| 160: 80 00 00 00 00 00 00 03 00 00 00 ff e4 00 00 00 ................ +| 208: 00 00 00 00 00 00 00 00 00 00 00 00 00 c5 00 00 ................ +| 240: 14 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 ................ +| 256: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0f ec ................ +| 304: 00 00 00 00 19 08 05 17 17 17 17 65 69 67 68 74 ...........eight +| 320: 65 69 67 68 74 73 65 00 00 00 00 00 00 00 00 00 eightse......... +| 336: 00 00 00 00 19 08 05 17 17 17 17 65 69 67 68 74 ...........eight +| 352: 65 69 67 68 74 73 65 01 65 6e 00 00 00 10 25 07 eightse.en....%. +| 368: 07 6e 25 07 07 07 40 18 00 00 00 00 00 00 40 18 .n%...@.......@. +| 384: 00 00 00 00 00 00 40 14 00 00 00 00 00 00 40 14 ......@.......@. +| 400: 00 00 00 00 00 00 09 06 05 01 01 01 01 04 04 03 ................ +| 416: 03 07 05 05 01 01 09 09 02 02 19 04 05 17 17 17 ................ +| 432: 17 10 65 76 65 6e 65 69 67 68 74 65 69 67 68 74 ..eveneighteight +| 448: 73 65 76 65 6e 25 03 05 07 07 07 07 40 14 00 00 seven%......@... +| 464: 00 00 00 00 40 18 00 00 00 00 00 00 40 18 00 00 ....@.......@... +| 480: 00 00 00 00 40 14 00 00 00 00 e8 f6 09 02 00 00 ....@........... +| 496: 00 00 00 00 00 00 00 00 00 00 64 00 00 00 00 02 ..........d..... +| page 4 offset 1536 +| 0: 0d 00 00 00 00 02 00 00 00 00 00 00 00 00 00 fa ................ +| 16: 1f a1 07 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ +| 32: 00 00 00 00 00 00 00 00 00 00 00 00 00 73 69 6d .............sim +| 48: 70 6c 65 00 00 00 00 00 00 00 00 00 00 00 00 00 ple............. +| 80: 00 00 00 00 00 10 00 00 00 00 00 00 01 00 00 00 ................ +| 96: 00 00 00 00 00 00 00 00 00 00 00 00 00 fe ff ff ................ +| 112: ff 00 00 00 00 00 00 00 00 00 00 00 4a 00 00 00 ............J... +| 144: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 176: e5 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 208: 00 00 00 00 00 00 00 00 00 00 36 36 00 00 00 00 ..........66.... +| 240: 00 00 00 6c 00 00 00 00 00 00 00 00 00 00 00 00 ...l............ +| 256: 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 320: 00 00 00 00 00 00 00 00 01 00 00 02 00 80 00 00 ................ +| 336: 00 00 00 00 00 19 08 05 17 17 17 17 65 69 67 68 ............eigh +| 352: 74 65 69 67 68 74 73 65 76 65 6e 73 65 76 65 6e teightsevenseven +| 368: 25 07 05 07 07 07 07 40 18 00 00 00 00 00 00 40 %......@.......@ +| 384: 18 00 20 00 00 00 40 00 14 00 00 00 00 00 00 40 .. ...@........@ +| 400: 14 00 00 00 00 00 1c 09 06 05 01 01 01 01 04 04 ................ +| 416: 03 03 07 05 05 01 01 00 00 00 00 00 00 00 00 00 ................ +| 448: 74 73 65 76 65 6e 00 80 ff ff 00 00 00 00 00 aa tseven.......... +| 464: 00 9e 00 00 00 00 00 00 00 00 00 00 00 70 6f 72 .............por +| 480: 74 65 72 00 00 00 00 00 00 00 00 00 00 00 00 00 ter............. +| 496: 00 00 00 00 00 00 29 00 00 00 00 00 00 00 00 00 ......)......... +| page 5 offset 2048 +| 0: 0a 00 00 00 08 01 96 00 01 fa 01 c5 01 f2 01 bc ................ +| 16: 01 dc 01 a6 01 96 01 cc 00 00 00 00 00 00 00 00 ................ +| 112: 00 00 00 09 00 00 00 00 01 00 00 00 00 00 00 00 ................ +| 160: 74 72 69 67 62 ff ff ff ff fc 00 00 00 00 00 00 trigb........... +| 240: 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 00 00 ................ +| 256: e5 ff ff ff 00 00 54 00 00 00 00 00 00 00 00 00 ......T......... +| 304: 00 00 00 00 00 00 09 00 00 00 00 00 00 00 00 00 ................ +| 400: 00 00 00 00 00 09 00 00 00 00 01 00 00 00 00 00 ................ +| 448: 00 00 74 72 69 67 62 ff ff ff ff fc 00 00 07 05 ..trigb......... +| 464: 05 01 01 09 09 02 02 19 04 05 17 17 17 17 10 65 ...............e +| 480: 76 65 6e 65 69 67 68 74 65 40 18 00 00 00 00 01 veneighte@...... +| 496: 02 03 07 04 01 01 01 03 04 02 05 04 09 01 ff fd ................ +| end crash-6b48ba69806134.db +}]} {} + +do_catchsql_test 4.1 { + INSERT INTO t3 SELECT * FROM t2; +} {1 {database disk image is malformed}} + + finish_test diff --git a/test/dbfuzz001.test b/test/dbfuzz001.test index 70c7997684..0a36867e66 100644 --- a/test/dbfuzz001.test +++ b/test/dbfuzz001.test @@ -347,9 +347,14 @@ do_test dbfuzz001-110 { | 496: 04 03 03 02 01 04 03 02 02 01 02 03 01 02 01 02 ................ | end x/c02.db }] - execsql { - DELETE FROM t3 WHERE x IN (SELECT x FROM t4); - } } {} +do_catchsql_test dbfuzz001-120 { + PRAGMA integrity_check; +} {1 {database disk image is malformed}} + +do_catchsql_test dbfuzz001-130 { + DELETE FROM t3 WHERE x IN (SELECT x FROM t4); +} {1 {database disk image is malformed}} + finish_test From 491b6d897df09229cfa425d60ba095c1bd81c95f Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Jan 2019 15:51:03 +0000 Subject: [PATCH 128/306] Make sure the column name flags are restored correctly after an error inside of sqlite3ResultSetOfSelect(). FossilOrigin-Name: b1601db7adba2dccd4f90fbbe5099c801a2b0d97af087fbe82ed98d05496b38c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f8c4c1a3d2..94218b2563 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sproblem\swith\s"INSERT\sINTO\s...\sSELECT\s*\sFROM"\s(or\sVACUUM)\sstatements\son\sa\scorrupted\sdatabase. -D 2019-01-24T15:16:17.305 +C Make\ssure\sthe\scolumn\sname\sflags\sare\srestored\scorrectly\safter\san\serror\ninside\sof\ssqlite3ResultSetOfSelect(). +D 2019-01-24T15:51:03.986 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -514,7 +514,7 @@ F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c f7260c833c87c52ac187bc160ccc675a67d5a226cacd7eb1cdcb3c3ff25bde76 +F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 F src/shell.c.in 58f69c9143d9635a3d71a32c3d4cb6fad4de4f0ca400c098fa76ff83e3ec58cb F src/sqlite.h.in 8ded85ecaa768afd196b24201382ccdf00e5bab6861e30549cd750bebd273a0b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1802,7 +1802,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 1b536f6fd8d58800042f130842f0586aaa357841ee0d1b690a9815c865d50826 -R fc284f1d3ce3f15ef50f8cba68163dd7 -U dan -Z 7614ae7f2756b52b23d2b92aadbeffdc +P db4b4c2c1e9f1adacfb1b2fedb717a4d8bb0a299c3b11835404a99fcd67bf24b +R 9df34114c40e9efb87e11c3ff795e26e +U drh +Z 6fb0408adaa68f0f20a707371b27a9aa diff --git a/manifest.uuid b/manifest.uuid index ea068faa4d..d44ba051b9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db4b4c2c1e9f1adacfb1b2fedb717a4d8bb0a299c3b11835404a99fcd67bf24b \ No newline at end of file +b1601db7adba2dccd4f90fbbe5099c801a2b0d97af087fbe82ed98d05496b38c \ No newline at end of file diff --git a/src/select.c b/src/select.c index 3b9a0c3756..c3351ef13a 100644 --- a/src/select.c +++ b/src/select.c @@ -2089,9 +2089,9 @@ Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ db->flags &= ~(u64)SQLITE_FullColNames; db->flags |= SQLITE_ShortColNames; sqlite3SelectPrep(pParse, pSelect, 0); + db->flags = savedFlags; if( pParse->nErr ) return 0; while( pSelect->pPrior ) pSelect = pSelect->pPrior; - db->flags = savedFlags; pTab = sqlite3DbMallocZero(db, sizeof(Table) ); if( pTab==0 ){ return 0; From 3cc9af214091d0f2464626f1ceae42d07c85cbb2 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Jan 2019 16:07:18 +0000 Subject: [PATCH 129/306] Omit deprecated PRAGMAs when compiling with the -DSQLITE_OMIT_DEPRECATED option. FossilOrigin-Name: 008112bcef561a8a3ebfb007cbef36cbc0071f547e6ebdba3d3bbb39e2c48c7a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pragma.h | 20 +++++++++++++++++++- tool/mkpragmatab.tcl | 10 +++++++++- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 94218b2563..7169f4f10f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\scolumn\sname\sflags\sare\srestored\scorrectly\safter\san\serror\ninside\sof\ssqlite3ResultSetOfSelect(). -D 2019-01-24T15:51:03.986 +C Omit\sdeprecated\sPRAGMAs\swhen\scompiling\swith\sthe\s-DSQLITE_OMIT_DEPRECATED\soption. +D 2019-01-24T16:07:18.008 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -508,7 +508,7 @@ F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c 20811b404b6d302a1bedd4b8af8aab2794c5e87ba1f5cb6b42dbc3266ad9c603 -F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 +F src/pragma.h 14eed1061a0b52443349eb733ae8f107144f9d0d3ce39e8e9490b5f6691c0e09 F src/prepare.c 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -1735,7 +1735,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl a1334e70a08fdf5de32cd0093613212bb11ac8f880487540987175c536ac335f +F tool/mkpragmatab.tcl f69c3acb55af6e8f364465c28be5ffa5bdbd34440b27bf05bcc21ce9eb8a2cf2 F tool/mkshellc.tcl 1f45770aea226ac093a9c72f718efbb88a2a2833409ec2e1c4cecae4202626f5 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1802,7 +1802,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 db4b4c2c1e9f1adacfb1b2fedb717a4d8bb0a299c3b11835404a99fcd67bf24b -R 9df34114c40e9efb87e11c3ff795e26e +P b1601db7adba2dccd4f90fbbe5099c801a2b0d97af087fbe82ed98d05496b38c +R 48bd598e50bcb5c94ac5469f837fee23 U drh -Z 6fb0408adaa68f0f20a707371b27a9aa +Z a55a93aacf9ea2089ba765c28e112e54 diff --git a/manifest.uuid b/manifest.uuid index d44ba051b9..98f6b44c8a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b1601db7adba2dccd4f90fbbe5099c801a2b0d97af087fbe82ed98d05496b38c \ No newline at end of file +008112bcef561a8a3ebfb007cbef36cbc0071f547e6ebdba3d3bbb39e2c48c7a \ No newline at end of file diff --git a/src/pragma.h b/src/pragma.h index b1d4155ef2..6632c4945e 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -211,19 +211,23 @@ static const PragmaName aPragmaName[] = { /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "count_changes", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_CountRows }, #endif +#endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN +#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "data_store_directory", /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, /* ePragFlg: */ PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif +#endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) {/* zName: */ "data_version", /* ePragTyp: */ PragTyp_HEADER_VALUE, @@ -238,13 +242,15 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 35, 3, /* iArg: */ 0 }, #endif -#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) +#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "default_cache_size", /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, /* ColNames: */ 45, 1, /* iArg: */ 0 }, #endif +#endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) {/* zName: */ "defer_foreign_keys", @@ -255,12 +261,14 @@ static const PragmaName aPragmaName[] = { #endif #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "empty_result_callbacks", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_NullCallback }, #endif +#endif #if !defined(SQLITE_OMIT_UTF16) {/* zName: */ "encoding", /* ePragTyp: */ PragTyp_ENCODING, @@ -299,11 +307,15 @@ static const PragmaName aPragmaName[] = { /* iArg: */ BTREE_FREE_PAGE_COUNT }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "full_column_names", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_FullColNames }, +#endif +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) {/* zName: */ "fullfsync", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, @@ -530,11 +542,13 @@ static const PragmaName aPragmaName[] = { /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "short_column_names", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_ShortColNames }, +#endif #endif {/* zName: */ "shrink_memory", /* ePragTyp: */ PragTyp_SHRINK_MEMORY, @@ -587,12 +601,16 @@ static const PragmaName aPragmaName[] = { /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, +#endif +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) +#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "temp_store_directory", /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, /* ePragFlg: */ PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif +#endif #if defined(SQLITE_HAS_CODEC) {/* zName: */ "textkey", /* ePragTyp: */ PragTyp_KEY, diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 5b1f2eea93..f319b38502 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -25,21 +25,25 @@ set pragma_def { TYPE: FLAG ARG: SQLITE_FullColNames IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) + IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: short_column_names TYPE: FLAG ARG: SQLITE_ShortColNames IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) + IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: count_changes TYPE: FLAG ARG: SQLITE_CountRows IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) + IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: empty_result_callbacks TYPE: FLAG ARG: SQLITE_NullCallback IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) + IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: legacy_file_format TYPE: FLAG @@ -152,7 +156,9 @@ set pragma_def { NAME: default_cache_size FLAG: NeedSchema Result0 SchemaReq NoColumns1 COLS: cache_size - IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) + IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) + IF: !defined(SQLITE_OMIT_DEPRECATED) + NAME: page_size FLAG: Result0 SchemaReq NoColumns1 @@ -205,10 +211,12 @@ set pragma_def { NAME: temp_store_directory FLAG: NoColumns1 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) + IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: data_store_directory FLAG: NoColumns1 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN + IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: lock_proxy_file FLAG: NoColumns1 From f467744d5fc68f64f051d7e3a8ba8e4a67b006bb Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 24 Jan 2019 16:27:10 +0000 Subject: [PATCH 130/306] Fix a problem with running ALTER TABLE on a schema that contains expressions of the type "col IN ()" (empty set on RHS of IN operator). FossilOrigin-Name: 2d9cd06715092c312c8c0ec392696a0e90ed090b074e2082e0b830f1399aa941 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/parse.y | 6 ++++-- test/altertab3.test | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 7169f4f10f..aff3852092 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sdeprecated\sPRAGMAs\swhen\scompiling\swith\sthe\s-DSQLITE_OMIT_DEPRECATED\soption. -D 2019-01-24T16:07:18.008 +C Fix\sa\sproblem\swith\srunning\sALTER\sTABLE\son\sa\sschema\sthat\scontains\sexpressions\sof\sthe\stype\s"col\sIN\s()"\s(empty\sset\son\sRHS\sof\sIN\soperator). +D 2019-01-24T16:27:10.406 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -503,7 +503,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 857dde3e525f665cfab23b6765bf04ca6638c0759ae7da6d63acfb463e230aa6 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 489673ac424c1d3ec3c97f65df572652b32a47bbcee5be1492ad7d4874d47430 +F src/parse.y 9e5fc4c9788cc692c2117c4236eebb6e03d4f75a3a138656814fddba2eae3903 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 @@ -623,7 +623,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a F test/altertab2.test 7bedde2e6e71fdecd7a2af64b696cd0b3d3a344f5cf1db6785d9e3b5665193cf -F test/altertab3.test 94152c25eaf5fc7ce2a20ce660c0fc014f40089625a12f74f4c224929b7d1b25 +F test/altertab3.test 9dd97ab8161eb6afc0e30e7c61a38336687fbd09e6ddc4c9f1e450cc0b12160b F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1802,7 +1802,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 b1601db7adba2dccd4f90fbbe5099c801a2b0d97af087fbe82ed98d05496b38c -R 48bd598e50bcb5c94ac5469f837fee23 -U drh -Z a55a93aacf9ea2089ba765c28e112e54 +P 008112bcef561a8a3ebfb007cbef36cbc0071f547e6ebdba3d3bbb39e2c48c7a +R 523a2eff32fe7ae56ab8feb2e43f8b41 +U dan +Z 25bb1be3c29e0b5fdd31f536b284fa69 diff --git a/manifest.uuid b/manifest.uuid index 98f6b44c8a..c0b6dffa95 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -008112bcef561a8a3ebfb007cbef36cbc0071f547e6ebdba3d3bbb39e2c48c7a \ No newline at end of file +2d9cd06715092c312c8c0ec392696a0e90ed090b074e2082e0b830f1399aa941 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 95dfc028fc..4672dbda64 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1166,8 +1166,10 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ - sqlite3ExprDelete(pParse->db, A); - A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); + if( IN_RENAME_OBJECT==0 ){ + sqlite3ExprDelete(pParse->db, A); + A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); + } }else if( Y->nExpr==1 ){ /* Expressions of the form: ** diff --git a/test/altertab3.test b/test/altertab3.test index 5c274861fa..28c0587780 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -63,6 +63,24 @@ do_execsql_test 2.1 { SELECT a,b,c FROM "t1x" WHERE b>='d' ORDER BY name; SELECT new.c; END}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 3.0 { + CREATE TABLE t1(a, b, c, d); + CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (b IN ()); +} + +do_execsql_test 3.1 { + ALTER TABLE t1 RENAME b TO bbb; +} + +do_execsql_test 3.2 { + SELECT sql FROM sqlite_master WHERE name = 'v1' +} {{CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (bbb IN ())}} + + + finish_test From 813ed78054b8d765631150fad12bd60cd437e263 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 24 Jan 2019 17:41:12 +0000 Subject: [PATCH 131/306] Fix a buffer overread in fts3 that could occur in a prefix query on a corrupted database. FossilOrigin-Name: d0d5689371577b2861d4a9464443d055f3256f3f51d89e0388233a4cbe2601ee --- ext/fts3/fts3.c | 6 ++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3corrupt4.test | 11 +++++++++++ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 267f85163b..9996611b16 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2548,7 +2548,7 @@ static int fts3DoclistOrMerge( ** A symetric argument may be made if the doclists are in descending ** order. */ - aOut = sqlite3_malloc64((sqlite3_int64)n1+n2+FTS3_VARINT_MAX-1); + aOut = sqlite3_malloc64((i64)n1+n2+FTS3_VARINT_MAX-1+FTS3_BUFFER_PADDING); if( !aOut ) return SQLITE_NOMEM; p = aOut; @@ -2577,10 +2577,12 @@ static int fts3DoclistOrMerge( if( rc!=SQLITE_OK ){ sqlite3_free(aOut); p = aOut = 0; + }else{ + assert( (p-aOut)<=n1+n2+FTS3_VARINT_MAX-1 ); + memset(&aOut[(p-aOut)], 0, FTS3_BUFFER_PADDING); } *paOut = aOut; *pnOut = (int)(p-aOut); - assert( *pnOut<=n1+n2+FTS3_VARINT_MAX-1 ); return rc; } diff --git a/manifest b/manifest index aff3852092..eeded3f3c7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\srunning\sALTER\sTABLE\son\sa\sschema\sthat\scontains\sexpressions\sof\sthe\stype\s"col\sIN\s()"\s(empty\sset\son\sRHS\sof\sIN\soperator). -D 2019-01-24T16:27:10.406 +C Fix\sa\sbuffer\soverread\sin\sfts3\sthat\scould\soccur\sin\sa\sprefix\squery\son\sa\scorrupted\sdatabase. +D 2019-01-24T17:41:12.741 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 560cc692cf054c3599b462836c4ed5cfc015fb49cf42e9700a84f7df84dbd181 +F ext/fts3/fts3.c c8b68202dd9ae7a4a1f843c8c7bab108a9b43729444d4544d357eac59715b8cd F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 6c666f314caaeb8fe8e4c1a2d84f8b34406647429a43e8f475b0b0074ad41861 F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b @@ -918,7 +918,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 9cc4ae536c28eef2d5a01ca2e128dd9237bd162beb9774a0314b3b34ee5f2053 +F test/fts3corrupt4.test c2797baa11665b2ca87287b3e33155d4464cc4461b5e7e000b0b24a6035fd352 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1802,7 +1802,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 008112bcef561a8a3ebfb007cbef36cbc0071f547e6ebdba3d3bbb39e2c48c7a -R 523a2eff32fe7ae56ab8feb2e43f8b41 +P 2d9cd06715092c312c8c0ec392696a0e90ed090b074e2082e0b830f1399aa941 +R aefdd33a1c83587ad3b0becf4339d1cc U dan -Z 25bb1be3c29e0b5fdd31f536b284fa69 +Z df47a0dfd1efad16167473814c8098a6 diff --git a/manifest.uuid b/manifest.uuid index c0b6dffa95..c8a242b3f7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2d9cd06715092c312c8c0ec392696a0e90ed090b074e2082e0b830f1399aa941 \ No newline at end of file +d0d5689371577b2861d4a9464443d055f3256f3f51d89e0388233a4cbe2601ee \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index e38425be95..d98f69a666 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -2151,5 +2151,16 @@ do_catchsql_test 14.2 { INSERT INTO t1(t1) VALUES('optimize'); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 15.0 { + CREATE VIRTUAL TABLE t1 USING fts3(a, content=""); + INSERT INTO t1_segdir VALUES(0,0,0,0,'0 665',X'000261640303040002086970697363696e670301080001056c6971756103020c00050269700304040001036d65740301060001036e6a6d03080900010375746503050300000663696c6c756d0306020001066f6d6d6f646f0304070002096e736563746574757203010700050471756174030408000104756c7061030804000207706964617461740307050000086465736572756e740308070001016f0302030002036c6f720601040004050005016506020a00040300010375697303050200000265610304060001066975736d6f640302040001036c69740301090001036e696d13030300010373736503050b0002017403080b0001017403020900010175030604000101780304050002076365707465757203070100020a65726369746174696f6e030309000006667567696174030605000002696403080a0001016e070506040003030002086369646964756e740302060001047073756d030103000104727572650305040000066c61626f7265030208000502697303030b000502756d03080c0001046f72656d0301020000056d61676e6103020b000104696e696d0303050001056f6c6c69740308080000046e6973690304020001026f6e0307060002057374727564030308000104756c6c610306060000086f636361656361740307040001066666696369610308060000087061726961747572030607000107726f6964656e740307070000037175690308050003017303030700000d726570726568656e6465726974030507000003736564030202000103696e7403070300020174030105000103756e7403080200000674656d706f72030205000007756c6c616d636f03030a0001017409020700010200010300000576656c697403050a0002046e69616d0303060001086f6c75707461746503050900'); +} + +do_execsql_test 15.1 { + SELECT quote(matchinfo(t1, t1 ))==0 FROM t1 WHERE t1 MATCH 'e*'; +} {0 0 0 0 0 0} + finish_test From a47e709e89db6011aa13727cb620bdc566bd33a0 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Jan 2019 04:00:14 +0000 Subject: [PATCH 132/306] Add the ability to process dbsqlfuzz cases in fuzzcheck and add an initial set of interesting dbsqlfuzz cases. FossilOrigin-Name: fb9074ff450a67feaa62ca61d19154de26d5c8a8d147409ee6d1fbd667b2914f --- Makefile.in | 9 +- Makefile.msc | 15 +- main.mk | 8 +- manifest | 24 ++- manifest.uuid | 2 +- test/fuzzcheck.c | 475 +++++++++++++++++++++++++++++++++++++++++++++- test/fuzzdata8.db | Bin 0 -> 732160 bytes 7 files changed, 515 insertions(+), 18 deletions(-) create mode 100644 test/fuzzdata8.db diff --git a/Makefile.in b/Makefile.in index 43fb38a46f..3904e45c0e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -589,7 +589,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata4.db \ $(TOP)/test/fuzzdata5.db \ $(TOP)/test/fuzzdata6.db \ - $(TOP)/test/fuzzdata7.db + $(TOP)/test/fuzzdata7.db \ + $(TOP)/test/fuzzdata8.db # Standard options to testfixture # @@ -612,6 +613,12 @@ FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 FUZZCHECK_OPT += -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPT += -DSQLITE_ENABLE_DESERIALIZE +FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 +#FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS5 +FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE +FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY +FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB FUZZCHECK_SRC = $(TOP)/test/fuzzcheck.c $(TOP)/test/ossfuzz.c DBFUZZ_OPT = diff --git a/Makefile.msc b/Makefile.msc index fdd1f98f9c..b4fa372f9a 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1626,7 +1626,8 @@ FUZZDATA = \ $(TOP)\test\fuzzdata4.db \ $(TOP)\test\fuzzdata5.db \ $(TOP)\test\fuzzdata6.db \ - $(TOP)\test\fuzzdata7.db + $(TOP)\test\fuzzdata7.db \ + $(TOP)\test\fuzzdata8.db # <> # Additional compiler options for the shell. These are only effective @@ -1644,7 +1645,13 @@ SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_DESERIALIZE=1 # MPTESTER_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 FUZZERSHELL_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -FUZZCHECK_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ -DSQLITE_MAX_MEMORY=50000000 -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ -DSQLITE_MAX_MEMORY=50000000 -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_DESERIALIZE +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_FTS4 +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_RTREE +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_GEOPOLY +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_DBSTAT_VTAB + FUZZCHECK_SRC = $(TOP)\test\fuzzcheck.c $(TOP)\test\ossfuzz.c OSSSHELL_SRC = $(TOP)\test\ossshell.c $(TOP)\test\ossfuzz.c DBFUZZ_COMPILE_OPTS = -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION @@ -1731,10 +1738,10 @@ dbfuzz.exe: $(TOP)\test\dbfuzz.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) $(DBFUZZ_COMPILE_OPTS) $(TOP)\test\dbfuzz.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) fuzzcheck.exe: $(FUZZCHECK_SRC) $(SQLITE3C) $(SQLITE3H) - $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(FUZZCHECK_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + $(LTLINK) $(NO_WARN) $(FUZZCHECK_OPTS) $(FUZZCHECK_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) ossshell.exe: $(OSSSHELL_SRC) $(SQLITE3C) $(SQLITE3H) - $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(OSSSHELL_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + $(LTLINK) $(NO_WARN) $(FUZZCHECK_OPTS) $(OSSSHELL_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) sessionfuzz.exe: zlib $(TOP)\test\sessionfuzz.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) -I$(ZLIBINCDIR) $(TOP)\test\sessionfuzz.c /link $(LDFLAGS) $(LTLINKOPTS) /LIBPATH:$(ZLIBLIBDIR) $(ZLIBLIB) diff --git a/main.mk b/main.mk index 9667db3253..d18863b11e 100644 --- a/main.mk +++ b/main.mk @@ -510,7 +510,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata4.db \ $(TOP)/test/fuzzdata5.db \ $(TOP)/test/fuzzdata6.db \ - $(TOP)/test/fuzzdata7.db + $(TOP)/test/fuzzdata7.db \ + $(TOP)/test/fuzzdata8.db # Standard options to testfixture # @@ -531,6 +532,11 @@ FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 FUZZCHECK_OPT += -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPT += -DSQLITE_ENABLE_DESERIALIZE +FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 +FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE +FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY +FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB DBFUZZ_OPT = KV_OPT = -DSQLITE_THREADSAFE=0 -DSQLITE_DIRECT_OVERFLOW_READ ST_OPT = -DSQLITE_THREADSAFE=0 diff --git a/manifest b/manifest index eeded3f3c7..1a0ca0401f 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,10 @@ -C Fix\sa\sbuffer\soverread\sin\sfts3\sthat\scould\soccur\sin\sa\sprefix\squery\son\sa\scorrupted\sdatabase. -D 2019-01-24T17:41:12.741 +C Add\sthe\sability\sto\sprocess\sdbsqlfuzz\scases\sin\sfuzzcheck\sand\sadd\san\sinitial\nset\sof\sinteresting\sdbsqlfuzz\scases. +D 2019-01-25T04:00:14.721 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 +F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc e04060b2138cefc198809d7adad70aebb4a667520b9133fe07a90a1769522dc7 +F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee F VERSION 453e2f4529ca208196d5567db28d549d7151f79efd33f6e6cfe6e613e583a0be F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -436,7 +436,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 468c42acafaf69ae8d514d40cae78343b1d825aabd82e0368f6a3bcf8e4d2469 +F main.mk e28b19556f75ba6e841fc9c883d6a3c16edeae2d16d4edf32bf3c150725fc4d8 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -984,7 +984,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 6edb2a0b6c8113cdac10f8e35b891be1a1b08ebacb1c2e2f93876d4d056e8e15 +F test/fuzzcheck.c 4082901a0665a5135b295fe81aa0ee325d42e1e28a0e3058a4082d249a321899 F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -992,6 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 +F test/fuzzdata8.db 8a96892bd2535578ff2ca27db823b7e149cfce6694c15ca80521fa758be605b1 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1802,7 +1803,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 2d9cd06715092c312c8c0ec392696a0e90ed090b074e2082e0b830f1399aa941 -R aefdd33a1c83587ad3b0becf4339d1cc -U dan -Z df47a0dfd1efad16167473814c8098a6 +P d0d5689371577b2861d4a9464443d055f3256f3f51d89e0388233a4cbe2601ee +R a483eb7b902b414248e92f9e64472126 +T *branch * dbsqlfuzz-in-fuzzcheck +T *sym-dbsqlfuzz-in-fuzzcheck * +T -sym-trunk * +U drh +Z 174f299274057b1d40bc6ac9348469f7 diff --git a/manifest.uuid b/manifest.uuid index c8a242b3f7..71191813f9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d0d5689371577b2861d4a9464443d055f3256f3f51d89e0388233a4cbe2601ee \ No newline at end of file +fb9074ff450a67feaa62ca61d19154de26d5c8a8d147409ee6d1fbd667b2914f \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 0db4167445..3175bf33e7 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -69,6 +69,7 @@ #include #include #include +#include #include "sqlite3.h" #define ISSPACE(X) isspace((unsigned char)(X)) #define ISDIGIT(X) isdigit((unsigned char)(X)) @@ -400,7 +401,6 @@ static void blobListFree(Blob *p){ } } - /* Return the current wall-clock time */ static sqlite3_int64 timeOfDay(void){ static sqlite3_vfs *clockVfs = 0; @@ -419,6 +419,448 @@ static sqlite3_int64 timeOfDay(void){ return t; } +/*************************************************************************** +** Code to process combined database+SQL scripts generated by the +** dbsqlfuzz fuzzer. +*/ + +/* An instance of the following object is passed by pointer as the +** client data to various callbacks. +*/ +typedef struct FuzzCtx { + sqlite3 *db; /* The database connection */ + sqlite3_int64 iCutoffTime; /* Stop processing at this time. */ + sqlite3_int64 iLastCb; /* Time recorded for previous progress callback */ + sqlite3_int64 mxInterval; /* Longest interval between two progress calls */ + unsigned nCb; /* Number of progress callbacks */ + unsigned mxCb; /* Maximum number of progress callbacks allowed */ + unsigned execCnt; /* Number of calls to the sqlite3_exec callback */ + int timeoutHit; /* True when reaching a timeout */ +} FuzzCtx; + +/* Verbosity level for the dbsqlfuzz test runner */ +static int eVerbosity = 0; + +/* True to activate PRAGMA vdbe_debug=on */ +static int bVdbeDebug = 0; + +/* Timeout for each fuzzing attempt, in milliseconds */ +static int iTimeout = 10000; /* Defaults to 10 seconds */ + +/* Maximum number of progress handler callbacks */ +static unsigned int mxProgressCb = 2000; + +/* Maximum string length in SQLite */ +static int lengthLimit = 1000000; + +/* Maximum byte-code program length in SQLite */ +static int vdbeOpLimit = 25000; + +/* Maximum size of the in-memory database */ +static sqlite3_int64 maxDbSize = 104857600; + +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +static unsigned int hexToInt(unsigned int h){ +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); /* EBCDIC */ +#else + h += 9*(1&(h>>6)); /* ASCII */ +#endif + return h & 0xf; +} + +/* +** The first character of buffer zIn[0..nIn-1] is a '['. This routine +** checked to see if the buffer holds "[NNNN]" or "[+NNNN]" and if it +** does it makes corresponding changes to the *pK value and *pI value +** and returns true. If the input buffer does not match the patterns, +** no changes are made to either *pK or *pI and this routine returns false. +*/ +static int isOffset( + const unsigned char *zIn, /* Text input */ + int nIn, /* Bytes of input */ + unsigned int *pK, /* half-byte cursor to adjust */ + unsigned int *pI /* Input index to adjust */ +){ + int i; + unsigned int k = 0; + unsigned char c; + for(i=1; i=nAlloc ){ + sqlite3_uint64 newSize; + if( nAlloc==MX_FILE_SZ || j>=MX_FILE_SZ ){ + if( eVerbosity ){ + fprintf(stderr, "Input database too big: max %d bytes\n", + MX_FILE_SZ); + } + sqlite3_free(a); + return -1; + } + newSize = nAlloc*2; + if( newSize<=j ){ + newSize = (j+4096)&~4095; + } + if( newSize>MX_FILE_SZ ){ + if( j>=MX_FILE_SZ ){ + sqlite3_free(a); + return -1; + } + newSize = MX_FILE_SZ; + } + a = sqlite3_realloc( a, newSize ); + if( a==0 ){ + fprintf(stderr, "Out of memory!\n"); + exit(1); + } + assert( newSize > nAlloc ); + memset(a+nAlloc, 0, newSize - nAlloc); + nAlloc = newSize; + } + if( j>=(unsigned)mx ){ + mx = (j + 4095)&~4095; + if( mx>MX_FILE_SZ ) mx = MX_FILE_SZ; + } + assert( j=p->iCutoffTime; + sqlite3_int64 iDiff = iNow - p->iLastCb; + if( iDiff > p->mxInterval ) p->mxInterval = iDiff; + p->nCb++; + if( rc==0 && p->mxCb>0 && p->mxCb<=p->nCb ) rc = 1; + if( rc && !p->timeoutHit && eVerbosity ){ + printf("Timeout on progress callback %d\n", p->nCb); + fflush(stdout); + p->timeoutHit = 1; + } + return rc; +} + +/* +** Disallow debugging pragmas such as "PRAGMA vdbe_debug" and +** "PRAGMA parser_trace" since they can dramatically increase the +** amount of output without actually testing anything useful. +** +** Also block ATTACH and DETACH +*/ +static int block_troublesome_sql( + void *Notused, + int eCode, + const char *zArg1, + const char *zArg2, + const char *zArg3, + const char *zArg4 +){ + (void)Notused; + (void)zArg2; + (void)zArg3; + (void)zArg4; + if( eCode==SQLITE_PRAGMA ){ + if( sqlite3_strnicmp("vdbe_", zArg1, 5)==0 + || sqlite3_stricmp("parser_trace", zArg1)==0 + || sqlite3_stricmp("temp_store_directory", zArg1)==0 + ){ + return SQLITE_DENY; + } + }else if( (eCode==SQLITE_ATTACH || eCode==SQLITE_DETACH) + && zArg1 && zArg1[0] ){ + return SQLITE_DENY; + } + return SQLITE_OK; +} + +/* +** Run the SQL text +*/ +static int runDbSql(sqlite3 *db, const char *zSql){ + int rc; + sqlite3_stmt *pStmt; + while( isspace(zSql[0]) ) zSql++; + if( zSql[0]==0 ) return SQLITE_OK; + if( eVerbosity>=3 ){ + printf("RUNNING-SQL: [%s]\n", zSql); + fflush(stdout); + } + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ){ + if( eVerbosity>=4 ){ + int j; + for(j=0; j=4 ) */ + } /* End while( SQLITE_ROW */ + if( rc!=SQLITE_DONE && eVerbosity>=3 ){ + printf("SQL-ERROR: (%d) %s\n", rc, sqlite3_errmsg(db)); + fflush(stdout); + } + }else if( eVerbosity>=3 ){ + printf("SQL-ERROR (%d): %s\n", rc, sqlite3_errmsg(db)); + fflush(stdout); + } /* End if( SQLITE_OK ) */ + return sqlite3_finalize(pStmt); +} + +/* Invoke this routine to run a single test case */ +int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte){ + int rc; /* SQLite API return value */ + int iSql; /* Index in aData[] of start of SQL */ + unsigned char *aDb = 0; /* Decoded database content */ + int nDb = 0; /* Size of the decoded database */ + int i; /* Loop counter */ + int j; /* Start of current SQL statement */ + char *zSql = 0; /* SQL text to run */ + int nSql; /* Bytes of SQL text */ + FuzzCtx cx; /* Fuzzing context */ + + if( nByte<10 ) return 0; + if( sqlite3_initialize() ) return 0; + if( sqlite3_memory_used()!=0 ){ + int nAlloc = 0; + int nNotUsed = 0; + sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &nAlloc, &nNotUsed, 0); + fprintf(stderr,"Memory leak in mutator: %lld bytes in %d allocations\n", + sqlite3_memory_used(), nAlloc); + exit(1); + } + memset(&cx, 0, sizeof(cx)); + iSql = decodeDatabase((unsigned char*)aData, (int)nByte, &aDb, &nDb); + if( iSql<0 ) return 0; + nSql = nByte - iSql; + if( eVerbosity>=2 ){ + printf( + "****** %d-byte input, %d-byte database, %d-byte script " + "******\n", (int)nByte, nDb, nSql); + fflush(stdout); + } + rc = sqlite3_open(0, &cx.db); + if( rc ) return 1; + if( bVdbeDebug ){ + sqlite3_exec(cx.db, "PRAGMA vdbe_debug=ON", 0, 0, 0); + } + + /* Invoke the progress handler frequently to check to see if we + ** are taking too long. The progress handler will return true + ** (which will block further processing) if more than iTimeout seconds have + ** elapsed since the start of the test. + */ + cx.iLastCb = timeOfDay(); + cx.iCutoffTime = cx.iLastCb + iTimeout; /* Now + iTimeout seconds */ + cx.mxCb = mxProgressCb; +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + sqlite3_progress_handler(cx.db, 10, progress_handler, (void*)&cx); +#endif + + /* Set a limit on the maximum size of a prepared statement, and the + ** maximum length of a string or blob */ + if( vdbeOpLimit>0 ){ + sqlite3_limit(cx.db, SQLITE_LIMIT_VDBE_OP, vdbeOpLimit); + } + if( lengthLimit>0 ){ + sqlite3_limit(cx.db, SQLITE_LIMIT_LENGTH, lengthLimit); + } + + if( nDb>=20 && aDb[18]==2 && aDb[19]==2 ){ + aDb[18] = aDb[19] = 1; + } + rc = sqlite3_deserialize(cx.db, "main", aDb, nDb, nDb, + SQLITE_DESERIALIZE_RESIZEABLE | + SQLITE_DESERIALIZE_FREEONCLOSE); + if( rc ){ + fprintf(stderr, "sqlite3_deserialize() failed with %d\n", rc); + goto testrun_finished; + } + if( maxDbSize>0 ){ + sqlite3_int64 x = maxDbSize; + sqlite3_file_control(cx.db, "main", SQLITE_FCNTL_SIZE_LIMIT, &x); + } + + /* Block debug pragmas and ATTACH/DETACH. But wait until after + ** deserialize to do this because deserialize depends on ATTACH */ + sqlite3_set_authorizer(cx.db, block_troublesome_sql, 0); + + /* Consistent PRNG seed */ + sqlite3_randomness(0,0); + + zSql = sqlite3_malloc( nSql + 1 ); + if( zSql==0 ){ + fprintf(stderr, "Out of memory!\n"); + }else{ + memcpy(zSql, aData+iSql, nSql); + zSql[nSql] = 0; + for(i=j=0; zSql[i]; i++){ + if( zSql[i]==';' ){ + char cSaved = zSql[i+1]; + zSql[i+1] = 0; + if( sqlite3_complete(zSql+j) ){ + rc = runDbSql(cx.db, zSql+j); + j = i+1; + } + zSql[i+1] = cSaved; + if( rc==SQLITE_INTERRUPT || progress_handler(&cx) ){ + goto testrun_finished; + } + } + } + if( j4 && memcmp(a,"\n--\n",4)==0 ) return 1; + while( n>0 && isspace(a[0]) ){ a++; n--; } + if( n>8 && memcmp(a,"53514c69",8)==0 ) return 1; + return 0; +} + + /* Methods for the VHandle object */ static int inmemClose(sqlite3_file *pFile){ @@ -951,6 +1393,7 @@ int main(int argc, char **argv){ if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ quietFlag = 1; verboseFlag = 0; + eVerbosity = 0; }else if( strcmp(z,"rebuild")==0 ){ rebuildFlag = 1; @@ -976,8 +1419,18 @@ int main(int argc, char **argv){ if( strcmp(z,"verbose")==0 || strcmp(z,"v")==0 ){ quietFlag = 0; verboseFlag++; + eVerbosity++; if( verboseFlag>1 ) runFlags |= SQL_TRACE; }else + if( strcmp(z,"version")==0 ){ + int ii; + const char *z; + printf("SQLite %s %s\n", sqlite3_libversion(), sqlite3_sourceid()); + for(ii=0; (z = sqlite3_compileoption_get(ii))!=0; ii++){ + printf("%s\n", z); + } + return 0; + }else { fatalError("unknown option: %s", argv[i]); } @@ -1230,6 +1683,26 @@ int main(int argc, char **argv){ */ if( !verboseFlag && !quietFlag ) printf("%s:", zDbName); for(pSql=g.pFirstSql; pSql; pSql=pSql->pNext){ + if( isDbSql(pSql->a, pSql->sz) ){ + sqlite3_snprintf(sizeof(g.zTestName), g.zTestName, "sqlid=%d",pSql->id); + if( verboseFlag ){ + printf("%s\n", g.zTestName); + fflush(stdout); + }else if( !quietFlag ){ + static int prevAmt = -1; + int idx = pSql->seq; + int amt = idx*10/(g.nSql); + if( amt!=prevAmt ){ + printf(" %d%%", amt*10); + fflush(stdout); + prevAmt = amt; + } + } + runCombinedDbSqlInput(pSql->a, pSql->sz); + nTest++; + g.zTestName[0] = 0; + continue; + } for(pDb=g.pFirstDb; pDb; pDb=pDb->pNext){ int openFlags; const char *zVfs = "inmem"; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db new file mode 100644 index 0000000000000000000000000000000000000000..ba1723ee59d1590d47df19761fdf8c68da5a9cbe GIT binary patch literal 732160 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 Date: Fri, 25 Jan 2019 04:43:26 +0000 Subject: [PATCH 133/306] Improved automatic detection of dbsqlfuzz cases in fuzzcheck. FossilOrigin-Name: 1ef24e89c9630fd383ba32f5aefcf9c27907f27f5072f3537a1cfd75a093a8d7 --- manifest | 15 ++++++--------- manifest.uuid | 2 +- test/fuzzcheck.c | 23 ++++++++++++++--------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 1a0ca0401f..fb82c3f1fa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sability\sto\sprocess\sdbsqlfuzz\scases\sin\sfuzzcheck\sand\sadd\san\sinitial\nset\sof\sinteresting\sdbsqlfuzz\scases. -D 2019-01-25T04:00:14.721 +C Improved\sautomatic\sdetection\sof\sdbsqlfuzz\scases\sin\sfuzzcheck. +D 2019-01-25T04:43:26.372 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -984,7 +984,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 4082901a0665a5135b295fe81aa0ee325d42e1e28a0e3058a4082d249a321899 +F test/fuzzcheck.c 1a65151681ada94f8543ccfe07fbd2d5ba509efdc74bd144569f8d61f242e707 F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1803,10 +1803,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 d0d5689371577b2861d4a9464443d055f3256f3f51d89e0388233a4cbe2601ee -R a483eb7b902b414248e92f9e64472126 -T *branch * dbsqlfuzz-in-fuzzcheck -T *sym-dbsqlfuzz-in-fuzzcheck * -T -sym-trunk * +P fb9074ff450a67feaa62ca61d19154de26d5c8a8d147409ee6d1fbd667b2914f +R 1a930dbefe744ebdcb05eea9b0188b90 U drh -Z 174f299274057b1d40bc6ac9348469f7 +Z c5c751ac97a3bb1a31a35d47c24bdd62 diff --git a/manifest.uuid b/manifest.uuid index 71191813f9..698172e5dd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fb9074ff450a67feaa62ca61d19154de26d5c8a8d147409ee6d1fbd667b2914f \ No newline at end of file +1ef24e89c9630fd383ba32f5aefcf9c27907f27f5072f3537a1cfd75a093a8d7 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 3175bf33e7..3fac76d9a2 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -604,7 +604,7 @@ static int progress_handler(void *pClientData) { if( iDiff > p->mxInterval ) p->mxInterval = iDiff; p->nCb++; if( rc==0 && p->mxCb>0 && p->mxCb<=p->nCb ) rc = 1; - if( rc && !p->timeoutHit && eVerbosity ){ + if( rc && !p->timeoutHit && eVerbosity>=2 ){ printf("Timeout on progress callback %d\n", p->nCb); fflush(stdout); p->timeoutHit = 1; @@ -653,14 +653,14 @@ static int runDbSql(sqlite3 *db, const char *zSql){ sqlite3_stmt *pStmt; while( isspace(zSql[0]) ) zSql++; if( zSql[0]==0 ) return SQLITE_OK; - if( eVerbosity>=3 ){ + if( eVerbosity>=4 ){ printf("RUNNING-SQL: [%s]\n", zSql); fflush(stdout); } rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); if( rc==SQLITE_OK ){ while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ){ - if( eVerbosity>=4 ){ + if( eVerbosity>=5 ){ int j; for(j=0; j=4 ) */ + } /* End if( eVerbosity>=5 ) */ } /* End while( SQLITE_ROW */ - if( rc!=SQLITE_DONE && eVerbosity>=3 ){ + if( rc!=SQLITE_DONE && eVerbosity>=4 ){ printf("SQL-ERROR: (%d) %s\n", rc, sqlite3_errmsg(db)); fflush(stdout); } - }else if( eVerbosity>=3 ){ + }else if( eVerbosity>=4 ){ printf("SQL-ERROR (%d): %s\n", rc, sqlite3_errmsg(db)); fflush(stdout); } /* End if( SQLITE_OK ) */ @@ -745,7 +745,7 @@ int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte){ iSql = decodeDatabase((unsigned char*)aData, (int)nByte, &aDb, &nDb); if( iSql<0 ) return 0; nSql = nByte - iSql; - if( eVerbosity>=2 ){ + if( eVerbosity>=3 ){ printf( "****** %d-byte input, %d-byte database, %d-byte script " "******\n", (int)nByte, nDb, nSql); @@ -830,7 +830,7 @@ testrun_finished: if( rc!=SQLITE_OK ){ fprintf(stdout, "sqlite3_close() returns %d\n", rc); } - if( eVerbosity ){ + if( eVerbosity>=2 ){ fprintf(stdout, "Peak memory usages: %f MB\n", sqlite3_memory_highwater(1) / 1000000.0); } @@ -854,9 +854,14 @@ testrun_finished: ** true if this does appear to be a dbsqlfuzz test case and false otherwise. */ static int isDbSql(unsigned char *a, int n){ + unsigned char buf[12]; + int i; if( n>4 && memcmp(a,"\n--\n",4)==0 ) return 1; while( n>0 && isspace(a[0]) ){ a++; n--; } - if( n>8 && memcmp(a,"53514c69",8)==0 ) return 1; + for(i=0; n>0 && i<8; n--, a++){ + if( isxdigit(a[0]) ) buf[i++] = a[0]; + } + if( i==8 && memcmp(buf,"53514c69",8)==0 ) return 1; return 0; } From 725a9c7f6c0d406cac38d41d286c023dd5896417 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Jan 2019 13:03:38 +0000 Subject: [PATCH 134/306] In fuzzcheck, activate vdbe_debug for dbsqlfuzz cases when using the -vvvvv verbosity level or above. FossilOrigin-Name: 2e6f7c2aced49824a38b3494b796a8ec73aa7a90b51159f670596df15ed1c5ab --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 27 ++++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index fb82c3f1fa..d073cbd167 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sautomatic\sdetection\sof\sdbsqlfuzz\scases\sin\sfuzzcheck. -D 2019-01-25T04:43:26.372 +C In\sfuzzcheck,\sactivate\svdbe_debug\sfor\sdbsqlfuzz\scases\swhen\susing\sthe\s-vvvvv\nverbosity\slevel\sor\sabove. +D 2019-01-25T13:03:38.630 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -984,7 +984,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 1a65151681ada94f8543ccfe07fbd2d5ba509efdc74bd144569f8d61f242e707 +F test/fuzzcheck.c b72e92f38747e4fe45b4df41a750a9ee3797f28e808c11b753d91d750a559c51 F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1803,7 +1803,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 fb9074ff450a67feaa62ca61d19154de26d5c8a8d147409ee6d1fbd667b2914f -R 1a930dbefe744ebdcb05eea9b0188b90 +P 1ef24e89c9630fd383ba32f5aefcf9c27907f27f5072f3537a1cfd75a093a8d7 +R 78219aab4a0221491f08b172e31b7d10 U drh -Z c5c751ac97a3bb1a31a35d47c24bdd62 +Z 41b8e92f1ee93947404c7576345f9b31 diff --git a/manifest.uuid b/manifest.uuid index 698172e5dd..fced87f945 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ef24e89c9630fd383ba32f5aefcf9c27907f27f5072f3537a1cfd75a093a8d7 \ No newline at end of file +2e6f7c2aced49824a38b3494b796a8ec73aa7a90b51159f670596df15ed1c5ab \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 3fac76d9a2..45e2168356 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -793,6 +793,11 @@ int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte){ sqlite3_file_control(cx.db, "main", SQLITE_FCNTL_SIZE_LIMIT, &x); } + /* For high debugging levels, turn on debug mode */ + if( eVerbosity>=5 ){ + sqlite3_exec(cx.db, "PRAGMA vdbe_debug=ON;", 0, 0, 0); + } + /* Block debug pragmas and ATTACH/DETACH. But wait until after ** deserialize to do this because deserialize depends on ATTACH */ sqlite3_set_authorizer(cx.db, block_troublesome_sql, 0); @@ -1242,6 +1247,19 @@ static int integerValue(const char *zArg){ return (int)(isNeg? -v : v); } +/* +** Return the number of "v" characters in a string. Return 0 if there +** are any characters in the string other than "v". +*/ +static int numberOfVChar(const char *z){ + int N = 0; + while( z[0] && z[0]=='v' ){ + z++; + N++; + } + return z[0]==0 ? N : 0; +} + /* ** Print sketchy documentation for this utility program */ @@ -1315,6 +1333,7 @@ int main(int argc, char **argv){ int nativeMalloc = 0; /* Turn off MEMSYS3/5 and lookaside if true */ sqlite3_vfs *pDfltVfs; /* The default VFS */ int openFlags4Data; /* Flags for sqlite3_open_v2() */ + int nV; /* How much to increase verbosity with -vvvv */ sqlite3_initialize(); iBegin = timeOfDay(); @@ -1421,12 +1440,18 @@ int main(int argc, char **argv){ fatalError("timeout is not available on non-unix systems"); #endif }else - if( strcmp(z,"verbose")==0 || strcmp(z,"v")==0 ){ + if( strcmp(z,"verbose")==0 ){ quietFlag = 0; verboseFlag++; eVerbosity++; if( verboseFlag>1 ) runFlags |= SQL_TRACE; }else + if( (nV = numberOfVChar(z))>=1 ){ + quietFlag = 0; + verboseFlag += nV; + eVerbosity += nV; + if( verboseFlag>1 ) runFlags |= SQL_TRACE; + }else if( strcmp(z,"version")==0 ){ int ii; const char *z; From ba14c69b4fc447c3749308a3d889b0da55083e5d Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 25 Jan 2019 13:42:12 +0000 Subject: [PATCH 135/306] Fix a couple of assert() statments in btree.c that could fail with corrupt databases. FossilOrigin-Name: 5eb5e8289fa71e5e29e081d33d4a59c64b463bf6b06d7070c05c46d77d808ad4 --- manifest | 14 ++-- manifest.uuid | 2 +- src/btree.c | 4 +- test/corruptL.test | 204 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 214 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index eeded3f3c7..ed68435855 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverread\sin\sfts3\sthat\scould\soccur\sin\sa\sprefix\squery\son\sa\scorrupted\sdatabase. -D 2019-01-24T17:41:12.741 +C Fix\sa\scouple\sof\sassert()\sstatments\sin\sbtree.c\sthat\scould\sfail\swith\scorrupt\sdatabases. +D 2019-01-25T13:42:12.343 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 21eb929285901255cf0af2f8e2e9ee41c77e0620e031ddad3d065cfaf95583fd +F src/btree.c f7ee98fca2c136020527050c00bb63b89cb663a1fad69160bdd332d9c73ce5da F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc @@ -757,7 +757,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 -F test/corruptL.test 05e4e193bdd56896bae94d1d1f73a29ff41c9c2bafe32bd390d547c5bfa38f34 +F test/corruptL.test 4c0674edd28dfcf027f57b61944dd6f1ba61c6e98f4f6d72f0adafaef238b593 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf @@ -1802,7 +1802,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 2d9cd06715092c312c8c0ec392696a0e90ed090b074e2082e0b830f1399aa941 -R aefdd33a1c83587ad3b0becf4339d1cc +P d0d5689371577b2861d4a9464443d055f3256f3f51d89e0388233a4cbe2601ee +R 86e5fe4bfae1d318cbbdc2a84c65ab72 U dan -Z df47a0dfd1efad16167473814c8098a6 +Z 4fafd1aea85fe91f1dc4e55e3b1f6edd diff --git a/manifest.uuid b/manifest.uuid index c8a242b3f7..d7dd384dc6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d0d5689371577b2861d4a9464443d055f3256f3f51d89e0388233a4cbe2601ee \ No newline at end of file +5eb5e8289fa71e5e29e081d33d4a59c64b463bf6b06d7070c05c46d77d808ad4 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 401f02eeba..2345bb006d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6110,7 +6110,7 @@ static int allocateBtreePage( TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); } - assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + assert( CORRUPT_DB || *pPgno!=PENDING_BYTE_PAGE(pBt) ); end_allocate_page: releasePage(pTrunk); @@ -7175,7 +7175,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ CellArray b; assert( sqlite3PagerIswriteable(pNew->pDbPage) ); - assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); + assert( CORRUPT_DB || pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); b.nCell = 1; b.pRef = pPage; diff --git a/test/corruptL.test b/test/corruptL.test index ee16b9c1df..638365d6e4 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -376,4 +376,208 @@ do_catchsql_test 4.1 { } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 5.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 192512 pagesize 4096 filename crash-9ae5502296c949.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 2f .....@ ......./ +| 32: 00 00 00 1b 00 00 00 13 00 00 00 03 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 06 00 00 00 01 00 00 00 00 ................ +| 64: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 04 0e e2 00 0f 96 0f 44 ...............D +| 112: 0f 10 0e e2 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3808: 00 00 2c 04 06 17 15 11 01 41 69 6e 64 65 78 74 ..,......Aindext +| 3824: 31 78 32 74 31 06 43 52 45 41 54 45 20 49 4e 44 1x2t1.CREATE IND +| 3840: 45 58 20 74 31 78 32 20 4f 4e 20 74 31 28 62 29 EX t1x2 ON t1(b) +| 3856: 32 03 06 17 15 11 01 4d 69 6e 64 65 78 74 31 78 2......Mindext1x +| 3872: 31 74 31 05 43 52 45 41 54 45 20 49 4e 44 45 58 1t1.CREATE INDEX +| 3888: 20 74 31 78 31 20 4f 4e 20 74 31 28 67 2b 68 2c t1x1 ON t1(g+h, +| 3904: 6a 2c 6b 29 50 02 06 17 2b 2b 01 59 74 61 62 6c j,k)P...++.Ytabl +| 3920: 65 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 esqlite_sequence +| 3936: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 04 sqlite_sequence. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c CREATE TABLE sql +| 3968: 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d ite_sequence(nam +| 3984: 65 2c 73 65 71 29 68 01 07 17 11 11 01 81 3b 74 e,seq)h.......;t +| 4000: 61 62 6c 65 74 31 74 31 03 43 52 45 41 54 45 20 ablet1t1.CREATE +| 4016: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 TABLE t1(a INTEG +| 4032: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 41 ER PRIMARY KEY A +| 4048: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 2c 0a 62 2c UTOINCREMENT,.b, +| 4064: 63 2c 64 2c 65 2c 66 2c 67 2c 68 2c 6a 2c 6b 2c c,d,e,f,g,h,j,k, +| 4080: 6c 2c 6d 2c 6e 2c 6f 2c 70 2c 71 2c 72 2c 73 29 l,m,n,o,p,q,r,s) +| page 2 offset 4096 +| 0: 01 00 00 00 00 01 00 00 00 00 01 00 00 00 00 01 ................ +| 16: 00 00 00 00 02 10 00 00 00 05 00 00 00 03 02 00 ................ +| 32: 00 00 00 05 00 00 00 03 02 00 00 00 00 05 00 00 ................ +| 48: 00 03 02 00 00 00 00 05 00 00 00 03 02 00 00 00 ................ +| 64: 00 05 00 00 00 03 02 00 00 00 00 05 00 00 00 03 ................ +| 80: 02 00 00 00 00 05 00 00 00 03 02 00 00 00 00 05 ................ +| 96: 00 00 00 03 02 00 00 00 00 05 00 00 00 03 05 00 ................ +| 112: 00 00 03 03 00 00 00 23 02 00 00 00 00 03 00 00 .......#........ +| 128: 00 23 02 00 00 00 00 03 00 00 00 23 02 00 00 00 .#.........#.... +| 144: 00 03 00 00 00 23 02 00 00 00 00 03 00 00 00 23 .....#.........# +| 160: 05 00 00 00 06 05 00 00 00 06 02 00 00 00 00 03 ................ +| 176: 00 00 00 06 02 00 00 00 00 03 00 00 00 24 02 00 .............$.. +| 192: 00 00 00 03 00 00 00 24 02 00 00 00 00 03 00 00 .......$........ +| 208: 00 24 02 00 00 00 00 02 00 00 00 00 03 00 00 00 .$.............. +| 224: 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 $............... +| page 3 offset 8192 +| 0: 05 00 00 00 09 0f d0 00 00 00 00 19 0f fb 0f f6 ................ +| 16: 0f f1 0f ec 0f e7 0f e2 0f dc 0f d6 0f d0 0f a0 ................ +| 32: 0f a0 0f a0 0f a0 0f a0 0f a0 0f a0 0f a0 0f a0 ................ +| 1072: 00 97 4c 0a 14 00 ae 7c 00 00 00 00 00 00 00 00 ..L....|........ +| 1088: 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 00 ................ +| 4000: 0f ac 00 06 00 00 00 00 00 30 00 00 00 00 00 00 .........0...... +| 4048: 00 00 00 16 81 2a 00 00 00 14 81 16 00 00 00 12 .....*.......... +| 4064: 81 02 00 00 00 10 6e 00 00 00 0e 5a 00 00 00 0c ......n....Z.... +| 4080: 46 00 00 00 0a 32 00 00 00 08 1e 00 00 00 18 0a F....2.......... +| page 4 offset 12288 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 01 03 11 02 74 31 00 be ............t1.. +| page 5 offset 16384 +| 0: 0a 0f 7c 00 0a 0f 74 00 0f f9 0f eb 0f dd 0f cf ..|...t......... +| 16: 0f c1 0f b3 0f a4 0f 94 0f 84 0f 74 0f 74 0f 74 ...........t.t.t +| 32: 0f 74 0f 74 0f 74 0f 74 0f 74 0f 74 0f 74 00 00 .t.t.t.t.t.t.t.. +| 3952: 00 00 00 00 07 05 00 00 00 02 00 be 0f 8c 00 08 ................ +| 3968: 00 00 00 00 07 05 00 00 00 02 00 aa 0f 9c 00 08 ................ +| 3984: 00 00 00 00 07 05 00 00 00 02 00 96 0f ac 00 08 ................ +| 4000: 00 00 00 00 07 05 00 00 00 02 00 82 0f ba 00 07 ................ +| 4016: 00 00 00 06 05 00 00 00 01 6e 0f c8 00 07 00 00 .........n...... +| 4032: 00 06 05 00 00 00 01 5a 0f d6 00 07 00 00 00 06 .......Z........ +| 4048: 05 00 00 00 01 46 0f e4 00 07 00 00 00 06 05 00 .....F.......... +| 4064: 00 00 01 32 0f f2 00 07 00 00 00 06 05 00 00 00 ...2............ +| 4080: 01 1e 00 00 00 07 00 00 00 06 05 00 00 00 01 0a ................ +| page 6 offset 20480 +| 0: 02 00 00 00 01 0e 0d 00 00 00 00 24 0e 0d 0c 1a ...........$.... +| 16: 06 55 04 66 02 77 00 88 00 00 00 00 00 00 00 00 .U.f.w.......... +| 128: 00 00 00 00 00 00 00 00 97 3d 04 ae 7c 01 00 00 .........=..|... +| 624: 00 00 00 00 00 00 21 97 3d 04 ae 7c 01 00 00 00 ......!.=..|.... +| 1120: 00 00 00 00 00 20 97 3d 04 ae 7c 01 00 00 00 00 ..... .=..|..... +| 1616: 00 00 00 00 1f 97 3d 04 ae 7c 01 00 00 00 00 00 ......=..|...... +| 2112: 00 00 00 1e 97 3d 04 ae 7c 01 00 00 00 00 00 00 .....=..|....... +| 2608: 00 00 1d 97 3d 04 ae 7c 01 00 00 00 00 00 00 00 ....=..|........ +| 3088: 00 00 00 00 00 00 00 00 00 00 00 00 01 f3 00 00 ................ +| 3600: 23 97 3d 04 ae 7c 01 00 00 00 00 00 00 00 00 00 #.=..|.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 26 ...............& +| page 8 offset 28672 +| 0: 0d 00 00 00 01 04 30 00 04 30 00 00 00 00 00 00 ......0..0...... +| 1072: 97 4d 1e 14 00 ae 7c 00 00 00 00 00 00 00 00 00 .M....|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................ +| page 10 offset 36864 +| 256: 0d 00 00 00 01 04 30 00 04 30 00 00 00 00 00 00 ......0..0...... +| 1072: 97 4d 32 14 00 ae 7c 00 00 00 00 00 00 00 00 00 .M2...|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 ................ +| page 12 offset 45056 +| 0: 0d 00 00 00 01 04 30 00 04 30 00 00 00 00 00 00 ......0..0...... +| 1072: 97 4d 46 14 00 ae 7c 00 00 00 00 00 00 00 00 00 .MF...|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 ................ +| page 14 offset 53248 +| 0: 0d 00 00 00 01 04 30 00 04 30 00 00 00 00 00 00 ......0..0...... +| 1072: 97 4d 5a 14 00 ae 7c 00 00 00 00 00 00 00 00 00 .MZ...|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 ................ +| page 16 offset 61440 +| 0: 0d 00 00 00 01 04 30 00 04 30 00 00 00 00 00 00 ......0..0...... +| 1072: 97 4d 6e 14 00 ae 7c 00 00 00 00 00 00 00 00 00 .Mn...|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0b ................ +| page 18 offset 69632 +| 0: 0d 00 00 00 01 04 2f 00 04 2f 00 00 00 00 00 00 ....../../...... +| 1056: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 97 ................ +| 1072: 4d 81 02 14 00 ae 7c 00 00 00 00 00 00 00 00 00 M.....|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d ................ +| page 20 offset 77824 +| 0: 0d 00 00 00 01 04 2f 00 04 2f 00 00 00 00 00 00 ....../../...... +| 1056: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 97 ................ +| 1072: 4d 81 16 14 00 ae 7c 00 00 00 00 00 00 00 00 00 M.....|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0f ................ +| page 22 offset 86016 +| 0: 0d 00 00 00 01 04 2f 00 04 2f 00 00 00 00 00 00 ....../../...... +| 1056: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 97 ................ +| 1072: 4d 81 2a 14 00 ae 7c 00 00 00 00 00 00 00 00 00 M.*...|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 ................ +| page 24 offset 94208 +| 0: 0d 00 00 00 01 04 31 00 04 31 00 00 00 00 00 00 ......1..1...... +| 1072: 00 97 4c 0a 14 00 ae 7c 00 00 00 00 00 00 00 00 ..L....|........ +| 1088: 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 00 ................ +| page 25 offset 98304 +| 0: 0d 00 00 00 01 04 2f 00 04 2f 00 00 00 00 00 00 ....../../...... +| 1056: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 97 ................ +| 1072: 4d 81 3e 14 00 ae 7c 00 00 00 00 00 00 00 00 00 M.>...|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 ................ +| page 26 offset 102400 +| 2512: 00 00 00 00 00 00 00 0a 00 00 00 00 00 00 00 00 ................ +| page 27 offset 106496 +| 0: 00 00 00 00 00 00 00 12 00 00 00 07 00 00 00 1d ................ +| 16: 00 00 00 09 00 00 00 1f 00 00 00 0b 00 00 00 21 ...............! +| 32: 00 00 00 0d 00 00 00 25 00 00 00 0f 00 00 00 19 .......%........ +| 48: 00 00 00 11 00 00 00 29 00 00 00 13 00 00 00 2b .......).......+ +| 64: 00 00 00 15 00 00 00 2d 00 00 00 2e 00 00 00 17 .......-........ +| page 28 offset 110592 +| 2512: 00 00 00 00 00 00 00 1e 00 00 00 00 00 00 00 00 ................ +| page 30 offset 118784 +| 2512: 00 00 00 00 00 00 00 32 00 00 00 00 00 00 00 00 .......2........ +| page 32 offset 126976 +| 2512: 00 00 00 00 00 00 00 46 00 00 00 00 00 00 00 00 .......F........ +| page 34 offset 135168 +| 2512: 00 00 00 00 00 00 00 5a 00 00 00 00 00 00 00 00 .......Z........ +| page 35 offset 139264 +| 0: 0a 08 44 00 05 02 77 00 0e 11 0a 33 06 55 02 77 ..D...w....3.U.w +| 16: 04 66 00 88 00 88 00 88 00 00 00 00 00 00 00 00 .f.............. +| 128: 00 00 00 00 00 00 00 00 04 66 01 ef 00 00 00 00 .........f...... +| 624: 00 00 00 00 00 00 00 97 3d 04 ae 7c 01 00 00 00 ........=..|.... +| 1120: 00 00 00 00 00 20 97 3d 04 ae 7c 01 00 00 00 00 ..... .=..|..... +| 1616: 00 00 00 00 22 97 3d 04 ae 7c 01 00 00 00 00 00 ......=..|...... +| 2112: 00 00 00 1e 0c 22 01 ef 00 00 00 00 00 00 00 00 ................ +| 2608: 00 00 00 97 3d 04 ae 7c 01 00 00 00 00 00 00 00 ....=..|........ +| 3104: 00 1c 00 00 01 ef 00 00 00 00 00 00 00 00 00 00 ................ +| 3600: 00 97 3d 04 ae 7c 01 00 00 00 00 00 00 00 00 00 ..=..|.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1a ................ +| page 36 offset 143360 +| 0: 0a 08 44 00 04 02 77 00 06 55 02 77 04 66 0e 11 ..D...w..U.w.f.. +| 16: 00 88 00 88 00 88 0e 11 00 00 00 00 00 00 00 00 ................ +| 128: 00 00 00 00 00 00 00 00 04 76 01 ef 00 00 00 00 .........v...... +| 624: 00 00 00 00 00 00 00 97 3e 04 ae 7c 02 00 00 00 ........>..|.... +| 1120: 00 00 00 00 00 2a 97 3e 04 ae 7c 02 00 00 00 00 .....*.>..|..... +| 1616: 00 00 00 00 2c 97 3e 04 ae 7c 02 00 00 00 00 00 ....,.>..|...... +| 2112: 00 00 00 28 00 00 05 cd 00 00 00 00 00 00 00 00 ...(............ +| 3600: 00 97 3e 04 ae 7c 02 00 00 00 00 00 00 00 00 00 ..>..|.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f .............../ +| page 38 offset 151552 +| 2512: 00 00 00 00 00 00 00 6e 00 00 00 00 00 00 00 00 .......n........ +| page 40 offset 159744 +| 2512: 00 00 00 00 00 00 00 00 82 00 00 00 00 00 00 00 ................ +| page 42 offset 167936 +| 2512: 00 00 00 00 00 00 00 00 96 00 00 00 00 00 00 00 ................ +| page 44 offset 176128 +| 2512: 00 00 00 00 00 00 00 00 aa 00 00 00 00 00 00 00 ................ +| page 47 offset 188416 +| 2512: 00 00 00 00 00 00 00 00 be 00 00 00 00 00 00 00 ................ +| end crash-9ae5502296c949.db +}]} {} + +do_catchsql_test 5.1 { + INSERT INTO t1(b) VALUES(zeroblob(40000)); +} {1 {database disk image is malformed}} + +do_catchsql_test 5.2 { + DROP INDEX t1x2; +} {0 {}} + +do_catchsql_test 5.3 { + INSERT INTO t1(b) VALUES(zeroblob(40000)); +} {1 {database disk image is malformed}} + + + finish_test From 94f0a8342106b4e1af85bf658bdf1c12ed010c73 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Jan 2019 14:16:01 +0000 Subject: [PATCH 136/306] Fix the xFetch method of the "memdb" VFS (used by deserialize) so that it is robust against corrupt database file. FossilOrigin-Name: 2c1ef40e787a6bc355b50168527a47eb09acd30d0d88cff8336a434ad554115d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/memdb.c | 9 +++++++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d073cbd167..7850145fc8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sfuzzcheck,\sactivate\svdbe_debug\sfor\sdbsqlfuzz\scases\swhen\susing\sthe\s-vvvvv\nverbosity\slevel\sor\sabove. -D 2019-01-25T13:03:38.630 +C Fix\sthe\sxFetch\smethod\sof\sthe\s"memdb"\sVFS\s(used\sby\sdeserialize)\sso\sthat\sit\nis\srobust\sagainst\scorrupt\sdatabase\sfile. +D 2019-01-25T14:16:01.971 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -485,7 +485,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 6099be387f1161e07b20e5ea5118348a6fb7eb55edcb487d6bea15ee917b37e4 +F src/memdb.c d95f6ad26f7c582026c5501b32dc0201ce781ad496bc61107d759b5e4e5c563a F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661 F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81 F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604 @@ -1803,7 +1803,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 1ef24e89c9630fd383ba32f5aefcf9c27907f27f5072f3537a1cfd75a093a8d7 -R 78219aab4a0221491f08b172e31b7d10 +P 2e6f7c2aced49824a38b3494b796a8ec73aa7a90b51159f670596df15ed1c5ab +R d3c46f45cfa450474f5afffc67ad7b0c U drh -Z 41b8e92f1ee93947404c7576345f9b31 +Z 5dedbab04a9e53521f2d03819a9b0105 diff --git a/manifest.uuid b/manifest.uuid index fced87f945..ca48c4134a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2e6f7c2aced49824a38b3494b796a8ec73aa7a90b51159f670596df15ed1c5ab \ No newline at end of file +2c1ef40e787a6bc355b50168527a47eb09acd30d0d88cff8336a434ad554115d \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index e7366961f3..75e83a95dc 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -310,8 +310,13 @@ static int memdbFetch( void **pp ){ MemFile *p = (MemFile *)pFile; - p->nMmap++; - *pp = (void*)(p->aData + iOfst); + if( iOfst+iAmt>p->sz ){ + assert( CORRUPT_DB ); + *pp = 0; + }else{ + p->nMmap++; + *pp = (void*)(p->aData + iOfst); + } return SQLITE_OK; } From c1f6618217f58ee1a1f19e0e8f534a636dae82d9 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 25 Jan 2019 14:48:18 +0000 Subject: [PATCH 137/306] Add an assert_fts3_nc() macro to fts3 - for assert() conditions that are only true when it is guaranteed that the fts3 database is not corrupt. FossilOrigin-Name: 3498908cd7f3d0e35b70796537124e3da0bd99d48750ba51bcb9eba87e28ed4d --- ext/fts3/fts3.c | 8 ++ ext/fts3/fts3Int.h | 12 +++ ext/fts3/fts3_test.c | 31 ++++++- ext/fts3/fts3_write.c | 2 +- manifest | 25 +++-- manifest.uuid | 2 +- test/fts3_common.tcl | 2 + test/fts3corrupt4.test | 204 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 270 insertions(+), 16 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 9996611b16..1d28a14e88 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -320,6 +320,14 @@ int sqlite3Fts3Never(int b) { assert( !b ); return b; } # endif #endif +/* +** This variable is set to false when running tests for which the on disk +** structures should not be corrupt. Otherwise, true. If it is false, extra +** assert() conditions in the fts3 code are activated - conditions that are +** only true if it is guaranteed that the fts3 database is not corrupt. +*/ +int sqlite3_fts3_may_be_corrupt = 1; + /* ** Write a 64-bit variable-length integer to memory starting at p[0]. ** The length of data written will be between 1 and FTS3_VARINT_MAX bytes. diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index d029625c9f..cf03dc3278 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -129,6 +129,18 @@ SQLITE_EXTENSION_INIT3 #define POS_COLUMN (1) /* Column-list terminator */ #define POS_END (0) /* Position-list terminator */ +/* +** The assert_fts3_nc() macro is similar to the assert() macro, except that it +** is used for assert() conditions that are true only if it can be +** guranteed that the database is not corrupt. +*/ +#ifdef SQLITE_DEBUG +extern int sqlite3_fts3_may_be_corrupt; +# define assert_fts3_nc(x) assert(sqlite3_fts3_may_be_corrupt || (x)) +#else +# define assert_fts3_nc(x) assert(x) +#endif + /* ** This section provides definitions to allow the ** FTS3 extension to be compiled outside of the diff --git a/ext/fts3/fts3_test.c b/ext/fts3/fts3_test.c index a48a556c98..8bf7804de0 100644 --- a/ext/fts3/fts3_test.c +++ b/ext/fts3/fts3_test.c @@ -574,6 +574,33 @@ static int SQLITE_TCLAPI fts3_test_varint_cmd( ** End of tokenizer code. **************************************************************************/ +/* +** sqlite3_fts3_may_be_corrupt BOOLEAN +** +** Set or clear the global "may-be-corrupt" flag. Return the old value. +*/ +static int SQLITE_TCLAPI fts3_may_be_corrupt( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + int bOld = sqlite3_fts3_may_be_corrupt; + + if( objc!=2 && objc!=1 ){ + Tcl_WrongNumArgs(interp, 1, objv, "?BOOLEAN?"); + return TCL_ERROR; + } + if( objc==2 ){ + int bNew; + if( Tcl_GetBooleanFromObj(interp, objv[1], &bNew) ) return TCL_ERROR; + sqlite3_fts3_may_be_corrupt = bNew; + } + + Tcl_SetObjResult(interp, Tcl_NewIntObj(bOld)); + return TCL_OK; +} + int Sqlitetestfts3_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand(interp, "fts3_near_match", fts3_near_match_cmd, 0, 0); Tcl_CreateObjCommand(interp, @@ -582,10 +609,12 @@ int Sqlitetestfts3_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand( interp, "fts3_test_tokenizer", fts3_test_tokenizer_cmd, 0, 0 ); - Tcl_CreateObjCommand( interp, "fts3_test_varint", fts3_test_varint_cmd, 0, 0 ); + Tcl_CreateObjCommand( + interp, "sqlite3_fts3_may_be_corrupt", fts3_may_be_corrupt, 0, 0 + ); return TCL_OK; } #endif /* SQLITE_ENABLE_FTS3 || SQLITE_ENABLE_FTS4 */ diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 3e195c3deb..031b7b353b 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -567,7 +567,7 @@ static sqlite3_int64 getAbsoluteLevel( int iLevel /* Level of segments */ ){ sqlite3_int64 iBase; /* First absolute level for iLangid/iIndex */ - assert( iLangid>=0 ); + assert_fts3_nc( iLangid>=0 ); assert( p->nIndex>0 ); assert( iIndex>=0 && iIndexnIndex ); diff --git a/manifest b/manifest index 78586beffc..3ea315fed2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Extend\sfuzzcheck\sso\sthat\sit\scan\sprocess\sdbsqlfuzz\scases.\sAdd\sa\scollection\nof\sinteresting\sdbsqlfuzz\scases\sto\sthe\sstandard\stest\ssuite. -D 2019-01-25T14:23:36.115 +C Add\san\sassert_fts3_nc()\smacro\sto\sfts3\s-\sfor\sassert()\sconditions\sthat\sare\sonly\strue\swhen\sit\sis\sguaranteed\sthat\sthe\sfts3\sdatabase\sis\snot\scorrupt. +D 2019-01-25T14:48:18.788 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -80,9 +80,9 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c c8b68202dd9ae7a4a1f843c8c7bab108a9b43729444d4544d357eac59715b8cd +F ext/fts3/fts3.c 229d0d6e087db5f694fd12e40f48fc748fead59f998b9b7015edee183fbc00f2 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 6c666f314caaeb8fe8e4c1a2d84f8b34406647429a43e8f475b0b0074ad41861 +F ext/fts3/fts3Int.h 24ecc6a79ab97784643e5fb877fa8866a246cb47fcd2f11afa6f787e0f9f28ec F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 @@ -91,14 +91,14 @@ F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 F ext/fts3/fts3_snippet.c 54ac8f4602924c0c57f933e60140ef243976382b80d7c0d8df5a924010803ef8 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a -F ext/fts3/fts3_test.c 79f2a7fbb3f672fa032e5a432ca274ea3ee93c34 +F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 F ext/fts3/fts3_tokenizer.c a22bf311a71f3efa9d7012d8cc48fc9b0f3dace7 F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 4f9d51326e9b020c1e44e86ac7d2e85c38a47f2464bb894ce080726afb352224 +F ext/fts3/fts3_write.c 45cbe0b06221f5debefe37f8f9882cf0401592668cb76624a64c0f3f185115de F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -891,7 +891,7 @@ F test/fts2q.test b2fbbe038b7a31a52a6079b215e71226d8c6a682 F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 -F test/fts3_common.tcl 99cf6659b87c0f74f55963c2aea03b3a7d66ceb0 +F test/fts3_common.tcl 23ec6f568cded727866f69d51e53e32b4fedfac570693480da79208bdd263d5e F test/fts3aa.test 814d60a1ba30b4a71d8f9306a6564bc7b636dd6efacd2ad80306f9b23ef3ebee F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 @@ -918,7 +918,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test c2797baa11665b2ca87287b3e33155d4464cc4461b5e7e000b0b24a6035fd352 +F test/fts3corrupt4.test fbe8b5a8b93f737a0584563642963714017f5b050f964c6347e0a0acb3c373b0 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1803,8 +1803,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 5eb5e8289fa71e5e29e081d33d4a59c64b463bf6b06d7070c05c46d77d808ad4 2c1ef40e787a6bc355b50168527a47eb09acd30d0d88cff8336a434ad554115d -R a2806326e0cb0598d45e4cc4f8c04ac5 -T +closed 2c1ef40e787a6bc355b50168527a47eb09acd30d0d88cff8336a434ad554115d -U drh -Z e0264b6bc0795e1cb58dfca1c59c35f8 +P e2991a7ecf5dd241c4bab7c7cadc4901043fb0c3ea1fac70b684f6d8332677f1 +R e01d1553556e5604277170be4802273f +U dan +Z dcc10c58e7f637220797a1cbb3af1add diff --git a/manifest.uuid b/manifest.uuid index 4998ec2d43..08814c8c30 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e2991a7ecf5dd241c4bab7c7cadc4901043fb0c3ea1fac70b684f6d8332677f1 \ No newline at end of file +3498908cd7f3d0e35b70796537124e3da0bd99d48750ba51bcb9eba87e28ed4d \ No newline at end of file diff --git a/test/fts3_common.tcl b/test/fts3_common.tcl index 2ed1f70bf6..7b56f6681a 100644 --- a/test/fts3_common.tcl +++ b/test/fts3_common.tcl @@ -44,6 +44,8 @@ # # +sqlite3_fts3_may_be_corrupt 0 + #------------------------------------------------------------------------- # USAGE: fts3_build_db_1 SWITCHES N # diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index d98f69a666..7160a8f30e 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -16,8 +16,11 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +source $testdir/fts3_common.tcl set testprefix fts3corrupt4 +sqlite3_fts3_may_be_corrupt 1 + # If SQLITE_ENABLE_FTS3 is defined, omit this file. ifcapable !fts3 { finish_test @@ -2162,5 +2165,206 @@ do_execsql_test 15.1 { SELECT quote(matchinfo(t1, t1 ))==0 FROM t1 WHERE t1 MATCH 'e*'; } {0 0 0 0 0 0} +#------------------------------------------------------------------------- +reset_db +do_test 16.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-de7e8cb026385a.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 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 af 54 45 47 45 52 20 50 52 49 4d (id I.TEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 72 04 43 52 45 41 54 45 20 54 _segdir.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 00 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 61 74 20 r sint occaecat +| 3712: 63 75 70 69 64 61 74 61 74 20 6e 6f 6e 20 70 72 cupidatat non pr +| 3728: 6f 69 64 65 6e 74 2c 2a 06 03 00 5b 63 69 6c 6c oident,*...[cill +| 3744: 75 6d 20 64 6f 6c 6f 72 65 20 65 75 20 66 75 67 um dolore eu fug +| 3760: 69 61 74 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 iat nulla pariat +| 3776: 75 72 2e 42 05 04 00 81 09 44 75 69 73 20 61 75 ur.B.....Duis au +| 3792: 74 65 20 69 72 75 72 65 21 64 6f 6c 6f 72 20 69 te irure!dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 74 65 2b 04 03 00 5d 6e 69 73 69 it este+...]nisi +| 3856: 20 75 74 20 61 6c 69 71 75 69 70 20 65 78 20 65 ut aliquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 51 6c 69 dolore magna Qli +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 e5 61 psum dolor sit.a +| 4064: 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 met, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 09 00 01 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 02 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 03 03 03 00 01 01 73 06 l......n......s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 03 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 03 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 02 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 12 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 23 .......0 251..a# +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 13 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 07 00 01 03 08 00 01 05 03 00 01 ................ +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 10 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 07 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 7e 74 03 02 06 00 01 04 70 73 cididu~t......ps +| 3776: 75 6d 03 01 03 00 01 03 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 03 a4 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-de7e8cb026385a.db +}]} {} + +do_catchsql_test 16.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {0 {}} + finish_test From e88609f23e8239389a0c7c3d9ddb2d9038ab96fe Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 25 Jan 2019 16:54:06 +0000 Subject: [PATCH 138/306] Fix asan warnings in fts5 triggered by corrupt databases - passing NULL to memcmp, out-of-range left-shift values and signed integer overflow. FossilOrigin-Name: 93f8ec146d63af13f04e337ada4fa75e9254f72b1394df09701ae12e185f27e2 --- ext/fts5/fts5Int.h | 6 + ext/fts5/fts5_aux.c | 5 +- ext/fts5/fts5_index.c | 10 +- ext/fts5/test/fts5corrupt3.test | 481 ++++++++++++++++++++++++++++++++ manifest | 18 +- manifest.uuid | 2 +- 6 files changed, 505 insertions(+), 17 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 629bcf062a..e9337623a1 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -87,6 +87,12 @@ extern int sqlite3_fts5_may_be_corrupt; # define assert_nc(x) assert(x) #endif +/* +** A version of memcmp() that does not cause asan errors if one of the pointer +** parameters is NULL and the number of bytes to compare is zero. +*/ +#define fts5Memcmp(s1, s2, n) ((n)==0 ? 0 : memcmp((s1), (s2), (n))) + /* Mark a function parameter as unused, to suppress nuisance compiler ** warnings. */ #ifndef UNUSED_PARAM diff --git a/ext/fts5/fts5_aux.c b/ext/fts5/fts5_aux.c index 94f75a08c8..fbdd98131a 100644 --- a/ext/fts5/fts5_aux.c +++ b/ext/fts5/fts5_aux.c @@ -335,11 +335,12 @@ static int fts5SnippetScore( int nInst; int nScore = 0; int iLast = 0; + sqlite3_int64 iEnd = (sqlite3_int64)iPos + nToken; rc = pApi->xInstCount(pFts, &nInst); for(i=0; ixInst(pFts, i, &ip, &ic, &iOff); - if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOff<(iPos+nToken) ){ + if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOffnDocsize ) iAdj = nDocsize - nToken; if( iAdj<0 ) iAdj = 0; *piPos = iAdj; diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index eced245baa..cec4415d9d 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -606,7 +606,7 @@ static int fts5BufferCompareBlob( */ static int fts5BufferCompare(Fts5Buffer *pLeft, Fts5Buffer *pRight){ int nCmp = MIN(pLeft->n, pRight->n); - int res = memcmp(pLeft->p, pRight->p, nCmp); + int res = fts5Memcmp(pLeft->p, pRight->p, nCmp); return (res==0 ? (pLeft->n - pRight->n) : res); } @@ -2534,7 +2534,7 @@ static void fts5AssertComparisonResult( assert( pRes->iFirst==i1 ); }else{ int nMin = MIN(p1->term.n, p2->term.n); - int res = memcmp(p1->term.p, p2->term.p, nMin); + int res = fts5Memcmp(p1->term.p, p2->term.p, nMin); if( res==0 ) res = p1->term.n - p2->term.n; if( res==0 ){ @@ -3580,7 +3580,7 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ for(iLvl=0; iLvlnLevel; iLvl++){ for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ int iId = pStruct->aLevel[iLvl].aSeg[iSeg].iSegid; - if( iId<=FTS5_MAX_SEGMENT ){ + if( iId<=FTS5_MAX_SEGMENT && iId>0 ){ aUsed[(iId-1) / 32] |= (u32)1 << ((iId-1) % 32); } } @@ -4273,7 +4273,7 @@ static void fts5IndexMergeLevel( const u8 *pTerm; pTerm = fts5MultiIterTerm(pIter, &nTerm); - if( nTerm!=term.n || memcmp(pTerm, term.p, nTerm) ){ + if( nTerm!=term.n || fts5Memcmp(pTerm, term.p, nTerm) ){ if( pnRem && writer.nLeafWritten>nRem ){ break; } @@ -5897,7 +5897,7 @@ static void fts5IndexIntegrityCheckSegment( p->rc = FTS5_CORRUPT; }else{ iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm); - res = memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); + res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); if( res==0 ) res = nTerm - nIdxTerm; if( res<0 ) p->rc = FTS5_CORRUPT; } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 61208d6c97..8f9d012957 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -5338,6 +5338,487 @@ do_catchsql_test 40.2 { INSERT INTO t1(a,b) VALUES(1,11),(2,22),(3, true ),(4,44); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 41.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); + REPLACE INTO t1_data VALUES(1,X'255a5824'); + REPLACE INTO t1_data VALUES(10,X'0a1000000102020002010101020101'); + INSERT INTO t1_data VALUES(137438953473,X'0000032b0030300102060102060102061f0203010203010203010832303136303630390102070102070102070101340102050102050102050101350102040102040102040207303030303030301c0204010204010204010662696e6272790306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020108636f6d70696c657201020201020201020201066462737461740702030102030102030424656275670402020102020102020106656e61626c6507020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020202087874656e73696f6e1f02040102040102040104667473340a02030102030102030401350d020301020301020301036763630102030102030102030206656f706f6c7910020301020301020301056a736f6e3113020301020301020301046c6f61641f020301020301020301036d61781c02020102020102020205656d6f72791c020301020301020304047379733516020301020301020301066e6f6361736502060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020301b10202030601020201046f6d69741f0202010202010202010572747265651902030102030102030402696d010601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202010a746872656164736166652202020102020102020104767461620702040102040102040101780106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020415130c0c124413110f47130f0c0e11100f0e100f440f1040150f'); + INSERT INTO t1_data VALUES(274877906945,X'00000183023030250601011d010331c2ba250601010d0101342506010121010135250601011e02036ec2ba250601012b0101382506010112010161250a0101021a1d02016f2506010111010162250601013201026377250601012f010166250801011f0c010167250601012701026863250601010f02026473250601013002016b2506010133020175250601010e010169250601012c0204386ec2be250601012001016a250601010401056bc2b2cebc250601010901016c25060101150203cebc71250601011301036dd18a250601010c01016f25060101260102706425060101240101712506010122010173250a010116040d02016f2506010134010175250801011b14020161250601010b010376c2aa25060101100202d7ac250601010601017725060101030201752506010114010179250a0101190e050202357a250601010701017a250601012e0102c2aa250801011c100201b3250601010a0202ba6225060101310203be656625060101080103c5a77425060101050102de8e250601011704080a08080a080a080809090809090808080b080c080a0a0809080a0809080a0908080a09080a08090a0a'); + INSERT INTO t1_idx VALUES(1,X'',2); + INSERT INTO t1_idx VALUES(2,X'',2); +} + +do_catchsql_test 41.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +do_catchsql_test 41.2 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 42.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename 8cfba7fbb67e48de92c6.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 62 72 79 03 06 ........binbry.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 01 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0b 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4f 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 OARY.#..%..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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 57 42 49 NABLE GEOPOLYWBI +| 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 42 41 53 45 E GEOPOLYXNOBASE +| 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 52 02 49 4e 41 52 59 27 20160609R.INARY' +| 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 5d 69 7a 65 uild....opti]ize +| end 8cfba7fbb67e48de92c6.db +}]} {} + +do_catchsql_test 42.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 43.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename 89028ffd2c29b679e250.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 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 12 6f 63 73 69 7a 65 04 43 52 izet1_.ocsize.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 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5e 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 e8 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 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 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 00 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: 80 80 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 94 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: 80 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 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 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 04 06 04 0c 00 00 00 14 2a 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 16 00 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 30 00 00 00 11 02 01 .........0...... +| 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 0e 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: 00 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 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 00 90 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 07 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 00 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 03 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 71 01 02 05 04 08 18 84 80 80 ......q......... +| 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 80 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 91 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 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 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 05 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 08 04 01 10 01 02 32 74 1a 08 04 01 10 02 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 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 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 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 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 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end 89028ffd2c29b679e250.db +}]} {} + +do_catchsql_test 43.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 44.1 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b unindexed,c,tokenize="porter ascii"); + REPLACE INTO t1_data VALUES(1,X'03090009'); + REPLACE INTO t1_data VALUES(10,X'000000000103030003010101020101030101'); + INSERT INTO t1_data VALUES(137438953473,X'0000002e023061011202010162010203010163010204010167010601020201016801050102030101690106010204040606060808'); + INSERT INTO t1_data VALUES(274877906945,X'0000001f02306702080201020201016802080301020301016a420804010204040909'); + INSERT INTO t1_data VALUES(412316860417,X'0000002e023061030202010162030203010163030204010167030601020201016803060102030101690306010204040606060808'); + INSERT INTO t1_idx VALUES(1,X'',2); + INSERT INTO t1_idx VALUES(2,X'',2); + INSERT INTO t1_idx VALUES(3,X'',2); + INSERT INTO t1_content VALUES(1,'a b c','d e f','g h i'); + INSERT INTO t1_content VALUES(2,'g h i','a b c','g h i'); + INSERT INTO t1_content VALUES(3,'a b c','g h i','g h i'); + INSERT INTO t1_docsize VALUES(1,X'030003'); + INSERT INTO t1_docsize VALUES(2,X'030003'); + INSERT INTO t1_docsize VALUES(3,X'030003'); +} {} + +do_catchsql_test 44.2 { +INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +do_catchsql_test 44.2 { + SELECT snippet(t1, -1, '.', '..', '', 2 ) FROM t1('g h') ORDER BY rank; +} {0 {{.g.. .h..} {.g.. h} {.g.. .h..}}} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 3ea315fed2..5f96719ad9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sassert_fts3_nc()\smacro\sto\sfts3\s-\sfor\sassert()\sconditions\sthat\sare\sonly\strue\swhen\sit\sis\sguaranteed\sthat\sthe\sfts3\sdatabase\sis\snot\scorrupt. -D 2019-01-25T14:48:18.788 +C Fix\sasan\swarnings\sin\sfts5\striggered\sby\scorrupt\sdatabases\s-\spassing\sNULL\sto\smemcmp,\sout-of-range\sleft-shift\svalues\sand\ssigned\sinteger\soverflow. +D 2019-01-25T16:54:06.295 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -109,13 +109,13 @@ F ext/fts3/unicode/mkunicode.tcl 49499f7964504438e2b04cca0627827945bb2499154e2d3 F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h fed314270c1a61de3a0e373b11c2f8228b1c76ce59447dd96d0b6fae7d66399b -F ext/fts5/fts5Int.h 9db5f02e2b33b289275f95720f3dc65bb323e55971a932361b26ee497c710e0c -F ext/fts5/fts5_aux.c c93e943a172de7ac20547158f4eb1fc7729e6807883c71a1cc5be96fa157d69b +F ext/fts5/fts5Int.h 0b002fc71ea705d2c4ec66a63ecd38a2c11127e5b52239b5d71d1dd28309fc19 +F ext/fts5/fts5_aux.c 8284d25ca8a620337fa550628d740b0e5b9bc5c17bddad6051f02079441b946a F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306fb9727046 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 9f2eaae470461015ce175e8616c8b601e73b9bfc26e7d83afea1ec5242b3d0f8 +F ext/fts5/fts5_index.c ae9b5af68f85d0542dbb807af114d6fc025943d466e15a9289d22b1bf378cbfe F ext/fts5/fts5_main.c df4ba0a9d879de50f59662abc081209fe7a5eec87f1338e0462beeeba7830585 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 0ca5b954f4b5498ca4850d2458f809c45ca4d1d4f936428a64bc046795761391 +F ext/fts5/test/fts5corrupt3.test dbc78ab3f1700bf33abad07dc2c795f86b3a72e7f9cc152e1354f95062381b7d F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1803,7 +1803,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 e2991a7ecf5dd241c4bab7c7cadc4901043fb0c3ea1fac70b684f6d8332677f1 -R e01d1553556e5604277170be4802273f +P 3498908cd7f3d0e35b70796537124e3da0bd99d48750ba51bcb9eba87e28ed4d +R df243c79f1915de4590639edfdf6bfa8 U dan -Z dcc10c58e7f637220797a1cbb3af1add +Z 590859d14808f0234778c4165e036f31 diff --git a/manifest.uuid b/manifest.uuid index 08814c8c30..fd8b7c3b6e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3498908cd7f3d0e35b70796537124e3da0bd99d48750ba51bcb9eba87e28ed4d \ No newline at end of file +93f8ec146d63af13f04e337ada4fa75e9254f72b1394df09701ae12e185f27e2 \ No newline at end of file From c2ea77e5b2e8846976ea8ba00faa97d30ee39b9d Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 25 Jan 2019 17:26:59 +0000 Subject: [PATCH 139/306] Fix a segfault that could follow an OOM when querying a table that has one or more columns with default values "true" or "false". FossilOrigin-Name: 202f9919c222ee933924c63c15ad36ec4481457b1e4d9179af14c9f284117c0c --- manifest | 13 +++++++------ manifest.uuid | 2 +- src/vdbemem.c | 8 +++++--- test/insertfault.test | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 test/insertfault.test diff --git a/manifest b/manifest index 5f96719ad9..9b4e0503d8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sasan\swarnings\sin\sfts5\striggered\sby\scorrupt\sdatabases\s-\spassing\sNULL\sto\smemcmp,\sout-of-range\sleft-shift\svalues\sand\ssigned\sinteger\soverflow. -D 2019-01-25T16:54:06.295 +C Fix\sa\ssegfault\sthat\scould\sfollow\san\sOOM\swhen\squerying\sa\stable\sthat\shas\sone\sor\smore\scolumns\swith\sdefault\svalues\s"true"\sor\s"false". +D 2019-01-25T17:26:59.972 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -591,7 +591,7 @@ F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 F src/vdbeaux.c 11ded95e16dc340625d1e321430349b7d1cbcfc2bd09dda455e7a4c6c2fa102e F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c fdf49ecf8e4b81cd3593b8c4c3b34c1a0cf0e21d8b2897b89ed2d3a476ad1961 +F src/vdbemem.c 8d170e387c230d12250d2feaec2c1a0d9a7184753f676df10a4b28f17abfcdaf F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa @@ -1042,6 +1042,7 @@ F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 F test/insert4.test 46bead5f39e181850ee56adcf49d3a3157c460c52249211714612ac89fe34835 F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 +F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 F test/instr.test 9a8802f28437d8ade53fedfc47b2ca599b4e48ba F test/instrfault.test 0f870b218ea17cd477bb19ed330eecdb460dd53a F test/intarray.test 8319986182af37c8eb4879c6bfe9cf0074e9d43b193a4c728a0efa3417c53fb7 @@ -1803,7 +1804,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 3498908cd7f3d0e35b70796537124e3da0bd99d48750ba51bcb9eba87e28ed4d -R df243c79f1915de4590639edfdf6bfa8 +P 93f8ec146d63af13f04e337ada4fa75e9254f72b1394df09701ae12e185f27e2 +R 2cb8f8fb2b4ff17e3505a36e4fc9e6eb U dan -Z 590859d14808f0234778c4165e036f31 +Z 9cb6325f7d75df66f5e002f08abd824a diff --git a/manifest.uuid b/manifest.uuid index fd8b7c3b6e..438768b67b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -93f8ec146d63af13f04e337ada4fa75e9254f72b1394df09701ae12e185f27e2 \ No newline at end of file +202f9919c222ee933924c63c15ad36ec4481457b1e4d9179af14c9f284117c0c \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 8493df753f..8d9e44b022 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1530,9 +1530,11 @@ static int valueFromExpr( } #endif else if( op==TK_TRUEFALSE ){ - pVal = valueNew(db, pCtx); - pVal->flags = MEM_Int; - pVal->u.i = pExpr->u.zToken[4]==0; + pVal = valueNew(db, pCtx); + if( pVal ){ + pVal->flags = MEM_Int; + pVal->u.i = pExpr->u.zToken[4]==0; + } } *ppVal = pVal; diff --git a/test/insertfault.test b/test/insertfault.test new file mode 100644 index 0000000000..53849a1dbb --- /dev/null +++ b/test/insertfault.test @@ -0,0 +1,36 @@ +# 2019-01-26 +# +# 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. +# +#*********************************************************************** +# +# Test cases for INSERT + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix insertfault + +do_execsql_test 1.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d DEFAULT true); + INSERT INTO t1 DEFAULT VALUES; + SELECT * FROM t1; +} {1 {} {} 1} +faultsim_save_and_close + +breakpoint +do_faultsim_test 1 -faults oom* -prep { + faultsim_restore_and_reopen + db eval { SELECT * FROM sqlite_master } +} -body { + execsql { SELECT * FROM t1 } +} -test { + faultsim_test_result {0 {1 {} {} 1}} +} + + +finish_test From ed457037c4ea851dd58b79df0ec965103e0e1c8d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Jan 2019 17:51:06 +0000 Subject: [PATCH 140/306] Fix harmless compiler warnings in fuzzcheck FossilOrigin-Name: a82539665718c8183d9d0bb7bcb3adcb1a23294b8c30f364829a982dab89a332 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 20 ++++++++++---------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 9b4e0503d8..09dbdb6811 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\ssegfault\sthat\scould\sfollow\san\sOOM\swhen\squerying\sa\stable\sthat\shas\sone\sor\smore\scolumns\swith\sdefault\svalues\s"true"\sor\s"false". -D 2019-01-25T17:26:59.972 +C Fix\sharmless\scompiler\swarnings\sin\sfuzzcheck +D 2019-01-25T17:51:06.963 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -984,7 +984,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c b72e92f38747e4fe45b4df41a750a9ee3797f28e808c11b753d91d750a559c51 +F test/fuzzcheck.c 4081b21460ce1f65b5904bdca27cf437476b414bf3f031fd4d6dfec58694b591 F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1804,7 +1804,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 93f8ec146d63af13f04e337ada4fa75e9254f72b1394df09701ae12e185f27e2 -R 2cb8f8fb2b4ff17e3505a36e4fc9e6eb -U dan -Z 9cb6325f7d75df66f5e002f08abd824a +P 202f9919c222ee933924c63c15ad36ec4481457b1e4d9179af14c9f284117c0c +R 5993301b53e351451822ca9138373189 +U drh +Z 28dd075cf2a9d09311894c57cd8c7c5a diff --git a/manifest.uuid b/manifest.uuid index 438768b67b..28a0ae6cd3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -202f9919c222ee933924c63c15ad36ec4481457b1e4d9179af14c9f284117c0c \ No newline at end of file +a82539665718c8183d9d0bb7bcb3adcb1a23294b8c30f364829a982dab89a332 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 45e2168356..7cedf94159 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -445,7 +445,7 @@ static int eVerbosity = 0; static int bVdbeDebug = 0; /* Timeout for each fuzzing attempt, in milliseconds */ -static int iTimeout = 10000; /* Defaults to 10 seconds */ +static int giTimeout = 10000; /* Defaults to 10 seconds */ /* Maximum number of progress handler callbacks */ static unsigned int mxProgressCb = 2000; @@ -464,7 +464,7 @@ static sqlite3_int64 maxDbSize = 104857600; ** This routine only works if h really is a valid hexadecimal ** character: 0..9a..fA..F */ -static unsigned int hexToInt(unsigned int h){ +static unsigned char hexToInt(unsigned int h){ #ifdef SQLITE_EBCDIC h += 9*(1&~(h>>4)); /* EBCDIC */ #else @@ -526,7 +526,7 @@ static int decodeDatabase( unsigned char b = 0; if( nIn<4 ) return -1; n = (unsigned int)nIn; - a = sqlite3_malloc( nAlloc ); + a = sqlite3_malloc64( nAlloc ); if( a==0 ){ fprintf(stderr, "Out of memory!\n"); exit(1); @@ -562,7 +562,7 @@ static int decodeDatabase( } newSize = MX_FILE_SZ; } - a = sqlite3_realloc( a, newSize ); + a = sqlite3_realloc64( a, newSize ); if( a==0 ){ fprintf(stderr, "Out of memory!\n"); exit(1); @@ -744,7 +744,7 @@ int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte){ memset(&cx, 0, sizeof(cx)); iSql = decodeDatabase((unsigned char*)aData, (int)nByte, &aDb, &nDb); if( iSql<0 ) return 0; - nSql = nByte - iSql; + nSql = (int)(nByte - iSql); if( eVerbosity>=3 ){ printf( "****** %d-byte input, %d-byte database, %d-byte script " @@ -759,11 +759,11 @@ int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte){ /* Invoke the progress handler frequently to check to see if we ** are taking too long. The progress handler will return true - ** (which will block further processing) if more than iTimeout seconds have + ** (which will block further processing) if more than giTimeout seconds have ** elapsed since the start of the test. */ cx.iLastCb = timeOfDay(); - cx.iCutoffTime = cx.iLastCb + iTimeout; /* Now + iTimeout seconds */ + cx.iCutoffTime = cx.iLastCb + giTimeout; /* Now + giTimeout seconds */ cx.mxCb = mxProgressCb; #ifndef SQLITE_OMIT_PROGRESS_CALLBACK sqlite3_progress_handler(cx.db, 10, progress_handler, (void*)&cx); @@ -1454,10 +1454,10 @@ int main(int argc, char **argv){ }else if( strcmp(z,"version")==0 ){ int ii; - const char *z; + const char *zz; printf("SQLite %s %s\n", sqlite3_libversion(), sqlite3_sourceid()); - for(ii=0; (z = sqlite3_compileoption_get(ii))!=0; ii++){ - printf("%s\n", z); + for(ii=0; (zz = sqlite3_compileoption_get(ii))!=0; ii++){ + printf("%s\n", zz); } return 0; }else From 0578084507ee2d5f951409b61029093e1408ec7b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Jan 2019 18:17:03 +0000 Subject: [PATCH 141/306] Fix the assert_fts3_nc() macro so that it works for test builds that omit SQLITE_DEBUG. FossilOrigin-Name: b10df2b569e356551cf51ca179f307e4f8827413ee9feb886db1f1e0650e6c5f --- ext/fts3/fts3Int.h | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index cf03dc3278..9436e16990 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -134,7 +134,7 @@ SQLITE_EXTENSION_INIT3 ** is used for assert() conditions that are true only if it can be ** guranteed that the database is not corrupt. */ -#ifdef SQLITE_DEBUG +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) extern int sqlite3_fts3_may_be_corrupt; # define assert_fts3_nc(x) assert(sqlite3_fts3_may_be_corrupt || (x)) #else diff --git a/manifest b/manifest index 09dbdb6811..7466ec2af8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sin\sfuzzcheck -D 2019-01-25T17:51:06.963 +C Fix\sthe\sassert_fts3_nc()\smacro\sso\sthat\sit\sworks\sfor\stest\sbuilds\sthat\somit\nSQLITE_DEBUG. +D 2019-01-25T18:17:03.021 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -82,7 +82,7 @@ F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c 229d0d6e087db5f694fd12e40f48fc748fead59f998b9b7015edee183fbc00f2 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 24ecc6a79ab97784643e5fb877fa8866a246cb47fcd2f11afa6f787e0f9f28ec +F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 @@ -1804,7 +1804,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 202f9919c222ee933924c63c15ad36ec4481457b1e4d9179af14c9f284117c0c -R 5993301b53e351451822ca9138373189 +P a82539665718c8183d9d0bb7bcb3adcb1a23294b8c30f364829a982dab89a332 +R d60111b60294967c2ac708acd1c0203d U drh -Z 28dd075cf2a9d09311894c57cd8c7c5a +Z 5fe9feba6377dc5a7c5ba0110d3c611d diff --git a/manifest.uuid b/manifest.uuid index 28a0ae6cd3..fb436949bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a82539665718c8183d9d0bb7bcb3adcb1a23294b8c30f364829a982dab89a332 \ No newline at end of file +b10df2b569e356551cf51ca179f307e4f8827413ee9feb886db1f1e0650e6c5f \ No newline at end of file From f69af053dcaee472a9d2391db22cd682ed491d39 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Jan 2019 18:17:37 +0000 Subject: [PATCH 142/306] Fix harmless compiler warnings. FossilOrigin-Name: 3ff220ad378d547538b4501e6b2201e835a2c66891e5e40856db377c101a50e5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 7466ec2af8..d310ddb1a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sassert_fts3_nc()\smacro\sso\sthat\sit\sworks\sfor\stest\sbuilds\sthat\somit\nSQLITE_DEBUG. -D 2019-01-25T18:17:03.021 +C Fix\sharmless\scompiler\swarnings. +D 2019-01-25T18:17:37.520 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -589,7 +589,7 @@ F src/vdbe.c 090d40c688b56b4602fb196a78e9d17213f381984258131c1e8f665636ca35ac F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 -F src/vdbeaux.c 11ded95e16dc340625d1e321430349b7d1cbcfc2bd09dda455e7a4c6c2fa102e +F src/vdbeaux.c 158abc9c49a6870ce9c173b080faa6c3382a9b5a2d653d0a002eb20482e17cb2 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 8d170e387c230d12250d2feaec2c1a0d9a7184753f676df10a4b28f17abfcdaf F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f @@ -1804,7 +1804,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 a82539665718c8183d9d0bb7bcb3adcb1a23294b8c30f364829a982dab89a332 -R d60111b60294967c2ac708acd1c0203d +P b10df2b569e356551cf51ca179f307e4f8827413ee9feb886db1f1e0650e6c5f +R 2ff0ac8d710b630c9d6e6161696595c6 U drh -Z 5fe9feba6377dc5a7c5ba0110d3c611d +Z a3295b111131a3efd3a7c19b13f5e5af diff --git a/manifest.uuid b/manifest.uuid index fb436949bc..b0856d1475 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b10df2b569e356551cf51ca179f307e4f8827413ee9feb886db1f1e0650e6c5f \ No newline at end of file +3ff220ad378d547538b4501e6b2201e835a2c66891e5e40856db377c101a50e5 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 4738dba932..f5d30f3bad 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3805,7 +3805,7 @@ void sqlite3VdbeRecordUnpack( idx = getVarint32(aKey, szHdr); d = szHdr; u = 0; - while( idx=p->nField ) break; } - if( d>nKey && u ){ + if( d>(u32)nKey && u ){ assert( CORRUPT_DB ); /* In a corrupt record entry, the last pMem might have been set up using ** uninitialized memory. Overwrite its value with NULL, to prevent From b2e61bc66b88cc82cc67830a77ee512e6b4b18fa Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Jan 2019 19:29:01 +0000 Subject: [PATCH 143/306] Reinitialize debugging information on registers of a trigger prior to each invocation of the trigger. This prevents false-positives from the sqlite3VdbeMemAboutToChange() test logic. FossilOrigin-Name: 98b3b97573ccb3d986d1552f97f96e15088a598945923adcac77010c1e8b7fe4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 11 +++++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d310ddb1a8..e94d5e4daa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2019-01-25T18:17:37.520 +C Reinitialize\sdebugging\sinformation\son\sregisters\sof\sa\strigger\sprior\sto\seach\ninvocation\sof\sthe\strigger.\s\sThis\sprevents\sfalse-positives\sfrom\sthe\nsqlite3VdbeMemAboutToChange()\stest\slogic. +D 2019-01-25T19:29:01.388 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -585,7 +585,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c 090d40c688b56b4602fb196a78e9d17213f381984258131c1e8f665636ca35ac +F src/vdbe.c 2c99f790ae42af5268529cb67cfd4beaf9542cdc62fd0a10a18edec1fa9a5c09 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1804,7 +1804,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 b10df2b569e356551cf51ca179f307e4f8827413ee9feb886db1f1e0650e6c5f -R 2ff0ac8d710b630c9d6e6161696595c6 +P 3ff220ad378d547538b4501e6b2201e835a2c66891e5e40856db377c101a50e5 +R ecf877bc394877eb1dbb4bb85afd2412 U drh -Z a3295b111131a3efd3a7c19b13f5e5af +Z 456c3e392f5a0f89b55001f14b2aaf25 diff --git a/manifest.uuid b/manifest.uuid index b0856d1475..751fa33455 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3ff220ad378d547538b4501e6b2201e835a2c66891e5e40856db377c101a50e5 \ No newline at end of file +98b3b97573ccb3d986d1552f97f96e15088a598945923adcac77010c1e8b7fe4 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 2c2b0ee272..09cf55b696 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -6171,6 +6171,17 @@ case OP_Program: { /* jump */ p->nOp = pProgram->nOp; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS p->anExec = 0; +#endif +#ifdef SQLITE_DEBUG + /* Verify that second and subsequent executions of the same trigger do not + ** try to reuse register values from the first use. */ + { + int i; + for(i=0; inMem; i++){ + aMem[i].pScopyFrom = 0; /* Prevent false-positive AboutToChange() errs */ + aMem[i].flags |= MEM_Undefined; /* Cause a fault if this reg is reused */ + } + } #endif pOp = &aOp[-1]; From 0814acd98177fab44df29ebd24595a93c63eb68d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Jan 2019 20:09:04 +0000 Subject: [PATCH 144/306] Do not accidently truncate zeroblob values when doing an arithmetic operation. Fix for ticket [bb4bdb9f7f654b0bb9f34cfba]. FossilOrigin-Name: 13f6942eb0da2d92a0830f18640ce64208bd0cd6ff6d0c97e4a4c57ac3d65ba6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 1 + test/zeroblob.test | 11 +++++++++++ 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e94d5e4daa..9b020d7aa5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reinitialize\sdebugging\sinformation\son\sregisters\sof\sa\strigger\sprior\sto\seach\ninvocation\sof\sthe\strigger.\s\sThis\sprevents\sfalse-positives\sfrom\sthe\nsqlite3VdbeMemAboutToChange()\stest\slogic. -D 2019-01-25T19:29:01.388 +C Do\snot\saccidently\struncate\szeroblob\svalues\swhen\sdoing\san\sarithmetic\noperation.\s\sFix\sfor\sticket\s[bb4bdb9f7f654b0bb9f34cfba]. +D 2019-01-25T20:09:04.290 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -585,7 +585,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c 2c99f790ae42af5268529cb67cfd4beaf9542cdc62fd0a10a18edec1fa9a5c09 +F src/vdbe.c b7b6f965153607072917dbd81d654a268abf4872c58d556701d1549550766c02 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1698,7 +1698,7 @@ F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc -F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa +F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc F test/zipfile.test b3b558639f7a103e095713ad0f57fec1fce1b7d60c8054df5789b98f7547a395 F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d @@ -1804,7 +1804,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 3ff220ad378d547538b4501e6b2201e835a2c66891e5e40856db377c101a50e5 -R ecf877bc394877eb1dbb4bb85afd2412 +P 98b3b97573ccb3d986d1552f97f96e15088a598945923adcac77010c1e8b7fe4 +R 1d7c45280e753f1cbd5da589341c01ea U drh -Z 456c3e392f5a0f89b55001f14b2aaf25 +Z 62265ca3345faf783a3f875668f7525d diff --git a/manifest.uuid b/manifest.uuid index 751fa33455..eda02a5d0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98b3b97573ccb3d986d1552f97f96e15088a598945923adcac77010c1e8b7fe4 \ No newline at end of file +13f6942eb0da2d92a0830f18640ce64208bd0cd6ff6d0c97e4a4c57ac3d65ba6 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 09cf55b696..98df0a3977 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -385,6 +385,7 @@ void sqlite3ValueApplyAffinity( static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ assert( (pMem->flags & (MEM_Int|MEM_Real))==0 ); assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ); + ExpandBlob(pMem); if( sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc)==0 ){ return 0; } diff --git a/test/zeroblob.test b/test/zeroblob.test index 0514644a28..9daa7d8d9a 100644 --- a/test/zeroblob.test +++ b/test/zeroblob.test @@ -316,5 +316,16 @@ do_test 12.5 { sqlite3_finalize $stmt +# 2019-01-25 https://sqlite.org/src/tktview/bb4bdb9f7f654b0bb9f34cfbac +# Zeroblob truncated by an index on expression +# +do_execsql_test 13.100 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a,b,c); + CREATE INDEX t1bbc ON t1(b, b+c); + INSERT INTO t1(a,b,c) VALUES(1,zeroblob(8),3); + SELECT a, quote(b), length(b), c FROM t1; +} {1 X'0000000000000000' 8 3} + test_restore_config_pagecache finish_test From b4e5039316e0c8fee98913d6f3433074d28a4b6b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Jan 2019 15:40:04 +0000 Subject: [PATCH 145/306] Add the ".eqp trace" command to the CLI when using SQLITE_DEBUG, as a convenient shorthand for "PRAGMA vdbe_debug=ON" but with automatic indentation feature for program listings provided by the CLI. FossilOrigin-Name: 626502faa17b5b7a0fa36cabfd12e463eb09aec048d01c587a18d3977cf04662 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 23 +++++++++++++++++++++-- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 9b020d7aa5..34f8670765 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\saccidently\struncate\szeroblob\svalues\swhen\sdoing\san\sarithmetic\noperation.\s\sFix\sfor\sticket\s[bb4bdb9f7f654b0bb9f34cfba]. -D 2019-01-25T20:09:04.290 +C Add\sthe\s".eqp\strace"\scommand\sto\sthe\sCLI\swhen\susing\sSQLITE_DEBUG,\sas\sa\nconvenient\sshorthand\sfor\s"PRAGMA\svdbe_debug=ON"\sbut\swith\sautomatic\sindentation\nfeature\sfor\sprogram\slistings\sprovided\sby\sthe\sCLI. +D 2019-01-26T15:40:04.766 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -515,7 +515,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 -F src/shell.c.in 58f69c9143d9635a3d71a32c3d4cb6fad4de4f0ca400c098fa76ff83e3ec58cb +F src/shell.c.in 324bc8df6e0ddc1c17771927f3bc9616340175e78cbb15f6cdfd10cade01cdbf F src/sqlite.h.in 8ded85ecaa768afd196b24201382ccdf00e5bab6861e30549cd750bebd273a0b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1804,7 +1804,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 98b3b97573ccb3d986d1552f97f96e15088a598945923adcac77010c1e8b7fe4 -R 1d7c45280e753f1cbd5da589341c01ea +P 13f6942eb0da2d92a0830f18640ce64208bd0cd6ff6d0c97e4a4c57ac3d65ba6 +R 526b182186e89dc3ca0b6f304ae40eae U drh -Z 62265ca3345faf783a3f875668f7525d +Z abb2dd0860dab724b6ef3b845cc9519b diff --git a/manifest.uuid b/manifest.uuid index eda02a5d0b..6ffd094b95 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -13f6942eb0da2d92a0830f18640ce64208bd0cd6ff6d0c97e4a4c57ac3d65ba6 \ No newline at end of file +626502faa17b5b7a0fa36cabfd12e463eb09aec048d01c587a18d3977cf04662 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 07afdf8d94..1124ab4166 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1006,6 +1006,7 @@ struct ShellState { u8 autoExplain; /* Automatically turn on .explain mode */ u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ u8 autoEQPtest; /* autoEQP is in test mode */ + u8 autoEQPtrace; /* autoEQP is in trace mode */ u8 statsOn; /* True to display memory stats before each finalize */ u8 scanstatsOn; /* True to display scan stats before each finalize */ u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ @@ -3401,7 +3402,13 @@ static const char *(azHelp[]) = { " --newlines Allow unescaped newline characters in output", " TABLE is LIKE pattern for the tables to dump", ".echo on|off Turn command echo on or off", - ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN", + ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", + " Other Modes:", +#ifdef SQLITE_DEBUG + " test Show raw EXPLAIN QUERY PLAN output", + " trace Like \"full\" but also enable \"PRAGMA vdbe_trace\"", +#endif + " trigger Like \"full\" but also show trigger bytecode", ".excel Display the output of next command in a spreadsheet", ".exit ?CODE? Exit this program with return-code CODE", ".expert EXPERIMENTAL. Suggest indexes for specified queries", @@ -6264,18 +6271,30 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ if( nArg==2 ){ p->autoEQPtest = 0; + if( p->autoEQPtrace ){ + if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); + p->autoEQPtrace = 0; + } if( strcmp(azArg[1],"full")==0 ){ p->autoEQP = AUTOEQP_full; }else if( strcmp(azArg[1],"trigger")==0 ){ p->autoEQP = AUTOEQP_trigger; +#ifdef SQLITE_DEBUG }else if( strcmp(azArg[1],"test")==0 ){ p->autoEQP = AUTOEQP_on; p->autoEQPtest = 1; + }else if( strcmp(azArg[1],"trace")==0 ){ + p->autoEQP = AUTOEQP_full; + p->autoEQPtrace = 1; + open_db(p, 0); + (void)sqlite3_table_column_metadata(p->db, "x","x",0,0,0,0,0,0); + sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); +#endif }else{ p->autoEQP = (u8)booleanValue(azArg[1]); } }else{ - raw_printf(stderr, "Usage: .eqp off|on|trigger|full\n"); + raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); rc = 1; } }else From 32bb700a9511667c2aaba62a0c1a23c84d1c1d9a Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 26 Jan 2019 21:05:54 +0000 Subject: [PATCH 146/306] Fix a broken assert() in fts3. Also some test script issues causing failures with builds that do not support fts3. FossilOrigin-Name: d59567dda231e7ffec437d5e055676cf42d791196406cdc696cafa2583eb483b --- ext/fts3/fts3.c | 1 - manifest | 21 ++-- manifest.uuid | 2 +- test/fts3_common.tcl | 4 +- test/fts3corrupt4.test | 243 ++++++++++++++++++++++++++++++++++++++++- 5 files changed, 257 insertions(+), 14 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 1d28a14e88..36e41d2404 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -3868,7 +3868,6 @@ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ Fts3Table *p = (Fts3Table*)pVtab; UNUSED_PARAMETER(iSavepoint); assert( p->inTransaction ); - assert( p->mxSavepoint >= iSavepoint ); TESTONLY( p->mxSavepoint = iSavepoint ); sqlite3Fts3PendingTermsClear(p); return SQLITE_OK; diff --git a/manifest b/manifest index 34f8670765..72465dc709 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s".eqp\strace"\scommand\sto\sthe\sCLI\swhen\susing\sSQLITE_DEBUG,\sas\sa\nconvenient\sshorthand\sfor\s"PRAGMA\svdbe_debug=ON"\sbut\swith\sautomatic\sindentation\nfeature\sfor\sprogram\slistings\sprovided\sby\sthe\sCLI. -D 2019-01-26T15:40:04.766 +C Fix\sa\sbroken\sassert()\sin\sfts3.\sAlso\ssome\stest\sscript\sissues\scausing\sfailures\swith\sbuilds\sthat\sdo\snot\ssupport\sfts3. +D 2019-01-26T21:05:54.969 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 229d0d6e087db5f694fd12e40f48fc748fead59f998b9b7015edee183fbc00f2 +F ext/fts3/fts3.c 014e2bef603dd3c46d99f36dea614e05a2ae75ae02c0ba8519ecb1d2d0c6ee22 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b @@ -891,7 +891,7 @@ F test/fts2q.test b2fbbe038b7a31a52a6079b215e71226d8c6a682 F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 -F test/fts3_common.tcl 23ec6f568cded727866f69d51e53e32b4fedfac570693480da79208bdd263d5e +F test/fts3_common.tcl dffad248f9ce090800e272017d2898005c28ee6314fc1dd5550643a02666907a F test/fts3aa.test 814d60a1ba30b4a71d8f9306a6564bc7b636dd6efacd2ad80306f9b23ef3ebee F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 @@ -918,7 +918,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test fbe8b5a8b93f737a0584563642963714017f5b050f964c6347e0a0acb3c373b0 +F test/fts3corrupt4.test 9a1e931adf2746a43a5191d4c2f60c6409ee092fb24b8b11a7cc2a2f4f8b5bcc F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1804,7 +1804,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 13f6942eb0da2d92a0830f18640ce64208bd0cd6ff6d0c97e4a4c57ac3d65ba6 -R 526b182186e89dc3ca0b6f304ae40eae -U drh -Z abb2dd0860dab724b6ef3b845cc9519b +P 626502faa17b5b7a0fa36cabfd12e463eb09aec048d01c587a18d3977cf04662 +Q +5016303421a678a185d619bda556411e6bd0830e5dab9318a35682085b0973f7 +Q +773b5986084b7ebe8d1d47cf51d1c10e600935b4cc9af38921dcb06b0d4d82c0 +Q +b8dd2d67b5c5555d0fd8b8fc9b953d54efb2d154413a50dca795a57b44dbdec7 +R 47e399a45caf56fdfbccb5dc53f4aac3 +U dan +Z 342a8eb97d6f20d32cf847b5e98c0840 diff --git a/manifest.uuid b/manifest.uuid index 6ffd094b95..f070a5b04e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -626502faa17b5b7a0fa36cabfd12e463eb09aec048d01c587a18d3977cf04662 \ No newline at end of file +d59567dda231e7ffec437d5e055676cf42d791196406cdc696cafa2583eb483b \ No newline at end of file diff --git a/test/fts3_common.tcl b/test/fts3_common.tcl index 7b56f6681a..fcd3ca3e45 100644 --- a/test/fts3_common.tcl +++ b/test/fts3_common.tcl @@ -44,7 +44,9 @@ # # -sqlite3_fts3_may_be_corrupt 0 +ifcapable fts3 { + sqlite3_fts3_may_be_corrupt 0 +} #------------------------------------------------------------------------- # USAGE: fts3_build_db_1 SWITCHES N diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 7160a8f30e..02d7259128 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -19,14 +19,14 @@ source $testdir/tester.tcl source $testdir/fts3_common.tcl set testprefix fts3corrupt4 -sqlite3_fts3_may_be_corrupt 1 - # If SQLITE_ENABLE_FTS3 is defined, omit this file. ifcapable !fts3 { finish_test return } +sqlite3_fts3_may_be_corrupt 1 + do_execsql_test 1.0 { BEGIN; CREATE VIRTUAL TABLE ft USING fts3; @@ -2366,5 +2366,244 @@ do_catchsql_test 16.1 { INSERT INTO t1(t1) VALUES('optimize'); } {0 {}} +#------------------------------------------------------------------------- +reset_db +do_test 17.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-f15972acf5bc1c.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 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 0d a4 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 67 64 69 72 egdir_1t1_segdir +| 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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 39 00 00 00 00 00 (a,b,c)...9..... +| 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 03 28 0d 4f 0d 35 0d 1b 0c fb .......(.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 72 7f 00 .........?%..r.. +| 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 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 43 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAC 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 14 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 0e 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| 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 4d 03 25 15 00 00 04 .%....sysM.%.... +| 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 0e 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 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 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 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 03 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 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 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 e9 10 d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 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 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-f15972acf5bc1c.db +}]} {} + +breakpoint +do_execsql_test 17.1 { + BEGIN; + INSERT INTO t1(t1) SELECT x FROM t2; + UPDATE t1 SET b=quote(zeroblob(200)) WHERE a MATCH 'thread*'; +} + +do_catchsql_test 17.2 { + DROP TABLE IF EXISTS t1; +} {1 {SQL logic error}} + +do_execsql_test 17.3 { + INSERT INTO t1(t1) VALUES('optimize'); +} + +do_catchsql_test 17.4 { + DROP TABLE IF EXISTS t1; +} {1 {SQL logic error}} + finish_test From e6a9efb976daf2814b6abfd8e54692ffa9aa78ff Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Jan 2019 23:34:50 +0000 Subject: [PATCH 147/306] Ensure that the btree cursor is correctly set up prior to backing it up as part of a delete operation on a divider cell in an index. FossilOrigin-Name: a3ea1a822d3a110f4f186f2fc8550f435c8c98635d058096b7be9d4df7066b8b --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/btree.c | 1 + 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 72465dc709..e14607aea0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbroken\sassert()\sin\sfts3.\sAlso\ssome\stest\sscript\sissues\scausing\sfailures\swith\sbuilds\sthat\sdo\snot\ssupport\sfts3. -D 2019-01-26T21:05:54.969 +C Ensure\sthat\sthe\sbtree\scursor\sis\scorrectly\sset\sup\sprior\sto\sbacking\sit\sup\nas\spart\sof\sa\sdelete\soperation\son\sa\sdivider\scell\sin\san\sindex. +D 2019-01-26T23:34:50.536 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c f7ee98fca2c136020527050c00bb63b89cb663a1fad69160bdd332d9c73ce5da +F src/btree.c c78051b514c5ea214f5ee1119d5df7d47471e32c0cb4d5b93f135bf86d67f0ca F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc @@ -1804,10 +1804,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 626502faa17b5b7a0fa36cabfd12e463eb09aec048d01c587a18d3977cf04662 -Q +5016303421a678a185d619bda556411e6bd0830e5dab9318a35682085b0973f7 -Q +773b5986084b7ebe8d1d47cf51d1c10e600935b4cc9af38921dcb06b0d4d82c0 -Q +b8dd2d67b5c5555d0fd8b8fc9b953d54efb2d154413a50dca795a57b44dbdec7 -R 47e399a45caf56fdfbccb5dc53f4aac3 -U dan -Z 342a8eb97d6f20d32cf847b5e98c0840 +P d59567dda231e7ffec437d5e055676cf42d791196406cdc696cafa2583eb483b +R a26bc7cfbb63ac2a47ad91e615545d2f +U drh +Z c383150dc1908979b363a955c6f6b956 diff --git a/manifest.uuid b/manifest.uuid index f070a5b04e..9669b4732a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d59567dda231e7ffec437d5e055676cf42d791196406cdc696cafa2583eb483b \ No newline at end of file +a3ea1a822d3a110f4f186f2fc8550f435c8c98635d058096b7be9d4df7066b8b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 2345bb006d..e0a9862b6f 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8770,6 +8770,7 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** sub-tree headed by the child page of the cell being deleted. This makes ** balancing the tree following the delete operation easier. */ if( !pPage->leaf ){ + pCur->skipNext = 0; rc = sqlite3BtreePrevious(pCur, 0); assert( rc!=SQLITE_DONE ); if( rc ) return rc; From e5da9356e0295c97a86dc986131de475a0fd35cb Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 27 Jan 2019 01:11:40 +0000 Subject: [PATCH 148/306] Update fuzzcheck so that with the --load-dbsql options it screens its inputs to ensure that they are valid dbsqlfuzz cases. Add new dbsqlfuzz finds to the test/fuzzdata8.db database. FossilOrigin-Name: 004f7d9bbeee049c22a7e1c82c6cc0ea79a237967de3ff57686acea3060d5f45 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 41 ++++++++++++++++++++++++++++++++++------- test/fuzzdata8.db | Bin 732160 -> 808960 bytes 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index e14607aea0..01911157f8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\sbtree\scursor\sis\scorrectly\sset\sup\sprior\sto\sbacking\sit\sup\nas\spart\sof\sa\sdelete\soperation\son\sa\sdivider\scell\sin\san\sindex. -D 2019-01-26T23:34:50.536 +C Update\sfuzzcheck\sso\sthat\swith\sthe\s--load-dbsql\soptions\sit\sscreens\sits\ninputs\sto\sensure\sthat\sthey\sare\svalid\sdbsqlfuzz\scases.\s\sAdd\snew\sdbsqlfuzz\nfinds\sto\sthe\stest/fuzzdata8.db\sdatabase. +D 2019-01-27T01:11:40.746 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -984,7 +984,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 4081b21460ce1f65b5904bdca27cf437476b414bf3f031fd4d6dfec58694b591 +F test/fuzzcheck.c 6bb28cc6ad247950e22bcc106bbeefff8c3c737f80c24573d8c18ef1cac6f2ac F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 8a96892bd2535578ff2ca27db823b7e149cfce6694c15ca80521fa758be605b1 +F test/fuzzdata8.db e2e2d82c8f41f123a5e8e5a6db953143743ade9f23908eac224f5a2b39d55832 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 d59567dda231e7ffec437d5e055676cf42d791196406cdc696cafa2583eb483b -R a26bc7cfbb63ac2a47ad91e615545d2f +P a3ea1a822d3a110f4f186f2fc8550f435c8c98635d058096b7be9d4df7066b8b +R 03df092f631b381cdd6c4288d6623f64 U drh -Z c383150dc1908979b363a955c6f6b956 +Z b86c20bb8077d2eac80dc37ebee27c9e diff --git a/manifest.uuid b/manifest.uuid index 9669b4732a..da82cd089b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a3ea1a822d3a110f4f186f2fc8550f435c8c98635d058096b7be9d4df7066b8b \ No newline at end of file +004f7d9bbeee049c22a7e1c82c6cc0ea79a237967de3ff57686acea3060d5f45 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 7cedf94159..e050875669 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -870,6 +870,17 @@ static int isDbSql(unsigned char *a, int n){ return 0; } +/* Implementation of the isdbsql(TEXT) SQL function. +*/ +static void isDbSqlFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int n = sqlite3_value_bytes(argv[0]); + unsigned char *a = (unsigned char*)sqlite3_value_blob(argv[0]); + sqlite3_result_int(context, a!=0 && n>0 && isDbSql(a,n)); +} /* Methods for the VHandle object */ @@ -1169,23 +1180,28 @@ static void runSql(sqlite3 *db, const char *zSql, unsigned runFlags){ ** (2) Put all entries in order ** (3) Vacuum */ -static void rebuild_database(sqlite3 *db){ +static void rebuild_database(sqlite3 *db, int dbSqlOnly){ int rc; - rc = sqlite3_exec(db, + char *zSql; + zSql = sqlite3_mprintf( "BEGIN;\n" "CREATE TEMP TABLE dbx AS SELECT DISTINCT dbcontent FROM db;\n" "DELETE FROM db;\n" "INSERT INTO db(dbid, dbcontent) " " SELECT NULL, dbcontent FROM dbx ORDER BY 2;\n" "DROP TABLE dbx;\n" - "CREATE TEMP TABLE sx AS SELECT DISTINCT sqltext FROM xsql;\n" + "CREATE TEMP TABLE sx AS SELECT DISTINCT sqltext FROM xsql %s;\n" "DELETE FROM xsql;\n" "INSERT INTO xsql(sqlid,sqltext) " " SELECT NULL, sqltext FROM sx ORDER BY 2;\n" "DROP TABLE sx;\n" "COMMIT;\n" "PRAGMA page_size=1024;\n" - "VACUUM;\n", 0, 0, 0); + "VACUUM;\n", + dbSqlOnly ? " WHERE isdbsql(sqltext)" : "" + ); + rc = sqlite3_exec(db, zSql, 0, 0, 0); + sqlite3_free(zSql); if( rc ) fatalError("cannot rebuild: %s", sqlite3_errmsg(db)); } @@ -1279,6 +1295,7 @@ static void showHelp(void){ " --limit-vdbe Panic if any test runs for more than 100,000 cycles\n" " --load-sql ARGS... Load SQL scripts fron files into SOURCE-DB\n" " --load-db ARGS... Load template databases from files into SOURCE_DB\n" +" --load-dbsql ARGS.. Load dbsqlfuzz outputs into the xsql table\n" " -m TEXT Add a description to the database\n" " --native-vfs Use the native VFS for initially empty database files\n" " --native-malloc Turn off MEMSYS3/5 and Lookaside\n" @@ -1305,6 +1322,7 @@ int main(int argc, char **argv){ Blob *pSql; /* For looping over SQL scripts */ Blob *pDb; /* For looping over template databases */ int i; /* Loop index for the argv[] loop */ + int dbSqlOnly = 0; /* Only use scripts that are dbsqlfuzz */ int onlySqlid = -1; /* --sqlid */ int onlyDbid = -1; /* --dbid */ int nativeFlag = 0; /* --native-vfs */ @@ -1361,7 +1379,7 @@ int main(int argc, char **argv){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); zExpDb = argv[++i]; }else - if( strcmp(z,"export-sql")==0 ){ + if( strcmp(z,"export-sql")==0 || strcmp(z,"export-dbsql")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); zExpSql = argv[++i]; }else @@ -1396,6 +1414,13 @@ int main(int argc, char **argv){ openFlags4Data = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; break; }else + if( strcmp(z,"load-dbsql")==0 ){ + zInsSql = "INSERT INTO xsql(sqltext)VALUES(CAST(readfile(?1) AS text))"; + iFirstInsArg = i+1; + openFlags4Data = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; + dbSqlOnly = 1; + break; + }else if( strcmp(z,"m")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); zMsg = argv[++i]; @@ -1577,6 +1602,8 @@ int main(int argc, char **argv){ if( zInsSql ){ sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0, readfileFunc, 0, 0); + sqlite3_create_function(db, "isdbsql", 1, SQLITE_UTF8, 0, + isDbSqlFunc, 0, 0); rc = sqlite3_prepare_v2(db, zInsSql, -1, &pStmt, 0); if( rc ) fatalError("cannot prepare statement [%s]: %s", zInsSql, sqlite3_errmsg(db)); @@ -1592,7 +1619,7 @@ int main(int argc, char **argv){ rc = sqlite3_exec(db, "COMMIT", 0, 0, 0); if( rc ) fatalError("cannot commit the transaction: %s", sqlite3_errmsg(db)); - rebuild_database(db); + rebuild_database(db, dbSqlOnly); sqlite3_close(db); return 0; } @@ -1679,7 +1706,7 @@ int main(int argc, char **argv){ printf("%s: rebuilding... ", zDbName); fflush(stdout); } - rebuild_database(db); + rebuild_database(db, 0); if( !quietFlag ) printf("done\n"); } diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index ba1723ee59d1590d47df19761fdf8c68da5a9cbe..91d9c04a4a8a4158034c14297a717bb7b6009031 100644 GIT binary patch delta 26222 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%0A?8h*+z2e>9Sm~rfJJGqh(ixOGPY1OX2`!Wj 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 Date: Sun, 27 Jan 2019 02:41:34 +0000 Subject: [PATCH 149/306] Window functions that can abort should indicate this, so that if they are used in DML statement, a statement journal will be used. FossilOrigin-Name: 0ea05a0eb96acb860d8af2e788e29a5ae3b161e7892ab62f1ff2f3e722c0dcb6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeaux.c | 2 +- src/window.c | 1 + 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 01911157f8..36b10aca7b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sfuzzcheck\sso\sthat\swith\sthe\s--load-dbsql\soptions\sit\sscreens\sits\ninputs\sto\sensure\sthat\sthey\sare\svalid\sdbsqlfuzz\scases.\s\sAdd\snew\sdbsqlfuzz\nfinds\sto\sthe\stest/fuzzdata8.db\sdatabase. -D 2019-01-27T01:11:40.746 +C Window\sfunctions\sthat\scan\sabort\sshould\sindicate\sthis,\sso\sthat\sif\sthey\sare\nused\sin\sDML\sstatement,\sa\sstatement\sjournal\swill\sbe\sused. +D 2019-01-27T02:41:34.370 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -589,7 +589,7 @@ F src/vdbe.c b7b6f965153607072917dbd81d654a268abf4872c58d556701d1549550766c02 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 -F src/vdbeaux.c 158abc9c49a6870ce9c173b080faa6c3382a9b5a2d653d0a002eb20482e17cb2 +F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 8d170e387c230d12250d2feaec2c1a0d9a7184753f676df10a4b28f17abfcdaf F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f @@ -603,7 +603,7 @@ F src/where.c c5d201699d03be61c35bc04b96e481b1c8dc68177617ca1db156ef7409da2fae F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 -F src/window.c 1f4f7c69f23992b91c82e71fe47dd4e3ed70ceae12ce5ca6a1e757fdb158dcae +F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1804,7 +1804,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 a3ea1a822d3a110f4f186f2fc8550f435c8c98635d058096b7be9d4df7066b8b -R 03df092f631b381cdd6c4288d6623f64 +P 004f7d9bbeee049c22a7e1c82c6cc0ea79a237967de3ff57686acea3060d5f45 +R 7d3d07254fa4e2fa0c89d5dd83acdc85 U drh -Z b86c20bb8077d2eac80dc37ebee27c9e +Z bd3c0e468015b30eacb236d732938e6a diff --git a/manifest.uuid b/manifest.uuid index da82cd089b..7e6a43fef1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -004f7d9bbeee049c22a7e1c82c6cc0ea79a237967de3ff57686acea3060d5f45 \ No newline at end of file +0ea05a0eb96acb860d8af2e788e29a5ae3b161e7892ab62f1ff2f3e722c0dcb6 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index f5d30f3bad..aba75500f5 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -638,7 +638,7 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename || opcode==OP_VDestroy || ((opcode==OP_Halt || opcode==OP_HaltIfNull) - && ((pOp->p1&0xff)==SQLITE_CONSTRAINT && pOp->p2==OE_Abort)) + && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) ){ hasAbort = 1; break; diff --git a/src/window.c b/src/window.c index bb9bfa93e6..b0d28c493f 100644 --- a/src/window.c +++ b/src/window.c @@ -1075,6 +1075,7 @@ static void windowCheckIntValue(Parse *pParse, int reg, int eCond){ VdbeCoverageNeverNullIf(v, eCond==0); VdbeCoverageNeverNullIf(v, eCond==1); VdbeCoverageNeverNullIf(v, eCond==2); + sqlite3MayAbort(pParse); sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort); sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC); sqlite3ReleaseTempReg(pParse, regZero); From 05d49d1442d3d99237050c5f1502b56a79f72d2f Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 27 Jan 2019 02:45:32 +0000 Subject: [PATCH 150/306] New test cases form dbsqlfuzz FossilOrigin-Name: 9cf8ebd141aa2eb661d457624c76433bd9e4abfdef04aa52e28bc169172c2c8f --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 808960 -> 815104 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 36b10aca7b..23b1771580 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Window\sfunctions\sthat\scan\sabort\sshould\sindicate\sthis,\sso\sthat\sif\sthey\sare\nused\sin\sDML\sstatement,\sa\sstatement\sjournal\swill\sbe\sused. -D 2019-01-27T02:41:34.370 +C New\stest\scases\sform\sdbsqlfuzz +D 2019-01-27T02:45:32.191 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db e2e2d82c8f41f123a5e8e5a6db953143743ade9f23908eac224f5a2b39d55832 +F test/fuzzdata8.db fe997d33fd94a871c250c6f37df2dd8914d2e47b0d3c66b66ec50250ceb51837 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 004f7d9bbeee049c22a7e1c82c6cc0ea79a237967de3ff57686acea3060d5f45 -R 7d3d07254fa4e2fa0c89d5dd83acdc85 +P 0ea05a0eb96acb860d8af2e788e29a5ae3b161e7892ab62f1ff2f3e722c0dcb6 +R eaaae6d4983b2f4cb951fc0379b461d7 U drh -Z bd3c0e468015b30eacb236d732938e6a +Z facc76abd2629540783d8839a1ab85da diff --git a/manifest.uuid b/manifest.uuid index 7e6a43fef1..db34487ceb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0ea05a0eb96acb860d8af2e788e29a5ae3b161e7892ab62f1ff2f3e722c0dcb6 \ No newline at end of file +9cf8ebd141aa2eb661d457624c76433bd9e4abfdef04aa52e28bc169172c2c8f \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 91d9c04a4a8a4158034c14297a717bb7b6009031..05166e51a3b2770008656e6f8abad9607f47eb5d 100644 GIT binary patch delta 11254 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

    nT`1-I|3LS{Bk0aPjPA#W(VhEu zbU!_a?)-gp_aeZBN70?K(Umf~OaFoH@+0W3JdCdFVRYsHj;`WCbXOlickMxRm2NiS zFE{&{@%{22_G-esF5r>) zE|h=9_Yk27@vi}%KlHj6;Ft3t^)H0i-8jN)4YLp_>w{-H zINR9{k3hTIIr$T|oZI{vMvkYmpQsYt9Q{tHzT^|`{LVfz5mhn$2em22?zH;T>{?DP z8mnPkklQKxuCvp(a)dj@g}O}y8sEdY#Eur+FS?hWno_Su&L>QmOpE=UsfudyQ?IOG z?_+m^731B)+d)oF_E9SLSRKL}{f_8fe}&tUFlR#rYEbT6E58zJ4~1)sq*Sf`-PDQ2 zLo@^Vu&$B)Du3EF)8cBkmUAzKML7>Ee0md*VI38=bomPoKn|PSkfyRa|LF-NkIWl?pMa%kXlxbSGvu^^Z!c!(cl08 delta 10506 zcmZ`<2Y40L627x%&z{}A7f2wX3CRtiwn% zAB&j2EZQcpXc|9*W!;`Ef_kv1(w&9b&E{RtsL%g2 z>$1>mvw%>x)-SbKT=lZJ96W2T`(Jb2z#om~y2aG>255;cEiunu@2^o}zE}g4(^ZcH z%(x*6$@o~@0w~3zH6ntd_K74@dUe*luVsODyaTs%Uh>du7gg%3g9u-YMUg2r3 zk$z0v5pW%kRMNw6!Wt1sUA_|4O<7BKUG4nW!!NNvUBAB7HAHv4SLLsZcQq1gtO_QN z|IDA?Fqp(C3_mK~#$F@!OO*1R$O5>5{^vwG&G|u07w|j!e=LHj_i7QWQHRT-5a16C z`HzUj+mX77^L`aIaM^7!h(0J0u>x-5k!-P#GIonvfO{8QJno z?iIM;OVKQQjhK^vQ)s&8x6$LeR?o`aq!KQXw=-s-&ZowRP9VX@9$YqqFeN&cYdr3k=#aLRSJ)gsx*+n4X4y zzl&6zM--+1E@l8FMq6DpjE&Tz@@wl&B-Ev*4fLjp;3cGnkR+A3j?U$%IK-M(8yQ(`lHwS;mz3iUXRW^~ij!FLPtEuna&tsVg7 z@kjv#V*D;KkBWQfej4Ss*E6K7ue}BvZ996L}Pz%8LtNL%` zm#Y7)K{aaki{28b?IeAl2GyzE@A`*8Tbs!Qz~DZz8Frtd?}SIF-ECb1GN!R=sDbS? z>809f`WXQ=v7I5G!50R}xpaHBzEH`Ay6aZ3GcO%~O>ZD%6`t6Or7L8&yrh#WL{{4B ziq3jNuynQjDz9jIIOHA5*8%-d{~2mg`s+Ho`}7{k^UZlvpUztw)3fyjbh%KjhrFDb z@sL%JGRaX?x15EfGs?a0b^&bQ@#N7Av-Z-OB72)AM`pcBj z)Q$n{*~o5;0q^Nopb`3AQ`>3hF1@>e#^@g+LNM$Ds|g+~&;w{xfnH!5jif96LbT5X zz2jsxj2{iPY5jhEfF^?(Vi@TM9TefD7dhV%oK2kXW~6`Rd^ackr1Kp~da?5zMf!O? z$}$?W+E?!;7gk#vy+>pa6|tCN&?#6^Ri8exAfH-v|G2eg#5jI%4z`=lX4qKx7~ZbTUZR19%jpXXu@9FUaAv*()Dc(23x>nF1K^FALW7 zOy$^#Y$OjuXA15nw*&2LBD-tQ1%rFZqjWr6HWAR(3FhiF@s^&c5$o;;&<%qhmt%cu zk<~_`cYrL$+iCi1nDKCbbqc$whXXa}BToP%;O(jUcwBWyAL4Tsv9qEy=tG4eG8(Y$OuaSc=yE=pPs%?4 z`eI=nSvk9|)G27N{8nlGBha%+-$c11WFG;KXGO#%VbLm13}+0Hj73+$#`tww4#rmo zJ$o#;DaR6P0do#Bn51*oBUrpn^OlVwk5+ef+W;&WBm2;1kLW9~;6Hi@RtVBU@zO+D z8J?g)exd~ETB@v|!9d*mg`P&6=g5;lNt5L&fG2U~VCxAQ{DNF3U=X%Xw4TMHLf%TJ z6Rle4ec!5t6VvSK^z&5dCtxt?X_9xt5YlHm-$Su+brC{!=E~Co5;1zbT!&3hXs>1O z(CT8+=V0Qp333>HGEcVCAPGa-aXu+nZ55Nsls7dk*~Zu^swK5sC@+{s#9uo$-HB-n zzl?{rcwxWgkG+>klk8>kI!JDYU_@TTXeVv1l$Z4p|w6^YahN zow{tUyG{4zxn zgggfDY?ikk(R(Ll7Xi;@c^e(0uZm?O0h6-4VZ}Ifjs9QS{jE$^&;o-m$!v4lw)#=L zrv8}T&tN}nfI1i-$ffh~%W|#$eC~+I>?`t)OyRj-z=?tI?Y2P4UBaX8Dv&+h_`_Mm zim+x;&}DOSrNI=dc+!sU~w}R<(wiF)GC}pfM5^%QLm;o~|F%YghlOazwmQtQEG60LJf$2<{h9SSeNhdBgtpkit1)rURpVUC3U%W#omTt&Kh39 zBhf|)U5hj-2zZquB8X)hTwA zv5Ot`sJk=0H`VysSMQNZ1B^<5pFU@_$2)$;#{3C}&|onoj5f9k-!icHI=$ z3?0avWc;DQn{;-hu?pzb*^CFnrWnUy35BE@XEY~jK6W$?aGqL9A(NboyC3sJlXsSJ zPKRaWUq_76a9Xi3fC^t_Bf;`Txhfckq$v-Dy=EK}umazTQNuCqQ$wdcTO2#C*kuM| z1*OVUdtVuK~GFeaKCcXn#0yGs2r z?uIek=|ETSsMS_?UFb@gkt&2c=7xqhD`jkb+`7t$mv8Y6YsyNKMKueI)56ic79$cx z6|7KAt)YVTMn?hbX!AUyuZC%jxMd!)#aIil9y3?+V*Y}9*!ScH+`P#6jxKCBstNr+ zt;0uPdIJ?meht)M4W~wN42Lf@ra}HLgAWs%FgKlhPM-EV0h_V#j1j|!72`D3-C&&1 ztdVw9t4Kz(1q;vdNXiV;r1(unj&N)w9h_S+VwPFG48oTJao?ijCANgL${ zxaASm2fY_m1$<w-}xk63?crsy-L+0eUtX z*PPI)2sF68TFnP4j&$Tm@8xLu5aD~HCKi=if!Kbl;ijxubwtC8p{f)>?-Z z{${el20!|7cqFDqiAs2AvC#(CbYbVjkfAWXnegBzT~s)&sjr3#_yj%gIcnZw2spTx zYDVpvs(1rpX0I{W- z!Cf%KU}hQ+M`!veuaNs0$5AZpBm?QK^VV=a{0>rq82*Bq=ospA$_X;#fhtHd0BH13 zwFKZ8<<#P9cx9T(!jkDG(XwG`B)}Jx8)6%PDe20@v=yrF+L=m2Zv}ISqv<&2G&Bd$ zpwa5Ek{xu{<>#GT@dUZSF4Zuxsy*9D@kjXcUrMfT@8^WHPz|T>$?9`}6PWwFYD|oZ zo%=O z#TP@T98ksRy>3->@Yo`Mt{R}rM|IbgiQH0m#O1H4Q1eWFP)FT$F|G{e311QViV+sy z&0XFovjVmOJBFUhP)h}z#fVAj&N{J33HSyhUR2z-ELPmNoWqD|YBtSXs-_4yj}hsr zJM~_nwhQe3N5S`4y3ekYmGWX2EbeFaq2SxGR1C z6gycJaDo=*P^z_!?|~mNVvJUcie56q0b`Zfh)RZ-lYzYNn3iwJ7cj{(pQedB)j|P3 zVdiDUd1#lqs$?hK^?i3-xrWazS0c@Ykd@QDhLgZAoIpGhTwp`DQ%zD^gnp zlv46#=jJo-s7=)SxY`bImAqZdIY4K2n|wqmo~}#~Qni;3zl}YMj z9MaAV#ir-f7jT{S*5u1hfWGHj=`WZtR;xrAZ>ngZem|zFMyeCsVUhF-d? zUIF+GBXSMyYV-BBm@?Zufoa{$rt6YQmEsdy@^5O4gx~W6JJaFcRJf2#iZQ$8FfhbE zAI^5&q-OiNW9GHi*!TQ%fOdh|Nz>pKLX;guDKDBCT>RJ}$bk0Y8pW(B+{Vv#nlI8c z)11Q<;0}g-YP7_(5$XpDEoT;M%yboosv6|=GtVi|DDHPv9Vn=p`K`vZ7O&r*ca`7( zj$gn>B=1183ziI4mDt3Zj%spzE1yfyx1JyucPpuW;!NMVG9ru8?Cwr_`V_j^B$@L~tr68x0#dKw{ zS;ujnRt^i3)v4_Lh6hvH+T*GH7s{WHeI?djZ2y*d+_|MZrPeot1a5xH?29okoBwt$ zR=~nBsuES{VO~_sY?aVWW@|0N)lN*?1!Xu$}R3qbYd=8sUDIT*!tZE1k1 z=hf?!z1Eyd6(=?4Jv#~?e&f0CJY0QYFg53fSw=|nze5wk< z*nZ~Kzvoq7{4~Mvw!9-R=bFh(`h8^jDJB}O95mOP%~w|Lt-Icj@KG&cO*9k3cWHw- zL26;|RpnmdmnfehodmfVV-K5qWj!7X$IAn)XX*AXO%qt$)vAU;hBd+Q5?64y74dqg z2g5p9BeA5jw5X(18wC`2+`J6Tx|MddDrj^o-0}bge{G)EArdbQw4QrF+jvJ?6qY__ zt-7lv=e*fhK#RN2BR?Nb9WR&#lFvXzdo->K4h~`*-|%tbXY&}erlR+q>)t(@Ma-2& z0{wAaTi^?}Hdyqr)|GnxW`1Bo0{Me=S#zj0Et>9d3en1xeGAYYlgrCMOwyU3D4N3U zW6b+n;r(in)$YmnSkFq?S9cW+|C=pq*sL{nY56{Uw!#pPj77)F#8y7++av9GIIirh zP=Qi*X|0&huWT`8(*X-VH)F6@XUP_|X?j&_j)0Eb*6Dlb{Tf!BVAk$zZCM3t-q2pd z;NQ*ubdwuQrtZ+ck`+i{XHD+2}6H(l|j+i?CkSpewD|uO$MO+%RJ?=783XE=5_DHRkzpYwHo1*vBkS9a~wqEa*pZ z9jrZ|n5WZvHgASUHgN{qvPbK4&r^PY-&VEKajUWtkWuu)?VYXO&#h@z{mt};DEUci8A#{l zSzkKzjKd73y<+vmaf_L+TJeN#;McEMOQ`Ws>q~%sxD{mr20w3|#o|78Q`|DoYJkNB zU{Q9m#c82`R!C3)mK$T6f2k=8fF?pg@1vBPDOU!5oljxJVRy&7|8^7NAhQ52vswtRz+dA4Fg^aKg zP0O%e7Lbg&%dOtjccGOdU>Ft**6WgYnN`f43|ix8@|)HzDWA|?mqyar?H0etoAtIe z70M0a2}g$e{+dN#!bEE$#y(?N#H?ONp^a*RsgteBxaHq$&xdKmG+h3w{Uoj4U?n=_ zT*wj0l>a8H&}74$+HTbnas;a%i@EddHq?Hn^^t(55ni>!DRP%}STHM>I+3eV)dK4$ zhmc!YnTy|t)GiLyDwaM-cWuCsnW8=Ybk+*cWGde^iMUJOcCRll;u4;%syN=7 z?4;+L`9E4h!1HCVYWS!OE1xmfBKK;k0d=Y3bM&jAs>g9XY!s+~yHLUQo^5wag zF!dU@PvJK;or-?5PAeF^W2+r6WUPad+d9_OBXD$MiO4Z7eto&*7f(b{|Zs zZ8V@NmVHrU60WeSQAEc)c8W5Gautk@TBqTW#aeshBW^Y4EW&K+i9mZ8=;Ud9`Jo9Rd8Ti92*91m5xV~yDudxRG=zm)W3zX4VQVtBUiV8NBG{O%JVYW)A`8 z)K=!1gPoaHF{g$_hWRS7+DQWbjWJiPu(CS;U-FB#=P8cvWsllp^?92ICz9te`)5u5 zivi6?xTH0}f@Suzw4#eWTrg91q_YUa1xef`p81l=zyUq%O#(8=Z-UhbC@jG~ra>ki zIRIf8zJXiDj8j^Fn%~c!q?jB#FpJ*;wH|CUKgsOl(@+IH-)d7a_!)7UCMDbRHCTk1 z8x)812>S=2WqY$a2Q{H)qwOQYjV&WvM@B{s5041P%qUMo+^`Uy&K@h5Qp|Y!Lx&pE zQ|$4Uk*vFJBuAnDcuxoC&3AX)JX74vo?_pTuk(tQVBBh6{$D$N6IGsOU(#TyFO@i3 z-~e4ovjYUYg>nC~_hQ;2ISNx=v0G8{9Q$nzmX%!@!b!s3tZe2mPdy!VhyR>_h@h<* zPJF$|bFIYE6xAdzC!qhIL~;IfW4NzMzKzM>z-XFSU}p+7tVL_Sc@-vqqSwTv4(_c~ zwA5zyV|CV%-h5cOEkmj2K08mS7R~r~2HG0*zXl^{^lE#FVBYJjDI%%WdiwxVUg+&^ zx5xN@%W~9vlg+2Z^_Z~M;P)MkjMcO+hfm5doO-@vZ`0%o*0eDzJzyve+hwm5%xtAU z$2_aIqFu{@#fQDkR9Ml70g8Rg-tFs#w`9eI)-A)6FPO|KwTvlPvdHd&OP}z(K}l=u zRT?u|_hHI?2-CLvF@0rUHH{HW*Dj8xLd)G&vz+wxAO7sXBahkP_Zg2??6HS4XY~+J zLI(O@I(5;mD`4k?Am4ciZHAhJ)zW$Www%Zp+$E zc>dtK_!)+*vO}=p0MBs@KWHPaxGG1|uaCJs4!h*9ICK2gpKh zFlHWs=bXsp7u`pDx+63w!h{aSWL&Ys9)}#i{cu5;!SsDDM{s^WHy`eg{zH^}{!o-0 zdoY~8c+eNe|GzK3yx$jJmHEP?ZYl0}1pN1YUp(i8%IH5sg()fR0bJ=r;I2Lh?&k-=UHkvwuHO&tm;1r_(!j3|fm`E%!(C)wB1=&8D%rNGtt?5{F7yN%Hc z&-C~3F>k4jK<_4aBDhDn&F8h8MxMSxMKr*Wt1_5^`gy)~-k}H+)Blk5F#e$3k7k5> zxMQ?1p^N(zeLdI{?7PFJgdXnkKu;%o7C4!L%lTiGsUCH2=jmXF5#_Fyu!S@Mo$m?&%5Dz>jj5+W9`LT{ZB>kU{RIsDYkC8dRdD>+Pe$u`d7e$Hl#I)0_52{tZ#Gr=P|o v4!;qr?i5fT%-ulRD37j;32f;lb-4L*zeVAlJj__emy Date: Sun, 27 Jan 2019 19:50:56 +0000 Subject: [PATCH 151/306] Improvements to the ".eqp trace" command in the CLI so that it ensures that the schema has been read prior to activing the tracing feature, to avoid cluttering the output with a trace of the schema parse. FossilOrigin-Name: 42687d45aa1a2b2a32ddfc5711b4ae9cf76b8cfbeb20b57d6705ecaf5824fcb6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 23b1771580..33af54aca5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sform\sdbsqlfuzz -D 2019-01-27T02:45:32.191 +C Improvements\sto\sthe\s".eqp\strace"\scommand\sin\sthe\sCLI\sso\sthat\sit\sensures\sthat\nthe\sschema\shas\sbeen\sread\sprior\sto\sactiving\sthe\stracing\sfeature,\sto\savoid\ncluttering\sthe\soutput\swith\sa\strace\sof\sthe\sschema\sparse. +D 2019-01-27T19:50:56.340 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -515,7 +515,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 -F src/shell.c.in 324bc8df6e0ddc1c17771927f3bc9616340175e78cbb15f6cdfd10cade01cdbf +F src/shell.c.in 705a00be4fa43303b6b18df2241f5397cefd8d9f076bb035ad01b42635c7a1de F src/sqlite.h.in 8ded85ecaa768afd196b24201382ccdf00e5bab6861e30549cd750bebd273a0b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1804,7 +1804,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 0ea05a0eb96acb860d8af2e788e29a5ae3b161e7892ab62f1ff2f3e722c0dcb6 -R eaaae6d4983b2f4cb951fc0379b461d7 +P 9cf8ebd141aa2eb661d457624c76433bd9e4abfdef04aa52e28bc169172c2c8f +R 3e3c6032378ec0b1bc4989b8470ba10d U drh -Z facc76abd2629540783d8839a1ab85da +Z f362f232181a0d8f741744fba7a850da diff --git a/manifest.uuid b/manifest.uuid index db34487ceb..133bde08bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9cf8ebd141aa2eb661d457624c76433bd9e4abfdef04aa52e28bc169172c2c8f \ No newline at end of file +42687d45aa1a2b2a32ddfc5711b4ae9cf76b8cfbeb20b57d6705ecaf5824fcb6 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 1124ab4166..41832906ac 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6287,7 +6287,7 @@ static int do_meta_command(char *zLine, ShellState *p){ p->autoEQP = AUTOEQP_full; p->autoEQPtrace = 1; open_db(p, 0); - (void)sqlite3_table_column_metadata(p->db, "x","x",0,0,0,0,0,0); + sqlite3_exec(p->db, "SELECT name FROM sqlite_master LIMIT 1", 0, 0, 0); sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); #endif }else{ From 0c873bf28a3cbc724c9ccea6c82e492d0275967e Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Jan 2019 00:42:06 +0000 Subject: [PATCH 152/306] Change the definition of the BtCursor.skipNext field so that it is undefined for states CURSOR_VALID and CURSOR_INVALID. FossilOrigin-Name: 6089d5dba73437d787259033e94a38cf1b0c87cac4a89c27e69d8239c22f496e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 28 ++++++---------------------- src/btreeInt.h | 13 ++++++++++--- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/manifest b/manifest index 33af54aca5..45e936b7cd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\s".eqp\strace"\scommand\sin\sthe\sCLI\sso\sthat\sit\sensures\sthat\nthe\sschema\shas\sbeen\sread\sprior\sto\sactiving\sthe\stracing\sfeature,\sto\savoid\ncluttering\sthe\soutput\swith\sa\strace\sof\sthe\sschema\sparse. -D 2019-01-27T19:50:56.340 +C Change\sthe\sdefinition\sof\sthe\sBtCursor.skipNext\sfield\sso\sthat\sit\sis\sundefined\nfor\sstates\sCURSOR_VALID\sand\sCURSOR_INVALID. +D 2019-01-28T00:42:06.088 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -455,9 +455,9 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c c78051b514c5ea214f5ee1119d5df7d47471e32c0cb4d5b93f135bf86d67f0ca +F src/btree.c 3378f2f410af2db1c4603fb085d71139811a7c86f8de8511da3acbae984c1cf4 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 -F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 +F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -1804,7 +1804,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 9cf8ebd141aa2eb661d457624c76433bd9e4abfdef04aa52e28bc169172c2c8f -R 3e3c6032378ec0b1bc4989b8470ba10d +P 42687d45aa1a2b2a32ddfc5711b4ae9cf76b8cfbeb20b57d6705ecaf5824fcb6 +R 4d32b449c698c9011df8cf39a327380e U drh -Z f362f232181a0d8f741744fba7a850da +Z 17d57a5f847e0926de782c15e1422907 diff --git a/manifest.uuid b/manifest.uuid index 133bde08bd..a0bfbf310d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -42687d45aa1a2b2a32ddfc5711b4ae9cf76b8cfbeb20b57d6705ecaf5824fcb6 \ No newline at end of file +6089d5dba73437d787259033e94a38cf1b0c87cac4a89c27e69d8239c22f496e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e0a9862b6f..244ed54f4e 100644 --- a/src/btree.c +++ b/src/btree.c @@ -845,7 +845,7 @@ static int btreeRestoreCursorPosition(BtCursor *pCur){ sqlite3_free(pCur->pKey); pCur->pKey = 0; assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); - pCur->skipNext |= skipNext; + if( skipNext ) pCur->skipNext = skipNext; if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ pCur->eState = CURSOR_SKIPNEXT; } @@ -915,7 +915,6 @@ int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow){ if( pCur->eState!=CURSOR_VALID ){ *pDifferentRow = 1; }else{ - assert( pCur->skipNext==0 ); *pDifferentRow = 0; } return SQLITE_OK; @@ -5334,7 +5333,7 @@ int sqlite3BtreeMovetoUnpacked( ** try to get there using sqlite3BtreeNext() rather than a full ** binary search. This is an optimization only. The correct answer ** is still obtained without this case, only a little more slowely */ - if( pCur->info.nKey+1==intKey && !pCur->skipNext ){ + if( pCur->info.nKey+1==intKey ){ *pRes = 0; rc = sqlite3BtreeNext(pCur, 0); if( rc==SQLITE_OK ){ @@ -5608,7 +5607,6 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); if( pCur->eState!=CURSOR_VALID ){ assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); rc = restoreCursorPosition(pCur); @@ -5618,14 +5616,9 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( pCur->eState==CURSOR_SKIPNEXT ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext>0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext>0 ) return SQLITE_OK; } } @@ -5680,7 +5673,6 @@ int sqlite3BtreeNext(BtCursor *pCur, int flags){ UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur); @@ -5721,7 +5713,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); assert( (pCur->curFlags & (BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey))==0 ); assert( pCur->info.nSize==0 ); if( pCur->eState!=CURSOR_VALID ){ @@ -5732,14 +5723,9 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( CURSOR_SKIPNEXT==pCur->eState ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext<0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext<0 ) return SQLITE_OK; } } @@ -5774,7 +5760,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ int sqlite3BtreePrevious(BtCursor *pCur, int flags){ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey); pCur->info.nSize = 0; @@ -8770,7 +8755,6 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** sub-tree headed by the child page of the cell being deleted. This makes ** balancing the tree following the delete operation easier. */ if( !pPage->leaf ){ - pCur->skipNext = 0; rc = sqlite3BtreePrevious(pCur, 0); assert( rc!=SQLITE_DONE ); if( rc ) return rc; diff --git a/src/btreeInt.h b/src/btreeInt.h index d1e2c08d18..ea5e0815a1 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -494,9 +494,16 @@ struct CellInfo { ** found at self->pBt->mutex. ** ** skipNext meaning: -** eState==SKIPNEXT && skipNext>0: Next sqlite3BtreeNext() is no-op. -** eState==SKIPNEXT && skipNext<0: Next sqlite3BtreePrevious() is no-op. -** eState==FAULT: Cursor fault with skipNext as error code. +** The meaning of skipNext depends on the value of eState: +** +** eState Meaning of skipNext +** VALID skipNext is meaningless and is ignored +** INVALID skipNext is meaningless and is ignored +** SKIPNEXT sqlite3BtreeNext() is a no-op if skipNext>0 and +** sqlite3BtreePrevious() is no-op if skipNext<0. +** REQUIRESEEK restoreCursorPosition() restores the cursor to +** eState=SKIPNEXT if skipNext!=0 +** FAULT skipNext holds the cursor fault error code. */ struct BtCursor { u8 eState; /* One of the CURSOR_XXX constants (see below) */ From 9e35a61e59fa735eb73c49fbad051d2f144470d3 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Jan 2019 11:54:13 +0000 Subject: [PATCH 153/306] Add a new test case to fuzzdata8.db. FossilOrigin-Name: ce8e279a7d37594e865c2d9197a5efe5d647e11f074dbaf4a4ee31c74c71dbc9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 815104 -> 820224 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 45e936b7cd..f38cd40850 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sdefinition\sof\sthe\sBtCursor.skipNext\sfield\sso\sthat\sit\sis\sundefined\nfor\sstates\sCURSOR_VALID\sand\sCURSOR_INVALID. -D 2019-01-28T00:42:06.088 +C Add\sa\snew\stest\scase\sto\sfuzzdata8.db. +D 2019-01-28T11:54:13.332 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db fe997d33fd94a871c250c6f37df2dd8914d2e47b0d3c66b66ec50250ceb51837 +F test/fuzzdata8.db 946a59b0b322b560fdcb22707ecb1e4dfaca2f5ac5115315c4b29c9d912a54c2 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 42687d45aa1a2b2a32ddfc5711b4ae9cf76b8cfbeb20b57d6705ecaf5824fcb6 -R 4d32b449c698c9011df8cf39a327380e +P 6089d5dba73437d787259033e94a38cf1b0c87cac4a89c27e69d8239c22f496e +R 968d160bee7a77c87102dd8cae5c338b U drh -Z 17d57a5f847e0926de782c15e1422907 +Z 3a2b758ccfc98f820be399b59fd66079 diff --git a/manifest.uuid b/manifest.uuid index a0bfbf310d..6bc7549ed2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6089d5dba73437d787259033e94a38cf1b0c87cac4a89c27e69d8239c22f496e \ No newline at end of file +ce8e279a7d37594e865c2d9197a5efe5d647e11f074dbaf4a4ee31c74c71dbc9 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 05166e51a3b2770008656e6f8abad9607f47eb5d..4b930b8856276855dbf733b49d9adc1c97f6ceb9 100644 GIT binary patch delta 3631 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 F`!kM=E-U~5 From 6c43dbad98188e7d75909ac764ac5104ce176f6e Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 28 Jan 2019 13:27:25 +0000 Subject: [PATCH 154/306] Do not assume that text parameters passed to fts4aux queries do not contain embedded nul characters. FossilOrigin-Name: df04859a995571cd6faf1abe088725708f35e81195760274df9e2ec9bd47f69f --- ext/fts3/fts3_aux.c | 4 ++-- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts3aux2.test | 24 ++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/ext/fts3/fts3_aux.c b/ext/fts3/fts3_aux.c index b9fe71fcf6..299ff5c84b 100644 --- a/ext/fts3/fts3_aux.c +++ b/ext/fts3/fts3_aux.c @@ -416,15 +416,15 @@ static int fts3auxFilterMethod( assert( (iEq==0 && iGe==-1) || (iEq==-1 && iGe==0) ); if( zStr ){ pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr); - pCsr->filter.nTerm = sqlite3_value_bytes(apVal[0]); if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM; + pCsr->filter.nTerm = strlen(pCsr->filter.zTerm); } } if( iLe>=0 ){ pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); - pCsr->nStop = sqlite3_value_bytes(apVal[iLe]); if( pCsr->zStop==0 ) return SQLITE_NOMEM; + pCsr->nStop = strlen(pCsr->zStop); } if( iLangid>=0 ){ diff --git a/manifest b/manifest index f38cd40850..d68ca4444d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\snew\stest\scase\sto\sfuzzdata8.db. -D 2019-01-28T11:54:13.332 +C Do\snot\sassume\sthat\stext\sparameters\spassed\sto\sfts4aux\squeries\sdo\snot\scontain\sembedded\snul\scharacters. +D 2019-01-28T13:27:25.764 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -83,7 +83,7 @@ F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c 014e2bef603dd3c46d99f36dea614e05a2ae75ae02c0ba8519ecb1d2d0c6ee22 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c -F ext/fts3/fts3_aux.c 32e3ecada9014ff577022f9b44c9c5654d59405b39dc57ba8977298157e8c89b +F ext/fts3/fts3_aux.c c7512135fc7df424ceed21e2b47e1fb036ca115aace3852d26da3e29960002f3 F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf @@ -910,7 +910,7 @@ F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd F test/fts3atoken.test 4b4c16fdcfc972f2cdbba212375a060a86ccf5f1 F test/fts3auto.test 19097050a3ca7ab7a43b2be967cb3dfd8ddf841dfdc4eac88deb172ad2f209f2 F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 -F test/fts3aux2.test 7ae2b2c13aefdf4169279a27a5f51780ce57f6ba +F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f F test/fts3b.test c15c4a9d04e210d0be67e54ce6a87b927168fbf9c1e3faec8c1a732c366fd491 F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c @@ -1804,7 +1804,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 6089d5dba73437d787259033e94a38cf1b0c87cac4a89c27e69d8239c22f496e -R 968d160bee7a77c87102dd8cae5c338b -U drh -Z 3a2b758ccfc98f820be399b59fd66079 +P ce8e279a7d37594e865c2d9197a5efe5d647e11f074dbaf4a4ee31c74c71dbc9 +R ab553cf29e9ae9acd75ec6d29944c0d8 +U dan +Z fa066b8d88db8749b3f605061d30eb3f diff --git a/manifest.uuid b/manifest.uuid index 6bc7549ed2..38593a6b12 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ce8e279a7d37594e865c2d9197a5efe5d647e11f074dbaf4a4ee31c74c71dbc9 \ No newline at end of file +df04859a995571cd6faf1abe088725708f35e81195760274df9e2ec9bd47f69f \ No newline at end of file diff --git a/test/fts3aux2.test b/test/fts3aux2.test index e108fc4b80..9554022559 100644 --- a/test/fts3aux2.test +++ b/test/fts3aux2.test @@ -141,4 +141,28 @@ do_execsql_test 1.4.6 { five * 1 1 2 five 0 1 1 2 } +#------------------------------------------------------------------------- +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE ft USING fts3(); + INSERT INTO ft VALUES('a_234567890123456789'); + INSERT INTO ft VALUES('b_234567890123456789'); + INSERT INTO ft VALUES('c_234567890123456789'); + CREATE VIRTUAL TABLE t2 USING fts4aux(ft); +} + +do_execsql_test 2.1 { + SELECT term FROM t2 WHERE term=X'625f323334353637383930313233343536373839'; +} + +do_execsql_test 2.2 { + SELECT term FROM t2 WHERE term Date: Mon, 28 Jan 2019 16:50:42 +0000 Subject: [PATCH 155/306] Fix a buffer overread in fts3 that could occur when accessing a corrupt database. FossilOrigin-Name: a9faf9033910927c74553e66c474d84ed3386f263cef3eec299e25d8306f410d --- ext/fts3/fts3.c | 1 + manifest | 14 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 225 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 234 insertions(+), 8 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 36e41d2404..bd0003d063 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2810,6 +2810,7 @@ static int fts3TermSelectMerge( pTS->anOutput[0] = nDoclist; if( pTS->aaOutput[0] ){ memcpy(pTS->aaOutput[0], aDoclist, nDoclist); + memset(&pTS->aaOutput[0][nDoclist], 0, FTS3_VARINT_MAX); }else{ return SQLITE_NOMEM; } diff --git a/manifest b/manifest index d68ca4444d..ce24fd02da 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sassume\sthat\stext\sparameters\spassed\sto\sfts4aux\squeries\sdo\snot\scontain\sembedded\snul\scharacters. -D 2019-01-28T13:27:25.764 +C Fix\sa\sbuffer\soverread\sin\sfts3\sthat\scould\soccur\swhen\saccessing\sa\scorrupt\sdatabase. +D 2019-01-28T16:50:42.458 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 014e2bef603dd3c46d99f36dea614e05a2ae75ae02c0ba8519ecb1d2d0c6ee22 +F ext/fts3/fts3.c 5da1329ccf66b6d597dfb16b1f81aa204133c1ec96117d82a59c20126f483b17 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c F ext/fts3/fts3_aux.c c7512135fc7df424ceed21e2b47e1fb036ca115aace3852d26da3e29960002f3 @@ -918,7 +918,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 9a1e931adf2746a43a5191d4c2f60c6409ee092fb24b8b11a7cc2a2f4f8b5bcc +F test/fts3corrupt4.test c40a7895d8b17f75e6e3cf83e0cb14146c0affc23f7879b7d472f39f363146b3 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1804,7 +1804,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 ce8e279a7d37594e865c2d9197a5efe5d647e11f074dbaf4a4ee31c74c71dbc9 -R ab553cf29e9ae9acd75ec6d29944c0d8 +P df04859a995571cd6faf1abe088725708f35e81195760274df9e2ec9bd47f69f +R bde88f7bda44506e97f9208a864b23cb U dan -Z fa066b8d88db8749b3f605061d30eb3f +Z 04d2112486f711cf461bcabac1e34620 diff --git a/manifest.uuid b/manifest.uuid index 38593a6b12..f3f266bcb1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df04859a995571cd6faf1abe088725708f35e81195760274df9e2ec9bd47f69f \ No newline at end of file +a9faf9033910927c74553e66c474d84ed3386f263cef3eec299e25d8306f410d \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 02d7259128..c6c7751a4b 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -2605,5 +2605,230 @@ do_catchsql_test 17.4 { DROP TABLE IF EXISTS t1; } {1 {SQL logic error}} +#------------------------------------------------------------------------- +reset_db +do_test 18.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-4ce32d0608aff1.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 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 07 00 00 00 01 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 0d a4 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 62 2c 72 6f 6f 74 ock INTEGEb,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 67 64 69 72 egdir_1t1_segdir +| 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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 39 00 00 00 00 00 (a,b,c)...9..... +| 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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 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 23 00 20 32 30 31 36 30 36 30 39 20 44 45 42 4#. 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 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 53 49 4d 18 1b 05 00 25 00000XRTSIM....% +| 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 52 4c 45 20 4a 53 4f ...%..ENARLE 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 1e 4c NARY....)..ENA.L +| 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 55 ....)..ENABLE GU +| 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 59 e5 58 .#..ENABLE FTY.X +| 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 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 25 75 2e 34 2f 30 20 32 30 31 36 30 36 30 cc%u.4/0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| 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 41 00 04 6c 6f 61 64 03 25 1c 00 n1.%.A..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 56 65 03 %....threadsaVe. +| 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 02 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 f2 03 00 01 03 00 01 03 00 01 bstat........... +| 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 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 57 02 00 .............W.. +| 3504: 01 02 00 01 01 00 01 02 00 11 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 64 6e 73 69 6f .........xtdnsio +| 3552: 6e 09 1f 04 00 01 04 00 01 03 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 57 63 63 09 01 03 ..........Wcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 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 02 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 e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4064: 00 00 00 00 00 0d 05 02 23 61 75 74 6f 6d 65 72 ........#automer +| 4080: 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 3d 31 30 ge=5...#merge=10 +| page 8 offset 28672 +| 0: 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 69 74 79 0,8...+integrity +| 16: 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 75 69 6c -check....rebuil +| 32: 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 00 00 00 d....optimize... +| end crash-4ce32d0608aff1.db +}]} {} + +do_catchsql_test 18.1 { + SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; +} {0 0} + + finish_test From 95d5a880584bfb6f21fc3843737f9a6f4aed3cf1 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 28 Jan 2019 18:08:59 +0000 Subject: [PATCH 156/306] Make indexes on CAST(...) expressions work. FossilOrigin-Name: 3ef711d98fb239cf24472f124e7b36b0dde33355de5a2c9a3a978bbdd042a735 --- manifest | 17 ++++++++++------- manifest.uuid | 2 +- src/where.c | 1 + test/indexexpr2.test | 28 ++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ce24fd02da..05732bb180 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverread\sin\sfts3\sthat\scould\soccur\swhen\saccessing\sa\scorrupt\sdatabase. -D 2019-01-28T16:50:42.458 +C Make\sindexes\son\sCAST(...)\sexpressions\swork. +D 2019-01-28T18:08:59.152 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -599,7 +599,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 -F src/where.c c5d201699d03be61c35bc04b96e481b1c8dc68177617ca1db156ef7409da2fae +F src/where.c c91b3dd6bb67abc7d4de879cf60e1fb57f5972045fc7b147f33537a1baecdfc0 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 @@ -1034,7 +1034,7 @@ F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e -F test/indexexpr2.test 8dd1f8f936cc4d246af605366886bbd251848b411378eb60887361d5302d9f54 +F test/indexexpr2.test 38020c247ee77ba19322fadde99db84bdf2aef34f714866786563c3834bb2dce F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 @@ -1804,7 +1804,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 df04859a995571cd6faf1abe088725708f35e81195760274df9e2ec9bd47f69f -R bde88f7bda44506e97f9208a864b23cb +P a9faf9033910927c74553e66c474d84ed3386f263cef3eec299e25d8306f410d +R 9a0f3b3b7b4bc83772f491da4476a586 +T *branch * index-on-cast +T *sym-index-on-cast * +T -sym-trunk * U dan -Z 04d2112486f711cf461bcabac1e34620 +Z cf3b41fd70871ac23ce42361c18f4249 diff --git a/manifest.uuid b/manifest.uuid index f3f266bcb1..5b02a6ffbb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a9faf9033910927c74553e66c474d84ed3386f263cef3eec299e25d8306f410d \ No newline at end of file +3ef711d98fb239cf24472f124e7b36b0dde33355de5a2c9a3a978bbdd042a735 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 8be95bcd29..32f36d1d3d 100644 --- a/src/where.c +++ b/src/where.c @@ -348,6 +348,7 @@ static WhereTerm *whereScanInit( if( iColumn==XN_EXPR ){ pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; pScan->zCollName = pIdx->azColl[j]; + pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); }else if( iColumn==pIdx->pTable->iPKey ){ iColumn = XN_ROWID; }else if( iColumn>=0 ){ diff --git a/test/indexexpr2.test b/test/indexexpr2.test index 368237f23e..8d6e5914c0 100644 --- a/test/indexexpr2.test +++ b/test/indexexpr2.test @@ -249,6 +249,34 @@ do_execsql_test 5.4 { SELECT * FROM t5 WHERE abs(a)=2 or abs(b)=9; } {2 4 3 9} +#------------------------------------------------------------------------- +do_execsql_test 6.0 { + CREATE TABLE x1(a INTEGER PRIMARY KEY, b); + INSERT INTO x1 VALUES + (1, 123), (2, '123'), (3, '123abc'), (4, 123.0), (5, 1234); +} + +do_execsql_test 6.1.1 { + SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; +} {1 123 2 123 3 123abc 4 123.0} +do_execsql_test 6.1.2 { + CREATE INDEX x1i ON x1( CAST(b AS INTEGER) ); + SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; +} {1 123 2 123 3 123abc 4 123.0} +do_eqp_test 6.1.3 { + SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; +} {SEARCH TABLE x1 USING INDEX x1i (=?)} + +do_execsql_test 6.2.1 { + SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; +} {1 123 2 123} +do_execsql_test 6.2.2 { + CREATE INDEX x1i2 ON x1( CAST(b AS TEXT) ); + SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; +} {1 123 2 123} +do_eqp_test 6.2.3 { + SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; +} {SEARCH TABLE x1 USING INDEX x1i2 (=?)} finish_test From e86974c61985d68676d2803dcf6cd3f3eaf82989 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Jan 2019 18:58:54 +0000 Subject: [PATCH 157/306] Fix a performance regression caused by the previous commit. FossilOrigin-Name: c4db0ad12d4f3d2800d36404f391b325cdc4aa7f8dcea93b2d63a489d9095ad4 --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/where.c | 24 ++++++++++++++++++------ 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 05732bb180..9e70bdab06 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sindexes\son\sCAST(...)\sexpressions\swork. -D 2019-01-28T18:08:59.152 +C Fix\sa\sperformance\sregression\scaused\sby\sthe\sprevious\scommit. +D 2019-01-28T18:58:54.614 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -599,7 +599,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 -F src/where.c c91b3dd6bb67abc7d4de879cf60e1fb57f5972045fc7b147f33537a1baecdfc0 +F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 @@ -1804,10 +1804,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 a9faf9033910927c74553e66c474d84ed3386f263cef3eec299e25d8306f410d -R 9a0f3b3b7b4bc83772f491da4476a586 -T *branch * index-on-cast -T *sym-index-on-cast * -T -sym-trunk * -U dan -Z cf3b41fd70871ac23ce42361c18f4249 +P 3ef711d98fb239cf24472f124e7b36b0dde33355de5a2c9a3a978bbdd042a735 +R 54fc32c05e999eaa7483855f7fbb2719 +U drh +Z 51fba204c69fae1056723ec255ec3703 diff --git a/manifest.uuid b/manifest.uuid index 5b02a6ffbb..b78f5c20ef 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3ef711d98fb239cf24472f124e7b36b0dde33355de5a2c9a3a978bbdd042a735 \ No newline at end of file +c4db0ad12d4f3d2800d36404f391b325cdc4aa7f8dcea93b2d63a489d9095ad4 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 32f36d1d3d..a09f7624f8 100644 --- a/src/where.c +++ b/src/where.c @@ -310,6 +310,17 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ return 0; } +/* +** This is whereScanInit() for the case of an index on an expression. +** It is factored out into a separate tail-recursion subroutine so that +** the normal whereScanInit() routine, which is a high-runner, does not +** need to push registers onto the stack as part of its prologue. +*/ +static SQLITE_NOINLINE WhereTerm *whereScanInitIndexExpr(WhereScan *pScan){ + pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); + return whereScanNext(pScan); +} + /* ** Initialize a WHERE clause scanner object. Return a pointer to the ** first match. Return NULL if there are no matches. @@ -342,13 +353,19 @@ static WhereTerm *whereScanInit( pScan->pIdxExpr = 0; pScan->idxaff = 0; pScan->zCollName = 0; + pScan->opMask = opMask; + pScan->k = 0; + pScan->aiCur[0] = iCur; + pScan->nEquiv = 1; + pScan->iEquiv = 1; if( pIdx ){ int j = iColumn; iColumn = pIdx->aiColumn[j]; if( iColumn==XN_EXPR ){ pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; pScan->zCollName = pIdx->azColl[j]; - pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); + pScan->aiColumn[0] = XN_EXPR; + return whereScanInitIndexExpr(pScan); }else if( iColumn==pIdx->pTable->iPKey ){ iColumn = XN_ROWID; }else if( iColumn>=0 ){ @@ -358,12 +375,7 @@ static WhereTerm *whereScanInit( }else if( iColumn==XN_EXPR ){ return 0; } - pScan->opMask = opMask; - pScan->k = 0; - pScan->aiCur[0] = iCur; pScan->aiColumn[0] = iColumn; - pScan->nEquiv = 1; - pScan->iEquiv = 1; return whereScanNext(pScan); } From 4a7e9a25b64489a9d7e8f1d84f0e50cbbb4a7735 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Jan 2019 02:37:22 +0000 Subject: [PATCH 158/306] Set a low limit on the length of strings and blobs in the OSSFuzz module, in an effort to avoid timeouts when the fuzzer does things like "randomblob(1e12)". FossilOrigin-Name: 119d1609fa415894fdd0aa19440ca1c658bd01910838a4cfadbe0e304b033bfd --- manifest | 13 ++++++------- manifest.uuid | 2 +- test/ossfuzz.c | 5 +++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 638a3ec90b..16ee7cf526 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\squery\splanner\sso\sthat\sit\sis\sable\sto\suse\san\sindex\son\sa\sCAST\sexpression. -D 2019-01-28T19:06:17.490 +C Set\sa\slow\slimit\son\sthe\slength\sof\sstrings\sand\sblobs\sin\sthe\sOSSFuzz\smodule,\nin\san\seffort\sto\savoid\stimeouts\swhen\sthe\sfuzzer\sdoes\sthings\slike\n"randomblob(1e12)". +D 2019-01-29T02:37:22.889 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -1179,7 +1179,7 @@ F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 F test/oserror.test e7b3416be4b9d5dd2fe0b42dd394daaddbb6c83eeec1f0e47b120b53e0ad3ace -F test/ossfuzz.c 273eaea2d65b70d77ea4f01404114b9e0244488943f768dc39458c72bd722e0e +F test/ossfuzz.c 18af635fa73d12a109b305faca727a734c1fa28a421b161d9d15c5a84a4998a2 F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f F test/pager1.test 1e9ee778bdeaf4f7f09997d029cdaca6a42dfc2092edafe4f5e590acbf1eab13 @@ -1804,8 +1804,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 a9faf9033910927c74553e66c474d84ed3386f263cef3eec299e25d8306f410d c4db0ad12d4f3d2800d36404f391b325cdc4aa7f8dcea93b2d63a489d9095ad4 -R 54fc32c05e999eaa7483855f7fbb2719 -T +closed c4db0ad12d4f3d2800d36404f391b325cdc4aa7f8dcea93b2d63a489d9095ad4 +P 2c886f3d49c9569e9f6ee28b89b57e2d4004c8972d11da0c23f7b2d2e0c9900a +R ef986afd8b8f6d7a6be0edfceebfc371 U drh -Z d2bf11950d89b1b09c3cca064a694bb6 +Z e752816e40989f14dc990fea8dbd374e diff --git a/manifest.uuid b/manifest.uuid index c96543994e..b042e30d03 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2c886f3d49c9569e9f6ee28b89b57e2d4004c8972d11da0c23f7b2d2e0c9900a \ No newline at end of file +119d1609fa415894fdd0aa19440ca1c658bd01910838a4cfadbe0e304b033bfd \ No newline at end of file diff --git a/test/ossfuzz.c b/test/ossfuzz.c index c3d66eb29d..3b1017f726 100644 --- a/test/ossfuzz.c +++ b/test/ossfuzz.c @@ -155,6 +155,11 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { /* Set a limit on the maximum size of a prepared statement */ sqlite3_limit(cx.db, SQLITE_LIMIT_VDBE_OP, 25000); + /* Set a limit on the maximum length of a string or BLOB. Without this + ** limit, fuzzers will invoke randomblob(N) for a large N, and the process + ** will timeout trying to generate the huge blob */ + sqlite3_limit(cx.db, SQLITE_LIMIT_LENGTH, 50000); + /* Bit 1 of the selector enables foreign key constraints */ sqlite3_db_config(cx.db, SQLITE_DBCONFIG_ENABLE_FKEY, uSelector&1, &rc); uSelector >>= 1; From 3993397e6c2a1f754c52b4a4a999367e2ea8f0c9 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 29 Jan 2019 11:42:43 +0000 Subject: [PATCH 159/306] Fix a buffer overrun triggered by a merge operation on a corrupt fts5 database. FossilOrigin-Name: 7ee3cd5b2cdf8db35f70400b3df58f7c421c78ae77c50f22b0ee22d5a3039429 --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5corrupt3.test | 231 ++++++++++++++++++++++++++++++++ manifest | 16 +-- manifest.uuid | 2 +- 4 files changed, 241 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index cec4415d9d..e1bb8d49a6 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4145,7 +4145,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ u8 aHdr[4] = {0x00, 0x00, 0x00, 0x00}; iLeafRowid = FTS5_SEGMENT_ROWID(iId, pSeg->iTermLeafPgno); - pData = fts5DataRead(p, iLeafRowid); + pData = fts5LeafRead(p, iLeafRowid); if( pData ){ if( iOff>pData->szLeaf ){ /* This can occur if the pages that the segments occupy overlap - if diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 8f9d012957..e167321b1f 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -5820,6 +5820,237 @@ do_catchsql_test 44.2 { SELECT snippet(t1, -1, '.', '..', '', 2 ) FROM t1('g h') ORDER BY rank; } {0 {{.g.. .h..} {.g.. h} {.g.. .h..}}} +#-------------------------------------------------------------------------- +reset_db +do_test 45.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-0b162c9e69b999.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 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 52 6c 65 (a)V.......taRle +| 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 73 73 !...tablet1_doss +| 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 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........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 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 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 75 73 34 03 02 02 01 04 6e .....4fus4.....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 74 6d 03 06 01 ...<.....3ntm... +| 2528: 01 05 01 03 74 61 62 05 62 03 04 0a 19 8c 80 80 ....tab.b....... +| 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: 80 80 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 ff 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: 80 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 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 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 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 11 03 00 16 00 00 01 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 30 00 00 00 11 02 01 .........0...... +| 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 0e 03 00 3c 00 00 00 16 02 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: 00 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 02 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 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 06 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 03 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 00 01 05 04 15 84 80 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 10 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: bd 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 2f 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 02 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 05 52 08 04 01 ...0n.......R... +| 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 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 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 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 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 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 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 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +}]} {} + +do_catchsql_test 45.2 { + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); +} {0 {}} + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 16ee7cf526..de45870fc5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Set\sa\slow\slimit\son\sthe\slength\sof\sstrings\sand\sblobs\sin\sthe\sOSSFuzz\smodule,\nin\san\seffort\sto\savoid\stimeouts\swhen\sthe\sfuzzer\sdoes\sthings\slike\n"randomblob(1e12)". -D 2019-01-29T02:37:22.889 +C Fix\sa\sbuffer\soverrun\striggered\sby\sa\smerge\soperation\son\sa\scorrupt\sfts5\sdatabase. +D 2019-01-29T11:42:43.080 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c ae9b5af68f85d0542dbb807af114d6fc025943d466e15a9289d22b1bf378cbfe +F ext/fts5/fts5_index.c 091a8474bc65168f459c1b1e5d2ec6d84c271e2cad30b749b89a5216cd58e43b F ext/fts5/fts5_main.c df4ba0a9d879de50f59662abc081209fe7a5eec87f1338e0462beeeba7830585 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test dbc78ab3f1700bf33abad07dc2c795f86b3a72e7f9cc152e1354f95062381b7d +F ext/fts5/test/fts5corrupt3.test f5aa3e1031cba4ef216621b9dfe923a048d9a3bc24bb147fa51748e311c3163b F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 2c886f3d49c9569e9f6ee28b89b57e2d4004c8972d11da0c23f7b2d2e0c9900a -R ef986afd8b8f6d7a6be0edfceebfc371 -U drh -Z e752816e40989f14dc990fea8dbd374e +P 119d1609fa415894fdd0aa19440ca1c658bd01910838a4cfadbe0e304b033bfd +R 469d0e8bbdba368f9ee90112edf3e941 +U dan +Z 39e0197e394b50d59f3016d45cfe8006 diff --git a/manifest.uuid b/manifest.uuid index b042e30d03..f5a1198c41 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -119d1609fa415894fdd0aa19440ca1c658bd01910838a4cfadbe0e304b033bfd \ No newline at end of file +7ee3cd5b2cdf8db35f70400b3df58f7c421c78ae77c50f22b0ee22d5a3039429 \ No newline at end of file From eb2ed10ec0fcb66e570dec092280baf9ced4b945 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 29 Jan 2019 15:30:03 +0000 Subject: [PATCH 160/306] Avoid a crash when the fts5 snippet() function (or similar) is used with a special query pattern, like '*id' or '*reads'. FossilOrigin-Name: 9d58a15737f7379fed724749cfd5b4de5b44231870e99fc664683ad483c3e6ba --- ext/fts5/fts5_main.c | 4 +- ext/fts5/test/fts5corrupt3.test | 218 ++++++++++++++++++++++++++++++++ manifest | 14 +- manifest.uuid | 2 +- 4 files changed, 229 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index c98df4f469..53b6ab3c32 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1708,7 +1708,9 @@ static int fts5ApiColumnText( ){ int rc = SQLITE_OK; Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) ){ + if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) + || pCsr->ePlan==FTS5_PLAN_SPECIAL + ){ *pz = 0; *pn = 0; }else{ diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index e167321b1f..16468e8ffc 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -6050,6 +6050,224 @@ do_catchsql_test 45.2 { INSERT INTO t1(t1, rank) VALUES('merge', 5); } {0 {}} +#-------------------------------------------------------------------------- +reset_db +do_test 46.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-1ee8bd451dd1ad.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 60 t2(x)V.......t` +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 3d ......0000000..= +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 07 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 06 e2 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 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 31 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DS1FE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 40 42 4c 45 20 52 54 52 ...%..EN@BLE 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 59 42 ..ENABLE JSON1YB +| 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 15 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 a4 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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 04 f0 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 22 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 a2 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-1ee8bd451dd1ad.db +}]} {} + +do_catchsql_test 46.1 { + SELECT snippet(t1,'[','', '--',-1,10) FROM t1('*'); +} {0 {{}}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index de45870fc5..34feea8ec0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverrun\striggered\sby\sa\smerge\soperation\son\sa\scorrupt\sfts5\sdatabase. -D 2019-01-29T11:42:43.080 +C Avoid\sa\scrash\swhen\sthe\sfts5\ssnippet()\sfunction\s(or\ssimilar)\sis\sused\swith\sa\sspecial\squery\spattern,\slike\s'*id'\sor\s'*reads'. +D 2019-01-29T15:30:03.382 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -116,7 +116,7 @@ F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe1 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 F ext/fts5/fts5_index.c 091a8474bc65168f459c1b1e5d2ec6d84c271e2cad30b749b89a5216cd58e43b -F ext/fts5/fts5_main.c df4ba0a9d879de50f59662abc081209fe7a5eec87f1338e0462beeeba7830585 +F ext/fts5/fts5_main.c 2395658479bca37d0936d47e6194ef575e5e7235ded47fa93bd9d5bb8035b977 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test f5aa3e1031cba4ef216621b9dfe923a048d9a3bc24bb147fa51748e311c3163b +F ext/fts5/test/fts5corrupt3.test 51649ad221a65c0c7cc04956b9036797aa49ce2bfaefc862f831e2ea115827c6 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 119d1609fa415894fdd0aa19440ca1c658bd01910838a4cfadbe0e304b033bfd -R 469d0e8bbdba368f9ee90112edf3e941 +P 7ee3cd5b2cdf8db35f70400b3df58f7c421c78ae77c50f22b0ee22d5a3039429 +R 762add470f60e58cbae9e509712c1b56 U dan -Z 39e0197e394b50d59f3016d45cfe8006 +Z 6dc06dd140af5c638aa3516f8e0588ce diff --git a/manifest.uuid b/manifest.uuid index f5a1198c41..ee54704573 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ee3cd5b2cdf8db35f70400b3df58f7c421c78ae77c50f22b0ee22d5a3039429 \ No newline at end of file +9d58a15737f7379fed724749cfd5b4de5b44231870e99fc664683ad483c3e6ba \ No newline at end of file From e25646d64c7cb01f2d407f1727982ccfc6f1ff3a Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 29 Jan 2019 16:34:45 +0000 Subject: [PATCH 161/306] Avoid an integer overflow in the fts5 snippet() function triggered by a corrupt database record. FossilOrigin-Name: 7c862c4655841e1263cf548d01f5b4331685ab7d396494891cad0a5f50c63e16 --- ext/fts5/fts5_aux.c | 4 +- ext/fts5/test/fts5corrupt3.test | 157 +++++++++++++++++++++++++++++++- manifest | 14 +-- manifest.uuid | 2 +- 4 files changed, 167 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_aux.c b/ext/fts5/fts5_aux.c index fbdd98131a..f7b9d0a409 100644 --- a/ext/fts5/fts5_aux.c +++ b/ext/fts5/fts5_aux.c @@ -443,7 +443,9 @@ static void fts5SnippetFunction( int jj; rc = pApi->xInst(pFts, ii, &ip, &ic, &io); - if( ic!=i || rc!=SQLITE_OK ) continue; + if( ic!=i ) continue; + if( io>nDocsize ) rc = FTS5_CORRUPT; + if( rc!=SQLITE_OK ) continue; memset(aSeen, 0, nPhrase); rc = fts5SnippetScore(pApi, pFts, nDocsize, aSeen, i, io, nToken, &nScore, &iAdj diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 16468e8ffc..40e411b7ed 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -5818,7 +5818,7 @@ INSERT INTO t1(t1) VALUES('integrity-check'); do_catchsql_test 44.2 { SELECT snippet(t1, -1, '.', '..', '', 2 ) FROM t1('g h') ORDER BY rank; -} {0 {{.g.. .h..} {.g.. h} {.g.. .h..}}} +} {1 {database disk image is malformed}} #-------------------------------------------------------------------------- reset_db @@ -6268,6 +6268,161 @@ do_catchsql_test 46.1 { SELECT snippet(t1,'[','', '--',-1,10) FROM t1('*'); } {0 {{}}} +#-------------------------------------------------------------------------- +reset_db +do_test 47.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename 4b6fc659283f2735616c.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 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 7d 42 5f 63 6f 6e 66 69 67 74 32 table.B_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6f 74 74 31 5f 63 6f 6e 74 1_conteott1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 46 52 20 50 52 49 4d 41 52 59 INTEGFR PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 01 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 04 ..h.......i..... +| 4064: 04 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end 4b6fc659283f2735616c.db +}]} {} + +do_catchsql_test 47.1 { + SELECT snippet(t1, -1, '.', '..', '[', 50), + highlight(t1, 2, '[', ']') FROM t1('g h') + WHERE rank MATCH 'bm25(1.0, 1.0)' ORDER BY rank; +} {1 {database disk image is malformed}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 34feea8ec0..2bfc163adf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sa\scrash\swhen\sthe\sfts5\ssnippet()\sfunction\s(or\ssimilar)\sis\sused\swith\sa\sspecial\squery\spattern,\slike\s'*id'\sor\s'*reads'. -D 2019-01-29T15:30:03.382 +C Avoid\san\sinteger\soverflow\sin\sthe\sfts5\ssnippet()\sfunction\striggered\sby\sa\scorrupt\sdatabase\srecord. +D 2019-01-29T16:34:45.443 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -110,7 +110,7 @@ F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a0 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h fed314270c1a61de3a0e373b11c2f8228b1c76ce59447dd96d0b6fae7d66399b F ext/fts5/fts5Int.h 0b002fc71ea705d2c4ec66a63ecd38a2c11127e5b52239b5d71d1dd28309fc19 -F ext/fts5/fts5_aux.c 8284d25ca8a620337fa550628d740b0e5b9bc5c17bddad6051f02079441b946a +F ext/fts5/fts5_aux.c afe8c2394cf6de2a48f278442f4f4342365bf99a5983709ef8e6955c2cf4daf9 F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306fb9727046 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 51649ad221a65c0c7cc04956b9036797aa49ce2bfaefc862f831e2ea115827c6 +F ext/fts5/test/fts5corrupt3.test 62e5b908e032e0006ca3e8af85772e7d077615f3f395651afd6f8a4bd066731c F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 7ee3cd5b2cdf8db35f70400b3df58f7c421c78ae77c50f22b0ee22d5a3039429 -R 762add470f60e58cbae9e509712c1b56 +P 9d58a15737f7379fed724749cfd5b4de5b44231870e99fc664683ad483c3e6ba +R f9b47c0d05c57f00332b53dd657e7eed U dan -Z 6dc06dd140af5c638aa3516f8e0588ce +Z bb520f4b6056204d5dc48f97f21ffc56 diff --git a/manifest.uuid b/manifest.uuid index ee54704573..dc1bf6229c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9d58a15737f7379fed724749cfd5b4de5b44231870e99fc664683ad483c3e6ba \ No newline at end of file +7c862c4655841e1263cf548d01f5b4331685ab7d396494891cad0a5f50c63e16 \ No newline at end of file From a046643820b0401625b7c0ba5b2d1aa482f3fccd Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Jan 2019 16:41:13 +0000 Subject: [PATCH 162/306] More robust handling of corrupt database file in the rebalance operation of the btree logic. FossilOrigin-Name: 97704cb7d29fa7cc4ea9a6761a7844c1946d637ea2b22d287fc787ae0f63c407 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 14 +++++++++++--- test/fuzzdata8.db | Bin 820224 -> 825344 bytes 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 2bfc163adf..1665c3cd75 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\san\sinteger\soverflow\sin\sthe\sfts5\ssnippet()\sfunction\striggered\sby\sa\scorrupt\sdatabase\srecord. -D 2019-01-29T16:34:45.443 +C More\srobust\shandling\sof\scorrupt\sdatabase\sfile\sin\sthe\srebalance\soperation\sof\nthe\sbtree\slogic. +D 2019-01-29T16:41:13.847 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 3378f2f410af2db1c4603fb085d71139811a7c86f8de8511da3acbae984c1cf4 +F src/btree.c af023d6caa0957c707719a1b609e80c81bf6a3ee1729921e4ae2444d66c3ee1f F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 946a59b0b322b560fdcb22707ecb1e4dfaca2f5ac5115315c4b29c9d912a54c2 +F test/fuzzdata8.db c1a6960cf891c6f4a85ea07beff8927c1c8934fc662974b4b1b2e6c6d8b66b7c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 9d58a15737f7379fed724749cfd5b4de5b44231870e99fc664683ad483c3e6ba -R f9b47c0d05c57f00332b53dd657e7eed -U dan -Z bb520f4b6056204d5dc48f97f21ffc56 +P 7c862c4655841e1263cf548d01f5b4331685ab7d396494891cad0a5f50c63e16 +R 96aafeb8260648211b6bea0fb008afe8 +U drh +Z bef176324bb0771b0a0008f0c29c6e8d diff --git a/manifest.uuid b/manifest.uuid index dc1bf6229c..401d38d899 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7c862c4655841e1263cf548d01f5b4331685ab7d396494891cad0a5f50c63e16 \ No newline at end of file +97704cb7d29fa7cc4ea9a6761a7844c1946d637ea2b22d287fc787ae0f63c407 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 244ed54f4e..cc087d6c80 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6814,7 +6814,7 @@ static int rebuildPage( const int usableSize = pPg->pBt->usableSize; u8 * const pEnd = &aData[usableSize]; int i = iFirst; /* Which cell to copy from pCArray*/ - int j; /* Start of cell content area */ + u32 j; /* Start of cell content area */ int iEnd = i+nCell; /* Loop terminator */ u8 *pCellptr = pPg->aCellIdx; u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); @@ -6824,6 +6824,7 @@ static int rebuildPage( assert( iusableSize) ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(knCell cells starting with ** pCArray->apCell[iOld]. After balancing, this page should hold nNew cells ** starting at apCell[iNew]. @@ -7037,13 +7038,17 @@ static int editPage( #endif /* Remove cells from the start and end of the page */ + assert( nCell>=0 ); if( iOldnCell ) return SQLITE_CORRUPT_BKPT; memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); nCell -= nShift; } if( iNewEnd < iOldEnd ){ - nCell -= pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + int nTail = pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + assert( nCell>=nTail ); + nCell -= nTail; } pData = &aData[get2byteNotZero(&aData[hdr+5])]; @@ -7053,6 +7058,7 @@ static int editPage( if( iNew=0 ); pCellptr = pPg->aCellIdx; memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); if( pageInsertArray( @@ -7067,6 +7073,7 @@ static int editPage( int iCell = (iOld + pPg->aiOvfl[i]) - iNew; if( iCell>=0 && iCellaCellIdx[iCell * 2]; + assert( nCell>=iCell ); memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); nCell++; if( pageInsertArray( @@ -7077,6 +7084,7 @@ static int editPage( } /* Append cells to the end of the page */ + assert( nCell>=0 ); pCellptr = &pPg->aCellIdx[nCell*2]; if( pageInsertArray( pPg, pBegin, &pData, pCellptr, diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 4b930b8856276855dbf733b49d9adc1c97f6ceb9..c5aabeebe35bdc76495ab33686638918df496021 100644 GIT binary patch delta 3698 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 Date: Tue, 29 Jan 2019 16:47:46 +0000 Subject: [PATCH 163/306] Load all the latest dbsqlfuzz finds into test/fuzzdata8.db. FossilOrigin-Name: e744d2dd93a78235e6c1d938b08232183b5ce7e355d1b7daf2199e585b03c106 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 825344 -> 868352 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 1665c3cd75..6cf323a3c2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\srobust\shandling\sof\scorrupt\sdatabase\sfile\sin\sthe\srebalance\soperation\sof\nthe\sbtree\slogic. -D 2019-01-29T16:41:13.847 +C Load\sall\sthe\slatest\sdbsqlfuzz\sfinds\sinto\stest/fuzzdata8.db. +D 2019-01-29T16:47:46.602 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db c1a6960cf891c6f4a85ea07beff8927c1c8934fc662974b4b1b2e6c6d8b66b7c +F test/fuzzdata8.db df6e7a32697f3e7be801fa90e02fe6ae9c1dbe7ce8a8a626af0febab35a54e96 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 7c862c4655841e1263cf548d01f5b4331685ab7d396494891cad0a5f50c63e16 -R 96aafeb8260648211b6bea0fb008afe8 +P 97704cb7d29fa7cc4ea9a6761a7844c1946d637ea2b22d287fc787ae0f63c407 +R f1ecfe922597ece998a55cb139628ace U drh -Z bef176324bb0771b0a0008f0c29c6e8d +Z fbaf7cd6903e02bf2f5eaadec114bfa9 diff --git a/manifest.uuid b/manifest.uuid index 401d38d899..fdece8c366 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -97704cb7d29fa7cc4ea9a6761a7844c1946d637ea2b22d287fc787ae0f63c407 \ No newline at end of file +e744d2dd93a78235e6c1d938b08232183b5ce7e355d1b7daf2199e585b03c106 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index c5aabeebe35bdc76495ab33686638918df496021..3579b464f16680d466fd2ddc849743202b6d9536 100644 GIT binary patch delta 12037 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 F{|}?SoNfRB delta 9730 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 Jf1K}Y{vS>j)*%1@ From 3f4f6823ac81ca47056367153b851ae96888708b Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Jan 2019 16:54:31 +0000 Subject: [PATCH 164/306] Fix harmless compiler warnings. FossilOrigin-Name: 9a93c68a7673bda2e6c308d3b2798d0fb12fde399996cae24b1f0d5864adf355 --- ext/fts3/fts3_aux.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ext/fts3/fts3_aux.c b/ext/fts3/fts3_aux.c index 299ff5c84b..08edc00f40 100644 --- a/ext/fts3/fts3_aux.c +++ b/ext/fts3/fts3_aux.c @@ -417,14 +417,14 @@ static int fts3auxFilterMethod( if( zStr ){ pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr); if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM; - pCsr->filter.nTerm = strlen(pCsr->filter.zTerm); + pCsr->filter.nTerm = (int)strlen(pCsr->filter.zTerm); } } if( iLe>=0 ){ pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); if( pCsr->zStop==0 ) return SQLITE_NOMEM; - pCsr->nStop = strlen(pCsr->zStop); + pCsr->nStop = (int)strlen(pCsr->zStop); } if( iLangid>=0 ){ diff --git a/manifest b/manifest index 6cf323a3c2..6932aa2440 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Load\sall\sthe\slatest\sdbsqlfuzz\sfinds\sinto\stest/fuzzdata8.db. -D 2019-01-29T16:47:46.602 +C Fix\sharmless\scompiler\swarnings. +D 2019-01-29T16:54:31.854 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -83,7 +83,7 @@ F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c 5da1329ccf66b6d597dfb16b1f81aa204133c1ec96117d82a59c20126f483b17 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c -F ext/fts3/fts3_aux.c c7512135fc7df424ceed21e2b47e1fb036ca115aace3852d26da3e29960002f3 +F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c af023d6caa0957c707719a1b609e80c81bf6a3ee1729921e4ae2444d66c3ee1f +F src/btree.c 79464668601b6d278954cf822ef484893e1434f85addda2bd9a323796b91b328 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc @@ -1804,7 +1804,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 97704cb7d29fa7cc4ea9a6761a7844c1946d637ea2b22d287fc787ae0f63c407 -R f1ecfe922597ece998a55cb139628ace +P e744d2dd93a78235e6c1d938b08232183b5ce7e355d1b7daf2199e585b03c106 +R a33d91a5dfd0f03de4e1216923839b6d U drh -Z fbaf7cd6903e02bf2f5eaadec114bfa9 +Z 28211b0b57c9c2017af9da12db90b998 diff --git a/manifest.uuid b/manifest.uuid index fdece8c366..353cc10688 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e744d2dd93a78235e6c1d938b08232183b5ce7e355d1b7daf2199e585b03c106 \ No newline at end of file +9a93c68a7673bda2e6c308d3b2798d0fb12fde399996cae24b1f0d5864adf355 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index cc087d6c80..5c455f7d22 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6824,7 +6824,7 @@ static int rebuildPage( assert( iusableSize) ){ j = 0; } + if( NEVER(j>(u32)usableSize) ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(k Date: Wed, 30 Jan 2019 12:15:27 +0000 Subject: [PATCH 165/306] Fix another buffer overread in fts5 that may occur when accessing a corrupt database. FossilOrigin-Name: 760d14374d40bcd9ce3a89771c18dc236c9728553c4747c9b7452ee7b24f4140 --- ext/fts5/fts5_index.c | 3 +- ext/fts5/test/fts5corrupt3.test | 218 ++++++++++++++++++++++++++++++++ manifest | 16 +-- manifest.uuid | 2 +- 4 files changed, 229 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index e1bb8d49a6..32732b9df6 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3104,7 +3104,8 @@ static void fts5SegiterPoslist( Fts5Colset *pColset, Fts5Buffer *pBuf ){ - if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos) ){ + if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos+FTS5_DATA_ZERO_PADDING) ){ + memset(&pBuf->p[pBuf->n+pSeg->nPos], 0, FTS5_DATA_ZERO_PADDING); if( pColset==0 ){ fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback); }else{ diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 40e411b7ed..bd63ed4c38 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -6423,6 +6423,224 @@ do_catchsql_test 47.1 { WHERE rank MATCH 'bm25(1.0, 1.0)' ORDER BY rank; } {1 {database disk image is malformed}} +#-------------------------------------------------------------------------- +reset_db +do_test 48.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-44a8305b4bd86f.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 62 72 79 03 06 ........binbry.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 01 03 16 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 04 71 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ..q.........comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 03 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 13 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0b 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4f 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 OARY.#..%..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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 46 45 58 4e 4f 43 41 53 45 17 LE RTRFEXNOCASE. +| 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 57 42 49 NABLE GEOPOLYWBI +| 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 42 41 53 45 E GEOPOLYXNOBASE +| 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 66 54 41 42 58 52 54 52 49 4d 11 06 TAT fTABXRTRIM.. +| 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 62 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XbTRIM'...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 52 02 49 4e 41 52 59 27 20160609R.INARY' +| 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 5d 69 71 a5 uild....opti]iq. +| end crash-44a8305b4bd86f.db +}]} {} + +do_catchsql_test 48.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 6932aa2440..478a040a90 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2019-01-29T16:54:31.854 +C Fix\sanother\sbuffer\soverread\sin\sfts5\sthat\smay\soccur\swhen\saccessing\sa\scorrupt\sdatabase. +D 2019-01-30T12:15:27.850 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 091a8474bc65168f459c1b1e5d2ec6d84c271e2cad30b749b89a5216cd58e43b +F ext/fts5/fts5_index.c 97d84ca8ed6f347efea4bd4f831d6c5d3b7efeb7cb41cc281ee3886dc61eed0d F ext/fts5/fts5_main.c 2395658479bca37d0936d47e6194ef575e5e7235ded47fa93bd9d5bb8035b977 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 62e5b908e032e0006ca3e8af85772e7d077615f3f395651afd6f8a4bd066731c +F ext/fts5/test/fts5corrupt3.test e2f48a9681fd7639d12d46daef3975456f1531a8d78e190fec53a67f97da6d60 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 e744d2dd93a78235e6c1d938b08232183b5ce7e355d1b7daf2199e585b03c106 -R a33d91a5dfd0f03de4e1216923839b6d -U drh -Z 28211b0b57c9c2017af9da12db90b998 +P 9a93c68a7673bda2e6c308d3b2798d0fb12fde399996cae24b1f0d5864adf355 +R 8ebb52c645af2a7f4c7c58d6e1f0cddb +U dan +Z b3b8142805e077c0a8e201eaf8a86ffa diff --git a/manifest.uuid b/manifest.uuid index 353cc10688..2a2b9dc5d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a93c68a7673bda2e6c308d3b2798d0fb12fde399996cae24b1f0d5864adf355 \ No newline at end of file +760d14374d40bcd9ce3a89771c18dc236c9728553c4747c9b7452ee7b24f4140 \ No newline at end of file From 5a9c6bcc158633596ea7c7d9778c4e7671fd183b Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 30 Jan 2019 14:01:43 +0000 Subject: [PATCH 166/306] Enhancements to the index_usage utility program. FossilOrigin-Name: 19c739b4a8a43d894e37a99fa34838f3e3fa1fe0d019aefbc33f1d38d76af1a4 --- Makefile.in | 2 +- main.mk | 2 +- manifest | 18 +++++++++--------- manifest.uuid | 2 +- tool/index_usage.c | 4 +++- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Makefile.in b/Makefile.in index 3904e45c0e..65530e33c5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1335,7 +1335,7 @@ showshm$(TEXE): $(TOP)/tool/showshm.c $(LTLINK) -o $@ $(TOP)/tool/showshm.c index_usage$(TEXE): $(TOP)/tool/index_usage.c sqlite3.lo - $(LTLINK) -o $@ $(TOP)/tool/index_usage.c sqlite3.lo $(TLIBS) + $(LTLINK) $(SHELL_OPT) -o $@ $(TOP)/tool/index_usage.c sqlite3.lo $(TLIBS) changeset$(TEXE): $(TOP)/ext/session/changeset.c sqlite3.lo $(LTLINK) -o $@ $(TOP)/ext/session/changeset.c sqlite3.lo $(TLIBS) diff --git a/main.mk b/main.mk index d18863b11e..c4e8b78e91 100644 --- a/main.mk +++ b/main.mk @@ -1021,7 +1021,7 @@ showshm$(EXE): $(TOP)/tool/showshm.c $(TCC) -o showshm$(EXE) $(TOP)/tool/showshm.c index_usage$(EXE): $(TOP)/tool/index_usage.c sqlite3.o - $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_DEPRECATED -o index_usage$(EXE) \ + $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_DEPRECATED $(SHELL_OPTS) -o index_usage$(EXE) \ $(TOP)/tool/index_usage.c sqlite3.o $(THREADLIB) changeset$(EXE): $(TOP)/ext/session/changeset.c sqlite3.o diff --git a/manifest b/manifest index 478a040a90..22c8409497 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -C Fix\sanother\sbuffer\soverread\sin\sfts5\sthat\smay\soccur\swhen\saccessing\sa\scorrupt\sdatabase. -D 2019-01-30T12:15:27.850 +C Enhancements\sto\sthe\sindex_usage\sutility\sprogram. +D 2019-01-30T14:01:43.193 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in 9947eae873c07ae894d4c8633b76c0a0daca7b9fd54401096a77d1a6c7b74359 +F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee @@ -436,7 +436,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk e28b19556f75ba6e841fc9c883d6a3c16edeae2d16d4edf32bf3c150725fc4d8 +F main.mk 3930eb2fcbebe49ab7408f6fef3baa8c4bf3c84540f9f29dfe849bf561ff6e51 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1721,7 +1721,7 @@ F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce -F tool/index_usage.c 8fd515b97522ae4b1aa6ca9847439f005d4cbaf6eb0eb416b694dba77c0263f0 +F tool/index_usage.c 28194fb8422b16adada6723d7516e404d011ffd1a7fd43ae20253001e5ddd2dc F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/lemon.c 900a15b9efba9890d10e7959914db94c4ad5162912127f061c4328add122d6fb F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc @@ -1804,7 +1804,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 9a93c68a7673bda2e6c308d3b2798d0fb12fde399996cae24b1f0d5864adf355 -R 8ebb52c645af2a7f4c7c58d6e1f0cddb -U dan -Z b3b8142805e077c0a8e201eaf8a86ffa +P 760d14374d40bcd9ce3a89771c18dc236c9728553c4747c9b7452ee7b24f4140 +R f27c58459d19582c78b75fe1a98114b7 +U drh +Z eaaf90eb816c0def68c7e8f9deaf5b3d diff --git a/manifest.uuid b/manifest.uuid index 2a2b9dc5d6..f992e8a90a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -760d14374d40bcd9ce3a89771c18dc236c9728553c4747c9b7452ee7b24f4140 \ No newline at end of file +19c739b4a8a43d894e37a99fa34838f3e3fa1fe0d019aefbc33f1d38d76af1a4 \ No newline at end of file diff --git a/tool/index_usage.c b/tool/index_usage.c index a86202425e..9d97c73183 100644 --- a/tool/index_usage.c +++ b/tool/index_usage.c @@ -90,7 +90,9 @@ int main(int argc, char **argv){ argv[2], sqlite3_errmsg(db)); goto errorOut; } - rc = sqlite3_prepare_v2(db, "SELECT sql, rowid FROM log.sqllog", + rc = sqlite3_prepare_v2(db, + "SELECT sql, rowid FROM log.sqllog" + " WHERE upper(substr(sql,1,5)) NOT IN ('BEGIN','COMMI','ROLLB','PRAGM')", -1, &pStmt, 0); if( rc ){ printf("Cannot read the SQLLOG table in the LOG database \"%s\" - %s\n", From a8614259c17898e60a8f8da73d14bc404c0ebded Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 30 Jan 2019 15:47:38 +0000 Subject: [PATCH 167/306] Add the --progress, --using, and -q options to the index_usage utility program. FossilOrigin-Name: a5e6be7cbc5d931308ddcc073c9cd6275c9711cae055d72a7c4aa71c1d15914c --- manifest | 12 +++---- manifest.uuid | 2 +- tool/index_usage.c | 87 ++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 84 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 22c8409497..266f851814 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\sthe\sindex_usage\sutility\sprogram. -D 2019-01-30T14:01:43.193 +C Add\sthe\s--progress,\s--using,\sand\s-q\soptions\sto\sthe\sindex_usage\sutility\sprogram. +D 2019-01-30T15:47:38.444 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -1721,7 +1721,7 @@ F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce -F tool/index_usage.c 28194fb8422b16adada6723d7516e404d011ffd1a7fd43ae20253001e5ddd2dc +F tool/index_usage.c 9827f0f5252a6c0468e1addbd098ce9bbf909442d820d70b3ae91aa317e62a66 F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/lemon.c 900a15b9efba9890d10e7959914db94c4ad5162912127f061c4328add122d6fb F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc @@ -1804,7 +1804,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 760d14374d40bcd9ce3a89771c18dc236c9728553c4747c9b7452ee7b24f4140 -R f27c58459d19582c78b75fe1a98114b7 +P 19c739b4a8a43d894e37a99fa34838f3e3fa1fe0d019aefbc33f1d38d76af1a4 +R f8f216729fd1c799fb3786b449861140 U drh -Z eaaf90eb816c0def68c7e8f9deaf5b3d +Z 016d67606384203f33b230415c37c583 diff --git a/manifest.uuid b/manifest.uuid index f992e8a90a..1b5403c8f1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -19c739b4a8a43d894e37a99fa34838f3e3fa1fe0d019aefbc33f1d38d76af1a4 \ No newline at end of file +a5e6be7cbc5d931308ddcc073c9cd6275c9711cae055d72a7c4aa71c1d15914c \ No newline at end of file diff --git a/tool/index_usage.c b/tool/index_usage.c index 9d97c73183..abe9ae42d7 100644 --- a/tool/index_usage.c +++ b/tool/index_usage.c @@ -21,7 +21,7 @@ #include static void usage(const char *argv0){ - printf("Usage: %s DATABASE LOG\n\n", argv0); + printf("Usage: %s [OPTIONS] DATABASE LOG\n\n", argv0); printf( "DATABASE is an SQLite database against which various statements\n" "have been run. The SQL text is stored in LOG. LOG is an SQLite\n" @@ -36,6 +36,12 @@ static void usage(const char *argv0){ "DATABASE only needs to contain the schema used by the statements in\n" "LOG. The content can be removed from DATABASE.\n" ); + printf( + "\nOPTIONS:\n\n" + " --progress N Show a progress message after every N input rows\n" + " -q Omit error message when parsing log entries\n" + " --using NAME Print SQL statements that use index NAME\n" + ); printf("\nAnalysis will be done by SQLite version %s dated %.20s\n" "checkin number %.40s. Different versions\n" "of SQLite might use different indexes.\n", @@ -49,6 +55,48 @@ int main(int argc, char **argv){ char *zSql; int nErr = 0; int rc; + int bQuiet = 0; + int i, j; + const char *zUsing = 0; + sqlite3_stmt *pIncrCnt = 0; + int nRow = 0; + int iProgress = 0; + + for(i=j=1; i0 && (nRow%iProgress)==0 ){ + printf("%d...\n", nRow); + fflush(stdout); + } while( sqlite3_step(pS2)==SQLITE_ROW ){ const char *zExplain = (const char*)sqlite3_column_text(pS2,3); const char *z1, *z2; @@ -123,12 +188,13 @@ int main(int argc, char **argv){ z1 += 13; for(z2=z1+1; z2[1] && z2[1]!='('; z2++){} n = z2 - z1; - zSql = sqlite3_mprintf( - "UPDATE temp.idxu SET cnt=cnt+1 WHERE idx='%.*q'", n, z1 - ); - /* printf("sql: %s\n", zSql); */ - sqlite3_exec(db, zSql, 0, 0, 0); - sqlite3_free(zSql); + if( zUsing && sqlite3_strnicmp(zUsing, z1, n)==0 ){ + printf("Using %s:\n%s\n", zUsing, zLog); + fflush(stdout); + } + sqlite3_bind_text(pIncrCnt,1,z1,n,SQLITE_STATIC); + sqlite3_step(pIncrCnt); + sqlite3_reset(pIncrCnt); } } sqlite3_finalize(pS2); @@ -160,6 +226,7 @@ int main(int argc, char **argv){ pStmt = 0; errorOut: + sqlite3_finalize(pIncrCnt); sqlite3_finalize(pStmt); sqlite3_close(db); return nErr; From ba7bd0200231c41f7683f123da019180ac371930 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 30 Jan 2019 16:58:04 +0000 Subject: [PATCH 168/306] Fix an off-by-one error when parsing the names of indexes that do not have arguments in the index_usage utility. FossilOrigin-Name: dc794d8f518ed46536928a77a560d46e4f9365c30a00cd108f000d8556a66c00 --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/index_usage.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 266f851814..f45f19c8df 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--progress,\s--using,\sand\s-q\soptions\sto\sthe\sindex_usage\sutility\sprogram. -D 2019-01-30T15:47:38.444 +C Fix\san\soff-by-one\serror\swhen\sparsing\sthe\snames\sof\sindexes\sthat\sdo\snot\shave\narguments\sin\sthe\sindex_usage\sutility. +D 2019-01-30T16:58:04.039 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -1721,7 +1721,7 @@ F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce -F tool/index_usage.c 9827f0f5252a6c0468e1addbd098ce9bbf909442d820d70b3ae91aa317e62a66 +F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/lemon.c 900a15b9efba9890d10e7959914db94c4ad5162912127f061c4328add122d6fb F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc @@ -1804,7 +1804,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 19c739b4a8a43d894e37a99fa34838f3e3fa1fe0d019aefbc33f1d38d76af1a4 -R f8f216729fd1c799fb3786b449861140 +P a5e6be7cbc5d931308ddcc073c9cd6275c9711cae055d72a7c4aa71c1d15914c +R 73afc1800778e7aa30637586771889d6 U drh -Z 016d67606384203f33b230415c37c583 +Z dd53044ff743ff5036bf054605b85b6d diff --git a/manifest.uuid b/manifest.uuid index 1b5403c8f1..5c55826a65 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a5e6be7cbc5d931308ddcc073c9cd6275c9711cae055d72a7c4aa71c1d15914c \ No newline at end of file +dc794d8f518ed46536928a77a560d46e4f9365c30a00cd108f000d8556a66c00 \ No newline at end of file diff --git a/tool/index_usage.c b/tool/index_usage.c index abe9ae42d7..451fa65c34 100644 --- a/tool/index_usage.c +++ b/tool/index_usage.c @@ -186,7 +186,7 @@ int main(int argc, char **argv){ z1 = strstr(zExplain, " USING INDEX "); if( z1==0 ) continue; z1 += 13; - for(z2=z1+1; z2[1] && z2[1]!='('; z2++){} + for(z2=z1+1; z2[0] && z2[1]!='('; z2++){} n = z2 - z1; if( zUsing && sqlite3_strnicmp(zUsing, z1, n)==0 ){ printf("Using %s:\n%s\n", zUsing, zLog); From 8d40673c8458f9b26a9cb72b8ed9f5a10fe26e6f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 30 Jan 2019 18:33:33 +0000 Subject: [PATCH 169/306] Detect if two indexes of the same table share a common rootpage while parsing the schema, and throw an error immediately. FossilOrigin-Name: f21c6f1343edc4ba68f9f8e68caac34da0d1c651526ecaf61c0e2d66593a555e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 5 +++++ src/prepare.c | 14 ++++++++++++++ src/sqliteInt.h | 1 + 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f45f19c8df..bedd570c3c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\soff-by-one\serror\swhen\sparsing\sthe\snames\sof\sindexes\sthat\sdo\snot\shave\narguments\sin\sthe\sindex_usage\sutility. -D 2019-01-30T16:58:04.039 +C Detect\sif\stwo\sindexes\sof\sthe\ssame\stable\sshare\sa\scommon\srootpage\swhile\nparsing\sthe\sschema,\sand\sthrow\san\serror\simmediately. +D 2019-01-30T18:33:33.789 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -458,7 +458,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 79464668601b6d278954cf822ef484893e1434f85addda2bd9a323796b91b328 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 -F src/build.c f07c0b154c23737d1699ee63bba31c8ca8b323e2446b957bc6bfec81a62295fc +F src/build.c ddcce07ea58f569da879e6fb3f4366dd66125edb6c2a41249a39fc72b01d456e F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -509,7 +509,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c 20811b404b6d302a1bedd4b8af8aab2794c5e87ba1f5cb6b42dbc3266ad9c603 F src/pragma.h 14eed1061a0b52443349eb733ae8f107144f9d0d3ce39e8e9490b5f6691c0e09 -F src/prepare.c 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922 +F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 @@ -519,7 +519,7 @@ F src/shell.c.in 705a00be4fa43303b6b18df2241f5397cefd8d9f076bb035ad01b42635c7a1d F src/sqlite.h.in 8ded85ecaa768afd196b24201382ccdf00e5bab6861e30549cd750bebd273a0b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h a2330a569d8c5461aa35fe3ad29a1885e13ddfd07088a3e833131490c3a99ca9 +F src/sqliteInt.h 5e0d8205345eef5ac1769e1129b0fb7bbd716eed0b021bc725326514bfcc3d57 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1804,7 +1804,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 a5e6be7cbc5d931308ddcc073c9cd6275c9711cae055d72a7c4aa71c1d15914c -R 73afc1800778e7aa30637586771889d6 +P dc794d8f518ed46536928a77a560d46e4f9365c30a00cd108f000d8556a66c00 +R b3e70bc8111edfc4ec21382bc1ad417c U drh -Z dd53044ff743ff5036bf054605b85b6d +Z 3814e0d4583bc74648e2fbf40023f27b diff --git a/manifest.uuid b/manifest.uuid index 5c55826a65..a1616dca1a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dc794d8f518ed46536928a77a560d46e4f9365c30a00cd108f000d8556a66c00 \ No newline at end of file +f21c6f1343edc4ba68f9f8e68caac34da0d1c651526ecaf61c0e2d66593a555e \ No newline at end of file diff --git a/src/build.c b/src/build.c index 64585f85f9..dd7e2c631b 100644 --- a/src/build.c +++ b/src/build.c @@ -3497,6 +3497,11 @@ void sqlite3CreateIndex( db->mDbFlags |= DBFLAG_SchemaChange; if( pTblName!=0 ){ pIndex->tnum = db->init.newTnum; + if( sqlite3IndexHasDuplicateRootPage(pIndex) ){ + sqlite3ErrorMsg(pParse, "invalid root page"); + pParse->rc = SQLITE_CORRUPT_BKPT; + goto exit_create_index; + } } } diff --git a/src/prepare.c b/src/prepare.c index cfe4a7e33f..3f1a79b14b 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -44,6 +44,19 @@ static void corruptSchema( } } +/* +** Check to see if any sibling index (another index on the same table) +** of pIndex has the same root page number, and if it does, return true. +** This would indicate a corrupt schema. +*/ +int sqlite3IndexHasDuplicateRootPage(Index *pIndex){ + Index *p; + for(p=pIndex->pTable->pIndex; p; p=p->pNext){ + if( p->tnum==pIndex->tnum && p!=pIndex ) return 1; + } + return 0; +} + /* ** This is the callback routine for the code that initializes the ** database. See sqlite3Init() below for additional information. @@ -122,6 +135,7 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ if( pIndex==0 || sqlite3GetInt32(argv[1],&pIndex->tnum)==0 || pIndex->tnum<2 + || sqlite3IndexHasDuplicateRootPage(pIndex) ){ corruptSchema(pData, argv[0], pIndex?"invalid rootpage":"orphan index"); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 00991a969c..c13508bb72 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3844,6 +3844,7 @@ void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); void sqlite3ExprListDelete(sqlite3*, ExprList*); u32 sqlite3ExprListFlags(const ExprList*); +int sqlite3IndexHasDuplicateRootPage(Index*); int sqlite3Init(sqlite3*, char**); int sqlite3InitCallback(void*, int, char**, char**); int sqlite3InitOne(sqlite3*, int, char**, u32); From 56b99ebc3245ce03f4242849284656c9d32aba05 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 30 Jan 2019 18:47:35 +0000 Subject: [PATCH 170/306] Add test case for the previous commit. FossilOrigin-Name: 197edb235b785c68fda7be788efbc61137d9452886599415a927b959ade93c65 --- manifest | 14 ++++++------- manifest.uuid | 2 +- test/corruptL.test | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index bedd570c3c..ca2fb44545 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Detect\sif\stwo\sindexes\sof\sthe\ssame\stable\sshare\sa\scommon\srootpage\swhile\nparsing\sthe\sschema,\sand\sthrow\san\serror\simmediately. -D 2019-01-30T18:33:33.789 +C Add\stest\scase\sfor\sthe\sprevious\scommit. +D 2019-01-30T18:47:35.202 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -757,7 +757,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 -F test/corruptL.test 4c0674edd28dfcf027f57b61944dd6f1ba61c6e98f4f6d72f0adafaef238b593 +F test/corruptL.test a4819e673097d4ad889758207c42e4238fd7c2536d18919cd1f602aec1c3fb72 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf @@ -1804,7 +1804,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 dc794d8f518ed46536928a77a560d46e4f9365c30a00cd108f000d8556a66c00 -R b3e70bc8111edfc4ec21382bc1ad417c -U drh -Z 3814e0d4583bc74648e2fbf40023f27b +P f21c6f1343edc4ba68f9f8e68caac34da0d1c651526ecaf61c0e2d66593a555e +R 88d559eb30b55e443784d14bbac03dff +U dan +Z bff0afaec4775e81b6cc26a57aad1328 diff --git a/manifest.uuid b/manifest.uuid index a1616dca1a..ee35b65701 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f21c6f1343edc4ba68f9f8e68caac34da0d1c651526ecaf61c0e2d66593a555e \ No newline at end of file +197edb235b785c68fda7be788efbc61137d9452886599415a927b959ade93c65 \ No newline at end of file diff --git a/test/corruptL.test b/test/corruptL.test index 638365d6e4..8d84ec8479 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -578,6 +578,55 @@ do_catchsql_test 5.3 { INSERT INTO t1(b) VALUES(zeroblob(40000)); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 6.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 20480 pagesize 4096 filename crash-d260f001fa015c.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 05 .....@ ........ +| 32: 00 00 00 00 00 ff ff f0 00 00 00 02 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 64 00 00 00 01 00 00 00 00 .......d........ +| 96: 00 00 00 00 0d 0f f8 00 04 0e ce 00 0f 4c 0f d3 .............L.. +| 112: 0e fa 0e ce 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3776: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2a 04 ..............*. +| 3792: 06 17 13 11 01 3f 69 6e 64 65 78 74 31 62 74 31 .....?indext1bt1 +| 3808: 05 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 .CREATE INDEX t1 +| 3824: 62 20 4f 4e 20 74 31 28 62 29 50 03 06 17 2b 2b b ON t1(b)P...++ +| 3840: 01 59 74 61 62 6c 65 73 71 6c 69 74 65 5f 73 65 .Ytablesqlite_se +| 3856: 71 75 65 6e 63 65 73 71 6c 69 74 65 5f 73 65 71 quencesqlite_seq +| 3872: 75 65 6e 63 65 04 43 52 45 41 54 45 20 54 41 42 uence.CREATE TAB +| 3888: 4c 45 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e LE sqlite_sequen +| 3904: 63 65 28 6e 61 6d 65 2c 73 65 71 29 81 04 01 07 ce(name,seq).... +| 3920: 17 11 11 01 81 73 74 61 c2 6c 65 74 31 74 31 02 .....sta.let1t1. +| 3936: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 CREATE TABLE t1( +| 3952: 61 20 52 45 41 4c 20 4e 4f 54 20 4e 55 4c 4c 20 a REAL NOT NULL +| 3968: 44 45 46 41 55 4c 54 28 32 35 2b 33 32 29 2c 62 DEFAULT(25+32),b +| 3984: 20 46 4c 4f 41 54 2c 63 20 44 4f 55 42 4c 45 20 FLOAT,c DOUBLE +| 4000: 55 4e 49 51 55 45 2c 0a 64 20 43 4c 4f 42 2c 65 UNIQUE,.d CLOB,e +| 4016: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 4032: 20 4b 45 59 20 41 55 54 4f 49 4e 43 52 45 4d 45 KEY AUTOINCREME +| 4048: 4e 54 29 23 02 06 17 37 11 01 00 69 6e 64 65 78 NT)#...7...index +| 4064: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 sqlite_autoindex +| 4080: 5f 74 31 5f 31 74 31 05 00 00 00 08 00 00 00 00 _t1_1t1......... +| page 2 offset 4096 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| end crash-d260f001fa015c.db +}]} {} +do_catchsql_test 6.1 { + BEGIN; + INSERT INTO t1(b) VALUES(1); + INSERT INTO t1(b) VALUES(2); + COMMIT; +} {1 {malformed database schema (t1b) - invalid root page}} finish_test From da7a4c0f7a63ffe908c863e80bff84e5826346a9 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 30 Jan 2019 19:12:13 +0000 Subject: [PATCH 171/306] When parsing the schema, check for duplicate index root page numbers before adding the index to the schema hash table. FossilOrigin-Name: 6b360bc0b9ad18ccda9d58d43a8388d19999432bfdf294abcf5beb44ef990cb4 --- manifest | 14 +++---- manifest.uuid | 2 +- src/build.c | 16 ++++---- test/corruptL.test | 93 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index ca2fb44545..615a0d8823 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scase\sfor\sthe\sprevious\scommit. -D 2019-01-30T18:47:35.202 +C When\sparsing\sthe\sschema,\scheck\sfor\sduplicate\sindex\sroot\spage\snumbers\sbefore\sadding\sthe\sindex\sto\sthe\sschema\shash\stable. +D 2019-01-30T19:12:13.341 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -458,7 +458,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 79464668601b6d278954cf822ef484893e1434f85addda2bd9a323796b91b328 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 -F src/build.c ddcce07ea58f569da879e6fb3f4366dd66125edb6c2a41249a39fc72b01d456e +F src/build.c f2805f5da53aa10c52323f5a7d976aade405dd70e52166ae4e7f35708577893e F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -757,7 +757,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 -F test/corruptL.test a4819e673097d4ad889758207c42e4238fd7c2536d18919cd1f602aec1c3fb72 +F test/corruptL.test 82855aa907c3f899c123e8388f0450df8fccb5016539c7b5e64695772e7595bb F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf @@ -1804,7 +1804,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 f21c6f1343edc4ba68f9f8e68caac34da0d1c651526ecaf61c0e2d66593a555e -R 88d559eb30b55e443784d14bbac03dff +P 197edb235b785c68fda7be788efbc61137d9452886599415a927b959ade93c65 +R 614f1871a981a455ef4904657472e2dd U dan -Z bff0afaec4775e81b6cc26a57aad1328 +Z 10bfb2b527ca61a24c5f5b6dad4cafcc diff --git a/manifest.uuid b/manifest.uuid index ee35b65701..17085cfd03 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -197edb235b785c68fda7be788efbc61137d9452886599415a927b959ade93c65 \ No newline at end of file +6b360bc0b9ad18ccda9d58d43a8388d19999432bfdf294abcf5beb44ef990cb4 \ No newline at end of file diff --git a/src/build.c b/src/build.c index dd7e2c631b..ca8db87dd5 100644 --- a/src/build.c +++ b/src/build.c @@ -3487,14 +3487,6 @@ void sqlite3CreateIndex( Index *p; assert( !IN_SPECIAL_PARSE ); assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); - p = sqlite3HashInsert(&pIndex->pSchema->idxHash, - pIndex->zName, pIndex); - if( p ){ - assert( p==pIndex ); /* Malloc must have failed */ - sqlite3OomFault(db); - goto exit_create_index; - } - db->mDbFlags |= DBFLAG_SchemaChange; if( pTblName!=0 ){ pIndex->tnum = db->init.newTnum; if( sqlite3IndexHasDuplicateRootPage(pIndex) ){ @@ -3503,6 +3495,14 @@ void sqlite3CreateIndex( goto exit_create_index; } } + p = sqlite3HashInsert(&pIndex->pSchema->idxHash, + pIndex->zName, pIndex); + if( p ){ + assert( p==pIndex ); /* Malloc must have failed */ + sqlite3OomFault(db); + goto exit_create_index; + } + db->mDbFlags |= DBFLAG_SchemaChange; } /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the diff --git a/test/corruptL.test b/test/corruptL.test index 8d84ec8479..26ea3203f1 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -629,4 +629,97 @@ do_catchsql_test 6.1 { COMMIT; } {1 {malformed database schema (t1b) - invalid root page}} +#------------------------------------------------------------------------- +reset_db +do_test 7.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 20480 pagesize 4096 filename crash-8391315d75edff.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 05 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 05 0e 55 00 0f 74 0f 3c ..........U..t.< +| 112: 0e f9 0e d1 0e 55 00 00 00 00 00 00 00 00 00 00 .....U.......... +| 3664: 00 00 00 00 00 7a 05 07 15 11 11 08 81 63 76 69 .....z.......cvi +| 3680: 65 77 76 31 76 31 43 52 45 41 54 45 20 56 49 45 ewv1v1CREATE VIE +| 3696: 57 20 76 31 28 78 2c 69 29 20 41 53 0a 53 45 4c W v1(x,i) AS.SEL +| 3712: 45 43 54 20 74 31 2e 62 2c 74 32 2e 62 20 46 52 ECT t1.b,t2.b FR +| 3728: 4f 4d 20 74 31 2c 74 32 20 57 48 45 52 45 20 74 OM t1,t2 WHERE t +| 3744: 31 2e 61 3d 74 32 2e 61 20 47 52 4f 55 50 20 42 1.a=t2.a GROUP B +| 3760: 59 20 31 20 48 41 56 49 4e 47 20 74 32 2e 63 20 Y 1 HAVING t2.c +| 3776: 4e 4f 54 20 4e 55 4c 4c 0a 4c 49 4d 49 54 20 31 NOT NULL.LIMIT 1 +| 3792: 30 26 04 06 17 11 11 01 39 74 61 62 6c 65 74 32 0&......9tablet2 +| 3808: 74 32 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 t2.CREATE TABLE +| 3824: 74 32 28 61 2c 62 2c 63 29 41 03 06 17 15 11 01 t2(a,b,c)A...... +| 3840: 6b 69 6e 64 65 78 74 31 78 31 74 31 03 43 52 45 kindext1x1t1.CRE +| 3856: 41 54 45 20 49 4e 44 45 58 20 74 31 78 31 20 4f ATE INDEX t1x1 O +| 3872: 4e 20 74 31 28 64 29 20 57 48 45 52 45 20 65 65 N t1(d) WHERE ee +| 3888: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 36 02 06 17 IS NOT NULL6... +| 3904: 17 11 01 53 69 6e 64 65 78 74 31 61 62 63 74 31 ...Sindext1abct1 +| 3920: 03 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 .CREATE INDEX t1 +| 3936: 61 62 63 20 4f 4e 20 74 31 28 61 2c 62 2c 63 2b abc ON t1(a,b,c+ +| 3952: 64 2b 65 29 81 09 01 07 17 11 11 01 81 7d 74 61 d+e)..........ta +| 3968: 62 6c 65 74 31 74 31 02 43 52 45 41 54 45 20 54 blet1t1.CREATE T +| 3984: 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 2c ABLE t1(a,b,c,d, +| 4000: 65 2c 66 2c 67 2c 68 2c 6a 2c 6a 6a 2c 6a 6a 6a e,f,g,h,j,jj,jjj +| 4016: 2c 6b 2c 61 61 2c 62 69 8c 63 63 2c 64 64 2c 65 ,k,aa,bi.cc,dd,e +| 4032: 65 20 44 45 46 41 55 4c 54 20 33 2e 31 34 2c 0a e DEFAULT 3.14,. +| 4048: 66 66 20 44 45 46 41 55 4c 54 28 27 68 69 63 63 ff DEFAULT('hicc +| 4064: 75 70 27 29 2c 67 67 20 4e 4f 54 20 4e 55 4c 4c up'),gg NOT NULL +| 4080: 20 44 45 46 41 55 4c 54 28 66 61 6c 73 65 29 29 DEFAULT(false)) +| page 2 offset 4096 +| 0: 0d 00 00 00 0a 0e 7b 00 0f dc 0f b6 0f 8f 0f 68 ...............h +| 16: 0f 41 0f 1a 0e f3 0e cb 0e a3 0e 22 00 00 00 00 .A.............. +| 3696: 00 00 00 00 00 00 00 00 00 00 00 26 0a 14 01 01 ...........&.... +| 3712: 02 08 00 00 00 00 00 00 00 00 00 00 00 00 07 19 ................ +| 3728: 08 09 5a 00 b4 40 09 1e b8 51 eb 95 1f 68 69 63 ..Z..@...Q...hic +| 3744: 63 75 70 26 09 14 01 01 02 08 00 00 00 00 00 00 cup&............ +| 3760: 00 00 00 00 00 00 07 19 08 08 50 00 a0 40 09 1e ..........P..@.. +| 3776: b8 51 eb 85 1f 68 69 63 63 74 70 26 08 14 01 01 .Q...hicctp&.... +| 3792: 03 08 00 00 00 00 00 00 00 00 00 00 00 00 07 19 ................ +| 3808: 08 07 46 00 8c 40 09 1e b8 51 eb 85 1f 68 69 63 ..F..@...Q...hic +| 3824: 63 75 70 25 07 14 01 01 01 08 00 00 00 00 00 00 cup%............ +| 3840: 00 00 00 00 00 10 07 19 08 06 3c 78 40 09 1e b8 .......... Date: Wed, 30 Jan 2019 19:50:07 +0000 Subject: [PATCH 172/306] Change the error message slightly for when two or more indexes have the same rootpage. FossilOrigin-Name: 916c52dad414b224695d455a42af36f85dff216504c2aa67d1d2c5818cdca8d6 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/build.c | 2 +- test/corruptL.test | 4 ++-- test/fuzzdata8.db | Bin 868352 -> 880640 bytes 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 615a0d8823..5bd2ce1330 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sparsing\sthe\sschema,\scheck\sfor\sduplicate\sindex\sroot\spage\snumbers\sbefore\sadding\sthe\sindex\sto\sthe\sschema\shash\stable. -D 2019-01-30T19:12:13.341 +C Change\sthe\serror\smessage\sslightly\sfor\swhen\stwo\sor\smore\sindexes\shave\sthe\nsame\srootpage. +D 2019-01-30T19:50:07.547 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -458,7 +458,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 79464668601b6d278954cf822ef484893e1434f85addda2bd9a323796b91b328 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 -F src/build.c f2805f5da53aa10c52323f5a7d976aade405dd70e52166ae4e7f35708577893e +F src/build.c fe6e3753c4cfc76f9c621a24ef5f6fd62aac5aa6c843710b542509f493274eca F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -757,7 +757,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 -F test/corruptL.test 82855aa907c3f899c123e8388f0450df8fccb5016539c7b5e64695772e7595bb +F test/corruptL.test 0f64242b83db6d0bd5b6e38c205bf7c2a3bc6c9f80351f49c4dee1639aca60d8 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db df6e7a32697f3e7be801fa90e02fe6ae9c1dbe7ce8a8a626af0febab35a54e96 +F test/fuzzdata8.db fe1b2ae0e7976f225ae9dd637eb67726154caf0da39ac329fc4a35d9991aef3b F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 197edb235b785c68fda7be788efbc61137d9452886599415a927b959ade93c65 -R 614f1871a981a455ef4904657472e2dd -U dan -Z 10bfb2b527ca61a24c5f5b6dad4cafcc +P 6b360bc0b9ad18ccda9d58d43a8388d19999432bfdf294abcf5beb44ef990cb4 +R cb0273b303eb213fe70157df7871c9bb +U drh +Z 4c2226fa0a72348ad16843e693e2eabf diff --git a/manifest.uuid b/manifest.uuid index 17085cfd03..eac7b74d7c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6b360bc0b9ad18ccda9d58d43a8388d19999432bfdf294abcf5beb44ef990cb4 \ No newline at end of file +916c52dad414b224695d455a42af36f85dff216504c2aa67d1d2c5818cdca8d6 \ No newline at end of file diff --git a/src/build.c b/src/build.c index ca8db87dd5..3c4b9db62b 100644 --- a/src/build.c +++ b/src/build.c @@ -3490,7 +3490,7 @@ void sqlite3CreateIndex( if( pTblName!=0 ){ pIndex->tnum = db->init.newTnum; if( sqlite3IndexHasDuplicateRootPage(pIndex) ){ - sqlite3ErrorMsg(pParse, "invalid root page"); + sqlite3ErrorMsg(pParse, "invalid rootpage"); pParse->rc = SQLITE_CORRUPT_BKPT; goto exit_create_index; } diff --git a/test/corruptL.test b/test/corruptL.test index 26ea3203f1..7b84058caa 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -627,7 +627,7 @@ do_catchsql_test 6.1 { INSERT INTO t1(b) VALUES(1); INSERT INTO t1(b) VALUES(2); COMMIT; -} {1 {malformed database schema (t1b) - invalid root page}} +} {1 {malformed database schema (t1b) - invalid rootpage}} #------------------------------------------------------------------------- reset_db @@ -720,6 +720,6 @@ do_test 7.0 { do_catchsql_test 7.1 { SELECT * FROM sqlite_master; -} {1 {malformed database schema (t1x1) - invalid root page}} +} {1 {malformed database schema (t1x1) - invalid rootpage}} finish_test diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 3579b464f16680d466fd2ddc849743202b6d9536..49dfb8ec71d4746365fd1d658d9faa69da0ec73f 100644 GIT binary patch delta 13058 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 Q`*4wc)+zIOdwlQz0~47gSO5S3 delta 12070 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 From 9b747068bad531f0300891e6f569f67d55abb93b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 31 Jan 2019 01:39:01 +0000 Subject: [PATCH 173/306] Improvements to "PRAGMA parser_trace=ON": Make it a flag pragma, and then use the flag to show the complete SQL text at the beginning of the parse. FossilOrigin-Name: 507c43537f00d089efb3c3020fb6e826e8f89f3efa2caaa12c5309d35dd0c22e --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/pragma.c | 13 ------------- src/pragma.h | 13 +++++++------ src/sqliteInt.h | 1 + src/tokenize.c | 9 ++++++++- tool/mkpragmatab.tcl | 5 ++++- 7 files changed, 31 insertions(+), 32 deletions(-) diff --git a/manifest b/manifest index 5bd2ce1330..0579853644 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\serror\smessage\sslightly\sfor\swhen\stwo\sor\smore\sindexes\shave\sthe\nsame\srootpage. -D 2019-01-30T19:50:07.547 +C Improvements\sto\s"PRAGMA\sparser_trace=ON":\sMake\sit\sa\sflag\spragma,\sand\sthen\nuse\sthe\sflag\sto\sshow\sthe\scomplete\sSQL\stext\sat\sthe\sbeginning\sof\sthe\sparse. +D 2019-01-31T01:39:01.993 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -507,8 +507,8 @@ F src/parse.y 9e5fc4c9788cc692c2117c4236eebb6e03d4f75a3a138656814fddba2eae3903 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 -F src/pragma.c 20811b404b6d302a1bedd4b8af8aab2794c5e87ba1f5cb6b42dbc3266ad9c603 -F src/pragma.h 14eed1061a0b52443349eb733ae8f107144f9d0d3ce39e8e9490b5f6691c0e09 +F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 +F src/pragma.h b774c8fdd63ed468ab8206b9b530d5d2523ed8889fbb72d1143d09272d5c6b2c F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -519,7 +519,7 @@ F src/shell.c.in 705a00be4fa43303b6b18df2241f5397cefd8d9f076bb035ad01b42635c7a1d F src/sqlite.h.in 8ded85ecaa768afd196b24201382ccdf00e5bab6861e30549cd750bebd273a0b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 5e0d8205345eef5ac1769e1129b0fb7bbd716eed0b021bc725326514bfcc3d57 +F src/sqliteInt.h 40eb4e59a487a02525121e2af140052d1d33120ee367692523a91bf4a16707a7 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -577,7 +577,7 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c c8af4feebd8bf5a4d60a14018d91f61013f658ec864dfce7661bae73d86b3191 +F src/tokenize.c a9a474205b7549bc5df46d941c2cc0096f1039dbce2d6f4fe084e1af9ba49aa2 F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1 @@ -1737,7 +1737,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl f69c3acb55af6e8f364465c28be5ffa5bdbd34440b27bf05bcc21ce9eb8a2cf2 +F tool/mkpragmatab.tcl 18d3d04b616dc15db0f91ce5a725783ebd36f051f291d5787fdc31927ed0b9d4 F tool/mkshellc.tcl 1f45770aea226ac093a9c72f718efbb88a2a2833409ec2e1c4cecae4202626f5 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1804,7 +1804,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 6b360bc0b9ad18ccda9d58d43a8388d19999432bfdf294abcf5beb44ef990cb4 -R cb0273b303eb213fe70157df7871c9bb +P 916c52dad414b224695d455a42af36f85dff216504c2aa67d1d2c5818cdca8d6 +R 10b41745b3135a2b0ba24c50f8ff3515 U drh -Z 4c2226fa0a72348ad16843e693e2eabf +Z ce6c99fa816c4a6ba08dcf1f5aeb929d diff --git a/manifest.uuid b/manifest.uuid index eac7b74d7c..a3cf57bc50 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -916c52dad414b224695d455a42af36f85dff216504c2aa67d1d2c5818cdca8d6 \ No newline at end of file +507c43537f00d089efb3c3020fb6e826e8f89f3efa2caaa12c5309d35dd0c22e \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index faef5f74ae..1dcd21400c 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1421,19 +1421,6 @@ void sqlite3Pragma( #endif /* !defined(SQLITE_OMIT_TRIGGER) */ #endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ -#ifndef NDEBUG - case PragTyp_PARSER_TRACE: { - if( zRight ){ - if( sqlite3GetBoolean(zRight, 0) ){ - sqlite3ParserTrace(stdout, "parser: "); - }else{ - sqlite3ParserTrace(0, 0); - } - } - } - break; -#endif - /* Reinstall the LIKE and GLOB functions. The variant of LIKE ** used will be case sensitive or not depending on the RHS. */ diff --git a/src/pragma.h b/src/pragma.h index 6632c4945e..911bfed3af 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -49,8 +49,7 @@ #define PragTyp_HEXKEY 41 #define PragTyp_KEY 42 #define PragTyp_LOCK_STATUS 43 -#define PragTyp_PARSER_TRACE 44 -#define PragTyp_STATS 45 +#define PragTyp_STATS 44 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -473,12 +472,14 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif -#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_PARSER_TRACE) +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) {/* zName: */ "parser_trace", - /* ePragTyp: */ PragTyp_PARSER_TRACE, - /* ePragFlg: */ 0, + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ SQLITE_ParserTrace }, +#endif #endif #if defined(SQLITE_INTROSPECTION_PRAGMAS) {/* zName: */ "pragma_list", diff --git a/src/sqliteInt.h b/src/sqliteInt.h index c13508bb72..b67b3ed76f 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1555,6 +1555,7 @@ struct sqlite3 { #define SQLITE_VdbeTrace HI(0x0004) /* True to trace VDBE execution */ #define SQLITE_VdbeAddopTrace HI(0x0008) /* Trace sqlite3VdbeAddOp() calls */ #define SQLITE_VdbeEQP HI(0x0010) /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_ParserTrace HI(0x0020) /* PRAGMA parser_trace=ON */ #endif /* diff --git a/src/tokenize.c b/src/tokenize.c index 297f9ab002..a0e1450214 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -572,7 +572,14 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ pParse->rc = SQLITE_OK; pParse->zTail = zSql; assert( pzErrMsg!=0 ); - /* sqlite3ParserTrace(stdout, "parser: "); */ +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_ParserTrace ){ + printf("parser: [[[%s]]]\n", zSql); + sqlite3ParserTrace(stdout, "parser: "); + }else{ + sqlite3ParserTrace(0, 0); + } +#endif #ifdef sqlite3Parser_ENGINEALWAYSONSTACK pEngine = &sEngine; sqlite3ParserInit(pEngine, pParse); diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index f319b38502..49045f582e 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -302,7 +302,10 @@ set pragma_def { IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) NAME: parser_trace - IF: defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_PARSER_TRACE) + TYPE: FLAG + ARG: SQLITE_ParserTrace + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) + IF: defined(SQLITE_DEBUG) NAME: case_sensitive_like FLAG: NoColumns From 6a0db87a2fbd50aa8fd22fe4362549f31b1a82b1 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 31 Jan 2019 02:42:47 +0000 Subject: [PATCH 174/306] If the amalgamation file "sqlite3.c" is generated using the SQLITE_ENABLE_UPDATE_DELETE_LIMIT option, but then subsequently (mis-)compiled without that option, and then a particular syntax error could cause a memory leak, but for this fix. FossilOrigin-Name: 1bb17c863a269ab8b28df94b9fdaac3ee70777ccd0a30300131bf67df6722052 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/parse.y | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 0579853644..3ca108f63a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\s"PRAGMA\sparser_trace=ON":\sMake\sit\sa\sflag\spragma,\sand\sthen\nuse\sthe\sflag\sto\sshow\sthe\scomplete\sSQL\stext\sat\sthe\sbeginning\sof\sthe\sparse. -D 2019-01-31T01:39:01.993 +C If\sthe\samalgamation\sfile\s"sqlite3.c"\sis\sgenerated\susing\sthe\nSQLITE_ENABLE_UPDATE_DELETE_LIMIT\soption,\sbut\sthen\ssubsequently\s(mis-)compiled\nwithout\sthat\soption,\sand\sthen\sa\sparticular\ssyntax\serror\scould\scause\na\smemory\sleak,\sbut\sfor\sthis\sfix. +D 2019-01-31T02:42:47.796 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -503,7 +503,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 857dde3e525f665cfab23b6765bf04ca6638c0759ae7da6d63acfb463e230aa6 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 9e5fc4c9788cc692c2117c4236eebb6e03d4f75a3a138656814fddba2eae3903 +F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 @@ -1804,7 +1804,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 916c52dad414b224695d455a42af36f85dff216504c2aa67d1d2c5818cdca8d6 -R 10b41745b3135a2b0ba24c50f8ff3515 +P 507c43537f00d089efb3c3020fb6e826e8f89f3efa2caaa12c5309d35dd0c22e +R 82f5f5d5764a2da0c40fb39d1c1cd862 U drh -Z ce6c99fa816c4a6ba08dcf1f5aeb929d +Z 9789512014c7a3db2155ae83f232245b diff --git a/manifest.uuid b/manifest.uuid index a3cf57bc50..8caab363ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -507c43537f00d089efb3c3020fb6e826e8f89f3efa2caaa12c5309d35dd0c22e \ No newline at end of file +1bb17c863a269ab8b28df94b9fdaac3ee70777ccd0a30300131bf67df6722052 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 4672dbda64..1b89e69fd7 100644 --- a/src/parse.y +++ b/src/parse.y @@ -826,6 +826,10 @@ limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W) orderby_opt(O) limit_opt(L). { sqlite3SrcListIndexedBy(pParse, X, &I); +#ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + sqlite3ExprListDelete(pParse->db, O); O = 0; + sqlite3ExprDelete(pParse->db, L); L = 0; +#endif sqlite3DeleteFrom(pParse,X,W,O,L); } %endif From b92b019fe3d0669504a94dd8c26b63d5dd52441e Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 31 Jan 2019 14:37:18 +0000 Subject: [PATCH 175/306] Fix another buffer overrun that could occur when quering a corrupt database using an fts5vocab table. FossilOrigin-Name: b80119bd6044c0993210115732b6ae7b4b0b29c1471b0723bef24f2052c8e671 --- ext/fts5/fts5_index.c | 2 +- ext/fts5/fts5_vocab.c | 1 + ext/fts5/test/fts5corrupt3.test | 130 ++++++++++++++++++++++++++++++++ manifest | 18 ++--- manifest.uuid | 2 +- 5 files changed, 142 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 32732b9df6..bb87714916 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -1652,7 +1652,7 @@ static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){ int nNew; /* Bytes of new data */ iOff += fts5GetVarint32(&a[iOff], nNew); - if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n ){ + if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n || nNew==0 ){ p->rc = FTS5_CORRUPT; return; } diff --git a/ext/fts5/fts5_vocab.c b/ext/fts5/fts5_vocab.c index bfb6821280..2550c9d6eb 100644 --- a/ext/fts5/fts5_vocab.c +++ b/ext/fts5/fts5_vocab.c @@ -484,6 +484,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int nTerm; zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); + assert( nTerm>=0 ); if( pCsr->nLeTerm>=0 ){ int nCmp = MIN(nTerm, pCsr->nLeTerm); int bCmp = memcmp(pCsr->zLeTerm, zTerm, nCmp); diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index bd63ed4c38..23340529fa 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -6641,6 +6641,136 @@ do_catchsql_test 48.1 { INSERT INTO t1(t1) VALUES('integrity-check'); } {1 {database disk image is malformed}} +#-------------------------------------------------------------------------- +reset_db +do_test 49.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-fd87385402ecf5.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 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 20 68 20 69 0d 00 00 00 03 0f e8 ...t. h i....... +| 3904: 00 0f f8 0f f0 0f e8 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 00 ................ +| 4080: 60 20 30 d6 20 30 00 30 60 10 30 01 20 30 00 30 ` 0. 0.0`.0. 0.0 +| page 6 offset 20480 +| 0: a0 00 00 00 10 ff 40 00 ff 00 00 00 00 00 00 00 ......@......... +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 00 00 00 00 00 00 00 00 00 11 87 89 06 26 ...............& +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 44 00 06 06 07 01 03 00 14 03 09 09 09 0f ..D............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 9d 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-fd87385402ecf5.db +}]} {} + +do_catchsql_test 49.1 { + SELECT term FROM t4 WHERE term LIKE 'oase'; +} {1 {database disk image is malformed}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 3ca108f63a..4783d73797 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sthe\samalgamation\sfile\s"sqlite3.c"\sis\sgenerated\susing\sthe\nSQLITE_ENABLE_UPDATE_DELETE_LIMIT\soption,\sbut\sthen\ssubsequently\s(mis-)compiled\nwithout\sthat\soption,\sand\sthen\sa\sparticular\ssyntax\serror\scould\scause\na\smemory\sleak,\sbut\sfor\sthis\sfix. -D 2019-01-31T02:42:47.796 +C Fix\sanother\sbuffer\soverrun\sthat\scould\soccur\swhen\squering\sa\scorrupt\sdatabase\susing\san\sfts5vocab\stable. +D 2019-01-31T14:37:18.133 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 97d84ca8ed6f347efea4bd4f831d6c5d3b7efeb7cb41cc281ee3886dc61eed0d +F ext/fts5/fts5_index.c a5cc612c8bbba37cbf72e820f7c6f14f8dbe6868c79141c712aead8a39b0e960 F ext/fts5/fts5_main.c 2395658479bca37d0936d47e6194ef575e5e7235ded47fa93bd9d5bb8035b977 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -124,7 +124,7 @@ F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3 F ext/fts5/fts5_tokenize.c 4d904c237707de8fbb8ab98d24d5c55d47204a3f1f35895d8a53a5327079b32c F ext/fts5/fts5_unicode2.c d8a1528c9a19f79b843c486e5e64bff17d667791ae7f658e11131ebac4b33c59 F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 10a3ef4325f65537a2985148f8695476301fa2543fbfd183f28eff0a824faf3f +F ext/fts5/fts5_vocab.c 906dff069840347e68f654b12ca60a53a27cd1780daf155fbe7dd331f27c2329 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test e2f48a9681fd7639d12d46daef3975456f1531a8d78e190fec53a67f97da6d60 +F ext/fts5/test/fts5corrupt3.test 08792647bc39a25b0d41c6030752ca85709a41eaba1b300920dc183d03960ede F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 507c43537f00d089efb3c3020fb6e826e8f89f3efa2caaa12c5309d35dd0c22e -R 82f5f5d5764a2da0c40fb39d1c1cd862 -U drh -Z 9789512014c7a3db2155ae83f232245b +P 1bb17c863a269ab8b28df94b9fdaac3ee70777ccd0a30300131bf67df6722052 +R b2ec4376c70b20bc03f8261edcac4e94 +U dan +Z 389be73abd4fd2cdec568e6d77909c32 diff --git a/manifest.uuid b/manifest.uuid index 8caab363ec..92d03a072c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1bb17c863a269ab8b28df94b9fdaac3ee70777ccd0a30300131bf67df6722052 \ No newline at end of file +b80119bd6044c0993210115732b6ae7b4b0b29c1471b0723bef24f2052c8e671 \ No newline at end of file From 23a885956e6f6798bf0b75ddf083e77c77ed41cd Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 31 Jan 2019 15:38:53 +0000 Subject: [PATCH 176/306] Add the SQLITE_CONFIG_MEMDB_MAXSIZE configuration option for configuring the default maximum size of an in-memory database created using sqlite3_deserialize(). This is necessary to make the interface reasonably testable. FossilOrigin-Name: cb72ee0478ce98c48aae059fd5de4e36caf2b8c953e08fcb799bfd119ad46b73 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/global.c | 12 +++++++++++- src/main.c | 7 +++++++ src/memdb.c | 11 +++-------- src/sqlite.h.in | 12 ++++++++++++ src/sqliteInt.h | 3 +++ 7 files changed, 48 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 4783d73797..3c928c24a6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sbuffer\soverrun\sthat\scould\soccur\swhen\squering\sa\scorrupt\sdatabase\susing\san\sfts5vocab\stable. -D 2019-01-31T14:37:18.133 +C Add\sthe\sSQLITE_CONFIG_MEMDB_MAXSIZE\sconfiguration\soption\sfor\sconfiguring\nthe\sdefault\smaximum\ssize\sof\san\sin-memory\sdatabase\screated\susing\nsqlite3_deserialize().\s\sThis\sis\snecessary\sto\smake\sthe\sinterface\sreasonably\ntestable. +D 2019-01-31T15:38:53.697 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -470,7 +470,7 @@ F src/expr.c 4bc508644845d2c9fb870e808df125b233a8d93d132c2184f8db0a034864325a F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 -F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b +F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da @@ -478,14 +478,14 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 3ed9ceaa4b7d56a6f2613355e1cd1ae5cfe31712bce2bf5aa93c5f1f130704b2 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 -F src/main.c 008f45dd39cdc7fb9e7e1f61d75a5c97397f8e07427a8879be23e27747d5f948 +F src/main.c ac8da4375e870d0bc359e6028644ba01c67ca0af3cc03f61a917e1e2917e040a F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c d95f6ad26f7c582026c5501b32dc0201ce781ad496bc61107d759b5e4e5c563a +F src/memdb.c 8689716299074d1016144af05f46ddb8971621f8b589a5af95455cfe09ba35e2 F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661 F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81 F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604 @@ -516,10 +516,10 @@ F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 F src/shell.c.in 705a00be4fa43303b6b18df2241f5397cefd8d9f076bb035ad01b42635c7a1de -F src/sqlite.h.in 8ded85ecaa768afd196b24201382ccdf00e5bab6861e30549cd750bebd273a0b +F src/sqlite.h.in 947ac377d889055e0979138cc85b3a3b42ee53170b8d55bd589a1ced0e6928f6 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 40eb4e59a487a02525121e2af140052d1d33120ee367692523a91bf4a16707a7 +F src/sqliteInt.h 7899f2f28c98e998e9720bf9b23b19aa364caf0a0d0a4086334adda3a1b9fa83 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1804,7 +1804,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 1bb17c863a269ab8b28df94b9fdaac3ee70777ccd0a30300131bf67df6722052 -R b2ec4376c70b20bc03f8261edcac4e94 -U dan -Z 389be73abd4fd2cdec568e6d77909c32 +P b80119bd6044c0993210115732b6ae7b4b0b29c1471b0723bef24f2052c8e671 +R 237af9b2bf342542efd55a7bfd4e7366 +U drh +Z e1a3e36fa751023ea67754db7a2638ca diff --git a/manifest.uuid b/manifest.uuid index 92d03a072c..3a8b470098 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b80119bd6044c0993210115732b6ae7b4b0b29c1471b0723bef24f2052c8e671 \ No newline at end of file +cb72ee0478ce98c48aae059fd5de4e36caf2b8c953e08fcb799bfd119ad46b73 \ No newline at end of file diff --git a/src/global.c b/src/global.c index f1a3912484..a78ea65a7f 100644 --- a/src/global.c +++ b/src/global.c @@ -189,6 +189,13 @@ const unsigned char sqlite3CtypeMap[256] = { #endif +/* The default maximum size of an in-memory database created using +** sqlite3_deserialize() +*/ +#ifndef SQLITE_MEMDB_DEFAULT_MAXSIZE +# define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 +#endif + /* ** The following singleton contains the global configuration for ** the SQLite library. @@ -236,13 +243,16 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xVdbeBranch */ 0, /* pVbeBranchArg */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + SQLITE_MEMDB_DEFAULT_MAXSIZE, /* mxMemdbSize */ +#endif #ifndef SQLITE_UNTESTABLE 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ 0, /* bInternalFunctions */ 0x7ffffffe, /* iOnceResetThreshold */ - SQLITE_DEFAULT_SORTERREF_SIZE /* szSorterRef */ + SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ }; /* diff --git a/src/main.c b/src/main.c index efffc2b633..c40e6e877a 100644 --- a/src/main.c +++ b/src/main.c @@ -653,6 +653,13 @@ int sqlite3_config(int op, ...){ } #endif /* SQLITE_ENABLE_SORTER_REFERENCES */ +#ifdef SQLITE_ENABLE_DESERIALIZE + case SQLITE_CONFIG_MEMDB_MAXSIZE: { + sqlite3GlobalConfig.mxMemdbSize = va_arg(ap, sqlite3_int64); + break; + } +#endif /* SQLITE_ENABLE_DESERIALIZE */ + default: { rc = SQLITE_ERROR; break; diff --git a/src/memdb.c b/src/memdb.c index 75e83a95dc..9252164a69 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -42,11 +42,6 @@ struct MemFile { int eLock; /* Most recent lock against this file */ }; -/* The default maximum size of an in-memory database */ -#ifndef SQLITE_MEMDB_DEFAULT_MAXSIZE -# define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 -#endif - /* ** Methods for MemFile */ @@ -346,7 +341,7 @@ static int memdbOpen( assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ *pOutFlags = flags | SQLITE_OPEN_MEMORY; p->base.pMethods = &memdb_io_methods; - p->szMax = SQLITE_MEMDB_DEFAULT_MAXSIZE; + p->szMax = sqlite3GlobalConfig.mxMemdbSize; return SQLITE_OK; } @@ -598,8 +593,8 @@ int sqlite3_deserialize( p->sz = szDb; p->szAlloc = szBuf; p->szMax = szBuf; - if( p->szMaxszMax = SQLITE_MEMDB_DEFAULT_MAXSIZE; + if( p->szMaxszMax = sqlite3GlobalConfig.mxMemdbSize; } p->mFlags = mFlags; rc = SQLITE_OK; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index eb7895364a..bbc1d13b37 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -1982,6 +1982,17 @@ struct sqlite3_mem_methods { ** negative value for this option restores the default behaviour. ** This option is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. +** +** [[SQLITE_CONFIG_MEMDB_MAXSIZE]] +**

    SQLITE_CONFIG_MEMDB_MAXSIZE +**
    SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
    -**
    ^This option is used to enable or disable the two-argument -** version of the [fts3_tokenizer()] function which is part of the +**
    ^This option is used to enable or disable the +** [fts3_tokenizer()] function which is part of the ** [FTS3] full-text search engine extension. ** There should be two additional arguments. ** The first argument is an integer which is 0 to disable fts3_tokenizer() or diff --git a/test/fts3atoken.test b/test/fts3atoken.test index 4ce38762d6..4df0be2a02 100644 --- a/test/fts3atoken.test +++ b/test/fts3atoken.test @@ -107,6 +107,7 @@ do_test fts3atoken-2.1 { # simple input string via the built-in test function. This is as much # to test the test function as the tokenizer implementations. # +sqlite3_db_config db SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1 do_test fts3atoken-3.1 { execsql { SELECT fts3_tokenizer_test('simple', 'I don''t see how'); From 8f46f34e2d1ef30c7e7afa2c33029c5abcf37ded Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Mar 2019 12:17:35 +0000 Subject: [PATCH 292/306] Remove a redundant parameter extraction call from the percentile.c extension. FossilOrigin-Name: d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b --- ext/misc/percentile.c | 4 ++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/misc/percentile.c b/ext/misc/percentile.c index a8e4981f70..88fc5a96ff 100644 --- a/ext/misc/percentile.c +++ b/ext/misc/percentile.c @@ -108,8 +108,8 @@ static void percentStep(sqlite3_context *pCtx, int argc, sqlite3_value **argv){ /* Requirement 3: P must be a number between 0 and 100 */ eType = sqlite3_value_numeric_type(argv[1]); rPct = sqlite3_value_double(argv[1]); - if( (eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT) || - ((rPct = sqlite3_value_double(argv[1]))<0.0 || rPct>100.0) ){ + if( (eType!=SQLITE_INTEGER && eType!=SQLITE_FLOAT) + || rPct<0.0 || rPct>100.0 ){ sqlite3_result_error(pCtx, "2nd argument to percentile() is not " "a number between 0.0 and 100.0", -1); return; diff --git a/manifest b/manifest index bcfe8dba8e..683ca9c0a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sfts3_tokenizer()\sfunction\sreturns\sNULL\sif\sthe\nSQLITE_DBCONFIG_ENABLE_FTS_TOKENIZER\ssetting\sis\sdisabled,\swhich\sis\sis\nby\sdefault. -D 2019-03-01T21:33:29.039 +C Remove\sa\sredundant\sparameter\sextraction\scall\sfrom\sthe\spercentile.c\sextension. +D 2019-03-02T12:17:35.599 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -296,7 +296,7 @@ F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c -F ext/misc/percentile.c a6a1594c104da2d0ceab38fe609eb2f65529272377827f6f8a2b5c9fa6119e7e +F ext/misc/percentile.c 148dd07286b16e50f232bb638a47850085ad37d51f270429905bd865e595d1ca F ext/misc/prefixes.c 7be86d17525cfae6ed462fc3c519efc44488ac329890f77491c8f82871f57e17 F ext/misc/regexp.c 79345bf03496155a640ee0300d3307296761cebb5e115b4e342cc2fb5861ec10 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c @@ -1805,7 +1805,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 9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 -R 6bb845ba94b22e31200ba286777e2ff0 +P f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 +R 8c1a5c619573aadfcf11f42bd8a532d3 U drh -Z f12ee49595ceb9a1e0b9ecd89bae7dff +Z d54032ab771b9f2b12d64cf88c6e15a6 diff --git a/manifest.uuid b/manifest.uuid index 900a959e9c..286b76ea18 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 \ No newline at end of file +d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b \ No newline at end of file From e22976c5357fb6501cb0dd40220b8d48bd9295bb Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Mar 2019 15:25:24 +0000 Subject: [PATCH 293/306] Fix the SQLITE_DIRECT_OVERFLOW_READ compile-time option so that it works with SQLITE_HAS_CODEC. FossilOrigin-Name: fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 683ca9c0a1..844bd02081 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sredundant\sparameter\sextraction\scall\sfrom\sthe\spercentile.c\sextension. -D 2019-03-02T12:17:35.599 +C Fix\sthe\sSQLITE_DIRECT_OVERFLOW_READ\scompile-time\soption\sso\sthat\sit\sworks\nwith\sSQLITE_HAS_CODEC. +D 2019-03-02T15:25:24.014 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -502,7 +502,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 2b9604eb5c12f40a0613e832b6267f5814f84479d570d482ba6f98d7affa7c1c F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 5420ef6ea46db11b6ba1231f39fc2a1bf19ccad185efc6dc46f1520a608de4f8 +F src/pager.c 5ff85a1dafdbbc3d27e21dbb52ac02066507b1e2d7da4cd4961408eed2cce23a F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee @@ -1805,7 +1805,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 f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 -R 8c1a5c619573aadfcf11f42bd8a532d3 +P d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b +R 50571770f9cddd9f6937b98986c246b4 U drh -Z d54032ab771b9f2b12d64cf88c6e15a6 +Z 39fd6294d7f36d7da03a65b55eee9cda diff --git a/manifest.uuid b/manifest.uuid index 286b76ea18..5a3c4e431a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b \ No newline at end of file +fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 4660bbfaba..9dd3dfe007 100644 --- a/src/pager.c +++ b/src/pager.c @@ -837,6 +837,9 @@ static const unsigned char aJournalMagic[] = { int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ if( pPager->fd->pMethods==0 ) return 0; if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; +#ifdef SQLITE_HAS_CODEC + if( pPager->xCodec!=0 ) return 0; +#endif #ifndef SQLITE_OMIT_WAL if( pPager->pWal ){ u32 iRead = 0; From 75db74fdaeaeef414793f03c0fea93fb6ed8c92b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Mar 2019 20:09:35 +0000 Subject: [PATCH 294/306] Improved comments on the fossildelta.c extension. FossilOrigin-Name: d7d23f0450d659b2c7df34e4df8623ca7b6fe3bd19422e3e9234515214ae8510 --- ext/misc/fossildelta.c | 20 +++++++++++++++++++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index b58d358b55..7e78f6fb12 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -10,7 +10,25 @@ ** ****************************************************************************** ** -** This SQLite extension implements the delta functions used by Fossil. +** This SQLite extension implements the delta functions used by the RBU +** extension. Three scalar functions and one table-valued function are +** implemented here: +** +** delta_apply(X,D) -- apply delta D to file X and return the result +** delta_create(X,Y) -- compute and return a delta that carries X into Y +** delta_output_size(D) -- blob size in bytes output from applying delta D +** delta_parse(D) -- returns rows describing delta D +** +** The delta format is the Fossil delta format, described in a comment +** on the delete_create() function implementation below, and also at +** +** https://www.fossil-scm.org/fossil/doc/trunk/www/delta_format.wiki +** +** This delta format is used by the RBU extension, which is the main +** reason that these routines are included in the extension library. +** RBU does not use this extension directly. Rather, this extension is +** provided as a convenience to developers who want to analyze RBU files +** that contain deltas. */ #include #include diff --git a/manifest b/manifest index 844bd02081..99d80ef9bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sSQLITE_DIRECT_OVERFLOW_READ\scompile-time\soption\sso\sthat\sit\sworks\nwith\sSQLITE_HAS_CODEC. -D 2019-03-02T15:25:24.014 +C Improved\scomments\son\sthe\sfossildelta.c\sextension. +D 2019-03-02T20:09:35.788 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -286,7 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c e7864c391e14ccaf73ee4b22f5a55c1eb40ecc93a7f5ee77a1b41b87367ec7ae -F ext/misc/fossildelta.c 3cc9a9b2f39889b43cd176c19f286bc7dd652f4c202c202d008481252d820316 +F ext/misc/fossildelta.c 910510968a30ab77b8ac1a27931f2cb834e9db9fd5ab122f53b6045b4315665d F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1805,7 +1805,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 d49c32e6e7cc341b5961d2c7b7c68d1649c6542eeec201660e3f82a55aea9e3b -R 50571770f9cddd9f6937b98986c246b4 +P fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa +R 2f413ab89884ce894ab037220c4ef892 U drh -Z 39fd6294d7f36d7da03a65b55eee9cda +Z 4ebc8a2db088c512de2eab3689f25c24 diff --git a/manifest.uuid b/manifest.uuid index 5a3c4e431a..c0e58c4f51 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa \ No newline at end of file +d7d23f0450d659b2c7df34e4df8623ca7b6fe3bd19422e3e9234515214ae8510 \ No newline at end of file From 4474e869fed2a30237b68e2e5c6d383d3fc7d9fe Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 4 Mar 2019 07:15:57 +0000 Subject: [PATCH 295/306] Fix a problem preventing compilation with SQLITE_OMIT_UTF16. FossilOrigin-Name: 906d1fd8650874236e0bf5734d5347dcc45ec036164a56570fec37da4ffeaf8f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeapi.c | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 99d80ef9bf..d2655343e5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scomments\son\sthe\sfossildelta.c\sextension. -D 2019-03-02T20:09:35.788 +C Fix\sa\sproblem\spreventing\scompilation\swith\sSQLITE_OMIT_UTF16. +D 2019-03-04T07:15:57.844 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -589,7 +589,7 @@ F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca F src/vdbe.c f1e7b5320df80ff58c67176e35cb48062cbda2a9c9811f11db5faa48071d3fe4 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f -F src/vdbeapi.c cde63790c9d18ba5941d52c9f49e1a862cf6503141d5b9c112a05eb0adbf30a9 +F src/vdbeapi.c 0eb687d3287d6ab45661f7ffcabbda6f345713e800ef0f29053597933ca2a0bf F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 3e89e087df928eba80e520824078dc563c579a0848b1557ac36845ec14392923 @@ -1805,7 +1805,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 fd085e9260bec18f968704abb2dd324d954baa121d13b67c3f5b801e9e3834aa -R 2f413ab89884ce894ab037220c4ef892 -U drh -Z 4ebc8a2db088c512de2eab3689f25c24 +P d7d23f0450d659b2c7df34e4df8623ca7b6fe3bd19422e3e9234515214ae8510 +R dc88e96e04121683ea3d6378eccdabf0 +U dan +Z 97fe7239616646a62550c014b5d021f5 diff --git a/manifest.uuid b/manifest.uuid index c0e58c4f51..821cac909e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7d23f0450d659b2c7df34e4df8623ca7b6fe3bd19422e3e9234515214ae8510 \ No newline at end of file +906d1fd8650874236e0bf5734d5347dcc45ec036164a56570fec37da4ffeaf8f \ No newline at end of file diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 5b9ba4d89c..2aa93e60a7 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1144,9 +1144,12 @@ static const void *columnName( N += useType*n; sqlite3_mutex_enter(db->mutex); assert( db->mallocFailed==0 ); +#ifndef SQLITE_OMIT_UTF16 if( useUtf16 ){ ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); - }else{ + }else +#endif + { ret = sqlite3_value_text((sqlite3_value*)&p->aColName[N]); } /* A malloc may have failed inside of the _text() call. If this From 0a31dc201e905816f97fd20001cb5f154276f91d Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Mar 2019 14:39:00 +0000 Subject: [PATCH 296/306] If the initial byte of a record is a large value, then always used the generalized record comparison routine sqlite3VdbeRecordCompare() rather than one of the specialized versions that are optimized for shorter records. FossilOrigin-Name: c1ac00706bae45fe9735061ada025880606cdfb8ecfdaa36b4e2d04275820861 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d2655343e5..93905a5fdf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\spreventing\scompilation\swith\sSQLITE_OMIT_UTF16. -D 2019-03-04T07:15:57.844 +C If\sthe\sinitial\sbyte\sof\sa\srecord\sis\sa\slarge\svalue,\sthen\salways\sused\sthe\ngeneralized\srecord\scomparison\sroutine\ssqlite3VdbeRecordCompare()\srather\sthan\none\sof\sthe\sspecialized\sversions\sthat\sare\soptimized\sfor\sshorter\srecords. +D 2019-03-05T14:39:00.353 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -456,7 +456,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 59695c6e5eb527bfefc2b3d8ffebd178ad8686eaeb810c9f57719d6d2b72822e +F src/btree.c 7da25dbf427e7ad5d36b78541cf33b9cba2d3f9d02ad5ab41777770aa3396f6f F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 3acec29b23948042173301a8befebae01a98344debf66cbd4467c8b9077707b8 @@ -1805,7 +1805,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 d7d23f0450d659b2c7df34e4df8623ca7b6fe3bd19422e3e9234515214ae8510 -R dc88e96e04121683ea3d6378eccdabf0 -U dan -Z 97fe7239616646a62550c014b5d021f5 +P 906d1fd8650874236e0bf5734d5347dcc45ec036164a56570fec37da4ffeaf8f +R 277179fe4b547cee2092289e5ab7fb47 +U drh +Z 5d5f3c87362d69305d6cbcaac8d39497 diff --git a/manifest.uuid b/manifest.uuid index 821cac909e..023367cf25 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -906d1fd8650874236e0bf5734d5347dcc45ec036164a56570fec37da4ffeaf8f \ No newline at end of file +c1ac00706bae45fe9735061ada025880606cdfb8ecfdaa36b4e2d04275820861 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index d133395659..ac03ec1430 100644 --- a/src/btree.c +++ b/src/btree.c @@ -5552,7 +5552,7 @@ int sqlite3BtreeMovetoUnpacked( sqlite3_free(pCellKey); goto moveto_finish; } - c = xRecordCompare(nCell, pCellKey, pIdxKey); + c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey); sqlite3_free(pCellKey); } assert( From 7bf3133fef1265b9d600554fb8c3b72ecd3bf509 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Mar 2019 14:47:53 +0000 Subject: [PATCH 297/306] New dbfuzz2 test cases added to test/fuzzdata7.db FossilOrigin-Name: 25975e1fb2be0c011542c0a6b001385cec8113662df93dc618f725f2a4692bc2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata7.db | Bin 16417792 -> 16762880 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 93905a5fdf..3b193df58e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sthe\sinitial\sbyte\sof\sa\srecord\sis\sa\slarge\svalue,\sthen\salways\sused\sthe\ngeneralized\srecord\scomparison\sroutine\ssqlite3VdbeRecordCompare()\srather\sthan\none\sof\sthe\sspecialized\sversions\sthat\sare\soptimized\sfor\sshorter\srecords. -D 2019-03-05T14:39:00.353 +C New\sdbfuzz2\stest\scases\sadded\sto\stest/fuzzdata7.db +D 2019-03-05T14:47:53.704 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -992,7 +992,7 @@ F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 +F test/fuzzdata7.db 7b04dfb4e2e28f7174d0b83920ee564ebb5261e23f0b843c383a7868788a300c F test/fuzzdata8.db bcdd2175b8876c3679aa1c00874a9f69368f464e498f800d3917bd74a0563127 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 @@ -1805,7 +1805,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 906d1fd8650874236e0bf5734d5347dcc45ec036164a56570fec37da4ffeaf8f -R 277179fe4b547cee2092289e5ab7fb47 +P c1ac00706bae45fe9735061ada025880606cdfb8ecfdaa36b4e2d04275820861 +R 2e94b0f834d7ac20e94dce95126d5b76 U drh -Z 5d5f3c87362d69305d6cbcaac8d39497 +Z 1db0422f5a22bbfbf5d8023e5f9edc60 diff --git a/manifest.uuid b/manifest.uuid index 023367cf25..81126dc276 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1ac00706bae45fe9735061ada025880606cdfb8ecfdaa36b4e2d04275820861 \ No newline at end of file +25975e1fb2be0c011542c0a6b001385cec8113662df93dc618f725f2a4692bc2 \ No newline at end of file diff --git a/test/fuzzdata7.db b/test/fuzzdata7.db index f994daa2d09cce93dd59d63244501f6dad9c66bf..c3eadb1865a8d30157bd388a27377bd169faa74d 100644 GIT binary patch delta 722092 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\brjYQ8Z1<4PRu!>H*bxA@@?Lln>%Tf^ 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

    H;oZy2XlqXb9K&{%LcFG`Hk)YzL7#wR0BB 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

    ZIM*sb`7}?R!Cr6igc|%+}l80 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%0ALNO*8}y`C3NQL(H0))7h?SO$1(0a#(|Js{>&Hng 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 From 91ed9ce0dd141ded4edc1e60118ddcd79828cebc Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Mar 2019 16:53:16 +0000 Subject: [PATCH 298/306] Add a script to tool/ that will extract the sqlite3.h header file from an sqlite3.c amalgamation. FossilOrigin-Name: 38d2e510cdedf38153466b161c0842b1604aef7b5589c51f628ae7cbb6a8722a --- manifest | 11 ++++++----- manifest.uuid | 2 +- tool/extract-sqlite3h.tcl | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100755 tool/extract-sqlite3h.tcl diff --git a/manifest b/manifest index 3b193df58e..ea896ecfd3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sdbfuzz2\stest\scases\sadded\sto\stest/fuzzdata7.db -D 2019-03-05T14:47:53.704 +C Add\sa\sscript\sto\stool/\sthat\swill\sextract\sthe\ssqlite3.h\sheader\sfile\sfrom\san\nsqlite3.c\samalgamation. +D 2019-03-05T16:53:16.649 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -1715,6 +1715,7 @@ F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/dbhash.c a06228aa21ebc4e6ea8daa486601d938499238a5 F tool/dbtotxt.c 04e25f26be7c7743cdfb4111a8483de0b111925d6afeeb7559ade0ceb73f7f52 F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c +F tool/extract-sqlite3h.tcl 069ceab0cee26cba99952bfa08c0b23e35941c837acabe143f0c355d96c9e2eb x F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 @@ -1805,7 +1806,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 c1ac00706bae45fe9735061ada025880606cdfb8ecfdaa36b4e2d04275820861 -R 2e94b0f834d7ac20e94dce95126d5b76 +P 25975e1fb2be0c011542c0a6b001385cec8113662df93dc618f725f2a4692bc2 +R 7b54cf6ff336794f41ef4c328e35aa5d U drh -Z 1db0422f5a22bbfbf5d8023e5f9edc60 +Z 222794cfa228dcef3bcc8d908fb8115a diff --git a/manifest.uuid b/manifest.uuid index 81126dc276..d0616b00b2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -25975e1fb2be0c011542c0a6b001385cec8113662df93dc618f725f2a4692bc2 \ No newline at end of file +38d2e510cdedf38153466b161c0842b1604aef7b5589c51f628ae7cbb6a8722a \ No newline at end of file diff --git a/tool/extract-sqlite3h.tcl b/tool/extract-sqlite3h.tcl new file mode 100755 index 0000000000..a0f7c4e389 --- /dev/null +++ b/tool/extract-sqlite3h.tcl @@ -0,0 +1,21 @@ +#!/usr/bin/tclsh +# +# Given an sqlite3.c source file identified by the command-line +# argument, extract the "sqlite3.h" header file that is embedded inside +# the sqlite3.c source file and write it to standard output. +# +if {[llength $argv]!=1} { + puts stderr "Usage: $argv0 sqlite3.c >sqlite3.h" + exit 1 +} +set in [open [lindex $argv 0] rb] +while {![eof $in]} { + set line [gets $in] + if {[string match {* Begin file sqlite3.h *} $line]} break +} +while {![eof $in]} { + set line [gets $in] + if {[string match {* End of sqlite3.h *} $line]} break + puts $line +} +close $in From aaad696141fdb4d72e9c8289e7d9183f9493c23f Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Mar 2019 23:49:17 +0000 Subject: [PATCH 299/306] Fix a potential 32-bit integer overflow in the "showdb" utility program when it is trying to interpret a corrupt database file. FossilOrigin-Name: 3803e750384ec37091b0a6c350f8ef67720e316fd6f74c95e3c5f231c4a01ceb --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/showdb.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ea896ecfd3..95aabe0a74 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sscript\sto\stool/\sthat\swill\sextract\sthe\ssqlite3.h\sheader\sfile\sfrom\san\nsqlite3.c\samalgamation. -D 2019-03-05T16:53:16.649 +C Fix\sa\spotential\s32-bit\sinteger\soverflow\sin\sthe\s"showdb"\sutility\sprogram\swhen\nit\sis\strying\sto\sinterpret\sa\scorrupt\sdatabase\sfile. +D 2019-03-05T23:49:17.602 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -1756,7 +1756,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 e6bc9dba233bf1b57ca0a525a2bba762db4e223de84990739db3f09c46151b1e +F tool/showdb.c af978d1437562776fa4d94bf0cb772314c464e71ef24134a6e2301564ae60bc2 F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809 @@ -1806,7 +1806,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 25975e1fb2be0c011542c0a6b001385cec8113662df93dc618f725f2a4692bc2 -R 7b54cf6ff336794f41ef4c328e35aa5d +P 38d2e510cdedf38153466b161c0842b1604aef7b5589c51f628ae7cbb6a8722a +R 5f08c12dd4cf8ba7c214856356c2450a U drh -Z 222794cfa228dcef3bcc8d908fb8115a +Z fa7715e4b91d1f3064235b4ac30911e1 diff --git a/manifest.uuid b/manifest.uuid index d0616b00b2..3ba75e5ce1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -38d2e510cdedf38153466b161c0842b1604aef7b5589c51f628ae7cbb6a8722a \ No newline at end of file +3803e750384ec37091b0a6c350f8ef67720e316fd6f74c95e3c5f231c4a01ceb \ No newline at end of file diff --git a/tool/showdb.c b/tool/showdb.c index ba7a362258..cb6ddabca6 100644 --- a/tool/showdb.c +++ b/tool/showdb.c @@ -828,7 +828,7 @@ static void page_usage_cell( while( ovfl && (cnt++) Date: Wed, 6 Mar 2019 14:08:41 +0000 Subject: [PATCH 300/306] Add an "|| CORRUPT_DB" term to an assert() that might be false if the database is corrupt. Also add a branch to have sqlite3PagerMovepage() return SQLITE_CORRUPT in that case. FossilOrigin-Name: b0d5cf40bba34e459caa7480bc84a1d75496c2ab52029f4bb0a31f2d9369a8ee --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 6 +++++- test/fuzzdata8.db | Bin 1021952 -> 1031168 bytes 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 95aabe0a74..35badc253c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\s32-bit\sinteger\soverflow\sin\sthe\s"showdb"\sutility\sprogram\swhen\nit\sis\strying\sto\sinterpret\sa\scorrupt\sdatabase\sfile. -D 2019-03-05T23:49:17.602 +C Add\san\s"||\sCORRUPT_DB"\sterm\sto\san\sassert()\sthat\smight\sbe\sfalse\sif\sthe\sdatabase\nis\scorrupt.\s\sAlso\sadd\sa\sbranch\sto\shave\ssqlite3PagerMovepage()\sreturn\nSQLITE_CORRUPT\sin\sthat\scase. +D 2019-03-06T14:08:41.132 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -502,7 +502,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 2b9604eb5c12f40a0613e832b6267f5814f84479d570d482ba6f98d7affa7c1c F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 5ff85a1dafdbbc3d27e21dbb52ac02066507b1e2d7da4cd4961408eed2cce23a +F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee @@ -993,7 +993,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 7b04dfb4e2e28f7174d0b83920ee564ebb5261e23f0b843c383a7868788a300c -F test/fuzzdata8.db bcdd2175b8876c3679aa1c00874a9f69368f464e498f800d3917bd74a0563127 +F test/fuzzdata8.db f6906d0e04c050e661272aba5f82cf35eb232e25493850bba5a5f339dddb7327 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1806,7 +1806,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 38d2e510cdedf38153466b161c0842b1604aef7b5589c51f628ae7cbb6a8722a -R 5f08c12dd4cf8ba7c214856356c2450a +P 3803e750384ec37091b0a6c350f8ef67720e316fd6f74c95e3c5f231c4a01ceb +R 5ce5e7502772fd8fb0367a42a020f65d U drh -Z fa7715e4b91d1f3064235b4ac30911e1 +Z e5a870506571dc7c7e8d899a4f9fe623 diff --git a/manifest.uuid b/manifest.uuid index 3ba75e5ce1..84f7877ee1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3803e750384ec37091b0a6c350f8ef67720e316fd6f74c95e3c5f231c4a01ceb \ No newline at end of file +b0d5cf40bba34e459caa7480bc84a1d75496c2ab52029f4bb0a31f2d9369a8ee \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 9dd3dfe007..24c7a2d569 100644 --- a/src/pager.c +++ b/src/pager.c @@ -7177,8 +7177,12 @@ int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){ */ pPg->flags &= ~PGHDR_NEED_SYNC; pPgOld = sqlite3PagerLookup(pPager, pgno); - assert( !pPgOld || pPgOld->nRef==1 ); + assert( !pPgOld || pPgOld->nRef==1 || CORRUPT_DB ); if( pPgOld ){ + if( pPgOld->nRef>1 ){ + sqlite3PagerUnrefNotNull(pPgOld); + return SQLITE_CORRUPT_BKPT; + } pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); if( pPager->tempFile ){ /* Do not discard pages from an in-memory database since we might diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 230960b9d9e2b144b800e203900d61bce23e5e56..7f0897dec5d8e0682caf7b3d5505e4c12d82d870 100644 GIT binary patch delta 23668 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 delta 16742 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 Date: Wed, 6 Mar 2019 14:53:27 +0000 Subject: [PATCH 301/306] Add the sqlite3_stmt_isexplain() interface. FossilOrigin-Name: ee642d3e2775ba4c73627ac71d0abf7a0f7a4ab3151d88e0076e9992f4814983 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/shell.c.in | 9 +++------ src/sqlite.h.in | 12 ++++++++++++ src/test1.c | 28 ++++++++++++++++++++++++++++ src/vdbeapi.c | 8 ++++++++ test/capi3d.test | 22 +++++++++++++++++++++- 7 files changed, 83 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 35badc253c..cfd839cd02 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\s"||\sCORRUPT_DB"\sterm\sto\san\sassert()\sthat\smight\sbe\sfalse\sif\sthe\sdatabase\nis\scorrupt.\s\sAlso\sadd\sa\sbranch\sto\shave\ssqlite3PagerMovepage()\sreturn\nSQLITE_CORRUPT\sin\sthat\scase. -D 2019-03-06T14:08:41.132 +C Add\sthe\ssqlite3_stmt_isexplain()\sinterface. +D 2019-03-06T14:53:27.483 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -516,8 +516,8 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9263f5c30dd44c7ac2eb29f40a7ec64322a96885b71c00de6bc30b756c2e1c49 -F src/shell.c.in 249c0bf34f7ce272cb17162c297c45ab674a52a5d85193a86191f131196de47f -F src/sqlite.h.in f19f7b7646ccd331511b123e2e23d4dc3f3d02f74e1c04d2bb560ea50a323e4c +F src/shell.c.in 01c0cc01391d00d247fdf640052d38c267fc16d975bc4f3154a02277c232dbeb +F src/sqlite.h.in 02be315feaf20c06028aacf3b032b5e7211e9aae066284eef77b081646b43ea0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d0b @@ -525,7 +525,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c 353b066e7ec761c4c715c1c20b888e0e7a0b0c0eda7f68c110e032d63713cade +F src/test1.c cfb303eeddd3670409af6b58d2ddb928b8e9e70822d681d3df88dfaabb7bea6a F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6 @@ -589,7 +589,7 @@ F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca F src/vdbe.c f1e7b5320df80ff58c67176e35cb48062cbda2a9c9811f11db5faa48071d3fe4 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f -F src/vdbeapi.c 0eb687d3287d6ab45661f7ffcabbda6f345713e800ef0f29053597933ca2a0bf +F src/vdbeapi.c 7a052df80d7e2e55382076174633e888f21fe200feb5d49b1b441b4c38ab851a F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 3e89e087df928eba80e520824078dc563c579a0848b1557ac36845ec14392923 @@ -713,7 +713,7 @@ F test/capi2.test 34a1a9a96d543a2ec2c209696b11b164444f57253b1f2cba1c2e53fadede6c F test/capi3.test 3910a73c38ac76d69778dd9eb481ab7cd6ed59117fc047b4f6056a5c72529de1 F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b -F test/capi3d.test 485048dc5cd07bc68011e4917ad035ad6047ab82 +F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 5ceb920718d280b61163500a7d29e0e0a86458b1cbd92d96f962c9d970aa3857 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef @@ -1806,7 +1806,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 3803e750384ec37091b0a6c350f8ef67720e316fd6f74c95e3c5f231c4a01ceb -R 5ce5e7502772fd8fb0367a42a020f65d +P b0d5cf40bba34e459caa7480bc84a1d75496c2ab52029f4bb0a31f2d9369a8ee +R f7bdcd8bffdce5eed151de0a075f21b3 U drh -Z e5a870506571dc7c7e8d899a4f9fe623 +Z f31ea26ece43f3a0263dc6076fee4b21 diff --git a/manifest.uuid b/manifest.uuid index 84f7877ee1..183908f8ff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b0d5cf40bba34e459caa7480bc84a1d75496c2ab52029f4bb0a31f2d9369a8ee \ No newline at end of file +ee642d3e2775ba4c73627ac71d0abf7a0f7a4ab3151d88e0076e9992f4814983 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index df81c2e99c..d4c24eac85 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3058,7 +3058,7 @@ static int shell_exec( } /* Show the EXPLAIN QUERY PLAN if .eqp is on */ - if( pArg && pArg->autoEQP && sqlite3_strlike("EXPLAIN%",zStmtSql,0)!=0 ){ + if( pArg && pArg->autoEQP && sqlite3_stmt_isexplain(pStmt)==0 ){ sqlite3_stmt *pExplain; char *zEQP; int triggerEQP = 0; @@ -3107,13 +3107,10 @@ static int shell_exec( if( pArg ){ pArg->cMode = pArg->mode; if( pArg->autoExplain ){ - if( sqlite3_column_count(pStmt)==8 - && sqlite3_strlike("EXPLAIN%", zStmtSql,0)==0 - ){ + if( sqlite3_stmt_isexplain(pStmt)==1 ){ pArg->cMode = MODE_Explain; } - if( sqlite3_column_count(pStmt)==4 - && sqlite3_strlike("EXPLAIN QUERY PLAN%", zStmtSql,0)==0 ){ + if( sqlite3_stmt_isexplain(pStmt)==2 ){ pArg->cMode = MODE_EQP; } } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 21382be201..848b2bc3c9 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3894,6 +3894,18 @@ const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); */ int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); +/* +** CAPI3REF: Query The EXPLAIN Setting For A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_isexplain(S) interface returns 1 if the +** prepared statement S is an EXPLAIN statement, or 2 if the +** statement S is an EXPLAIN QUERY PLAN. +** ^The sqlite3_stmt_isexplain(S) interface returns 0 if S is +** an ordinary statement or a NULL pointer. +*/ +int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); + /* ** CAPI3REF: Determine If A Prepared Statement Has Been Reset ** METHOD: sqlite3_stmt diff --git a/src/test1.c b/src/test1.c index d8a0c8642f..bd288a2b78 100644 --- a/src/test1.c +++ b/src/test1.c @@ -2674,6 +2674,33 @@ static int SQLITE_TCLAPI test_stmt_readonly( return TCL_OK; } +/* +** Usage: sqlite3_stmt_isexplain STMT +** +** Return 1, 2, or 0 respectively if STMT is an EXPLAIN statement, an +** EXPLAIN QUERY PLAN statement or an ordinary statement or NULL pointer. +*/ +static int SQLITE_TCLAPI test_stmt_isexplain( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3_stmt *pStmt; + int rc; + + if( objc!=2 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetStringFromObj(objv[0], 0), " STMT", 0); + return TCL_ERROR; + } + + if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; + rc = sqlite3_stmt_isexplain(pStmt); + Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); + return TCL_OK; +} + /* ** Usage: sqlite3_stmt_busy STMT ** @@ -7840,6 +7867,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ #endif { "sqlite3_next_stmt", test_next_stmt ,0 }, { "sqlite3_stmt_readonly", test_stmt_readonly ,0 }, + { "sqlite3_stmt_isexplain", test_stmt_isexplain,0 }, { "sqlite3_stmt_busy", test_stmt_busy ,0 }, { "uses_stmt_journal", uses_stmt_journal ,0 }, diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 2aa93e60a7..82138258a9 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1608,6 +1608,14 @@ int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){ return pStmt ? ((Vdbe*)pStmt)->readOnly : 1; } +/* +** Return 1 if the statement is an EXPLAIN and return 2 if the +** statement is an EXPLAIN QUERY PLAN +*/ +int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ + return pStmt ? ((Vdbe*)pStmt)->explain : 0; +} + /* ** Return true if the prepared statement is in need of being reset. */ diff --git a/test/capi3d.test b/test/capi3d.test index 3b9b8375d1..b56d7929b0 100644 --- a/test/capi3d.test +++ b/test/capi3d.test @@ -115,10 +115,30 @@ ifcapable wal { test_is_readonly capi3d-2.8 {PRAGMA application_id=1234} 0 test_is_readonly capi3d-2.9 {VACUUM} 0 test_is_readonly capi3d-2.10 {PRAGMA integrity_check} 1 -do_test capi3-2.99 { +do_test capi3-2.49 { sqlite3_stmt_readonly 0 } 1 + +# Tests for the is-explain interface. +# +proc test_is_explain {testname sql truth} { + do_test $testname [format { + set DB [sqlite3_connection_pointer db] + set STMT [sqlite3_prepare $DB {%s} -1 TAIL] + set rc [sqlite3_stmt_isexplain $STMT] + sqlite3_finalize $STMT + set rc + } $sql] $truth +} + +test_is_explain capi3d-2.51 {SELECT * FROM sqlite_master} 0 +test_is_explain capi3d-2.52 { explain SELECT * FROM sqlite_master} 1 +test_is_explain capi3d-2.53 { Explain Query Plan select * FROM sqlite_master} 2 +do_test capi3-2.99 { + sqlite3_stmt_isexplain 0 +} 0 + # Tests for sqlite3_stmt_busy # do_test capi3d-3.1 { From 9a518843f5945fb2e985ef568631694c743f0feb Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Mar 2019 01:52:30 +0000 Subject: [PATCH 302/306] Detect an attempt to drop a btree that is not within the bounds of the database file and abort early with an SQLITE_CORRUPT error, to avoid problems later on in the process. FossilOrigin-Name: 235a9698f5e9b3c21dc51c9c5042becfb82fc1762a7519a46b9f9fdafe9b0f13 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index cfd839cd02..a2bb8e839b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3_stmt_isexplain()\sinterface. -D 2019-03-06T14:53:27.483 +C Detect\san\sattempt\sto\sdrop\sa\sbtree\sthat\sis\snot\swithin\sthe\sbounds\sof\sthe\ndatabase\sfile\sand\sabort\searly\swith\san\sSQLITE_CORRUPT\serror,\sto\savoid\nproblems\slater\son\sin\sthe\sprocess. +D 2019-03-08T01:52:30.651 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -456,7 +456,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 7da25dbf427e7ad5d36b78541cf33b9cba2d3f9d02ad5ab41777770aa3396f6f +F src/btree.c 9abc4326303d6f5df9b9de07c753b226d4b7e75b8d3cf94262297c3b87b45b0a F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 3acec29b23948042173301a8befebae01a98344debf66cbd4467c8b9077707b8 @@ -1806,7 +1806,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 b0d5cf40bba34e459caa7480bc84a1d75496c2ab52029f4bb0a31f2d9369a8ee -R f7bdcd8bffdce5eed151de0a075f21b3 +P ee642d3e2775ba4c73627ac71d0abf7a0f7a4ab3151d88e0076e9992f4814983 +R 404aa454c620c1b37b76e59f8936c8c2 U drh -Z f31ea26ece43f3a0263dc6076fee4b21 +Z 3fa1a0dfc55d9ca0db2a4e1013622b98 diff --git a/manifest.uuid b/manifest.uuid index 183908f8ff..81035d51a2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ee642d3e2775ba4c73627ac71d0abf7a0f7a4ab3151d88e0076e9992f4814983 \ No newline at end of file +235a9698f5e9b3c21dc51c9c5042becfb82fc1762a7519a46b9f9fdafe9b0f13 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index ac03ec1430..6b237b4146 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9268,6 +9268,9 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ assert( sqlite3BtreeHoldsMutex(p) ); assert( p->inTrans==TRANS_WRITE ); assert( iTable>=2 ); + if( iTable>btreePagecount(pBt) ){ + return SQLITE_CORRUPT_BKPT; + } rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); if( rc ) return rc; From 66b8457c7cf35388164ea404e7d448b464dfd8f6 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 8 Mar 2019 13:27:27 +0000 Subject: [PATCH 303/306] Fix another segfault in fts3 that could occur with corrupt records. FossilOrigin-Name: fcc24edde471c2214add2dbc3a27da8890a7148105c5ffa024faf72457964a5f --- ext/fts3/fts3.c | 2 +- manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 218 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 228 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index bd0003d063..b357fcd421 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -1873,7 +1873,7 @@ static int fts3ScanInteriorNode( zCsr += fts3GetVarint32(zCsr, &nSuffix); assert( nPrefix>=0 && nSuffix>=0 ); - if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr ){ + if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr || nSuffix==0 ){ rc = FTS_CORRUPT_VTAB; goto finish_scan; } diff --git a/manifest b/manifest index a2bb8e839b..a492e20a9b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Detect\san\sattempt\sto\sdrop\sa\sbtree\sthat\sis\snot\swithin\sthe\sbounds\sof\sthe\ndatabase\sfile\sand\sabort\searly\swith\san\sSQLITE_CORRUPT\serror,\sto\savoid\nproblems\slater\son\sin\sthe\sprocess. -D 2019-03-08T01:52:30.651 +C Fix\sanother\ssegfault\sin\sfts3\sthat\scould\soccur\swith\scorrupt\srecords. +D 2019-03-08T13:27:27.101 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -80,7 +80,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 5da1329ccf66b6d597dfb16b1f81aa204133c1ec96117d82a59c20126f483b17 +F ext/fts3/fts3.c 33958a8c05a6c22bf559fedb1176ad1f313a7b42ccf5f0c0bcc8a88609e58d60 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 @@ -919,7 +919,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 3f2b9abb5b2fcabb51da09a5956c292e8fc2bf2c27e1f2b86f313e8e232b5bff +F test/fts3corrupt4.test af68ede153cbeff7309f7da2f9d8fd12a01f7e1debb03eb748c302079ac5ae05 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1806,7 +1806,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 ee642d3e2775ba4c73627ac71d0abf7a0f7a4ab3151d88e0076e9992f4814983 -R 404aa454c620c1b37b76e59f8936c8c2 -U drh -Z 3fa1a0dfc55d9ca0db2a4e1013622b98 +P 235a9698f5e9b3c21dc51c9c5042becfb82fc1762a7519a46b9f9fdafe9b0f13 +R 734a9708c695aee16b6fde3fd3f50b66 +U dan +Z 98c784e94dcbc34d08f05edd66ffaae5 diff --git a/manifest.uuid b/manifest.uuid index 81035d51a2..5e3b296dba 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -235a9698f5e9b3c21dc51c9c5042becfb82fc1762a7519a46b9f9fdafe9b0f13 \ No newline at end of file +fcc24edde471c2214add2dbc3a27da8890a7148105c5ffa024faf72457964a5f \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 27b42cb965..12a3dfa0aa 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -3697,5 +3697,223 @@ do_catchsql_test 22.1 { FROM t1 WHERE a MATCH 'rtree OR json1rtree OR json1'; } {0 {0 0 0 0 0 0 0}} +#------------------------------------------------------------------------- +reset_db +do_test 23.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-670b15f2955a36.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 10 00 00 01 00 00 00 07 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 67 64 69 72 egdir_1t1_segdir +| 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 75 74 31 5f 73 65 67 6d 65 6e ..tablut1_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 42 20 50 52 49 4d 41 52 59 INTEGEB 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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 01 0f d8 00 2f 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 5a fe 40 0e 24 0e 08 0d ef 0d d5 ...t.Z.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 81 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 00 00 00 00 .......x.W.>.... +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 10 .........?%..... +| 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 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 35 0f READSAFE=0.$..5. +| 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 55 00 25 0f 19 54 48 52 45 41 NARY.#U.%..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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 44 20 52 54 52 45 45 58 42 ..ENABLD 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 24 0f 17 45 4e 40 42 4c 45 20 52 54 52 ...$..EN@BLE 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4d 41 42 4c NARY....)..EMABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 4c 45 E MEMSYS5XNOCALE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4e 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 NSYS5XRTRIM....% +| 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 5f b9 4d 1a 12 05 00 29 0f 19 45 N1XRT_.M....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 31 4c 59 58 42 49 NABLE GEOP1LYXBI +| 3616: 4e 41 52 58 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARX....)..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 57 45 ....)..ENABLE WE +| 3664: 4f 50 4f 4c 59 48 52 54 52 49 4d 17 0f 05 00 23 OPOLYHRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 53 59 17 0e 05 00 23 0f 19 45 4e 40 42 4b NASY....#..EN@BK +| 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 94 34 58 42 49 4e 41 52 59 17 0b LE FT.4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 43 70 46 54 53 34 ..#..ENABLCpFTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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 32 53 ...1..ENABLE D2S +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 0b 27 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 03 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 35 52 3d 67 ...C..COMPIL5R=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 26 01 05 00 43 0f 02 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 00 00 00 00 00 0 20160609X..... +| 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 08 55 1a .%....0000000.U. +| 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 61 75 .dbstat.%....eau +| 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 0c 97 63 63 03 25 03 00 01 .5.%.....cc.%... +| 3136: 06 65 6f 70 6f 6c 7a 03 25 11 00 00 05 6a 73 6f .eopolz.%....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 3d f0 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 09 08 17 8d 12 30 20 38 33 37 e3 aa e0 ........0 837... +| 3264: 12 d1 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 49 09 01 07 .....2016060I... +| 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 01 f0 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 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 f3 01 03 00 01 03 00 19 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 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 00 f3 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 46 01 02 02 00 00 ..........F..... +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 64 65 09 19 03 00 01 03 00 01 03 00 .rtrde.......... +| 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 01 ff 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 02 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 09 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 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 71 97 65 3d 35 0d 04 02 23 6d 65 72 67 65 meq.e=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 00 00 00 00 00 00 00 00 00 00 00 00 00 ity............. +| end crash-670b15f2955a36.db +}]} {} + +do_catchsql_test 23.1 { + SELECT 'FyzLy'FROM t1 WHERE t1 MATCH 'j'; +} {1 {database disk image is malformed}} + finish_test From 4b986b2a47cd3174382c66448fde87da21b9bc74 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Mar 2019 14:02:11 +0000 Subject: [PATCH 304/306] Patch makes balance_nonroot() slightly smaller and faster and more robust against corrupt databases. FossilOrigin-Name: 174da3c32c9caebd642c31cb594597ccd5bb2a7fc501b1f49aef0b7b4765bfca --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 5 +++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index a492e20a9b..80e6375040 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\ssegfault\sin\sfts3\sthat\scould\soccur\swith\scorrupt\srecords. -D 2019-03-08T13:27:27.101 +C Patch\smakes\sbalance_nonroot()\sslightly\ssmaller\sand\sfaster\sand\smore\srobust\nagainst\scorrupt\sdatabases. +D 2019-03-08T14:02:11.570 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -456,7 +456,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 9abc4326303d6f5df9b9de07c753b226d4b7e75b8d3cf94262297c3b87b45b0a +F src/btree.c 51ff9c432f55f7fb8dca32d96707bc191327c1e29b1b83769d3ff6486df3948b F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 3acec29b23948042173301a8befebae01a98344debf66cbd4467c8b9077707b8 @@ -1806,7 +1806,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 235a9698f5e9b3c21dc51c9c5042becfb82fc1762a7519a46b9f9fdafe9b0f13 -R 734a9708c695aee16b6fde3fd3f50b66 -U dan -Z 98c784e94dcbc34d08f05edd66ffaae5 +P fcc24edde471c2214add2dbc3a27da8890a7148105c5ffa024faf72457964a5f +R 46c774c6d7b16c2d77d5ef217f16ae20 +U drh +Z aaf2befc3ba47077920e380e99d434ba diff --git a/manifest.uuid b/manifest.uuid index 5e3b296dba..0a56a2dec7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fcc24edde471c2214add2dbc3a27da8890a7148105c5ffa024faf72457964a5f \ No newline at end of file +174da3c32c9caebd642c31cb594597ccd5bb2a7fc501b1f49aef0b7b4765bfca \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 6b237b4146..03451cf309 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7152,8 +7152,9 @@ static int editPage( int iCell = (iOld + pPg->aiOvfl[i]) - iNew; if( iCell>=0 && iCellaCellIdx[iCell * 2]; - assert( nCell>=iCell ); - memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); + if( nCell>iCell ){ + memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); + } nCell++; if( pageInsertArray( pPg, pBegin, &pData, pCellptr, From bcf1f41a62808f74a318f921aae28b2ff4f03712 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Mar 2019 14:07:15 +0000 Subject: [PATCH 305/306] Add new test cases in test/fuzzdata8.db FossilOrigin-Name: 97bdc090f30610cc5dd29101452d1647550387f9c6f742e50f1e07c3cf68a147 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1031168 -> 1040384 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 80e6375040..867f00809c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Patch\smakes\sbalance_nonroot()\sslightly\ssmaller\sand\sfaster\sand\smore\srobust\nagainst\scorrupt\sdatabases. -D 2019-03-08T14:02:11.570 +C Add\snew\stest\scases\sin\stest/fuzzdata8.db +D 2019-03-08T14:07:15.140 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -993,7 +993,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 7b04dfb4e2e28f7174d0b83920ee564ebb5261e23f0b843c383a7868788a300c -F test/fuzzdata8.db f6906d0e04c050e661272aba5f82cf35eb232e25493850bba5a5f339dddb7327 +F test/fuzzdata8.db 7078218ccbb313302199c83e08df28970685d0b6ad21e2c4d02c4df6453ca3af F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1806,7 +1806,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 fcc24edde471c2214add2dbc3a27da8890a7148105c5ffa024faf72457964a5f -R 46c774c6d7b16c2d77d5ef217f16ae20 +P 174da3c32c9caebd642c31cb594597ccd5bb2a7fc501b1f49aef0b7b4765bfca +R ad8e3579c2cae43b005671c858b5c8da U drh -Z aaf2befc3ba47077920e380e99d434ba +Z 7c4c442c34b6395bc654161f597d6654 diff --git a/manifest.uuid b/manifest.uuid index 0a56a2dec7..6f5c8a7a1e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -174da3c32c9caebd642c31cb594597ccd5bb2a7fc501b1f49aef0b7b4765bfca \ No newline at end of file +97bdc090f30610cc5dd29101452d1647550387f9c6f742e50f1e07c3cf68a147 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 7f0897dec5d8e0682caf7b3d5505e4c12d82d870..2e9ce288114d2ce6d2f14c82c0fc7d461626b02a 100644 GIT binary patch delta 16177 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 F{|7|iQG@^h delta 15403 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 SVqlhw3Qw_9twr|t-~AulgkR49 From 281ee2f754073c6ad6c7b09bd2d251f6e5d83caa Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Mar 2019 15:39:24 +0000 Subject: [PATCH 306/306] Add the bgckpt.c extension to Makefile.in and Makefile.msc. FossilOrigin-Name: 3712d625d625f962c627c74222467ad4858be46feda570449f9cb640549c9ddd --- Makefile.in | 1 + Makefile.msc | 1 + manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Makefile.in b/Makefile.in index 3d9a566505..3619393f1f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -437,6 +437,7 @@ TESTSRC += \ $(TOP)/ext/expert/sqlite3expert.c \ $(TOP)/ext/expert/test_expert.c \ $(TOP)/ext/misc/amatch.c \ + $(TOP)/ext/misc/bgckpt.c \ $(TOP)/ext/misc/carray.c \ $(TOP)/ext/misc/closure.c \ $(TOP)/ext/misc/csv.c \ diff --git a/Makefile.msc b/Makefile.msc index 179215ecf4..a414b73e27 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1512,6 +1512,7 @@ TESTEXT = \ $(TOP)\ext\expert\sqlite3expert.c \ $(TOP)\ext\expert\test_expert.c \ $(TOP)\ext\misc\amatch.c \ + $(TOP)\ext\misc\bgckpt.c \ $(TOP)\ext\misc\carray.c \ $(TOP)\ext\misc\closure.c \ $(TOP)\ext\misc\csv.c \ diff --git a/manifest b/manifest index 6af6923c47..22a5c5e789 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,10 @@ -C Add\snew\sfile\sdoc/wal2.md\sto\sthis\sbranch. -D 2019-01-11T14:58:03.764 +C Add\sthe\sbgckpt.c\sextension\sto\sMakefile.in\sand\sMakefile.msc. +D 2019-03-08T15:39:24.036 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 +F Makefile.in 903e48404f86dea5701c47f326933e4c846f68f35b22ecd349bddba80bbf8a94 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc 3c4c7e94419ff28cb68850188c9d153b343aed4c5ebed5965426232ed67ff9d9 +F Makefile.msc 366f2446655bc49eabcfb1a042e1e3d317fd05441f36ab9ddc0ad16e46de2388 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee F VERSION 453e2f4529ca208196d5567db28d549d7151f79efd33f6e6cfe6e613e583a0be F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1807,7 +1807,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 8445fb6d5dae98a0129514a10a15f08412bac5a1d8114b12e592c744ea2bc4c9 -R 4b991801ac5f384be1f414fb71a05937 -U dan -Z 736399187a1b654bff250254a2a37532 +P b495dce153f7f886f3dba09593f29ce2375718bf6508f2cfffd1af8071a995ae +R 097e453c6dbf0709087c24fac1c6c3b8 +U drh +Z 49a629fd05fa20141267e72d5e7eee4a diff --git a/manifest.uuid b/manifest.uuid index 1695a54411..c6932ae30e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b495dce153f7f886f3dba09593f29ce2375718bf6508f2cfffd1af8071a995ae \ No newline at end of file +3712d625d625f962c627c74222467ad4858be46feda570449f9cb640549c9ddd \ No newline at end of file

    D(Wojv2jF2{|4 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 CYiD@? delta 454850 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

    The SQLITE_CONFIG_MEMDB_MAXSIZE option accepts a single parameter +** [sqlite3_int64] parameter which is the default maximum size for an in-memory +** database created using [sqlite3_deserialize()]. This default maximum +** size can be adjusted up or down for individual databases using the +** [SQLITE_FCNTL_SIZE_LIMIT] [sqlite3_file_control|file-control]. If this +** configuration setting is never used, then the default maximum is determined +** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that +** compile-time option is not set, then the default maximum is 1073741824. ** */ #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ @@ -2012,6 +2023,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ #define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ #define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ +#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ /* ** CAPI3REF: Database Connection Configuration Options diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b67b3ed76f..e8211a1429 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3428,6 +3428,9 @@ struct Sqlite3Config { void (*xVdbeBranch)(void*,unsigned iSrcLine,u8 eThis,u8 eMx); /* Callback */ void *pVdbeBranchArg; /* 1st argument */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + sqlite3_int64 mxMemdbSize; /* Default max memdb size */ +#endif #ifndef SQLITE_UNTESTABLE int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif From 3bf0d7a8813a7e40f1ad37e10cad744bfd295e74 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 31 Jan 2019 16:09:48 +0000 Subject: [PATCH 177/306] Remove an incorrect assert() from the deserialize in-memory database VFS. FossilOrigin-Name: 80151d7e3b9fd84086874a1cebed024b9e14005ea2d0108cf6efcd07373fcf51 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/memdb.c | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 3c928c24a6..4e741e4dbb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_CONFIG_MEMDB_MAXSIZE\sconfiguration\soption\sfor\sconfiguring\nthe\sdefault\smaximum\ssize\sof\san\sin-memory\sdatabase\screated\susing\nsqlite3_deserialize().\s\sThis\sis\snecessary\sto\smake\sthe\sinterface\sreasonably\ntestable. -D 2019-01-31T15:38:53.697 +C Remove\san\sincorrect\sassert()\sfrom\sthe\sdeserialize\sin-memory\sdatabase\sVFS. +D 2019-01-31T16:09:48.204 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -485,7 +485,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 8689716299074d1016144af05f46ddb8971621f8b589a5af95455cfe09ba35e2 +F src/memdb.c 02a5fcec19b9d40dd449ca802dc1b2e8f93f255fbf2a886277a3c3800d8d35db F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661 F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81 F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604 @@ -1804,7 +1804,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 b80119bd6044c0993210115732b6ae7b4b0b29c1471b0723bef24f2052c8e671 -R 237af9b2bf342542efd55a7bfd4e7366 +P cb72ee0478ce98c48aae059fd5de4e36caf2b8c953e08fcb799bfd119ad46b73 +R 2569208d78dccb53d8326cd647042bdb U drh -Z e1a3e36fa751023ea67754db7a2638ca +Z 3a4e20499e1eb5738b12978068d03b4a diff --git a/manifest.uuid b/manifest.uuid index 3a8b470098..778c2c7860 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb72ee0478ce98c48aae059fd5de4e36caf2b8c953e08fcb799bfd119ad46b73 \ No newline at end of file +80151d7e3b9fd84086874a1cebed024b9e14005ea2d0108cf6efcd07373fcf51 \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index 9252164a69..2ddecae725 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -306,7 +306,6 @@ static int memdbFetch( ){ MemFile *p = (MemFile *)pFile; if( iOfst+iAmt>p->sz ){ - assert( CORRUPT_DB ); *pp = 0; }else{ p->nMmap++; From abd7449478c7a1ed47de9b86e8bdac04ebd5e235 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 1 Feb 2019 13:34:00 +0000 Subject: [PATCH 178/306] Fix another corrupt-database-handling problem in fts5. FossilOrigin-Name: 9876ae1b802a449aacbbdd42778653edc19e29315dc627c23ab7493d6492c800 --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5corrupt3.test | 131 +++++++++++++++++++++++++++++++- manifest | 16 ++-- manifest.uuid | 2 +- 4 files changed, 140 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index bb87714916..a9c0a1a42e 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -2326,7 +2326,7 @@ static void fts5LeafSeek( search_success: pIter->iLeafOffset = iOff + nNew; - if( pIter->iLeafOffset>n ){ + if( pIter->iLeafOffset>n || nNew<1 ){ p->rc = FTS5_CORRUPT; return; } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 23340529fa..4eae9ad1f3 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -2429,7 +2429,7 @@ do_test 24.0 { do_catchsql_test 24.1 { UPDATE t1 SET b=quote(zeroblob(200)) WHERE a MATCH 'thread*'; -} {0 {}} +} {1 {database disk image is malformed}} do_catchsql_test 24.2 { INSERT INTO t1(t1) VALUES('integrity-check'); @@ -6771,6 +6771,135 @@ do_catchsql_test 49.1 { SELECT term FROM t4 WHERE term LIKE 'oase'; } {1 {database disk image is malformed}} +#-------------------------------------------------------------------------- +reset_db +do_test 50.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-695bce8a3e107c.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 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 20 68 20 69 0d 00 00 00 03 0f e8 ...t. h i....... +| 3904: 00 0f f8 0f f0 0f e8 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 00 ................ +| 4080: 60 20 30 d6 20 30 00 30 60 10 30 01 20 30 00 30 ` 0. 0.0`.0. 0.0 +| page 6 offset 20480 +| 0: a0 00 00 00 10 ff 40 00 ff 00 00 00 00 00 00 00 ......@......... +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 00 00 00 00 00 00 00 00 00 11 87 89 06 26 ...............& +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 44 00 06 06 07 01 03 00 14 03 09 09 09 0f ..D............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 9d 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-695bce8a3e107c.db +}]} {} + +do_catchsql_test 50.1 { + SELECT term FROM t4 WHERE term LIKE '»as'; +} {1 {database disk image is malformed}} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 4e741e4dbb..b69535b73c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sincorrect\sassert()\sfrom\sthe\sdeserialize\sin-memory\sdatabase\sVFS. -D 2019-01-31T16:09:48.204 +C Fix\sanother\scorrupt-database-handling\sproblem\sin\sfts5. +D 2019-02-01T13:34:00.988 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c a5cc612c8bbba37cbf72e820f7c6f14f8dbe6868c79141c712aead8a39b0e960 +F ext/fts5/fts5_index.c 9e9607d921d8a988f318b9a7d6d3cf5c6ad0fe8d9ff03bf3a3e92c108b23caba F ext/fts5/fts5_main.c 2395658479bca37d0936d47e6194ef575e5e7235ded47fa93bd9d5bb8035b977 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 08792647bc39a25b0d41c6030752ca85709a41eaba1b300920dc183d03960ede +F ext/fts5/test/fts5corrupt3.test 42fbf72c0e014195bdba698abcfe0cdd08bb194d1b86495ed74d77077efd3163 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 cb72ee0478ce98c48aae059fd5de4e36caf2b8c953e08fcb799bfd119ad46b73 -R 2569208d78dccb53d8326cd647042bdb -U drh -Z 3a4e20499e1eb5738b12978068d03b4a +P 80151d7e3b9fd84086874a1cebed024b9e14005ea2d0108cf6efcd07373fcf51 +R 1a3ed3898bab21d94f592d43aba92154 +U dan +Z 04cd55989ead0c3a07d5b8a7807d30ea diff --git a/manifest.uuid b/manifest.uuid index 778c2c7860..37cd2443b9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -80151d7e3b9fd84086874a1cebed024b9e14005ea2d0108cf6efcd07373fcf51 \ No newline at end of file +9876ae1b802a449aacbbdd42778653edc19e29315dc627c23ab7493d6492c800 \ No newline at end of file From 1c7d389a2304cb6d02561b9028488346b3c6f04a Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 1 Feb 2019 14:40:44 +0000 Subject: [PATCH 179/306] Fix an assert() in fts5 that could fail if the database is corrupt. FossilOrigin-Name: 55f06aa3f890dc1dc5c2ed0e6777e46d609a6f9d223d1d4b5813097ce4f4e797 --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5corrupt3.test | 72 +++++++++++++++++++++++++++++++++ manifest | 14 +++---- manifest.uuid | 2 +- 4 files changed, 81 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index a9c0a1a42e..202f9eb6a0 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5001,7 +5001,7 @@ static void fts5MergePrefixLists( sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); if( iPos1<0 ) break; }else{ - assert( iPos2!=iPrev ); + assert_nc( iPos2!=iPrev ); sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2); if( iPos2<0 ) break; diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 4eae9ad1f3..a9aec0b05a 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -6901,6 +6901,78 @@ do_catchsql_test 50.1 { SELECT term FROM t4 WHERE term LIKE '»as'; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 51.1 { +BEGIN TRANSACTION; +PRAGMA writable_schema=ON; +CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); +CREATE TABLE IF NOT EXISTS 't1_data'(id INTEGER PRIMARY KEY, block BLOB); +REPLACE INTO t1_data VALUES(1,X'2eb1182424'); +REPLACE INTO t1_data VALUES(10,X'000000000102080002010101020107'); +INSERT INTO t1_data VALUES(137438953473,X'0000032b0230300102060102060102061f0203010203010203010832303136303630390102070102070102070101340102050102050102050101350102040102040102040207303030303030301c023d010204010204010662696e6172790306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020108636f6d70696c657201020201020201020201066462737461740702030102030102030204656275670402020102020102020107656e61626c6507020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020202087874656e73696f6e1f02040102040102040104667473340a02030102030102030401350d020301020301020301036763630102030102030102030206656f706f6c7910020301020301020301056a736f6e3113020301020301020301046c6f61641f020301020301020301036d61781c02020102020102020205656d6f72791c020301020301020304047379733516020301020301020301066e6f6361736502060102020306010202030601020213060102020306010202030601020203060102020306010202030601020203060102020306010202030601020201046f6d69741f0202010202010202010572747265651902030102030102030402696d010601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202010a7468726561647361666522020201020201020201047674616207020401020401020401017801060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102ad060101020106010102010601010201060101020106010101010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020415130c0c124413110f47130efc0e11100f0e100f440f1040150f'); +INSERT INTO t1_data VALUES(274877906945,X'00000e96023030011a042319320d3b123d812b5a31120110446e581b66814a05010a4537814274010e8102815c810f3d0104846d01081581204401103741043c59416b44010a404655265301103f73811a11114213010a821235820f020135030484320201360104816a020162020484550302390301710a04824a020166030483690201670704837d0201690404822602016a0504825c02026b620504817502016f0904810d0303e79c88060482760201700a04826302017204048155020373c2be050481130201770204846202027962050482710202c2ba010482140203e58496070483330204e8b2b879010483710101310110545c0c814b0e3a6501082c815d5b011a2a0e2f0d765c3d686014061d0d0112810733112c2e82141101048313010e5c6f632e813e42010c811882370548010e19158146822f1f01104d364a708146135a010a237b0a55210201610904841703027678090481270201620304810002026374060484660202657a0704827602016601048351090483540301660704814b02016b03025f0304c582caba0204816602016c01025f0302cebc0904843e02016e0804821802016f0a04817503016f070483100201720304822c020484380201740404842e0102460201770104812f0204836c02027a6f040483110202cebc02048267040161020484650205d5bd62cebc0604845b0204f2a580880204842a0206f38184a179670502750204f696a3aa0a04814601013201063330390110812281378114600d010c03716c5e822d010e81226b542a814d010a72740f83000108813a1e0b010c5681046f812c010c07814a777328011664244219531b1a2f811e4a010c4d81557c7f1b0201300704810702013307048230010484050202367807048175020239710804832502016204026b0204814d020363306108048262020265650504817602026667070483150201690704832f0301360a04814d02016c08024702016d0304843e0303cfb2630204814002016e0804837503016203048416030370c2be0304821b02016f0604834b0201700504816b030175070210020273660604841c020676c2bac2b2640604830a02017704027d02017808048141010482700201790504811d0202c2ba0502470206ca8d73ecbab9010483340204f09e9ab504048367010133010c3e04814f82250114812e814b2e0411811305010c811337811e6e010c82085e2b0e5d010c61812054811c01148122451b0781050c813d010c17823762643e011e080c1720814a10364306143b0d33260112810f0c2a810c816b13010a8163810e470201370404811102056176c2aa36050481530202646e0904846202026a730404827402016b0a020c02036f616b0404830a0201750504820d02017605025e0201770a04820702027a73050482460202c2ba0604824a020483330203cba434040483200203cebc790304847e01013401124181442c1d091f81580108601d8336011081320a2b8125820001123b0b81158116811f070110078112817a817308010e6682410d810e2601122d0d6413378147351e01105081021d3525812d01128246510a622204054101105c1b620e81302b05020130020483480104822702013102027e020132030483270201350304844802023770030207020261710604823f0201640802570204830a020265770304831f020168070483210201690204825b02016f020481280704835402057037e18b8d0904810802017304048439030172020481440303c2bd6b0a02630201760202490804815e0201770304816e050483550201780704816902017a070483280207c2b2f093aabc780a0482240301b303024e0301bc0604837a0202cb800204834a0202cebc04048201040484410203d3ad770a04814f0202d5a508048371010135011630817e0f81040d2c041552010c813d3b7e8115010c40692182693a01121f810d810d0a32814701101d1d1f642281742e01068229240110811231810a387f4c01100f50810f8165810d0114811f26443152593c104a010e641e1a3357820e020132030481540201340204815402023778040207020163060481020204815b020164020483010201670a0481540304f0948f870904811a0201690704835502016d0604832203027b01022803017a0a025102016e020484260404816002026f690502680301720104834e02017208024f02021d020475e69c8e0504814c0202767602025f0302de870a04837b020178090483200104835003026a72090484400201790504837204022302017a0104836b0202c2aa0a0481070303bcc2b3090484370203c7866403027501013601087c158303011212814305813e7b0e090118141a1c49713a211e0c74630f010a59826d8113011203328166037781561a01101d7f1d2a1f822533010e820e070f7b40160110811f40292c813226010a2d20824a32010a81418158670201300304840a0201660404817d02016d0804826902016e080626817f0104820b02016f0404825a02017003023b020272750804840c0301760a04844d02017403025b020175080484200202766e060482360303c2ba6c030482220202c2aa0204810e0301b20204835703048421040484240301bc0802410202d2a1010482630204e1b18f3704048354010137010c08816337812f01101382211532424d39010881248123010e7724810267815f011081236029813e273301101b7b29812a5b813b01128150810324814b220b01060c8417010e165b6c81708117010a1782346f6c0201380804816803016b0604840102013908023f0201610204816c0201630302760201640304832604023e0204833902016502048203020266770804821a0201670a04830002026964080484500304f29e9eb70802250201700204811b0201710904832d0201730304826b05048403020174010481000205776a62c2b2050482630201790202260206c2b2eaaeb464050485020301b3080482480303bac7af0a0484550203c695650804822a0202ceb90a0481170202dbae05023f010138011819814a2703390a61090c6912011a21181304812523811b5f164e050114110f35128123423f810c010c817573817c03010e7182590c812b0401142503597e6e0e2f3a3759011252813a811a2b75091a010882162a31010e17450a81048279010858658208020231670a048205020361c2b906023b02016301048236020164050482520201650904833d0201670904811b0201690604825002026a7a0604837c02016e0204832002017002026d0302c789010481020201720504835e0201740604810002017502020a0702630302676306025f0303e4a0a70102640203786a75010484440201790104841402047ac2be72070481340207c2ba3766673576090482790301bd07048142010481600202c7b309027a0401740604823b0202d2bf0304830f0204e989a6300a02600204f4bd91b60702120101390106518369010e19254641823711010c258267288121010e817c810d2b17250110810a578133812f4c0110415681067b288121010e0881208119347101140b8131543c8100343d1101088203813e01100d742e3230820f3802013006048107020134080481440202356501021a02013808048147020162020482230201630304833c030162050483390206656cf093b5bd070484140202677303048502020769e3ad9669c2b90304847402016b0804836402016c0404841f02016d010481250904825202016e06025402016f0704842a0201700a04834a0201720a0483530201750304822e020676f097b18374030482140201780604833d0202c2b9010481550301be070483720204826f0202ca80060481630202d5a80504833f0101610114551047810e130a78660c011a364611206c0b13080705733d5501240f08070c090b0c20813d1471042e4351131e011204412d814f0913104201263036110d060b1f811a301b0f4e1a29092f181c012808071e221a2a81075b320503065a0f140c1a0a26011c07231d0e6f3715063b760c6b091501121111303e3a71566d6d010e0867814d816a0c01181e18240d41724d221b3f384b0201300204830b060483080302c2b30204837f0201310a026e020134050481560301730902690201360406827c0f0201370204825d06020a0201390904815b0304f3bfb2a70a04822c0201610404810e020262660604841a03017608025b02016309088112825f020164090482310201650a0484480302396f01025d02026774010482090302df9b06048321020168070661813303016f03048248020169030483610504814001048401010483460301300704824203016a0204824402016a0504813303021d03017209048412030277380804824502016c0104814c02036ec2ba0804835702016f0204811d030176020238020270360a04840d02017107048201030469ca99690602350201720304812d0104845e02017304022c02017409022b020175050484140302caaf0402410201760404831f020177010484180704845203026f6d04024b02017a030482660202c2aa0204810a0301b30a04817b0302bd76020483780302be6a0302440202c58207025e0202c69901027a0302ad77010483200206c993f099b183070484270203caa1660204841a0204f29788ac0804831d0204f4ba9f950504843c010162011c0e33810216341c2413042130780501184d373e53131f2f052907423e010c830e3781390e011c1320461f81041b811b041e15243d011e241b10816c310b130c3133033b0741011a11816d3139100c13140b395848011c580e411a06304306810a3138330d011a441707092c70140c1643813920010c73653581374f010c826c81210f0402013803024f07048172020161020481650204810c020162030483470301370404813602016307048379020483280201640304815501048176010481060201650104812a0104841f0201660504821f0201670302700201680804846403016b0a04831d0301700904845502016908025c02016a010483560904827602026b6306023402016c0404832602016d040484410204825702016e0504831603027831020482160302c2be0504827d02026f6a05048121020171030232020483220304845402023a0201720204845c0304846e03013607048224020174060484480201780704844303016f0604814f045807070a0707070707080709070709070808090a5c07080708080b07060a06080707070b0a0b0808070b0a0b0a55070b08080a0908080707060709070709070706080c060b07070c0a66070b08080609070607080c0909660b06070707080a0807070b0b0707080a0b07070d0607080c0908630707070b07070a070d060b0707090a07080b080a070809085f0707070c0706080706070809080f06080a5807070607060e070807080907070b070b060c0709090807690808070707070708070608070709070809070a0d0b07070809095b070707070707070c080d07070b06070707070c07080b0808811a0b08060706080a070a07080609070707080808071307070a0708070907060807090b06060707070b0707080708070707080c090a0a81080a0b07070b0f0b0706070707060b07070b07080808110b070707'); +INSERT INTO t1_data VALUES(274877906946,X'00000e880330627a020482240202c2aa0a04833f0301b30704844b0302b9650704824f0301ba0204845f0202c9820a0483640202d194060482300203e19cbd0904844b0203e691b4050483510205e78dadde9b0104821201016301142a6c033b8151085c094601140b813d49313f81110e1c011681163611221527257f5d38011c150f22811a0a3c12350631238117011c3e26420b402c1d81080c40150b2f01181c3143382640273d60132e070118663b1d162a1b0e2e8111393e0110821117310e52811c01141a2f49810181391f2b130112323c0305812a6f2e390201320204842702023334020481340201350202610201360304844603023362040484470203376a360a04826b02013808026203016f0704830d02013902025502016106088170827a0301320a04820403016c0404831502016204048327050484030201630a04814302016401048349020484760302430301640204845d02016504048249020367c2bd07020a0302cebc0902150201680a02500201690204846102016a06024c0301770504842b02016b0104830e0704811803023370040483580301710404845f02016c0504844f0204820d0204837f0302c2aa0104833702016d0104844c02016e0804834f03026c6a07025702046fecbd9a01023a020270330204830a0301740304837c020271350204811e0201720706833b310206736ef09289b70104832b020174070483290301320204827c02017608022802017806025b0302c2b30904835202027978080483040303c9b56f0904846a0202c2aa04048127050482120301b30504813a0301b901024204016a0704840c0202c5820704823c0202c999010482470202cebc0602400203db91670602730202dca7050482760203e1a3950304817e0203e786a702048273010164011a0612105b292b817c1211080d5a01147c1d420b35451c36811a011e0e168117081c0c2e051d474055192d011e02050a1c81180420250f815f300f21011c02316a37143321443a10042d54230112761428810e4750054101101805072b8215294e0116680f0f5381445a3e0b070901224e4a41210c361c281b101c43051325130f01185a1e19108106300f2e3f4538020130060481370202327305022002013405048168020335377a03021802013704027b02013804048260020161030882118101030263650904814d0201620604822502016303048419030135090483240201640602280301380404817e0201650404823c0304f097ac9f010482680201660a0267030566e2b6936f0104821c0201680704813302016b0604832002016c01026a0301610204843202016d0804845e03026d6d03023c020270730a04817f0304c2be797a0804832e020271710504835f02017203021b0201740204825a02017706027202017805048451010683572e03016e0a04814c0201790304811702017a080484450302c2b90204837b0202c2aa0604825b0303b273630104841c0301b9050485040301bc0a027b0303bd37680502670202c98b0204826b0203cfa1740504823a0203d199610202350203e3bf87040483570204f1baaba90504817301016501120b8104392d0d20180f011645213f292e4d0d082f8165011e0b400c07341b2329307f193338173a012055292409050c560a272a0f4403245718011a1c3a183f1c43264c3126060829012081208102043a044d0621650b180e150e011a066c030e513d7d265e1313130c0118171953040457347b114d191901261b1c060c26090d6f0d332a1519096e03101d1d012207342f1f2c7e2517251d0f310d2a17081e02013005020a02013308048247020135030483660201380704841b030132030482180201610102600604825f0304c2bdc2ba02023a02016209021f0201630604813002056663cebc610604841e0201670504816a0104842703037177310604833f03027872080482350201680604825e02016a040483320104840d02016b0304813f02026c6408020602016d070481590104837d03016c08020d02016e060484630301780404815c02016f0104826b0804825e02017008027b0302c2aa0504847c0201710404836d0201730402510302cebc08048338020375c7bf05048344020177010482660304822303026479070481630204786ec2ba0204814f0202796a0a04834f02017a01048407030484660604810603026561020483180204c2b278390504813d0301b304024f04026536010483110302b9330604813e0301be0304840b040484560202c4a702022d0206c6a5f7ada9990402350202c79f090481180202caa60502140204cebcc2bd080483320202db900a0481250205f4b5aa9079040484360204f7b985bd0204835e01016601128101285c096981190e01121f813f0d431a8135530114698102813228492f190a011260161881328101812601188155780d813257050c0b04060114161681340772811b5e25011c4505810e13290b253a0c0c0a1a4b011a3714133e1235812b136b062c0b011a6b591356810c3c240906250b1001148127810d413e0e81090d020231680504822c0302c2bc0204830c0201360104840c0303656a740902110302d1950504824f0201370902130201390a0482530303e0a9ae0904844c0201610804810d0201620a04810c03023039030481330302356902048268020163060483470201650504822d02016706048200030483560302713509025002026a79010484410804825902016c0504822002016e07020d0304843a02016f0204842d0201710304837604048361030482430201720904840f020173020482520804810b02017406068425320201760202420201780804845d02037979650704814802017a080481110301780804812c0202c2bd070484600202cebc0508813082410102770401610202250202ddb40302310205f19e9a937a030482410101670118365558195a0a062d0581260a011881068143330844041f0a1851011a2025141e1081204f550e077521011a193b1f58351912265681220821011812070528472f4e2f407f204a01124d1e1f811b810d7b4d01180f1d3481034a35580a12811f011c2303340d1470150778070c812331011620411939703c032915143f01104281116a3d323c6a0201350604842902013703023f0201390a04816e0201610604826402016202023f0201630a04843302016409048258020165020482620404814702016602061b833f0201670404827d03026369020227020169040483490301670604847602016a0604845d0404840902016c04024601088150822b010482350204830a0301690304844902016d0202710704820002016f03048509020482380304836603026e74010483580201700504817a020171020481080204826a0201720304837b0202410302160302c2b3080484550201730904816e020174040248010484280304834e020275730404836e020176060484720104815c02017709026a020178060275040483790201790504821501026c030170080483770304cfb269710704815102017a0204813303016f090483160202c2aa050481400301ba0804810b0401630804830d0301be0604844d0202c8a30a02110203cba0640204816a0202cebf060482420204e487856e030481080204ec97bd6d080484080205f09eb3a0770502260208f687999931ed878703048424010168011a12460e090c036e151b812e065501161708411982151738471f35011a2d1c0678340c1f04425c21200c010c2a087f255d4a011a0d0b6c33814a212c3a0a401b1e011c501f2381010a0481201c0c6012280118150b5228520e0a036c1c8123011a15810a060408030a81563f381601185b1b06212a143f332a60160e011a221b1e62411d2048090e0b0f5502033072350804826a020131020482530201320304823b0201330104814502033677380204813102026174020483540304dbbf6f620404835d0201620504846a0104831803017103048323020164060483740201660a02410201690102130104821402016a0504823f02016c0404832e02016d09022602026e640a04822702016f070482000301750402670201710304813106020d0202726304048220020173060484530201750504831e020483400302c2bd0704843a020177020483470203786371030483740201790904810002017a0302300202c2b9080483280301bc010481700303bd33720304825e0205c99973c2bd040483160203d5a6330a04842b0204e7b3b3300904813c0205f099a68f72090209010169011c21101d4b2d0e0e066b4253074c140118070a0910447556030833541d01163733816837402b3909122501183c5b1139102e2d430c662334011e27050f21621230323503332b6a0332011e1e07031843202e6e3c2850094d410c01163955220b16812d24521212011681250b0a3505460481176f011a2c09266b162968051c0a1481170116022e1e820c352037263a070201310104825d0602110303696869020484070201320204826e0201610304832203016f040232020162050642843f03048336020484540301370804833c03026c6105027a0203636165090483120201640502770304833e03017107022f0301780702470201650a04811e020167080238020168040481160102230404826b030170040483000201690304836f0302766c0304811402016b0504812e02026c6108027702016d0308827d81530604837302026e790904842602016f06048208020170060481680302320201710204812902017307048255020274320104822a02017506026803016e0a04821303017207025f0302c2b90504834a020177020483130201780604836b0402210301320604847302017a010483130202c2aa0804823c0301b9030482600301ba0104845304016c0504837e0202c3b8080484600204cf9d6379020483660202d3860704812e0203e3a4be0402560203e58784010481210204f09e95ac0102580204f5aea5890a023301016a01123428131a1f6c81445601141e227c1a7b5f1918810301182318812e17455605460d811c011a28820221311a6e12093f050a0c0120082c0b0f1362074457460c3b070d5132011c2143052a20133d160a358117591f01103136813b136e6247011c100e4c28060d16815a320a3e11070124462c03582e262d45110804113326040808070807080809090b81050708060708090607060907070b070e07070807060706070b08070f0807070709080708080c070706060808090c07060708080708080909811307070708060709080707070607070a060b070706070707080a080607060c070707080809070608080908090a812406070707070a0906070b0b0908070b07070b0607070b0608070608090b080a080f080a0608080b070b08070a080b0a810408080708080607090707080807070b070c070a070f070b080607090707080d06070b810b070607070607070b08070707070b14070a0f08070b0d08070e080b060a0a070a0707080707070709080a0a0a0e810f0907070709080a0b0707060a0707060807060a08070b08070907060807090b090a0a81140a09070706100707090a060607060e07070807070d08070a07070806070608070a070708070707080a0808090909'); +INSERT INTO t1_data VALUES(274877906947,X'00080e7f073c23110a1a18392f66090524183704276d6703306a320404824e030164080483520305c2bd7ac2bc0604815a0201360704833202016106021f020482400201630304822a0708817e8204030173040483500201640404824803016d0804824a03017709023002016606048367020268680a04815802016902088339811804027f0302656e0704834e0303d5a5370604816702036a3366090484470303c2ba660904826e02016b0904837c02016c07021403026c610604835802016d0204816802016e0104831202016f0104822f020270720602060201710704822202017206048174020273690204824602017409020c020175090482140201760a0482720301660404824403016a090484290201790404845703025d0203c2bc33040484620301bd0304824c020484540202c78607022403019a010482380202ca87070484390202d39d030485050203e184940404831b0203e6a881060483480203e8b18c0a04816d0203ee8d850104814801016b0110467257393c81272c011a053e815d3b190517064524521f011c3823590a8115372004313b1f3216011a5a20780b102d0804426916112c011a182f810781082d12137026161501221a180516811611051c131207811515173501180320112581062e05621c1407011c2d0e0617811522062208065a21520114582841621e6c203f1e2001161647411a272533815b1c2602013009048309020232630104835a0301720104817f0201330604836f0302ddb5080482560202347a07048102020135020483460104827b02043678ca800a04835f0201370404814b0104846002016103048246010482220301700204833f0201620404824d060481150201650304824f02016606088110834c0201670604821d0303c2be66010481790201680404843b030176050482270201690a04830e02016e0904844202016f040481010301630304822f020270640204822f03016e0704845802027177090482710206736ec2b2796a0104832e0306dab1d485377004048304020174050481700201750a0212020378627604048164030173080483190201790704833d0204823a02017a0506820e67030178070484530202c2b2060481500104823f020483030301b3020484310301bc04027e0402caaf0a026a0301be040482590204842e0202540202c79f0804824d0202cfa30804815a0204f29a92970204823301016c01140f63351a0a653b650d22011c09117a3e1538123537046a15043101141310082f49052f772b0c011c11121781583c2a5010133228241301287f3e0a2b1244080503060a100f413b4f0d070e2a01103e4e1f04814e7b1601183d0404052877111f230f811d01123a100f053e5c076910011a031732102381243d1b1727507301180e5d273e810803812e0f192a02013301048271070481330204821d020134080263020135060481280201610104830a0201640604826d020165060483050201670204841c0504841c0304841b0201680a04845602016a0104811c01024f030481080204813102016b0204837008024502016d0404836c04068207780301670704842302016f0404821203016d040484490301720404837e0201700104821d03048407030165050483050201720a04811602017307023502017407020503016f080484240302c2b90504821b020175090484090201770a088119822503026d6905048300020178030482680604812a0201790104830c0204833a0303d9a06806022002017a060482600203c2aa33030481560301b904020a0301bd0504820f0202d0b90904817c0202d3820202200202daa9080482030203de966e02024b0202df9d080484350204f098b0a20604845e01016d01220304456608322258060a031d4c38340f090112310c070e4238626e6601124a318109030513812f0118240d561e533742188113101b01160b24444b224d44814d4806011c05774e483410330d23541b28090401141f29062581131e221b6d011e81053a037a03320b0e4c24360d2310011a0e321d3c141825111d54637a1c0114093d3c2e58571a35293a0201350104840a03017701048330020136060217020138030483370201610a0482650201620504815e0201630704827701048201020164080483690201660804846703016904048113020167070483080201680504837d05022c0302cdb10a04815f0201690104833a0404824302026a360a04823b02016b0a04813502016d0504831a0204833803021a02026e360404825e02016f080484140201720304844b0404816603056ff09d899b0304823f020275390204816e0301780a04824202017604088308812703027902027770050482040201790104827e040482750204812902017a060483030304c2bdc2b30104836f0203c2aa62040484040301b903021c0302bd6b090484300301be0704814d0202c99402025603049a65656b090484020202ca92090482060203d19a730504844a0203d49f690804836e0202dfa8020482710204f09180860704822901016e011a0c0b8104243647521f43231f36011a2e1b33432c3d0b414905054d17011010573a6c0a816c1801160e063582340a5239050b06011a4481063d1b67250f2044200839012044591d1857291214135814101a1b361d011225067e8147111a4a4301166b13362e17195f3812186f01141c465b032b290406373301182a152a2281300f8107054e3f02023274080481770305c2bacf8168020481450201340604832f0201350704842e02013605020e0201380404841d0201610404810d020483750201620304812b020484230301610804834503026c6a0304816d0201630102380305613577337405048359020165040482720201660904826202066736f094b0af0a0482250201680104811f02016b0304847202016c0404822403016f0904822c0302c2b301025002016d0504817b01023f02016e020483090802040303e7bda10804832d02036f6b740404811402017005048419020484220202716506026303026b760904830a020172080482430304706c73620504825f02017308048413020174080481070201760104827f0204836e020477e7b89a0104840e02017a030483700206c2aa35657065050482740301b30804842b04046cc2be78090481040301b903020d0301bc010484260904813f0203c7a5620302330203c99f36050481010301a30704815b0202ca8b090483250202cdbb0604820a0202cebc0102170401380304842b0207eca2a6f29c87950904824001016f01221d17052b58101241060e3a201f1021633a0114816919811c142443100801280426080e2620042a812c531a490e121707131710011273432e493347811a340112195f671f46721c325e0118380c052b812822478107600b0116021c21821b2019263433040126021b05351b2a286b05181f071b5628111a330a012014533e073d0c0e5469141d1e2734050901220318051b44412803632e0642370e0a3a2b020131070481770201320a04812f0202346e04022b020136030483590304f09a81b60404834702016105048210020162030205030167010268020163010481540604820202048300020264310902420201650804834b02016703048247030365c6b602048205030573f098b890030481450201690204832802016a0a04826703016c0104825e02016b0604815e03016c03048334030677c2aa74c2bc09023d02016c0304823903027777060484540303df866c0104815b02016d0204811f0303796f7704020302016e0204814d07024a02016f0902680201700604840a0104831a0204835a020172070484440201730a023703026b660604830e030278790304815b0201750904822402017704025b020178030482350307f4b2a3896a343407026b0201790902720302633409020402017a020484590302dea004025f0202c2b20204816b050481200202de900402160204ee85a5770204822c0101700114143a0d391a60812d4e09011a2f313104201c372c3a3411321b011a268140144226334145050d1c4d01164e081f20671f088107237901186b123c1f6d07261e2b732e210116511116342a3d32376e083001106882257a0a17141101163039192b0c05812d735f3b01262a3e0841030b17181411051e0a18530e272b6d01182f322b260e24581d5381050f02013104048353020132050482370301690204843e02013302020d0201340104841f0201350a048139020137050482770201380204833a02016105025a0504832f0201620304836d020163050484100304832003016c030481290201640304837e020482490304822b010482290201660a04827002046964dc960204833102016c0704814502016d010482000201700104817e02037176760904821f020473eb91a708048152020174090482770201750404831e01063a825d03017a0904826a020276730a0254020177080260030277630104815c020178070481220202020301720804841202017a0204834c0202c2aa040484010301ba080482580202c6a3020481320203cdbf690502790202ce90070483140301bc030481470205d1a371cebc060481590203d2976a0404830c0203dfba6e0604814b01017101163732393b8120422f054b0e010e030b211d815d1c01165641757c080d81311d090e0112816581542d2313054301224e07121706516606080e39102d231c4b39010a2d81402d5e011a132527428114080d6e1111721c011a814a1a341538251023100d1c4c011e22182622623712411e38162a182d3b01142b67611981470f1f1f250201310a04824e0202336207048217020238730204815a0303cf886d06025a02033962620404833803016f0a04814e020161060483140302726d050483450301790904810c02036376690504811c02016403024d020165010483280802550301650904827f0304ebb8b561070482340201670302670301660804810e020168040482340201690704844d0302616404020f02016a030481060301700704827802016b070481240104814b0302c2bd0504816102016c0604837f03017a0404837902036dc2b90804810002016e0904821602016f0304812c03016401024b02017103048233060483600303e5848e04023a020172040481050305f3978aa06c070481151708070b070a0d0707070607080c080909090706080707070707070806070707070a090b070708080909090981140708070708080b0a0b0b070b070907090707070707070807080c0c070609070b0807100706070e08080a81110f06070707070f07120a0c070707070b0707060607080709080b0b080709060708070808080a810f0707060707070b070707070a080b08070e08070b0b08070c080f070a09060807070a080909080a810b080b070706070b0b0708060b07070c07070707070a0a09090b0708070a07070b0a070c070a060b080907080807070d8123070707070a0706060f070707090b07070707070b07080907080a060f070608080706070c060707070c070a810f07070706070707070a070b0713070a070707090a070c070706080a07070807080808070b0909810607080808090707080709060a070a060707070707070b080707090707060b0807'); +INSERT INTO t1_data VALUES(274877906948,X'00000e8a0330717304048359030134050481100203756371070482190201760704817b0301770804821d0201770204844d0201780204836c0404826103017504026a0202c2aa020482420301b305022c040267390602570301b9080481540301bc0102290206c99cf6b5aa80080481430202cebc02026e02048120010172011a1c2f15158108048125463f251d010811811539011412423105812181171549011847284a30234e5b33042632120118351e8113817d0f2b220d111901264f104a211004061d0a2a0b35121a0a2118341f011c81160a1b030d2a0610243e445f0c011c6f0c1e3b1768141e322717500b140110537f810169811625011a492847203e210f532c16480627020135020481780302caae0104811a020261330904846c0201620804812d0201630404814a0201650704837503017301048276020168050213020169010484540604842b0302796f0504833302016a0304831b02016b0604701302016d0604815302016e070483630204815202027071020481520201710104835b02037266700704843002027362040481490201740904817d020175020481040304f59e9c9407048218020176060484060204776dc2aa020483070201780504812503016601048159020279790704840502027a730904826c030178030482740202c2aa04023d010483540301bd06026b0203cab877010483290202cdbf060482410202cebc04025c0401690204827f04016c0904840e0202cf880104835d0203dfbe6c01025b0204f0aeb7b2030481680205f1a7b5bb390504826a010173011a22810d12415003071f81181839011a3220221511546d810012052b57011a0c4274300d154e81111f041e10011e293f4213051b2276560817312811170120092136122418370e4e782b3912080f3201262b3b340f222b0c09142a0822116a135c1c130c0114320c4e385a0d0415075f01163543340f06362381133c0c012224180981742048191d110e180e180d310f011a20632450281f043027114b034e0203316a61030482160201360104826e0201380a0484570201610104844d0504814a0201620904820f020164010481630304810403027761040258020165080481550302c9b70204827a0204677367690102660201680104831b020169020483760301720a04814502016a04020c02016b04023405023c030269630504840502016c08048463020170030482670202716d080482000201720304835c03016507024d020174030482520504821503016505048207020175040208030137060481710201760a04833d0201780404832302027a6f080481200202c2ba0204812c0301bd0404821e0205c3a66865730702540202c7890804816f0205cebcc7af730504815c0202d2930202540202db89020481160203e8b8a00304825d0205f0958db331070481620305989b8569780a04813d0204f69299a5020210010174011a7b3829100a4e511f1a281c17140114812626032c372634234c01140a520e815a810815200501123e4f3531042d57615b011a041f3e64070f1f1913274a20770114811d0f5d743e0634161c01162c2782130c1b810520280d01164a513110480b402b810d13011e522d08042c1146137012201e810512011a290903182c05301e5d811944290201390a04836d0301610104836e02016208027803036cc2bc07048261020263640a0481480301730704813602016408022b020165050484310301720702260301780402500203666d73070484470201670104825b02016a040481590304836702016c0304835601025e02016d060484110301340204813702016f04021802017006068336280201710304813507025902017201026508022903016d0604812f0201740304827e03016a010482440201750404834b02017604021a010484150504836a02057773c2b2380602520201780204823e0302cebc080484040303d2956403048171020179020484240204813c0202c2b303048307020484410301be0204816f030484250203c798680104843d03019c030482570204e19ea86a020482350302a0950a0482280204e5a4bc780304810e0101750126090a35030a03220a1731630f31252f0c4b1e31011e39200e3715282a03103b56090f6b1501121d4916246e6d460d6501162609380406361e816d203f011a22166008124f58202e182025150114390f3a25713f0e3f715c011a5a11191123466025710c313312011e3c191326811c1444055f1f5109051201143b106f1181000d068155012043381381020d81080d0603171824260a0201300404844a02013207024203026b390204833803066eeebabb35660604842102013308020302023f02013503048243020436716b66040481440201380a04843d020261690704836002016203048209030484670201630a04841d020264790104822b0201650502340302c2bd060484300201670202620201680704810d020169010484430104843402026b67040481540306eea3ad77c2aa0a04836702016c020258040482270104830a02016d0404824102036e716a0604843e02016f0104832a04020c0204836803036530650a04817402017005025b0301630604843d020171070275020273720404827002017504048133010484120301370102270201760104814f03026203016d0904844802017701048375080481220301660202330301700a04827f020378c2b2030484710202796806023c0301730704813d02017a0404815f0104817202048407010483390202c2b204026802048254040266640204831e0301b3090482230302b963060482010401750a0483290306ba35f2999dac09020f0203ca926e090483350203cdb4780302350202cebc0a020f0204d7a7696d010483100206f097bc996d71040481480101760114185b2258291610821c0e01160272173107154f5b813722011a81020c200e1826250d39811f07011a7911152a2a45131504422c81070120050d3f5b23342e3e4139032a3813042d0116592d1c15630c0c0a814649011c1a362f5c4a35511f0804033e372b01102981262a352e8205010e0b4b6282388106011e26810a2d125f361a12170d1721311e0201300204832b0201320104811b050483790201350204832202016404024c0202657a090483710202666307022703016c07048362030277750604842f0201670304843d0104844c0203686f7a07027202016a0102430204847502046ce0a2b20704810302016d0204827b02026e330804826c02016f0104835502017102027606026c020172060483490202736505048371020174030484130302387602025d02017502048345020376346b0904825c0201770904814b0303c2bd720804812b020178040483600201790804816402017a08026e0202c2b90704811c0301bd0504821e0204cdbcc7a108021a0202cfb8080481490204f09f96a50204842101017701180207232d37812d0c045c4a0a011a06163b3408171c52213a26592201206d08581605811a171e0c0a1347104914011282181324082b73320f01122f6e811d2c3d410a44011e551414206a092f133f333d150a3e0f011e235b170e37060627471b13373b3e27011a0e1e816b270c10102d53381045011a060e1e254d044932651234691e011a158138300a04810c0a8121071802013003027707048214020131080481370201320a04835502013304048271020538ceb369650802310201390a0481440202616c0502570302c7a104026c0201620804811c02016301048168020241020164040481560104820b020165080484460102400202686c060232020269670604827302016a0108810c826e0704824e02026b6c0604816902016c0304831c02016d0304811903016407022b02016e01022e0604845a030237780702040301710804815102016f0104842903017a0704826902017003048445020482080202713002024e0201720804822003016202022302017303048111010482790204812d03067479c39f66700a0210020174020229020175090484430301690604820402017606020202017a01021b0104843a0202c2b90604842b0301bd030484570202c69b0504815d0202c8a30a02240202ceb8090484690301bc0404832f0202df85020481230101780116812b0a16810e4b045a3b2a01205b1305811134092f62072343100f0f05011e5734152612030b4c4134123009361601121781653207780a6a0d01164a25210824138107738139011481341f088158060c8133010e5920193a4c2331011a0510358101231a1b3609702732011a2f07631610033436810256174c011a1342040a58110721378139101602033067750802720201320604834303017109048244020133090481700203366f79010483520201390404810902016301048411050483420201640a048432020265310704832b02026774040481000302d5b2010259020369756c0504832902016c07048365030233700904824102016d010482670404834c0504830c02016e0104831604048120030169090481750303eba6990104835f02016f0604834c030379c2ba0a0481560201700404815e06048256020174040482370201760a04820d0201770604811c02017a0404812e06020b0202c2b9030481660301bd0a04816c0301be030483620206c99b6d7777750304835b0206ceb0646b66610402490202d8bf030482250206e8bfbc626964080482510204f09c9a9e0404830f010179010e2081335661371c01220e4e2718124f0d0649812b0b0a063b040b011402741d1235810805211a011409161d732b8106325f6a01182e330325068107703728302b011e3723081c0d0a3f810c183e061b067f0106834a12011a044030185a1e810704220a0541011245602b0e421441817801144b03811a1a29614e224b02013003048139020132050485050304f09caba6010482230201350104822708048413020138020483430201610402230201620902440108812181070301300304815e020263710404831002016403048226010483660604823c020165010484510201670104816407048418030334c2b20a0481120201690404814c02016a010481500904810f02036b75610304836402016d01027902016f0304817b03056f6373cebc0a0483010201700104817d020171050482680104843b0302383203048128040807090707070b0608060707060c0b810e07080807070707060b080707070b0807090807070a070a07070808070b06090807070708080a0b81230907070b070b0707080907070706090807070807060b07060707070808070a080b0708090b0b09810a0707060908070607060609070b0a070706080a09070707070e0a0708090b0c0b09070a080a811a0706080c09070a07080b0708060806070b080c0e07090e09060706080b060a070b0607090707130b080708070b0908070a0c810d070b0706080707080b080a0a070807090708070707090709070706080709080a81170a0707070a070707070a0b0a07080d080707060a070707070b0707060f0b060707060a08070807080708810d0807070709070b070808070907080f0b070907090b0707070a0807070c0b080c0a810107070a0b07060c07080f070b09070b0906070b070b'); +INSERT INTO t1_data VALUES(274877906949,X'00000e5c033079720404826c0404833002021b03026f6b020482100201740904842e010484150303c2b36f0204840e0201760704826b02017708048273020578f48ba5b50a0481400201790904845902017a050483280304c2bac2bd0404841e0203c2aa680904843a0301bc070481100301be0304820304016a050481630202ca8103027b0202cb860604840d0204ceb56e370204832e0302bc740202520202cf8d07027e0205d8ae39c2aa0104813c0204e887b3770404816a0204f1bfb0970204832f01017a0118101e282f07045961813a193e011e69162f0d2b051c060f084460063053011e06810c20330d0733815c220515220c011210290a7e07810c3a18011a1f2f064a19155212472781047c010a123e45825501166c6062182718167131092f0112331b812c0b6e81470b01184f3a230d45261e271c36111701140a8128456b291248391a0201300104840d0204812502013401048318020137070483070201380904823b03016704026402013907023403016e060481380201610204812f0404824504045243020162050481150104824003016a0804827a020163070484590204817903017a02048209020164020484200203653077030482610302737601048424020166070481730201670304841e0504840e03016b0504825302016901048235010484400404841002016a010483680404845f02046bc2b97407023302026c7a0704812d02027161070209030378cebc0a021f020172040483750404815f0201730304813c030131020482040201740704824d0302793901027502017604048423020177040620813103048313020179030484540204833c04022503017a0904826302017a050483530203c2b2660404840f0307ba6272f397bd92010483070301be020482760202c6b9050482410203c9a3650604812c0202cbae020482180202d38c0704812f0204f096adb7070483490204f6a69c8b030484390102c2aa010c815e81147969010c811c827f0417010e81077a4c03815f010a2e8100820c010a810d148140010c0a7481201a13010c0b831525323d010a8206358129010c21637a33812701083c8340390301300504820a0304326939770404841c03016107048334030165030484150302696c0704810103016c0704812a03027178090481620301730504830e0301750504846303017802021c0301790304836803017a0604834e040135030482650302cdbf010483330304ceb23169070484090303e4849a0504817d0201b201088219744601082210832c010629846001121c8137182211816232010a81668122690108817281080110816a433581102f3e010e7481001b3481190106814e1b010e3646823a810e070301310504840b030161010481720301660604822f0301680804821003016a0704844803016b0104845b03016c0504823403026f700802340301710804826004026d3106024a03017509068458070301770a04836c04016b01021f0301790a0482790302c2b20a02270401b3040482130303ceae6e010484330302df9e040482100201b3010881656e750106820b50010e81434a27048153010a812b068122010843810c0401048211010a50817d812e010c811a8163810801061e832c010c811f81418101030163030481210301640504831102048104030482440301680a048202040271300404841303066b6576cebc6a0104843603026f7a08026d0303756a7808023e030176040483610301770704814403027973020484360302c2b906020c0401bc010484490401bd0804835c0302d38c0304846f0304eaae96750a0484020201b9010c3b824018322d010e0468315a5c817901067d583401060b810e010865118169010c0e07826b813a01066f8265010c3b8239633852010e61161e7030821b01068241210301350804843d0301620302480301690402610403e7a1910704812103016d080269030673c2bac2b36c090483070301760504821d02048454030278350702620302c2ba010483320304ca897a750804813b0401b5070482350303cebc6d050483120302d199020483020402ad660604840c0302d2a1010482550302daa30202340201ba01026d01085119826a010c2f5e82008110010882028221010481090108821b812d01068128460208810b8264010c810971812d440301310304820e0301320504825e05048221030333756d010482720301340502700301640604813d03016607020c0301690204823a03016b0104812203016c0704842103016d0304835f03016e0a04813c03016f0304834d030173060482660401710604810f0301740104843c0303d48174040482690201bc010482690108813c83290114090f816045242e148111010a810616822701048456010e2c81167a638115010a3a3b83204001067a8367010c8114127a2265010a824f7f5c230301300604833e0302616f020483560301640104827d090481280301650502150301660804841a03016804048221030169030481120301720104827803017606023d04016e020481700302c2aa0904836c0401ba090484100201bd01088240224f010843813674020a81185068620106822a44010e14154a8101825e010c19814a1b826c010c81221f81651b010a815a4d812c01082d7281160301300804843c030231300304836703013509048353030365c2bc0304814d0302667504027a0301670604831503016c09025d03016d03048178030172020483620301730104816b0402c2b30404823203017401027204016a08048451030175090237040177090481690301770302190301780a04823d03027a350a0481260302c2aa060481620401b3090481090304f098a1a30a04825d0201be010a0d730b816f010c821d81236c2b010c6f8208358119010681236801087d4e831e0108823c8235010667794b010683165e010e05812e3d3c820d010c81148123817403043531c2ba0204824c03083875c2bceba7957a03020803016302020804036dcebc0304814e0301640304843704033379790504823203016b08023603016d070481090304825804013707027a03016f080484530301710a04842203017809025e0304c2aa6135010481460401b90a04836b0401bc0704814f0306c6ab66e3afb9080482660103c39f350304821f0201b0050481110301680602030201b8040481310604810403016c0a024803017108024b0201be06048323030482650301300504812d0304f48990ae060482740103c491680a0483700301760a0481290201a7010484090202b177020482380201b3030482280102c5800602090301360104826a02018202048173040483780301370104814102018b090482730201930504810f0102c680020483790404830c020183020228020185030484400704820b02028d7a0a04821c0201920404835e02019507048437010484070301760204836102019a020214080483100303d795680504820602019e030481050201a30404820a05048436030177070484290201a50704843b0201a8060482690304816f03027735020483630202ab79050484430201b6060481050201b904024003016d070481130201bd090484350201bf06048361030163020481580102c781040484560201830604833a020286650404842a0301750a04821a020189070483370303e0b9b30904836602018c0104816c04020602021d030171050484570201960a04842d03016b0204821903016c04021e03016e0204845002019a0a04844402019d0704835103013103021702039f77750704827e0201a1090483340201a301022b0404831d0304616363750502520302cfb2040483720201a50a0481530202ad760902310201af0104811d0908816281390301640404843c0201b3080483240201bb030483480201bd040484290304840a0203bf646a0404843f03017a040482450102c89d05020f0201a1090483550201a3060483550201ab0904813203017a04024a0201ad030482210201b10204824302025d0303656577030483600202b46e010482240201b6090484410204bce39f9d020484570102c9870604813202018b0804843603017a06027102018d080481130204840c02018f0104836309026202029164020484430201930504816d0201970304843402039c6c73070483700201a0070483470201a203048262030364d7960a0484010201a80304832a060484390202a96a080481170303c69532090481440201ac040214020481180202ae770604832c0201b0090482300201b40804845a0201b5070482110302716f010482160201ba0504837b0201bb02048149030165050483250201bc07088105833002067f824d0302d19f0402330201bd04024d03017a0904814f0102ca800a048321020181040481580201820604821e020383693707048417020287630704840002018a0904834c0104835c02018b06022f02018c0704814702018d0704810a0104831a020490e7b38308048423020191020482510201920304832f030135030483710201950304833207026802019902026b02019b0904832a02019d09024c02019f0802210201a4010484080202a5710a0481680203a777670804831e0301790902100201ae0402700104834e0201af040484650202b673080484190201b705048221010483520201b808048465030167010484400104cb81cab90104834802018602048317020689777568cf920804842602018b0404817b020191050484200202a0720304833e0201a3040625827f0201a4030485080102cdb1070881408205020483700201b30404840e0202b735080482640201b80504815a0201b90a0482370206bb31cebc6c730304842f030133070483010103ce80370304826d0201900202770201ae0504844e0201b1050484080201b20904815f0201b3040483430201b40702600201b50804823b0201b90304846e0302c9a1070483300201ba0404844d0104847e0201bb050482780201bc010882378223010e811105814d8134010a8142823f2d0106811c52010a6e1814816b02088168824b010a438137812d011019060c6b812f811c010a81314e811b03033366660404825503013502048263030238620904820703016303048120040f080b0907070b07070a0907070707080a07070b0a0a81060b0707070606070f0b070b07070908070b070f0b090807080b07070707070c0e0707090d07080908080a0a50070a0707080708070706070707080a094d07070707070707070707080706070707090844070f07080c0708070708070707080a4707060609060c0b07080a07090808080737070b09060706070707070707070707094807080b0607070707060708074107080709070706070707080607060706070808070a460a0d06090709060b060707060a07070c0907060b06060b070a090707080707070b0707070c060b08070b070a09070b07070b08080706070707070807080707090d070707060707070609070a090807070d0707070b09070707070706070a0908070a0807060b0a080707090707090b08090a08070707080707070e07060708070709080b06070b0a0707070a06070606070809060a07080b07070a070c07070808070e070807070c07090607070707060707080b0743090708'); +INSERT INTO t1_data VALUES(274877906950,X'00040e1807020e0830cebc66f09f97b60604840703016b06021003016c0804835103016d0a0484050301710602560301730304822d030275770904834e0301770204824d0302797707022e0302c2b2070482640402bc6d0a025e0303c3a6370602530305cebc7768690a04823f0201be0504816f0301780a0482780201bf0a04833a0305f09e919a790a0483440103cf80340604827e0201810404823e0201830304843a0504837f0301780704834c02018407048139020186030881038372030178010231020187010481100201880204835b0204845a0104825a0201890204825c0604831802018a0704841502028c340304845e02018e0602180301390204833c0203936e770104820f0201940704823702039765630304847b020199080484110301710704821402029b650704827102019d0304845802019f0504845c0303e7ba880502690202a163090484160201a3060483020301680102470201a90a0482480201ab0104837f030482570201af050482190201b20a0481020201b30504842903026f64040483650203b873780704826d0201bb0704831c030177020481410102d0b0070482560202b17a050484460201b2040483400201b40402390202b671020484220202b777090483510201ba030481750202bb6301021e0202bc620a0484080201bd0204815d0201be060482470201bf040483340102d1800904825002028470050482290202876f06022202048872c5820104826202028b680504845d02018c0a027302018d0a0205020197090483210202986b0a02780201a3030481580201a70604835e020483670201a901048379060483780201ad0a04816b0201af010482310201b1080482020201b3060484610202b5640804814c03026e690304847c0201bb080482710201bd020482020201bf06048435010482590107d28b37c2ba61640104831702018d0704810b020393c5890204836e0201950602070305f6a5989a74040484450201970104813702029f790a04843f0202a57407027f0201a90504835b0202ab750502490202b9760a04827d0301780304826e0202bb6f060481780203bd7130050483630103d3866f09023602028a6c0604825302018c0304845302028e650404833a02028f6f0104821302039d356d090484320201a5020481130404813f0201ab0704835b0201b90a0482380201bd0904833c0201bf060484450302307604027f0102d491050483300201930a024603036bd291070483060201970704826702079b72c2b3356f730904844f02019d010482610201a10404814d0202a36b0502250203a5c7b3080483780201ab02023d0103d5a1640102260201a206026a0301660804813c0201a5030481180201a7050483360201a9040483510201aa060482020201ab0504811e0201bb090481680202bd740702160202be700304846d0102d6840a027d02068534f0988d910a0483730102d78f0404832804048462020390766601027802019202027405024b0201940a04834d020298770904815702039a6c6b0304846802049c73616e080483420201b0010481050202b565050481290206b67376c2aa640a0483280201b80704830e0102d89d0202150802720201a60602480202b073090481480201ba0204836f0102d9a50202670201b40a04822a030337c2b20a04820f0102da800604831c0201840604842802038636380804811e020188090484190201920504815402019a0304830c0201a301023d0201a6040481460201a8020484100201af0104842a0204825f0201b50304827c0201bb0804830f0105dbb878c2bc0502580107dc97e69eaf6764020259020299610104812902029d680502110202a0690a0483270203a56372030483540202a96a0204842c0205acf094abac0704821c0102dd92020483410203946d790304814f020395d7ac090228020296300404830302039b397809020a02029c770504833d0202a2700504821a0201ab010483400202b0760a04813a0201b2040483130203b3c7a10104833d0204b4e8a5a40604816f0201b90604830d0201ba090483630102de800904810a020281740a02380201880704826802018f030481670201900202790203916e710404833502019206048418020399ddba080481240202a3630a02250202b86e070481670204830d0201b90604811f0201bc070481530102df820102390201830304830102038e367901024f02039134620a0482080201920104814b020198030484790202a06b060481240201ba0802090201be08022f03023670010482170202bf6f01022d0103e0a1960304831d0302bb75060483700202a2900804817c0202a49e050485010202a6b2040482030202aa80040481720202abb30304843c0301ba0204833b0203aca677010481120206ae9f613566730504841e0202afa001020a0302a979080484060202b1a1010483730203b2a46a070482460301ba020484580203b39b610804834a0202b6a60304813b0202bfae0404837c0103e185930304845f02038889780a04826802028a85070484620301b90304826c020298a3070483270203af8962050484620202b5b7070481170202b8970602190202bd8f0a0482620103e2848f04021b0203afa861020484010301b70704824a0103e3828f05048214020284a50304812f0202909e0904824d020292b907026302049ba0336604020602029c8e0204840d0202ad860202750302a16a0802180202ae880602040202b480010483150202b7b1090483780202bdbf070482050103e480ab06020f0202889605024f020293b9030483310204968fdc93080483110202a295010484150202a69a0804844d0202a78e0a02080202aa9b0a04825f0203b2b8670402720203b5b764060482550204babacf87070481270202bd9b010481780206be9a6878696805021e0103e58bba0304821202049eab6a630a04827702029faf08024d0202a2b50a02400202a3af0704827c0203a4bd6f0504840c0202ad9d030485010202b1be040483780202b5b9060484500103e689b10404844602028abc0704811902038e98690802320203968b35090482680203979971010483060202b6a4030484050301be0a04833e0103e780a601048171020282be0304824d020286b105021b02028f960a048266020291be0804831c020299900204815502029ea70702400202a0ba040481410204a69e3870030481220202a9800602310202afb8020482170203b1af6d0802140203b5a06a0702740104e88c9a6c06048426020295bc05048326020296af0304846b02059cad72d4aa060484780205baa97364680404837b0103e983840104843902029a8a010481490203a1ac770504812c0301ba050483410202af8c0302620202b1af0302500103ea8fa60a023e020297b50904812e020298a90704825702039ea76b0304847f0202a59e080481460202a68e080482590204a9b1c6a8010481350203b38d75040482750203b89e6f0a0484030103eb828f0704824e020384837109048178020397b6690104821a02039e9e330704837f0203a68b73030484440203b980320804822c0103ec8fa80204814302039588760a04826902029bb80a024e0203afb6630802710203b4a268060483000103ed8cb50104811602029982060481550104ee8085760304834502028a870904845702028f8b04027602039da470030483040202a1a20504813c0202a8ae0504837f0202af9d0402570205b1b773d8b4080482120202bd880904832c0202be930104827b0104ef88ae680704835d0205a8ab63c2be06022e0203aaa16c080481090204adb779660804823f0202b8ae080484220203bb9165030481340106f08798b1636a0604824f0203908ea80404826203029f880402530303b4ad740a04833302039184b6090484650302acb3080483340302b1b703048272020a9281a23578f098b1893001048210030291a50404816803029d8f070483200302afa5080484440302b49f020481010303bd833603026a020393839a07024c0304a3ad6e300504842d0303abb16d0502660302adae0904830e02039481a406048164030386a16c070483530302b2a8050484320302bfb9080483170204958eb8720304832b0302b1ba090481200302babe05048209020496888b6708048358030293b4050483400304b4927a6f050483770204978b93320104810a03048fb9c7890704822803029ba702022a0302a39d060484490302a4be0a0484530302adaa0a026b0302af92040483700302b9bc0404821b02049884b56404048352030486b1716f0904827a030296b80904811d03049d9e797a060483390302a5a00a04844a0303b5856d0a04822e0302bcbd040483310303bd91740704845102039983a20a04816503039d8a330a02140303b9826b0404814e02069a8b8438687403026b0302a599010481740302a6ac0704840f0303b6896d0404831a0302b785010484370302bfac08027d02059b86b770610404845203028fbd020483550303a0be75090483620302a295040482390302b6970404813002039c97bb0a04841103059d8976c2be0604824e0302afbc05023c02039d87b40504825903028daf03048172030292be040482310302a0ab0502290303b2a16b03025d02039e929d050483040302a69f060484150302aa8607025502049f9f8b66020483160302a3be060481120203a8afad0904835e0204acb1af640204845b0204b282a47a040481610203baa68a010482490204bb9f8366060483130203bfa48f0704817c0104f18191920802220204828cad360a0482730203859c9a050481670204888eb23408025f020492ba9c3202026502049bb0bf7008021f02039f94a60104835c0203a6b496030482760203a98c960504824e0203acb7b8030483240203afa0b703023d0206b3a38c683972060483340203bbaaad0902070105f282848f790804833a020384b79f0a048170020590a98c616a0804843b02049a92be730904822f02039da18b080482530203a28f8f06048309070d06070706070807070807080b0707070b09070b07070906070f0b07080607090709070708070708080706070b070707080907070808070608080707080707070808070a0806060707070b0b07070707080807070b0d0709060b0708070707080708090808070808090b0707070707080609070d07070709060806070707070707070708070c0c08090708090a07080c070a0608070707090807090707070607070b07070a0c08070809080b08090808080808070807090a07070807070706090709070c070707070809070708060608070908080808080807090c07080809070908080909080708090807080809070908080709080707070808080807080a0808070808090a080b090a070708090808080908080909080709080708080807080a070808080a08080b0b0908090707070808080908080a0909090909090909090907080909080a0807090808070b08080a0a090a08090c090709090808100808080808080a0808090908080a08080a080a0a0a0708080708080a0a080a080908090908090b08080908070b08090808090b0709080807080908070a08090a0a090a09090a0909090909090909080c080b090b0a09'); +INSERT INTO t1_data VALUES(274877906951,X'000002020630f2abab907a060481130204b381af77040481790203bea6a6070484250108f380b5a33633737701048229020383be9f0404837102048495bf73070481060204938c9a6e0904823502039eb39201022302049fbb9f6c0a0481500204a3909e620404837d0204a9ac9a75020483110203bd8c850a048111030293ad0a048247030294b9040483550203bea4ac0702220105f483b5ab66030482440302bda306048141020584b2bb643804048142020586b1a8677a0204831d0205878c916c770804821f02038da1bf0704824302038f81bd0304825102039e91b20302420203b29b9403021f0203b3a1b10704825a0203b5afb4040481210204b98da0780a02060104f582b1b00404811002038f9fbc010482200302b8a406048419020394b7b80404834c02039bb5b005022b0203aa88b9060481390203aba48f0604842a0205af969438680602360203b88d8903026c0104f68386ad0904846702049aae8f79030483520203a8989a0604836c0203b18cb4070482260203b9a98d050483730203bebc870104824c0104f78283840804816703028db20302600303a8b46106020b020389b2a80104835002048e809339010481190205929193d0b409048253020393aebc0204816202059787b96f690704817202079b949dc78934620404817f02039db28b020483750205a288a7c7a3080482780203a5948d0204811a040b0a090e090a0a080a0a0a090808080b080b0b0b090908080909090a0908090809090a080a0a090909090a0708090a0b090b0d090b'); +CREATE TABLE IF NOT EXISTS 't1_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID; +INSERT INTO t1_idx VALUES(2,X'',2); +INSERT INTO t1_idx VALUES(2,X'30627a',4); +INSERT INTO t1_idx VALUES(2,X'306a32',6); +INSERT INTO t1_idx VALUES(2,X'307173',8); +INSERT INTO t1_idx VALUES(2,X'307972',10); +INSERT INTO t1_idx VALUES(2,X'30cebc66',12); +INSERT INTO t1_idx VALUES(2,X'30f2ab',14); +CREATE TABLE IF NOT EXISTS 't1_content'(id INTEGER PRIMARY KEY, c0, c1,Öc2); +INSERT INTO t1_content VALUES(1,'COMPILER=gcc-5.4.0 20160609','X','RTRIM'); +INSERT INTO t1_content VALUES(2,'COMPILER=gcc-5.4.0 20160609','X','NOCASE'); +INSERT INTO t1_content VALUES(3,'COMPILER=gcc-5.4.0 20160609','X','BINARY'); +INSERT INTO t1_content VALUES(4,'DEBUG','X','RTRIM'); +INSERT INTO t1_content VALUES(5,'DEBUG','X','NOCASE'); +INSERT INTO t1_content VALUES(6,'DEBUG','X','BINARY'); +INSERT INTO t1_content VALUES(7,'ENABLE DBSTAT VTAB','X','RTRIM'); +INSERT INTO t1_content VALUES(8,'ENABLE DBSTAT VTAB','X','NOCASE'); +INSERT INTO t1_content VALUES(9,'ENABLE DBSTAT VTAB','X','BINARY'); +INSERT INTO t1_content VALUES(10,'ENABLE FTS4','X','RTRIM'); +INSERT INTO t1_content VALUES(11,'ENABLE FTS4','X','NOCASE'); +INSERT INTO t1_content VALUES(12,'ENABLE FUS4','X','BINARY'); +INSERT INTO t1_content VALUES(0,NULL,NULL,NULL); +INSERT INTO t1_content VALUES(33,'OMIT LOAD EXTENSION','X','BINARY'); +INSERT INTO t1_content VALUES(32,'OMIT LOAD EXTENSION','X','NOCASE'); +INSERT INTO t1_content VALUES(31,'OMYT LOAD EXTENSION','X','RTRIM'); +INSERT INTO t1_content VALUES(30,'MAX MEMORY=50000000','W','BINARY'); +INSERT INTO t1_content VALUES(29,'MAX MEMORY=50000000','X','NOCASE'); +INSERT INTO t1_content VALUES(28,'MAX MEMORY=50000000','X','RTRIM'); +INSERT INTO t1_content VALUES(27,'ENABLE RTREE','X','BINARY'); +INSERT INTO t1_content VALUES(26,'ENABLE RTREE','Y','NOCASE'); +INSERT INTO t1_content VALUES(25,'ENABLE RTREE','X','RTRIM'); +INSERT INTO t1_content VALUES(24,'ENABLE MEMSYS5','X','BINARY'); +INSERT INTO t1_content VALUES(23,'ENABLE MEMSYS5','X','NOCASE'); +INSERT INTO t1_content VALUES(22,'ENABLE MEMSYS5','X','RTRIM'); +INSERT INTO t1_content VALUES(21,'ENABLE JSON1','X','BINARY'); +INSERT INTO t1_content VALUES(20,'ENABLE JSON1','X','NOCASE'); +INSERT INTO t1_content VALUES(18,'ENABLE GEOPOLY','X','BINARY'); +INSERT INTO t1_content VALUES(17,'EOABLE GEOPOLY','X','NOCQSE'); +INSERT INTO t1_content VALUES(16,'ENABLE GEOPOLY','X','RTRIM'); +INSERT INTO t1_content VALUES(15,'ENABLE FTS5','X','BINARY'); +INSERT INTO t1_content VALUES(14,'ENABLE FTS5','X','NOCASE'); +CREATE TABLE IF NOT EXISTS 't1_docsize'(id INTEGER PRIMARY KEY, sz BLOB); +CREATE TABLE IF NOT EXISTS 't1_config'(k PRIMARY KEY, v) WITHOUT ROWID; +CREATE TABLE t2(x); +INSERT INTO t2 VALUES('optimize'); +INSERT INTO t2 VALUES('rebuild'); +INSERT INTO t2 VALUES('integrity-check'); +PRAGMA writable_schema=OFF; +COMMIT; +} {} + +do_catchsql_test 51.1 { + SELECT max(rowid)==0 FROM t1('e*'); +} {0 0} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index b69535b73c..dcadb8969f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\scorrupt-database-handling\sproblem\sin\sfts5. -D 2019-02-01T13:34:00.988 +C Fix\san\sassert()\sin\sfts5\sthat\scould\sfail\sif\sthe\sdatabase\sis\scorrupt. +D 2019-02-01T14:40:44.768 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 9e9607d921d8a988f318b9a7d6d3cf5c6ad0fe8d9ff03bf3a3e92c108b23caba +F ext/fts5/fts5_index.c 7e8e678f243f5b2be59e9543712a5797ff2006547bff5765c3f417fe9bfbf30e F ext/fts5/fts5_main.c 2395658479bca37d0936d47e6194ef575e5e7235ded47fa93bd9d5bb8035b977 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 42fbf72c0e014195bdba698abcfe0cdd08bb194d1b86495ed74d77077efd3163 +F ext/fts5/test/fts5corrupt3.test 760c93a2cf409a68a983ccd4a4d2aad5acae9c8f2aa4b49c519adaa075df39c7 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 80151d7e3b9fd84086874a1cebed024b9e14005ea2d0108cf6efcd07373fcf51 -R 1a3ed3898bab21d94f592d43aba92154 +P 9876ae1b802a449aacbbdd42778653edc19e29315dc627c23ab7493d6492c800 +R 37889ca5f23631d6a97887212bc95ece U dan -Z 04cd55989ead0c3a07d5b8a7807d30ea +Z f38e72163280904b28dc1d9373c8a5e6 diff --git a/manifest.uuid b/manifest.uuid index 37cd2443b9..aa2807cb28 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9876ae1b802a449aacbbdd42778653edc19e29315dc627c23ab7493d6492c800 \ No newline at end of file +55f06aa3f890dc1dc5c2ed0e6777e46d609a6f9d223d1d4b5813097ce4f4e797 \ No newline at end of file From 26b7ec8b244cf937cdca47b45f57121f27367a54 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Feb 2019 14:50:43 +0000 Subject: [PATCH 180/306] Improve the strict enforcement of cell sizes in balancing from check-in [12713f320b2c1def] so that it also works with table-btrees in addition to index-btrees. FossilOrigin-Name: ef27e7a08728aa7447ae19812803ac5c4a9d80c97541014bd292485792005a3e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 34 ++++++++++++++++++++++++---------- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index dcadb8969f..6d708aeb85 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sfts5\sthat\scould\sfail\sif\sthe\sdatabase\sis\scorrupt. -D 2019-02-01T14:40:44.768 +C Improve\sthe\sstrict\senforcement\sof\scell\ssizes\sin\sbalancing\sfrom\ncheck-in\s[12713f320b2c1def]\sso\sthat\sit\salso\sworks\swith\stable-btrees\nin\saddition\sto\sindex-btrees. +D 2019-02-01T14:50:43.745 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 79464668601b6d278954cf822ef484893e1434f85addda2bd9a323796b91b328 +F src/btree.c 9649c95a846deddf256525125ae257ef1ce0cf29409031df8378330a45d513a6 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 F src/build.c fe6e3753c4cfc76f9c621a24ef5f6fd62aac5aa6c843710b542509f493274eca @@ -1804,7 +1804,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 9876ae1b802a449aacbbdd42778653edc19e29315dc627c23ab7493d6492c800 -R 37889ca5f23631d6a97887212bc95ece -U dan -Z f38e72163280904b28dc1d9373c8a5e6 +P 55f06aa3f890dc1dc5c2ed0e6777e46d609a6f9d223d1d4b5813097ce4f4e797 +R 20b34459b8ccf247d9f81319ceb019f1 +U drh +Z b1e6b3262e06a43d75a1c54043cfe677 diff --git a/manifest.uuid b/manifest.uuid index aa2807cb28..6d38cb6ecb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -55f06aa3f890dc1dc5c2ed0e6777e46d609a6f9d223d1d4b5813097ce4f4e797 \ No newline at end of file +ef27e7a08728aa7447ae19812803ac5c4a9d80c97541014bd292485792005a3e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 5c455f7d22..1fd7dcac4a 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6728,7 +6728,7 @@ static void insertCell( ** |Child-1| |Child-2| |Child-3| ** --------- --------- --------- ** -** The order of cells is in the array is: +** The order of cells is in the array is for an index btree is: ** ** 1. All cells from Child-1 in order ** 2. The first divider cell from Parent @@ -6736,15 +6736,26 @@ static void insertCell( ** 4. The second divider cell from Parent ** 5. All cells from Child-3 in order ** -** The apEnd[] array holds pointer to the end of page for Child-1, the -** Parent, Child-2, the Parent (again), and Child-3. The ixNx[] array -** holds the number of cells contained in each of these 5 stages, and -** all stages to the left. Hence: +** For a table-btree (with rowids) the items 2 and 4 are empty because +** content exists only in leaves and there are no divider cells. +** +** For an index btree, the apEnd[] array holds pointer to the end of page +** for Child-1, the Parent, Child-2, the Parent (again), and Child-3, +** respectively. The ixNx[] array holds the number of cells contained in +** each of these 5 stages, and all stages to the left. Hence: +** ** ixNx[0] = Number of cells in Child-1. ** ixNx[1] = Number of cells in Child-1 plus 1 for first divider. ** ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. ** ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells ** ixNx[4] = Total number of cells. +** +** For a table-btree, the concept is similar, except only apEnd[0]..apEnd[2] +** are used and they point to the leaf pages only, and the ixNx value are: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + both divider cells */ typedef struct CellArray CellArray; struct CellArray { @@ -7658,12 +7669,15 @@ static int balance_nonroot( ** */ usableSpace = pBt->usableSize - 12 + leafCorrection; - for(i=0; iaDataEnd; - b.apEnd[i*2+1] = pParent->aDataEnd; - b.ixNx[i*2] = cntOld[i]; - b.ixNx[i*2+1] = cntOld[i]+1; + b.apEnd[k] = p->aDataEnd; + b.ixNx[k] = cntOld[i]; + if( !leafData ){ + k++; + b.apEnd[k] = pParent->aDataEnd; + b.ixNx[k] = cntOld[i]+1; + } szNew[i] = usableSpace - p->nFree; for(j=0; jnOverflow; j++){ szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); From 38a28a7434d75c27cdeabf9d30fd66eaed3d5625 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Feb 2019 14:54:18 +0000 Subject: [PATCH 181/306] New test cases added to test/fuzzdata8.db. FossilOrigin-Name: e5924939c9c8f39367900360fa294cdb1220e9f68d183e32882e0926f775869d --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 880640 -> 911360 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 6d708aeb85..ead2472201 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\sstrict\senforcement\sof\scell\ssizes\sin\sbalancing\sfrom\ncheck-in\s[12713f320b2c1def]\sso\sthat\sit\salso\sworks\swith\stable-btrees\nin\saddition\sto\sindex-btrees. -D 2019-02-01T14:50:43.745 +C New\stest\scases\sadded\sto\stest/fuzzdata8.db. +D 2019-02-01T14:54:18.031 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db fe1b2ae0e7976f225ae9dd637eb67726154caf0da39ac329fc4a35d9991aef3b +F test/fuzzdata8.db 4d977eebe3447f60bb846dad84744d171a577423ee3e40cf6fffd5585921c96a F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 55f06aa3f890dc1dc5c2ed0e6777e46d609a6f9d223d1d4b5813097ce4f4e797 -R 20b34459b8ccf247d9f81319ceb019f1 +P ef27e7a08728aa7447ae19812803ac5c4a9d80c97541014bd292485792005a3e +R 499050c79febdff496a3aad928c00c5e U drh -Z b1e6b3262e06a43d75a1c54043cfe677 +Z cd73dcbf2849758078b066662b5971ff diff --git a/manifest.uuid b/manifest.uuid index 6d38cb6ecb..0c451b1631 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ef27e7a08728aa7447ae19812803ac5c4a9d80c97541014bd292485792005a3e \ No newline at end of file +e5924939c9c8f39367900360fa294cdb1220e9f68d183e32882e0926f775869d \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 49dfb8ec71d4746365fd1d658d9faa69da0ec73f..805ec157c8f04c5c6791dcab278e6b0210afc214 100644 GIT binary patch delta 8177 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 delta 5355 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 IvL!11|1}W%o&W#< From 9c46c66c46b84290567efb552fb09e80bc758fca Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Feb 2019 15:06:27 +0000 Subject: [PATCH 182/306] Ensure that the Walker.pParse structure is initialized when walking the source tree to gather the WINDOW clauses on a query with window functions. FossilOrigin-Name: 4ca9d5d53d41d08fbce29f9da8cc0948df9c4c3136210af88b499cf889b5ccb8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index ead2472201..9babcd5b76 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sadded\sto\stest/fuzzdata8.db. -D 2019-02-01T14:54:18.031 +C Ensure\sthat\sthe\sWalker.pParse\sstructure\sis\sinitialized\swhen\swalking\sthe\nsource\stree\sto\sgather\sthe\sWINDOW\sclauses\son\sa\squery\swith\swindow\sfunctions. +D 2019-02-01T15:06:27.195 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -466,7 +466,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 4bc508644845d2c9fb870e808df125b233a8d93d132c2184f8db0a034864325a +F src/expr.c c6c10cd52d7d62c358c0bea8f1633c58b56ce4d2b6c9e11923ee3d72d1450ee7 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 @@ -1804,7 +1804,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 ef27e7a08728aa7447ae19812803ac5c4a9d80c97541014bd292485792005a3e -R 499050c79febdff496a3aad928c00c5e +P e5924939c9c8f39367900360fa294cdb1220e9f68d183e32882e0926f775869d +R 3f33dcc0496028451e96df5961af1114 U drh -Z cd73dcbf2849758078b066662b5971ff +Z 6da7b9d2e40a41d8dc0b691b0532f0c7 diff --git a/manifest.uuid b/manifest.uuid index 0c451b1631..857481ca63 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e5924939c9c8f39367900360fa294cdb1220e9f68d183e32882e0926f775869d \ No newline at end of file +4ca9d5d53d41d08fbce29f9da8cc0948df9c4c3136210af88b499cf889b5ccb8 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ec71326e45..a9ae850982 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1363,6 +1363,7 @@ static void gatherSelectWindows(Select *p){ w.xExprCallback = gatherSelectWindowsCallback; w.xSelectCallback = gatherSelectWindowsSelectCallback; w.xSelectCallback2 = 0; + w.pParse = 0; w.u.pSelect = p; sqlite3WalkSelect(&w, p); } From 9a6d01bff53cc0dd705f8d73525774d5cde52cb9 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Feb 2019 18:46:41 +0000 Subject: [PATCH 183/306] Performance improvement in the parsing of options to %-formats in the printf implementation. FossilOrigin-Name: 40d8f8ae87abf928542c4e558a4c3a3eab18776a3e8db7ca1c5e5f744ca0bce3 --- manifest | 12 ++-- manifest.uuid | 2 +- src/printf.c | 158 +++++++++++++++++++++++++++----------------------- 3 files changed, 94 insertions(+), 78 deletions(-) diff --git a/manifest b/manifest index 9babcd5b76..ed762dcfa2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\sWalker.pParse\sstructure\sis\sinitialized\swhen\swalking\sthe\nsource\stree\sto\sgather\sthe\sWINDOW\sclauses\son\sa\squery\swith\swindow\sfunctions. -D 2019-02-01T15:06:27.195 +C Performance\simprovement\sin\sthe\sparsing\sof\soptions\sto\s%-formats\sin\sthe\nprintf\simplementation. +D 2019-02-01T18:46:41.116 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -510,7 +510,7 @@ F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 F src/pragma.h b774c8fdd63ed468ab8206b9b530d5d2523ed8889fbb72d1143d09272d5c6b2c F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 -F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 +F src/printf.c fdea5e38f20413dcef9776c12c2d0eb32ea27cb4192a0f71d193574852631c60 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 @@ -1804,7 +1804,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 e5924939c9c8f39367900360fa294cdb1220e9f68d183e32882e0926f775869d -R 3f33dcc0496028451e96df5961af1114 +P 4ca9d5d53d41d08fbce29f9da8cc0948df9c4c3136210af88b499cf889b5ccb8 +R 3a0fd1c7830f595fdcbdfa420aaebcd3 U drh -Z 6da7b9d2e40a41d8dc0b691b0532f0c7 +Z 027c010e323198cb67ddd7c2ea43d1d6 diff --git a/manifest.uuid b/manifest.uuid index 857481ca63..ef8dfeed48 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4ca9d5d53d41d08fbce29f9da8cc0948df9c4c3136210af88b499cf889b5ccb8 \ No newline at end of file +40d8f8ae87abf928542c4e558a4c3a3eab18776a3e8db7ca1c5e5f744ca0bce3 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index 7bce83f3e2..61317fd049 100644 --- a/src/printf.c +++ b/src/printf.c @@ -237,6 +237,9 @@ void sqlite3_str_vappendf( flag_leftjustify = flag_prefix = cThousand = flag_alternateform = flag_altform2 = flag_zeropad = 0; done = 0; + width = 0; + flag_long = 0; + precision = -1; do{ switch( c ){ case '-': flag_leftjustify = 1; break; @@ -247,80 +250,93 @@ void sqlite3_str_vappendf( case '0': flag_zeropad = 1; break; case ',': cThousand = ','; break; default: done = 1; break; + case 'l': { + flag_long = 1; + c = *++fmt; + if( c=='l' ){ + c = *++fmt; + flag_long = 2; + } + done = 1; + break; + } + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': { + unsigned wx = c - '0'; + while( (c = *++fmt)>='0' && c<='9' ){ + wx = wx*10 + c - '0'; + } + testcase( wx>0x7fffffff ); + width = wx & 0x7fffffff; +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c!='.' && c!='l' ){ + done = 1; + }else{ + fmt--; + } + break; + } + case '*': { + if( bArgList ){ + width = (int)getIntArg(pArgList); + }else{ + width = va_arg(ap,int); + } + if( width<0 ){ + flag_leftjustify = 1; + width = width >= -2147483647 ? -width : 0; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( (c = fmt[1])!='.' && c!='l' ){ + c = *++fmt; + done = 1; + } + break; + } + case '.': { + c = *++fmt; + if( c=='*' ){ + if( bArgList ){ + precision = (int)getIntArg(pArgList); + }else{ + precision = va_arg(ap,int); + } + if( precision<0 ){ + precision = precision >= -2147483647 ? -precision : -1; + } + c = *++fmt; + }else{ + unsigned px = 0; + while( c>='0' && c<='9' ){ + px = px*10 + c - '0'; + c = *++fmt; + } + testcase( px>0x7fffffff ); + precision = px & 0x7fffffff; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + precision = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c=='l' ){ + --fmt; + }else{ + done = 1; + } + break; + } } }while( !done && (c=(*++fmt))!=0 ); - /* Get the field width */ - if( c=='*' ){ - if( bArgList ){ - width = (int)getIntArg(pArgList); - }else{ - width = va_arg(ap,int); - } - if( width<0 ){ - flag_leftjustify = 1; - width = width >= -2147483647 ? -width : 0; - } - c = *++fmt; - }else{ - unsigned wx = 0; - while( c>='0' && c<='9' ){ - wx = wx*10 + c - '0'; - c = *++fmt; - } - testcase( wx>0x7fffffff ); - width = wx & 0x7fffffff; - } - assert( width>=0 ); -#ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ - width = SQLITE_PRINTF_PRECISION_LIMIT; - } -#endif - /* Get the precision */ - if( c=='.' ){ - c = *++fmt; - if( c=='*' ){ - if( bArgList ){ - precision = (int)getIntArg(pArgList); - }else{ - precision = va_arg(ap,int); - } - c = *++fmt; - if( precision<0 ){ - precision = precision >= -2147483647 ? -precision : -1; - } - }else{ - unsigned px = 0; - while( c>='0' && c<='9' ){ - px = px*10 + c - '0'; - c = *++fmt; - } - testcase( px>0x7fffffff ); - precision = px & 0x7fffffff; - } - }else{ - precision = -1; - } - assert( precision>=(-1) ); -#ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ - precision = SQLITE_PRINTF_PRECISION_LIMIT; - } -#endif - - - /* Get the conversion type modifier */ - if( c=='l' ){ - flag_long = 1; - c = *++fmt; - if( c=='l' ){ - flag_long = 2; - c = *++fmt; - } - }else{ - flag_long = 0; - } /* Fetch the info entry for the field */ infop = &fmtinfo[0]; xtype = etINVALID; From 2964225247f1b9418aef50a042b2997edb3b6ad6 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Feb 2019 20:29:04 +0000 Subject: [PATCH 184/306] Prevent the printf formatter from doing large memory allocations - larger than either the size of the static buffer for interfaces like sqlite3_snprintf(), or larger than SQLITE_LIMIT_LENGTH for interfaces that are associated with a database connection. This helps to prevent DOS attacks on products that let hostile sources inject arbitrary SQL. It also helps fuzzers run faster and more effectively. FossilOrigin-Name: 179e5d46054e5c86f53a79b7a0823d9a383da8391ad1d3c3b22645927a1e052b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/printf.c | 47 +++++++++++++++++++++++++++++++---------------- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index ed762dcfa2..ecd87fbd0b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprovement\sin\sthe\sparsing\sof\soptions\sto\s%-formats\sin\sthe\nprintf\simplementation. -D 2019-02-01T18:46:41.116 +C Prevent\sthe\sprintf\sformatter\sfrom\sdoing\slarge\smemory\sallocations\s-\slarger\nthan\seither\sthe\ssize\sof\sthe\sstatic\sbuffer\sfor\sinterfaces\slike\nsqlite3_snprintf(),\sor\slarger\sthan\sSQLITE_LIMIT_LENGTH\sfor\sinterfaces\sthat\nare\sassociated\swith\sa\sdatabase\sconnection.\s\sThis\shelps\sto\sprevent\sDOS\nattacks\son\sproducts\sthat\slet\shostile\ssources\sinject\sarbitrary\sSQL.\s\sIt\salso\nhelps\sfuzzers\srun\sfaster\sand\smore\seffectively. +D 2019-02-01T20:29:04.040 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -510,7 +510,7 @@ F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 F src/pragma.h b774c8fdd63ed468ab8206b9b530d5d2523ed8889fbb72d1143d09272d5c6b2c F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 -F src/printf.c fdea5e38f20413dcef9776c12c2d0eb32ea27cb4192a0f71d193574852631c60 +F src/printf.c 15c8c8c4095cdfeb6a295630b6914fbb702e68d06fc9fa08ff18cd3db6c35596 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 @@ -1804,7 +1804,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 4ca9d5d53d41d08fbce29f9da8cc0948df9c4c3136210af88b499cf889b5ccb8 -R 3a0fd1c7830f595fdcbdfa420aaebcd3 +P 40d8f8ae87abf928542c4e558a4c3a3eab18776a3e8db7ca1c5e5f744ca0bce3 +R 39962f884b7a14fe935665eaeaac0027 U drh -Z 027c010e323198cb67ddd7c2ea43d1d6 +Z 9dd5bee31b2eabbe1bf794461fb9903d diff --git a/manifest.uuid b/manifest.uuid index ef8dfeed48..a5b48ca295 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -40d8f8ae87abf928542c4e558a4c3a3eab18776a3e8db7ca1c5e5f744ca0bce3 \ No newline at end of file +179e5d46054e5c86f53a79b7a0823d9a383da8391ad1d3c3b22645927a1e052b \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index 61317fd049..c732e8be2e 100644 --- a/src/printf.c +++ b/src/printf.c @@ -155,6 +155,27 @@ static char *getTextArg(PrintfArguments *p){ return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); } +/* +** Allocate memory for a temporary buffer needed for printf rendering. +** +** If the requested size of the temp buffer is larger than the size +** of the output buffer in pAccum, then cause an SQLITE_TOOBIG error. +** Do the size check before the memory allocation to prevent rogue +** SQL from requesting large allocations using the precision or width +** field of the printf() function. +*/ +static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ + char *z; + if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ + setStrAccumError(pAccum, SQLITE_TOOBIG); + return 0; + } + z = sqlite3DbMallocRaw(pAccum->db, n); + if( z==0 ){ + setStrAccumError(pAccum, SQLITE_NOMEM); + } + return z; +} /* ** On machines with a small stack size, you can redefine the @@ -422,11 +443,8 @@ void sqlite3_str_vappendf( zOut = buf; }else{ u64 n = (u64)precision + 10 + precision/3; - zOut = zExtra = sqlite3Malloc( n ); - if( zOut==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + zOut = zExtra = printfTempBuf(pAccum, n); + if( zOut==0 ) return; nOut = (int)n; } bufpt = &zOut[nOut-1]; @@ -545,12 +563,12 @@ void sqlite3_str_vappendf( }else{ e2 = exp; } - if( MAX(e2,0)+(i64)precision+(i64)width > etBUFSIZE - 15 ){ - bufpt = zExtra - = sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; + { + i64 szBufNeeded; /* Size of a temporary buffer needed */ + szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15; + if( szBufNeeded > etBUFSIZE ){ + bufpt = zExtra = printfTempBuf(pAccum, szBufNeeded); + if( bufpt==0 ) return; } } zOut = bufpt; @@ -774,11 +792,8 @@ void sqlite3_str_vappendf( needQuote = !isnull && xtype==etSQLESCAPE2; n += i + 3; if( n>etBUFSIZE ){ - bufpt = zExtra = sqlite3Malloc( n ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + bufpt = zExtra = printfTempBuf(pAccum, n); + if( bufpt==0 ) return; }else{ bufpt = buf; } From 7ba03ea15aa0adee1cce6eb4ffe4df8046cb3271 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Feb 2019 21:08:27 +0000 Subject: [PATCH 185/306] Slight adjustment to the printf formatter large memory allocation detector so that it does not overestimate the amount of space needed for oversize %d conversions. FossilOrigin-Name: 1aee70d6de8a9b17ebb74a7cb1dad65139cde1b615dcce4d15d3a476fda8676b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/printf.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ecd87fbd0b..acfb7780fc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prevent\sthe\sprintf\sformatter\sfrom\sdoing\slarge\smemory\sallocations\s-\slarger\nthan\seither\sthe\ssize\sof\sthe\sstatic\sbuffer\sfor\sinterfaces\slike\nsqlite3_snprintf(),\sor\slarger\sthan\sSQLITE_LIMIT_LENGTH\sfor\sinterfaces\sthat\nare\sassociated\swith\sa\sdatabase\sconnection.\s\sThis\shelps\sto\sprevent\sDOS\nattacks\son\sproducts\sthat\slet\shostile\ssources\sinject\sarbitrary\sSQL.\s\sIt\salso\nhelps\sfuzzers\srun\sfaster\sand\smore\seffectively. -D 2019-02-01T20:29:04.040 +C Slight\sadjustment\sto\sthe\sprintf\sformatter\slarge\smemory\sallocation\sdetector\nso\sthat\sit\sdoes\snot\soverestimate\sthe\samount\sof\sspace\sneeded\sfor\noversize\s%d\sconversions. +D 2019-02-01T21:08:27.686 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -510,7 +510,7 @@ F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 F src/pragma.h b774c8fdd63ed468ab8206b9b530d5d2523ed8889fbb72d1143d09272d5c6b2c F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 -F src/printf.c 15c8c8c4095cdfeb6a295630b6914fbb702e68d06fc9fa08ff18cd3db6c35596 +F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 @@ -1804,7 +1804,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 40d8f8ae87abf928542c4e558a4c3a3eab18776a3e8db7ca1c5e5f744ca0bce3 -R 39962f884b7a14fe935665eaeaac0027 +P 179e5d46054e5c86f53a79b7a0823d9a383da8391ad1d3c3b22645927a1e052b +R 50c42a74fe98f5dbb904cae1cb8cbfbb U drh -Z 9dd5bee31b2eabbe1bf794461fb9903d +Z 1fdda9ae13508dc111d3e51c4aa9232f diff --git a/manifest.uuid b/manifest.uuid index a5b48ca295..6fb41c9b0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -179e5d46054e5c86f53a79b7a0823d9a383da8391ad1d3c3b22645927a1e052b \ No newline at end of file +1aee70d6de8a9b17ebb74a7cb1dad65139cde1b615dcce4d15d3a476fda8676b \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index c732e8be2e..f11fb66641 100644 --- a/src/printf.c +++ b/src/printf.c @@ -442,7 +442,9 @@ void sqlite3_str_vappendf( nOut = etBUFSIZE; zOut = buf; }else{ - u64 n = (u64)precision + 10 + precision/3; + u64 n; + n = (u64)precision + 10; + if( cThousand ) n += precision/3; zOut = zExtra = printfTempBuf(pAccum, n); if( zOut==0 ) return; nOut = (int)n; From 844b9004917ac2843eb1eb15c4b2e5cfbf8b5a7b Mon Sep 17 00:00:00 2001 From: mistachkin Date: Sat, 2 Feb 2019 01:27:45 +0000 Subject: [PATCH 186/306] Fix harmless compiler warning. FossilOrigin-Name: dddda685f3443d8a38901f758543fcde73d7b8cfe72b0ad5f419cd7459343bf5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/tokenize.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index acfb7780fc..d58b111327 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Slight\sadjustment\sto\sthe\sprintf\sformatter\slarge\smemory\sallocation\sdetector\nso\sthat\sit\sdoes\snot\soverestimate\sthe\samount\sof\sspace\sneeded\sfor\noversize\s%d\sconversions. -D 2019-02-01T21:08:27.686 +C Fix\sharmless\scompiler\swarning. +D 2019-02-02T01:27:45.671 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -577,7 +577,7 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c a9a474205b7549bc5df46d941c2cc0096f1039dbce2d6f4fe084e1af9ba49aa2 +F src/tokenize.c 0a065eaa31f494ba31ac21d4a5d24a5a7865a7d849459f8c6266df1ac6b9aedf F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1 @@ -1804,7 +1804,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 179e5d46054e5c86f53a79b7a0823d9a383da8391ad1d3c3b22645927a1e052b -R 50c42a74fe98f5dbb904cae1cb8cbfbb -U drh -Z 1fdda9ae13508dc111d3e51c4aa9232f +P 1aee70d6de8a9b17ebb74a7cb1dad65139cde1b615dcce4d15d3a476fda8676b +R 583d30fa3e42d45463163548707233f9 +U mistachkin +Z b053a74a348fba4f89bc506f6888cd90 diff --git a/manifest.uuid b/manifest.uuid index 6fb41c9b0b..84a6ff56fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1aee70d6de8a9b17ebb74a7cb1dad65139cde1b615dcce4d15d3a476fda8676b \ No newline at end of file +dddda685f3443d8a38901f758543fcde73d7b8cfe72b0ad5f419cd7459343bf5 \ No newline at end of file diff --git a/src/tokenize.c b/src/tokenize.c index a0e1450214..2d7b23d4e0 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -747,7 +747,7 @@ char *sqlite3Normalize( int i; /* Next unread byte of zSql[] */ int n; /* length of current token */ int tokenType; /* type of current token */ - int prevType; /* Previous non-whitespace token */ + int prevType = 0; /* Previous non-whitespace token */ int nParen; /* Number of nested levels of parentheses */ int iStartIN; /* Start of RHS of IN operator in z[] */ int nParenAtIN; /* Value of nParent at start of RHS of IN operator */ From 8f5b14a5c25d7ee74d9b97121df54fbe987b2750 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 2 Feb 2019 13:47:25 +0000 Subject: [PATCH 187/306] Fix a buffer overread in fts5 debugging scalar function fts5_decode(). FossilOrigin-Name: 54f2399fb2a626602d405c857297f2da833f9f048cbc478f9110bed2e9bda299 --- ext/fts5/fts5_index.c | 4 + ext/fts5/test/fts5corrupt3.test | 155 ++++++++++++++++++++++++++++++++ manifest | 16 ++-- manifest.uuid | 2 +- 4 files changed, 168 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 202f9eb6a0..5e02bd3d02 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -6427,6 +6427,10 @@ static void fts5DecodeFunction( /* Decode any more doclist data that appears on the page before the ** first term. */ nDoclist = (iTermOff ? iTermOff : szLeaf) - iOff; + if( nDoclist+iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodeDoclist(&rc, &s, &a[iOff], nDoclist); while( iPgidxOff Date: Sat, 2 Feb 2019 15:05:25 +0000 Subject: [PATCH 188/306] Give a link to the URI Filename document in the documentation to the various sqlite3_uri_parameter() interfaces. FossilOrigin-Name: 69b0b2ee536fda8975f60643f7f1891db4649958aca476822ea2a632ce731992 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9e602b4313..1d82911904 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverread\sin\sfts5\sdebugging\sscalar\sfunction\sfts5_decode(). -D 2019-02-02T13:47:25.356 +C Give\sa\slink\sto\sthe\sURI\sFilename\sdocument\sin\sthe\sdocumentation\sto\sthe\nvarious\ssqlite3_uri_parameter()\sinterfaces. +D 2019-02-02T15:05:25.526 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -516,7 +516,7 @@ F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 F src/shell.c.in 705a00be4fa43303b6b18df2241f5397cefd8d9f076bb035ad01b42635c7a1de -F src/sqlite.h.in 947ac377d889055e0979138cc85b3a3b42ee53170b8d55bd589a1ced0e6928f6 +F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 F src/sqliteInt.h 7899f2f28c98e998e9720bf9b23b19aa364caf0a0d0a4086334adda3a1b9fa83 @@ -1804,7 +1804,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 dddda685f3443d8a38901f758543fcde73d7b8cfe72b0ad5f419cd7459343bf5 -R d08b7cb5f0e284d3ac81f061248119d3 -U dan -Z fbe78a81bc0755e839781dfb1d8c48c4 +P 54f2399fb2a626602d405c857297f2da833f9f048cbc478f9110bed2e9bda299 +R 35ab62be955e83ce3eb257cab8fb6431 +U drh +Z 83fb623c339726ca638dde4a43d8ba04 diff --git a/manifest.uuid b/manifest.uuid index a06979aa1e..5518e15252 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -54f2399fb2a626602d405c857297f2da833f9f048cbc478f9110bed2e9bda299 \ No newline at end of file +69b0b2ee536fda8975f60643f7f1891db4649958aca476822ea2a632ce731992 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index bbc1d13b37..392532a6f7 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3429,6 +3429,8 @@ int sqlite3_open_v2( ** is not a database file pathname pointer that SQLite passed into the xOpen ** VFS method, then the behavior of this routine is undefined and probably ** undesirable. +** +** See the [URI filename] documentation for additional information. */ const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); From e5989723ba9b6510728d8a50f35347dc8aa4ee6b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Feb 2019 15:59:49 +0000 Subject: [PATCH 189/306] Honor key query parameters for SEE on the URI filename for ATTACH and VACUUM INTO. FossilOrigin-Name: 2e01096b8933a2315e3dffcd7d0de84c744c1b4be1d909388c61f0fd636ddb99 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/attach.c | 15 +++++++++------ src/main.c | 51 ++++++++++++++++++++++++++++++++++--------------- src/sqliteInt.h | 5 +++++ 5 files changed, 59 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index 1d82911904..d5d994ac74 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Give\sa\slink\sto\sthe\sURI\sFilename\sdocument\sin\sthe\sdocumentation\sto\sthe\nvarious\ssqlite3_uri_parameter()\sinterfaces. -D 2019-02-02T15:05:25.526 +C Honor\skey\squery\sparameters\sfor\sSEE\son\sthe\sURI\sfilename\sfor\sATTACH\s\nand\sVACUUM\sINTO. +D 2019-02-02T15:59:49.826 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -450,7 +450,7 @@ F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c cb691d6cd330312b7951c9d3bc0bc29804bbe80beac1cdd137d824b119b6f28a F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 -F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd +F src/attach.c 3f9b0f6c79500cc40f4e543bc130a0b4ee13f52b45cbb6735608776cbdb79f0e F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 @@ -478,7 +478,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 3ed9ceaa4b7d56a6f2613355e1cd1ae5cfe31712bce2bf5aa93c5f1f130704b2 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 -F src/main.c ac8da4375e870d0bc359e6028644ba01c67ca0af3cc03f61a917e1e2917e040a +F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -519,7 +519,7 @@ F src/shell.c.in 705a00be4fa43303b6b18df2241f5397cefd8d9f076bb035ad01b42635c7a1d F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 7899f2f28c98e998e9720bf9b23b19aa364caf0a0d0a4086334adda3a1b9fa83 +F src/sqliteInt.h f657e35d824fdc17ddf46bb85f0193df3b965e8354ded9ec37825057e3224bcc F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1804,7 +1804,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 54f2399fb2a626602d405c857297f2da833f9f048cbc478f9110bed2e9bda299 -R 35ab62be955e83ce3eb257cab8fb6431 +P 69b0b2ee536fda8975f60643f7f1891db4649958aca476822ea2a632ce731992 +R 997b448db68d3c909bebb8c879b2cd6d U drh -Z 83fb623c339726ca638dde4a43d8ba04 +Z 1e6a7f7be5667686510be9242a9cd19f diff --git a/manifest.uuid b/manifest.uuid index 5518e15252..898ab2e463 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -69b0b2ee536fda8975f60643f7f1891db4649958aca476822ea2a632ce731992 \ No newline at end of file +2e01096b8933a2315e3dffcd7d0de84c744c1b4be1d909388c61f0fd636ddb99 \ No newline at end of file diff --git a/src/attach.c b/src/attach.c index 0b87d24cf8..224d120b6f 100644 --- a/src/attach.c +++ b/src/attach.c @@ -155,8 +155,8 @@ static void attachFunc( assert( pVfs ); flags |= SQLITE_OPEN_MAIN_DB; rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags); - sqlite3_free( zPath ); db->nDb++; + pNew->zDbSName = sqlite3DbStrDup(db, zName); } db->noSharedCache = 0; if( rc==SQLITE_CONSTRAINT ){ @@ -184,7 +184,6 @@ static void attachFunc( sqlite3BtreeLeave(pNew->pBt); } pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; - if( !REOPEN_AS_MEMDB(db) ) pNew->zDbSName = sqlite3DbStrDup(db, zName); if( rc==SQLITE_OK && pNew->zDbSName==0 ){ rc = SQLITE_NOMEM_BKPT; } @@ -212,15 +211,19 @@ static void attachFunc( break; case SQLITE_NULL: - /* No key specified. Use the key from the main database */ - sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); - if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ - rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + /* No key specified. Use the key from URI filename, or if none, + ** use the key from the main database. */ + if( sqlite3CodecQueryParameters(db, zName, zPath)==0 ){ + sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); + if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ + rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + } } break; } } #endif + sqlite3_free( zPath ); /* If the file was opened successfully, read the schema for the new database. ** If this fails, or if opening the file failed, then close the file and diff --git a/src/main.c b/src/main.c index c40e6e877a..41e0245477 100644 --- a/src/main.c +++ b/src/main.c @@ -2942,6 +2942,40 @@ int sqlite3ParseUri( return rc; } +#if defined(SQLITE_HAS_CODEC) +/* +** Process URI filename query parameters relevant to the SQLite Encryption +** Extension. Return true if any of the relevant query parameters are +** seen and return false if not. +*/ +int sqlite3CodecQueryParameters( + sqlite3 *db, /* Database connection */ + const char *zDb, /* Which schema is being created/attached */ + const char *zUri /* URI filename */ +){ + const char *zKey; + if( (zKey = sqlite3_uri_parameter(zUri, "hexkey"))!=0 && zKey[0] ){ + u8 iByte; + int i; + char zDecoded[40]; + for(i=0, iByte=0; i Date: Sat, 2 Feb 2019 18:24:28 +0000 Subject: [PATCH 190/306] New testcase added to test/fuzzdata8.db. FossilOrigin-Name: 2f5c1925b94d85489533549c58191feb1d803ad9d58b43f47fef42b72c531a38 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 911360 -> 915456 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d5d994ac74..b025340daa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Honor\skey\squery\sparameters\sfor\sSEE\son\sthe\sURI\sfilename\sfor\sATTACH\s\nand\sVACUUM\sINTO. -D 2019-02-02T15:59:49.826 +C New\stestcase\sadded\sto\stest/fuzzdata8.db. +D 2019-02-02T18:24:28.180 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 4d977eebe3447f60bb846dad84744d171a577423ee3e40cf6fffd5585921c96a +F test/fuzzdata8.db 411f8398e0a4ea1a219abeb18fcb695d670479e787c997e7d54737a5c8e22935 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 69b0b2ee536fda8975f60643f7f1891db4649958aca476822ea2a632ce731992 -R 997b448db68d3c909bebb8c879b2cd6d +P 2e01096b8933a2315e3dffcd7d0de84c744c1b4be1d909388c61f0fd636ddb99 +R 742814539bcab3a0e1fefee487a3682a U drh -Z 1e6a7f7be5667686510be9242a9cd19f +Z 1bf316c7c8e06ced5f02590d0f4da5e7 diff --git a/manifest.uuid b/manifest.uuid index 898ab2e463..dadb84ed1c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2e01096b8933a2315e3dffcd7d0de84c744c1b4be1d909388c61f0fd636ddb99 \ No newline at end of file +2f5c1925b94d85489533549c58191feb1d803ad9d58b43f47fef42b72c531a38 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 805ec157c8f04c5c6791dcab278e6b0210afc214..a03a672df46b046f43c9b52c0d90553fee8095fe 100644 GIT binary patch delta 4411 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 From 41fc5451475d52da02c6f10224de7937e56cc1aa Mon Sep 17 00:00:00 2001 From: dan Date: Sun, 3 Feb 2019 07:46:07 +0000 Subject: [PATCH 191/306] Fix an assertion failure in fts3 triggered by a corrupt database. FossilOrigin-Name: 560ebd4269fad07b8e988d070454017123593eb6762597d08e8c32d7b4fb92ac --- ext/fts3/fts3_snippet.c | 13 ++- manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 222 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 239 insertions(+), 14 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 58419536ae..115e98abfc 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -476,11 +476,14 @@ static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ int iFirst = 0; pPhrase->pList = pCsr; fts3GetDeltaPosition(&pCsr, &iFirst); - assert( iFirst>=0 ); - pPhrase->pHead = pCsr; - pPhrase->pTail = pCsr; - pPhrase->iHead = iFirst; - pPhrase->iTail = iFirst; + if( iFirst<0 ){ + rc = FTS_CORRUPT_VTAB; + }else{ + pPhrase->pHead = pCsr; + pPhrase->pTail = pCsr; + pPhrase->iHead = iFirst; + pPhrase->iTail = iFirst; + } }else{ assert( rc!=SQLITE_OK || ( pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 diff --git a/manifest b/manifest index b025340daa..a930de92fc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stestcase\sadded\sto\stest/fuzzdata8.db. -D 2019-02-02T18:24:28.180 +C Fix\san\sassertion\sfailure\sin\sfts3\striggered\sby\sa\scorrupt\sdatabase. +D 2019-02-03T07:46:07.192 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -89,7 +89,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 54ac8f4602924c0c57f933e60140ef243976382b80d7c0d8df5a924010803ef8 +F ext/fts3/fts3_snippet.c ac1f8945375d07076b7178de1fe549982e6ae6f050095e7f7e400ec4448f31df F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 @@ -918,7 +918,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test c40a7895d8b17f75e6e3cf83e0cb14146c0affc23f7879b7d472f39f363146b3 +F test/fts3corrupt4.test ff7313656c4ad446e61c41e5cb81336441eaaafe6f4fd6938f1c3ac0c985045e F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1804,7 +1804,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 2e01096b8933a2315e3dffcd7d0de84c744c1b4be1d909388c61f0fd636ddb99 -R 742814539bcab3a0e1fefee487a3682a -U drh -Z 1bf316c7c8e06ced5f02590d0f4da5e7 +P 2f5c1925b94d85489533549c58191feb1d803ad9d58b43f47fef42b72c531a38 +R ca6e32f20554e5ebbc2af231f147a465 +U dan +Z 55797447d68869aefb742251fd6fece1 diff --git a/manifest.uuid b/manifest.uuid index dadb84ed1c..4c73539d87 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2f5c1925b94d85489533549c58191feb1d803ad9d58b43f47fef42b72c531a38 \ No newline at end of file +560ebd4269fad07b8e988d070454017123593eb6762597d08e8c32d7b4fb92ac \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index c6c7751a4b..3fd616b688 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -2829,6 +2829,228 @@ do_catchsql_test 18.1 { SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; } {0 0} +#------------------------------------------------------------------------- +reset_db +do_test 19.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-526ea445f41c02.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 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 67 64 69 72 egdir_1t1_segdir +| 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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 41 43 52 ...._tablet1tACR +| 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 39 00 00 00 00 00 (a,b,c)...9..... +| 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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2f .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 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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: 4f 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c OARY....#..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 4d f5 20 46 54 53 34 ..#..ENABM. FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 52 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ARLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 04 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 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 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 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 03 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 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 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 13 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 12 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 81 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 e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 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 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-526ea445f41c02.db +}]} {} + +do_catchsql_test 19.1 { + SELECT rowid,a,c,snippet(t1,85101090932165,-1,10) FROM t1 WHERE a MATCH 'rtree'; +} {1 {database disk image is malformed}} finish_test From 81f44cdbfb1cdda3e0e59b0b0cd51b38a04b3206 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 4 Feb 2019 11:54:22 +0000 Subject: [PATCH 192/306] Fix another corruption case in fts5. FossilOrigin-Name: e608085d3f7e3cc0015fde626e205ee9842ef3cd06dc879fbbc7f2067c592965 --- ext/fts5/fts5_index.c | 1 + ext/fts5/test/fts5corrupt3.test | 218 ++++++++++++++++++++++++++++++++ manifest | 14 +- manifest.uuid | 2 +- 4 files changed, 227 insertions(+), 8 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 5e02bd3d02..aea10180ad 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4552,6 +4552,7 @@ static void fts5FlushOneHash(Fts5Index *p){ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid); writer.bFirstRowidInPage = 0; fts5WriteDlidxAppend(p, &writer, iRowid); + if( p->rc!=SQLITE_OK ) break; }else{ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iDelta); } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index fba2e8e1a4..36a269af1f 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -7127,6 +7127,224 @@ do_catchsql_test 52.1 { SELECT fts5_decode(id, block) FROM t1_data; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 53.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-dbe9b7614da103.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 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 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 02 07 17 1b 1b 01 81 01 74 61 62 6b WIDU........tabk +| 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 10 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 2a ...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 0e 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 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 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: 80 80 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: 80 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 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 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 14 2a 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 16 00 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 30 00 00 00 11 02 01 .........0...... +| 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 0e 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 89 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: 00 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 02 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 16 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 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 03 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 70 .......e.......p +| 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 03 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 02 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 80 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 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 86 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 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 07 ....2.......1t.. +| 3744: f4 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 08 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 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 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 0f 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 00 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 33 44 65 ......1......3De +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 75 ......0t......0u +| 4080: 26 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 &.....0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 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 08 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f 00 00 00 00 00 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 0c e9 ................ +| end crash-dbe9b7614da103.db +}]} {} + +do_catchsql_test 53.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x<>1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} {1 {database disk image is malformed}} + + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index a930de92fc..34c094e134 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassertion\sfailure\sin\sfts3\striggered\sby\sa\scorrupt\sdatabase. -D 2019-02-03T07:46:07.192 +C Fix\sanother\scorruption\scase\sin\sfts5. +D 2019-02-04T11:54:22.218 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 2e8d2ff00465907656303fabb7de5e5d9f738b8f385b557dc7db8d539d16c84e +F ext/fts5/fts5_index.c 688b61d543e58e73f17d81f3c675d9500b153603c438444cbc0d4d194404f98c F ext/fts5/fts5_main.c 2395658479bca37d0936d47e6194ef575e5e7235ded47fa93bd9d5bb8035b977 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test eea623d96e13858059f516caafb59283f628a412f86173f7b63da4630ea7b2c4 +F ext/fts5/test/fts5corrupt3.test 182b3092de232fff3d479ec9c869adb7370bab63097226202d93c07dd92ecc93 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 2f5c1925b94d85489533549c58191feb1d803ad9d58b43f47fef42b72c531a38 -R ca6e32f20554e5ebbc2af231f147a465 +P 560ebd4269fad07b8e988d070454017123593eb6762597d08e8c32d7b4fb92ac +R 22f5733e86c8222346bfb62bdb502de3 U dan -Z 55797447d68869aefb742251fd6fece1 +Z 273065b5c8571627e847e8b3ad505054 diff --git a/manifest.uuid b/manifest.uuid index 4c73539d87..f0c4a5dc6f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -560ebd4269fad07b8e988d070454017123593eb6762597d08e8c32d7b4fb92ac \ No newline at end of file +e608085d3f7e3cc0015fde626e205ee9842ef3cd06dc879fbbc7f2067c592965 \ No newline at end of file From 0062ddd4c946b727cb9b2e876878fa133e5738f7 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 4 Feb 2019 14:00:20 +0000 Subject: [PATCH 193/306] Fix another potential buffer overread in fts5. FossilOrigin-Name: 14fba4cc5db2bc206f024bfa5dd82fffdbc7577162da2c3b15a91cc1c91f3846 --- ext/fts5/fts5_index.c | 4 +- ext/fts5/test/fts5corrupt3.test | 214 ++++++++++++++++++++++++++++++++ manifest | 14 +-- manifest.uuid | 2 +- 4 files changed, 225 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index aea10180ad..5ce75bd1e1 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4784,11 +4784,13 @@ static void fts5AppendPoslist( Fts5Buffer *pBuf ){ int nData = pMulti->base.nData; + int nByte = nData + 9 + 9 + FTS5_DATA_ZERO_PADDING; assert( nData>0 ); - if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nData+9+9) ){ + if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nByte) ){ fts5BufferSafeAppendVarint(pBuf, iDelta); fts5BufferSafeAppendVarint(pBuf, nData*2); fts5BufferSafeAppendBlob(pBuf, pMulti->base.pData, nData); + memset(&pBuf->p[pBuf->n], 0, FTS5_DATA_ZERO_PADDING); } } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 36a269af1f..d4b07ecf02 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -7343,7 +7343,221 @@ do_catchsql_test 53.1 { INSERT INTO t1(a) SELECT randomblob(3000) FROM c; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 54.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-03a1855566d9ae.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 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 2a 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_c*nfigt1_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 73 73 !...tablet1_doss +| 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 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........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 32 2c 32 2c 33 ,b,prefix=.2,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 cd 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 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 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 05 62 03 04 0a 19 8c 80 80 ....tab.b....... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 39 a7 68 03 02 .....8.....9.h.. +| 2560: 04 10 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: 80 80 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 ff 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: 80 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 cc 03 02 03 07 1c 8c 80 80 80 .0tabl.......... +| 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 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 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 14 2a 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 16 00 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 30 00 00 00 11 02 01 .........0...... +| 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 0e 03 05 0c 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: 84 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 .h........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: 00 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 02 12 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 11 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: 08 f0 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 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 06 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 03 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 00 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 de 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 80 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 00 f2 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 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 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 05 52 08 04 01 ...0n.......R... +| 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 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 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 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 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 f4 09 11 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 e4 .....2th......2. +| 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 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 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 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 23 03 02 01 03 03 02 02 01 02 02 00 f2 09 ..#............. +| end crash-03a1855566d9ae.db +}]} {} +do_catchsql_test 54.1 { + SELECT rowid==-1 FROM t1('t*'); +} {0 {0 0 0}} sqlite3_fts5_may_be_corrupt 0 diff --git a/manifest b/manifest index 34c094e134..b1d27f1db9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\scorruption\scase\sin\sfts5. -D 2019-02-04T11:54:22.218 +C Fix\sanother\spotential\sbuffer\soverread\sin\sfts5. +D 2019-02-04T14:00:20.889 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c 688b61d543e58e73f17d81f3c675d9500b153603c438444cbc0d4d194404f98c +F ext/fts5/fts5_index.c ffff7e8d41594256cacf7b32072f8bc06478a86026196a7eb084450065df8d92 F ext/fts5/fts5_main.c 2395658479bca37d0936d47e6194ef575e5e7235ded47fa93bd9d5bb8035b977 F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 182b3092de232fff3d479ec9c869adb7370bab63097226202d93c07dd92ecc93 +F ext/fts5/test/fts5corrupt3.test a2607431972f2a2ac5b7212aeeacc08fc16877cd8db0f16e60066748590b5665 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 560ebd4269fad07b8e988d070454017123593eb6762597d08e8c32d7b4fb92ac -R 22f5733e86c8222346bfb62bdb502de3 +P e608085d3f7e3cc0015fde626e205ee9842ef3cd06dc879fbbc7f2067c592965 +R 5b0a9d78197ef0ddde028de705d5dd68 U dan -Z 273065b5c8571627e847e8b3ad505054 +Z 88407bf623e9d02a54fc59e1f78deaa8 diff --git a/manifest.uuid b/manifest.uuid index f0c4a5dc6f..7d033e6615 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e608085d3f7e3cc0015fde626e205ee9842ef3cd06dc879fbbc7f2067c592965 \ No newline at end of file +14fba4cc5db2bc206f024bfa5dd82fffdbc7577162da2c3b15a91cc1c91f3846 \ No newline at end of file From 3f83f591541b562b39c2b9cf8b9fcfab54d535e7 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Feb 2019 14:53:18 +0000 Subject: [PATCH 194/306] Add the ".progress" command to the CLI. FossilOrigin-Name: ad84ca24ff760f7a2b128f2eeb4d799a97f84b8b8a8bb8d9657c4c555f6ccf47 --- manifest | 14 ++++----- manifest.uuid | 2 +- src/shell.c.in | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b1d27f1db9..807b34a7fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\spotential\sbuffer\soverread\sin\sfts5. -D 2019-02-04T14:00:20.889 +C Add\sthe\s".progress"\scommand\sto\sthe\sCLI. +D 2019-02-04T14:53:18.530 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -515,7 +515,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 -F src/shell.c.in 705a00be4fa43303b6b18df2241f5397cefd8d9f076bb035ad01b42635c7a1de +F src/shell.c.in d9898bedbddb8b47dcb07c0b948addfe312e76af0ccfc42d2bedac9634153557 F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1804,7 +1804,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 e608085d3f7e3cc0015fde626e205ee9842ef3cd06dc879fbbc7f2067c592965 -R 5b0a9d78197ef0ddde028de705d5dd68 -U dan -Z 88407bf623e9d02a54fc59e1f78deaa8 +P 14fba4cc5db2bc206f024bfa5dd82fffdbc7577162da2c3b15a91cc1c91f3846 +R dfe82ebd7478b9a85403422449ab407a +U drh +Z d147cbcb5347a91cfedf57995c7ee3d2 diff --git a/manifest.uuid b/manifest.uuid index 7d033e6615..9395b86eed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -14fba4cc5db2bc206f024bfa5dd82fffdbc7577162da2c3b15a91cc1c91f3846 \ No newline at end of file +ad84ca24ff760f7a2b128f2eeb4d799a97f84b8b8a8bb8d9657c4c555f6ccf47 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 41832906ac..746caaedc0 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1028,6 +1028,9 @@ struct ShellState { int writableSchema; /* True if PRAGMA writable_schema=ON */ int showHeader; /* True to show column names in List or Column mode */ int nCheck; /* Number of ".check" commands run */ + unsigned nProgress; /* Number of progress callbacks encountered */ + unsigned mxProgress; /* Maximum progress callbacks before failing */ + unsigned flgProgress; /* Flags for the progress callback */ unsigned shellFlgs; /* Various flags */ sqlite3_int64 szMax; /* --maxsize argument to .open */ char *zDestTable; /* Name of destination table when MODE_Insert */ @@ -1082,6 +1085,13 @@ struct ShellState { #define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ #define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ +/* Bits in the ShellState.flgProgress variable */ +#define PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ +#define PROGRESS_RESET 0x02 /* Reset the count when the progres + ** callback limit is reached, and for each + ** top-level SQL statement */ +#define PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ + /* ** These are the allowed shellFlgs values */ @@ -1782,6 +1792,24 @@ static void eqp_render(ShellState *p){ } } +/* +** Progress handler callback. +*/ +static int progress_handler(void *pClientData) { + ShellState *p = (ShellState*)pClientData; + p->nProgress++; + if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ + raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); + if( p->flgProgress & PROGRESS_RESET ) p->nProgress = 0; + if( p->flgProgress & PROGRESS_ONCE ) p->mxProgress = 0; + return 1; + } + if( (p->flgProgress & PROGRESS_QUIET)==0 ){ + raw_printf(p->out, "Progress %u\n", p->nProgress); + } + return 0; +} + /* ** This is the callback routine that the shell ** invokes for each row of a query result. @@ -3468,6 +3496,11 @@ static const char *(azHelp[]) = { ".output ?FILE? Send output to FILE or stdout if FILE is omitted", " If FILE begins with '|' then open it as a pipe.", ".print STRING... Print literal STRING", + ".progress N Invoke progress handler after every N opcodes", + " --limit N Interrupt after N progress callbacks", + " --once Do no more than one progress interrupt", + " --quiet|-q No output except at interrupts", + " --reset Reset the count for each input and interrupt", ".prompt MAIN CONTINUE Replace the standard prompts", ".quit Exit this program", ".read FILE Read input from FILE", @@ -7000,6 +7033,50 @@ static int do_meta_command(char *zLine, ShellState *p){ raw_printf(p->out, "\n"); }else + if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ + int i; + int n = 0; + p->flgProgress = 0; + p->mxProgress = 0; + p->nProgress = 0; + for(i=1; iflgProgress |= PROGRESS_QUIET; + continue; + } + if( strcmp(z,"reset")==0 ){ + p->flgProgress |= PROGRESS_RESET; + continue; + } + if( strcmp(z,"once")==0 ){ + p->flgProgress |= PROGRESS_ONCE; + continue; + } + if( strcmp(z,"limit")==0 ){ + if( i+1>=nArg ){ + utf8_printf(stderr, "Error: missing argument on --limit\n"); + rc = 1; + goto meta_command_exit; + }else{ + p->mxProgress = (int)integerValue(azArg[++i]); + } + continue; + } + utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); + rc = 1; + goto meta_command_exit; + }else{ + n = (int)integerValue(z); + } + } + open_db(p, 0); + sqlite3_progress_handler(p->db, n, progress_handler, p); + }else + if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ if( nArg >= 2) { strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); @@ -8335,6 +8412,7 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ open_db(p, 0); if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); + if( p->flgProgress & PROGRESS_RESET ) p->nProgress = 0; BEGIN_TIMER; rc = shell_exec(p, zSql, &zErrMsg); END_TIMER; From 83a635a267b9138a724cfc2b0be280859f9f54b3 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 4 Feb 2019 16:25:40 +0000 Subject: [PATCH 195/306] Fix problems with SAVEPOINT and related commands within transactions on a corrupt database that include fts5 or some other virtual tables. FossilOrigin-Name: b0da6e0dd1f9a9ba7646ee6bb3c14945e570303c9a42d20fa8a653570e12c3f9 --- ext/fts5/fts5_main.c | 2 +- ext/fts5/test/fts5ai.test | 6 + ext/fts5/test/fts5corrupt3.test | 221 ++++++++++++++++++++++++++++++++ manifest | 20 +-- manifest.uuid | 2 +- src/vtab.c | 2 + 6 files changed, 241 insertions(+), 12 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 53b6ab3c32..f20c01b039 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -288,7 +288,7 @@ static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){ case FTS5_ROLLBACKTO: assert( p->ts.eState==1 ); - assert( iSavepoint>=0 ); + assert( iSavepoint>=-1 ); assert( iSavepoint<=p->ts.iSavepoint ); p->ts.iSavepoint = iSavepoint; break; diff --git a/ext/fts5/test/fts5ai.test b/ext/fts5/test/fts5ai.test index 24e780a7dd..20e1069398 100644 --- a/ext/fts5/test/fts5ai.test +++ b/ext/fts5/test/fts5ai.test @@ -51,6 +51,12 @@ do_execsql_test 1.1 { do_execsql_test 1.2 { INSERT INTO t1(t1) VALUES('integrity-check'); } + +do_execsql_test 1.3 { + SAVEPOINT one; + INSERT INTO t1 VALUES('v w x'); + ROLLBACK TO one; +} } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index d4b07ecf02..d74fbcce0c 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -7559,6 +7559,227 @@ do_catchsql_test 54.1 { SELECT rowid==-1 FROM t1('t*'); } {0 {0 0 0}} +#------------------------------------------------------------------------- +reset_db +do_test 55.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-b366b5ac0d3887.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 05 90 00 00 09 00 00 00 04 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 43 4c 4f 42 29 5e 05 07 17 21 Y, sz CLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 32 5f 69 64 78 74 ...-tablet2_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 42 52 59 20 4b 45 59 EGER PRIMBRY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)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 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 f1 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 08 d6 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 00 00 00 00 .......x.W.>.... +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 20 f5 00 33 0f 19 4f 4d 0XRTRIM. ..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4c 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 LAX 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 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 30 45 4e 41 42 INARY....%.0ENAB +| 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 4f 41 42 4c 45 20 46 54 53 35 58 .#..EOABLE 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 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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 31 42 58 42 49 4e 41 52 59 1e TAT VT1BXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 15 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 42 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XBTRIM'...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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 1f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 07 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 05 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 01 17 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 02 f0 12 06 01 01 ................ +| 4080: 06 02 03 00 13 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 77 72 .........+intewr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-b366b5ac0d3887.db +}]} {} + +do_execsql_test 55.1 { + SAVEPOINT one; + DELETE FROM t1 WHERE a MATCH 'ts'; +} + +do_execsql_test 55.2 { + ROLLBACK TO one; +} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 807b34a7fb..b17ecd0a4c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s".progress"\scommand\sto\sthe\sCLI. -D 2019-02-04T14:53:18.530 +C Fix\sproblems\swith\sSAVEPOINT\sand\srelated\scommands\swithin\stransactions\son\sa\scorrupt\sdatabase\sthat\sinclude\sfts5\sor\ssome\sother\svirtual\stables. +D 2019-02-04T16:25:40.994 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -116,7 +116,7 @@ F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe1 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 F ext/fts5/fts5_index.c ffff7e8d41594256cacf7b32072f8bc06478a86026196a7eb084450065df8d92 -F ext/fts5/fts5_main.c 2395658479bca37d0936d47e6194ef575e5e7235ded47fa93bd9d5bb8035b977 +F ext/fts5/fts5_main.c 95d63bbe6075955961e56878c3a8705dc475c2b17f5c767f7b8af14093ae614b F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -136,7 +136,7 @@ F ext/fts5/test/fts5ae.test 1142d16d9cc193894dc13cc8f9c7a8a21411ac61b5567a878514 F ext/fts5/test/fts5af.test 724247405b13f8f06cc6ce464dc4f152dc5dd4e86b12c2099685d8f19747bf7b F ext/fts5/test/fts5ag.test 7816f25a0707578f08145ab539fc0ca025f8951e788b28a6a18a06b2099469dd F ext/fts5/test/fts5ah.test 27b5a33bfd0363ca8a4dc659e6e2a5df3dea1c3c5b04bc51ca6aeb1277bd9b21 -F ext/fts5/test/fts5ai.test d837c42249c0d8ad1a2912270e22cf2f303790a611f85c0be3a58e42a3696e3d +F ext/fts5/test/fts5ai.test bc97e4758cc93e06bf851d61c98fdf4e8b8f8315ee28a84fb15f916360856414 F ext/fts5/test/fts5aj.test 745020852d85f5dd49d11cb7ad11d3cc6dafc4fe6d6d24bc0875ac8f43ee4149 F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60a7b8825b60a6 F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test a2607431972f2a2ac5b7212aeeacc08fc16877cd8db0f16e60066748590b5665 +F ext/fts5/test/fts5corrupt3.test 4c506a138797d23049bf08552b4571f5beb5138ab7b3329b9210fe5aac8796d2 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -594,7 +594,7 @@ F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c9419 F src/vdbemem.c 8d170e387c230d12250d2feaec2c1a0d9a7184753f676df10a4b28f17abfcdaf F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 -F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa +F src/vtab.c 2462b7d6fd72b0b916477f5ef210ee49ab58cec195483ebdac0c8c5e3ec42cab F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a @@ -1804,7 +1804,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 14fba4cc5db2bc206f024bfa5dd82fffdbc7577162da2c3b15a91cc1c91f3846 -R dfe82ebd7478b9a85403422449ab407a -U drh -Z d147cbcb5347a91cfedf57995c7ee3d2 +P ad84ca24ff760f7a2b128f2eeb4d799a97f84b8b8a8bb8d9657c4c555f6ccf47 +R 68d02601b8536e27df485a4b829962c8 +U dan +Z db686b509623b6d0d2c5899e5840386c diff --git a/manifest.uuid b/manifest.uuid index 9395b86eed..bd87ae8034 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ad84ca24ff760f7a2b128f2eeb4d799a97f84b8b8a8bb8d9657c4c555f6ccf47 \ No newline at end of file +b0da6e0dd1f9a9ba7646ee6bb3c14945e570303c9a42d20fa8a653570e12c3f9 \ No newline at end of file diff --git a/src/vtab.c b/src/vtab.c index 1b8d283239..8814b5f4c1 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -1001,6 +1001,7 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ const sqlite3_module *pMod = pVTab->pMod->pModule; if( pVTab->pVtab && pMod->iVersion>=2 ){ int (*xMethod)(sqlite3_vtab *, int); + sqlite3VtabLock(pVTab); switch( op ){ case SAVEPOINT_BEGIN: xMethod = pMod->xSavepoint; @@ -1016,6 +1017,7 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ if( xMethod && pVTab->iSavepoint>iSavepoint ){ rc = xMethod(pVTab->pVtab, iSavepoint); } + sqlite3VtabUnlock(pVTab); } } } From e2d2ad6ece4611d7e548e14ab61bf0fe1d70bf11 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Feb 2019 16:36:24 +0000 Subject: [PATCH 196/306] Update the test/fuzzdata8.db database with new interesting cases from dbsqlfuzz. FossilOrigin-Name: e467e4c8fa256ddd6c26c1f21bc26289a21f18b781737eaf706bc813ed8234fa --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 915456 -> 960512 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b17ecd0a4c..d6e9cd36fc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\swith\sSAVEPOINT\sand\srelated\scommands\swithin\stransactions\son\sa\scorrupt\sdatabase\sthat\sinclude\sfts5\sor\ssome\sother\svirtual\stables. -D 2019-02-04T16:25:40.994 +C Update\sthe\stest/fuzzdata8.db\sdatabase\swith\snew\sinteresting\scases\sfrom\ndbsqlfuzz. +D 2019-02-04T16:36:24.587 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 411f8398e0a4ea1a219abeb18fcb695d670479e787c997e7d54737a5c8e22935 +F test/fuzzdata8.db 3f7c67741ba91c13955609700a44608d2dfe4f037e508f77d236ea9abb431a02 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 ad84ca24ff760f7a2b128f2eeb4d799a97f84b8b8a8bb8d9657c4c555f6ccf47 -R 68d02601b8536e27df485a4b829962c8 -U dan -Z db686b509623b6d0d2c5899e5840386c +P b0da6e0dd1f9a9ba7646ee6bb3c14945e570303c9a42d20fa8a653570e12c3f9 +R b21eae45a85440732ce3f3facc693fc8 +U drh +Z 0021583978ed0d812f82afc74ea54b8c diff --git a/manifest.uuid b/manifest.uuid index bd87ae8034..8c8daf91d9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b0da6e0dd1f9a9ba7646ee6bb3c14945e570303c9a42d20fa8a653570e12c3f9 \ No newline at end of file +e467e4c8fa256ddd6c26c1f21bc26289a21f18b781737eaf706bc813ed8234fa \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index a03a672df46b046f43c9b52c0d90553fee8095fe..4e9ccbf0d4b5117ff5d9b4201727bbfd4b266c2c 100644 GIT binary patch delta 15125 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 IMf;Nf0VG*WyZ`_I delta 11511 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 H`;-3 Date: Mon, 4 Feb 2019 16:42:57 +0000 Subject: [PATCH 197/306] Do not run shmlock.test as part of the inmemory_journal permutation. FossilOrigin-Name: d3fea69cbb071867a90ad56ca05123ebf8e44689a92577a525a883c176c791bd --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/permutations.test | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d6e9cd36fc..6ecadd2858 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\stest/fuzzdata8.db\sdatabase\swith\snew\sinteresting\scases\sfrom\ndbsqlfuzz. -D 2019-02-04T16:36:24.587 +C Do\snot\srun\sshmlock.test\sas\spart\sof\sthe\sinmemory_journal\spermutation. +D 2019-02-04T16:42:57.996 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -1195,7 +1195,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 5b729823f3f4b8a488c64dee3484cfb4e924ee0713c7eef1da3ed99ea8573d80 +F test/permutations.test 52d2c37fe8cc07ec7362024c214b04bb69432995b3a984a3fbabc60fa6ada3ee F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb06960db30 F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1804,7 +1804,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 b0da6e0dd1f9a9ba7646ee6bb3c14945e570303c9a42d20fa8a653570e12c3f9 -R b21eae45a85440732ce3f3facc693fc8 -U drh -Z 0021583978ed0d812f82afc74ea54b8c +P e467e4c8fa256ddd6c26c1f21bc26289a21f18b781737eaf706bc813ed8234fa +R e08c01cce02d0dbb29ddb0449bc65fb9 +U dan +Z 6723cba0480c8d70c3e9bd6fa8f41161 diff --git a/manifest.uuid b/manifest.uuid index 8c8daf91d9..0f6d7f6b25 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e467e4c8fa256ddd6c26c1f21bc26289a21f18b781737eaf706bc813ed8234fa \ No newline at end of file +d3fea69cbb071867a90ad56ca05123ebf8e44689a92577a525a883c176c791bd \ No newline at end of file diff --git a/test/permutations.test b/test/permutations.test index ab4f9a434f..577cc7bd05 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -752,7 +752,7 @@ test_suite "inmemory_journal" -description { # the number of fsync() calls. pager.test exclusive.test jrnlmode.test sync.test misc1.test journal1.test conflict.test crash8.test tkt3457.test io.test - journal3.test 8_3_names.test + journal3.test 8_3_names.test shmlock.test pager1.test async4.test corrupt.test filefmt.test pager2.test corrupt5.test corruptA.test pageropt.test From f2305414cdb540d9e0be03e7d00a157f3c782c3c Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Feb 2019 19:12:54 +0000 Subject: [PATCH 198/306] Ensure that the sqlite3_exec() callback gets the correct number of columns for a query, even if the schema changes out from under it. FossilOrigin-Name: a16ffb5a4b30f1ac4a8384fccde0a0f69e49545b6f9be9267928609328c4a151 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/legacy.c | 5 ++--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 6ecadd2858..c15c8d0433 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\srun\sshmlock.test\sas\spart\sof\sthe\sinmemory_journal\spermutation. -D 2019-02-04T16:42:57.996 +C Ensure\sthat\sthe\ssqlite3_exec()\scallback\sgets\sthe\scorrect\snumber\sof\scolumns\nfor\sa\squery,\seven\sif\sthe\sschema\schanges\sout\sfrom\sunder\sit. +D 2019-02-04T19:12:54.437 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -476,7 +476,7 @@ F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 3ed9ceaa4b7d56a6f2613355e1cd1ae5cfe31712bce2bf5aa93c5f1f130704b2 -F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e +F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 @@ -1804,7 +1804,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 e467e4c8fa256ddd6c26c1f21bc26289a21f18b781737eaf706bc813ed8234fa -R e08c01cce02d0dbb29ddb0449bc65fb9 -U dan -Z 6723cba0480c8d70c3e9bd6fa8f41161 +P d3fea69cbb071867a90ad56ca05123ebf8e44689a92577a525a883c176c791bd +R 2c871c531f70747307731415293fd53f +U drh +Z 520bd9b7175cb6c9db4e0d6ced40ee32 diff --git a/manifest.uuid b/manifest.uuid index 0f6d7f6b25..9e0efc7d82 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d3fea69cbb071867a90ad56ca05123ebf8e44689a92577a525a883c176c791bd \ No newline at end of file +a16ffb5a4b30f1ac4a8384fccde0a0f69e49545b6f9be9267928609328c4a151 \ No newline at end of file diff --git a/src/legacy.c b/src/legacy.c index 40959a8544..867587e5a2 100644 --- a/src/legacy.c +++ b/src/legacy.c @@ -46,7 +46,7 @@ int sqlite3_exec( sqlite3_mutex_enter(db->mutex); sqlite3Error(db, SQLITE_OK); while( rc==SQLITE_OK && zSql[0] ){ - int nCol; + int nCol = 0; char **azVals = 0; pStmt = 0; @@ -60,9 +60,7 @@ int sqlite3_exec( zSql = zLeftover; continue; } - callbackIsInit = 0; - nCol = sqlite3_column_count(pStmt); while( 1 ){ int i; @@ -73,6 +71,7 @@ int sqlite3_exec( (SQLITE_DONE==rc && !callbackIsInit && db->flags&SQLITE_NullCallback)) ){ if( !callbackIsInit ){ + nCol = sqlite3_column_count(pStmt); azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*)); if( azCols==0 ){ goto exec_out; From 88862d49a675b4f95374fb4ff612f2920ed94e69 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Feb 2019 19:45:26 +0000 Subject: [PATCH 199/306] Enhance dbfuzz2 so that with the -v option it shows the return code and error message for any failing SQL statements. FossilOrigin-Name: 3a127ef9f7feafe6ba8c75e4eb29e28aa61a30249082cc8767ada1ec0cc0b7f1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz2.c | 8 +++++++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c15c8d0433..652f85dd93 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\ssqlite3_exec()\scallback\sgets\sthe\scorrect\snumber\sof\scolumns\nfor\sa\squery,\seven\sif\sthe\sschema\schanges\sout\sfrom\sunder\sit. -D 2019-02-04T19:12:54.437 +C Enhance\sdbfuzz2\sso\sthat\swith\sthe\s-v\soption\sit\sshows\sthe\sreturn\scode\sand\nerror\smessage\sfor\sany\sfailing\sSQL\sstatements. +D 2019-02-04T19:45:26.504 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -784,7 +784,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 9617fb870f7d655c27994749955efee5d93a641c082dce4c59059796ff81145e F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c ffd2d85cab49936959b8ee6073498bcb827d5670c7286e4b40b06e433b32a94a +F test/dbfuzz2.c 71ea3927983aee93c94dee75cdf9dd1aa4aa4d6f31b9ed9eab52b981cc924726 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1804,7 +1804,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 d3fea69cbb071867a90ad56ca05123ebf8e44689a92577a525a883c176c791bd -R 2c871c531f70747307731415293fd53f +P a16ffb5a4b30f1ac4a8384fccde0a0f69e49545b6f9be9267928609328c4a151 +R a139ef61e5002cce118ec9f4cb5dfe8e U drh -Z 520bd9b7175cb6c9db4e0d6ced40ee32 +Z 84a13f1251514491dd128cf3ef3fa435 diff --git a/manifest.uuid b/manifest.uuid index 9e0efc7d82..0ff5b88e7b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a16ffb5a4b30f1ac4a8384fccde0a0f69e49545b6f9be9267928609328c4a151 \ No newline at end of file +3a127ef9f7feafe6ba8c75e4eb29e28aa61a30249082cc8767ada1ec0cc0b7f1 \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 30a55943e8..7effb50818 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -82,6 +82,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ int rc; int i; sqlite3_int64 x; + char *zErr = 0; if( eVerbosity>=1 ){ printf("************** nByte=%d ***************\n", (int)nByte); @@ -106,7 +107,12 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ printf("%s\n", azSql[i]); fflush(stdout); } - sqlite3_exec(db, azSql[i], 0, 0, 0); + zErr = 0; + rc = sqlite3_exec(db, azSql[i], 0, 0, &zErr); + if( rc && eVerbosity>=1 ){ + printf("-- rc=%d zErr=%s\n", rc, zErr); + } + sqlite3_free(zErr); } rc = sqlite3_close(db); if( rc!=SQLITE_OK ){ From a790882d63af27deca8a2cf63577ae909fe08d6c Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Feb 2019 19:50:44 +0000 Subject: [PATCH 200/306] Add the -memtrace option to dbfuzz2. FossilOrigin-Name: 67fecbc79d3e927a7e22f3589be3184114322635874e4b3170666e352d0bfe9d --- manifest | 12 +++---- manifest.uuid | 2 +- test/dbfuzz2.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 652f85dd93..4b090b8023 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sdbfuzz2\sso\sthat\swith\sthe\s-v\soption\sit\sshows\sthe\sreturn\scode\sand\nerror\smessage\sfor\sany\sfailing\sSQL\sstatements. -D 2019-02-04T19:45:26.504 +C Add\sthe\s-memtrace\soption\sto\sdbfuzz2. +D 2019-02-04T19:50:44.697 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -784,7 +784,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 9617fb870f7d655c27994749955efee5d93a641c082dce4c59059796ff81145e F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 71ea3927983aee93c94dee75cdf9dd1aa4aa4d6f31b9ed9eab52b981cc924726 +F test/dbfuzz2.c 5d5eb817dc8195e0228227510ee6a4b49f46e679fc2d5be96841cce819bf42f7 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1804,7 +1804,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 a16ffb5a4b30f1ac4a8384fccde0a0f69e49545b6f9be9267928609328c4a151 -R a139ef61e5002cce118ec9f4cb5dfe8e +P 3a127ef9f7feafe6ba8c75e4eb29e28aa61a30249082cc8767ada1ec0cc0b7f1 +R e25958fad2de4af7af166897ea114883 U drh -Z 84a13f1251514491dd128cf3ef3fa435 +Z 7c66e0b946b61f4c979a9f3ffc097fd3 diff --git a/manifest.uuid b/manifest.uuid index 0ff5b88e7b..363e55a3bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3a127ef9f7feafe6ba8c75e4eb29e28aa61a30249082cc8767ada1ec0cc0b7f1 \ No newline at end of file +67fecbc79d3e927a7e22f3589be3184114322635874e4b3170666e352d0bfe9d \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 7effb50818..1649d42d54 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -72,6 +72,89 @@ static int bVdbeDebug = 0; /* Maximum size of the in-memory database file */ static sqlite3_int64 szMax = 104857600; +/***** Copy/paste from ext/misc/memtrace.c ***************************/ +/* The original memory allocation routines */ +static sqlite3_mem_methods memtraceBase; +static FILE *memtraceOut; + +/* Methods that trace memory allocations */ +static void *memtraceMalloc(int n){ + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", + memtraceBase.xRoundup(n)); + } + return memtraceBase.xMalloc(n); +} +static void memtraceFree(void *p){ + if( p==0 ) return; + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); + } + memtraceBase.xFree(p); +} +static void *memtraceRealloc(void *p, int n){ + if( p==0 ) return memtraceMalloc(n); + if( n==0 ){ + memtraceFree(p); + return 0; + } + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", + memtraceBase.xSize(p), memtraceBase.xRoundup(n)); + } + return memtraceBase.xRealloc(p, n); +} +static int memtraceSize(void *p){ + return memtraceBase.xSize(p); +} +static int memtraceRoundup(int n){ + return memtraceBase.xRoundup(n); +} +static int memtraceInit(void *p){ + return memtraceBase.xInit(p); +} +static void memtraceShutdown(void *p){ + memtraceBase.xShutdown(p); +} + +/* The substitute memory allocator */ +static sqlite3_mem_methods ersaztMethods = { + memtraceMalloc, + memtraceFree, + memtraceRealloc, + memtraceSize, + memtraceRoundup, + memtraceInit, + memtraceShutdown +}; + +/* Begin tracing memory allocations to out. */ +int sqlite3MemTraceActivate(FILE *out){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc==0 ){ + rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); + } + } + memtraceOut = out; + return rc; +} + +/* Deactivate memory tracing */ +int sqlite3MemTraceDeactivate(void){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc!=0 ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + memset(&memtraceBase, 0, sizeof(memtraceBase)); + } + } + memtraceOut = 0; + return rc; +} +/***** End copy/paste from ext/misc/memtrace.c ***************************/ + /* libFuzzer invokes this routine with fuzzed database files (in aData). ** This routine run SQLite against the malformed database to see if it ** can provoke a failure or malfunction. @@ -162,6 +245,14 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ bVdbeDebug = 1; continue; } + if( strcmp(z,"memtrace")==0 ){ + sqlite3MemTraceActivate(stdout); + continue; + } + if( strcmp(z,"mem")==0 ){ + bVdbeDebug = 1; + continue; + } if( strcmp(z,"max-db-size")==0 ){ if( i+1==argc ){ fprintf(stderr, "missing argument to %s\n", argv[i]); From af48257bc91a8d23663bc7fa136626ed90f61a22 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Feb 2019 19:52:39 +0000 Subject: [PATCH 201/306] Mention the new -memtrace command-line option in the -help output of the CLI. FossilOrigin-Name: ada91aefe37efe3c009691b5599e4d6acf182e5ec3cf28dda0871d09858498b3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 4b090b8023..5764c239ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s-memtrace\soption\sto\sdbfuzz2. -D 2019-02-04T19:50:44.697 +C Mention\sthe\snew\s-memtrace\scommand-line\soption\sin\sthe\s-help\soutput\sof\sthe\sCLI. +D 2019-02-04T19:52:39.638 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -515,7 +515,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 -F src/shell.c.in d9898bedbddb8b47dcb07c0b948addfe312e76af0ccfc42d2bedac9634153557 +F src/shell.c.in 72a09544a79ac9cb799eeb5a2e15de26e3921b78aa5610c525c4295f1580bf4e F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1804,7 +1804,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 3a127ef9f7feafe6ba8c75e4eb29e28aa61a30249082cc8767ada1ec0cc0b7f1 -R e25958fad2de4af7af166897ea114883 +P 67fecbc79d3e927a7e22f3589be3184114322635874e4b3170666e352d0bfe9d +R 319fe51837c8fb8507e620f83f1a6e73 U drh -Z 7c66e0b946b61f4c979a9f3ffc097fd3 +Z bc0567bf7f048d791b550b3ee05f5962 diff --git a/manifest.uuid b/manifest.uuid index 363e55a3bd..32f595de8c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -67fecbc79d3e927a7e22f3589be3184114322635874e4b3170666e352d0bfe9d \ No newline at end of file +ada91aefe37efe3c009691b5599e4d6acf182e5ec3cf28dda0871d09858498b3 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 746caaedc0..7295a7374a 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8675,6 +8675,7 @@ static const char zOptions[] = #if defined(SQLITE_ENABLE_DESERIALIZE) " -maxsize N maximum size for a --deserialize database\n" #endif + " -memtrace trace all memory allocations and deallocations\n" " -mmap N default mmap size set to N\n" #ifdef SQLITE_ENABLE_MULTIPLEX " -multiplex enable the multiplexor VFS\n" From 53d30dd371832c13a62312b339cb0a86b1012b20 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Feb 2019 21:10:24 +0000 Subject: [PATCH 202/306] Early detection of implausibly sized records to avoid unnecessary large memory allocations. FossilOrigin-Name: 2c8769c69f301307db6663adb8b7c0b89f5959516bf6110cb8ff4b21bd903f70 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 19 +++++++++++++++++++ src/btree.h | 1 + src/vdbemem.c | 3 +++ 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5764c239ab..5da8389589 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mention\sthe\snew\s-memtrace\scommand-line\soption\sin\sthe\s-help\soutput\sof\sthe\sCLI. -D 2019-02-04T19:52:39.638 +C Early\sdetection\sof\simplausibly\ssized\srecords\sto\savoid\sunnecessary\nlarge\smemory\sallocations. +D 2019-02-04T21:10:24.890 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,8 +455,8 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 9649c95a846deddf256525125ae257ef1ce0cf29409031df8378330a45d513a6 -F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 +F src/btree.c 84b7c5c3829b60823e15e7a8407462b69be3818f96518fef28f97ac0fbbca72b +F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 F src/build.c fe6e3753c4cfc76f9c621a24ef5f6fd62aac5aa6c843710b542509f493274eca F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 @@ -591,7 +591,7 @@ F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 8d170e387c230d12250d2feaec2c1a0d9a7184753f676df10a4b28f17abfcdaf +F src/vdbemem.c 3173f0275cf8643a03ed02084ee56b97fc1a17a2edb5907facec504f59c3172d F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 2462b7d6fd72b0b916477f5ef210ee49ab58cec195483ebdac0c8c5e3ec42cab @@ -1804,7 +1804,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 67fecbc79d3e927a7e22f3589be3184114322635874e4b3170666e352d0bfe9d -R 319fe51837c8fb8507e620f83f1a6e73 +P ada91aefe37efe3c009691b5599e4d6acf182e5ec3cf28dda0871d09858498b3 +R bc6315f0c52b3f1996f4a6c2c085613b U drh -Z bc0567bf7f048d791b550b3ee05f5962 +Z a2568dbaff1f58a28451297447dddc5f diff --git a/manifest.uuid b/manifest.uuid index 32f595de8c..560617347d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ada91aefe37efe3c009691b5599e4d6acf182e5ec3cf28dda0871d09858498b3 \ No newline at end of file +2c8769c69f301307db6663adb8b7c0b89f5959516bf6110cb8ff4b21bd903f70 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 1fd7dcac4a..3b7ef906c4 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4519,6 +4519,25 @@ u32 sqlite3BtreePayloadSize(BtCursor *pCur){ return pCur->info.nPayload; } +/* +** Return an upper bound on the size of any record for the table +** that the cursor is pointing into. +** +** This is an optimization. Everything will still work if this +** routine always returns 2147483647 (which is the largest record +** that SQLite can handle) or more. But returning a smaller value might +** prevent large memory allocations when trying to interpret a +** corrupt datrabase. +** +** The current implementation merely returns the size of the underlying +** database file. +*/ +sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + return pCur->pBt->pageSize * (sqlite3_int64)pCur->pBt->nPage; +} + /* ** Given the page number of an overflow page in the database (parameter ** ovfl), this function finds the page number of the next page in the diff --git a/src/btree.h b/src/btree.h index f6cf55bad9..4e03112103 100644 --- a/src/btree.h +++ b/src/btree.h @@ -315,6 +315,7 @@ i64 sqlite3BtreeOffset(BtCursor*); int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*); const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); u32 sqlite3BtreePayloadSize(BtCursor*); +sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor*); char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); struct Pager *sqlite3BtreePager(Btree*); diff --git a/src/vdbemem.c b/src/vdbemem.c index 8d9e44b022..5aa0ec6ca5 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1124,6 +1124,9 @@ static SQLITE_NOINLINE int vdbeMemFromBtreeResize( ){ int rc; pMem->flags = MEM_Null; + if( sqlite3BtreeMaxRecordSize(pCur)z); if( rc==SQLITE_OK ){ From 41e0717bcb409de9ec296c3215b572dfab2697c9 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 5 Feb 2019 08:55:43 +0000 Subject: [PATCH 203/306] Update test file "resetdb.test" so that it works with the "prepare" permutation. FossilOrigin-Name: 95d338124be2e0e18f17354b28f4320336202f1a4ec1177df753b2800e954bfb --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/resetdb.test | 4 ++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5da8389589..e66cfd50d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Early\sdetection\sof\simplausibly\ssized\srecords\sto\savoid\sunnecessary\nlarge\smemory\sallocations. -D 2019-02-04T21:10:24.890 +C Update\stest\sfile\s"resetdb.test"\sso\sthat\sit\sworks\swith\sthe\s"prepare"\spermutation. +D 2019-02-05T08:55:43.608 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -1223,7 +1223,7 @@ F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 F test/releasetest.tcl b290d538ffcb2ff711f09eadc7396c1a42580f3fb078605471dc8875ca0b4d1e x -F test/resetdb.test 117519739a9570d1152161bd72bb8a40d1a39599b011467a478e2b9fa1eec2a1 +F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 @@ -1804,7 +1804,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 ada91aefe37efe3c009691b5599e4d6acf182e5ec3cf28dda0871d09858498b3 -R bc6315f0c52b3f1996f4a6c2c085613b -U drh -Z a2568dbaff1f58a28451297447dddc5f +P 2c8769c69f301307db6663adb8b7c0b89f5959516bf6110cb8ff4b21bd903f70 +R 36f79ba59bcc36b7ebe2aeab7b080cb9 +U dan +Z 3069fd78dedb257d8267a4ec925f7be3 diff --git a/manifest.uuid b/manifest.uuid index 560617347d..ca25375acc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2c8769c69f301307db6663adb8b7c0b89f5959516bf6110cb8ff4b21bd903f70 \ No newline at end of file +95d338124be2e0e18f17354b28f4320336202f1a4ec1177df753b2800e954bfb \ No newline at end of file diff --git a/test/resetdb.test b/test/resetdb.test index 9d249235e8..bdb8354110 100644 --- a/test/resetdb.test +++ b/test/resetdb.test @@ -83,6 +83,10 @@ do_test 210 { db eval VACUUM sqlite3_db_config db RESET_DB 0 + # If using sqlite3_prepare() instead of _v2() or _v3(), the block + # below raises an SQLITE_SCHEMA error. The following fixes this. + if {[permutation]=="prepare"} { catchsql "SELECT * FROM sqlite_master" db2 } + # Verify that the reset took, even on the separate database connection catchsql { PRAGMA page_count; From 24545d23009160f184ce9c144025e9440ee4da08 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Feb 2019 12:16:53 +0000 Subject: [PATCH 204/306] Keep the temp_store_directory and data_store_directory pragmas even when compiling with SQLITE_OMIT_DEPRECATED. FossilOrigin-Name: 93386a7c97f27df69f79052ef4d80143bb6832a806885249c315d226b2a256b2 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pragma.h | 6 ------ tool/mkpragmatab.tcl | 2 -- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index e66cfd50d2..2b916583dc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\stest\sfile\s"resetdb.test"\sso\sthat\sit\sworks\swith\sthe\s"prepare"\spermutation. -D 2019-02-05T08:55:43.608 +C Keep\sthe\stemp_store_directory\sand\sdata_store_directory\spragmas\seven\swhen\ncompiling\swith\sSQLITE_OMIT_DEPRECATED. +D 2019-02-05T12:16:53.335 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -508,7 +508,7 @@ F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 -F src/pragma.h b774c8fdd63ed468ab8206b9b530d5d2523ed8889fbb72d1143d09272d5c6b2c +F src/pragma.h 66f3e237cbba0a40a322d4a5bb58fcffa35bff8289ca9e5635424300479f1a38 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -1737,7 +1737,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl 18d3d04b616dc15db0f91ce5a725783ebd36f051f291d5787fdc31927ed0b9d4 +F tool/mkpragmatab.tcl ecaabfaeb252b28a030ca2357e2a2a73c16076810730abcc1d04d5946bc07d16 F tool/mkshellc.tcl 1f45770aea226ac093a9c72f718efbb88a2a2833409ec2e1c4cecae4202626f5 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1804,7 +1804,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 2c8769c69f301307db6663adb8b7c0b89f5959516bf6110cb8ff4b21bd903f70 -R 36f79ba59bcc36b7ebe2aeab7b080cb9 -U dan -Z 3069fd78dedb257d8267a4ec925f7be3 +P 95d338124be2e0e18f17354b28f4320336202f1a4ec1177df753b2800e954bfb +R ce6ca2a39dbf22c181e8ff8780de6293 +U drh +Z d19d9609fae54f85002f2ec829a4be91 diff --git a/manifest.uuid b/manifest.uuid index ca25375acc..81752b844b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -95d338124be2e0e18f17354b28f4320336202f1a4ec1177df753b2800e954bfb \ No newline at end of file +93386a7c97f27df69f79052ef4d80143bb6832a806885249c315d226b2a256b2 \ No newline at end of file diff --git a/src/pragma.h b/src/pragma.h index 911bfed3af..bbb269b8bf 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -219,14 +219,12 @@ static const PragmaName aPragmaName[] = { #endif #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN -#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "data_store_directory", /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, /* ePragFlg: */ PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif -#endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) {/* zName: */ "data_version", /* ePragTyp: */ PragTyp_HEADER_VALUE, @@ -602,16 +600,12 @@ static const PragmaName aPragmaName[] = { /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, -#endif -#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) -#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "temp_store_directory", /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, /* ePragFlg: */ PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif -#endif #if defined(SQLITE_HAS_CODEC) {/* zName: */ "textkey", /* ePragTyp: */ PragTyp_KEY, diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 49045f582e..edf2f38dfe 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -211,12 +211,10 @@ set pragma_def { NAME: temp_store_directory FLAG: NoColumns1 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) - IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: data_store_directory FLAG: NoColumns1 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN - IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: lock_proxy_file FLAG: NoColumns1 From d57936721b6598d62baaa359c8d179b74ab3bfcb Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Feb 2019 14:36:33 +0000 Subject: [PATCH 205/306] The IS NOT NULL operator does not imply that the operand is never NULL. Fix for ticket [5948e09b8c415bc45da5cf] FossilOrigin-Name: d840e9bb023a1e84a7739d764a0f6cf608fc3183ff8c366fcdb486ebd932f0c1 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 ++ test/join.test | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2b916583dc..8f17e1ea4e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Keep\sthe\stemp_store_directory\sand\sdata_store_directory\spragmas\seven\swhen\ncompiling\swith\sSQLITE_OMIT_DEPRECATED. -D 2019-02-05T12:16:53.335 +C The\sIS\sNOT\sNULL\soperator\sdoes\snot\simply\sthat\sthe\soperand\sis\snever\sNULL.\nFix\sfor\sticket\s[5948e09b8c415bc45da5cf] +D 2019-02-05T14:36:33.250 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -466,7 +466,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c c6c10cd52d7d62c358c0bea8f1633c58b56ce4d2b6c9e11923ee3d72d1450ee7 +F src/expr.c 182dc9ff30aa6a430b7f728ce84fda85ec10890e29fdf75be1e871d13222a99c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 @@ -1057,7 +1057,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 62372ad3ddcc5d0eb8ff9097dcb0aad8961bf1b9cb45ba634f6e284695126f9a -F test/join.test b6f771f4db4b8cee20ef79936f16efa351d2e90563a01aa1ab789e3052262350 +F test/join.test d53a3662762eff50b65da8775201e609878a27dd0885a1ae7bcde9bb46cecbc5 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1804,7 +1804,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 95d338124be2e0e18f17354b28f4320336202f1a4ec1177df753b2800e954bfb -R ce6ca2a39dbf22c181e8ff8780de6293 +P 93386a7c97f27df69f79052ef4d80143bb6832a806885249c315d226b2a256b2 +R 9525c6c7752c2e03d4ece72428ce320c U drh -Z d19d9609fae54f85002f2ec829a4be91 +Z 40b8fe7fbea274d9f1afcec96201f3fd diff --git a/manifest.uuid b/manifest.uuid index 81752b844b..61d5f9a83a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -93386a7c97f27df69f79052ef4d80143bb6832a806885249c315d226b2a256b2 \ No newline at end of file +d840e9bb023a1e84a7739d764a0f6cf608fc3183ff8c366fcdb486ebd932f0c1 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index a9ae850982..03ecf1567d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4986,6 +4986,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ case TK_ISNOT: case TK_NOT: case TK_ISNULL: + case TK_NOTNULL: case TK_IS: case TK_OR: case TK_CASE: @@ -4994,6 +4995,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_ISNOT ); testcase( pExpr->op==TK_NOT ); testcase( pExpr->op==TK_ISNULL ); + testcase( pExpr->op==TK_NOTNULL ); testcase( pExpr->op==TK_IS ); testcase( pExpr->op==TK_OR ); testcase( pExpr->op==TK_CASE ); diff --git a/test/join.test b/test/join.test index b17acb28f3..f613df85b0 100644 --- a/test/join.test +++ b/test/join.test @@ -850,4 +850,18 @@ do_execsql_test join-15.110 { ORDER BY a1, a2, a3, a4, a5; } {1 {} {} {} {} 1 11 {} {} {} 1 12 {} {} {} 1 12 121 {} {} 1 13 {} {} {}} +# 2019-02-05 Ticket https://www.sqlite.org/src/tktview/5948e09b8c415bc45da5c +# Error in join due to the LEFT JOIN strength reduction optimization. +# +do_execsql_test join-16.100 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a INT); + INSERT INTO t1(a) VALUES(1); + CREATE TABLE t2(b INT); + SELECT a, b + FROM t1 LEFT JOIN t2 ON 0 + WHERE (b IS NOT NULL)=0; +} {1 {}} + finish_test From dee9be9b3b3b2ff760b6b9df20034fc1052e4c79 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 5 Feb 2019 16:53:26 +0000 Subject: [PATCH 206/306] Update the tester.tcl --malloctrace option so that it uses eu-addr2line instead of addr2line. FossilOrigin-Name: 79c073878d56fc638b751b0e61295df182f7ee6f8ebd7319c1eeac1608abbac8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/tester.tcl | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8f17e1ea4e..781914daf5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sIS\sNOT\sNULL\soperator\sdoes\snot\simply\sthat\sthe\soperand\sis\snever\sNULL.\nFix\sfor\sticket\s[5948e09b8c415bc45da5cf] -D 2019-02-05T14:36:33.250 +C Update\sthe\stester.tcl\s--malloctrace\soption\sso\sthat\sit\suses\seu-addr2line\sinstead\sof\saddr2line. +D 2019-02-05T16:53:26.720 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -1373,7 +1373,7 @@ F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl aafcd5b0bc0f7f5c0fc95fb09964ac1055e371d00881c30b42280e9d5e956206 +F test/tester.tcl 499a5086815aa416d971ff438d7425c64f41ed3233251db4836d270f9a6671e8 F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1804,7 +1804,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 93386a7c97f27df69f79052ef4d80143bb6832a806885249c315d226b2a256b2 -R 9525c6c7752c2e03d4ece72428ce320c -U drh -Z 40b8fe7fbea274d9f1afcec96201f3fd +P d840e9bb023a1e84a7739d764a0f6cf608fc3183ff8c366fcdb486ebd932f0c1 +R ea7e86862ddb85c5a7b59ce084622209 +U dan +Z 8eeb937aab4d4557109f58c2979ba7c0 diff --git a/manifest.uuid b/manifest.uuid index 61d5f9a83a..61b5861a13 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d840e9bb023a1e84a7739d764a0f6cf608fc3183ff8c366fcdb486ebd932f0c1 \ No newline at end of file +79c073878d56fc638b751b0e61295df182f7ee6f8ebd7319c1eeac1608abbac8 \ No newline at end of file diff --git a/test/tester.tcl b/test/tester.tcl index 99f20875f4..0a165a26cf 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -2054,9 +2054,11 @@ proc memdebug_log_sql {filename} { set tbl2 "CREATE TABLE ${database}.frame(frame INTEGER PRIMARY KEY, line);\n" set tbl3 "CREATE TABLE ${database}.file(name PRIMARY KEY, content);\n" + set pid [pid] + foreach f [array names frames] { set addr [format %x $f] - set cmd "addr2line -e [info nameofexec] $addr" + set cmd "eu-addr2line --pid=$pid $addr" set line [eval exec $cmd] append sql "INSERT INTO ${database}.frame VALUES($f, '$line');\n" From fc4eeef9e7fb8f0a31aa84bf8dc875c6985422cd Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Feb 2019 19:48:46 +0000 Subject: [PATCH 207/306] Fix compiler warnings on Windows. FossilOrigin-Name: 4978ee8b5405f958723b4ebbd4288bd08bff2b453da2d1c032d1ae904c2a3821 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 30 +++++++++++++++--------------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 781914daf5..198cadc5b6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\stester.tcl\s--malloctrace\soption\sso\sthat\sit\suses\seu-addr2line\sinstead\sof\saddr2line. -D 2019-02-05T16:53:26.720 +C Fix\scompiler\swarnings\son\sWindows. +D 2019-02-05T19:48:46.307 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -515,7 +515,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 -F src/shell.c.in 72a09544a79ac9cb799eeb5a2e15de26e3921b78aa5610c525c4295f1580bf4e +F src/shell.c.in b5149a7d195b27672a1bc24620e12bfde0bde4436942c726f34889c7c0307271 F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1804,7 +1804,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 d840e9bb023a1e84a7739d764a0f6cf608fc3183ff8c366fcdb486ebd932f0c1 -R ea7e86862ddb85c5a7b59ce084622209 -U dan -Z 8eeb937aab4d4557109f58c2979ba7c0 +P 79c073878d56fc638b751b0e61295df182f7ee6f8ebd7319c1eeac1608abbac8 +R 849c0b19a8b86343d05866d0b31e75f5 +U drh +Z 1e1bbef1183a4378ceff05350a8de166 diff --git a/manifest.uuid b/manifest.uuid index 61b5861a13..d948e66613 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -79c073878d56fc638b751b0e61295df182f7ee6f8ebd7319c1eeac1608abbac8 \ No newline at end of file +4978ee8b5405f958723b4ebbd4288bd08bff2b453da2d1c032d1ae904c2a3821 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 7295a7374a..07292444f2 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1086,11 +1086,11 @@ struct ShellState { #define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ /* Bits in the ShellState.flgProgress variable */ -#define PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ -#define PROGRESS_RESET 0x02 /* Reset the count when the progres - ** callback limit is reached, and for each - ** top-level SQL statement */ -#define PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ +#define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ +#define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres + ** callback limit is reached, and for each + ** top-level SQL statement */ +#define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ /* ** These are the allowed shellFlgs values @@ -1800,11 +1800,11 @@ static int progress_handler(void *pClientData) { p->nProgress++; if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); - if( p->flgProgress & PROGRESS_RESET ) p->nProgress = 0; - if( p->flgProgress & PROGRESS_ONCE ) p->mxProgress = 0; + if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; + if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; return 1; } - if( (p->flgProgress & PROGRESS_QUIET)==0 ){ + if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ raw_printf(p->out, "Progress %u\n", p->nProgress); } return 0; @@ -7035,7 +7035,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ int i; - int n = 0; + int nn = 0; p->flgProgress = 0; p->mxProgress = 0; p->nProgress = 0; @@ -7045,15 +7045,15 @@ static int do_meta_command(char *zLine, ShellState *p){ z++; if( z[0]=='-' ) z++; if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ - p->flgProgress |= PROGRESS_QUIET; + p->flgProgress |= SHELL_PROGRESS_QUIET; continue; } if( strcmp(z,"reset")==0 ){ - p->flgProgress |= PROGRESS_RESET; + p->flgProgress |= SHELL_PROGRESS_RESET; continue; } if( strcmp(z,"once")==0 ){ - p->flgProgress |= PROGRESS_ONCE; + p->flgProgress |= SHELL_PROGRESS_ONCE; continue; } if( strcmp(z,"limit")==0 ){ @@ -7070,11 +7070,11 @@ static int do_meta_command(char *zLine, ShellState *p){ rc = 1; goto meta_command_exit; }else{ - n = (int)integerValue(z); + nn = (int)integerValue(z); } } open_db(p, 0); - sqlite3_progress_handler(p->db, n, progress_handler, p); + sqlite3_progress_handler(p->db, nn, progress_handler, p); }else if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ @@ -8412,7 +8412,7 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ open_db(p, 0); if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); - if( p->flgProgress & PROGRESS_RESET ) p->nProgress = 0; + if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; BEGIN_TIMER; rc = shell_exec(p, zSql, &zErrMsg); END_TIMER; From d46b6f57c95198de8d2af1161feb516adbdb9bea Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Feb 2019 19:52:39 +0000 Subject: [PATCH 208/306] Fix a harmless compiler warning in the memtrace.c extension. FossilOrigin-Name: 2f468da4e9fb3edb5e902fa5d3c528726d1fb64d749d29e558ba3243c76bcb95 --- ext/misc/memtrace.c | 3 ++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/misc/memtrace.c b/ext/misc/memtrace.c index 76b8d72138..19ff4c4170 100644 --- a/ext/misc/memtrace.c +++ b/ext/misc/memtrace.c @@ -77,7 +77,8 @@ static sqlite3_mem_methods ersaztMethods = { memtraceSize, memtraceRoundup, memtraceInit, - memtraceShutdown + memtraceShutdown, + 0 }; /* Begin tracing memory allocations to out. */ diff --git a/manifest b/manifest index 198cadc5b6..ed78c3d53a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scompiler\swarnings\son\sWindows. -D 2019-02-05T19:48:46.307 +C Fix\sa\sharmless\scompiler\swarning\sin\sthe\smemtrace.c\sextension. +D 2019-02-05T19:52:39.956 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -290,7 +290,7 @@ F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d -F ext/misc/memtrace.c a485c778b6ee2806d540c7114d55a54518ef3bbacbcc65922099bd432ee4db10 +F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba @@ -1804,7 +1804,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 79c073878d56fc638b751b0e61295df182f7ee6f8ebd7319c1eeac1608abbac8 -R 849c0b19a8b86343d05866d0b31e75f5 +P 4978ee8b5405f958723b4ebbd4288bd08bff2b453da2d1c032d1ae904c2a3821 +R cdb2c90ee0a305aff630d3277982c1ce U drh -Z 1e1bbef1183a4378ceff05350a8de166 +Z b3f86d11f843cf24b9aff44a0fffb3a1 diff --git a/manifest.uuid b/manifest.uuid index d948e66613..747921527b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4978ee8b5405f958723b4ebbd4288bd08bff2b453da2d1c032d1ae904c2a3821 \ No newline at end of file +2f468da4e9fb3edb5e902fa5d3c528726d1fb64d749d29e558ba3243c76bcb95 \ No newline at end of file From 569b1d9119c0b05564236f1494c5c328e3fcc757 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 5 Feb 2019 20:51:41 +0000 Subject: [PATCH 209/306] Omit the ".progress" command from the shell if it is compiled with the SQLITE_OMIT_PROGRESS_CALLBACK option. FossilOrigin-Name: 4d0a949fd92e19fbf243a2e3a1a7c2cdb111f9a6943949d2420dd846bc7d9285 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 6 ++++++ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index ed78c3d53a..697cc15777 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\sin\sthe\smemtrace.c\sextension. -D 2019-02-05T19:52:39.956 +C Omit\sthe\s".progress"\scommand\sfrom\sthe\sshell\sif\sit\sis\scompiled\swith\sthe\nSQLITE_OMIT_PROGRESS_CALLBACK\soption. +D 2019-02-05T20:51:41.317 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -515,7 +515,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 -F src/shell.c.in b5149a7d195b27672a1bc24620e12bfde0bde4436942c726f34889c7c0307271 +F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1804,7 +1804,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 4978ee8b5405f958723b4ebbd4288bd08bff2b453da2d1c032d1ae904c2a3821 -R cdb2c90ee0a305aff630d3277982c1ce +P 2f468da4e9fb3edb5e902fa5d3c528726d1fb64d749d29e558ba3243c76bcb95 +R 5ea165a1c3df7a748d9da98e324064f0 U drh -Z b3f86d11f843cf24b9aff44a0fffb3a1 +Z 744816839bca5261e535a1342a752a93 diff --git a/manifest.uuid b/manifest.uuid index 747921527b..f88d26ad89 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2f468da4e9fb3edb5e902fa5d3c528726d1fb64d749d29e558ba3243c76bcb95 \ No newline at end of file +4d0a949fd92e19fbf243a2e3a1a7c2cdb111f9a6943949d2420dd846bc7d9285 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 07292444f2..c7d94dbee8 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1792,6 +1792,7 @@ static void eqp_render(ShellState *p){ } } +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK /* ** Progress handler callback. */ @@ -1809,6 +1810,7 @@ static int progress_handler(void *pClientData) { } return 0; } +#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ /* ** This is the callback routine that the shell @@ -3496,11 +3498,13 @@ static const char *(azHelp[]) = { ".output ?FILE? Send output to FILE or stdout if FILE is omitted", " If FILE begins with '|' then open it as a pipe.", ".print STRING... Print literal STRING", +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK ".progress N Invoke progress handler after every N opcodes", " --limit N Interrupt after N progress callbacks", " --once Do no more than one progress interrupt", " --quiet|-q No output except at interrupts", " --reset Reset the count for each input and interrupt", +#endif ".prompt MAIN CONTINUE Replace the standard prompts", ".quit Exit this program", ".read FILE Read input from FILE", @@ -7033,6 +7037,7 @@ static int do_meta_command(char *zLine, ShellState *p){ raw_printf(p->out, "\n"); }else +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ int i; int nn = 0; @@ -7076,6 +7081,7 @@ static int do_meta_command(char *zLine, ShellState *p){ open_db(p, 0); sqlite3_progress_handler(p->db, nn, progress_handler, p); }else +#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ if( nArg >= 2) { From 01996dae49cbf5928d44bf0b9c68965e17656f98 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 6 Feb 2019 00:11:13 +0000 Subject: [PATCH 210/306] Back out check-in [008112bcef561a8], reenabling deprecated PRAGMAs when the SQLITE_OMIT_DEPRECATED compile-time option is used, because way too many TH3 tests depend on those deprecated PRAGMAs. FossilOrigin-Name: 9dbf512d1c4627a28d60f4e7238cb100d7a4e11f976139b07ad1c59e9b584c7d --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/pragma.h | 14 +------------- tool/mkpragmatab.tcl | 8 +------- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index 697cc15777..a92cee6b5d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\s".progress"\scommand\sfrom\sthe\sshell\sif\sit\sis\scompiled\swith\sthe\nSQLITE_OMIT_PROGRESS_CALLBACK\soption. -D 2019-02-05T20:51:41.317 +C Back\sout\scheck-in\s[008112bcef561a8],\sreenabling\sdeprecated\sPRAGMAs\swhen\sthe\nSQLITE_OMIT_DEPRECATED\scompile-time\soption\sis\sused,\sbecause\sway\stoo\smany\nTH3\stests\sdepend\son\sthose\sdeprecated\sPRAGMAs. +D 2019-02-06T00:11:13.958 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -508,7 +508,7 @@ F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 -F src/pragma.h 66f3e237cbba0a40a322d4a5bb58fcffa35bff8289ca9e5635424300479f1a38 +F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -1737,7 +1737,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl ecaabfaeb252b28a030ca2357e2a2a73c16076810730abcc1d04d5946bc07d16 +F tool/mkpragmatab.tcl 49039adedafbc430d2959400da2e0e8f20ef8dcf6898e447c946e7d50ef5906b F tool/mkshellc.tcl 1f45770aea226ac093a9c72f718efbb88a2a2833409ec2e1c4cecae4202626f5 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1804,7 +1804,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2f468da4e9fb3edb5e902fa5d3c528726d1fb64d749d29e558ba3243c76bcb95 -R 5ea165a1c3df7a748d9da98e324064f0 +P 4d0a949fd92e19fbf243a2e3a1a7c2cdb111f9a6943949d2420dd846bc7d9285 +Q -008112bcef561a8a3ebfb007cbef36cbc0071f547e6ebdba3d3bbb39e2c48c7a +R e01453527140ec2a2012d628a621e74b U drh -Z 744816839bca5261e535a1342a752a93 +Z c3002d5f26f5b478b7bc6524b1b4ade0 diff --git a/manifest.uuid b/manifest.uuid index f88d26ad89..1767324bc7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d0a949fd92e19fbf243a2e3a1a7c2cdb111f9a6943949d2420dd846bc7d9285 \ No newline at end of file +9dbf512d1c4627a28d60f4e7238cb100d7a4e11f976139b07ad1c59e9b584c7d \ No newline at end of file diff --git a/src/pragma.h b/src/pragma.h index bbb269b8bf..c156e3a4fb 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -210,14 +210,12 @@ static const PragmaName aPragmaName[] = { /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) -#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "count_changes", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_CountRows }, #endif -#endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN {/* zName: */ "data_store_directory", /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, @@ -239,15 +237,13 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 35, 3, /* iArg: */ 0 }, #endif -#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) -#if !defined(SQLITE_OMIT_DEPRECATED) +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "default_cache_size", /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, /* ColNames: */ 45, 1, /* iArg: */ 0 }, #endif -#endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) {/* zName: */ "defer_foreign_keys", @@ -258,14 +254,12 @@ static const PragmaName aPragmaName[] = { #endif #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) -#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "empty_result_callbacks", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_NullCallback }, #endif -#endif #if !defined(SQLITE_OMIT_UTF16) {/* zName: */ "encoding", /* ePragTyp: */ PragTyp_ENCODING, @@ -304,15 +298,11 @@ static const PragmaName aPragmaName[] = { /* iArg: */ BTREE_FREE_PAGE_COUNT }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) -#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "full_column_names", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_FullColNames }, -#endif -#endif -#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) {/* zName: */ "fullfsync", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, @@ -541,13 +531,11 @@ static const PragmaName aPragmaName[] = { /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) -#if !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "short_column_names", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_ShortColNames }, -#endif #endif {/* zName: */ "shrink_memory", /* ePragTyp: */ PragTyp_SHRINK_MEMORY, diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index edf2f38dfe..b236bdd5d5 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -25,25 +25,21 @@ set pragma_def { TYPE: FLAG ARG: SQLITE_FullColNames IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) - IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: short_column_names TYPE: FLAG ARG: SQLITE_ShortColNames IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) - IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: count_changes TYPE: FLAG ARG: SQLITE_CountRows IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) - IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: empty_result_callbacks TYPE: FLAG ARG: SQLITE_NullCallback IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) - IF: !defined(SQLITE_OMIT_DEPRECATED) NAME: legacy_file_format TYPE: FLAG @@ -156,9 +152,7 @@ set pragma_def { NAME: default_cache_size FLAG: NeedSchema Result0 SchemaReq NoColumns1 COLS: cache_size - IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) - IF: !defined(SQLITE_OMIT_DEPRECATED) - + IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) NAME: page_size FLAG: Result0 SchemaReq NoColumns1 From 4acd754c794d601c9825301580a5af5738befe92 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 6 Feb 2019 00:55:47 +0000 Subject: [PATCH 211/306] If the query flattener detects an error, cause the SELECT code generator to abort immediately. FossilOrigin-Name: 3d3b142f1045080beb775a9cfe88ec143aa460750132e20059fd510291449850 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/select.c | 1 + test/with1.test | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index a92cee6b5d..a615ad3fd2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Back\sout\scheck-in\s[008112bcef561a8],\sreenabling\sdeprecated\sPRAGMAs\swhen\sthe\nSQLITE_OMIT_DEPRECATED\scompile-time\soption\sis\sused,\sbecause\sway\stoo\smany\nTH3\stests\sdepend\son\sthose\sdeprecated\sPRAGMAs. -D 2019-02-06T00:11:13.958 +C If\sthe\squery\sflattener\sdetects\san\serror,\scause\sthe\sSELECT\scode\sgenerator\nto\sabort\simmediately. +D 2019-02-06T00:55:47.828 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -514,7 +514,7 @@ F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 8e22fda41a737c391e8b797f7c71e7ded1d107c31181b07bb10b3d4f22a28cd9 +F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1685,7 +1685,7 @@ F test/window4.test c5d6bf3403e4ade2f19df2afe4c16f29fb817c392c6c1c8017edb7165c19 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e F test/window6.test 5eae4ae7a590ccf1e605880969ca0bad3955616ac91cad3031baea38748badb3 F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b -F test/with1.test f1fcc3e35e5c8729f63bb91c4122c05130ce65838f72156c973cac1d1a29b9e4 +F test/with1.test a07b5aad7f77acdf13e52e8814ea94606fcc72e9ea4c99baf293e9d7c63940be F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab F test/with3.test 8d26920c88283e0a473ceebd3451554922108ce7b2a6a1157c47eb0a7011212c F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 @@ -1804,8 +1804,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 4d0a949fd92e19fbf243a2e3a1a7c2cdb111f9a6943949d2420dd846bc7d9285 -Q -008112bcef561a8a3ebfb007cbef36cbc0071f547e6ebdba3d3bbb39e2c48c7a -R e01453527140ec2a2012d628a621e74b +P 9dbf512d1c4627a28d60f4e7238cb100d7a4e11f976139b07ad1c59e9b584c7d +R ca58665185cfe5589ddb3b692b238c22 U drh -Z c3002d5f26f5b478b7bc6524b1b4ade0 +Z 59f6ada64abb2878ef107d5499df001c diff --git a/manifest.uuid b/manifest.uuid index 1767324bc7..8e5033bb48 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9dbf512d1c4627a28d60f4e7238cb100d7a4e11f976139b07ad1c59e9b584c7d \ No newline at end of file +3d3b142f1045080beb775a9cfe88ec143aa460750132e20059fd510291449850 \ No newline at end of file diff --git a/src/select.c b/src/select.c index c3351ef13a..f30cea50de 100644 --- a/src/select.c +++ b/src/select.c @@ -5743,6 +5743,7 @@ int sqlite3Select( } if( flattenSubquery(pParse, p, i, isAgg) ){ + if( pParse->nErr ) goto select_end; /* This subquery can be absorbed into its parent. */ i = -1; } diff --git a/test/with1.test b/test/with1.test index 9566b67cd3..aecf0d1d16 100644 --- a/test/with1.test +++ b/test/with1.test @@ -1089,6 +1089,6 @@ do_catchsql_test 22.1 { SELECT 3 FROM c,c,c,c,c,c,c,c,c ) SELECT 4 FROM c,c,c,c,c,c,c,c,c; -} {1 {at most 64 tables in a join}} +} {1 {too many FROM clause terms, max: 200}} finish_test From d0ee3a1e6dd6e4e47ebaa5e9233332dd6a388d67 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 6 Feb 2019 01:18:36 +0000 Subject: [PATCH 212/306] When extending the size of SrcList objects, do not attempt to use extra space on the end of the allocation, as that provides scarcely any performance benefit but does greatly complicate cross-platform testing. FossilOrigin-Name: 3087a0c31e9fbfaedb7cf10a2fda59bc22318ff178614aefcc00ac83d9a7bb14 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 4 +--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index a615ad3fd2..80cd33f492 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sthe\squery\sflattener\sdetects\san\serror,\scause\sthe\sSELECT\scode\sgenerator\nto\sabort\simmediately. -D 2019-02-06T00:55:47.828 +C When\sextending\sthe\ssize\sof\sSrcList\sobjects,\sdo\snot\sattempt\sto\suse\nextra\sspace\son\sthe\send\sof\sthe\sallocation,\sas\sthat\sprovides\sscarcely\sany\nperformance\sbenefit\sbut\sdoes\sgreatly\scomplicate\scross-platform\stesting. +D 2019-02-06T01:18:36.265 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -458,7 +458,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 84b7c5c3829b60823e15e7a8407462b69be3818f96518fef28f97ac0fbbca72b F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 -F src/build.c fe6e3753c4cfc76f9c621a24ef5f6fd62aac5aa6c843710b542509f493274eca +F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -1804,7 +1804,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 9dbf512d1c4627a28d60f4e7238cb100d7a4e11f976139b07ad1c59e9b584c7d -R ca58665185cfe5589ddb3b692b238c22 +P 3d3b142f1045080beb775a9cfe88ec143aa460750132e20059fd510291449850 +R d41aafcf787e802c644013f64e8a2340 U drh -Z 59f6ada64abb2878ef107d5499df001c +Z 00fab67b3e6a43dd7c12c17d8ee399d1 diff --git a/manifest.uuid b/manifest.uuid index 8e5033bb48..ea8de59dcc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3d3b142f1045080beb775a9cfe88ec143aa460750132e20059fd510291449850 \ No newline at end of file +3087a0c31e9fbfaedb7cf10a2fda59bc22318ff178614aefcc00ac83d9a7bb14 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 3c4b9db62b..3daa677cb8 100644 --- a/src/build.c +++ b/src/build.c @@ -3878,7 +3878,6 @@ SrcList *sqlite3SrcListEnlarge( if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ SrcList *pNew; int nAlloc = pSrc->nSrc*2+nExtra; - int nGot; sqlite3 *db = pParse->db; if( pSrc->nSrc+nExtra>=SQLITE_MAX_SRCLIST ){ @@ -3894,8 +3893,7 @@ SrcList *sqlite3SrcListEnlarge( return 0; } pSrc = pNew; - nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1; - pSrc->nAlloc = nGot; + pSrc->nAlloc = nAlloc; } /* Move existing slots that come after the newly inserted slots From 871b13492d12c8279954ba047d992e8ef3bbfb96 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 Feb 2019 13:41:19 +0000 Subject: [PATCH 213/306] Fix a problem preventing testfixture from being built with SQLITE_OMIT_VIRTUALTABLE. FossilOrigin-Name: d2cca36adc69d2c8e7707d70cbd75c497eae6a1a3f8a9dd18249ca6804c9db5f --- ext/misc/prefixes.c | 2 ++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/test1.c | 4 ++++ 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ext/misc/prefixes.c b/ext/misc/prefixes.c index a2f5b3289d..3aa579b8d3 100644 --- a/ext/misc/prefixes.c +++ b/ext/misc/prefixes.c @@ -19,6 +19,7 @@ ** and the input string itself. The order of prefixes is from longest ** to shortest. */ +#if !defined(SQLITE_CORE) || !defined(SQLITE_OMIT_VIRTUALTABLE) #if !defined(SQLITEINT_H) #include "sqlite3ext.h" #endif @@ -315,3 +316,4 @@ int sqlite3_prefixes_init( } return rc; } +#endif /* !defined(SQLITE_CORE) || !defined(SQLITE_OMIT_VIRTUALTABLE) */ diff --git a/manifest b/manifest index 80cd33f492..8ef969d860 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sextending\sthe\ssize\sof\sSrcList\sobjects,\sdo\snot\sattempt\sto\suse\nextra\sspace\son\sthe\send\sof\sthe\sallocation,\sas\sthat\sprovides\sscarcely\sany\nperformance\sbenefit\sbut\sdoes\sgreatly\scomplicate\scross-platform\stesting. -D 2019-02-06T01:18:36.265 +C Fix\sa\sproblem\spreventing\stestfixture\sfrom\sbeing\sbuilt\swith\sSQLITE_OMIT_VIRTUALTABLE. +D 2019-02-06T13:41:19.971 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -296,7 +296,7 @@ F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224 F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c F ext/misc/percentile.c a6a1594c104da2d0ceab38fe609eb2f65529272377827f6f8a2b5c9fa6119e7e -F ext/misc/prefixes.c 1eb85b7b64b8adf5cbb18a72c51a8f2910a7bc0fd5fbc81a9213ba4af2d51811 +F ext/misc/prefixes.c 7be86d17525cfae6ed462fc3c519efc44488ac329890f77491c8f82871f57e17 F ext/misc/regexp.c 79345bf03496155a640ee0300d3307296761cebb5e115b4e342cc2fb5861ec10 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 540a169cb0d74f15522a8930b0cccdcb37a4fd071d219a5a083a319fc6e8db77 @@ -524,7 +524,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 6b19e7562195aaf881f3e35e2472dc01ae3cb156961db5126c3d616744729b7e -F src/test1.c 64cdc914a77102e008dfae7adaa4ded54c2d4953d1464ea8709805a2aab755eb +F src/test1.c 353b066e7ec761c4c715c1c20b888e0e7a0b0c0eda7f68c110e032d63713cade F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6 @@ -1804,7 +1804,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 3d3b142f1045080beb775a9cfe88ec143aa460750132e20059fd510291449850 -R d41aafcf787e802c644013f64e8a2340 -U drh -Z 00fab67b3e6a43dd7c12c17d8ee399d1 +P 3087a0c31e9fbfaedb7cf10a2fda59bc22318ff178614aefcc00ac83d9a7bb14 +R 8b56ce01d9688db09683490a688f55d6 +U dan +Z 7f146451be4266c97b71a0741a05a13b diff --git a/manifest.uuid b/manifest.uuid index ea8de59dcc..e96d093dc7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3087a0c31e9fbfaedb7cf10a2fda59bc22318ff178614aefcc00ac83d9a7bb14 \ No newline at end of file +d2cca36adc69d2c8e7707d70cbd75c497eae6a1a3f8a9dd18249ca6804c9db5f \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index 1fd48fec6b..d8a0c8642f 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7141,7 +7141,9 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( extern int sqlite3_ieee_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_nextchar_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_percentile_init(sqlite3*,char**,const sqlite3_api_routines*); +#ifndef SQLITE_OMIT_VIRTUALTABLE extern int sqlite3_prefixes_init(sqlite3*,char**,const sqlite3_api_routines*); +#endif extern int sqlite3_regexp_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_remember_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_series_init(sqlite3*,char**,const sqlite3_api_routines*); @@ -7167,7 +7169,9 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( { "ieee754", sqlite3_ieee_init }, { "nextchar", sqlite3_nextchar_init }, { "percentile", sqlite3_percentile_init }, +#ifndef SQLITE_OMIT_VIRTUALTABLE { "prefixes", sqlite3_prefixes_init }, +#endif { "regexp", sqlite3_regexp_init }, { "remember", sqlite3_remember_init }, { "series", sqlite3_series_init }, From fbf6136c78d1754501203449d0d16cef3ab25663 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 Feb 2019 13:48:04 +0000 Subject: [PATCH 214/306] Do not attempt to test the shell ".trace" command in SQLITE_OMIT_TRACE builds. FossilOrigin-Name: 3839e9098107604e1526c2b1e813c019607077dfe39d7eeb92f3466518dec3b1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/shell4.test | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8ef969d860..c40263b960 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\spreventing\stestfixture\sfrom\sbeing\sbuilt\swith\sSQLITE_OMIT_VIRTUALTABLE. -D 2019-02-06T13:41:19.971 +C Do\snot\sattempt\sto\stest\sthe\sshell\s".trace"\scommand\sin\sSQLITE_OMIT_TRACE\sbuilds. +D 2019-02-06T13:48:04.179 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -1295,7 +1295,7 @@ F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 F test/shell1.test 0378c4e9e800da6fbb3c86c0c8f2cf5efc9e4155b4b6447d27dc71de648fc0a1 F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 -F test/shell4.test a6881d0ae226ded0df8ebdfa574c5aa6dc28d6884ccba1089dc56ed08b9e5ef4 +F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce F test/shell5.test 23939a4c51f0421330ea61dbd3c74f9c215f5f8d3d1a94846da6ffc777a35458 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f @@ -1804,7 +1804,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 3087a0c31e9fbfaedb7cf10a2fda59bc22318ff178614aefcc00ac83d9a7bb14 -R 8b56ce01d9688db09683490a688f55d6 +P d2cca36adc69d2c8e7707d70cbd75c497eae6a1a3f8a9dd18249ca6804c9db5f +R 0604b756261c3eacd605f066620218f1 U dan -Z 7f146451be4266c97b71a0741a05a13b +Z 4dc5274dec3f90959ac1ed51dd64dba8 diff --git a/manifest.uuid b/manifest.uuid index e96d093dc7..ed86f33908 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d2cca36adc69d2c8e7707d70cbd75c497eae6a1a3f8a9dd18249ca6804c9db5f \ No newline at end of file +3839e9098107604e1526c2b1e813c019607077dfe39d7eeb92f3466518dec3b1 \ No newline at end of file diff --git a/test/shell4.test b/test/shell4.test index 2210e74a67..386e51f6c7 100644 --- a/test/shell4.test +++ b/test/shell4.test @@ -106,6 +106,7 @@ SELECT 1; [regexp {Autoindex Inserts} $res] } {1 1 1} +ifcapable trace { do_test shell4-2.1 { catchcmd ":memory:" "CREATE TABLE t1(x);\n.trace --unknown" } {1 {Unknown option "--unknown" on ".trace"}} @@ -115,7 +116,6 @@ do_test shell4-2.2 { do_test shell4-2.3 { catchcmd ":memory:" ".trace stdout\n.dump\n.trace off\n" } {/^0 {PRAGMA.*}$/} -ifcapable trace { do_test shell4-2.4 { catchcmd ":memory:" ".trace stdout\nCREATE TABLE t1(x);SELECT * FROM t1;" } {0 {CREATE TABLE t1(x); From 531230d006696e418d40b7808798de628a3fd4f2 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 Feb 2019 15:23:43 +0000 Subject: [PATCH 215/306] Add -DSQLITE_ENABLE_DESERIALIZE to the default testing configuration in test/releasetest.tcl. FossilOrigin-Name: 433d6ef637a10ee017b5d8cadd125a162cfedc9895ae862b8dde6dddb7eda59b --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/releasetest.tcl | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index c40263b960..83dc612900 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sattempt\sto\stest\sthe\sshell\s".trace"\scommand\sin\sSQLITE_OMIT_TRACE\sbuilds. -D 2019-02-06T13:48:04.179 +C Add\s-DSQLITE_ENABLE_DESERIALIZE\sto\sthe\sdefault\stesting\sconfiguration\sin\stest/releasetest.tcl. +D 2019-02-06T15:23:43.214 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -1222,7 +1222,7 @@ F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 -F test/releasetest.tcl b290d538ffcb2ff711f09eadc7396c1a42580f3fb078605471dc8875ca0b4d1e x +F test/releasetest.tcl 7712811e0f4e2f198ec786cb2e1352b3793d7395f48a3cceef0572d8823eb75e x F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa @@ -1804,7 +1804,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 d2cca36adc69d2c8e7707d70cbd75c497eae6a1a3f8a9dd18249ca6804c9db5f -R 0604b756261c3eacd605f066620218f1 +P 3839e9098107604e1526c2b1e813c019607077dfe39d7eeb92f3466518dec3b1 +R 75cc10d375ea2db1c9efea9ae5b0c6e6 U dan -Z 4dc5274dec3f90959ac1ed51dd64dba8 +Z e88f08e9628dff53dc70edfa07be42f7 diff --git a/manifest.uuid b/manifest.uuid index ed86f33908..6d60f67771 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3839e9098107604e1526c2b1e813c019607077dfe39d7eeb92f3466518dec3b1 \ No newline at end of file +433d6ef637a10ee017b5d8cadd125a162cfedc9895ae862b8dde6dddb7eda59b \ No newline at end of file diff --git a/test/releasetest.tcl b/test/releasetest.tcl index 55c5a602ca..c520a535c8 100755 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -50,6 +50,7 @@ array set ::Configs [strip_comments { -O2 --disable-amalgamation --disable-shared --enable-session + -DSQLITE_ENABLE_DESERIALIZE } "Sanitize" { CC=clang -fsanitize=undefined From 6e08c4a5e609ddae15f2d537a7c1820558dd4a86 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 Feb 2019 18:08:42 +0000 Subject: [PATCH 216/306] Update test file dbfuzz001.test so that it works with SQLITE_ENABLE_OVERSIZE_CELL_CHECK builds. FossilOrigin-Name: 4371a0c46ee7bfbc0a1507796bd9eefd3371adad81b8dda214d018854316727b --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz001.test | 28 +++++++++++++++++++++------- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 83dc612900..1de1af2f26 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\s-DSQLITE_ENABLE_DESERIALIZE\sto\sthe\sdefault\stesting\sconfiguration\sin\stest/releasetest.tcl. -D 2019-02-06T15:23:43.214 +C Update\stest\sfile\sdbfuzz001.test\sso\sthat\sit\sworks\swith\sSQLITE_ENABLE_OVERSIZE_CELL_CHECK\sbuilds. +D 2019-02-06T18:08:42.581 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -782,7 +782,7 @@ F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68 F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b10 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e -F test/dbfuzz001.test 9617fb870f7d655c27994749955efee5d93a641c082dce4c59059796ff81145e +F test/dbfuzz001.test 29b6c6b39a701b6b5b08035c637674b76e1ecea515b1a184b29e3bd0f2d02dad F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c 5d5eb817dc8195e0228227510ee6a4b49f46e679fc2d5be96841cce819bf42f7 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 @@ -1804,7 +1804,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 3839e9098107604e1526c2b1e813c019607077dfe39d7eeb92f3466518dec3b1 -R 75cc10d375ea2db1c9efea9ae5b0c6e6 +P 433d6ef637a10ee017b5d8cadd125a162cfedc9895ae862b8dde6dddb7eda59b +R 140493311e0e207154d6983d82a1d0da U dan -Z e88f08e9628dff53dc70edfa07be42f7 +Z 03494d745416e1c6f32b0dda6a823d51 diff --git a/manifest.uuid b/manifest.uuid index 6d60f67771..8737e6ed3e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -433d6ef637a10ee017b5d8cadd125a162cfedc9895ae862b8dde6dddb7eda59b \ No newline at end of file +4371a0c46ee7bfbc0a1507796bd9eefd3371adad81b8dda214d018854316727b \ No newline at end of file diff --git a/test/dbfuzz001.test b/test/dbfuzz001.test index 0a36867e66..01af4df2d8 100644 --- a/test/dbfuzz001.test +++ b/test/dbfuzz001.test @@ -168,8 +168,20 @@ do_test dbfuzz001-100 { | 496: 01 0d 3f 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 ..?..H.T........ | end c4.db }] - db eval {PRAGMA writable_schema=on; PRAGMA integrity_check} -} {/Fragmentation of 384 bytes reported as 0 on page 8/} +} {} + +ifcapable !oversize_cell_check { + # Non SQLITE_ENABLE_OVERSIZE_CELL_CHECK builds: + do_test dbfuzz001-101a { + db eval {PRAGMA writable_schema=on; PRAGMA integrity_check} + } {/Fragmentation of 384 bytes reported as 0 on page 8/} +} else { + # SQLITE_ENABLE_OVERSIZE_CELL_CHECK builds: + do_catchsql_test dbfuzz001-101b { + PRAGMA writable_schema=on; + PRAGMA integrity_check; + } {1 {database disk image is malformed}} +} # The DELETE query below deletes the very last cell from page 8. # Prior to a certain fix to sqlite3BtreeDelete() and because of the @@ -177,9 +189,11 @@ do_test dbfuzz001-100 { # cause a rebalance operation, which would leave the btree in a weird # state that would lead to segfaults and or assertion faults. # -do_execsql_test dbfuzz001-110 { +set res {0 {}} +ifcapable oversize_cell_check { set res {1 {database disk image is malformed}} } +do_catchsql_test dbfuzz001-110 { DELETE FROM t3 WHERE x IS NOT NULL AND +rowid=6; -} {} +} $res # This is a dbfuzz2-generate test case that can cause a page with # pPage->nCell==0 to enter the balancer. @@ -270,7 +284,7 @@ do_test dbfuzz001-200 { } {1 {database disk image is malformed}} -do_test dbfuzz001-110 { +do_test dbfuzz001-310 { sqlite3 db {} db deserialize [decode_hexdb { | size 3584 pagesize 512 filename x/c02.db @@ -349,11 +363,11 @@ do_test dbfuzz001-110 { }] } {} -do_catchsql_test dbfuzz001-120 { +do_catchsql_test dbfuzz001-320 { PRAGMA integrity_check; } {1 {database disk image is malformed}} -do_catchsql_test dbfuzz001-130 { +do_catchsql_test dbfuzz001-330 { DELETE FROM t3 WHERE x IN (SELECT x FROM t4); } {1 {database disk image is malformed}} From 9c5f73433974bb186237917997550307177d0378 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 Feb 2019 19:42:02 +0000 Subject: [PATCH 217/306] Avoid attempting to delete a file while it is still open in walfault2.test. FossilOrigin-Name: 9d54a63d6e3cd47b483cf0ee868a5e7f638bcb0e3cbdeaecc667f293b87a3e99 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/walfault2.test | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 1de1af2f26..fc7d55f402 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\stest\sfile\sdbfuzz001.test\sso\sthat\sit\sworks\swith\sSQLITE_ENABLE_OVERSIZE_CELL_CHECK\sbuilds. -D 2019-02-06T18:08:42.581 +C Avoid\sattempting\sto\sdelete\sa\sfile\swhile\sit\sis\sstill\sopen\sin\swalfault2.test. +D 2019-02-06T19:42:02.100 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -1630,7 +1630,7 @@ F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af F test/walcrash4.test e7b6e7639a950a0cca8e210e248c8dad4d63bf20 F test/walfault.test 09b8ad7e52d2f54bce50e31aa7ea51412bb9f70ac13c74e669ddcd8b48b0d98d -F test/walfault2.test 39337e9ca6906b3942734ab212e099edd7d331b2819a04dbf3b2bd4d58526251 +F test/walfault2.test e039ac66c78d5561683cacde04097213cdad3b58e2b3f3fe1112862217bfd915 F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 F test/walmode.test cd6e7cff618eaaa5910ce57c3657aa50110397f86213886a2400afb9bfec7b7b F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 @@ -1804,7 +1804,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 433d6ef637a10ee017b5d8cadd125a162cfedc9895ae862b8dde6dddb7eda59b -R 140493311e0e207154d6983d82a1d0da +P 4371a0c46ee7bfbc0a1507796bd9eefd3371adad81b8dda214d018854316727b +R d4922208e2eda6491c188a2294d5966b U dan -Z 03494d745416e1c6f32b0dda6a823d51 +Z c62087236c08b1954dc9b06cf8c680a3 diff --git a/manifest.uuid b/manifest.uuid index 8737e6ed3e..37ee46638b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4371a0c46ee7bfbc0a1507796bd9eefd3371adad81b8dda214d018854316727b \ No newline at end of file +9d54a63d6e3cd47b483cf0ee868a5e7f638bcb0e3cbdeaecc667f293b87a3e99 \ No newline at end of file diff --git a/test/walfault2.test b/test/walfault2.test index 239370ad5a..a4c352be29 100644 --- a/test/walfault2.test +++ b/test/walfault2.test @@ -36,6 +36,7 @@ do_execsql_test 1.0 { faultsim_save_and_close do_faultsim_test 1 -prep { + catch { db close } faultsim_restore sqlite3 db file:test.db?psow=0 -uri 1 file_control_powersafe_overwrite db 0 From 922b35801d8bdbb9365cbde7d44e66293f616e13 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 Feb 2019 20:12:00 +0000 Subject: [PATCH 218/306] Update an assert() in test_journal.c to take the new "VACUUM INTO" functionality into account. FossilOrigin-Name: 0e6249cb958a40ead0edf6e75a2c46e8657db3d358c5fe78a9dc0fa5ed7ad929 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/test_journal.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index fc7d55f402..7301a2623f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sattempting\sto\sdelete\sa\sfile\swhile\sit\sis\sstill\sopen\sin\swalfault2.test. -D 2019-02-06T19:42:02.100 +C Update\san\sassert()\sin\stest_journal.c\sto\stake\sthe\snew\s"VACUUM\sINTO"\sfunctionality\sinto\saccount. +D 2019-02-06T20:12:00.950 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -549,7 +549,7 @@ F src/test_hexio.c 1d4469ca61ab202a1fcec6543f584d2407205e8d F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71 F src/test_intarray.h d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7 -F src/test_journal.c 619f2aa10e0d7a5f87c0f06825bc61dfce1c6b9c7f3ad990fb13de6c3b8874a3 +F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f4e287 F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd F src/test_malloc.c dec0aa821b230773aeb3dd11d652c1193f7cedb18a20b25659bc672288115242 F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c @@ -1804,7 +1804,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 4371a0c46ee7bfbc0a1507796bd9eefd3371adad81b8dda214d018854316727b -R d4922208e2eda6491c188a2294d5966b +P 9d54a63d6e3cd47b483cf0ee868a5e7f638bcb0e3cbdeaecc667f293b87a3e99 +R 8c85950d3cd30dc89de951d666875053 U dan -Z c62087236c08b1954dc9b06cf8c680a3 +Z a7b437b21243f686db6fff4b720de94a diff --git a/manifest.uuid b/manifest.uuid index 37ee46638b..f296734b9c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9d54a63d6e3cd47b483cf0ee868a5e7f638bcb0e3cbdeaecc667f293b87a3e99 \ No newline at end of file +0e6249cb958a40ead0edf6e75a2c46e8657db3d358c5fe78a9dc0fa5ed7ad929 \ No newline at end of file diff --git a/src/test_journal.c b/src/test_journal.c index 8a449e888c..6a040ea0ce 100644 --- a/src/test_journal.c +++ b/src/test_journal.c @@ -560,7 +560,7 @@ static int jtWrite( /* The following assert() statements may fail if this layer is used ** with a connection in "PRAGMA synchronous=off" mode. If they ** fail with sync=normal or sync=full, this may indicate problem. */ - assert( pgno<=p->nPage || p->nSync>0 ); + assert( p->nPage==0 || pgno<=p->nPage || p->nSync>0 ); assert( pgno>p->nPage || sqlite3BitvecTest(p->pWritable, pgno) ); } } From e385d33a296bd9cfbb2fbb97a31420dfe6017ef1 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 6 Feb 2019 20:49:49 +0000 Subject: [PATCH 219/306] Ensure all bytes of the PgHdr1 structure are initialized. This avoids a valgrind error when running corruptI.test. FossilOrigin-Name: a505e34d4ec31159a4508ec827fcffed0cf3bd5ea5ef0ac293016da02367a53a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pcache1.c | 15 +++++++++++++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 7301a2623f..c5d0ffd6b5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\san\sassert()\sin\stest_journal.c\sto\stake\sthe\snew\s"VACUUM\sINTO"\sfunctionality\sinto\saccount. -D 2019-02-06T20:12:00.950 +C Ensure\sall\sbytes\sof\sthe\sPgHdr1\sstructure\sare\sinitialized.\sThis\savoids\sa\svalgrind\serror\swhen\srunning\scorruptI.test. +D 2019-02-06T20:49:49.545 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -506,7 +506,7 @@ F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 +F src/pcache1.c a72804486dfa8e4b6bc30d666c97ecf1155f91a4351fc6e48ea4097e4eb304fb F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 @@ -1804,7 +1804,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 9d54a63d6e3cd47b483cf0ee868a5e7f638bcb0e3cbdeaecc667f293b87a3e99 -R 8c85950d3cd30dc89de951d666875053 +P 0e6249cb958a40ead0edf6e75a2c46e8657db3d358c5fe78a9dc0fa5ed7ad929 +R ae802dacb8527f87f376ccfd3e8e8a19 U dan -Z a7b437b21243f686db6fff4b720de94a +Z afd2fa2b6e156ba28cf67431d1126efa diff --git a/manifest.uuid b/manifest.uuid index f296734b9c..acc0ea617a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e6249cb958a40ead0edf6e75a2c46e8657db3d358c5fe78a9dc0fa5ed7ad929 \ No newline at end of file +a505e34d4ec31159a4508ec827fcffed0cf3bd5ea5ef0ac293016da02367a53a \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index 72e81bb2b2..5f502d57ba 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -92,12 +92,22 @@ typedef struct PGroup PGroup; ** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of ** PgHdr1.pCache->szPage bytes is allocated directly before this structure ** in memory. +** +** Note: Variables isBulkLocal and isAnchor were once type "u8". That works, +** but causes a 2-byte gap in the structure for most architectures (since +** pointers must be either 4 or 8-byte aligned). As this structure is located +** in memory directly after the associated page data, if the database is +** corrupt, code at the b-tree layer may overread the page buffer and +** read part of this structure before the corruption is detected. This +** can cause a valgrind error if the unitialized gap is accessed. Using u16 +** ensures there is no such gap, and therefore no bytes of unitialized memory +** in the structure. */ struct PgHdr1 { sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */ unsigned int iKey; /* Key value (page number) */ - u8 isBulkLocal; /* This page from bulk local storage */ - u8 isAnchor; /* This is the PGroup.lru element */ + u16 isBulkLocal; /* This page from bulk local storage */ + u16 isAnchor; /* This is the PGroup.lru element */ PgHdr1 *pNext; /* Next in hash table chain */ PCache1 *pCache; /* Cache that currently owns this page */ PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ @@ -303,6 +313,7 @@ static int pcache1InitBulk(PCache1 *pCache){ pX->isBulkLocal = 1; pX->isAnchor = 0; pX->pNext = pCache->pFree; + pX->pLruPrev = 0; /* Initializing this saves a valgrind error */ pCache->pFree = pX; zBulk += pCache->szAlloc; }while( --nBulk ); From af63892337c6fe37972bbae9b77365eb8c33d47a Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 7 Feb 2019 00:17:36 +0000 Subject: [PATCH 220/306] In the fuzzcheck test program, make sure the isspace() and related routines are not given values outside the range of -1 to 255. FossilOrigin-Name: f298328771d5aaba798d05f50c77ac239c7c72422ff35953463d6876a9659f74 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c5d0ffd6b5..fef72936bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sall\sbytes\sof\sthe\sPgHdr1\sstructure\sare\sinitialized.\sThis\savoids\sa\svalgrind\serror\swhen\srunning\scorruptI.test. -D 2019-02-06T20:49:49.545 +C In\sthe\sfuzzcheck\stest\sprogram,\smake\ssure\sthe\sisspace()\sand\srelated\sroutines\nare\snot\sgiven\svalues\soutside\sthe\srange\sof\s-1\sto\s255. +D 2019-02-07T00:17:36.218 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -984,7 +984,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 6bb28cc6ad247950e22bcc106bbeefff8c3c737f80c24573d8c18ef1cac6f2ac +F test/fuzzcheck.c 7ab35ca464fa0fa9c8340b71f08a16c50c14b961264c172cc3d1a67289b2800d F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1804,7 +1804,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 0e6249cb958a40ead0edf6e75a2c46e8657db3d358c5fe78a9dc0fa5ed7ad929 -R ae802dacb8527f87f376ccfd3e8e8a19 -U dan -Z afd2fa2b6e156ba28cf67431d1126efa +P a505e34d4ec31159a4508ec827fcffed0cf3bd5ea5ef0ac293016da02367a53a +R d5115c238fed46e746b74b22004ee963 +U drh +Z 2225211b2294245a758dcb28378cffd6 diff --git a/manifest.uuid b/manifest.uuid index acc0ea617a..c0a830d76b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a505e34d4ec31159a4508ec827fcffed0cf3bd5ea5ef0ac293016da02367a53a \ No newline at end of file +f298328771d5aaba798d05f50c77ac239c7c72422ff35953463d6876a9659f74 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index e050875669..80397ba4e4 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -533,7 +533,7 @@ static int decodeDatabase( } memset(a, 0, nAlloc); for(i=k=0; i=4 ){ printf("RUNNING-SQL: [%s]\n", zSql); From 24bfecab3ce1b13bd8e863b08837ee695902da28 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 7 Feb 2019 15:09:44 +0000 Subject: [PATCH 221/306] Experimental change to VACUUM so that it preserves existing ROWID values. FossilOrigin-Name: f264015f84de51d74f681ba62a5f26bd859480d93e1eaf9e1018b3e9b4e0bea3 --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/insert.c | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index fef72936bf..8f475d500a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sfuzzcheck\stest\sprogram,\smake\ssure\sthe\sisspace()\sand\srelated\sroutines\nare\snot\sgiven\svalues\soutside\sthe\srange\sof\s-1\sto\s255. -D 2019-02-07T00:17:36.218 +C Experimental\schange\sto\sVACUUM\sso\sthat\sit\spreserves\sexisting\sROWID\svalues. +D 2019-02-07T15:09:44.698 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -475,7 +475,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 3ed9ceaa4b7d56a6f2613355e1cd1ae5cfe31712bce2bf5aa93c5f1f130704b2 +F src/insert.c 4cf069988908f650bec92fd821a082f6eda87c01191047e49a1a5007af93274c F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f @@ -1804,7 +1804,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 a505e34d4ec31159a4508ec827fcffed0cf3bd5ea5ef0ac293016da02367a53a -R d5115c238fed46e746b74b22004ee963 +P f298328771d5aaba798d05f50c77ac239c7c72422ff35953463d6876a9659f74 +R 529825220f385ddc83a068a4e8c392f8 +T *branch * vacuum-preserves-rowid +T *sym-vacuum-preserves-rowid * +T -sym-trunk * U drh -Z 2225211b2294245a758dcb28378cffd6 +Z b9b4f509af56a05508a2323b58cd335c diff --git a/manifest.uuid b/manifest.uuid index c0a830d76b..00c3b7ba92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f298328771d5aaba798d05f50c77ac239c7c72422ff35953463d6876a9659f74 \ No newline at end of file +f264015f84de51d74f681ba62a5f26bd859480d93e1eaf9e1018b3e9b4e0bea3 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index a69e625a11..1b6235d4d0 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2347,7 +2347,7 @@ static int xferOptimization( sqlite3RowidConstraint(pParse, onError, pDest); sqlite3VdbeJumpHere(v, addr2); autoIncStep(pParse, regAutoinc, regRowid); - }else if( pDest->pIndex==0 ){ + }else if( pDest->pIndex==0 && !(db->mDbFlags & DBFLAG_Vacuum) ){ addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); }else{ addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); From c9912d1706610d77406d579450af50600cab2ea1 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 7 Feb 2019 17:02:52 +0000 Subject: [PATCH 222/306] Version 3.27.0 FossilOrigin-Name: 97744701c3bd414e6c9d7182639d8c2ce7cf124c4fce625071ae65658ac61713 --- manifest | 11 +++++++---- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index fef72936bf..b02230258b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sfuzzcheck\stest\sprogram,\smake\ssure\sthe\sisspace()\sand\srelated\sroutines\nare\snot\sgiven\svalues\soutside\sthe\srange\sof\s-1\sto\s255. -D 2019-02-07T00:17:36.218 +C Version\s3.27.0 +D 2019-02-07T17:02:52.652 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -1804,7 +1804,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 a505e34d4ec31159a4508ec827fcffed0cf3bd5ea5ef0ac293016da02367a53a +P f298328771d5aaba798d05f50c77ac239c7c72422ff35953463d6876a9659f74 R d5115c238fed46e746b74b22004ee963 +T +bgcolor * #d0c0ff +T +sym-release * +T +sym-version-3.27.0 * U drh -Z 2225211b2294245a758dcb28378cffd6 +Z 01296668b9d6cd12052a19573f2fcbb6 diff --git a/manifest.uuid b/manifest.uuid index c0a830d76b..99b8528c2a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f298328771d5aaba798d05f50c77ac239c7c72422ff35953463d6876a9659f74 \ No newline at end of file +97744701c3bd414e6c9d7182639d8c2ce7cf124c4fce625071ae65658ac61713 \ No newline at end of file From 8851e10017893cfaf88acf80e223149fea1a1a37 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Feb 2019 04:15:19 +0000 Subject: [PATCH 223/306] Do not do the optimization that attempts to pull expression values from an index on that expression when processing a multi-index OR (see check-in [a47efb7c8520a0111]) because the expression transformations that are applied become invalid when the processing moves off of the current index and on to the next index. Fix for ticket [4e8e4857d32d401f]. FossilOrigin-Name: 440a7cda000164d3b46109caf2e1dde80681ba9b0d94ba9be6847d2b917445cf --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/wherecode.c | 7 ++++++- test/join5.test | 12 ++++++++++++ 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 48ffe58c34..f1e39eda42 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sVACUUM\sso\sthat\sit\spreserves\sROWID\svalues. -D 2019-02-07T19:07:11.330 +C Do\snot\sdo\sthe\soptimization\sthat\sattempts\sto\spull\sexpression\svalues\sfrom\nan\sindex\son\sthat\sexpression\swhen\sprocessing\sa\smulti-index\sOR\n(see\scheck-in\s[a47efb7c8520a0111])\sbecause\sthe\sexpression\stransformations\nthat\sare\sapplied\sbecome\sinvalid\swhen\sthe\sprocessing\smoves\soff\sof\sthe\scurrent\nindex\sand\son\sto\sthe\snext\sindex.\s\sFix\sfor\sticket\s[4e8e4857d32d401f]. +D 2019-02-08T04:15:19.414 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -601,7 +601,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 +F src/wherecode.c a571d8d7c19d6db786a201f2df8788b320fefcb2842f2a1eb9a85b85e91bc35f F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1061,7 +1061,7 @@ F test/join.test d53a3662762eff50b65da8775201e609878a27dd0885a1ae7bcde9bb46cecbc F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 -F test/join5.test 1df0a9b94f34a6c40c7f708f550dcb1cb80109f0ed774dba5a95915fbfbb6bc9 +F test/join5.test f8b5ffdf3c1513486b52ad4e49225507ecee5005f210eb18688f791d25370972 F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 @@ -1804,8 +1804,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 97744701c3bd414e6c9d7182639d8c2ce7cf124c4fce625071ae65658ac61713 f264015f84de51d74f681ba62a5f26bd859480d93e1eaf9e1018b3e9b4e0bea3 -R 05b9e1b76adf5831324340b3998a8a97 -T +closed f264015f84de51d74f681ba62a5f26bd859480d93e1eaf9e1018b3e9b4e0bea3 +P 49e5d11d463de078c2b8a963f5ed436210937e6dfddf06942132db9ec685bfd8 +R dda90614b467e8a8b1ef42222365d2b0 U drh -Z 5264352d0dc2fc8c551bb88bbcc0d82f +Z 81faba5054f3c2fda65d1c18f6a345b6 diff --git a/manifest.uuid b/manifest.uuid index ce140149bd..4646e5615d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -49e5d11d463de078c2b8a963f5ed436210937e6dfddf06942132db9ec685bfd8 \ No newline at end of file +440a7cda000164d3b46109caf2e1dde80681ba9b0d94ba9be6847d2b917445cf \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index cffa789593..19315779bf 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1756,8 +1756,13 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** the cursor. In this case it is important to do the full evaluation, ** as the result of the expression may not be NULL, even if all table ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a + ** + ** Also, do not do this when processing one index an a multi-index + ** OR clause, since the transformation will become invalid once we + ** move forward to the next index. + ** https://sqlite.org/src/info/4e8e4857d32d401f */ - if( pLevel->iLeftJoin==0 ){ + if( pLevel->iLeftJoin==0 && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); } diff --git a/test/join5.test b/test/join5.test index 31280c5d17..f4ded796bf 100644 --- a/test/join5.test +++ b/test/join5.test @@ -241,6 +241,18 @@ do_execsql_test 6.3.2 { SELECT ifnull(z, '!!!') FROM t3 LEFT JOIN t4 ON (x=y); } {!!!} +# 2019-02-08 https://sqlite.org/src/info/4e8e4857d32d401f +reset_db +do_execsql_test 6.100 { + CREATE TABLE t1(aa, bb); + CREATE INDEX t1x1 on t1(abs(aa), abs(bb)); + INSERT INTO t1 VALUES(-2,-3),(+2,-3),(-2,+3),(+2,+3); + SELECT * FROM (t1) + WHERE ((abs(aa)=1 AND 1=2) OR abs(aa)=2) + AND abs(bb)=3 + ORDER BY +1, +2; +} {-2 -3 -2 3 2 -3 2 3} + #------------------------------------------------------------------------- # reset_db From 1cf197583de15d352dc169437f619d2e4631cf4b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Feb 2019 14:55:30 +0000 Subject: [PATCH 224/306] Give the sqlite3 object a pointer to the current Parse so that if an OOM occurs, it can automatically set the Parse.rc value to SQLITE_NOMEM. This avoids a frequent extra test of db.mallocFailed in the innermost parser loop. FossilOrigin-Name: 5c6638040b3017c6be016441422d965a3ca00dd6ae1f78cadc0b54562978f64e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/malloc.c | 3 +++ src/sqliteInt.h | 2 ++ src/tokenize.c | 8 +++++++- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f1e39eda42..7b191284e8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sdo\sthe\soptimization\sthat\sattempts\sto\spull\sexpression\svalues\sfrom\nan\sindex\son\sthat\sexpression\swhen\sprocessing\sa\smulti-index\sOR\n(see\scheck-in\s[a47efb7c8520a0111])\sbecause\sthe\sexpression\stransformations\nthat\sare\sapplied\sbecome\sinvalid\swhen\sthe\sprocessing\smoves\soff\sof\sthe\scurrent\nindex\sand\son\sto\sthe\snext\sindex.\s\sFix\sfor\sticket\s[4e8e4857d32d401f]. -D 2019-02-08T04:15:19.414 +C Give\sthe\ssqlite3\sobject\sa\spointer\sto\sthe\scurrent\sParse\sso\sthat\sif\san\sOOM\noccurs,\sit\scan\sautomatically\sset\sthe\sParse.rc\svalue\sto\sSQLITE_NOMEM.\s\sThis\navoids\sa\sfrequent\sextra\stest\sof\sdb.mallocFailed\sin\sthe\sinnermost\sparser\sloop. +D 2019-02-08T14:55:30.490 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -479,7 +479,7 @@ F src/insert.c 4cf069988908f650bec92fd821a082f6eda87c01191047e49a1a5007af93274c F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f -F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 +F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -519,7 +519,7 @@ F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251 F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h f657e35d824fdc17ddf46bb85f0193df3b965e8354ded9ec37825057e3224bcc +F src/sqliteInt.h 8628c582eafa5ca93523cdaa7c45b2f38a11132e419c7923850706da7fa36bc2 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -577,7 +577,7 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c 0a065eaa31f494ba31ac21d4a5d24a5a7865a7d849459f8c6266df1ac6b9aedf +F src/tokenize.c e61ead283dff63762a9f5be462dbd258dba948e5fb4e3b261fc03703426eb12e F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1 @@ -1804,7 +1804,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 49e5d11d463de078c2b8a963f5ed436210937e6dfddf06942132db9ec685bfd8 -R dda90614b467e8a8b1ef42222365d2b0 +P 440a7cda000164d3b46109caf2e1dde80681ba9b0d94ba9be6847d2b917445cf +R d896d8bd0769798bd0ceee3ae07599f8 U drh -Z 81faba5054f3c2fda65d1c18f6a345b6 +Z 9fd176c740cfae5da5074aab30ee1252 diff --git a/manifest.uuid b/manifest.uuid index 4646e5615d..48f2b4598d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -440a7cda000164d3b46109caf2e1dde80681ba9b0d94ba9be6847d2b917445cf \ No newline at end of file +5c6638040b3017c6be016441422d965a3ca00dd6ae1f78cadc0b54562978f64e \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index d7f9df5efc..559e7259ce 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -661,6 +661,9 @@ void sqlite3OomFault(sqlite3 *db){ db->u1.isInterrupted = 1; } db->lookaside.bDisable++; + if( db->pParse ){ + db->pParse->rc = SQLITE_NOMEM_BKPT; + } } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 774d3e5011..e568677759 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1431,6 +1431,7 @@ struct sqlite3 { void (*xRollbackCallback)(void*); /* Invoked at every commit. */ void *pUpdateArg; void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); + Parse *pParse; /* Current parse */ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK void *pPreUpdateArg; /* First argument to xPreUpdateCallback */ void (*xPreUpdateCallback)( /* Registered using sqlite3_preupdate_hook() */ @@ -3094,6 +3095,7 @@ struct Parse { AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ Parse *pToplevel; /* Parse structure for main program (or NULL) */ Table *pTriggerTab; /* Table triggers are being coded for */ + Parse *pParentParse; /* Parent parser if this parser is nested */ int addrCrTab; /* Address of OP_CreateBtree opcode on CREATE TABLE */ u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u32 oldmask; /* Mask of old.* columns referenced */ diff --git a/src/tokenize.c b/src/tokenize.c index 2d7b23d4e0..d22b46371f 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -560,6 +560,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ int lastTokenParsed = -1; /* type of the previous token */ sqlite3 *db = pParse->db; /* The database connection */ int mxSqlLen; /* Max length of an SQL string */ + VVA_ONLY( u8 startedWithOom = db->mallocFailed ); #ifdef sqlite3Parser_ENGINEALWAYSONSTACK yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif @@ -594,6 +595,8 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ assert( pParse->pNewTrigger==0 ); assert( pParse->nVar==0 ); assert( pParse->pVList==0 ); + pParse->pParentParse = db->pParse; + db->pParse = pParse; while( 1 ){ n = sqlite3GetToken((u8*)zSql, &tokenType); mxSqlLen -= n; @@ -650,7 +653,8 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ sqlite3Parser(pEngine, tokenType, pParse->sLastToken); lastTokenParsed = tokenType; zSql += n; - if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break; + assert( db->mallocFailed==0 || pParse->rc!=SQLITE_OK || startedWithOom ); + if( pParse->rc!=SQLITE_OK ) break; } assert( nErr==0 ); #ifdef YYTRACKMAXSTACKDEPTH @@ -718,6 +722,8 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ pParse->pZombieTab = p->pNextZombie; sqlite3DeleteTable(db, p); } + db->pParse = pParse->pParentParse; + pParse->pParentParse = 0; assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; } From 6ff7427733cb13ad1a9d09f9380f0bb646e26c4f Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Feb 2019 15:59:20 +0000 Subject: [PATCH 225/306] Change the sqlite3VdbeMemGrow() routine so that it no longer guarantees a minimum size of 32 bytes. That minimum is no longer required, and without the extra check for the minimum size, the routine runs faster. FossilOrigin-Name: 5c499da8a4d0babc56883aa362ae124772fd9214a51169a88a5dee523d051658 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 4 +--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 7b191284e8..d01e8c1192 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Give\sthe\ssqlite3\sobject\sa\spointer\sto\sthe\scurrent\sParse\sso\sthat\sif\san\sOOM\noccurs,\sit\scan\sautomatically\sset\sthe\sParse.rc\svalue\sto\sSQLITE_NOMEM.\s\sThis\navoids\sa\sfrequent\sextra\stest\sof\sdb.mallocFailed\sin\sthe\sinnermost\sparser\sloop. -D 2019-02-08T14:55:30.490 +C Change\sthe\ssqlite3VdbeMemGrow()\sroutine\sso\sthat\sit\sno\slonger\sguarantees\sa\nminimum\ssize\sof\s32\sbytes.\s\sThat\sminimum\sis\sno\slonger\srequired,\sand\swithout\nthe\sextra\scheck\sfor\sthe\sminimum\ssize,\sthe\sroutine\sruns\sfaster. +D 2019-02-08T15:59:20.543 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -591,7 +591,7 @@ F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 3173f0275cf8643a03ed02084ee56b97fc1a17a2edb5907facec504f59c3172d +F src/vdbemem.c 8facf8d2470af0b8f5995b405b7e061435b58ac53350fddd5e5399adfa904b73 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 2462b7d6fd72b0b916477f5ef210ee49ab58cec195483ebdac0c8c5e3ec42cab @@ -1804,7 +1804,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 440a7cda000164d3b46109caf2e1dde80681ba9b0d94ba9be6847d2b917445cf -R d896d8bd0769798bd0ceee3ae07599f8 +P 5c6638040b3017c6be016441422d965a3ca00dd6ae1f78cadc0b54562978f64e +R fcc87fb69789bc1e53d9d02a501d47e6 U drh -Z 9fd176c740cfae5da5074aab30ee1252 +Z 16cd16f85b68b2c2cfa22d11f08d6b4d diff --git a/manifest.uuid b/manifest.uuid index 48f2b4598d..837c9fcb78 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c6638040b3017c6be016441422d965a3ca00dd6ae1f78cadc0b54562978f64e \ No newline at end of file +5c499da8a4d0babc56883aa362ae124772fd9214a51169a88a5dee523d051658 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 5aa0ec6ca5..e4cea0ff68 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -178,8 +178,7 @@ int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ } /* -** Make sure pMem->z points to a writable allocation of at least -** min(n,32) bytes. +** Make sure pMem->z points to a writable allocation of at least n bytes. ** ** If the bPreserve argument is true, then copy of the content of ** pMem->z into the new allocation. pMem must be either a string or @@ -198,7 +197,6 @@ SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ assert( pMem->szMalloc==0 || pMem->szMalloc==sqlite3DbMallocSize(pMem->db, pMem->zMalloc) ); - if( n<32 ) n = 32; if( pMem->szMalloc>0 && bPreserve && pMem->z==pMem->zMalloc ){ pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); bPreserve = 0; From 16d7e87caa1e02fabf6c226f1c0cf89c820c6a73 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Feb 2019 17:28:20 +0000 Subject: [PATCH 226/306] Further simplifications to sqlite3VdbeMemSetStr(). FossilOrigin-Name: 1d212957079a2caa30f3c9d80f43464781bc9634c2b5181a5814efbddae31711 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 18 +++++++++--------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index d01e8c1192..53d85607bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\ssqlite3VdbeMemGrow()\sroutine\sso\sthat\sit\sno\slonger\sguarantees\sa\nminimum\ssize\sof\s32\sbytes.\s\sThat\sminimum\sis\sno\slonger\srequired,\sand\swithout\nthe\sextra\scheck\sfor\sthe\sminimum\ssize,\sthe\sroutine\sruns\sfaster. -D 2019-02-08T15:59:20.543 +C Further\ssimplifications\sto\ssqlite3VdbeMemSetStr(). +D 2019-02-08T17:28:20.169 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -591,7 +591,7 @@ F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 8facf8d2470af0b8f5995b405b7e061435b58ac53350fddd5e5399adfa904b73 +F src/vdbemem.c 3e89e087df928eba80e520824078dc563c579a0848b1557ac36845ec14392923 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 F src/vtab.c 2462b7d6fd72b0b916477f5ef210ee49ab58cec195483ebdac0c8c5e3ec42cab @@ -1804,7 +1804,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 5c6638040b3017c6be016441422d965a3ca00dd6ae1f78cadc0b54562978f64e -R fcc87fb69789bc1e53d9d02a501d47e6 +P 5c499da8a4d0babc56883aa362ae124772fd9214a51169a88a5dee523d051658 +R 9c9226b3cda6f38720edaaa5f3813b03 U drh -Z 16cd16f85b68b2c2cfa22d11f08d6b4d +Z 9bc13d9b07eaf6edcfa1cadc644eb143 diff --git a/manifest.uuid b/manifest.uuid index 837c9fcb78..b06c875795 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c499da8a4d0babc56883aa362ae124772fd9214a51169a88a5dee523d051658 \ No newline at end of file +1d212957079a2caa30f3c9d80f43464781bc9634c2b5181a5814efbddae31711 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index e4cea0ff68..32a375d3dc 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1045,7 +1045,6 @@ int sqlite3VdbeMemSetStr( assert( enc!=0 ); if( enc==SQLITE_UTF8 ){ nByte = 0x7fffffff & (int)strlen(z); - if( nByte>iLimit ) nByte = iLimit+1; }else{ for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} } @@ -1057,7 +1056,7 @@ int sqlite3VdbeMemSetStr( ** management (one of MEM_Dyn or MEM_Static). */ if( xDel==SQLITE_TRANSIENT ){ - int nAlloc = nByte; + u32 nAlloc = nByte; if( flags&MEM_Term ){ nAlloc += (enc==SQLITE_UTF8?1:2); } @@ -1067,19 +1066,20 @@ int sqlite3VdbeMemSetStr( testcase( nAlloc==0 ); testcase( nAlloc==31 ); testcase( nAlloc==32 ); - if( sqlite3VdbeMemClearAndResize(pMem, MAX(nAlloc,32)) ){ + if( sqlite3VdbeMemClearAndResize(pMem, (int)MAX(nAlloc,32)) ){ return SQLITE_NOMEM_BKPT; } memcpy(pMem->z, z, nAlloc); - }else if( xDel==SQLITE_DYNAMIC ){ - sqlite3VdbeMemRelease(pMem); - pMem->zMalloc = pMem->z = (char *)z; - pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); }else{ sqlite3VdbeMemRelease(pMem); pMem->z = (char *)z; - pMem->xDel = xDel; - flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + if( xDel==SQLITE_DYNAMIC ){ + pMem->zMalloc = pMem->z; + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); + }else{ + pMem->xDel = xDel; + flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn); + } } pMem->n = nByte; From 298f45c6411c100bcbbc8fedc09cc02fc0ce7660 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Feb 2019 22:34:59 +0000 Subject: [PATCH 227/306] Small performance improvement and size reduction for pageFindSlot() - the routine in btree.c that locates a free slot for a cell on a btree page. FossilOrigin-Name: 1969372ac72d25cc642a0268f4bb0ae4b59f2dca568c119ef61b67183b3a8bd9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 39 +++++++++++++++++++++++---------------- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 53d85607bf..7da10d3c4b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\ssimplifications\sto\ssqlite3VdbeMemSetStr(). -D 2019-02-08T17:28:20.169 +C Small\sperformance\simprovement\sand\ssize\sreduction\sfor\spageFindSlot()\s-\sthe\nroutine\sin\sbtree.c\sthat\slocates\sa\sfree\sslot\sfor\sa\scell\son\sa\sbtree\spage. +D 2019-02-08T22:34:59.960 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 84b7c5c3829b60823e15e7a8407462b69be3818f96518fef28f97ac0fbbca72b +F src/btree.c 18046bf14f0e3fa294ef3f7c2dc30ca7e95f3ac11ec222ad906e40b150051bde F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 @@ -1804,7 +1804,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 5c499da8a4d0babc56883aa362ae124772fd9214a51169a88a5dee523d051658 -R 9c9226b3cda6f38720edaaa5f3813b03 +P 1d212957079a2caa30f3c9d80f43464781bc9634c2b5181a5814efbddae31711 +R 1d32a81f0717480499f3dabeb3b2a4f0 U drh -Z 9bc13d9b07eaf6edcfa1cadc644eb143 +Z 7c08fbb57c9ef7825a1477c0d3fbf8a6 diff --git a/manifest.uuid b/manifest.uuid index b06c875795..445e05f621 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1d212957079a2caa30f3c9d80f43464781bc9634c2b5181a5814efbddae31711 \ No newline at end of file +1969372ac72d25cc642a0268f4bb0ae4b59f2dca568c119ef61b67183b3a8bd9 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 3b7ef906c4..e4086ed0f5 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1533,16 +1533,16 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** causes the fragmentation count to exceed 60. */ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ - const int hdr = pPg->hdrOffset; - u8 * const aData = pPg->aData; - int iAddr = hdr + 1; - int pc = get2byte(&aData[iAddr]); - int x; - int usableSize = pPg->pBt->usableSize; - int size; /* Size of the free slot */ + const int hdr = pPg->hdrOffset; /* Offset to page header */ + u8 * const aData = pPg->aData; /* Page data */ + int iAddr = hdr + 1; /* Address of ptr to pc */ + int pc = get2byte(&aData[iAddr]); /* Address of a free slot */ + int x; /* Excess size of the slot */ + int maxPC = pPg->pBt->usableSize - nByte; /* Max address for a usable slot */ + int size; /* Size of the free slot */ assert( pc>0 ); - while( pc<=usableSize-4 ){ + while( pc<=maxPC ){ /* EVIDENCE-OF: R-22710-53328 The third and fourth bytes of each ** freeblock form a big-endian integer which is the size of the freeblock ** in bytes, including the 4-byte header. */ @@ -1550,10 +1550,7 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ if( (x = size - nByte)>=0 ){ testcase( x==4 ); testcase( x==3 ); - if( size+pc > usableSize ){ - *pRc = SQLITE_CORRUPT_PAGE(pPg); - return 0; - }else if( x<4 ){ + if( x<4 ){ /* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total ** number of bytes in fragments may not exceed 60. */ if( aData[hdr+7]>57 ) return 0; @@ -1562,21 +1559,31 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ ** fragmented bytes within the page. */ memcpy(&aData[iAddr], &aData[pc], 2); aData[hdr+7] += (u8)x; + }else if( x+pc > maxPC ){ + /* This slot extends off the end of the usable part of the page */ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + return 0; }else{ /* The slot remains on the free-list. Reduce its size to account - ** for the portion used by the new allocation. */ + ** for the portion used by the new allocation. */ put2byte(&aData[pc+2], x); } return &aData[pc + x]; } iAddr = pc; pc = get2byte(&aData[pc]); - if( pcmaxPC+nByte-4 ){ + /* The free slot chain extends off the end of the page */ *pRc = SQLITE_CORRUPT_PAGE(pPg); } - return 0; } From 2fa619a3a86d554551f4fc6b868dcf0402e59dd5 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 9 Feb 2019 19:23:54 +0000 Subject: [PATCH 228/306] Change a few assert() statements in fts3 that might fail if the database is corrupt. FossilOrigin-Name: db74a56af73d92b7a9d43ceda7e4540915c580c68a0266b4ddefb9e0d5cbcbeb --- ext/fts3/fts3_write.c | 6 +- ext/fts5/test/fts5corrupt3.test | 1 + manifest | 18 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 208 ++++++++++++++++++++++++++++++++ 5 files changed, 223 insertions(+), 12 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 031b7b353b..130a7fbdea 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -3235,8 +3235,10 @@ static int fts3SegmentMerge( if( rc!=SQLITE_OK ) goto finished; assert( csr.nSegment>0 ); - assert( iNewLevel>=getAbsoluteLevel(p, iLangid, iIndex, 0) ); - assert( iNewLevel=getAbsoluteLevel(p, iLangid, iIndex, 0) ); + assert_fts3_nc( + iNewLevel0!665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 41 72 65 68 65 6e 64 65 72 69 ....reArehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 70 6c 75 70 74 61 74 65 03 05 09 00 ....pluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 0a 98 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-afecd03c862e58.db +}]} {} + +do_execsql_test 20.1 { + BEGIN; + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} + +do_execsql_test 20.2 { + INSERT INTO t1(t1) VALUES('optimize'); +} + + finish_test From b0ea9432a12c01597951967a18e530df1b4bffd1 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 9 Feb 2019 21:06:40 +0000 Subject: [PATCH 229/306] Defer computing the MemPage.nFree value of an in-memory btree page until it is actually needed, since for many pages it is never needed. This checkin works sufficiently to prove the concept, but still has issues with exception handling. FossilOrigin-Name: 1d43ee4000b71f5c6d49244dee96358c567f09ba3451b9d22895a796d3f61ad6 --- manifest | 19 +++-- manifest.uuid | 2 +- src/btree.c | 221 ++++++++++++++++++++++++++++++++----------------- src/btreeInt.h | 2 +- 4 files changed, 159 insertions(+), 85 deletions(-) diff --git a/manifest b/manifest index 01727ffac6..dc017b8c18 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sa\sfew\sassert()\sstatements\sin\sfts3\sthat\smight\sfail\sif\sthe\sdatabase\sis\scorrupt. -D 2019-02-09T19:23:54.418 +C Defer\scomputing\sthe\sMemPage.nFree\svalue\sof\san\sin-memory\sbtree\spage\nuntil\sit\sis\sactually\sneeded,\ssince\sfor\smany\spages\sit\sis\snever\sneeded.\nThis\scheckin\sworks\ssufficiently\sto\sprove\sthe\sconcept,\sbut\sstill\shas\sissues\nwith\sexception\shandling. +D 2019-02-09T21:06:40.308 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,9 +455,9 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 18046bf14f0e3fa294ef3f7c2dc30ca7e95f3ac11ec222ad906e40b150051bde +F src/btree.c b2bb677fa5d2f18b7c38869761e0d7d1d66ff3a7bdac509865e0606b281d32bc F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 -F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 +F src/btreeInt.h d7520b98e72f9a7e2a3140cc476df461fa8a34a3d56258184f8c26f70248cef9 F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -1804,7 +1804,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 1969372ac72d25cc642a0268f4bb0ae4b59f2dca568c119ef61b67183b3a8bd9 -R 337fdf56fb6120be7b5570f5a6b13c97 -U dan -Z 3ee700c86d7982301bd59c67543d08c0 +P db74a56af73d92b7a9d43ceda7e4540915c580c68a0266b4ddefb9e0d5cbcbeb +R 6351a98578ba74f863fbe86b96b0dce9 +T *branch * deferred-free-space +T *sym-deferred-free-space * +T -sym-trunk * +U drh +Z 38c6e8e54a38cca2a22ac1c0553f905f diff --git a/manifest.uuid b/manifest.uuid index 63a146afab..db390c0838 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db74a56af73d92b7a9d43ceda7e4540915c580c68a0266b4ddefb9e0d5cbcbeb \ No newline at end of file +1d43ee4000b71f5c6d49244dee96358c567f09ba3451b9d22895a796d3f61ad6 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index e4086ed0f5..375d891898 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1506,6 +1506,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ data[hdr+7] = 0; defragment_out: + assert( pPage->nFree>=0 ); if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){ return SQLITE_CORRUPT_PAGE(pPage); } @@ -1657,6 +1658,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ testcase( gap+2+nByte==top ); if( gap+2+nByte>top ){ assert( pPage->nCell>0 || CORRUPT_DB ); + assert( pPage->nFree>=0 ); rc = defragmentPage(pPage, MIN(4, pPage->nFree - (2+nByte))); if( rc ) return rc; top = get2byteNotZero(&data[hdr+5]); @@ -1846,21 +1848,14 @@ static int decodeFlags(MemPage *pPage, int flagByte){ } /* -** Initialize the auxiliary information for a disk block. -** -** Return SQLITE_OK on success. If we see that the page does -** not contain a well-formed database page, then return -** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not -** guarantee that the page is well-formed. It only shows that -** we failed to detect any corruption. +** Compute the amount of freespace on the page. In other words, fill +** in the pPage->nFree field. */ -static int btreeInitPage(MemPage *pPage){ +static int btreeComputeFreeSpace(MemPage *pPage){ int pc; /* Address of a freeblock within pPage->aData[] */ u8 hdr; /* Offset to beginning of page header */ u8 *data; /* Equal to pPage->aData */ - BtShared *pBt; /* The main btree structure */ int usableSize; /* Amount of usable space on each page */ - u16 cellOffset; /* Offset from start of page to first cell pointer */ int nFree; /* Number of unused bytes on the page */ int top; /* First byte of the cell content area */ int iCellFirst; /* First allowable cell or freeblock offset */ @@ -1872,71 +1867,18 @@ static int btreeInitPage(MemPage *pPage){ assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); - assert( pPage->isInit==0 ); + assert( pPage->isInit==1 ); + assert( pPage->nFree<0 ); - pBt = pPage->pBt; + usableSize = pPage->pBt->usableSize; hdr = pPage->hdrOffset; data = pPage->aData; - /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating - ** the b-tree page type. */ - if( decodeFlags(pPage, data[hdr]) ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); - pPage->maskPage = (u16)(pBt->pageSize - 1); - pPage->nOverflow = 0; - usableSize = pBt->usableSize; - pPage->cellOffset = cellOffset = hdr + 8 + pPage->childPtrSize; - pPage->aDataEnd = &data[usableSize]; - pPage->aCellIdx = &data[cellOffset]; - pPage->aDataOfst = &data[pPage->childPtrSize]; /* EVIDENCE-OF: R-58015-48175 The two-byte integer at offset 5 designates ** the start of the cell content area. A zero value for this integer is ** interpreted as 65536. */ top = get2byteNotZero(&data[hdr+5]); - /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the - ** number of cells on the page. */ - pPage->nCell = get2byte(&data[hdr+3]); - if( pPage->nCell>MX_CELL(pBt) ){ - /* To many cells for a single page. The page must be corrupt */ - return SQLITE_CORRUPT_PAGE(pPage); - } - testcase( pPage->nCell==MX_CELL(pBt) ); - /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only - ** possible for a root page of a table that contains no rows) then the - ** offset to the cell content area will equal the page size minus the - ** bytes of reserved space. */ - assert( pPage->nCell>0 || top==usableSize || CORRUPT_DB ); - - /* A malformed database page might cause us to read past the end - ** of page when parsing a cell. - ** - ** The following block of code checks early to see if a cell extends - ** past the end of a page boundary and causes SQLITE_CORRUPT to be - ** returned if it does. - */ - iCellFirst = cellOffset + 2*pPage->nCell; + iCellFirst = hdr + 8 + pPage->childPtrSize + 2*pPage->nCell; iCellLast = usableSize - 4; - if( pBt->db->flags & SQLITE_CellSizeCk ){ - int i; /* Index into the cell pointer array */ - int sz; /* Size of a cell */ - - if( !pPage->leaf ) iCellLast--; - for(i=0; inCell; i++){ - pc = get2byteAligned(&data[cellOffset+i*2]); - testcase( pc==iCellFirst ); - testcase( pc==iCellLast ); - if( pciCellLast ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - sz = pPage->xCellSize(pPage, &data[pc]); - testcase( pc+sz==usableSize ); - if( pc+sz>usableSize ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - } - if( !pPage->leaf ) iCellLast++; - } /* Compute the total free space on the page ** EVIDENCE-OF: R-23588-34450 The two-byte integer at offset 1 gives the @@ -1984,6 +1926,98 @@ static int btreeInitPage(MemPage *pPage){ return SQLITE_CORRUPT_PAGE(pPage); } pPage->nFree = (u16)(nFree - iCellFirst); + return SQLITE_OK; +} + +/* +** Initialize the auxiliary information for a disk block. +** +** Return SQLITE_OK on success. If we see that the page does +** not contain a well-formed database page, then return +** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not +** guarantee that the page is well-formed. It only shows that +** we failed to detect any corruption. +*/ +static int btreeInitPage(MemPage *pPage){ + int pc; /* Address of a freeblock within pPage->aData[] */ + u8 hdr; /* Offset to beginning of page header */ + u8 *data; /* Equal to pPage->aData */ + BtShared *pBt; /* The main btree structure */ + int usableSize; /* Amount of usable space on each page */ + u16 cellOffset; /* Offset from start of page to first cell pointer */ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ + + assert( pPage->pBt!=0 ); + assert( pPage->pBt->db!=0 ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); + assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); + assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + assert( pPage->isInit==0 ); + + pBt = pPage->pBt; + hdr = pPage->hdrOffset; + data = pPage->aData; + /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating + ** the b-tree page type. */ + if( decodeFlags(pPage, data[hdr]) ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nOverflow = 0; + usableSize = pBt->usableSize; + pPage->cellOffset = cellOffset = hdr + 8 + pPage->childPtrSize; + pPage->aDataEnd = &data[usableSize]; + pPage->aCellIdx = &data[cellOffset]; + pPage->aDataOfst = &data[pPage->childPtrSize]; + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + pPage->nCell = get2byte(&data[hdr+3]); + if( pPage->nCell>MX_CELL(pBt) ){ + /* To many cells for a single page. The page must be corrupt */ + return SQLITE_CORRUPT_PAGE(pPage); + } + testcase( pPage->nCell==MX_CELL(pBt) ); + /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only + ** possible for a root page of a table that contains no rows) then the + ** offset to the cell content area will equal the page size minus the + ** bytes of reserved space. */ + assert( pPage->nCell>0 + || get2byteNotZero(&data[hdr+5])==usableSize + || CORRUPT_DB ); + + /* A malformed database page might cause us to read past the end + ** of page when parsing a cell. + ** + ** The following block of code checks early to see if a cell extends + ** past the end of a page boundary and causes SQLITE_CORRUPT to be + ** returned if it does. + */ + iCellFirst = cellOffset + 2*pPage->nCell; + iCellLast = usableSize - 4; + if( pBt->db->flags & SQLITE_CellSizeCk ){ + int i; /* Index into the cell pointer array */ + int sz; /* Size of a cell */ + + if( !pPage->leaf ) iCellLast--; + for(i=0; inCell; i++){ + pc = get2byteAligned(&data[cellOffset+i*2]); + testcase( pc==iCellFirst ); + testcase( pc==iCellLast ); + if( pciCellLast ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + sz = pPage->xCellSize(pPage, &data[pc]); + testcase( pc+sz==usableSize ); + if( pc+sz>usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + if( !pPage->leaf ) iCellLast++; + } + pPage->nFree = -1; /* Indicate that this value is yet uncomputed */ pPage->isInit = 1; return SQLITE_OK; } @@ -2127,19 +2161,18 @@ static int getAndInitPage( if( pgno>btreePagecount(pBt) ){ rc = SQLITE_CORRUPT_BKPT; - goto getAndInitPage_error; + goto getAndInitPage_error1; } rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly); if( rc ){ - goto getAndInitPage_error; + goto getAndInitPage_error1; } *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); if( (*ppPage)->isInit==0 ){ btreePageFromDbPage(pDbPage, pgno, pBt); rc = btreeInitPage(*ppPage); if( rc!=SQLITE_OK ){ - releasePage(*ppPage); - goto getAndInitPage_error; + goto getAndInitPage_error2; } } assert( (*ppPage)->pgno==pgno ); @@ -2149,12 +2182,13 @@ static int getAndInitPage( ** compatible with the root page. */ if( pCur && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) ){ rc = SQLITE_CORRUPT_PGNO(pgno); - releasePage(*ppPage); - goto getAndInitPage_error; + goto getAndInitPage_error2; } return SQLITE_OK; -getAndInitPage_error: +getAndInitPage_error2: + releasePage(*ppPage); +getAndInitPage_error1: if( pCur ){ pCur->iPage--; pCur->pPage = pCur->apPage[pCur->iPage]; @@ -6566,6 +6600,7 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ assert( CORRUPT_DB || sz==cellSize(pPage, idx) ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->nFree>=0 ); data = pPage->aData; ptr = &pPage->aCellIdx[2*idx]; pc = get2byte(ptr); @@ -6636,6 +6671,7 @@ static void insertCell( ** might be less than 8 (leaf-size + pointer) on the interior node. Hence ** the term after the || in the following assert(). */ assert( sz==pPage->xCellSize(pPage, pCell) || (sz==8 && iChild>0) ); + assert( pPage->nFree>=0 ); if( pPage->nOverflow || sz+2>pPage->nFree ){ if( pTemp ){ memcpy(pTemp, pCell, sz); @@ -7187,8 +7223,17 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); assert( pPage->nOverflow==1 ); - + if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ + if( pPage->nFree<0 ){ + rc = btreeComputeFreeSpace(pPage); + if( rc ) return rc; + } + if( pParent->nFree<0 ){ + rc = btreeComputeFreeSpace(pParent); + if( rc ) return rc; + } + /* Allocate a new page. This page will become the right-sibling of ** pPage. Make the parent page writable, so that the new divider cell @@ -7466,6 +7511,10 @@ static int balance_nonroot( if( !aOvflSpace ){ return SQLITE_NOMEM_BKPT; } + if( pParent->nFree<0 ){ + rc = btreeComputeFreeSpace(pParent); + if( rc ) return rc; + } /* Find the sibling pages to balance. Also locate the cells in pParent ** that divide the siblings. An attempt is made to find NN siblings on @@ -7501,6 +7550,9 @@ static int balance_nonroot( pgno = get4byte(pRight); while( 1 ){ rc = getAndInitPage(pBt, pgno, &apOld[i], 0, 0); + if( rc==0 && apOld[i]->nFree<0 ){ + rc = btreeComputeFreeSpace(apOld[i]); + } if( rc ){ memset(apOld, 0, (i+1)*sizeof(MemPage*)); goto balance_cleanup; @@ -7704,6 +7756,7 @@ static int balance_nonroot( b.apEnd[k] = pParent->aDataEnd; b.ixNx[k] = cntOld[i]+1; } + assert( p->nFree>=0 ); szNew[i] = usableSpace - p->nFree; for(j=0; jnOverflow; j++){ szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); @@ -8247,6 +8300,10 @@ static int balance(BtCursor *pCur){ int iPage = pCur->iPage; MemPage *pPage = pCur->pPage; + if( pPage->nFree<0 ){ + rc = btreeComputeFreeSpace(pPage); + if( rc ) break; + } if( iPage==0 ){ if( pPage->nOverflow ){ /* The root page of the b-tree is overfull. In this case call the @@ -8621,6 +8678,10 @@ int sqlite3BtreeInsert( pPage = pCur->pPage; assert( pPage->intKey || pX->nKey>=0 ); assert( pPage->leaf || !pPage->intKey ); + if( pPage->nFree<0 ){ + rc = btreeComputeFreeSpace(pPage); + if( rc ) return rc; + } TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, @@ -8771,6 +8832,7 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ iCellIdx = pCur->ix; pPage = pCur->pPage; pCell = findCell(pPage, iCellIdx); + if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ) return SQLITE_CORRUPT; /* If the bPreserve flag is set to true, then the cursor position must ** be preserved following this delete operation. If the current delete @@ -8841,6 +8903,10 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ Pgno n; unsigned char *pTmp; + if( pLeaf->nFree<0 ){ + rc = btreeComputeFreeSpace(pLeaf); + if( rc ) return rc; + } if( iCellDepthiPage-1 ){ n = pCur->apPage[iCellDepth+1]->pgno; }else{ @@ -9732,6 +9798,11 @@ static int checkTreePage( "btreeInitPage() returns error code %d", rc); goto end_of_check; } + if( (rc = btreeComputeFreeSpace(pPage))!=0 ){ + assert( rc==SQLITE_CORRUPT ); + checkAppendMsg(pCheck, "free space corruption", rc); + goto end_of_check; + } data = pPage->aData; hdr = pPage->hdrOffset; diff --git a/src/btreeInt.h b/src/btreeInt.h index ea5e0815a1..1f7a436b3e 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -286,7 +286,7 @@ struct MemPage { u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ u16 cellOffset; /* Index in aData of first cell pointer */ - u16 nFree; /* Number of free bytes on the page */ + int nFree; /* Number of free bytes on the page */ u16 nCell; /* Number of cells on this page, local and ovfl */ u16 maskPage; /* Mask for page offset */ u16 aiOvfl[4]; /* Insert the i-th overflow cell before the aiOvfl-th From 85a379b74b4229f9d6bf54936d2bc71c009929b9 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 9 Feb 2019 22:33:44 +0000 Subject: [PATCH 230/306] Fix a page-cache reference leak in the btree balancer when there is a corrupt database. FossilOrigin-Name: 9285899120dec24ff2944431ad455d7ae217ef408ae2f1a3e7bdfb897099028c --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/btree.c | 10 +++++++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index dc017b8c18..194a8307a0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Defer\scomputing\sthe\sMemPage.nFree\svalue\sof\san\sin-memory\sbtree\spage\nuntil\sit\sis\sactually\sneeded,\ssince\sfor\smany\spages\sit\sis\snever\sneeded.\nThis\scheckin\sworks\ssufficiently\sto\sprove\sthe\sconcept,\sbut\sstill\shas\sissues\nwith\sexception\shandling. -D 2019-02-09T21:06:40.308 +C Fix\sa\spage-cache\sreference\sleak\sin\sthe\sbtree\sbalancer\swhen\sthere\sis\sa\scorrupt\ndatabase. +D 2019-02-09T22:33:44.636 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c b2bb677fa5d2f18b7c38869761e0d7d1d66ff3a7bdac509865e0606b281d32bc +F src/btree.c 0c9455de1fea43ac2d1384383ae0034c59a9b2a60f12b7eeb934ba27abc91f2b F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h d7520b98e72f9a7e2a3140cc476df461fa8a34a3d56258184f8c26f70248cef9 F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 @@ -1804,10 +1804,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 db74a56af73d92b7a9d43ceda7e4540915c580c68a0266b4ddefb9e0d5cbcbeb -R 6351a98578ba74f863fbe86b96b0dce9 -T *branch * deferred-free-space -T *sym-deferred-free-space * -T -sym-trunk * +P 1d43ee4000b71f5c6d49244dee96358c567f09ba3451b9d22895a796d3f61ad6 +R b28deed0efae0448ead27e80a7ddacc4 U drh -Z 38c6e8e54a38cca2a22ac1c0553f905f +Z 26932f3ade712321f925e8e95108ce1e diff --git a/manifest.uuid b/manifest.uuid index db390c0838..a414673e10 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1d43ee4000b71f5c6d49244dee96358c567f09ba3451b9d22895a796d3f61ad6 \ No newline at end of file +9285899120dec24ff2944431ad455d7ae217ef408ae2f1a3e7bdfb897099028c \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 375d891898..1085bcc725 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7550,13 +7550,17 @@ static int balance_nonroot( pgno = get4byte(pRight); while( 1 ){ rc = getAndInitPage(pBt, pgno, &apOld[i], 0, 0); - if( rc==0 && apOld[i]->nFree<0 ){ - rc = btreeComputeFreeSpace(apOld[i]); - } if( rc ){ memset(apOld, 0, (i+1)*sizeof(MemPage*)); goto balance_cleanup; } + if( apOld[i]->nFree<0 ){ + rc = btreeComputeFreeSpace(apOld[i]); + if( rc ){ + memset(apOld, 0, (i)*sizeof(MemPage*)); + goto balance_cleanup; + } + } nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow; if( (i--)==0 ) break; From f0c48b1cd8060b21fcef7c0029703284551d9306 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 11 Feb 2019 01:58:34 +0000 Subject: [PATCH 231/306] Add an assert() in an attempt to repro an ASAN warning from OSSFuzz. FossilOrigin-Name: 7b41222428dcebaae2e9a0e8192e091b6fdee5b1163a5fa14ca1cd4f06354983 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 01727ffac6..90d278147a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sa\sfew\sassert()\sstatements\sin\sfts3\sthat\smight\sfail\sif\sthe\sdatabase\sis\scorrupt. -D 2019-02-09T19:23:54.418 +C Add\san\sassert()\sin\san\sattempt\sto\srepro\san\sASAN\swarning\sfrom\sOSSFuzz. +D 2019-02-11T01:58:34.543 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -458,7 +458,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 18046bf14f0e3fa294ef3f7c2dc30ca7e95f3ac11ec222ad906e40b150051bde F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 -F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 +F src/build.c b0a9ee5b551afbc8357a68eb30693973300daf845c8c0e564f672d9b3fdeec56 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -1804,7 +1804,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 1969372ac72d25cc642a0268f4bb0ae4b59f2dca568c119ef61b67183b3a8bd9 -R 337fdf56fb6120be7b5570f5a6b13c97 -U dan -Z 3ee700c86d7982301bd59c67543d08c0 +P db74a56af73d92b7a9d43ceda7e4540915c580c68a0266b4ddefb9e0d5cbcbeb +R 1fd4b57b62af4e0212956b359519b83a +U drh +Z 5762b97a486210ea28819af0c187d1f7 diff --git a/manifest.uuid b/manifest.uuid index 63a146afab..7ee0c20f92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db74a56af73d92b7a9d43ceda7e4540915c580c68a0266b4ddefb9e0d5cbcbeb \ No newline at end of file +7b41222428dcebaae2e9a0e8192e091b6fdee5b1163a5fa14ca1cd4f06354983 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 3daa677cb8..f7e46d0a95 100644 --- a/src/build.c +++ b/src/build.c @@ -1821,6 +1821,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ pTab->iPKey = -1; }else{ pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); /* ** Remove all redundant columns from the PRIMARY KEY. For example, change From 3fd7eaf3f291044b6a5154f43e7281c9adb592a9 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 11 Feb 2019 11:04:17 +0000 Subject: [PATCH 232/306] Avoid using non-ANSI return statement in void function sqlite3WalSnapshotUnlock(). FossilOrigin-Name: 4a4952d38e8177ed8d59aaa575410bebf76787dd6d801fdbdb809d4f8c670da0 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 90d278147a..2bf966c33b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sassert()\sin\san\sattempt\sto\srepro\san\sASAN\swarning\sfrom\sOSSFuzz. -D 2019-02-11T01:58:34.543 +C Avoid\susing\snon-ANSI\sreturn\sstatement\sin\svoid\sfunction\ssqlite3WalSnapshotUnlock(). +D 2019-02-11T11:04:17.562 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -501,7 +501,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0 F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 857dde3e525f665cfab23b6765bf04ca6638c0759ae7da6d63acfb463e230aa6 +F src/pager.c 38022624ac9fba1f601d3068d7c393fcc909727fccab556242c93d9c7897b640 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee @@ -1804,7 +1804,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 db74a56af73d92b7a9d43ceda7e4540915c580c68a0266b4ddefb9e0d5cbcbeb -R 1fd4b57b62af4e0212956b359519b83a -U drh -Z 5762b97a486210ea28819af0c187d1f7 +P 7b41222428dcebaae2e9a0e8192e091b6fdee5b1163a5fa14ca1cd4f06354983 +R 006638e1709a738a4860cd81e1ea4332 +U dan +Z 99787354b62ab3748e58713095a87013 diff --git a/manifest.uuid b/manifest.uuid index 7ee0c20f92..343ceb6f0f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7b41222428dcebaae2e9a0e8192e091b6fdee5b1163a5fa14ca1cd4f06354983 \ No newline at end of file +4a4952d38e8177ed8d59aaa575410bebf76787dd6d801fdbdb809d4f8c670da0 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index e2a12fbff7..cc4f87a572 100644 --- a/src/pager.c +++ b/src/pager.c @@ -7697,7 +7697,7 @@ int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot){ */ void sqlite3PagerSnapshotUnlock(Pager *pPager){ assert( pPager->pWal ); - return sqlite3WalSnapshotUnlock(pPager->pWal); + sqlite3WalSnapshotUnlock(pPager->pWal); } #endif /* SQLITE_ENABLE_SNAPSHOT */ From 8cd2e4ae0370efc24aad29f6e2581ef650ca17c5 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 11 Feb 2019 11:34:01 +0000 Subject: [PATCH 233/306] Build and test fixes for SQLITE_OMIT_WINDOWFUNC builds. FossilOrigin-Name: 8824115a9776e876a3677f0cb479e311ee65584d43872b37766a146afec72d8f --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/resolve.c | 2 ++ test/altertab2.test | 2 ++ test/altertab3.test | 2 ++ test/autoindex5.test | 3 +++ 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2bf966c33b..8dd32b91c1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\susing\snon-ANSI\sreturn\sstatement\sin\svoid\sfunction\ssqlite3WalSnapshotUnlock(). -D 2019-02-11T11:04:17.562 +C Build\sand\stest\sfixes\sfor\sSQLITE_OMIT_WINDOWFUNC\sbuilds. +D 2019-02-11T11:34:01.543 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -512,7 +512,7 @@ F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 +F src/resolve.c 1588690ee4cc39b4b9ea3230d4e3543d5ec3b5e898c87521f1375af0f1934cd4 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d @@ -622,8 +622,8 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a -F test/altertab2.test 7bedde2e6e71fdecd7a2af64b696cd0b3d3a344f5cf1db6785d9e3b5665193cf -F test/altertab3.test 9dd97ab8161eb6afc0e30e7c61a38336687fbd09e6ddc4c9f1e450cc0b12160b +F test/altertab2.test 5d423a2d1006085b05cc1b788863d5a860ea2da21c4f892d15e2f2a34c78348a +F test/altertab3.test 1df6d9c6d445698a343a243db4a87835b1ebfa220b3708f6c3088af33237f7f7 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -663,7 +663,7 @@ F test/autoindex1.test 96185415f5faacd5b8d7a7f505efddd5abb1f111d58338e9c0b1dc40b F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf -F test/autoindex5.test 4a0eb6c7c7ae456d97a2061d4c8d6380946272c5c91d91507c1feb1af3dc7cce +F test/autoindex5.test 1d8c1134e1488a35c6fa205b2f52e72fc220972d946c59492d10bba01d6fecd4 F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e @@ -1804,7 +1804,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 7b41222428dcebaae2e9a0e8192e091b6fdee5b1163a5fa14ca1cd4f06354983 -R 006638e1709a738a4860cd81e1ea4332 +P 4a4952d38e8177ed8d59aaa575410bebf76787dd6d801fdbdb809d4f8c670da0 +R 4aac589bf9cf7fce5455cfa1c89ecb09 U dan -Z 99787354b62ab3748e58713095a87013 +Z 4bc44ec4d01e27527069f21963ea2977 diff --git a/manifest.uuid b/manifest.uuid index 343ceb6f0f..dfb9457176 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a4952d38e8177ed8d59aaa575410bebf76787dd6d801fdbdb809d4f8c670da0 \ No newline at end of file +8824115a9776e876a3677f0cb479e311ee65584d43872b37766a146afec72d8f \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 86fd543d03..9410bc0202 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1533,6 +1533,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } +#ifndef SQLITE_OMIT_WINDOWFUNC if( IN_RENAME_OBJECT ){ Window *pWin; for(pWin=p->pWinDefn; pWin; pWin=pWin->pNextWin){ @@ -1543,6 +1544,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } } +#endif /* If this is part of a compound SELECT, check that it has the right ** number of expressions in the select list. */ diff --git a/test/altertab2.test b/test/altertab2.test index be55de9ee6..9fa40d0033 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -179,6 +179,7 @@ do_execsql_test 4.3 { } #------------------------------------------------------------------------- +ifcapable windowfunc { do_execsql_test 5.0 { CREATE TABLE t2(a); CREATE TRIGGER r2 AFTER INSERT ON t2 WHEN new.a NOT NULL BEGIN @@ -235,6 +236,7 @@ do_execsql_test 5.2 { do_execsql_test 5.3 { INSERT INTO t2x VALUES(1); } {} +} ;# windowfunc #------------------------------------------------------------------------- diff --git a/test/altertab3.test b/test/altertab3.test index 28c0587780..e849e44261 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -20,6 +20,7 @@ ifcapable !altertable { return } +ifcapable windowfunc { do_execsql_test 1.0 { CREATE TABLE t1(a, b); CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN @@ -40,6 +41,7 @@ do_execsql_test 1.2 { do_execsql_test 1.3 { INSERT INTO t1 VALUES(1, 2); } +} ;# windowfunc #------------------------------------------------------------------------- reset_db diff --git a/test/autoindex5.test b/test/autoindex5.test index 368f2d302c..eabdeae482 100644 --- a/test/autoindex5.test +++ b/test/autoindex5.test @@ -128,6 +128,7 @@ do_execsql_test 2.1 { # Segfault due to multiple uses of the same subquery where the # subquery is implemented via coroutine. # +ifcapable windowfunc { sqlite3 db :memory: do_execsql_test 3.0 { -- This is the original test case reported on the mailing list @@ -166,6 +167,8 @@ do_execsql_test 3.0 { AND (albums.id IN (1, 2))) )); } {1 Ar} +} ;# windowfunc + # The remaining test cases were discovered (by Dan) during trouble-shooting sqlite3 db :memory: do_execsql_test 3.1 { From c01f41cfa63e413767101a0e71f54f888e446ab4 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 11 Feb 2019 12:51:39 +0000 Subject: [PATCH 234/306] Updates to a comment to keep it in alignment to the changes on this branch. FossilOrigin-Name: 7499f74351415e601eb48eff6b6fccd3a78d137f5ea9cd7cac46b904772966de --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 194a8307a0..e02fc96147 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spage-cache\sreference\sleak\sin\sthe\sbtree\sbalancer\swhen\sthere\sis\sa\scorrupt\ndatabase. -D 2019-02-09T22:33:44.636 +C Updates\sto\sa\scomment\sto\skeep\sit\sin\salignment\sto\sthe\schanges\son\sthis\sbranch. +D 2019-02-11T12:51:39.303 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 0c9455de1fea43ac2d1384383ae0034c59a9b2a60f12b7eeb934ba27abc91f2b +F src/btree.c 85d49318710ff322811c6f0664cecab1c9d6646175d34878e8b299e9d169a474 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h d7520b98e72f9a7e2a3140cc476df461fa8a34a3d56258184f8c26f70248cef9 F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 @@ -1804,7 +1804,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 1d43ee4000b71f5c6d49244dee96358c567f09ba3451b9d22895a796d3f61ad6 -R b28deed0efae0448ead27e80a7ddacc4 +P 9285899120dec24ff2944431ad455d7ae217ef408ae2f1a3e7bdfb897099028c +R 53dbac70400c0535df6c7379dea2a735 U drh -Z 26932f3ade712321f925e8e95108ce1e +Z 0c6f69e2cd78e095467b69c3a20fd016 diff --git a/manifest.uuid b/manifest.uuid index a414673e10..603606eaa8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9285899120dec24ff2944431ad455d7ae217ef408ae2f1a3e7bdfb897099028c \ No newline at end of file +7499f74351415e601eb48eff6b6fccd3a78d137f5ea9cd7cac46b904772966de \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 1085bcc725..d3805823ad 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1433,8 +1433,8 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ if( (int)data[hdr+7]<=nMaxFrag ){ int iFree = get2byte(&data[hdr+1]); - /* If the initial freeblock offset were out of bounds, that would - ** have been detected by btreeInitPage() when it was computing the + /* If the initial freeblock offset were out of bounds, that would have + ** been detected by btreeComputeFreeSpace() when it was computing the ** number of free bytes on the page. */ assert( iFree<=usableSize-4 ); if( iFree ){ From 47a30159e5cdce71eb9df166c83eb01ec6c40718 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 11 Feb 2019 13:25:33 +0000 Subject: [PATCH 235/306] Fix typos in comments in fts5.h. No changes to code. FossilOrigin-Name: c19e97bc927074915a3ac8307bf89d30580cf90edd75f4001bcf589b2dfefe58 --- ext/fts5/fts5.h | 4 ++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5.h b/ext/fts5/fts5.h index f0b7d558dd..9d71d3fb89 100644 --- a/ext/fts5/fts5.h +++ b/ext/fts5/fts5.h @@ -162,7 +162,7 @@ struct Fts5PhraseIter { ** Save the pointer passed as the second argument as the extension functions ** "auxiliary data". The pointer may then be retrieved by the current or any ** future invocation of the same fts5 extension function made as part of -** of the same MATCH query using the xGetAuxdata() API. +** the same MATCH query using the xGetAuxdata() API. ** ** Each extension function is allocated a single auxiliary data slot for ** each FTS query (MATCH expression). If the extension function is invoked @@ -177,7 +177,7 @@ struct Fts5PhraseIter { ** The xDelete callback, if one is specified, is also invoked on the ** auxiliary data pointer after the FTS5 query has finished. ** -** If an error (e.g. an OOM condition) occurs within this function, an +** If an error (e.g. an OOM condition) occurs within this function, ** the auxiliary data is set to NULL and an error code returned. If the ** xDelete parameter was not NULL, it is invoked on the auxiliary data ** pointer before returning. diff --git a/manifest b/manifest index 8dd32b91c1..86679b59b6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Build\sand\stest\sfixes\sfor\sSQLITE_OMIT_WINDOWFUNC\sbuilds. -D 2019-02-11T11:34:01.543 +C Fix\stypos\sin\scomments\sin\sfts5.h.\sNo\schanges\sto\scode. +D 2019-02-11T13:25:33.632 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -108,7 +108,7 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 F ext/fts3/unicode/mkunicode.tcl 49499f7964504438e2b04cca0627827945bb2499154e2d3ec216b22d20b969ae F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h fed314270c1a61de3a0e373b11c2f8228b1c76ce59447dd96d0b6fae7d66399b +F ext/fts5/fts5.h 7c9da96f2b9dcfa4dd94081fb2d87ec418d8cdb35b25df56756c334b6b558fd7 F ext/fts5/fts5Int.h 0b002fc71ea705d2c4ec66a63ecd38a2c11127e5b52239b5d71d1dd28309fc19 F ext/fts5/fts5_aux.c afe8c2394cf6de2a48f278442f4f4342365bf99a5983709ef8e6955c2cf4daf9 F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306fb9727046 @@ -1804,7 +1804,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 4a4952d38e8177ed8d59aaa575410bebf76787dd6d801fdbdb809d4f8c670da0 -R 4aac589bf9cf7fce5455cfa1c89ecb09 +P 8824115a9776e876a3677f0cb479e311ee65584d43872b37766a146afec72d8f +R 59e3e019c9cfe20837b7acf6dfa9f2f6 U dan -Z 4bc44ec4d01e27527069f21963ea2977 +Z 4febd88c4488be00b2982567fef37d96 diff --git a/manifest.uuid b/manifest.uuid index dfb9457176..6aa334a522 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8824115a9776e876a3677f0cb479e311ee65584d43872b37766a146afec72d8f \ No newline at end of file +c19e97bc927074915a3ac8307bf89d30580cf90edd75f4001bcf589b2dfefe58 \ No newline at end of file From 43a6e4d3df1a30ddf953cdb438f84f1fab9499bd Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 11 Feb 2019 16:12:09 +0000 Subject: [PATCH 236/306] Fix another segfault that could occur in fts5 with a corrupted database. FossilOrigin-Name: 09e337386beb2008eba969f79601d1b8ed953951ce6e43782586e168140d78d2 --- ext/fts5/fts5_index.c | 7 +- ext/fts5/test/fts5corrupt3.test | 217 ++++++++++++++++++++++++++++++++ manifest | 14 +-- manifest.uuid | 2 +- 4 files changed, 229 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 5ce75bd1e1..741e579d4f 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4169,13 +4169,14 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ /* Set up the new page-index array */ fts5BufferAppendVarint(&p->rc, &buf, 4); if( pSeg->iLeafPgno==pSeg->iTermLeafPgno - && pSeg->iEndofDoclistszLeaf - ){ + && pSeg->iEndofDoclistszLeaf + && pSeg->iPgidxOff<=pData->nn + ){ int nDiff = pData->szLeaf - pSeg->iEndofDoclist; fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); fts5BufferAppendBlob(&p->rc, &buf, pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] - ); + ); } pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index a511efb30c..0ab83cd78f 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -7781,6 +7781,223 @@ do_execsql_test 55.2 { ROLLBACK TO one; } +#------------------------------------------------------------------------- +reset_db +do_test 56.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash-2acc487d09f033.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 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 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 4f 64 6f 63 73 69 7a 65 04 43 52 izet1Odocsize.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 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........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 32 2c 32 2c 33 ,b,prefix=.2,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 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 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 09 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 3b 01 01 06 04 09 19 8c 80 ....of.;........ +| 2640: 80 80 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 ff 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: 80 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 00 f1 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 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 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 14 2a 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 16 00 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 30 00 00 00 11 02 01 .........0...... +| 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 0e 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: 00 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 02 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 00 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 81 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 61 80 80 80 11 03 00 3c 00 00 ......a......<.. +| 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 03 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 14 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 71 .......6.....2tq +| 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 0b 89 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 80 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 f4 01 02 03 01 03 66 .....0eac......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 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 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 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 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 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 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: 05 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 2d .....2th......2- +| 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 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 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 03 ................ +| 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 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end crash-2acc487d09f033.db +}]} {} + +do_catchsql_test 56.1 { + INSERT INTO t1(b) VALUES(randomblob(250)); + INSERT INTO t1(b) VALUES(randomblob(250)); +} {1 {database disk image is malformed}} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 86679b59b6..7576156bda 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stypos\sin\scomments\sin\sfts5.h.\sNo\schanges\sto\scode. -D 2019-02-11T13:25:33.632 +C Fix\sanother\ssegfault\sthat\scould\soccur\sin\sfts5\swith\sa\scorrupted\sdatabase. +D 2019-02-11T16:12:09.807 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -115,7 +115,7 @@ F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306 F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 -F ext/fts5/fts5_index.c ffff7e8d41594256cacf7b32072f8bc06478a86026196a7eb084450065df8d92 +F ext/fts5/fts5_index.c 6589ccacbaa049b714a8ae4ab495dc6876fb4b449b16c3041f71b85f12c75e5f F ext/fts5/fts5_main.c 95d63bbe6075955961e56878c3a8705dc475c2b17f5c767f7b8af14093ae614b F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -156,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 1e57f8124a4db0587a83c23c196ec37d74a5c0de6e0c2b94d6d67f91dcfe2762 +F ext/fts5/test/fts5corrupt3.test f87317faf720259258437cd240cc0b2a7c8620abffd6fe005b54c45d142166f6 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -1804,7 +1804,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 8824115a9776e876a3677f0cb479e311ee65584d43872b37766a146afec72d8f -R 59e3e019c9cfe20837b7acf6dfa9f2f6 +P c19e97bc927074915a3ac8307bf89d30580cf90edd75f4001bcf589b2dfefe58 +R ba860dbc894a4065c86c011d6f21e82a U dan -Z 4febd88c4488be00b2982567fef37d96 +Z 42d44b957f080a8e59025584ead66359 diff --git a/manifest.uuid b/manifest.uuid index 6aa334a522..a02693386d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c19e97bc927074915a3ac8307bf89d30580cf90edd75f4001bcf589b2dfefe58 \ No newline at end of file +09e337386beb2008eba969f79601d1b8ed953951ce6e43782586e168140d78d2 \ No newline at end of file From 6813350966beba60f4ede1a4e25372fae926ca3d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 11 Feb 2019 17:22:30 +0000 Subject: [PATCH 237/306] Fix test cases. Avoid unnecessary tests for MemPage.nFree less than zero. FossilOrigin-Name: 480a5090befdc29eaeb6f0b22831c980d6ee92438d9b2e766de68b037ded38b8 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/btree.c | 19 ++++++------------- test/corrupt2.test | 18 ++++++++---------- test/corruptD.test | 5 +++-- test/corruptK.test | 6 ++++++ 6 files changed, 33 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index e02fc96147..2326789bea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Updates\sto\sa\scomment\sto\skeep\sit\sin\salignment\sto\sthe\schanges\son\sthis\sbranch. -D 2019-02-11T12:51:39.303 +C Fix\stest\scases.\s\sAvoid\sunnecessary\stests\sfor\sMemPage.nFree\sless\sthan\szero. +D 2019-02-11T17:22:30.984 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 85d49318710ff322811c6f0664cecab1c9d6646175d34878e8b299e9d169a474 +F src/btree.c aa182a9b5ac74db26086c8cb004d64de3fba4a5970ca788e324bebb256393479 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h d7520b98e72f9a7e2a3140cc476df461fa8a34a3d56258184f8c26f70248cef9 F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 @@ -738,7 +738,7 @@ F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 -F test/corrupt2.test a7f95356d19a4e8bf9423622ad865cabf48ae49dad40eb7a17a0b39f1cdd6948 +F test/corrupt2.test bb50042cf9a1f1023d73af325d47eb02a6bb11e3c52f8812644b220c5d4bca35 F test/corrupt3.test f95d7bf78109e0b84eb285a787ce91a3fd6a2dd7d0cb55882abff3bdc081a57e F test/corrupt4.test 8d1d86b850fcc43e417450454f2044e52d55778a F test/corrupt5.test 387be3250795e2a86e6234745558b80efb248a357d0cd8e53bce75c7463f545d @@ -749,14 +749,14 @@ F test/corrupt9.test 730a3db08d4ab9aa43392ea30d9c2b4879cbff85 F test/corruptA.test 112f4b2ae0b95ebf3ea63718642fb969a93acea557ace3a307234d19c245989b F test/corruptB.test 73a8d6c0b9833697ecf16b63e3c5c05c945b5dec F test/corruptC.test 138ecb02188ed1a719b533d4a139568204039f72f00e07a8d30d920bd83122db -F test/corruptD.test b3c205fac7952b1de645ce44bb02335cd9e3e040 +F test/corruptD.test 33a37ce3ed56a20093ceee778cd2d7109c7085a59f3213d2baede11d952e8e50 F test/corruptE.test 82ccf4f8f543fdbedd4aa42c709cb077f7374c62 F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 F test/corruptG.test adf79b669cbfd19e28c8191a610d083ae53a6d51 F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 -F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 +F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af F test/corruptL.test 0f64242b83db6d0bd5b6e38c205bf7c2a3bc6c9f80351f49c4dee1639aca60d8 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c @@ -1804,7 +1804,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 9285899120dec24ff2944431ad455d7ae217ef408ae2f1a3e7bdfb897099028c -R 53dbac70400c0535df6c7379dea2a735 +P 7499f74351415e601eb48eff6b6fccd3a78d137f5ea9cd7cac46b904772966de +R 2bddb3922f13e5970175a7d20955a56a U drh -Z 0c6f69e2cd78e095467b69c3a20fd016 +Z e6d6ab91319b683b695ef49a0d7e5092 diff --git a/manifest.uuid b/manifest.uuid index 603606eaa8..f2328d4d70 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7499f74351415e601eb48eff6b6fccd3a78d137f5ea9cd7cac46b904772966de \ No newline at end of file +480a5090befdc29eaeb6f0b22831c980d6ee92438d9b2e766de68b037ded38b8 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index d3805823ad..6ac0a7f134 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7225,15 +7225,8 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ assert( pPage->nOverflow==1 ); if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ - if( pPage->nFree<0 ){ - rc = btreeComputeFreeSpace(pPage); - if( rc ) return rc; - } - if( pParent->nFree<0 ){ - rc = btreeComputeFreeSpace(pParent); - if( rc ) return rc; - } - + assert( pPage->nFree>=0 ); + assert( pParent->nFree>=0 ); /* Allocate a new page. This page will become the right-sibling of ** pPage. Make the parent page writable, so that the new divider cell @@ -7511,10 +7504,7 @@ static int balance_nonroot( if( !aOvflSpace ){ return SQLITE_NOMEM_BKPT; } - if( pParent->nFree<0 ){ - rc = btreeComputeFreeSpace(pParent); - if( rc ) return rc; - } + assert( pParent->nFree>=0 ); /* Find the sibling pages to balance. Also locate the cells in pParent ** that divide the siblings. An attempt is made to find NN siblings on @@ -8336,6 +8326,9 @@ static int balance(BtCursor *pCur){ int const iIdx = pCur->aiIdx[iPage-1]; rc = sqlite3PagerWrite(pParent->pDbPage); + if( rc==SQLITE_OK && pParent->nFree<0 ){ + rc = btreeComputeFreeSpace(pParent); + } if( rc==SQLITE_OK ){ #ifndef SQLITE_OMIT_QUICKBALANCE if( pPage->intKeyLeaf diff --git a/test/corrupt2.test b/test/corrupt2.test index eee7ed322c..f97a526ef5 100644 --- a/test/corrupt2.test +++ b/test/corrupt2.test @@ -95,11 +95,11 @@ do_test corrupt2-1.4 { close $f sqlite3 db2 corrupt.db - catchsql " - $::presql - SELECT * FROM sqlite_master; - " db2 -} {1 {database disk image is malformed}} + # Note: This test is no longer meaningful due to the deferred computation + # of MemPage.nFree + catchsql {PRAGMA quick_check} db2 +} {0 {{*** in database main *** +Page 1: free space corruption}}} do_test corrupt2-1.5 { db2 close @@ -118,11 +118,9 @@ do_test corrupt2-1.5 { close $f sqlite3 db2 corrupt.db - catchsql " - $::presql - SELECT * FROM sqlite_master; - " db2 -} {1 {database disk image is malformed}} + catchsql {PRAGMA quick_check} db2 +} {0 {{*** in database main *** +Page 1: free space corruption}}} db2 close # Corrupt a database by having 2 indices of the same name: diff --git a/test/corruptD.test b/test/corruptD.test index 63474584c3..eb6ccb3fcd 100644 --- a/test/corruptD.test +++ b/test/corruptD.test @@ -111,8 +111,9 @@ proc restore_file {} { do_test corruptD-1.1.1 { incr_change_counter hexio_write test.db [expr 1024+1] FFFF - catchsql { SELECT * FROM t1 ORDER BY rowid } -} {1 {database disk image is malformed}} + catchsql { PRAGMA quick_check } +} {0 {{*** in database main *** +Page 2: free space corruption}}} do_test corruptD-1.1.2 { incr_change_counter hexio_write test.db [expr 1024+1] [hexio_render_int32 1021] diff --git a/test/corruptK.test b/test/corruptK.test index ad5b9a4718..1569afe4a8 100644 --- a/test/corruptK.test +++ b/test/corruptK.test @@ -68,9 +68,15 @@ do_test 1.2 { do_execsql_test 1.3 { INSERT INTO t1 VALUES(randomblob(20)); } + +# This test no longer functions due to the deferred computation of +# MemPage.nFree. +# +if 0 { do_catchsql_test 1.4 { INSERT INTO t1 VALUES(randomblob(90)); } {1 {database disk image is malformed}} +} #------------------------------------------------------------------------- reset_db From d4a6744b501483c7e5bb06660906f9077f0d9835 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 11 Feb 2019 19:27:36 +0000 Subject: [PATCH 238/306] Improvements to comments. No changes to code. FossilOrigin-Name: 16eb0fc8f8cce51eaa5305ebc9f3bd8c8d935dd3ebebab6820e5629f9292eec2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2326789bea..1cfcf11052 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stest\scases.\s\sAvoid\sunnecessary\stests\sfor\sMemPage.nFree\sless\sthan\szero. -D 2019-02-11T17:22:30.984 +C Improvements\sto\scomments.\s\sNo\schanges\sto\scode. +D 2019-02-11T19:27:36.989 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c aa182a9b5ac74db26086c8cb004d64de3fba4a5970ca788e324bebb256393479 +F src/btree.c 47812e0c85425f27c6c51c26a43f04f3adc182ec7ead668329d4f1b1105f43ff F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h d7520b98e72f9a7e2a3140cc476df461fa8a34a3d56258184f8c26f70248cef9 F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 @@ -1804,7 +1804,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 7499f74351415e601eb48eff6b6fccd3a78d137f5ea9cd7cac46b904772966de -R 2bddb3922f13e5970175a7d20955a56a +P 480a5090befdc29eaeb6f0b22831c980d6ee92438d9b2e766de68b037ded38b8 +R f2a2d10c39d9bff959dca395bf0124e2 U drh -Z e6d6ab91319b683b695ef49a0d7e5092 +Z eb3347596121c04ba47ec98ac52bc64e diff --git a/manifest.uuid b/manifest.uuid index f2328d4d70..5c2ee95672 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -480a5090befdc29eaeb6f0b22831c980d6ee92438d9b2e766de68b037ded38b8 \ No newline at end of file +16eb0fc8f8cce51eaa5305ebc9f3bd8c8d935dd3ebebab6820e5629f9292eec2 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 6ac0a7f134..9d76c21a51 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1634,9 +1634,9 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ } } - /* If there is enough space between gap and top for one more cell pointer - ** array entry offset, and if the freelist is not empty, then search the - ** freelist looking for a free slot big enough to satisfy the request. + /* If there is enough space between gap and top for one more cell pointer, + ** and if the freelist is not empty, then search the + ** freelist looking for a slot big enough to satisfy the request. */ testcase( gap+2==top ); testcase( gap+1==top ); From 8357c662b3b0110b7ba0eda82d9fbb787dd20b03 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 11 Feb 2019 22:50:01 +0000 Subject: [PATCH 239/306] Do not invoke btreeComputeFreeSpace() when not necessary. FossilOrigin-Name: f11b0ed47402034378ded2c60b82841b81cd1319cdb72d1ef052faef29a5294d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 6 ++---- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 1cfcf11052..1a0efad9ac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\scomments.\s\sNo\schanges\sto\scode. -D 2019-02-11T19:27:36.989 +C Do\snot\sinvoke\sbtreeComputeFreeSpace()\swhen\snot\snecessary. +D 2019-02-11T22:50:01.937 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 47812e0c85425f27c6c51c26a43f04f3adc182ec7ead668329d4f1b1105f43ff +F src/btree.c 70ac9dc86196416147baa94969c71372d1e3dacaca54602bda9c516b02f6da82 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h d7520b98e72f9a7e2a3140cc476df461fa8a34a3d56258184f8c26f70248cef9 F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 @@ -1804,7 +1804,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 480a5090befdc29eaeb6f0b22831c980d6ee92438d9b2e766de68b037ded38b8 -R f2a2d10c39d9bff959dca395bf0124e2 +P 16eb0fc8f8cce51eaa5305ebc9f3bd8c8d935dd3ebebab6820e5629f9292eec2 +R 42eb74538b26ea8a320f8b836f86ea2e U drh -Z eb3347596121c04ba47ec98ac52bc64e +Z 326f7ed87f29a92b24fc21835b66ed1d diff --git a/manifest.uuid b/manifest.uuid index 5c2ee95672..3f6605229b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -16eb0fc8f8cce51eaa5305ebc9f3bd8c8d935dd3ebebab6820e5629f9292eec2 \ No newline at end of file +f11b0ed47402034378ded2c60b82841b81cd1319cdb72d1ef052faef29a5294d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 9d76c21a51..43d6d161a9 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7396,6 +7396,7 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ */ pTo->isInit = 0; rc = btreeInitPage(pTo); + if( rc==SQLITE_OK ) rc = btreeComputeFreeSpace(pTo); if( rc!=SQLITE_OK ){ *pRC = rc; return; @@ -8294,10 +8295,7 @@ static int balance(BtCursor *pCur){ int iPage = pCur->iPage; MemPage *pPage = pCur->pPage; - if( pPage->nFree<0 ){ - rc = btreeComputeFreeSpace(pPage); - if( rc ) break; - } + assert( pPage->nFree>=0 ); if( iPage==0 ){ if( pPage->nOverflow ){ /* The root page of the b-tree is overfull. In this case call the From a941ff712d465fe9eb6b7cf6fa7cf8264898dc7b Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Feb 2019 00:58:10 +0000 Subject: [PATCH 240/306] Change an assert() into a NEVER(), since the condition is difficult to prove with certainty. Improved comment on the MemPage.nFree field. FossilOrigin-Name: fec071b89df2cbafda365077bb54bc9999e12086f36d6cea8d125662b36638dc --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- src/btreeInt.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 1a0efad9ac..cbed7e3fde 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sinvoke\sbtreeComputeFreeSpace()\swhen\snot\snecessary. -D 2019-02-11T22:50:01.937 +C Change\san\sassert()\sinto\sa\sNEVER(),\ssince\sthe\scondition\sis\sdifficult\sto\sprove\nwith\scertainty.\s\sImproved\scomment\son\sthe\sMemPage.nFree\sfield. +D 2019-02-12T00:58:10.125 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,9 +455,9 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 70ac9dc86196416147baa94969c71372d1e3dacaca54602bda9c516b02f6da82 +F src/btree.c 7457f7813873877041ec7e04d76a041c81831704a73419882fbe1c222ce6a68c F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 -F src/btreeInt.h d7520b98e72f9a7e2a3140cc476df461fa8a34a3d56258184f8c26f70248cef9 +F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -1804,7 +1804,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 16eb0fc8f8cce51eaa5305ebc9f3bd8c8d935dd3ebebab6820e5629f9292eec2 -R 42eb74538b26ea8a320f8b836f86ea2e +P f11b0ed47402034378ded2c60b82841b81cd1319cdb72d1ef052faef29a5294d +R b9fd86c9b0e983ebe73f0426098d02c6 U drh -Z 326f7ed87f29a92b24fc21835b66ed1d +Z 3b166eeca4670760101eb14216736649 diff --git a/manifest.uuid b/manifest.uuid index 3f6605229b..de8af99627 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f11b0ed47402034378ded2c60b82841b81cd1319cdb72d1ef052faef29a5294d \ No newline at end of file +fec071b89df2cbafda365077bb54bc9999e12086f36d6cea8d125662b36638dc \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 43d6d161a9..4cbad04e4e 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8295,7 +8295,7 @@ static int balance(BtCursor *pCur){ int iPage = pCur->iPage; MemPage *pPage = pCur->pPage; - assert( pPage->nFree>=0 ); + if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; if( iPage==0 ){ if( pPage->nOverflow ){ /* The root page of the b-tree is overfull. In this case call the diff --git a/src/btreeInt.h b/src/btreeInt.h index 1f7a436b3e..ddd374efc9 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -286,7 +286,7 @@ struct MemPage { u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ u16 cellOffset; /* Index in aData of first cell pointer */ - int nFree; /* Number of free bytes on the page */ + int nFree; /* Number of free bytes on the page. -1 for unknown */ u16 nCell; /* Number of cells on this page, local and ovfl */ u16 maskPage; /* Mask for page offset */ u16 aiOvfl[4]; /* Insert the i-th overflow cell before the aiOvfl-th From 62e009f3d89c837d83a366215332f0a0d04bfd04 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Feb 2019 01:28:24 +0000 Subject: [PATCH 241/306] New test cases in test/fuzzdata8.db. FossilOrigin-Name: ab2356f580384e4b40d128fc04fd6bc4dfcf50109df77d05d59adcc20f339066 --- manifest | 13 ++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 960512 -> 975872 bytes 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e7da767f39..c595bda6aa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Defer\scomputing\sthe\snumber\sof\sbytes\sof\sfree\sspace\son\sa\sbtree\spage\suntil\sthat\nvalue\sis\sactually\sneeded. -D 2019-02-12T01:04:49.403 +C New\stest\scases\sin\stest/fuzzdata8.db. +D 2019-02-12T01:28:24.338 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 3f7c67741ba91c13955609700a44608d2dfe4f037e508f77d236ea9abb431a02 +F test/fuzzdata8.db 19fcda3a879b840f8ff139701b116098be40c28c4fe1366e1fc813fb7afa7eea F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,8 +1804,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 09e337386beb2008eba969f79601d1b8ed953951ce6e43782586e168140d78d2 fec071b89df2cbafda365077bb54bc9999e12086f36d6cea8d125662b36638dc -R 49e3547600599943d74a3169c60af8d6 -T +closed fec071b89df2cbafda365077bb54bc9999e12086f36d6cea8d125662b36638dc +P 177f5f40eabfcfd229ac7f291dfed9e9ee35762e86923a0f356915f389da177d +R 2d60be7dcbefd8d4a6b47ae377c56c93 U drh -Z 7aab7a7f295f8d3f5fcc30e3cc343e77 +Z 534fc52f9a0359d5cf02e80291c038a3 diff --git a/manifest.uuid b/manifest.uuid index 1f83fd7926..352a7d1465 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -177f5f40eabfcfd229ac7f291dfed9e9ee35762e86923a0f356915f389da177d \ No newline at end of file +ab2356f580384e4b40d128fc04fd6bc4dfcf50109df77d05d59adcc20f339066 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 4e9ccbf0d4b5117ff5d9b4201727bbfd4b266c2c..dfaf1cb468b36980aa7f591d7fada5907b3724f2 100644 GIT binary patch delta 12548 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 XsE)jMttZzUe=fhwZDqY`_s{%4kDryq delta 11705 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 pFQHVkcULdWgFwP1A4yeI=Jd)CWKOT9u>C$ Date: Tue, 12 Feb 2019 12:25:34 +0000 Subject: [PATCH 242/306] Register the "vfsstat" virtual table immediately when loading the vfsstat.c extension. FossilOrigin-Name: 9bd92afd0cb0a958441e861c7006b77027125b1ceea0868958ec948b6b3c7bc9 --- ext/misc/vfsstat.c | 9 ++++++--- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/ext/misc/vfsstat.c b/ext/misc/vfsstat.c index 14753d277d..7b5102a5a1 100644 --- a/ext/misc/vfsstat.c +++ b/ext/misc/vfsstat.c @@ -783,8 +783,8 @@ static sqlite3_module VfsStatModule = { */ static int vstatRegister( sqlite3 *db, - const char **pzErrMsg, - const struct sqlite3_api_routines *pThunk + char **pzErrMsg, + const sqlite3_api_routines *pThunk ){ return sqlite3_create_module(db, "vfsstat", &VfsStatModule, 0); } @@ -809,7 +809,10 @@ int sqlite3_vfsstat_init( vstat_vfs.base.szOsFile = sizeof(VStatFile) + vstat_vfs.pVfs->szOsFile; rc = sqlite3_vfs_register(&vstat_vfs.base, 1); if( rc==SQLITE_OK ){ - rc = sqlite3_auto_extension(vstatRegister); + rc = vstatRegister(db, pzErrMsg, pApi); + if( rc==SQLITE_OK ){ + rc = sqlite3_auto_extension(vstatRegister); + } } if( rc==SQLITE_OK ) rc = SQLITE_OK_LOAD_PERMANENTLY; return rc; diff --git a/manifest b/manifest index c595bda6aa..5216caf011 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sin\stest/fuzzdata8.db. -D 2019-02-12T01:28:24.338 +C Register\sthe\s"vfsstat"\svirtual\stable\simmediately\swhen\sloading\sthe\svfsstat.c\nextension. +D 2019-02-12T12:25:34.464 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -312,7 +312,7 @@ F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf3 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 F ext/misc/unionvtab.c 34ee634d09670909563dbde59c5bfb2ac048b27051f65f1aeac918b061d646d8 F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 -F ext/misc/vfsstat.c bf10ef0bc51e1ad6756629e1edb142f7a8db1178 +F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057b1cdb F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 @@ -1804,7 +1804,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 177f5f40eabfcfd229ac7f291dfed9e9ee35762e86923a0f356915f389da177d -R 2d60be7dcbefd8d4a6b47ae377c56c93 +P ab2356f580384e4b40d128fc04fd6bc4dfcf50109df77d05d59adcc20f339066 +R 7eb957d7cfbe3386d7aef59ec17a4212 U drh -Z 534fc52f9a0359d5cf02e80291c038a3 +Z 2d3d347cdf155951a74054dc105976d7 diff --git a/manifest.uuid b/manifest.uuid index 352a7d1465..8f2783e406 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ab2356f580384e4b40d128fc04fd6bc4dfcf50109df77d05d59adcc20f339066 \ No newline at end of file +9bd92afd0cb0a958441e861c7006b77027125b1ceea0868958ec948b6b3c7bc9 \ No newline at end of file From 83acc14ad4d03c8956a3d46f1ad555a30d092fed Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Feb 2019 15:51:36 +0000 Subject: [PATCH 243/306] Increase the version number to 3.28.0 for the next release cycle. FossilOrigin-Name: 6eb38c59a81d27b7c1f3edad84b27a1114df6f1607282b2be1b5de9c7decc512 --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/VERSION b/VERSION index 8c53120442..a72fd67b60 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.27.0 +3.28.0 diff --git a/configure b/configure index c711d432ed..2585741850 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.27.0. +# Generated by GNU Autoconf 2.69 for sqlite 3.28.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.27.0' -PACKAGE_STRING='sqlite 3.27.0' +PACKAGE_VERSION='3.28.0' +PACKAGE_STRING='sqlite 3.28.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1466,7 +1466,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.27.0 to adapt to many kinds of systems. +\`configure' configures sqlite 3.28.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1531,7 +1531,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.27.0:";; + short | recursive ) echo "Configuration of sqlite 3.28.0:";; esac cat <<\_ACEOF @@ -1657,7 +1657,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.27.0 +sqlite configure 3.28.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2076,7 +2076,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.27.0, which was +It was created by sqlite $as_me 3.28.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12232,7 +12232,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.27.0, which was +This file was extended by sqlite $as_me 3.28.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12298,7 +12298,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.27.0 +sqlite config.status 3.28.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index 5216caf011..54adae474f 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C Register\sthe\s"vfsstat"\svirtual\stable\simmediately\swhen\sloading\sthe\svfsstat.c\nextension. -D 2019-02-12T12:25:34.464 +C Increase\sthe\sversion\snumber\sto\s3.28.0\sfor\sthe\snext\srelease\scycle. +D 2019-02-12T15:51:36.707 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee -F VERSION 453e2f4529ca208196d5567db28d549d7151f79efd33f6e6cfe6e613e583a0be +F VERSION 288d756b1b7be03ecdbf1795c23af2c8425f2e46ba6979a14ef53360308f080d F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -33,7 +33,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure e2b4021dcb8ee6f9a91e7f4011316957868e8065019ac994f68e27363120c272 x +F configure 90ed1536586c23327fe452ce67ebd6e98590e09adc6e3c57005b59c59b9b8796 x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -1804,7 +1804,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 ab2356f580384e4b40d128fc04fd6bc4dfcf50109df77d05d59adcc20f339066 -R 7eb957d7cfbe3386d7aef59ec17a4212 +P 9bd92afd0cb0a958441e861c7006b77027125b1ceea0868958ec948b6b3c7bc9 +R f84ea4fd0e9bef4a6942eebd8ef1803d U drh -Z 2d3d347cdf155951a74054dc105976d7 +Z 98b1f2d1faa7ac033f04d7996aa601e5 diff --git a/manifest.uuid b/manifest.uuid index 8f2783e406..0d1cd90740 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9bd92afd0cb0a958441e861c7006b77027125b1ceea0868958ec948b6b3c7bc9 \ No newline at end of file +6eb38c59a81d27b7c1f3edad84b27a1114df6f1607282b2be1b5de9c7decc512 \ No newline at end of file From 5860a61d59e78da7d3bb24346c4791343568a5c6 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Feb 2019 16:58:26 +0000 Subject: [PATCH 244/306] Further performance improvements to btreeInitPage(). FossilOrigin-Name: 93ae382e97c23c90312739481e47ef7f9bc475a8382c063a2de2986c950c0aec --- manifest | 12 +++--- manifest.uuid | 2 +- src/btree.c | 105 +++++++++++++++++++++++++------------------------- 3 files changed, 60 insertions(+), 59 deletions(-) diff --git a/manifest b/manifest index 54adae474f..a6491a6926 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Increase\sthe\sversion\snumber\sto\s3.28.0\sfor\sthe\snext\srelease\scycle. -D 2019-02-12T15:51:36.707 +C Further\sperformance\simprovements\sto\sbtreeInitPage(). +D 2019-02-12T16:58:26.325 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 7457f7813873877041ec7e04d76a041c81831704a73419882fbe1c222ce6a68c +F src/btree.c 1336cc1670ec9ab93c097ae0c087480f501fd9c7157be0457b2b04e67a06a377 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c b0a9ee5b551afbc8357a68eb30693973300daf845c8c0e564f672d9b3fdeec56 @@ -1804,7 +1804,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 9bd92afd0cb0a958441e861c7006b77027125b1ceea0868958ec948b6b3c7bc9 -R f84ea4fd0e9bef4a6942eebd8ef1803d +P 6eb38c59a81d27b7c1f3edad84b27a1114df6f1607282b2be1b5de9c7decc512 +R cc90c00a72cee7c141819cd12b6430c9 U drh -Z 98b1f2d1faa7ac033f04d7996aa601e5 +Z ba80ee88206970e9c79aaddf47903f84 diff --git a/manifest.uuid b/manifest.uuid index 0d1cd90740..ed488bb4f5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6eb38c59a81d27b7c1f3edad84b27a1114df6f1607282b2be1b5de9c7decc512 \ No newline at end of file +93ae382e97c23c90312739481e47ef7f9bc475a8382c063a2de2986c950c0aec \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 4cbad04e4e..fbfc67a796 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1667,7 +1667,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ /* Allocate memory from the gap in between the cell pointer array - ** and the cell content area. The btreeInitPage() call has already + ** and the cell content area. The btreeComputeFreeSpace() call has already ** validated the freelist. Given that the freelist is valid, there ** is no way that the allocation can extend off the end of the page. ** The assert() below verifies the previous sentence. @@ -1686,7 +1686,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** ** Adjacent freeblocks are coalesced. ** -** Note that even though the freeblock list was checked by btreeInitPage(), +** Even though the freeblock list was checked by btreeComputeFreeSpace(), ** that routine will not detect overlap between cells or freeblocks. Nor ** does it detect cells or freeblocks that encrouch into the reserved bytes ** at the end of the page. So do additional corruption checks inside this @@ -1929,6 +1929,42 @@ static int btreeComputeFreeSpace(MemPage *pPage){ return SQLITE_OK; } +/* +** Do additional sanity check after btreeInitPage() if +** PRAGMA cell_size_check=ON +*/ +static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ + int i; /* Index into the cell pointer array */ + int sz; /* Size of a cell */ + int pc; /* Address of a freeblock within pPage->aData[] */ + u8 *data; /* Equal to pPage->aData */ + int usableSize; /* Maximum usable space on the page */ + int cellOffset; /* Start of cell content area */ + + iCellFirst = pPage->cellOffset + 2*pPage->nCell; + usableSize = pPage->pBt->usableSize; + iCellLast = usableSize - 4; + data = pPage->aData; + cellOffset = pPage->cellOffset; + if( !pPage->leaf ) iCellLast--; + for(i=0; inCell; i++){ + pc = get2byteAligned(&data[cellOffset+i*2]); + testcase( pc==iCellFirst ); + testcase( pc==iCellLast ); + if( pciCellLast ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + sz = pPage->xCellSize(pPage, &data[pc]); + testcase( pc+sz==usableSize ); + if( pc+sz>usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + return SQLITE_OK; +} + /* ** Initialize the auxiliary information for a disk block. ** @@ -1939,14 +1975,8 @@ static int btreeComputeFreeSpace(MemPage *pPage){ ** we failed to detect any corruption. */ static int btreeInitPage(MemPage *pPage){ - int pc; /* Address of a freeblock within pPage->aData[] */ - u8 hdr; /* Offset to beginning of page header */ u8 *data; /* Equal to pPage->aData */ BtShared *pBt; /* The main btree structure */ - int usableSize; /* Amount of usable space on each page */ - u16 cellOffset; /* Offset from start of page to first cell pointer */ - int iCellFirst; /* First allowable cell or freeblock offset */ - int iCellLast; /* Last possible cell or freeblock offset */ assert( pPage->pBt!=0 ); assert( pPage->pBt->db!=0 ); @@ -1957,24 +1987,22 @@ static int btreeInitPage(MemPage *pPage){ assert( pPage->isInit==0 ); pBt = pPage->pBt; - hdr = pPage->hdrOffset; - data = pPage->aData; + data = pPage->aData + pPage->hdrOffset; /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating ** the b-tree page type. */ - if( decodeFlags(pPage, data[hdr]) ){ + if( decodeFlags(pPage, data[0]) ){ return SQLITE_CORRUPT_PAGE(pPage); } assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); pPage->maskPage = (u16)(pBt->pageSize - 1); pPage->nOverflow = 0; - usableSize = pBt->usableSize; - pPage->cellOffset = cellOffset = hdr + 8 + pPage->childPtrSize; - pPage->aDataEnd = &data[usableSize]; - pPage->aCellIdx = &data[cellOffset]; - pPage->aDataOfst = &data[pPage->childPtrSize]; + pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize; + pPage->aCellIdx = data + pPage->childPtrSize + 8; + pPage->aDataEnd = pPage->aData + pBt->usableSize; + pPage->aDataOfst = pPage->aData + pPage->childPtrSize; /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the ** number of cells on the page. */ - pPage->nCell = get2byte(&data[hdr+3]); + pPage->nCell = get2byte(&data[3]); if( pPage->nCell>MX_CELL(pBt) ){ /* To many cells for a single page. The page must be corrupt */ return SQLITE_CORRUPT_PAGE(pPage); @@ -1985,40 +2013,13 @@ static int btreeInitPage(MemPage *pPage){ ** offset to the cell content area will equal the page size minus the ** bytes of reserved space. */ assert( pPage->nCell>0 - || get2byteNotZero(&data[hdr+5])==usableSize + || get2byteNotZero(&data[5])==pBt->usableSize || CORRUPT_DB ); - - /* A malformed database page might cause us to read past the end - ** of page when parsing a cell. - ** - ** The following block of code checks early to see if a cell extends - ** past the end of a page boundary and causes SQLITE_CORRUPT to be - ** returned if it does. - */ - iCellFirst = cellOffset + 2*pPage->nCell; - iCellLast = usableSize - 4; - if( pBt->db->flags & SQLITE_CellSizeCk ){ - int i; /* Index into the cell pointer array */ - int sz; /* Size of a cell */ - - if( !pPage->leaf ) iCellLast--; - for(i=0; inCell; i++){ - pc = get2byteAligned(&data[cellOffset+i*2]); - testcase( pc==iCellFirst ); - testcase( pc==iCellLast ); - if( pciCellLast ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - sz = pPage->xCellSize(pPage, &data[pc]); - testcase( pc+sz==usableSize ); - if( pc+sz>usableSize ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - } - if( !pPage->leaf ) iCellLast++; - } pPage->nFree = -1; /* Indicate that this value is yet uncomputed */ pPage->isInit = 1; + if( pBt->db->flags & SQLITE_CellSizeCk ){ + return btreeCellSizeCheck(pPage); + } return SQLITE_OK; } @@ -9930,9 +9931,9 @@ static int checkTreePage( i = get2byte(&data[hdr+1]); while( i>0 ){ int size, j; - assert( (u32)i<=usableSize-4 ); /* Enforced by btreeInitPage() */ + assert( (u32)i<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ size = get2byte(&data[i+2]); - assert( (u32)(i+size)<=usableSize ); /* Enforced by btreeInitPage() */ + assert( (u32)(i+size)<=usableSize ); /* due to btreeComputeFreeSpace() */ btreeHeapInsert(heap, (((u32)i)<<16)|(i+size-1)); /* EVIDENCE-OF: R-58208-19414 The first 2 bytes of a freeblock are a ** big-endian integer which is the offset in the b-tree page of the next @@ -9941,8 +9942,8 @@ static int checkTreePage( j = get2byte(&data[i]); /* EVIDENCE-OF: R-06866-39125 Freeblocks are always connected in order of ** increasing offset. */ - assert( j==0 || j>i+size ); /* Enforced by btreeInitPage() */ - assert( (u32)j<=usableSize-4 ); /* Enforced by btreeInitPage() */ + assert( j==0 || j>i+size ); /* Enforced by btreeComputeFreeSpace() */ + assert( (u32)j<=usableSize-4 ); /* Enforced by btreeComputeFreeSpace() */ i = j; } /* Analyze the min-heap looking for overlap between cells and/or From c332e04310c111eeb3354900e3001b6760279980 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Feb 2019 21:04:33 +0000 Subject: [PATCH 245/306] Enhancement the progress callback mechanism so that the progress callback is always invoked at least once at the end of a prepared statement if the opcode count has been exceeded. This makes the progress callback more effective at limiting run times. This check-in also includes and unrelated performance enhancement to OP_Column. FossilOrigin-Name: 68cce272e7f7cbc0c319ee8b7ff674d652cb1e95e903d99d848c41dff2b5d304 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 29 +++++++++++++---------------- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index a6491a6926..5c73685344 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\sperformance\simprovements\sto\sbtreeInitPage(). -D 2019-02-12T16:58:26.325 +C Enhancement\sthe\sprogress\scallback\smechanism\sso\sthat\sthe\sprogress\scallback\nis\salways\sinvoked\sat\sleast\sonce\sat\sthe\send\sof\sa\sprepared\sstatement\sif\sthe\s\nopcode\scount\shas\sbeen\sexceeded.\s\sThis\smakes\sthe\sprogress\scallback\smore\neffective\sat\slimiting\srun\stimes.\s\sThis\scheck-in\salso\sincludes\sand\sunrelated\nperformance\senhancement\sto\sOP_Column. +D 2019-02-12T21:04:33.203 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -585,7 +585,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c b7b6f965153607072917dbd81d654a268abf4872c58d556701d1549550766c02 +F src/vdbe.c f72cc550d2c63f6d98f00991e6ed18b25232d5b216c059db52aeb73002c8202b F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1804,7 +1804,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 6eb38c59a81d27b7c1f3edad84b27a1114df6f1607282b2be1b5de9c7decc512 -R cc90c00a72cee7c141819cd12b6430c9 +P 93ae382e97c23c90312739481e47ef7f9bc475a8382c063a2de2986c950c0aec +R 5a73d1580b6ec582f25521606ec44ea5 U drh -Z ba80ee88206970e9c79aaddf47903f84 +Z 5e5592ea1699abe7b2bf0590d6631ed0 diff --git a/manifest.uuid b/manifest.uuid index ed488bb4f5..7ef8d1855e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -93ae382e97c23c90312739481e47ef7f9bc475a8382c063a2de2986c950c0aec \ No newline at end of file +68cce272e7f7cbc0c319ee8b7ff674d652cb1e95e903d99d848c41dff2b5d304 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 98df0a3977..7ade29cb78 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -823,6 +823,7 @@ check_for_interrupt: assert( db->nProgressOps!=0 ); nProgressLimit = nVmStep + db->nProgressOps - (nVmStep%db->nProgressOps); if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = 0xffffffff; rc = SQLITE_INTERRUPT; goto abort_due_to_error; } @@ -1368,18 +1369,6 @@ case OP_ResultRow: { assert( pOp->p1>0 ); assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - /* Run the progress counter just before returning. - */ - if( db->xProgress!=0 - && nVmStep>=nProgressLimit - && db->xProgress(db->pProgressArg)!=0 - ){ - rc = SQLITE_INTERRUPT; - goto abort_due_to_error; - } -#endif - /* If this statement has violated immediate foreign key constraints, do ** not return the number of rows modified. And do not RELEASE the statement ** transaction. It needs to be rolled back. */ @@ -2606,15 +2595,15 @@ case OP_Column: { zEndHdr = zData + aOffset[0]; testcase( zHdr>=zEndHdr ); do{ - if( (t = zHdr[0])<0x80 ){ + if( (pC->aType[i] = t = zHdr[0])<0x80 ){ zHdr++; offset64 += sqlite3VdbeOneByteSerialTypeLen(t); }else{ zHdr += sqlite3GetVarint32(zHdr, &t); + pC->aType[i] = t; offset64 += sqlite3VdbeSerialTypeLen(t); } - pC->aType[i++] = t; - aOffset[i] = (u32)(offset64 & 0xffffffff); + aOffset[++i] = (u32)(offset64 & 0xffffffff); }while( i<=p2 && zHdr0 ); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + if( db->xProgress(db->pProgressArg) ){ + nProgressLimit = 0xffffffff; + rc = SQLITE_INTERRUPT; + goto abort_due_to_error; + } + } +#endif p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; sqlite3VdbeLeave(p); assert( rc!=SQLITE_OK || nExtraDelete==0 From 82642f815bc9f31af3403fbbdf94d6f8d9ab3615 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Feb 2019 22:58:32 +0000 Subject: [PATCH 246/306] Ensure that the nProgressLimit variable is always initialized in sqlite3VdbeExec(), even if the routine jumps to its exit processing early. FossilOrigin-Name: 167b91df77fff1a84791f6ab5f72239b90475475be690a838248119b6dd312f0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 18 +++++++++--------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 5c73685344..c48ba75e83 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancement\sthe\sprogress\scallback\smechanism\sso\sthat\sthe\sprogress\scallback\nis\salways\sinvoked\sat\sleast\sonce\sat\sthe\send\sof\sa\sprepared\sstatement\sif\sthe\s\nopcode\scount\shas\sbeen\sexceeded.\s\sThis\smakes\sthe\sprogress\scallback\smore\neffective\sat\slimiting\srun\stimes.\s\sThis\scheck-in\salso\sincludes\sand\sunrelated\nperformance\senhancement\sto\sOP_Column. -D 2019-02-12T21:04:33.203 +C Ensure\sthat\sthe\snProgressLimit\svariable\sis\salways\sinitialized\sin\nsqlite3VdbeExec(),\seven\sif\sthe\sroutine\sjumps\sto\sits\sexit\sprocessing\searly. +D 2019-02-12T22:58:32.377 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -585,7 +585,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c f72cc550d2c63f6d98f00991e6ed18b25232d5b216c059db52aeb73002c8202b +F src/vdbe.c c67c8c46bea825421ee97511328fe1405537b586cbbe4db06e17c4ac5ab4dbed F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1804,7 +1804,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 93ae382e97c23c90312739481e47ef7f9bc475a8382c063a2de2986c950c0aec -R 5a73d1580b6ec582f25521606ec44ea5 +P 68cce272e7f7cbc0c319ee8b7ff674d652cb1e95e903d99d848c41dff2b5d304 +R 1dd11fa4b345d5a202cdf255a23d5245 U drh -Z 5e5592ea1699abe7b2bf0590d6631ed0 +Z 5c1fab9a93beb29aa193da2ce5906eed diff --git a/manifest.uuid b/manifest.uuid index 7ef8d1855e..90a8aea4e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -68cce272e7f7cbc0c319ee8b7ff674d652cb1e95e903d99d848c41dff2b5d304 \ No newline at end of file +167b91df77fff1a84791f6ab5f72239b90475475be690a838248119b6dd312f0 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 7ade29cb78..880d16adfe 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -622,6 +622,15 @@ int sqlite3VdbeExec( assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */ sqlite3VdbeEnter(p); +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( db->xProgress ){ + u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; + assert( 0 < db->nProgressOps ); + nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); + }else{ + nProgressLimit = 0xffffffff; + } +#endif if( p->rc==SQLITE_NOMEM ){ /* This happens if a malloc() inside a call to sqlite3_column_text() or ** sqlite3_column_text16() failed. */ @@ -635,15 +644,6 @@ int sqlite3VdbeExec( db->busyHandler.nBusy = 0; if( db->u1.isInterrupted ) goto abort_due_to_interrupt; sqlite3VdbeIOTraceSql(p); -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - if( db->xProgress ){ - u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; - assert( 0 < db->nProgressOps ); - nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); - }else{ - nProgressLimit = 0xffffffff; - } -#endif #ifdef SQLITE_DEBUG sqlite3BeginBenignMalloc(); if( p->pc==0 From 9c7e44cddd76c19d8ac034dcce2da1ed978a6f02 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 14 Feb 2019 15:27:12 +0000 Subject: [PATCH 247/306] Improved oversized cell detection when updating ptrmap pages in balance_nonroot(). FossilOrigin-Name: aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 23 +++++++++++++++-------- test/fuzzdata8.db | Bin 975872 -> 980992 bytes 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index c48ba75e83..31ec0424b9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\snProgressLimit\svariable\sis\salways\sinitialized\sin\nsqlite3VdbeExec(),\seven\sif\sthe\sroutine\sjumps\sto\sits\sexit\sprocessing\searly. -D 2019-02-12T22:58:32.377 +C Improved\soversized\scell\sdetection\swhen\supdating\sptrmap\spages\sin\nbalance_nonroot(). +D 2019-02-14T15:27:12.650 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 1336cc1670ec9ab93c097ae0c087480f501fd9c7157be0457b2b04e67a06a377 +F src/btree.c 161b6a57b91d160065e512a4d0be180e402a16a059034a380cbdc2411924f8ac F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c b0a9ee5b551afbc8357a68eb30693973300daf845c8c0e564f672d9b3fdeec56 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 19fcda3a879b840f8ff139701b116098be40c28c4fe1366e1fc813fb7afa7eea +F test/fuzzdata8.db 267bc89b51f4f0fca01f80ff432ff9b26e65131e806c5ca20119dfc63dd47a90 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 68cce272e7f7cbc0c319ee8b7ff674d652cb1e95e903d99d848c41dff2b5d304 -R 1dd11fa4b345d5a202cdf255a23d5245 +P 167b91df77fff1a84791f6ab5f72239b90475475be690a838248119b6dd312f0 +R 5fce60e5e60143c7168638176073d3e9 U drh -Z 5c1fab9a93beb29aa193da2ce5906eed +Z 1127274df05b3c005a32360404b93266 diff --git a/manifest.uuid b/manifest.uuid index 90a8aea4e5..c6a49cf8da 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -167b91df77fff1a84791f6ab5f72239b90475475be690a838248119b6dd312f0 \ No newline at end of file +aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index fbfc67a796..fe0112ced7 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6817,8 +6817,13 @@ static void insertCell( ** are used and they point to the leaf pages only, and the ixNx value are: ** ** ixNx[0] = Number of cells in Child-1. -** ixNx[1] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. -** ixNx[2] = Number of cells in Child-1 and Child-2 + both divider cells +** ixNx[1] = Number of cells in Child-1 and Child-2. +** ixNx[2] = Total number of cells. +** +** Sometimes when deleting, a child page can have zero cells. In those +** cases, ixNx[] entries with higher indexes, and the corresponding apEnd[] +** entries, shift down. The end result is that each ixNx[] entry should +** be larger than the previous */ typedef struct CellArray CellArray; struct CellArray { @@ -7747,6 +7752,9 @@ static int balance_nonroot( MemPage *p = apOld[i]; b.apEnd[k] = p->aDataEnd; b.ixNx[k] = cntOld[i]; + if( k && b.ixNx[k]==b.ixNx[k-1] ){ + k--; /* Omit b.ixNx[] entry for child pages with no cells */ + } if( !leafData ){ k++; b.apEnd[k] = pParent->aDataEnd; @@ -7978,18 +7986,17 @@ static int balance_nonroot( if( ISAUTOVACUUM ){ MemPage *pOld; MemPage *pNew = pOld = apNew[0]; - u8 *aOld = pNew->aData; int cntOldNext = pNew->nCell + pNew->nOverflow; - int usableSize = pBt->usableSize; int iNew = 0; int iOld = 0; for(i=0; inCell + pOld->nOverflow + !leafData; - aOld = pOld->aData; } if( i==cntNew[iNew] ){ pNew = apNew[++iNew]; @@ -8004,7 +8011,7 @@ static int balance_nonroot( ** overflow cell), we can skip updating the pointer map entries. */ if( iOld>=nNew || pNew->pgno!=aPgno[iOld] - || !SQLITE_WITHIN(pCell,aOld,&aOld[usableSize]) + || !SQLITE_WITHIN(pCell,pOld->aData,pOld->aDataEnd) ){ if( !leafCorrection ){ ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index dfaf1cb468b36980aa7f591d7fada5907b3724f2..e81a9dea0a1b516ee462a804fe98ee55f59f2592 100644 GIT binary patch delta 3629 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 aBaig%2;>*l9%ebEoCmBZqZ`!uum2xQhn@2P delta 3122 zcmZ{mdsJ0b9>@9ZeeXHbS8+5` z1W|s5sE~}xq={1e)UsrjGnuczp_zOoG|pPOtchw|)huV6eXfq(0X=K|et+z<&)%Qk zV}JK4Xd7H`YH)G4fJi?-e$?;hr&CG40oF*rXjj6atV-RM$?WPKKUykme<}?STT5p> zT|J2(^w`wk?>xHl+dZ1{B_6BtYdsd_S9-YeuXvd9Zjbr-uk)1~|C(~cS1LDTg>o^= zmFuxox$cXV3ta7XtaUp;8B@lUS(I6oY07kEHf45Y<~%349ilo4bAzp2u&wsQ{Uq>EAxk73DA&MtU9MdZ@@DPoacwoccyL_fY666*p) z6lhzjhz!paawTG<+V0?k_{wgUS_9EF{*7jf+Lv2CuodNAhBv7bWM9cH1%0`Y|oi|ODx zk;<(>>TM{cbY(Umu~GcMAPha79T9k<6&B)$W#U=PxvoW0P>J}8K{z&it~FBg7LlXd zmRkI74UON+uxT4h!h$ZgC&~G`7zA`_hnNnQh^l@|FnO2w$Qq*d=!sQth!@Ntt2y+- zFtSY{_XlDpVB30!KN%m2?*MC$*(@e*Z;Y*V1flDF+k7lKAudr?jo8KDm(+U95d!GC zZtrG>wwqcHh;Rmx7`o5Vmttx~vkrZ+;opuRa@C4_hMgul1noH{rUCR*0FJ5Vp1V0j zVdGBwdQxlWafrrY%R~$oSJ*6gZKnMq`TtRD)L}X9JS$$YxDHHRM&g|Ko>}`Sv{;0% zStOq5B^OX-qsZjYADc$;7~JFrD_;963!%x)Vn2rgf>8XOt-z31`4^OTQxq{sz!IxHh`N0xZg7?u zS~{wG6!mWtP2BmbL2-$3aq*e1SQnNYH~L`B7RWB^tX0sk+u|gH!DRVS%(ZJPEPg*_ z#ACp1V>sU3z{lZ%Rs2pFmv^o4DxxGzx#Cpe7b$?^A+Vnwx5}>>48xYkL@4IBIM2{G zHW|nv8B;pRkFa2G@W*oLg)zt=00%|!cgP=Z1&jhpXPh-ZHFq`I&mL*)DJ}^-Yjl_)0 zmSA+BmItXZLJr_CsHtmB#5nmbhjEzp2R#&1Z)w$ZDnS<7;5C|%A`dg`Q);DWNlYE)nGD#<`Sk{3aoNx8>Y#T}qC2}ycXQ>S*D4T)-lkF~_98%>- znF;Wl4!qB!;=M>$7s_57UTDucwFB!)lXaRe>x;gug=YR<@?~8ozqf%OeNZBwV%Euu zZF-$2u<+;7W_U}RiMhv&leBBUaSEuoTrL2}!j#kUJgTY|k$Z=^?Tq$#GdtjUQ#s2Q zZ?-R1Nk zFtwJ2U~#nkXc1=k~$R~D-LRPKe5)VMSLn;P z<^kXTwBWb@&o{_vHGef;e+1Y14qR`v=i1PoYvaSYihQ{?b>J%Y;Qx6POCO6| zixgAo!x_zb$EX0P!PZ?`NZG%%XYkrpBhftI2z2bC5v%@J{sT!^TW37Se;*r(VdYu~ zb-!X<=B6^djh@|FZ%j>>>6CxODCDpo(;DSfx_sRT@y<9vY0YvjQ1(q@lUE(yc>v#= z#+@{V+rdUf=Zsut-J=#fR2ti*`N4%*1Kvvs??%g!=5~iMEW;jnUte23GkP$nqeBt0 z-pe|M!MoU$tq0$`GO;mMw_$RC9$|j^9##d*g{UBpQ+%s&o6nq6gjdrwps)edr Date: Sat, 16 Feb 2019 22:45:55 +0000 Subject: [PATCH 248/306] Fix an assert() that might be false for a corrupt database. FossilOrigin-Name: 0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 31ec0424b9..5f67f503cc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\soversized\scell\sdetection\swhen\supdating\sptrmap\spages\sin\nbalance_nonroot(). -D 2019-02-14T15:27:12.650 +C Fix\san\sassert()\sthat\smight\sbe\sfalse\sfor\sa\scorrupt\sdatabase. +D 2019-02-16T22:45:55.998 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 161b6a57b91d160065e512a4d0be180e402a16a059034a380cbdc2411924f8ac +F src/btree.c 2105865a621c211cd76d8d21a6831249c31c876d7d1fe7d7ebe27410cd893747 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c b0a9ee5b551afbc8357a68eb30693973300daf845c8c0e564f672d9b3fdeec56 @@ -1804,7 +1804,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 167b91df77fff1a84791f6ab5f72239b90475475be690a838248119b6dd312f0 -R 5fce60e5e60143c7168638176073d3e9 +P aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 +R 17aed5b419bf8f1e5cfa29ef4f74b9e7 U drh -Z 1127274df05b3c005a32360404b93266 +Z d53e7c6537b08070a7f2249013f3162e diff --git a/manifest.uuid b/manifest.uuid index c6a49cf8da..f696d7c70f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 \ No newline at end of file +0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index fe0112ced7..0a8e6a99e4 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6730,7 +6730,7 @@ static void insertCell( pPage->nCell++; /* increment the cell count */ if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; - assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell ); + assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB ); #ifndef SQLITE_OMIT_AUTOVACUUM if( pPage->pBt->autoVacuum ){ /* The cell may contain a pointer to an overflow page. If so, write From b43ac0021ff4f9e389551fc36b57664e265d4bc0 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 18 Feb 2019 12:16:03 +0000 Subject: [PATCH 249/306] Fix an assert() that might not be true if the %_segdir table of FTS3 contains corrupt entries. FossilOrigin-Name: a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 --- ext/fts3/fts3_write.c | 4 +++- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 980992 -> 987136 bytes 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 130a7fbdea..a788be7e02 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -1348,7 +1348,9 @@ static int fts3SegReaderNext( /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf ** blocks have already been traversed. */ - assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock ); +#ifdef CORRUPT_DB + assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock || CORRUPT_DB ); +#endif if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){ return SQLITE_OK; } diff --git a/manifest b/manifest index 5f67f503cc..b2fe3366be 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\smight\sbe\sfalse\sfor\sa\scorrupt\sdatabase. -D 2019-02-16T22:45:55.998 +C Fix\san\sassert()\sthat\smight\snot\sbe\strue\sif\sthe\s%_segdir\stable\sof\sFTS3\scontains\ncorrupt\sentries. +D 2019-02-18T12:16:03.611 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -98,7 +98,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 3732d0495b248a23a8f92af3d582c5d910d607b2bf54985e81a3d4d09b4745ea +F ext/fts3/fts3_write.c 8174c14b1027c01751c5671878927dc855507bc3248848f91cebe3950b7da24a F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 267bc89b51f4f0fca01f80ff432ff9b26e65131e806c5ca20119dfc63dd47a90 +F test/fuzzdata8.db b7f93d26fb1d29af7c5181eda877f1a20bdbb3d286bc14622e77d08752b6da61 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 aa61435a4c3800f023788081c1342ad6a05a41449a424fa6c039d5ca46072256 -R 17aed5b419bf8f1e5cfa29ef4f74b9e7 +P 0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 +R 4804fb0a39426f38f5e4fc938e4a29ae U drh -Z d53e7c6537b08070a7f2249013f3162e +Z cb283c5b86f11d6cac5693b69d717c32 diff --git a/manifest.uuid b/manifest.uuid index f696d7c70f..d18260ebb1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 \ No newline at end of file +a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index e81a9dea0a1b516ee462a804fe98ee55f59f2592..6ae5d76f4a9e4ea18af4be55f09953fec3f0e3f3 100644 GIT binary patch delta 11095 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 VFI20@ea?^1ev%fNuUqdQ{69DPoPPiS delta 10628 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 From 9df385ec3d1167d6abba905f39fc7cc84a2d24b8 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 13:08:35 +0000 Subject: [PATCH 250/306] Always use the symbolic name SQLITE_IDXTYPE_PRIMARYKEY rather than a hard-coded magic number 2. FossilOrigin-Name: 55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b2fe3366be..1f12f24de1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\smight\snot\sbe\strue\sif\sthe\s%_segdir\stable\sof\sFTS3\scontains\ncorrupt\sentries. -D 2019-02-18T12:16:03.611 +C Always\suse\sthe\ssymbolic\sname\sSQLITE_IDXTYPE_PRIMARYKEY\srather\sthan\sa\shard-coded\nmagic\snumber\s2. +D 2019-02-19T13:08:35.738 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -475,7 +475,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 4cf069988908f650bec92fd821a082f6eda87c01191047e49a1a5007af93274c +F src/insert.c 305f6ea82a90c3d506ad26d3b6530655bcf08dbff20403ce9f20c21758fbd5c0 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f @@ -1804,7 +1804,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 0cfb888723fb8ff0763bbc23acb7d21a53f6d1c40661d8468248644281b29d85 -R 4804fb0a39426f38f5e4fc938e4a29ae +P a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 +R 704b4d956a0ce2c9b781aab7a71ed157 U drh -Z cb283c5b86f11d6cac5693b69d717c32 +Z b0619f705fb89193b6dad39d43e9fd99 diff --git a/manifest.uuid b/manifest.uuid index d18260ebb1..253003811b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 \ No newline at end of file +55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 1b6235d4d0..6f044db5a7 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1669,7 +1669,9 @@ void sqlite3GenerateConstraintChecks( sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); VdbeComment((v, "for %s", pIdx->zName)); #ifdef SQLITE_ENABLE_NULL_TRIM - if( pIdx->idxType==2 ) sqlite3SetMakeRecordP5(v, pIdx->pTable); + if( pIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ + sqlite3SetMakeRecordP5(v, pIdx->pTable); + } #endif /* In an UPDATE operation, if this index is the PRIMARY KEY index @@ -2410,7 +2412,7 @@ static int xferOptimization( sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); } } - if( !HasRowid(pSrc) && pDestIdx->idxType==2 ){ + if( !HasRowid(pSrc) && pDestIdx->idxType==SQLITE_IDXTYPE_PRIMARYKEY ){ idxInsFlags |= OPFLAG_NCHANGE; } sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData); From 3cbd2b7245ad0b262d5e0810ac3200e9797db1eb Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 13:51:58 +0000 Subject: [PATCH 251/306] New assert() to verify the TF_HasprimaryKey flag. FossilOrigin-Name: 0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 1f12f24de1..c980667aed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\suse\sthe\ssymbolic\sname\sSQLITE_IDXTYPE_PRIMARYKEY\srather\sthan\sa\shard-coded\nmagic\snumber\s2. -D 2019-02-19T13:08:35.738 +C New\sassert()\sto\sverify\sthe\sTF_HasprimaryKey\sflag. +D 2019-02-19T13:51:58.095 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -458,7 +458,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 2105865a621c211cd76d8d21a6831249c31c876d7d1fe7d7ebe27410cd893747 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c b0a9ee5b551afbc8357a68eb30693973300daf845c8c0e564f672d9b3fdeec56 +F src/build.c ac41c86b486f480b2bcad7e55c6cc19d7151082f74682ab048c45980d6c9ddac F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -1804,7 +1804,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 a6509ca3dc2602c7d0376230ee63c1bb4c4066f007e77e9ac20d8eee966e5e13 -R 704b4d956a0ce2c9b781aab7a71ed157 +P 55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e +R 4957484ea90ae4ee926291ee2f0443fe U drh -Z b0619f705fb89193b6dad39d43e9fd99 +Z 06b0b1933b49b6d18ffce83176015625 diff --git a/manifest.uuid b/manifest.uuid index 253003811b..a65f486535 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e \ No newline at end of file +0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 \ No newline at end of file diff --git a/src/build.c b/src/build.c index f7e46d0a95..0cf9f52701 100644 --- a/src/build.c +++ b/src/build.c @@ -1991,6 +1991,11 @@ void sqlite3EndTable( if( p->tnum==1 ) p->tabFlags |= TF_Readonly; } + assert( (p->tabFlags & TF_HasPrimaryKey)==0 + || p->iPKey>=0 || sqlite3PrimaryKeyIndex(p)!=0 ); + assert( (p->tabFlags & TF_HasPrimaryKey)!=0 + || (p->iPKey<0 && sqlite3PrimaryKeyIndex(p)==0) ); + /* Special processing for WITHOUT ROWID Tables */ if( tabOpts & TF_WithoutRowid ){ if( (p->tabFlags & TF_Autoincrement) ){ From 12fe9a0d2512ebbbcc9c492af187ff76404b913e Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 16:42:54 +0000 Subject: [PATCH 252/306] Fix an assert() that might not be true if the database file is corrupt. FossilOrigin-Name: f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 987136 -> 991232 bytes 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c980667aed..d4cd296435 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sassert()\sto\sverify\sthe\sTF_HasprimaryKey\sflag. -D 2019-02-19T13:51:58.095 +C Fix\san\sassert()\sthat\smight\snot\sbe\strue\sif\sthe\sdatabase\sfile\sis\scorrupt. +D 2019-02-19T16:42:54.196 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -455,7 +455,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 2105865a621c211cd76d8d21a6831249c31c876d7d1fe7d7ebe27410cd893747 +F src/btree.c 026f48c39b179a5602423904fcaaae87bbd75f659fd672b3756fea43356d9909 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c ac41c86b486f480b2bcad7e55c6cc19d7151082f74682ab048c45980d6c9ddac @@ -992,7 +992,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db b7f93d26fb1d29af7c5181eda877f1a20bdbb3d286bc14622e77d08752b6da61 +F test/fuzzdata8.db 04d95f81db43fa4a247531d25573544125d9dd2777ae43594c9eb57e2a8b901c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1804,7 +1804,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 55d43adc894a6b1e0f77bf481dad6dd604a0dc0022e72bbf2e3037f97351971e -R 4957484ea90ae4ee926291ee2f0443fe +P 0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 +R bfae54bdd2f15a7a8fbc764b3228c6f1 U drh -Z 06b0b1933b49b6d18ffce83176015625 +Z aaec93d3bd3865148d42c2428c55baee diff --git a/manifest.uuid b/manifest.uuid index a65f486535..7a8eaf1d80 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 \ No newline at end of file +f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 0a8e6a99e4..aa2c84999c 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8261,7 +8261,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ } assert( sqlite3PagerIswriteable(pChild->pDbPage) ); assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); - assert( pChild->nCell==pRoot->nCell ); + assert( pChild->nCell==pRoot->nCell || CORRUPT_DB ); TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno)); diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 6ae5d76f4a9e4ea18af4be55f09953fec3f0e3f3..ed0d3497b4622f8ea25c591ae96612ee07a24d8e 100644 GIT binary patch delta 15031 zcmaJ|30xJ`_kVZp>@$x=Mcj~wisFL2haxU0;J%^YUTT7vxw5!rrUEXdl?tMqG8a&D z$qhs~E-8>@rln|BW-e$}W|~l%S(g7Z&oZ)pe?Ff%$jqHP-+Q)u?m5Tw+=%p&h|Id) zp*9;oX8Zf6T2_lzEVLkgqoR&w_vk)9mTjuX1$Hmn+gz6YoVGlTAI>o7{+6X+-3yMA#IYP53pHNZOqgqPLTYe3eAx{3Ie}6Nr2?j>vn@5jprQkv)k- zwvQ&VF@eaMcp^(j5qW7Ok+~y?Bo8O@+*3s2hY=Y#lt{P1L^=&555w@@Ok}O#iz|EzYXesn z@+QKwW1%!cYy|1kL?>$t1=GY}mH?>*ye8c4A$mhaeNkj%A?g@k1Lea+KNbcV-eOOY zK6(wVD54+syvA!X<^*Se*j#cYI78b&e1I4Xp6NZ72_y z{6P4YJN=q8b#%}N$99b#)Xg!?KE$kn3BILDAdPX$cu(S6k5Bmw}HLH1yf?}`4^f}0F(7v8_y~k4v+8nEa#F(RBv^Zc_W`d{+|0?ARETdS2EoYwq9=IOBrYD>q$%)9IP=c#5>}s7 zW63D7rOeV6Y-)?Xz1uRt?3F2ZP%8} z!giIeZy~Cl*d9AA;B!=|zG&M%-I{wd&CR86==lvyeVf0^AitjY1_mwXUo!SR1o(^L z*kJ{KQ^CSY;4Tb1%i~q4p=dkQ?jN&mvnET! zGnaTUlkU^(f1p^-A9D5(PWy`?kW|2ZEaR=CN`a#7#~$vNiMzAN$1}F3S0fUq?>}cm znz5FflfTm#0sN2fi{QM(*F%1cSrh#2;^&z1BVW!0#=-kG&%lLu_*~9J@IJ%+v41}I z7qIiMyp%Bs0*ZJP{1GLpu!M{CV683=$0HAT6lXG=UeAwJ;WiStTQjD>-UmDoNi7^4 zmVL!Ta|-yvB30xf)6lD}_=kXkr^rYtA@v?#hR%GxRltbq;vz+AEZX)A|Hou&H#HSdR|IWF9@%|!6QWMd(ZO%W2Z?hKP!~KFuFL~k46j9-j;wg%d-a$+UFIh|_ zWnkWzA&Y4YM`am31&E3g!-||@u*8~T%P_Ge6RW@J6@>9^#C1&aq~SHN^dk2rH6{+? z?Re1;fPnP2=A6%bAa$s?4AOUT`H>0&sbEJO)k)kaF<&e-#b^Q3hKL!=JqFTW;tego zU4zwvQZI2mlFRlIu&B3~DM`&mTT#M4*0jYEb)7fIH4|;%vxzZSSO23AMX<>mP}I7|0(gB%<5Zqz6#gIi_dcA4|(_aC?I)+ z!KBxjin(LN-&84Bv=zp=0bQOf?p6X;4R0aZ_CnlIIm&V&Z^OJ~agO9iUupoErTl~? zf!3Tg#MD3dGKR&!@c9gqcJmuWGsUx-)Kav){@DMR*l3>kC6gM_+fAUV_D=VAlqz2Yk0sss(+PiThYHj2R~h4EDV& z^~8Qz;$DF@hnPu{0~@UnFLTxcVp60j5VTA>h27o|V-zVwwEgaHEek)(6`OL&+P_1f zvZvg;F#bX=&raW1&ElRDD*MXk3d`m?S>eedk%8AX@h9fOj7^sITpBA23>WSc=Q0)w z8E=yoJX|X`K(7h%ORO+|UM$NlNttfV)2eW1vjHso(yhaA`2h1SoO7s}5-fRue7P~`noRo+^RERrO;`W;R;%Gs#;UDwf^pfqG|o^jiQ(JyAO&rq%chmrM11%!&=)^h}zCPu*6S_6r`>+ zV?W3}DQ&}D4rvf){jv0_XfpH)lt=+%q4XQ^9#r&{OjMdm4+Iv6r8mS7xB7+Ss2C|n zumm^&N`DaNLF97U5?i) z6!)_+=sGDiWf=T|^qIh(1@BeTLs;BZnhp6V#X@|b)DCFvwPE7R;z}%x;JsdY3q$%!P6o|yie5;rqK?4EK~{)V9eo!`H#r**-fv5{phJ$>4)O;{ zOL5;4sgJ-WfGb2GE6bF=RoEo(J}lINs6EndJo&m5#@Xb@I=>VLuaR~NEXl3kkGvC* zcM8Iy^%kOJ=(tQgVmYRo3>@X;uihRn6#|Ju!V8RAiEo!mzA?wM0^kOlXbLDK-rQu8F4^e!5?3DX{4fa9uou zpS>dmb2bA5Zi>19qxwsExa(bM5M$3{K!upf{wcEpi2O<1gvUORx=2zx(e}{o6B4am z=!HEK+KRUCp85}P_uQK<9Rt}csBEm)cMH}+9VVbxO(T>6L3MAvFGBu{Bt=rO|1DI@ zr~GQE`fP}9B2B`Sb5b^EbD%U&x?5GO?Jh~j8Ji3FFIzKaiGHwWytLKg@q18wgnUW7 zOPYX-uS&BROT*HwQb$%r;OaNhZ;YiwbhxEC*QKu%HV-Oakcndz7RTm8sjtu!qBe^q zK(2loCft?Q3v2;IEs$TtlnHWIh9AVq%USlao7*h33$qKhL}1hd=?G^pVbp8#99EcF z`WC~+Twbe)?L|6{xx&P#?256W?$A3MzibAR3^`k-gEw330<%Qijs>PXfU{S!UD5GS zwt=FA%Q8=ZvL7jAirp;aLu^eZ=1gD)=4*Tt1tq7*Q^n6W>q7Zv!SVPh(9=2=s#l@J zTONQrOg@l9$zeJgdDa&i!YyC9CVLHsd+`c}cWTR?0$T#bl9Y}+g5?VgC7+VT? z+l^s3!XaP>inl8vcYV^UM8p&RqWuh1)lgrIQv4!<}Ikc$512E7j zU*aqqI{L_)q2+nuwVb^|V~GERsj#-DJQ_a;lOqJS0shrs@%c7HPLRJ@yK7CjioK=MzHA({kzL5>fPnLOj<-seZ9~%&Wad%$rLfXftAn7 z?=$=`Ms6>#RaiM*KH?S_eeg}FoJ;`>iAu+QgXF!Ot%k}}`N-xEhRM1VL4xX7STNS< zR%)P$*A+%hC}D8wC&`6T>GExs-9NCN#oS!*{8^e(crmb{ke!_LJA8LWo?zY21J7Tj zio%KmUK9gtIRgC;Fr%#|< zXFHl89$X;z>vC+*UBAQx3=v<&E^Q?TJuXL4nlp66Z23fvz^Qq1rXcKUm0i%H0aP4d>!9`!*#Sd8mzUtwx8zKj z6+p5N`+B#JMB)84yD!TbqWosDX*Xp3Dwn~-?)HJ$q(HtPutLbIN6}8&Uink3wpXqc z*dEB(DG$d{`{a$B?S;zTYzU+$s88dbcjSkv)LFD$dC^+iGD?22L-}>1q2Ez?f{MF? zqDaVt-OC3559D$wp9bs$*LLQEwU5a+INP6H`l27i)Lhl;E63P{-{XF}}H@<7NR#eE<%Kv@j)ev>oU`;hvx9Qyd~HvIX4Z0GDK zWHc1~_cm0@Ir{(tzEr{>whPbCj*V3zvxD3ef3Pb$gSC=pBy1he4NQ`im5d#Oyn}Ke zlz0kJd;1A?4i$}A5JdgKMq5kx5Kj9j6?n%~JUKg#E=@TlKuJ^DyLaAa9l_zL^n%-_ zB0y&EX|89N16#@iDi^Lug#$&D1d%DUp57Ro#>eN3;O zfvjFi4~%N6^dTkQMOyU_mZiYDV8Z!gD`gS;1YE%i0P=MSEQ*t?MOjJg(%NTdT z`c%KSl^AP$ImVSMGDCg5a$jIqFz%YNU%*32N_WPtV$^k|gu{-H6>^3)_7z6mbpL(& z(cjk~szPan;WL$w6!s0APNGy~`U|WN7vg5MKAQ_*W5S01J_O^Z)L3N1tnAU016!y4@fzxJj53!D}L@FH!$r(r3RxD zy>i`s<9kf|Sm`TZY>raM*iB$)AWJX&C!--eNESGEV!%m7a+54aK!mAhWL86}$$k)iLCn0%Q;oYL+FhU$7uTRXO+vsCTTt?_)uf z8pvQmnySO$)v5-|zE@I_#9Jt{zL0QMNzw#iU-v$utJwHu)e(mdhh zSS1U_`KoU+6Dvy#Tt%tY_~ zo-q&?qVAM5dZAkOmGQoi(%&8fvD?(`%llWuw9!f+%PF9R4h~g!GFBaERUctlYqb?; zH6Sk2^s|&av&vEqwN<-w%B5B0sFxuLRbR~gMu}%gQXa)%f27)*)r5*wYNlmPZAl_7 z%B=ezRxRxke6eCJaV=-R@;YwsrVf>P?KX)}I$HUPK-A1GX=nghbf@gxIW?eu6Fv<0 z#HjrRRtJm6D$$glTBN*>BbKWhNjIyS8zqTsLS0~WRX-@pGJT+|P<29CxLz01PU_we zGf~OHkeTXj2GxeDl@th-B`Hoah3m@O=v<}7(tLZAGuA9L!4#!G+&ZXwLge?B)`xNv zK3J_f@vRZ+Go01OvKjO)MlDcPh7qIHs}hCv{^QgMqT}$u{Q`-Zw4-rui2z>vA>Std6A)B0-Qj(1c#W+cs5S5itZp$)Hz@p)>l zfCpYuds+F_$)lBUOEvx}72LT*9W1bBP@1pS#`F>;Qm~M1W>Nt=@|W7b#*hHk6IgK0Ud07-4yyAZDNU7;JYP4?T0&(QMcwhmYAz(*Ca=EZ zw3`#_)p;_D!^>M#2bY3qIr;zskTb&B2q8BhxsgDiz zs8=|p{F1&^mjBI4Bvy73lrWbwlqzr*%+8#Yd5<+I)c|KG(Xi{b5(fly3aX`Q14SAj z+WttkJar14Ce_F40AzaW$v+EJvlQAv-Ym%n*DNp-DG7c`^#SKiHQAc9J?4Apu?#); zYP6@0J44=ub)W!@?m_%qpVVqMw-YnqNw z(oY+T!!M|(6p2{y!}AuRVQA!;m6U1NXD+ayw52Nw6ONf5l09T<*KzGjW*@g_iiU#k z)fPyoKH-%9bD*{mF3;4agJ*TU(hUR%NI1^>QO#hi3q=2}w86~T+BOFMgD9-X4cFsx z)@W@lSTDL~>T_ z!$J>hH){m#^UO$mPSjR&))QRcsSh`EO{3HzxNfO*rZP1;Q}qT{rMdtYd1)_Fl99@| zY9H)hL)*h?FLm8lXW`sh+CqhLi{6D&lkC{O-7$WNmP?+yhn^0RV|BL-`eW1$l@67T zLhTuB&{(^|$lzV$$%e}&=$02jtvOc2=rb5Pw(6RDd2tZGUz>=@EwmM!@{U<^HQH00 z+N&xh1y8lro@MHw!WKhB+czU2?=98?Za2~caZ7t`D3d6YC=5o|E7}PL6`_U-Atib} zj2fe-Q%)pLUt-B~2tLf$iW$r;(q~~wu)dFZhC3~#40X10Qe|8i3R&ZY>JUFc--SoJ zY8^SHA7hW}q}M$)((9+7@?G;~e6_DOQ(?p5v_qPP`3^0X11*(OM>b&uCcI>>BL_v= zXvzH}2Du@6Je1#1t@E@n5)wA)u{daiwu@8lF=44S*l|{?1G&xka_m1^+r!u>bhOnM zGQ7M)52YN~eXSeYG)|M*Fl0&EA540hCK`>!njS5{?eEm1FtUZ-5L!;vKE=3TeV2fa zAg!O9pA<4o5UOKJj+RNf*`K5n6~t8xnWfPw`dKXY(ZdB;vqX=?S#!0;R+`cEwNe`* zkBc23Wtx5-(%b7TF+M{}QYiO&YLVvTlGV;I9#gk#%XrQ$*$?uUX#?2=OwHHm>=EBc ztL=t^uV!g81vU}lZmC0I`^TD!$3E8T2za}jM#A3#+7L=V##O3|EHtMXcz&+V$MRKL zLqf-drcNbeWF^;ZOB%3hke70Na3i*4@KrGAG7rA}z6gb_@PBr%)dYPrt zC-9vDt%ty-0{hggk16BzOo|vug(1^JI|l74HTtkkm>uo0MbO-tg^^E6p{cEFo$a=KGLM0u!T$KlttEu3Xw%5F>3VwVZ| zNHTxNt%UO|Fw`nBQFlD%m>mh~LMsP(I+@l{KS5h(0c*)EpbOyiR6PWvE}B$}aE97HvL1dP{uSSZO=T&4}KWPp}{gz;5H8Y$X-o$8h`l3!RscID9SSdylu8DSAd zzoOM)SYOk>7T97WyYUt*-&F2K3yxlTPpBwUt6KnG0opij;16E952yU1w`BK$+%Po| z(`IQDy>$1{4+-owU`NdT7~57qL&<<|6d7)ZaBm=}q--`}$=|F6V(mFJ{PfoqX%xkp z#$%Ac)MW>TJR{ofx*p$aVrAuom+8ucj0kN5ZVu8%P~s6vKUSYYGWAVX_ObM|x)~gw zn`X`gp&rI|(^N98MS7r{OWBywQ~Q}=WTr{B)@h0UnT2QtrqDU(iGna{U#k06l6#p$2ZgD+^KXgnw?GV`q~z)Q>RR{51@Nj* z$Dg7|y*I??=zfqnQxJ< zeu7|FaPlDa6Sc}F^A6>jej?2&i`OXTw+ZW!HRBIyKgcpGAajo@!sWTzXn1O>{x;iy ztR?Txu=jL*wIU^mw(rv(i|CPVO@>x!`bSpEQrLtQO?5BQr$*XSIC-9)Lpe%|U&|Th zEYv3pYzqW@ZU#b>r#290FVbJ8TqVYx)!H*8>AWwnw<(jMQ5E4Y*{sDT%k>M4a&z8o zwCW6fSL(GDHX2>4^^;tBi$1v%Q&Y560!KZA@d zc;RiGiZTV5)q+!Pcm57NU0}PBo!6=GQa0Hz(Q~I($=oiToSs`b3c=Z&ycs#41gZw_ z)yJz+qG8*{k41KQZ zKQQEX^e6#>7aAAP|6Bc<$VzceutCoGpEGo_W_TAf0<1?VX}T{sjtJ%8I4o#Z?QD+q z_y|_MVbCG;_XUO%yZo#N$l`ON?Zl%-g3NPzqJ^!SKwXQ%`*}We@OT&UI!aMMkE}F} zP(s&HNEm7aLq&*TRzZNYh6QeG`~b_|7095i4^tYzIO4v049boQy}%J~G{qUJu|#3V z>22eW|C*=J&HWP)5Fq(LyqDn(WdoHu82PSH`uDUyvZ7kX6-gRLxxWC2JEyO=uupT_ z-G>D8B$kF6k<7wXKns3XFf9h0!qPT$7s{fkhV|QBp*e#_?Ts}>LB@DdqMAWTH)|>@ z?;@ODTWh>%dnfGi+!+G-;)p!x3D)f0gr>F65cD|24IvN}03_WTa zl)Uw5YJ?R<7_@1AR;3u1@{Z7!Cg@BPu+PCY(V#H3t3i9rIdCN#hwMl@$%P=><@ zf|mDbJM`C$!T6xB@q!{v5^W#(JjO$fIMat1^_cqQmXL{}tt`*!g~EW=6*=1z!_o8g*hh#6K^dxY6|Q-C~%4{7}Z&) zRA!o@VDHzA{R;aY<3f#HZo|6*Uw1V!U{`e`4(RLsU=JAm*-eaVV^AqXd&BruV7DNy zw=olEuQtdf{s39ijS6sVrgG4OT%(UF(Lv(8TW{9m4_ggyLApVRD!~u8ePo{Sk~MgkI!5&s2%1Z6x=rY6w!9;S-c{e)N4EcM`Jd#|3-bv-0E<3IzwF$S8Qy9sCNwwsp!~+3t}5c zJ!;g1onIO;?%F0&ZPQ@5@xC!iphh^V3sJYt1EW->+WSS(4B#>sXhxNa%@!|Jvy3wh zO79twuxyao$|{mJ!8N8imQ&fb^f$Wg)j)PnQI|@#U8#6#tqEvNgC4VMKGvviDzY?< z9Alsb{(^NlwbGm14h1dk)M#1He4kUJ2y13{Vrz$aiZf40O{OTKRwMI!&b+eoYErNg zWKx5JH;}Yy!ta6RU~tZ-CWy2a<^oRjmx_3y7sfbEFP*smOnWnr8PqMueJs|5g+pGf z*%0z$O}kZ(orD-?ilp5?8!e#Lcyk7nE7YTseBNk=hsT=>EHj}TPu@|3OrSi8D_C*g zppD*IED*oi!NFl>8*7j+Rt_^`$^ZFr2`>L`>_K~XvzIK+5N#(dS04$v?akiUbc{(m zREi&!vz`7jWz$>PMcCEfjFoE8By}KFF<-@HvF0>R9dE7)ChcJ)sbM&Ku=%n;-ENM{ z#t4ibX1<|{GcDDow55CIKys|S{#)YnqV2dHh_{QZPpNJO*QQ7Qkm^T1zoNqMvL2l0 z%mJr=C6#Y9&b-X&;E`oFsS#n4NsR~%Aj_MwfhV6bQ}LA)^96-9g1C8t4|EzVynxGR zn!cL&f@s@nwfA(w?=#FAf<#^6yb0AQ&E0<|K`1T>vf`2lMTj)=u}}A+Ri-T*2kf1%DiR)7(xeEA%>SG-nu6X`U4*KXv*9H4!?ul7VDi zq-4v|JLYtSb%PW08I^P&m{ij34k;6vFPL8ov%!A~zl777eW^g1nk+w!yn|@J&V`>l-lF;umm=0>mZ*6mui4ojpo3}k)k(G0e(U=wqy$*VEaZhud3x4PLUYjT=syPpsS z-geKq7>K@O(DMIuy4$g)pZ%6V2`bC0TYlmM-gek)PzM|} z+}MjDy`wx9QkvS^VnU#udR}57FI%buB9pdVYd`qm|tV?pT+&6Axfg#X$*pdt85%5$J?{GGP;e$_rZ|x zCH3&cU$yVTvIslX3Wj8#?oXMU19C%Zq_P)srA;WMq4-enzQe}gxUTj$tqjx^mAA&W zJ?$r~43y)0vlGO&lI_^PuYC_^Pea^!s$0c!Wg{MowJ%T^!m8{@$=*TG#t<-SgyYo5maI9e zFb{K|u_rR>V|x=H=f46-qqkK^GRr^UGaW2L9z1C-^ zJqd66zu>ufIHM}O=c~eV%XMZ|c*pEyXcBfRv(IGutdIOM#3%WgLYQ9!*Eai!!t@%H zJN&EDWToYcW#ZkoZTfFqo2%m5QWclm z^0!vS<+gn7Ps`6EeB1x0OW*Ntm%j5~E`8U3yY&33F1?^CzTH*vxlO;YD!x4)6)N@Y zk^78($yn3W4o5qb(QTK)~mYdaP#D_;saF z_Rp!N^n=THJ=$3Y4h#=edblWH`GdL*^G|pT{jvTXk1wrEEI$AlC^v!F zN%ldQR^~zB^+AZcZoi0MKJf5&k9Y^;ZrUd^oX9+vxn0Jg$Kab_p9>zHHEQHs`n5-@ zJ4M4wvRyuBA2}z&yOmCzv>RD1aNVuXl|sM^T8%&bYxymYh64476-3yJ+*o@F>gP`64QYuj|gJj76tJw-(}iPLWe0&P@l(D{uA)o;=^nlD@L7ylo<^6Iw$ delta 14454 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 It?v*1ADO){3jhEB From 6d7f18d60cef4bcae013aa8bc57f153f69693b7c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 17:45:31 +0000 Subject: [PATCH 253/306] Fix a potential memory leak in RBU if the rbu_fossil_delta() SQL function is misused. Misuse never happens in a working RBU system, so this is not a particularly important fix. FossilOrigin-Name: 12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 --- ext/rbu/sqlite3rbu.c | 1 + manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index e86606be99..1a78adc851 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -684,6 +684,7 @@ static void rbuFossilDeltaFunc( }else{ nOut2 = rbuDeltaApply(aOrig, nOrig, aDelta, nDelta, aOut); if( nOut2!=nOut ){ + sqlite3_free(aOut); sqlite3_result_error(context, "corrupt fossil delta", -1); }else{ sqlite3_result_blob(context, aOut, nOut, sqlite3_free); diff --git a/manifest b/manifest index d4cd296435..c4848176e4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\smight\snot\sbe\strue\sif\sthe\sdatabase\sfile\sis\scorrupt. -D 2019-02-19T16:42:54.196 +C Fix\sa\spotential\smemory\sleak\sin\sRBU\sif\sthe\srbu_fossil_delta()\sSQL\sfunction\sis\nmisused.\s\sMisuse\snever\shappens\sin\sa\sworking\sRBU\ssystem,\sso\sthis\sis\snot\sa\s\nparticularly\simportant\sfix. +D 2019-02-19T17:45:31.317 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -354,7 +354,7 @@ F ext/rbu/rbutemplimit.test 7f408f49b90fa0a720d7599f3aec74a3c85e6cd78e56fdf726ce F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534 F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc -F ext/rbu/sqlite3rbu.c d643661c7c85e79f4d0bc56c73f6f2dd55c35732dd41f378b0fd3b182a33242d +F ext/rbu/sqlite3rbu.c d0627582dc894d96e70a1f4b3c8953abdd9fd4870f9a229479309ebfca9eda41 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -1804,7 +1804,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 0abace8a7aecca01c8677d07f3ec1bafb289ceffe5bcd60284701a7bf813f415 -R bfae54bdd2f15a7a8fbc764b3228c6f1 +P f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d +R 8d9f63c20f18bc4035bf1d3926ca6101 U drh -Z aaec93d3bd3865148d42c2428c55baee +Z 3f3200a2e92dbd4c9a6a6ed07ff60873 diff --git a/manifest.uuid b/manifest.uuid index 7a8eaf1d80..34fb63dc13 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d \ No newline at end of file +12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 \ No newline at end of file From 4bec44bdfa1fea3374a8e262b6a8da6fc79f08b8 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 18:39:16 +0000 Subject: [PATCH 254/306] Add the fossildelta.c extension in ext/misc with implementations of the Fossil delta functions. FossilOrigin-Name: b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 --- ext/misc/fossildelta.c | 791 +++++++++++++++++++++++++++++++++++++++++ manifest | 11 +- manifest.uuid | 2 +- 3 files changed, 798 insertions(+), 6 deletions(-) create mode 100644 ext/misc/fossildelta.c diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c new file mode 100644 index 0000000000..3d845faa98 --- /dev/null +++ b/ext/misc/fossildelta.c @@ -0,0 +1,791 @@ +/* +** 2019-02-19 +** +** 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 SQLite extension implements the delta functions used by Fossil. +*/ +#include +#include +#include +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 + +/* +** The "u32" type must be an unsigned 32-bit integer. Adjust this +*/ +typedef unsigned int u32; + +/* +** Must be a 16-bit value +*/ +typedef short int s16; +typedef unsigned short int u16; + + +/* +** The width of a hash window in bytes. The algorithm only works if this +** is a power of 2. +*/ +#define NHASH 16 + +/* +** The current state of the rolling hash. +** +** z[] holds the values that have been hashed. z[] is a circular buffer. +** z[i] is the first entry and z[(i+NHASH-1)%NHASH] is the last entry of +** the window. +** +** Hash.a is the sum of all elements of hash.z[]. Hash.b is a weighted +** sum. Hash.b is z[i]*NHASH + z[i+1]*(NHASH-1) + ... + z[i+NHASH-1]*1. +** (Each index for z[] should be module NHASH, of course. The %NHASH operator +** is omitted in the prior expression for brevity.) +*/ +typedef struct hash hash; +struct hash { + u16 a, b; /* Hash values */ + u16 i; /* Start of the hash window */ + char z[NHASH]; /* The values that have been hashed */ +}; + +/* +** Initialize the rolling hash using the first NHASH characters of z[] +*/ +static void hash_init(hash *pHash, const char *z){ + u16 a, b, i; + a = b = z[0]; + for(i=1; iz, z, NHASH); + pHash->a = a & 0xffff; + pHash->b = b & 0xffff; + pHash->i = 0; +} + +/* +** Advance the rolling hash by a single character "c" +*/ +static void hash_next(hash *pHash, int c){ + u16 old = pHash->z[pHash->i]; + pHash->z[pHash->i] = c; + pHash->i = (pHash->i+1)&(NHASH-1); + pHash->a = pHash->a - old + c; + pHash->b = pHash->b - NHASH*old + pHash->a; +} + +/* +** Return a 32-bit hash value +*/ +static u32 hash_32bit(hash *pHash){ + return (pHash->a & 0xffff) | (((u32)(pHash->b & 0xffff))<<16); +} + +/* +** Compute a hash on NHASH bytes. +** +** This routine is intended to be equivalent to: +** hash h; +** hash_init(&h, zInput); +** return hash_32bit(&h); +*/ +static u32 hash_once(const char *z){ + u16 a, b, i; + a = b = z[0]; + for(i=1; i0; i++, v>>=6){ + zBuf[i] = zDigits[v&0x3f]; + } + for(j=i-1; j>=0; j--){ + *(*pz)++ = zBuf[j]; + } +} + +/* +** Read bytes from *pz and convert them into a positive integer. When +** finished, leave *pz pointing to the first character past the end of +** the integer. The *pLen parameter holds the length of the string +** in *pz and is decremented once for each character in the integer. +*/ +static unsigned int getInt(const char **pz, int *pLen){ + static const signed char zValue[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, 36, + -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, 63, -1, + }; + unsigned int v = 0; + int c; + unsigned char *z = (unsigned char*)*pz; + unsigned char *zStart = z; + while( (c = zValue[0x7f&*(z++)])>=0 ){ + v = (v<<6) + c; + } + z--; + *pLen -= z - zStart; + *pz = (char*)z; + return v; +} + +/* +** Return the number digits in the base-64 representation of a positive integer +*/ +static int digit_count(int v){ + unsigned int i, x; + for(i=1, x=64; v>=x; i++, x <<= 6){} + return i; +} + +#ifdef __GNUC__ +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif + +/* +** Compute a 32-bit big-endian checksum on the N-byte buffer. If the +** buffer is not a multiple of 4 bytes length, compute the sum that would +** have occurred if the buffer was padded with zeros to the next multiple +** of four bytes. +*/ +static unsigned int checksum(const char *zIn, size_t N){ + static const int byteOrderTest = 1; + const unsigned char *z = (const unsigned char *)zIn; + const unsigned char *zEnd = (const unsigned char*)&zIn[N&~3]; + unsigned sum = 0; + assert( (z - (const unsigned char*)0)%4==0 ); /* Four-byte alignment */ + if( 0==*(char*)&byteOrderTest ){ + /* This is a big-endian machine */ + while( z=4003000 + while( z=1300 + while( z= 16){ + sum0 += ((unsigned)z[0] + z[4] + z[8] + z[12]); + sum1 += ((unsigned)z[1] + z[5] + z[9] + z[13]); + sum2 += ((unsigned)z[2] + z[6] + z[10]+ z[14]); + sum += ((unsigned)z[3] + z[7] + z[11]+ z[15]); + z += 16; + N -= 16; + } + while(N >= 4){ + sum0 += z[0]; + sum1 += z[1]; + sum2 += z[2]; + sum += z[3]; + z += 4; + N -= 4; + } + sum += (sum2 << 8) + (sum1 << 16) + (sum0 << 24); +#endif + } + switch(N&3){ + case 3: sum += (z[2] << 8); + case 2: sum += (z[1] << 16); + case 1: sum += (z[0] << 24); + default: ; + } + return sum; +} + +/* +** Create a new delta. +** +** The delta is written into a preallocated buffer, zDelta, which +** should be at least 60 bytes longer than the target file, zOut. +** The delta string will be NUL-terminated, but it might also contain +** embedded NUL characters if either the zSrc or zOut files are +** binary. This function returns the length of the delta string +** in bytes, excluding the final NUL terminator character. +** +** Output Format: +** +** The delta begins with a base64 number followed by a newline. This +** number is the number of bytes in the TARGET file. Thus, given a +** delta file z, a program can compute the size of the output file +** simply by reading the first line and decoding the base-64 number +** found there. The delta_output_size() routine does exactly this. +** +** After the initial size number, the delta consists of a series of +** literal text segments and commands to copy from the SOURCE file. +** A copy command looks like this: +** +** NNN@MMM, +** +** where NNN is the number of bytes to be copied and MMM is the offset +** into the source file of the first byte (both base-64). If NNN is 0 +** it means copy the rest of the input file. Literal text is like this: +** +** NNN:TTTTT +** +** where NNN is the number of bytes of text (base-64) and TTTTT is the text. +** +** The last term is of the form +** +** NNN; +** +** In this case, NNN is a 32-bit bigendian checksum of the output file +** that can be used to verify that the delta applied correctly. All +** numbers are in base-64. +** +** Pure text files generate a pure text delta. Binary files generate a +** delta that may contain some binary data. +** +** Algorithm: +** +** The encoder first builds a hash table to help it find matching +** patterns in the source file. 16-byte chunks of the source file +** sampled at evenly spaced intervals are used to populate the hash +** table. +** +** Next we begin scanning the target file using a sliding 16-byte +** window. The hash of the 16-byte window in the target is used to +** search for a matching section in the source file. When a match +** is found, a copy command is added to the delta. An effort is +** made to extend the matching section to regions that come before +** and after the 16-byte hash window. A copy command is only issued +** if the result would use less space that just quoting the text +** literally. Literal text is added to the delta for sections that +** do not match or which can not be encoded efficiently using copy +** commands. +*/ +static int delta_create( + const char *zSrc, /* The source or pattern file */ + unsigned int lenSrc, /* Length of the source file */ + const char *zOut, /* The target file */ + unsigned int lenOut, /* Length of the target file */ + char *zDelta /* Write the delta into this buffer */ +){ + int i, base; + char *zOrigDelta = zDelta; + hash h; + int nHash; /* Number of hash table entries */ + int *landmark; /* Primary hash table */ + int *collide; /* Collision chain */ + int lastRead = -1; /* Last byte of zSrc read by a COPY command */ + + /* Add the target file size to the beginning of the delta + */ + putInt(lenOut, &zDelta); + *(zDelta++) = '\n'; + + /* If the source file is very small, it means that we have no + ** chance of ever doing a copy command. Just output a single + ** literal segment for the entire target and exit. + */ + if( lenSrc<=NHASH ){ + putInt(lenOut, &zDelta); + *(zDelta++) = ':'; + memcpy(zDelta, zOut, lenOut); + zDelta += lenOut; + putInt(checksum(zOut, lenOut), &zDelta); + *(zDelta++) = ';'; + return zDelta - zOrigDelta; + } + + /* Compute the hash table used to locate matching sections in the + ** source file. + */ + nHash = lenSrc/NHASH; + collide = sqlite3_malloc64( (sqlite3_int64)nHash*2*sizeof(int) ); + memset(collide, -1, nHash*2*sizeof(int)); + landmark = &collide[nHash]; + for(i=0; i=0 && (limit--)>0 ){ + /* + ** The hash window has identified a potential match against + ** landmark block iBlock. But we need to investigate further. + ** + ** Look for a region in zOut that matches zSrc. Anchor the search + ** at zSrc[iSrc] and zOut[base+i]. Do not include anything prior to + ** zOut[base] or after zOut[outLen] nor anything after zSrc[srcLen]. + ** + ** Set cnt equal to the length of the match and set ofst so that + ** zSrc[ofst] is the first element of the match. litsz is the number + ** of characters between zOut[base] and the beginning of the match. + ** sz will be the overhead (in bytes) needed to encode the copy + ** command. Only generate copy command if the overhead of the + ** copy command is less than the amount of literal text to be copied. + */ + int cnt, ofst, litsz; + int j, k, x, y; + int sz; + int limitX; + + /* Beginning at iSrc, match forwards as far as we can. j counts + ** the number of characters that match */ + iSrc = iBlock*NHASH; + y = base+i; + limitX = ( lenSrc-iSrc <= lenOut-y ) ? lenSrc : iSrc + lenOut - y; + for(x=iSrc; x=sz && cnt>bestCnt ){ + /* Remember this match only if it is the best so far and it + ** does not increase the file size */ + bestCnt = cnt; + bestOfst = iSrc-k; + bestLitsz = litsz; + } + + /* Check the next matching block */ + iBlock = collide[iBlock]; + } + + /* We have a copy command that does not cause the delta to be larger + ** than a literal insert. So add the copy command to the delta. + */ + if( bestCnt>0 ){ + if( bestLitsz>0 ){ + /* Add an insert command before the copy */ + putInt(bestLitsz,&zDelta); + *(zDelta++) = ':'; + memcpy(zDelta, &zOut[base], bestLitsz); + zDelta += bestLitsz; + base += bestLitsz; + } + base += bestCnt; + putInt(bestCnt, &zDelta); + *(zDelta++) = '@'; + putInt(bestOfst, &zDelta); + *(zDelta++) = ','; + if( bestOfst + bestCnt -1 > lastRead ){ + lastRead = bestOfst + bestCnt - 1; + } + bestCnt = 0; + break; + } + + /* If we reach this point, it means no match is found so far */ + if( base+i+NHASH>=lenOut ){ + /* We have reached the end of the file and have not found any + ** matches. Do an "insert" for everything that does not match */ + putInt(lenOut-base, &zDelta); + *(zDelta++) = ':'; + memcpy(zDelta, &zOut[base], lenOut-base); + zDelta += lenOut-base; + base = lenOut; + break; + } + + /* Advance the hash by one character. Keep looking for a match */ + hash_next(&h, zOut[base+i+NHASH]); + i++; + } + } + /* Output a final "insert" record to get all the text at the end of + ** the file that does not match anything in the source file. + */ + if( base0 ){ + unsigned int cnt, ofst; + cnt = getInt(&zDelta, &lenDelta); + switch( zDelta[0] ){ + case '@': { + zDelta++; lenDelta--; + ofst = getInt(&zDelta, &lenDelta); + if( lenDelta>0 && zDelta[0]!=',' ){ + /* ERROR: copy command not terminated by ',' */ + return -1; + } + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: copy exceeds output file size */ + return -1; + } + if( ofst+cnt > lenSrc ){ + /* ERROR: copy extends past end of input */ + return -1; + } + memcpy(zOut, &zSrc[ofst], cnt); + zOut += cnt; + break; + } + case ':': { + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: insert command gives an output larger than predicted */ + return -1; + } + if( cnt>lenDelta ){ + /* ERROR: insert count exceeds size of delta */ + return -1; + } + memcpy(zOut, zDelta, cnt); + zOut += cnt; + zDelta += cnt; + lenDelta -= cnt; + break; + } + case ';': { + zDelta++; lenDelta--; + zOut[0] = 0; +#ifdef FOSSIL_ENABLE_DELTA_CKSUM_TEST + if( cnt!=checksum(zOrigOut, total) ){ + /* ERROR: bad checksum */ + return -1; + } +#endif + if( total!=limit ){ + /* ERROR: generated size does not match predicted size */ + return -1; + } + return total; + } + default: { + /* ERROR: unknown delta operator */ + return -1; + } + } + } + /* ERROR: unterminated delta */ + return -1; +} + +/* +** Analyze a delta. Figure out the total number of bytes copied from +** source to target, and the total number of bytes inserted by the delta, +** and return both numbers. +*/ +static int delta_analyze( + const char *zDelta, /* Delta to apply to the pattern */ + int lenDelta, /* Length of the delta */ + int *pnCopy, /* OUT: Number of bytes copied */ + int *pnInsert /* OUT: Number of bytes inserted */ +){ + unsigned int nInsert = 0; + unsigned int nCopy = 0; + + (void)getInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + zDelta++; lenDelta--; + while( *zDelta && lenDelta>0 ){ + unsigned int cnt; + cnt = getInt(&zDelta, &lenDelta); + switch( zDelta[0] ){ + case '@': { + zDelta++; lenDelta--; + (void)getInt(&zDelta, &lenDelta); + if( lenDelta>0 && zDelta[0]!=',' ){ + /* ERROR: copy command not terminated by ',' */ + return -1; + } + zDelta++; lenDelta--; + nCopy += cnt; + break; + } + case ':': { + zDelta++; lenDelta--; + nInsert += cnt; + if( cnt>lenDelta ){ + /* ERROR: insert count exceeds size of delta */ + return -1; + } + zDelta += cnt; + lenDelta -= cnt; + break; + } + case ';': { + *pnCopy = nCopy; + *pnInsert = nInsert; + return 0; + } + default: { + /* ERROR: unknown delta operator */ + return -1; + } + } + } + /* ERROR: unterminated delta */ + return -1; +} + +/* +** SQL functions: fossildelta_create(X,Y) +** +** Return a delta for carrying X into Y. +*/ +static void deltaCreateFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aOrig; int nOrig; /* old blob */ + const char *aNew; int nNew; /* new blob */ + char *aOut; int nOut; /* output delta */ + + assert( argc==2 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + if( sqlite3_value_type(argv[1])==SQLITE_NULL ) return; + nOrig = sqlite3_value_bytes(argv[0]); + aOrig = (const char*)sqlite3_value_blob(argv[0]); + nNew = sqlite3_value_bytes(argv[1]); + aNew = (const char*)sqlite3_value_blob(argv[1]); + aOut = sqlite3_malloc64(nNew+70); + if( aOut==0 ){ + sqlite3_result_error_nomem(context); + }else{ + nOut = delta_create(aOrig, nOrig, aNew, nNew, aOut); + if( nOut<0 ){ + sqlite3_free(aOut); + sqlite3_result_error(context, "cannot create fossil delta", -1); + }else{ + sqlite3_result_blob(context, aOut, nOut, sqlite3_free); + } + } +} + +/* +** SQL functions: fossildelta_apply(X,D) +** +** Return the result of applying delta D to input X. +*/ +static void deltaApplyFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aOrig; int nOrig; /* The X input */ + const char *aDelta; int nDelta; /* The input delta (D) */ + char *aOut; int nOut, nOut2; /* The output */ + + assert( argc==2 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + if( sqlite3_value_type(argv[1])==SQLITE_NULL ) return; + nOrig = sqlite3_value_bytes(argv[0]); + aOrig = (const char*)sqlite3_value_blob(argv[0]); + nDelta = sqlite3_value_bytes(argv[1]); + aDelta = (const char*)sqlite3_value_blob(argv[1]); + + /* Figure out the size of the output */ + nOut = delta_output_size(aDelta, nDelta); + if( nOut<0 ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + return; + } + aOut = sqlite3_malloc64((sqlite3_int64)nOut+1); + if( aOut==0 ){ + sqlite3_result_error_nomem(context); + }else{ + nOut2 = delta_apply(aOrig, nOrig, aDelta, nDelta, aOut); + if( nOut2!=nOut ){ + sqlite3_free(aOut); + sqlite3_result_error(context, "corrupt fossil delta", -1); + }else{ + sqlite3_result_blob(context, aOut, nOut, sqlite3_free); + } + } +} + + +/* +** SQL functions: fossildelta_output_size(D) +** +** Return the size of the output that results from applying delta D. +*/ +static void deltaOutputSizeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aDelta; int nDelta; /* The input delta (D) */ + int nOut; /* Size of output */ + assert( argc==1 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + nDelta = sqlite3_value_bytes(argv[0]); + aDelta = (const char*)sqlite3_value_blob(argv[0]); + + /* Figure out the size of the output */ + nOut = delta_output_size(aDelta, nDelta); + if( nOut<0 ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + return; + }else{ + sqlite3_result_int(context, nOut); + } +} + + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_fossildelta_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + rc = sqlite3_create_function(db, "delta_create", 2, SQLITE_UTF8, 0, + deltaCreateFunc, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "delta_apply", 2, SQLITE_UTF8, 0, + deltaApplyFunc, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "delta_output_size", 1, SQLITE_UTF8, 0, + deltaOutputSizeFunc, 0, 0); + } + return rc; +} diff --git a/manifest b/manifest index c4848176e4..dc80c37b38 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\smemory\sleak\sin\sRBU\sif\sthe\srbu_fossil_delta()\sSQL\sfunction\sis\nmisused.\s\sMisuse\snever\shappens\sin\sa\sworking\sRBU\ssystem,\sso\sthis\sis\snot\sa\s\nparticularly\simportant\sfix. -D 2019-02-19T17:45:31.317 +C Add\sthe\sfossildelta.c\sextension\sin\sext/misc\swith\simplementations\sof\sthe\sFossil\ndelta\sfunctions. +D 2019-02-19T18:39:16.475 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -286,6 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 +F ext/misc/fossildelta.c 64619ac4ff0d865e01f25436fd1b82c3dd7f6bc6184c9a06e002b16a121cd652 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1804,7 +1805,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 f2d400db4dbfb05e2540178ed3662f97f8c57a95f8129886c7081c35e53adf0d -R 8d9f63c20f18bc4035bf1d3926ca6101 +P 12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 +R e38db5ccc4de4d9df319413343ad8fcf U drh -Z 3f3200a2e92dbd4c9a6a6ed07ff60873 +Z 993efe1b585ff08956441be0e9d0910b diff --git a/manifest.uuid b/manifest.uuid index 34fb63dc13..2ff6534024 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 \ No newline at end of file +b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 \ No newline at end of file From 2d441ce3f3c10af9dd884b11cadd5a14ae566b01 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 20:19:51 +0000 Subject: [PATCH 255/306] Add the delta_parse(DELTA) table-valued function to the fossildelta extension. FossilOrigin-Name: d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 --- ext/misc/fossildelta.c | 379 ++++++++++++++++++++++++++++++++++------- manifest | 12 +- manifest.uuid | 2 +- 3 files changed, 320 insertions(+), 73 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index 3d845faa98..d1b5a2c6a0 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -134,7 +134,7 @@ static void putInt(unsigned int v, char **pz){ ** the integer. The *pLen parameter holds the length of the string ** in *pz and is decremented once for each character in the integer. */ -static unsigned int getInt(const char **pz, int *pLen){ +static unsigned int deltaGetInt(const char **pz, int *pLen){ static const signed char zValue[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -484,7 +484,7 @@ static int delta_create( */ static int delta_output_size(const char *zDelta, int lenDelta){ int size; - size = getInt(&zDelta, &lenDelta); + size = deltaGetInt(&zDelta, &lenDelta); if( *zDelta!='\n' ){ /* ERROR: size integer not terminated by "\n" */ return -1; @@ -526,7 +526,7 @@ static int delta_apply( char *zOrigOut = zOut; #endif - limit = getInt(&zDelta, &lenDelta); + limit = deltaGetInt(&zDelta, &lenDelta); if( *zDelta!='\n' ){ /* ERROR: size integer not terminated by "\n" */ return -1; @@ -534,11 +534,11 @@ static int delta_apply( zDelta++; lenDelta--; while( *zDelta && lenDelta>0 ){ unsigned int cnt, ofst; - cnt = getInt(&zDelta, &lenDelta); + cnt = deltaGetInt(&zDelta, &lenDelta); switch( zDelta[0] ){ case '@': { zDelta++; lenDelta--; - ofst = getInt(&zDelta, &lenDelta); + ofst = deltaGetInt(&zDelta, &lenDelta); if( lenDelta>0 && zDelta[0]!=',' ){ /* ERROR: copy command not terminated by ',' */ return -1; @@ -599,67 +599,6 @@ static int delta_apply( return -1; } -/* -** Analyze a delta. Figure out the total number of bytes copied from -** source to target, and the total number of bytes inserted by the delta, -** and return both numbers. -*/ -static int delta_analyze( - const char *zDelta, /* Delta to apply to the pattern */ - int lenDelta, /* Length of the delta */ - int *pnCopy, /* OUT: Number of bytes copied */ - int *pnInsert /* OUT: Number of bytes inserted */ -){ - unsigned int nInsert = 0; - unsigned int nCopy = 0; - - (void)getInt(&zDelta, &lenDelta); - if( *zDelta!='\n' ){ - /* ERROR: size integer not terminated by "\n" */ - return -1; - } - zDelta++; lenDelta--; - while( *zDelta && lenDelta>0 ){ - unsigned int cnt; - cnt = getInt(&zDelta, &lenDelta); - switch( zDelta[0] ){ - case '@': { - zDelta++; lenDelta--; - (void)getInt(&zDelta, &lenDelta); - if( lenDelta>0 && zDelta[0]!=',' ){ - /* ERROR: copy command not terminated by ',' */ - return -1; - } - zDelta++; lenDelta--; - nCopy += cnt; - break; - } - case ':': { - zDelta++; lenDelta--; - nInsert += cnt; - if( cnt>lenDelta ){ - /* ERROR: insert count exceeds size of delta */ - return -1; - } - zDelta += cnt; - lenDelta -= cnt; - break; - } - case ';': { - *pnCopy = nCopy; - *pnInsert = nInsert; - return 0; - } - default: { - /* ERROR: unknown delta operator */ - return -1; - } - } - } - /* ERROR: unterminated delta */ - return -1; -} - /* ** SQL functions: fossildelta_create(X,Y) ** @@ -765,6 +704,311 @@ static void deltaOutputSizeFunc( } } +/* The deltaparse(DELTA) table-valued function parses the DELTA in +** its input and returns a table that describes that delta. +*/ +typedef struct deltaparsevtab_vtab deltaparsevtab_vtab; +typedef struct deltaparsevtab_cursor deltaparsevtab_cursor; +struct deltaparsevtab_vtab { + sqlite3_vtab base; /* Base class - must be first */ + /* No additional information needed */ +}; +struct deltaparsevtab_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + char *aDelta; /* The delta being parsed */ + int nDelta; /* Number of bytes in the delta */ + int iCursor; /* Current cursor location */ + int eOp; /* Name of current operator */ + unsigned int a1, a2; /* Arguments to current operator */ + int iNext; /* Next cursor value */ +}; + +/* Operator names: +*/ +static const char *azOp[] = { + "SIZE", "COPY", "INSERT", "CHECKSUM", "ERROR", "EOF" +}; +#define DELTAPARSE_OP_SIZE 0 +#define DELTAPARSE_OP_COPY 1 +#define DELTAPARSE_OP_INSERT 2 +#define DELTAPARSE_OP_CHECKSUM 3 +#define DELTAPARSE_OP_ERROR 4 +#define DELTAPARSE_OP_EOF 5 + +/* +** The deltaparsevtabConnect() method is invoked to create a new +** deltaparse virtual table. +** +** Think of this routine as the constructor for deltaparsevtab_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the deltaparsevtab_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against the virtual table will look like. +*/ +static int deltaparsevtabConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + deltaparsevtab_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(op,a1,a2,delta HIDDEN)" + ); + /* For convenience, define symbolic names for the index to each column. */ +#define DELTAPARSEVTAB_OP 0 +#define DELTAPARSEVTAB_A1 1 +#define DELTAPARSEVTAB_A2 2 +#define DELTAPARSEVTAB_DELTA 3 + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc64( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +/* +** This method is the destructor for deltaparsevtab_vtab objects. +*/ +static int deltaparsevtabDisconnect(sqlite3_vtab *pVtab){ + deltaparsevtab_vtab *p = (deltaparsevtab_vtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Constructor for a new deltaparsevtab_cursor object. +*/ +static int deltaparsevtabOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + deltaparsevtab_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Destructor for a deltaparsevtab_cursor. +*/ +static int deltaparsevtabClose(sqlite3_vtab_cursor *cur){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + sqlite3_free(pCur); + return SQLITE_OK; +} + + +/* +** Advance a deltaparsevtab_cursor to its next row of output. +*/ +static int deltaparsevtabNext(sqlite3_vtab_cursor *cur){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + const char *z; + int i = 0; + + pCur->iCursor = pCur->iNext; + z = pCur->aDelta + pCur->iCursor; + pCur->a1 = deltaGetInt(&z, &i); + switch( z[0] ){ + case '@': { + z++; + pCur->a2 = deltaGetInt(&z, &i); + pCur->eOp = DELTAPARSE_OP_COPY; + pCur->iNext = (int)(&z[1] - pCur->aDelta); + break; + } + case ':': { + z++; + pCur->a2 = (unsigned int)(z - pCur->aDelta); + pCur->eOp = DELTAPARSE_OP_INSERT; + pCur->iNext = (int)(&z[pCur->a1] - pCur->aDelta); + break; + } + case ';': { + pCur->eOp = DELTAPARSE_OP_CHECKSUM; + pCur->iNext = pCur->nDelta; + break; + } + default: { + if( pCur->iNext==pCur->nDelta ){ + pCur->eOp = DELTAPARSE_OP_EOF; + }else{ + pCur->eOp = DELTAPARSE_OP_ERROR; + pCur->iNext = pCur->nDelta; + } + break; + } + } + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the deltaparsevtab_cursor +** is currently pointing. +*/ +static int deltaparsevtabColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + switch( i ){ + case DELTAPARSEVTAB_OP: { + sqlite3_result_text(ctx, azOp[pCur->eOp], -1, SQLITE_STATIC); + break; + } + case DELTAPARSEVTAB_A1: { + sqlite3_result_int(ctx, pCur->a1); + break; + } + case DELTAPARSEVTAB_A2: { + if( pCur->eOp==DELTAPARSE_OP_COPY ){ + sqlite3_result_int(ctx, pCur->a2); + }else if( pCur->eOp==DELTAPARSE_OP_INSERT ){ + sqlite3_result_blob(ctx, pCur->aDelta+pCur->a2, pCur->a1, + SQLITE_TRANSIENT); + } + break; + } + case DELTAPARSEVTAB_DELTA: { + sqlite3_result_blob(ctx, pCur->aDelta, pCur->nDelta, SQLITE_TRANSIENT); + break; + } + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int deltaparsevtabRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + *pRowid = pCur->iCursor; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int deltaparsevtabEof(sqlite3_vtab_cursor *cur){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor*)cur; + return pCur->eOp==DELTAPARSE_OP_EOF; +} + +/* +** This method is called to "rewind" the deltaparsevtab_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to deltaparsevtabColumn() or deltaparsevtabRowid() or +** deltaparsevtabEof(). +*/ +static int deltaparsevtabFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + deltaparsevtab_cursor *pCur = (deltaparsevtab_cursor *)pVtabCursor; + const char *a; + int i = 0; + pCur->eOp = DELTAPARSE_OP_ERROR; + if( idxNum!=1 ){ + return SQLITE_OK; + } + pCur->nDelta = sqlite3_value_bytes(argv[0]); + a = (const char*)sqlite3_value_blob(argv[0]); + if( pCur->nDelta==0 || a==0 ){ + return SQLITE_OK; + } + pCur->aDelta = sqlite3_malloc64( pCur->nDelta+1 ); + if( pCur->aDelta==0 ){ + pCur->nDelta = 0; + return SQLITE_NOMEM; + } + memcpy(pCur->aDelta, a, pCur->nDelta); + pCur->aDelta[pCur->nDelta] = 0; + a = pCur->aDelta; + pCur->eOp = DELTAPARSE_OP_SIZE; + pCur->a1 = deltaGetInt(&a, &i); + if( a[0]!='\n' ){ + pCur->eOp = DELTAPARSE_OP_ERROR; + pCur->a1 = pCur->a2 = 0; + pCur->iNext = pCur->nDelta; + return SQLITE_OK; + } + a++; + pCur->iNext = (unsigned int)(a - pCur->aDelta); + return SQLITE_OK; +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +*/ +static int deltaparsevtabBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; + for(i=0; inConstraint; i++){ + if( pIdxInfo->aConstraint[i].iColumn != DELTAPARSEVTAB_DELTA ) continue; + if( pIdxInfo->aConstraint[i].usable==0 ) continue; + if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->estimatedCost = (double)1; + pIdxInfo->estimatedRows = 10; + pIdxInfo->idxNum = 1; + return SQLITE_OK; + } + pIdxInfo->idxNum = 0; + pIdxInfo->estimatedCost = (double)0x7fffffff; + pIdxInfo->estimatedRows = 0x7fffffff; + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** virtual table. +*/ +static sqlite3_module deltaparsevtabModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ deltaparsevtabConnect, + /* xBestIndex */ deltaparsevtabBestIndex, + /* xDisconnect */ deltaparsevtabDisconnect, + /* xDestroy */ 0, + /* xOpen */ deltaparsevtabOpen, + /* xClose */ deltaparsevtabClose, + /* xFilter */ deltaparsevtabFilter, + /* xNext */ deltaparsevtabNext, + /* xEof */ deltaparsevtabEof, + /* xColumn */ deltaparsevtabColumn, + /* xRowid */ deltaparsevtabRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0 +}; + + #ifdef _WIN32 __declspec(dllexport) @@ -787,5 +1031,8 @@ int sqlite3_fossildelta_init( rc = sqlite3_create_function(db, "delta_output_size", 1, SQLITE_UTF8, 0, deltaOutputSizeFunc, 0, 0); } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_module(db, "delta_parse", &deltaparsevtabModule, 0); + } return rc; } diff --git a/manifest b/manifest index dc80c37b38..3affb0af3f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sfossildelta.c\sextension\sin\sext/misc\swith\simplementations\sof\sthe\sFossil\ndelta\sfunctions. -D 2019-02-19T18:39:16.475 +C Add\sthe\sdelta_parse(DELTA)\stable-valued\sfunction\sto\sthe\sfossildelta\nextension. +D 2019-02-19T20:19:51.952 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -286,7 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 -F ext/misc/fossildelta.c 64619ac4ff0d865e01f25436fd1b82c3dd7f6bc6184c9a06e002b16a121cd652 +F ext/misc/fossildelta.c 990fcc25a41be22c648d3e362f5d4616562869c613e75790bf71fa7c54d029fa F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1805,7 +1805,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 12517d1b15da46bc90bd95bb9c161d7f2ecdd7f28b1b3a5ed4397939ef986061 -R e38db5ccc4de4d9df319413343ad8fcf +P b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 +R 28b47243faa86a15a5dab72f9f6d43db U drh -Z 993efe1b585ff08956441be0e9d0910b +Z 704f00932f29d8380bf4a3f8f9e7b2af diff --git a/manifest.uuid b/manifest.uuid index 2ff6534024..57af7c8c30 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 \ No newline at end of file +d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 \ No newline at end of file From 2a98b586c8f4c9b00e64d77668917ce8fc0304b9 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 19 Feb 2019 20:29:05 +0000 Subject: [PATCH 256/306] Enhance the xBestIndex method on delta_parse() to return SQLITE_CONSTRAINT if no delta argument is supplied. FossilOrigin-Name: f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 --- ext/misc/fossildelta.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index d1b5a2c6a0..7a9c5c1d72 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -974,7 +974,7 @@ static int deltaparsevtabBestIndex( pIdxInfo->idxNum = 0; pIdxInfo->estimatedCost = (double)0x7fffffff; pIdxInfo->estimatedRows = 0x7fffffff; - return SQLITE_OK; + return SQLITE_CONSTRAINT; } /* diff --git a/manifest b/manifest index 3affb0af3f..eb13e2dec5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sdelta_parse(DELTA)\stable-valued\sfunction\sto\sthe\sfossildelta\nextension. -D 2019-02-19T20:19:51.952 +C Enhance\sthe\sxBestIndex\smethod\son\sdelta_parse()\sto\sreturn\sSQLITE_CONSTRAINT\sif\nno\sdelta\sargument\sis\ssupplied. +D 2019-02-19T20:29:05.526 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -286,7 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 -F ext/misc/fossildelta.c 990fcc25a41be22c648d3e362f5d4616562869c613e75790bf71fa7c54d029fa +F ext/misc/fossildelta.c 31b64084789228ac0d1113e5e39dc79c2ae16dd131d5c988ad9550ae1b9bc4b4 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1805,7 +1805,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 b80cafa6f8a5c6ff1dc9efd2f670777ab131ace2df1eb431cedc8cfa901baf18 -R 28b47243faa86a15a5dab72f9f6d43db +P d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 +R c6e533968a2ece3b69b351a227132130 U drh -Z 704f00932f29d8380bf4a3f8f9e7b2af +Z d8453dece5a7987c62030d39d3c1b091 diff --git a/manifest.uuid b/manifest.uuid index 57af7c8c30..f9ba20353f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 \ No newline at end of file +f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 \ No newline at end of file From 042666e4fa379ddd29eb049d77319e32dc94126f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 12:52:47 +0000 Subject: [PATCH 257/306] When an IN operator drives a query loop, mark it as "CODED" so that it will not be used afterwards for a (pointless) membership test. This is a better fix for ticket [df46dfb631f75694] than the previous fix that is now on a branch as it preserves the full optimization of check-in [e130319317e76119]. FossilOrigin-Name: fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b --- manifest | 14 +++++------ manifest.uuid | 2 +- src/wherecode.c | 1 + test/in.test | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index eb13e2dec5..b85d244af4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sxBestIndex\smethod\son\sdelta_parse()\sto\sreturn\sSQLITE_CONSTRAINT\sif\nno\sdelta\sargument\sis\ssupplied. -D 2019-02-19T20:29:05.526 +C When\san\sIN\soperator\sdrives\sa\squery\sloop,\smark\sit\sas\s"CODED"\sso\sthat\sit\nwill\snot\sbe\sused\safterwards\sfor\sa\s(pointless)\smembership\stest.\s\sThis\sis\na\sbetter\sfix\sfor\sticket\s[df46dfb631f75694]\sthan\sthe\sprevious\sfix\sthat\sis\nnow\son\sa\sbranch\sas\sit\spreserves\sthe\sfull\soptimization\sof\ncheck-in\s[e130319317e76119]. +D 2019-02-20T12:52:47.452 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -602,7 +602,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c a571d8d7c19d6db786a201f2df8788b320fefcb2842f2a1eb9a85b85e91bc35f +F src/wherecode.c 5ee878f714218352a2f452907572d4bf1e4303393288458f87ffc86edaf2cfbe F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1007,7 +1007,7 @@ F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 41aa8847745a879b897a7febea0f8f9efc8e67fe8bf680589b6e07c7b0a1569a F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test 2fa2dfba1afe30eb830f327e7131dfadaa7a701d677de0eb65f9303d99e18fe0 +F test/in.test 63933d7b71eed01a49df55541a73a75398302b50a05b5333f90481460a32ff49 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068 @@ -1805,7 +1805,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 d91fcc267bf1be795dfdb1fbfb40c2aea79ddff247a51d26462136c325b7a6d3 -R c6e533968a2ece3b69b351a227132130 +P f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 +R 305348511782a1081a30b2475753ee53 U drh -Z d8453dece5a7987c62030d39d3c1b091 +Z ef9d1f96fc42c68bd56fd0d4769bee0b diff --git a/manifest.uuid b/manifest.uuid index f9ba20353f..a0b2fe474e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 \ No newline at end of file +fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 19315779bf..5441752ed1 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1344,6 +1344,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; + pTerm->wtFlags |= TERM_CODED; }else if( (pLoop->wsFlags & WHERE_IPK)!=0 && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 ){ diff --git a/test/in.test b/test/in.test index 478c0087b8..246cd76edf 100644 --- a/test/in.test +++ b/test/in.test @@ -651,4 +651,68 @@ do_execsql_test in-14.1 { SELECT * FROM c1 WHERE a IN (SELECT a FROM c1) ORDER BY 1 } {1 2 3 4} +# 2019-02-20 Ticket https://www.sqlite.org/src/tktview/df46dfb631f75694fbb97033b69 +# +do_execsql_test in-15.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE IF NOT EXISTS t1(id INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES(1); + SELECT a.id FROM t1 AS a JOIN t1 AS b ON a.id=b.id WHERE a.id IN (1,2,3); +} {1} +do_execsql_test in-15.1 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER PRIMARY KEY,b); + INSERT INTO t2 VALUES(1,11); + INSERT INTO t2 VALUES(2,22); + INSERT INTO t2 VALUES(3,33); + SELECT b, a IN (3,4,5) FROM t2 ORDER BY b; +} {11 0 22 0 33 1} +do_execsql_test in-15.2 { + DROP TABLE IF EXISTS t3; + CREATE TABLE t3(x INTEGER PRIMARY KEY); + INSERT INTO t3 VALUES(8); + SELECT CASE WHEN x NOT IN (5,6,7) THEN 'yes' ELSE 'no' END FROM t3; + SELECT CASE WHEN x NOT IN (NULL,6,7) THEN 'yes' ELSE 'no' END FROM t3; +} {yes no} +do_execsql_test in-15.3 { + SELECT CASE WHEN x NOT IN (5,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; + SELECT CASE WHEN x NOT IN (NULL,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; +} {yes no} +do_execsql_test in-15.4 { + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(a INTEGER PRIMARY KEY, b INT); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20) + INSERT INTO t4(a,b) SELECT x, x+100 FROM c; + SELECT b FROM t4 WHERE a IN (3,null,8) ORDER BY +b; +} {103 108} +do_execsql_test in-15.5 { + SELECT b FROM t4 WHERE a NOT IN (3,null,8); +} {} +do_execsql_test in-15.6 { + DROP TABLE IF EXISTS t5; + DROP TABLE IF EXISTS t6; + CREATE TABLE t5(id INTEGER PRIMARY KEY, name TEXT); + CREATE TABLE t6(id INTEGER PRIMARY KEY, name TEXT, t5_id INT); + INSERT INTO t5 VALUES(1,'Alice'),(2,'Emma'); + INSERT INTO t6 VALUES(1,'Bob',1),(2,'Cindy',1),(3,'Dave',2); + SELECT a.* + FROM t5 AS 'a' JOIN t5 AS 'b' ON b.id=a.id + WHERE b.id IN ( + SELECT t6.t5_id + FROM t6 + WHERE name='Bob' + AND t6.t5_id IS NOT NULL + AND t6.id IN ( + SELECT id + FROM (SELECT t6.id, count(*) AS x + FROM t6 + WHERE name='Bob' + ) AS 't' + WHERE x=1 + ) + AND t6.id IN (1,id) + ); +} {1 Alice} + + finish_test From b1af9c603c70535a61b5785a4b29ce9cecc8f78d Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 13:55:45 +0000 Subject: [PATCH 258/306] Progress handler improvements: (1) Invoke the callback after OP_Program opcodes (2) Invoke the callback multiple times in a row to catch up after a long run of no progress checks. FossilOrigin-Name: 0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index b85d244af4..7586b9cdec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\san\sIN\soperator\sdrives\sa\squery\sloop,\smark\sit\sas\s"CODED"\sso\sthat\sit\nwill\snot\sbe\sused\safterwards\sfor\sa\s(pointless)\smembership\stest.\s\sThis\sis\na\sbetter\sfix\sfor\sticket\s[df46dfb631f75694]\sthan\sthe\sprevious\sfix\sthat\sis\nnow\son\sa\sbranch\sas\sit\spreserves\sthe\sfull\soptimization\sof\ncheck-in\s[e130319317e76119]. -D 2019-02-20T12:52:47.452 +C Progress\shandler\simprovements:\n(1)\sInvoke\sthe\scallback\safter\sOP_Program\sopcodes\n(2)\sInvoke\sthe\scallback\smultiple\stimes\sin\sa\srow\sto\scatch\sup\safter\sa\nlong\srun\sof\sno\sprogress\schecks. +D 2019-02-20T13:55:45.206 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -586,7 +586,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c c67c8c46bea825421ee97511328fe1405537b586cbbe4db06e17c4ac5ab4dbed +F src/vdbe.c f11f5b935d0858ffeb3b2f0f50d9f4c368b8100c2ae6761178828e2aa38b63f2 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1805,7 +1805,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 f16d127c3b4a735afae1fc236bcf90f31adff079c7d3a896f901d908ff8b8532 -R 305348511782a1081a30b2475753ee53 +P fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b +R cb450b63e0ffca7c3eab4ce48996cd46 U drh -Z ef9d1f96fc42c68bd56fd0d4769bee0b +Z b23f78f7b715d3492f6587cfb6b97b37 diff --git a/manifest.uuid b/manifest.uuid index a0b2fe474e..d00de21324 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b \ No newline at end of file +0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 880d16adfe..e536238524 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -819,9 +819,9 @@ check_for_interrupt: ** If the progress callback returns non-zero, exit the virtual machine with ** a return code SQLITE_ABORT. */ - if( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ assert( db->nProgressOps!=0 ); - nProgressLimit = nVmStep + db->nProgressOps - (nVmStep%db->nProgressOps); + nProgressLimit += db->nProgressOps; if( db->xProgress(db->pProgressArg) ){ nProgressLimit = 0xffffffff; rc = SQLITE_INTERRUPT; @@ -6174,8 +6174,7 @@ case OP_Program: { /* jump */ } #endif pOp = &aOp[-1]; - - break; + goto check_for_interrupt; } /* Opcode: Param P1 P2 * * * @@ -7585,7 +7584,8 @@ abort_due_to_error: ** top. */ vdbe_return: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK - if( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + while( nVmStep>=nProgressLimit && db->xProgress!=0 ){ + nProgressLimit += db->nProgressOps; if( db->xProgress(db->pProgressArg) ){ nProgressLimit = 0xffffffff; rc = SQLITE_INTERRUPT; From 8cf92890f28ace3c510c448b5be6de2ca96016c2 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 18:13:57 +0000 Subject: [PATCH 259/306] Avoid the use of function pointers in columnName(), as function pointers appear to be a source of consternation to LLVM. FossilOrigin-Name: c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeapi.c | 46 ++++++++++++++++++++-------------------------- 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/manifest b/manifest index 7586b9cdec..8de63b54bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Progress\shandler\simprovements:\n(1)\sInvoke\sthe\scallback\safter\sOP_Program\sopcodes\n(2)\sInvoke\sthe\scallback\smultiple\stimes\sin\sa\srow\sto\scatch\sup\safter\sa\nlong\srun\sof\sno\sprogress\schecks. -D 2019-02-20T13:55:45.206 +C Avoid\sthe\suse\sof\sfunction\spointers\sin\scolumnName(),\sas\sfunction\spointers\nappear\sto\sbe\sa\ssource\sof\sconsternation\sto\sLLVM. +D 2019-02-20T18:13:57.436 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -589,7 +589,7 @@ F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca F src/vdbe.c f11f5b935d0858ffeb3b2f0f50d9f4c368b8100c2ae6761178828e2aa38b63f2 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f -F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 +F src/vdbeapi.c cde63790c9d18ba5941d52c9f49e1a862cf6503141d5b9c112a05eb0adbf30a9 F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 3e89e087df928eba80e520824078dc563c579a0848b1557ac36845ec14392923 @@ -1805,7 +1805,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 fa792714ae62fa980f1767acc6d622a6727ceb677870243c88548423795dcb5b -R cb450b63e0ffca7c3eab4ce48996cd46 +P 0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b +R f560accc195a8327b3c508cd93ca6133 U drh -Z b23f78f7b715d3492f6587cfb6b97b37 +Z c7b49bfb62bb08bc015b1f1c480e7f4b diff --git a/manifest.uuid b/manifest.uuid index d00de21324..714e64dc0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b \ No newline at end of file +c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 \ No newline at end of file diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 23b19273b6..5b9ba4d89c 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1120,10 +1120,10 @@ int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ ** or a constant) then useTypes 2, 3, and 4 return NULL. */ static const void *columnName( - sqlite3_stmt *pStmt, - int N, - const void *(*xFunc)(Mem*), - int useType + sqlite3_stmt *pStmt, /* The statement */ + int N, /* Which column to get the name for */ + int useUtf16, /* True to return the name as UTF16 */ + int useType /* What type of name */ ){ const void *ret; Vdbe *p; @@ -1144,8 +1144,12 @@ static const void *columnName( N += useType*n; sqlite3_mutex_enter(db->mutex); assert( db->mallocFailed==0 ); - ret = xFunc(&p->aColName[N]); - /* A malloc may have failed inside of the xFunc() call. If this + if( useUtf16 ){ + ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); + }else{ + ret = sqlite3_value_text((sqlite3_value*)&p->aColName[N]); + } + /* A malloc may have failed inside of the _text() call. If this ** is the case, clear the mallocFailed flag and return NULL. */ if( db->mallocFailed ){ @@ -1162,13 +1166,11 @@ static const void *columnName( ** statement pStmt. */ const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME); + return columnName(pStmt, N, 0, COLNAME_NAME); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME); + return columnName(pStmt, N, 1, COLNAME_NAME); } #endif @@ -1187,13 +1189,11 @@ const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){ ** of the result set of SQL statement pStmt. */ const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE); + return columnName(pStmt, N, 0, COLNAME_DECLTYPE); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE); + return columnName(pStmt, N, 1, COLNAME_DECLTYPE); } #endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_OMIT_DECLTYPE */ @@ -1205,13 +1205,11 @@ const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE); + return columnName(pStmt, N, 0, COLNAME_DATABASE); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE); + return columnName(pStmt, N, 1, COLNAME_DATABASE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -1221,13 +1219,11 @@ const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE); + return columnName(pStmt, N, 0, COLNAME_TABLE); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE); + return columnName(pStmt, N, 1, COLNAME_TABLE); } #endif /* SQLITE_OMIT_UTF16 */ @@ -1237,13 +1233,11 @@ const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){ ** anything else which is not an unambiguous reference to a database column. */ const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN); + return columnName(pStmt, N, 0, COLNAME_COLUMN); } #ifndef SQLITE_OMIT_UTF16 const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ - return columnName( - pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN); + return columnName(pStmt, N, 1, COLNAME_COLUMN); } #endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_ENABLE_COLUMN_METADATA */ From 7e85e9033ff34f8f75e5bb56152be39be39a62a5 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 19:06:16 +0000 Subject: [PATCH 260/306] Disable unix-specific features of dbfuzz2 when compiling on windows. FossilOrigin-Name: af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz2.c | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 8de63b54bc..2f0d2e78db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sthe\suse\sof\sfunction\spointers\sin\scolumnName(),\sas\sfunction\spointers\nappear\sto\sbe\sa\ssource\sof\sconsternation\sto\sLLVM. -D 2019-02-20T18:13:57.436 +C Disable\sunix-specific\sfeatures\sof\sdbfuzz2\swhen\scompiling\son\swindows. +D 2019-02-20T19:06:16.881 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -785,7 +785,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 29b6c6b39a701b6b5b08035c637674b76e1ecea515b1a184b29e3bd0f2d02dad F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 5d5eb817dc8195e0228227510ee6a4b49f46e679fc2d5be96841cce819bf42f7 +F test/dbfuzz2.c 1065d6debd1003c70dccc498c54fd18f4e9da2a73943ba4a953be7dcaf4f724e F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1805,7 +1805,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 0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b -R f560accc195a8327b3c508cd93ca6133 +P c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 +R c53acd05ed5644e7475bccbd6fd360d7 U drh -Z c7b49bfb62bb08bc015b1f1c480e7f4b +Z 28f4d380ceac9c7278e8092207ce3937 diff --git a/manifest.uuid b/manifest.uuid index 714e64dc0b..7861669d7a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 \ No newline at end of file +af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 1649d42d54..caf39215e1 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -43,8 +43,10 @@ #include #include #include +#ifndef _WIN32 #include #include +#endif #include "sqlite3.h" /* @@ -261,6 +263,7 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ szMax = strtol(argv[++i], 0, 0); continue; } +#ifndef _WIN32 if( strcmp(z,"max-stack")==0 || strcmp(z,"max-data")==0 || strcmp(z,"max-as")==0 @@ -291,6 +294,7 @@ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ zType, (int)x.rlim_cur, (int)y.rlim_cur); continue; } +#endif /* _WIN32 */ } argv[j++] = argv[i]; } From 6a1bfc9a6d5b2367a84d367290d3bf5dba708a16 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Feb 2019 19:20:16 +0000 Subject: [PATCH 261/306] Changes to the unix VFS that allegedly enable it to build of Fuchsia. We have no way of testing this. FossilOrigin-Name: be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/os_unix.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 2f0d2e78db..20f026f991 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sunix-specific\sfeatures\sof\sdbfuzz2\swhen\scompiling\son\swindows. -D 2019-02-20T19:06:16.881 +C Changes\sto\sthe\sunix\sVFS\sthat\sallegedly\senable\sit\sto\sbuild\sof\sFuchsia.\nWe\shave\sno\sway\sof\stesting\sthis. +D 2019-02-20T19:20:16.043 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -499,7 +499,7 @@ F src/os.c 8aeb0b0f40f8f5b0da03fe49706695adaf42d2f516ab95abc72e86c245e119de F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0 +F src/os_unix.c 2b9604eb5c12f40a0613e832b6267f5814f84479d570d482ba6f98d7affa7c1c F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 38022624ac9fba1f601d3068d7c393fcc909727fccab556242c93d9c7897b640 @@ -1805,7 +1805,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 c48f6f39c5f89a338fed7153553a27a5d882d4d8db8221e911b96e0dd57c53d9 -R c53acd05ed5644e7475bccbd6fd360d7 +P af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb +R a6f27facbdb7dc40d5575aa8c5ace55a U drh -Z 28f4d380ceac9c7278e8092207ce3937 +Z ca0997b8ac8e61eb0d0c0b024412021b diff --git a/manifest.uuid b/manifest.uuid index 7861669d7a..82410f900a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb \ No newline at end of file +be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index f20763e5b0..4e434334b8 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -7822,6 +7822,9 @@ int sqlite3_os_init(void){ UNIXVFS("unix", autolockIoFinder ), #elif OS_VXWORKS UNIXVFS("unix", vxworksIoFinder ), +#elif __Fuchsia__ + /* We are told that Fuchsia only supports dot-file locking */ + UNIXVFS("unix", dotlockIoFinder ), #else UNIXVFS("unix", posixIoFinder ), #endif From dbdddc99d83130fe22ed63a4bfc19a53a408c51b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 21 Feb 2019 16:41:34 +0000 Subject: [PATCH 262/306] Detect oversized strings in the OP_String opcode even if the P4 argument is originally UTF8 and has to be converted to UTF16 to match the database file and that conversion causes the string to become shorter and cross below SQLITE_LIMIT_LENGTH threshold. This might fix an OSSFuzz problem that we have been so far unable to reproduce. FossilOrigin-Name: c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 20f026f991..ea467fade7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\sthe\sunix\sVFS\sthat\sallegedly\senable\sit\sto\sbuild\sof\sFuchsia.\nWe\shave\sno\sway\sof\stesting\sthis. -D 2019-02-20T19:20:16.043 +C Detect\soversized\sstrings\sin\sthe\sOP_String\sopcode\seven\sif\sthe\sP4\sargument\nis\soriginally\sUTF8\sand\shas\sto\sbe\sconverted\sto\sUTF16\sto\smatch\sthe\sdatabase\nfile\sand\sthat\sconversion\scauses\sthe\sstring\sto\sbecome\sshorter\sand\scross\nbelow\sSQLITE_LIMIT_LENGTH\sthreshold.\s\sThis\smight\sfix\san\sOSSFuzz\sproblem\nthat\swe\shave\sbeen\sso\sfar\sunable\sto\sreproduce. +D 2019-02-21T16:41:34.321 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -586,7 +586,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c f11f5b935d0858ffeb3b2f0f50d9f4c368b8100c2ae6761178828e2aa38b63f2 +F src/vdbe.c c2ebe27a1e4176f5e4b48269917b7a3df096b125d3c407da90e769a9fe4e406e F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c cde63790c9d18ba5941d52c9f49e1a862cf6503141d5b9c112a05eb0adbf30a9 @@ -1805,7 +1805,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 af84774d1eebcfe6a61b564b4edf280ad3c3a93f39b7f70b6fcc56f7bbdfb9eb -R a6f27facbdb7dc40d5575aa8c5ace55a +P be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 +R c5273df2e86448fbe31848ca521a60a4 U drh -Z ca0997b8ac8e61eb0d0c0b024412021b +Z 34aa1885dbc38a0426f19597b6e0799d diff --git a/manifest.uuid b/manifest.uuid index 82410f900a..a0f17d4ac0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 \ No newline at end of file +c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index e536238524..5085273bc7 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1102,6 +1102,7 @@ case OP_String8: { /* same as TK_STRING, out2 */ if( encoding!=SQLITE_UTF8 ){ rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC); assert( rc==SQLITE_OK || rc==SQLITE_TOOBIG ); + if( rc ) goto too_big; if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem; assert( pOut->szMalloc>0 && pOut->zMalloc==pOut->z ); assert( VdbeMemDynamic(pOut)==0 ); @@ -1114,7 +1115,6 @@ case OP_String8: { /* same as TK_STRING, out2 */ pOp->p4.z = pOut->z; pOp->p1 = pOut->n; } - testcase( rc==SQLITE_TOOBIG ); #endif if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; From 255a81f10a5885a17d99ea20e13e1641029e6e3b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 22 Feb 2019 15:42:10 +0000 Subject: [PATCH 263/306] Modify sqlite3_str_finish() and sqlite3VMPrintf() so that they always return NULL on any OOM or SQLITE_LIMIT_LENGTH error. FossilOrigin-Name: e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/printf.c | 8 ++++---- test/printf.test | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index ea467fade7..1cfea83bdc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Detect\soversized\sstrings\sin\sthe\sOP_String\sopcode\seven\sif\sthe\sP4\sargument\nis\soriginally\sUTF8\sand\shas\sto\sbe\sconverted\sto\sUTF16\sto\smatch\sthe\sdatabase\nfile\sand\sthat\sconversion\scauses\sthe\sstring\sto\sbecome\sshorter\sand\scross\nbelow\sSQLITE_LIMIT_LENGTH\sthreshold.\s\sThis\smight\sfix\san\sOSSFuzz\sproblem\nthat\swe\shave\sbeen\sso\sfar\sunable\sto\sreproduce. -D 2019-02-21T16:41:34.321 +C Modify\ssqlite3_str_finish()\sand\ssqlite3VMPrintf()\sso\sthat\sthey\salways\nreturn\sNULL\son\sany\sOOM\sor\sSQLITE_LIMIT_LENGTH\serror. +D 2019-02-22T15:42:10.523 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -511,7 +511,7 @@ F src/pcache1.c a72804486dfa8e4b6bc30d666c97ecf1155f91a4351fc6e48ea4097e4eb304fb F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 -F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a +F src/printf.c 93a3d539019264683a444bc043c875e9a6cca43fe935ae7bf6cfff0af3bba118 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 1588690ee4cc39b4b9ea3230d4e3543d5ec3b5e898c87521f1375af0f1934cd4 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 @@ -1205,7 +1205,7 @@ F test/pragma4.test 52d8186f9e8d09b87189432cdd401dfa66d0b32445e837fa19046c8ae762 F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 -F test/printf.test a3e559bc9d922e7fe44e9d05c6965fee34fe3bc28300a4248c6a063425246ffd +F test/printf.test 0300699733e53101b2ce48800518427249edd4053bb50fa0621c6607482f0fdb F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc @@ -1805,7 +1805,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 be21a6416d47ff7db995006a0422b745044d9b8bb5bad3c53342aa6e2e524771 -R c5273df2e86448fbe31848ca521a60a4 +P c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 +R 86ff0d78e3b0371bb1c17329fcb2b62e U drh -Z 34aa1885dbc38a0426f19597b6e0799d +Z 1f9977e43574c881ad05ccf22d06573e diff --git a/manifest.uuid b/manifest.uuid index a0f17d4ac0..07a899e00e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 \ No newline at end of file +e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index f11fb66641..3a12f51b39 100644 --- a/src/printf.c +++ b/src/printf.c @@ -136,7 +136,7 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ static void setStrAccumError(StrAccum *p, u8 eError){ assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG ); p->accError = eError; - p->nAlloc = 0; + if( p->mxAlloc ) sqlite3_str_reset(p); } /* @@ -166,6 +166,7 @@ static char *getTextArg(PrintfArguments *p){ */ static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ char *z; + if( pAccum->accError ) return 0; if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ setStrAccumError(pAccum, SQLITE_TOOBIG); return 0; @@ -885,9 +886,8 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ return 0; } if( p->mxAlloc==0 ){ - N = p->nAlloc - p->nChar - 1; setStrAccumError(p, SQLITE_TOOBIG); - return N; + return p->nAlloc - p->nChar - 1; }else{ char *zOld = isMalloced(p) ? p->zText : 0; i64 szNew = p->nChar; @@ -959,7 +959,7 @@ void sqlite3_str_append(sqlite3_str *p, const char *z, int N){ assert( z!=0 || N==0 ); assert( p->zText!=0 || p->nChar==0 || p->accError ); assert( N>=0 ); - assert( p->accError==0 || p->nAlloc==0 ); + assert( p->accError==0 || p->nAlloc==0 || p->mxAlloc==0 ); if( p->nChar+N >= p->nAlloc ){ enlargeAndAppend(p,z,N); }else if( N ){ diff --git a/test/printf.test b/test/printf.test index d768898fb9..d099da8fa2 100644 --- a/test/printf.test +++ b/test/printf.test @@ -540,7 +540,7 @@ do_test printf-2.1.2.9 { } {abc: 1 1 (1e-20) :xyz} do_test printf-2.1.2.10 { sqlite3_mprintf_double {abc: %*.*f} 2000000000 1000000000 1.0e-20 -} {abc: } +} {} do_test printf-2.1.3.1 { sqlite3_mprintf_double {abc: (%*.*f) :xyz} 1 1 1.0 } {abc: (1.0) :xyz} From 480c572f2da02cb6446a55df6c8b2df271446a66 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 22 Feb 2019 16:18:12 +0000 Subject: [PATCH 264/306] In sqlite3NestedParse() be sure to detect all SQLITE_NOMEM and SQLITE_TOOBIG errors and to distinguish between them. FossilOrigin-Name: 73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 6 +++++- test/indexfault.test | 10 ++++++++++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1cfea83bdc..28890120e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Modify\ssqlite3_str_finish()\sand\ssqlite3VMPrintf()\sso\sthat\sthey\salways\nreturn\sNULL\son\sany\sOOM\sor\sSQLITE_LIMIT_LENGTH\serror. -D 2019-02-22T15:42:10.523 +C In\ssqlite3NestedParse()\sbe\ssure\sto\sdetect\sall\sSQLITE_NOMEM\sand\sSQLITE_TOOBIG\nerrors\sand\sto\sdistinguish\sbetween\sthem. +D 2019-02-22T16:18:12.478 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -459,7 +459,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 026f48c39b179a5602423904fcaaae87bbd75f659fd672b3756fea43356d9909 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c ac41c86b486f480b2bcad7e55c6cc19d7151082f74682ab048c45980d6c9ddac +F src/build.c 3acec29b23948042173301a8befebae01a98344debf66cbd4467c8b9077707b8 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b @@ -1036,7 +1036,7 @@ F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e F test/indexexpr2.test 38020c247ee77ba19322fadde99db84bdf2aef34f714866786563c3834bb2dce -F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d +F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 @@ -1805,7 +1805,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 c13d563925db12bc2c91ff9432050261e5bd39d960e2739777a66bf804df2e31 -R 86ff0d78e3b0371bb1c17329fcb2b62e +P e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 +R 11deec5828b62a731a0a037d39c47b89 U drh -Z 1f9977e43574c881ad05ccf22d06573e +Z cf16021848b0cf5e1e8ad8e5d4d2b4c8 diff --git a/manifest.uuid b/manifest.uuid index 07a899e00e..da0fd9f02b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 \ No newline at end of file +73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e \ No newline at end of file diff --git a/src/build.c b/src/build.c index 0cf9f52701..79ad744c52 100644 --- a/src/build.c +++ b/src/build.c @@ -260,7 +260,11 @@ void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ zSql = sqlite3VMPrintf(db, zFormat, ap); va_end(ap); if( zSql==0 ){ - return; /* A malloc must have failed */ + /* This can result either from an OOM or because the formatted string + ** exceeds SQLITE_LIMIT_LENGTH. In the latter case, we need to set + ** an error */ + if( !db->mallocFailed ) pParse->rc = SQLITE_TOOBIG; + return; } pParse->nested++; memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ); diff --git a/test/indexfault.test b/test/indexfault.test index efe493219e..0e65179a32 100644 --- a/test/indexfault.test +++ b/test/indexfault.test @@ -337,6 +337,16 @@ do_faultsim_test 4.2 -faults custom -prep { faultsim_test_result {0 {}} } +do_faultsim_test 5 -prep { + reset_db +} -body { + execsql { + CREATE TABLE reallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongname(a PRIMARY KEY) WITHOUT ROWID; + } +} -test { + faultsim_test_result {0 {}} +} + uninstall_custom_faultsim finish_test From f030b376820102ff6cda49565c8b8173b2d44606 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 22 Feb 2019 19:24:16 +0000 Subject: [PATCH 265/306] Internally, remove all references to a Window object that belongs to an expression in an ORDER BY clause if that expression is converted to an alias of a result-set expression. Fix for [4feb3159c6]. FossilOrigin-Name: 579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 49 ++++++++++++++++++++++++++++++++++------------- test/window1.test | 20 +++++++++++++++++++ 4 files changed, 65 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 28890120e9..1c480ce80d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\ssqlite3NestedParse()\sbe\ssure\sto\sdetect\sall\sSQLITE_NOMEM\sand\sSQLITE_TOOBIG\nerrors\sand\sto\sdistinguish\sbetween\sthem. -D 2019-02-22T16:18:12.478 +C Internally,\sremove\sall\sreferences\sto\sa\sWindow\sobject\sthat\sbelongs\sto\san\sexpression\sin\san\sORDER\sBY\sclause\sif\sthat\sexpression\sis\sconverted\sto\san\salias\sof\sa\sresult-set\sexpression.\sFix\sfor\s[4feb3159c6]. +D 2019-02-22T19:24:16.635 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -513,7 +513,7 @@ F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 93a3d539019264683a444bc043c875e9a6cca43fe935ae7bf6cfff0af3bba118 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 1588690ee4cc39b4b9ea3230d4e3543d5ec3b5e898c87521f1375af0f1934cd4 +F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d @@ -1676,7 +1676,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 2798c8249e0f122c9bacce6aa7324765a5cd9106e49e7aacc81f6033d281577b +F test/window1.test d141eba02ee4d7441dcb45148d776aded21992e8de6ddbbe2aae8151e5fad45e F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 @@ -1805,7 +1805,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 e7144ffd21294d7aebbfa6aa5a262797a6d16de11193f1bf6b75f5f27b04c940 -R 11deec5828b62a731a0a037d39c47b89 -U drh -Z cf16021848b0cf5e1e8ad8e5d4d2b4c8 +P 73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e +R 0862848065a4a98f23b3c741ebf45b9f +U dan +Z 231e5f595c30e40261d6e69369fc6dc0 diff --git a/manifest.uuid b/manifest.uuid index da0fd9f02b..8b38972d81 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e \ No newline at end of file +579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 9410bc0202..fd2cf539a9 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1243,6 +1243,38 @@ int sqlite3ResolveOrderGroupBy( return 0; } +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Walker callback for resolveRemoveWindows(). +*/ +static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window **pp; + for(pp=&pWalker->u.pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ + if( *pp==pExpr->y.pWin ){ + *pp = (*pp)->pNextWin; + break; + } + } + } + return WRC_Continue; +} + +/* +** Remove any Window objects owned by the expression pExpr from the +** Select.pWin list of Select object pSelect. +*/ +static void resolveRemoveWindows(Select *pSelect, Expr *pExpr){ + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + sqlite3WalkExpr(&sWalker, pExpr); +} +#else +# define resolveRemoveWindows(x,y) +#endif + /* ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. ** The Name context of the SELECT statement is pNC. zType is either @@ -1309,19 +1341,10 @@ static int resolveOrderGroupBy( } for(j=0; jpEList->nExpr; j++){ if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ -#ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(pE, EP_WinFunc) ){ - /* Since this window function is being changed into a reference - ** to the same window function the result set, remove the instance - ** of this window function from the Select.pWin list. */ - Window **pp; - for(pp=&pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ - if( *pp==pE->y.pWin ){ - *pp = (*pp)->pNextWin; - } - } - } -#endif + /* Since this expresion is being changed into a reference + ** to an identical expression in the result set, remove all Window + ** objects belonging to the expression from the Select.pWin list. */ + resolveRemoveWindows(pSelect, pE); pItem->u.x.iOrderByCol = j+1; } } diff --git a/test/window1.test b/test/window1.test index 2c504205e5..b3073985be 100644 --- a/test/window1.test +++ b/test/window1.test @@ -700,5 +700,25 @@ do_execsql_test 16.2 { 3 101 } +#------------------------------------------------------------------------- +do_execsql_test 17.0 { + CREATE TABLE t8(a); + INSERT INTO t8 VALUES(1), (2), (3); +} + +do_execsql_test 17.1 { + SELECT +sum(0) OVER () ORDER BY +sum(0) OVER (); +} {0} + +do_execsql_test 17.2 { + select +sum(a) OVER () FROM t8 ORDER BY +sum(a) OVER () DESC; +} {6 6 6} + +do_execsql_test 17.3 { + SELECT 10+sum(a) OVER (ORDER BY a) + FROM t8 + ORDER BY 10+sum(a) OVER (ORDER BY a) DESC; +} {16 13 11} + finish_test From bc0a55cf0b4c47fbb551583bfda3ed5a1d57d453 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 22 Feb 2019 21:33:56 +0000 Subject: [PATCH 266/306] Check-in [fa792714ae62fa980] is not a valid fix for ticket [df46dfb631f75694], as the new test case in this check-in demonstrates. The fix here causes test cases for the [df46dfb631f75694] bug to fail again, so this check-in is on a branch. A new fix is needed for [df46dfb631f75694]. FossilOrigin-Name: 0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 --- manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/wherecode.c | 4 +++- test/where.test | 12 ++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 1c480ce80d..1851f3ee0f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Internally,\sremove\sall\sreferences\sto\sa\sWindow\sobject\sthat\sbelongs\sto\san\sexpression\sin\san\sORDER\sBY\sclause\sif\sthat\sexpression\sis\sconverted\sto\san\salias\sof\sa\sresult-set\sexpression.\sFix\sfor\s[4feb3159c6]. -D 2019-02-22T19:24:16.635 +C Check-in\s[fa792714ae62fa980]\sis\snot\sa\svalid\sfix\sfor\sticket\n[df46dfb631f75694],\sas\sthe\snew\stest\scase\sin\sthis\scheck-in\sdemonstrates.\nThe\sfix\shere\scauses\stest\scases\sfor\sthe\s[df46dfb631f75694]\sbug\sto\sfail\nagain,\sso\sthis\scheck-in\sis\son\sa\sbranch.\s\sA\snew\sfix\sis\sneeded\sfor\n[df46dfb631f75694]. +D 2019-02-22T21:33:56.743 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -602,7 +602,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c 5ee878f714218352a2f452907572d4bf1e4303393288458f87ffc86edaf2cfbe +F src/wherecode.c cdeb7c7028dfcf1c473c5d91c4ae4e579a8d35337e0042788022063bb6db2a51 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1646,7 +1646,7 @@ F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88 -F test/where.test 8215d220633f08da331781cf9ede7fb7aed50eb113473c10acd39a643fd258ba +F test/where.test 93738e224cd5e7819565a9f272c19fd0ee5893d9cd7f5238ce026bae09b8d710 F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 @@ -1805,7 +1805,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 73056b314bd63288c662752e9bd469b70264c38031c1c857460e64fdb1ed4e2e -R 0862848065a4a98f23b3c741ebf45b9f -U dan -Z 231e5f595c30e40261d6e69369fc6dc0 +P 579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a +R 44233d0aa266189ff2ae6bf0b0a0a078 +T *branch * tkt-df46dfb631 +T *sym-tkt-df46dfb631 * +T -sym-trunk * +U drh +Z ab4cb17ec0e626c52e7694e3fdcbcc49 diff --git a/manifest.uuid b/manifest.uuid index 8b38972d81..a2aa927f76 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a \ No newline at end of file +0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 5441752ed1..4ca9c8853b 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1344,7 +1344,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; - pTerm->wtFlags |= TERM_CODED; + if( (pTerm->prereqAll & pLevel->notReady)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } }else if( (pLoop->wsFlags & WHERE_IPK)!=0 && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 ){ diff --git a/test/where.test b/test/where.test index 1f38065c65..e1b81aa053 100644 --- a/test/where.test +++ b/test/where.test @@ -1425,5 +1425,17 @@ do_execsql_test where-22.1 { SELECT count(*) FROM t1 LEFT JOIN t2 ON a IS NOT NULL; } {5} +# 20190-02-22: A bug introduced by checkin +# https://www.sqlite.org/src/info/fa792714ae62fa98. +# +do_execsql_test where-23.0 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a INTEGER PRIMARY KEY); + INSERT INTO t1(a) VALUES(1),(2),(3); + CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT); + INSERT INTO t2(y) VALUES(2),(3); + SELECT * FROM t1, t2 WHERE a=y AND y=3; +} {3 2 3} finish_test From 50ef6716d2ac75314e76546d074efd694969dba2 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 22 Feb 2019 23:29:56 +0000 Subject: [PATCH 267/306] Make all ephemeral tables built to hold the RHS of an IN operator be index-btrees, never table-btrees, regardless of whether or not they are used as IN_INDEX_LOOP or IN_INDEX_MEMBERSHIP. That way, the same ephmerial table can be reused for both cases. FossilOrigin-Name: c2d50df8fd1a1fdae6226a3e77296ded09b53a74540caedd4868e686a93cbc10 --- manifest | 21 +++++++++------------ manifest.uuid | 2 +- src/expr.c | 40 +++++++--------------------------------- src/insert.c | 7 +++++-- src/sqliteInt.h | 2 +- src/vdbe.c | 24 ++++++------------------ 6 files changed, 29 insertions(+), 67 deletions(-) diff --git a/manifest b/manifest index 1851f3ee0f..83c7b99bb1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Check-in\s[fa792714ae62fa980]\sis\snot\sa\svalid\sfix\sfor\sticket\n[df46dfb631f75694],\sas\sthe\snew\stest\scase\sin\sthis\scheck-in\sdemonstrates.\nThe\sfix\shere\scauses\stest\scases\sfor\sthe\s[df46dfb631f75694]\sbug\sto\sfail\nagain,\sso\sthis\scheck-in\sis\son\sa\sbranch.\s\sA\snew\sfix\sis\sneeded\sfor\n[df46dfb631f75694]. -D 2019-02-22T21:33:56.743 +C Make\sall\sephemeral\stables\sbuilt\sto\shold\sthe\sRHS\sof\san\sIN\soperator\sbe\nindex-btrees,\snever\stable-btrees,\sregardless\sof\swhether\sor\snot\sthey\sare\nused\sas\sIN_INDEX_LOOP\sor\sIN_INDEX_MEMBERSHIP.\s\sThat\sway,\sthe\ssame\sephmerial\ntable\scan\sbe\sreused\sfor\sboth\scases. +D 2019-02-22T23:29:56.457 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -467,7 +467,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 182dc9ff30aa6a430b7f728ce84fda85ec10890e29fdf75be1e871d13222a99c +F src/expr.c f2d0ecf68213770be4fad83128ce02e67667deebaa0a44061313f7e4f2a4ae28 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 @@ -476,7 +476,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 305f6ea82a90c3d506ad26d3b6530655bcf08dbff20403ce9f20c21758fbd5c0 +F src/insert.c 4ce12b5ba3bcbfa17ec37ce960d499fc287b6289df2c00b31201f716a3c7df45 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f @@ -520,7 +520,7 @@ F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251 F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 8628c582eafa5ca93523cdaa7c45b2f38a11132e419c7923850706da7fa36bc2 +F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d0b F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -586,7 +586,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c c2ebe27a1e4176f5e4b48269917b7a3df096b125d3c407da90e769a9fe4e406e +F src/vdbe.c f1e7b5320df80ff58c67176e35cb48062cbda2a9c9811f11db5faa48071d3fe4 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c cde63790c9d18ba5941d52c9f49e1a862cf6503141d5b9c112a05eb0adbf30a9 @@ -1805,10 +1805,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 579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a -R 44233d0aa266189ff2ae6bf0b0a0a078 -T *branch * tkt-df46dfb631 -T *sym-tkt-df46dfb631 * -T -sym-trunk * +P 0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 +R 63e80740e79601900e62b0317140d8ef U drh -Z ab4cb17ec0e626c52e7694e3fdcbcc49 +Z b87326ad069ad8da755635bc9cbd9517 diff --git a/manifest.uuid b/manifest.uuid index a2aa927f76..2e02e213eb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 \ No newline at end of file +c2d50df8fd1a1fdae6226a3e77296ded09b53a74540caedd4868e686a93cbc10 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 03ecf1567d..e39b6408c4 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2552,14 +2552,11 @@ int sqlite3FindInIndex( eType = IN_INDEX_EPH; if( inFlags & IN_INDEX_LOOP ){ pParse->nQueryLoop = 0; - if( pX->pLeft->iColumn<0 && !ExprHasProperty(pX, EP_xIsSelect) ){ - eType = IN_INDEX_ROWID; - } }else if( prRhsHasNull ){ *prRhsHasNull = rMayHaveNull = ++pParse->nMem; } assert( pX->op==TK_IN ); - sqlite3CodeRhsOfIN(pParse, pX, iTab, eType==IN_INDEX_ROWID); + sqlite3CodeRhsOfIN(pParse, pX, iTab); if( rMayHaveNull ){ sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); } @@ -2660,12 +2657,6 @@ void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ ** however the cursor number returned might not be the same, as it might ** have been duplicated using OP_OpenDup. ** -** If parameter isRowid is non-zero, then LHS of the IN operator is guaranteed -** to be a non-null integer. In this case, the ephemeral table can be an -** table B-Tree that keyed by only integers. The more general cases uses -** an index B-Tree which can have arbitrary keys, but is slower to both -** read and write. -** ** If the LHS expression ("x" in the examples) is a column value, or ** the SELECT statement returns a column value, then the affinity of that ** column is used to build the index keys. If both 'x' and the @@ -2677,8 +2668,7 @@ void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ void sqlite3CodeRhsOfIN( Parse *pParse, /* Parsing context */ Expr *pExpr, /* The IN operator */ - int iTab, /* Use this cursor number */ - int isRowid /* If true, LHS is a rowid */ + int iTab /* Use this cursor number */ ){ int addrOnce = 0; /* Address of the OP_Once instruction at top */ int addr; /* Address of OP_OpenEphemeral instruction */ @@ -2731,14 +2721,12 @@ void sqlite3CodeRhsOfIN( /* Check to see if this is a vector IN operator */ pLeft = pExpr->pLeft; nVal = sqlite3ExprVectorSize(pLeft); - assert( !isRowid || nVal==1 ); /* Construct the ephemeral table that will contain the content of ** RHS of the IN operator. */ pExpr->iTable = iTab; - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, - pExpr->iTable, (isRowid?0:nVal)); + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS if( ExprHasProperty(pExpr, EP_xIsSelect) ){ VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); @@ -2746,7 +2734,7 @@ void sqlite3CodeRhsOfIN( VdbeComment((v, "RHS of IN operator")); } #endif - pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ /* Case 1: expr IN (SELECT ...) @@ -2760,7 +2748,6 @@ void sqlite3CodeRhsOfIN( ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", addrOnce?"":"CORRELATED ", pSelect->selId )); - assert( !isRowid ); /* 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) ){ @@ -2813,10 +2800,8 @@ void sqlite3CodeRhsOfIN( /* Loop through each expression in . */ r1 = sqlite3GetTempReg(pParse); r2 = sqlite3GetTempReg(pParse); - if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC); for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ Expr *pE2 = pItem->pExpr; - int iValToIns; /* If the expression is not constant then we will need to ** disable the test that was generated above that makes sure @@ -2829,20 +2814,9 @@ void sqlite3CodeRhsOfIN( } /* Evaluate the expression and insert it into the temp table */ - if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ - sqlite3VdbeAddOp3(v, OP_InsertInt, iTab, r2, iValToIns); - }else{ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - if( isRowid ){ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, - sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Insert, iTab, r2, r3); - }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); - } - } + r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); } sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempReg(pParse, r2); diff --git a/src/insert.c b/src/insert.c index 6f044db5a7..a68db1a1d2 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1921,10 +1921,13 @@ void sqlite3CompleteInsertion( pik_flags |= (update_flags & OPFLAG_SAVEPOSITION); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK if( update_flags==0 ){ - sqlite3VdbeAddOp4(v, OP_InsertInt, - iIdxCur+i, aRegIdx[i], 0, (char*)pTab, P4_TABLE + int r = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Integer, 0, r); + sqlite3VdbeAddOp4(v, OP_Insert, + iIdxCur+i, aRegIdx[i], r, (char*)pTab, P4_TABLE ); sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); + sqlite3ReleaseTempReg(pParse, r); } #endif } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e568677759..f12e2b6228 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4281,7 +4281,7 @@ void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); int sqlite3GetToken(const unsigned char *, int *); void sqlite3NestedParse(Parse*, const char*, ...); void sqlite3ExpirePreparedStatements(sqlite3*, int); -void sqlite3CodeRhsOfIN(Parse*, Expr*, int, int); +void sqlite3CodeRhsOfIN(Parse*, Expr*, int); int sqlite3CodeSubselect(Parse*, Expr*); void sqlite3SelectPrep(Parse*, Select*, NameContext*); void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); diff --git a/src/vdbe.c b/src/vdbe.c index 5085273bc7..425a03e0e6 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4569,14 +4569,7 @@ case OP_NewRowid: { /* out2 */ ** This instruction only works on tables. The equivalent instruction ** for indices is OP_IdxInsert. */ -/* Opcode: InsertInt P1 P2 P3 P4 P5 -** Synopsis: intkey=P3 data=r[P2] -** -** This works exactly like OP_Insert except that the key is the -** integer value P3, not the value of the integer stored in register P3. -*/ -case OP_Insert: -case OP_InsertInt: { +case OP_Insert: { Mem *pData; /* MEM cell holding data for the record to be inserted */ Mem *pKey; /* MEM cell holding key for the record */ VdbeCursor *pC; /* Cursor to table into which insert is written */ @@ -4597,16 +4590,11 @@ case OP_InsertInt: { REGISTER_TRACE(pOp->p2, pData); sqlite3VdbeIncrWriteCounter(p, pC); - if( pOp->opcode==OP_Insert ){ - pKey = &aMem[pOp->p3]; - assert( pKey->flags & MEM_Int ); - assert( memIsValid(pKey) ); - REGISTER_TRACE(pOp->p3, pKey); - x.nKey = pKey->u.i; - }else{ - assert( pOp->opcode==OP_InsertInt ); - x.nKey = pOp->p3; - } + pKey = &aMem[pOp->p3]; + assert( pKey->flags & MEM_Int ); + assert( memIsValid(pKey) ); + REGISTER_TRACE(pOp->p3, pKey); + x.nKey = pKey->u.i; if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ assert( pC->iDb>=0 ); From 4bdd26dfab8408645b1e32e657355e332b098350 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 23 Feb 2019 00:08:09 +0000 Subject: [PATCH 268/306] Remove a testcase() macro which is now unreachable due to the contraction of the use of IN_INDEX_ROWID. FossilOrigin-Name: 90c5a17cd526b256753f876e575f3e731d5e8b9dd6e196cf8d8f7306e099b91c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 83c7b99bb1..d7d81d4706 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sall\sephemeral\stables\sbuilt\sto\shold\sthe\sRHS\sof\san\sIN\soperator\sbe\nindex-btrees,\snever\stable-btrees,\sregardless\sof\swhether\sor\snot\sthey\sare\nused\sas\sIN_INDEX_LOOP\sor\sIN_INDEX_MEMBERSHIP.\s\sThat\sway,\sthe\ssame\sephmerial\ntable\scan\sbe\sreused\sfor\sboth\scases. -D 2019-02-22T23:29:56.457 +C Remove\sa\stestcase()\smacro\swhich\sis\snow\sunreachable\sdue\sto\sthe\scontraction\sof\nthe\suse\sof\sIN_INDEX_ROWID. +D 2019-02-23T00:08:09.169 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -602,7 +602,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c cdeb7c7028dfcf1c473c5d91c4ae4e579a8d35337e0042788022063bb6db2a51 +F src/wherecode.c 061848646cc46a137d9038e47e666a955b3b2a1b458365eeed76b004c0053f3b F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1805,7 +1805,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 0d456456da6e25b20d9d27ca95f1013082bca52ee74ee9bf91732a9fa843ea45 -R 63e80740e79601900e62b0317140d8ef +P c2d50df8fd1a1fdae6226a3e77296ded09b53a74540caedd4868e686a93cbc10 +R c922ba3f62286cb9bc5a2acd31d21a66 U drh -Z b87326ad069ad8da755635bc9cbd9517 +Z 4c57ce6adbcc41ffca57692643360ae6 diff --git a/manifest.uuid b/manifest.uuid index 2e02e213eb..2c4694a5fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c2d50df8fd1a1fdae6226a3e77296ded09b53a74540caedd4868e686a93cbc10 \ No newline at end of file +90c5a17cd526b256753f876e575f3e731d5e8b9dd6e196cf8d8f7306e099b91c \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 4ca9c8853b..79189386b6 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -582,7 +582,6 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ){ int iOut = iReg + i - iEq; if( eType==IN_INDEX_ROWID ){ - testcase( nEq>1 ); /* Happens with a UNIQUE index on ROWID */ pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); }else{ int iCol = aiMap ? aiMap[iMap++] : 0; From f2e5c986130ad4e4aa88aab75ad42a49aaf55551 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 23 Feb 2019 20:48:41 +0000 Subject: [PATCH 269/306] Fix a couple of assert() statements in fts3 that can be false if the database is corrupt. FossilOrigin-Name: 84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 --- ext/fts3/fts3_snippet.c | 4 +- manifest | 17 ++-- manifest.uuid | 2 +- test/fts3corrupt4.test | 219 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 229 insertions(+), 13 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 115e98abfc..58a71d2dd6 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -1543,7 +1543,7 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ nTerm = pExpr->pPhrase->nToken; if( pList ){ fts3GetDeltaPosition(&pList, &iPos); - assert( iPos>=0 ); + assert_fts3_nc( iPos>=0 ); } for(iTerm=0; iTermpList) ){ pTerm->pList = 0; }else{ diff --git a/manifest b/manifest index 5bceb98aca..634de25e24 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Check-in\s[fa792714ae62fa98]\sis\sincorrect.\s\sAdd\sa\stest\scase\sto\srefute\sit\sand\nalso\sa\sfix\sto\smake\sit\sright.\s\nThen\sadd\san\salternative\sfix\sto\sticket\s[df46dfb631f75694]\sin\swhich\nall\sephemeral\stables\sused\sas\sthe\sRHS\sof\san\sIN\soperator\sbe\sindex\sbtrees\nand\snever\stable\sbtrees\sso\sthat\sthey\scan\salways\sbe\sreused. -D 2019-02-23T00:21:00.186 +C Fix\sa\scouple\sof\sassert()\sstatements\sin\sfts3\sthat\scan\sbe\sfalse\sif\sthe\sdatabase\sis\scorrupt. +D 2019-02-23T20:48:41.063 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -89,7 +89,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c ac1f8945375d07076b7178de1fe549982e6ae6f050095e7f7e400ec4448f31df +F ext/fts3/fts3_snippet.c d002c29d3e71c15b27326b818c1e49a4d0d5fc342cc8e9522e2bf2a3077c75a2 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 @@ -919,7 +919,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 2afb0da4fe1fb6468a485f96d6a1bc4959734f515176ec29294dd49b0ad4c946 +F test/fts3corrupt4.test 8733b9589701df24cf5f35ed36fec865edd67f24961f24ac69d751b4221494f7 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1805,8 +1805,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 579b66eaa0816561c6e47ea116b46f229188f0fc84c1173bfe0d21df2dff9a9a 90c5a17cd526b256753f876e575f3e731d5e8b9dd6e196cf8d8f7306e099b91c -R c922ba3f62286cb9bc5a2acd31d21a66 -T +closed 90c5a17cd526b256753f876e575f3e731d5e8b9dd6e196cf8d8f7306e099b91c -U drh -Z 6d379fa0271550d77de94db4756b85a3 +P d3915230e3ee5878fe2e65a0afb7e91ee124aaf46b4e28c6e00053d6df13d445 +R 6e690e8ab06a9d23902df3ac745bd5b0 +U dan +Z 7adf75902be04c3b9b4844266efca292 diff --git a/manifest.uuid b/manifest.uuid index 7f507cdb90..3094fb5b67 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d3915230e3ee5878fe2e65a0afb7e91ee124aaf46b4e28c6e00053d6df13d445 \ No newline at end of file +84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 55e52c4cdd..d200c95fa9 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -2586,7 +2586,6 @@ do_test 17.0 { | end crash-f15972acf5bc1c.db }]} {} -breakpoint do_execsql_test 17.1 { BEGIN; INSERT INTO t1(t1) SELECT x FROM t2; @@ -3259,6 +3258,224 @@ do_execsql_test 20.2 { INSERT INTO t1(t1) VALUES('optimize'); } +#------------------------------------------------------------------------- +reset_db +do_test 21.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-18cc014e42e828.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 07 00 00 00 04 ................ +| 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: 66 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 ft2t2.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 75 67 64 69 72 .5tablet1_sugdir +| 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 46 47 45 52 rt_block INTFGER +| 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 62 2c 72 6f 6f 74 ock INTEGEb,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 67 64 69 72 egdir_1t1_segdir +| 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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 68 0d 4e 0d 35 0d 1b 0c fb .......h.N.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 00 00 .......x.W.>.$.. +| 2880: 00 00 00 00 00 00 00 00 81 3f 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 23 00 20 32 30 31 36 30 36 30 39 20 44 45 42 4#. 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 43 53 VTAB ENABLE FCS +| 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 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 20 21 05 00 33 0f 19 4f 4d 0XRTRIM !..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 39 NABLE GEOPOLYXB9 +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 1e 4c NARY....)..ENA.L +| 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 16 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 48 4e 41 52 59 17 0b LE FTS4XBHNARY.. +| 3776: 05 00 23 0e 19 45 4e 41 42 4c 45 20 46 54 53 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 2e 52 49 4d 1e ABLE FTS4XR.RIM. +| 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT 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 da 41 52 59 27 20160609XBI.ARY' +| 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 00 00 00 00 OMPILER=gcc-.... +| 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 3a 03 25 07 00 00 01 34 03 25 05 00 00 01 35 0:.%....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 57 63 63 03 25 03 00 01 .5.%....Wcc.%... +| 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 64 64 73 61 66 65 03 %....threddsafe. +| 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 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 12 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 0e 97 02 00 ................ +| 3504: 01 02 00 01 cb 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 01 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 03 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 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 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 ab 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 12 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 01 f0 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 02 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 08 a2 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 02 01 01 02 00 ................ +| 3936: 01 01 01 01 ff f1 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 01 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 03 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 02 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 00 00 00 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 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 00 00 00 00 00 00 00 00 uild............ +| end crash-18cc014e42e828.db +}]} {} + +breakpoint +do_catchsql_test 21.1 { + SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'R*'; +} {1 {database disk image is malformed}} + finish_test From 7edcb11ca7153b3e8a0b01d14142453e2b11ea6f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 Feb 2019 14:16:19 +0000 Subject: [PATCH 270/306] Fix a typo in the documentation for sqlite3_total_changes(). FossilOrigin-Name: 8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 634de25e24..7db9d11be5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scouple\sof\sassert()\sstatements\sin\sfts3\sthat\scan\sbe\sfalse\sif\sthe\sdatabase\sis\scorrupt. -D 2019-02-23T20:48:41.063 +C Fix\sa\stypo\sin\sthe\sdocumentation\sfor\ssqlite3_total_changes(). +D 2019-02-25T14:16:19.183 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -517,7 +517,7 @@ F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d -F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 +F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d0b @@ -1805,7 +1805,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 d3915230e3ee5878fe2e65a0afb7e91ee124aaf46b4e28c6e00053d6df13d445 -R 6e690e8ab06a9d23902df3ac745bd5b0 -U dan -Z 7adf75902be04c3b9b4844266efca292 +P 84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 +R a2b016f8e876d7afed026960b97cfb9a +U drh +Z 55e24971867c6a920f00e5ee1b3ee79b diff --git a/manifest.uuid b/manifest.uuid index 3094fb5b67..3940420865 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 \ No newline at end of file +8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 392532a6f7..f29102727e 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2369,7 +2369,7 @@ int sqlite3_changes(sqlite3*); ** not. ^Changes to a view that are intercepted by INSTEAD OF triggers ** are not counted. ** -** This the [sqlite3_total_changes(D)] interface only reports the number +** The [sqlite3_total_changes(D)] interface only reports the number ** of rows that changed due to SQL statement run against database ** connection D. Any changes by other database connections are ignored. ** To detect changes against a database file from other database From c3017e7b4a1829f3e8bc4f26f5b05b31836120e0 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 Feb 2019 14:52:43 +0000 Subject: [PATCH 271/306] Update comments on the fossildelta extension. No changes to code. FossilOrigin-Name: 9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 --- ext/misc/fossildelta.c | 40 +++++++++++++++++++++++++++++++++++----- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index 7a9c5c1d72..b58d358b55 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -600,7 +600,7 @@ static int delta_apply( } /* -** SQL functions: fossildelta_create(X,Y) +** SQL functions: delta_create(X,Y) ** ** Return a delta for carrying X into Y. */ @@ -635,7 +635,7 @@ static void deltaCreateFunc( } /* -** SQL functions: fossildelta_apply(X,D) +** SQL functions: delta_apply(X,D) ** ** Return the result of applying delta D to input X. */ @@ -678,7 +678,7 @@ static void deltaApplyFunc( /* -** SQL functions: fossildelta_output_size(D) +** SQL functions: delta_output_size(D) ** ** Return the size of the output that results from applying delta D. */ @@ -704,8 +704,38 @@ static void deltaOutputSizeFunc( } } -/* The deltaparse(DELTA) table-valued function parses the DELTA in -** its input and returns a table that describes that delta. +/***************************************************************************** +** Table-valued SQL function: delta_parse(DELTA) +** +** Schema: +** +** CREATE TABLE delta_parse( +** op TEXT, +** a1 INT, +** a2 ANY, +** delta HIDDEN BLOB +** ); +** +** Given an input DELTA, this function parses the delta and returns +** rows for each entry in the delta. The op column has one of the +** values SIZE, COPY, INSERT, CHECKSUM, ERROR. +** +** Assuming no errors, the first row has op='SIZE'. a1 is the size of +** the output in bytes and a2 is NULL. +** +** After the initial SIZE row, there are zero or more 'COPY' and/or 'INSERT' +** rows. A COPY row means content is copied from the source into the +** output. Column a1 is the number of bytes to copy and a2 is the offset +** into source from which to begin copying. An INSERT row means to +** insert text into the output stream. Column a1 is the number of bytes +** to insert and column is a BLOB that contains the text to be inserted. +** +** The last row of a well-formed delta will have an op value of 'CHECKSUM'. +** The a1 column will be the value of the checksum and a2 will be NULL. +** +** If the input delta is not well-formed, then a row with an op value +** of 'ERROR' is returned. The a1 value of the ERROR row is the offset +** into the delta where the error was encountered and a2 is NULL. */ typedef struct deltaparsevtab_vtab deltaparsevtab_vtab; typedef struct deltaparsevtab_cursor deltaparsevtab_cursor; diff --git a/manifest b/manifest index 7db9d11be5..a725656c76 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sthe\sdocumentation\sfor\ssqlite3_total_changes(). -D 2019-02-25T14:16:19.183 +C Update\scomments\son\sthe\sfossildelta\sextension.\s\sNo\schanges\sto\scode. +D 2019-02-25T14:52:43.832 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -286,7 +286,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 -F ext/misc/fossildelta.c 31b64084789228ac0d1113e5e39dc79c2ae16dd131d5c988ad9550ae1b9bc4b4 +F ext/misc/fossildelta.c 3cc9a9b2f39889b43cd176c19f286bc7dd652f4c202c202d008481252d820316 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 @@ -1805,7 +1805,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 84162af521f29df8a186163fbdef9856e1aa8aba78e74d7df0ba2cc83bb86240 -R a2b016f8e876d7afed026960b97cfb9a +P 8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 +R b6b94692df1ff68d1775b0307c4b76d3 U drh -Z 55e24971867c6a920f00e5ee1b3ee79b +Z 398771f938c8db2543123478ba7fdec9 diff --git a/manifest.uuid b/manifest.uuid index 3940420865..3326c630fa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 \ No newline at end of file +9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 \ No newline at end of file From 8b738d086584191e8d2f44165f9f380610690e7f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 Feb 2019 18:43:54 +0000 Subject: [PATCH 272/306] Enhance the command-line shell to accept bound parameters, using the TEMP table named "$Parameters" to look up the values for bound parameters. FossilOrigin-Name: 7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index a725656c76..bc7ae72323 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\scomments\son\sthe\sfossildelta\sextension.\s\sNo\schanges\sto\scode. -D 2019-02-25T14:52:43.832 +C Enhance\sthe\scommand-line\sshell\sto\saccept\sbound\sparameters,\susing\sthe\nTEMP\stable\snamed\s"$Parameters"\sto\slook\sup\sthe\svalues\sfor\sbound\sparameters. +D 2019-02-25T18:43:54.244 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 @@ -516,7 +516,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 -F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d +F src/shell.c.in a238f3f80f7085d31056c69930ec13a87872da0d0d08fd561f5aff78cc618f5d F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1805,7 +1805,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 8474c1560e0c3a28c6a7ed360202a8e7caae3c8259f60bbfa6d2948ab7876f51 -R b6b94692df1ff68d1775b0307c4b76d3 +P 9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 +R 6ea2c77700991e615d8d2faccc53ab72 U drh -Z 398771f938c8db2543123478ba7fdec9 +Z 82b4b57ac959f29e2a6d5db5cac484ef diff --git a/manifest.uuid b/manifest.uuid index 3326c630fa..40b6b070f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 \ No newline at end of file +7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index c7d94dbee8..3474c10ca8 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2747,6 +2747,55 @@ static void restore_debug_trace_modes(void){ #endif } +/* Name of the TEMP table that holds bind parameter values */ +#define BIND_PARAM_TABLE "$Parameters" + +/* +** Bind parameters on a prepared statement. +** +** Parameter bindings are taken from a TEMP table of the form: +** +** CREATE TEMP TABLE "$Parameters"(key TEXT PRIMARY KEY, value) +** WITHOUT ROWID; +** +** No bindings occur if this table does not exist. The special character '$' +** is included in the table name to help prevent collisions with actual tables. +** The table must be in the TEMP schema. +*/ +static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ + int nVar; + int i; + int rc; + sqlite3_stmt *pQ = 0; + + nVar = sqlite3_bind_parameter_count(pStmt); + if( nVar==0 ) return; /* Nothing to do */ + if( sqlite3_table_column_metadata(pArg->db, "TEMP", BIND_PARAM_TABLE, + "key", 0, 0, 0, 0, 0)!=SQLITE_OK ){ + return; /* Parameter table does not exist */ + } + rc = sqlite3_prepare_v2(pArg->db, + "SELECT value FROM temp.\"" BIND_PARAM_TABLE "\"" + " WHERE key=?1", -1, &pQ, 0); + if( rc || pQ==0 ) return; + for(i=1; i<=nVar; i++){ + char zNum[30]; + const char *zVar = sqlite3_bind_parameter_name(pStmt, i); + if( zVar==0 ){ + sqlite3_snprintf(sizeof(zNum),zNum,"?%d",i); + zVar = zNum; + } + sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC); + if( sqlite3_step(pQ)==SQLITE_ROW ){ + sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0)); + }else{ + sqlite3_bind_null(pStmt, i); + } + sqlite3_reset(pQ); + } + sqlite3_finalize(pQ); +} + /* ** Run a prepared statement */ @@ -3066,6 +3115,7 @@ static int shell_exec( } } + bind_prepared_stmt(pArg, pStmt); exec_prepared_stmt(pArg, pStmt); explain_data_delete(pArg); eqp_render(pArg); From 9ebe59d6fffc2a4d6799d7c8e9c4071948291a33 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 12:29:25 +0000 Subject: [PATCH 273/306] Update the configure-generated makekfile to generate a portable pkgIndex.tcl. FossilOrigin-Name: 35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 --- Makefile.in | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile.in b/Makefile.in index 65530e33c5..2312f4165b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1424,7 +1424,7 @@ install: sqlite3$(TEXE) lib_install sqlite3.h sqlite3.pc ${HAVE_TCL:1=tcl_instal $(INSTALL) -m 0644 sqlite3.pc $(DESTDIR)$(pkgconfigdir) pkgIndex.tcl: - echo 'package ifneeded sqlite3 $(RELEASE) [list load $(TCLLIBDIR)/libtclsqlite3$(SHLIB_SUFFIX) sqlite3]' > $@ + echo 'package ifneeded sqlite3 $(RELEASE) [list load [file join $$dir libtclsqlite3[info sharedlibextension]] sqlite3]' > $@ tcl_install: lib_install libtclsqlite3.la pkgIndex.tcl $(INSTALL) -d $(DESTDIR)$(TCLLIBDIR) $(LTINSTALL) libtclsqlite3.la $(DESTDIR)$(TCLLIBDIR) diff --git a/manifest b/manifest index bc7ae72323..9b2e82c3e6 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -C Enhance\sthe\scommand-line\sshell\sto\saccept\sbound\sparameters,\susing\sthe\nTEMP\stable\snamed\s"$Parameters"\sto\slook\sup\sthe\svalues\sfor\sbound\sparameters. -D 2019-02-25T18:43:54.244 +C Update\sthe\sconfigure-generated\smakekfile\sto\sgenerate\sa\sportable\spkgIndex.tcl. +D 2019-02-26T12:29:25.097 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 +F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee @@ -1805,7 +1805,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 9da4fb59b28686630d63a79988b458726332cf06cc0e6e84d7c0a7600f5fcab0 -R 6ea2c77700991e615d8d2faccc53ab72 +P 7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 +R ba8a1248c5f79d4761a702c6089dec67 U drh -Z 82b4b57ac959f29e2a6d5db5cac484ef +Z 71e12f1b2a3ae7b8dbcc15250648d27c diff --git a/manifest.uuid b/manifest.uuid index 40b6b070f6..3700d27aac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 \ No newline at end of file +35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 \ No newline at end of file From 2b454e0335cbe14bc96b460ff3695007185fbb6e Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 16:11:46 +0000 Subject: [PATCH 274/306] Fix a harmless compiler warning that only comes up during debug builds. FossilOrigin-Name: 848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tokenize.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9b2e82c3e6..d53ad9b26b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\sconfigure-generated\smakekfile\sto\sgenerate\sa\sportable\spkgIndex.tcl. -D 2019-02-26T12:29:25.097 +C Fix\sa\sharmless\scompiler\swarning\sthat\sonly\scomes\sup\sduring\sdebug\sbuilds. +D 2019-02-26T16:11:46.752 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -578,7 +578,7 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c e61ead283dff63762a9f5be462dbd258dba948e5fb4e3b261fc03703426eb12e +F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1 @@ -1805,7 +1805,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 7c941ce5bcc872ec92cbe0e409fd773f44a5ab1f814e689ad57f756b911e2b96 -R ba8a1248c5f79d4761a702c6089dec67 +P 35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 +R d5f269750441e62c6e89c0272d884f83 U drh -Z 71e12f1b2a3ae7b8dbcc15250648d27c +Z 26f5e510f6fdca054128434e6c62bf8f diff --git a/manifest.uuid b/manifest.uuid index 3700d27aac..251770c676 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 \ No newline at end of file +848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 \ No newline at end of file diff --git a/src/tokenize.c b/src/tokenize.c index d22b46371f..40f7b4aad9 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -560,10 +560,10 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ int lastTokenParsed = -1; /* type of the previous token */ sqlite3 *db = pParse->db; /* The database connection */ int mxSqlLen; /* Max length of an SQL string */ - VVA_ONLY( u8 startedWithOom = db->mallocFailed ); #ifdef sqlite3Parser_ENGINEALWAYSONSTACK yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif + VVA_ONLY( u8 startedWithOom = db->mallocFailed ); assert( zSql!=0 ); mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; From eaac9996edf679fd9b081508e23f98e70f5cdcd9 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 16:17:06 +0000 Subject: [PATCH 275/306] Use unsigned integers to count the number of pages in a freelist during an integrity_check, to avoid any possibility of a signed integer overflow. FossilOrigin-Name: 05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index d53ad9b26b..70da095425 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\sthat\sonly\scomes\sup\sduring\sdebug\sbuilds. -D 2019-02-26T16:11:46.752 +C Use\sunsigned\sintegers\sto\scount\sthe\snumber\sof\spages\sin\sa\sfreelist\sduring\nan\sintegrity_check,\sto\savoid\sany\spossibility\sof\sa\ssigned\sinteger\soverflow. +D 2019-02-26T16:17:06.560 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -456,7 +456,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 026f48c39b179a5602423904fcaaae87bbd75f659fd672b3756fea43356d9909 +F src/btree.c f85f8abe99ec3e72671f0fc9b09114188974fe0b9a3ea9edc77977e853ff75e9 F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 3acec29b23948042173301a8befebae01a98344debf66cbd4467c8b9077707b8 @@ -1805,7 +1805,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 35cbee7fe4a0b7ca06206ca2f69fc35abe3de4929070d6585ab765af82027438 -R d5f269750441e62c6e89c0272d884f83 +P 848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 +R 5bfaa50c9d0b312e0c5de93392fc2854 U drh -Z 26f5e510f6fdca054128434e6c62bf8f +Z d36c5219418a3d97914eaaa4ccab9e4b diff --git a/manifest.uuid b/manifest.uuid index 251770c676..56360e4947 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 \ No newline at end of file +05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index aa2c84999c..9e7a9c0426 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9616,10 +9616,10 @@ static void checkList( IntegrityCk *pCheck, /* Integrity checking context */ int isFreeList, /* True for a freelist. False for overflow page list */ int iPage, /* Page number for first page in the list */ - int N /* Expected number of pages in the list */ + u32 N /* Expected number of pages in the list */ ){ int i; - int expected = N; + u32 expected = N; int nErrAtStart = pCheck->nErr; while( iPage!=0 && pCheck->mxErr ){ DbPage *pOvflPage; @@ -9878,7 +9878,7 @@ static int checkTreePage( /* Check the content overflow list */ if( info.nPayload>info.nLocal ){ - int nPage; /* Number of pages on the overflow chain */ + u32 nPage; /* Number of pages on the overflow chain */ Pgno pgnoOvfl; /* First page of the overflow chain */ assert( pc + info.nSize - 4 <= usableSize ); nPage = (info.nPayload - info.nLocal + usableSize - 5)/(usableSize - 4); From 5cb1ffc1bd1cae42c5846b10e6cb23c53290bdad Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 17:49:07 +0000 Subject: [PATCH 276/306] Allocate a few extra bytes for the pager temp page as an overrun buffer while processing corrupt database files. FossilOrigin-Name: e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 10 ++++++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 70da095425..0a7fc9d1a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sunsigned\sintegers\sto\scount\sthe\snumber\sof\spages\sin\sa\sfreelist\sduring\nan\sintegrity_check,\sto\savoid\sany\spossibility\sof\sa\ssigned\sinteger\soverflow. -D 2019-02-26T16:17:06.560 +C Allocate\sa\sfew\sextra\sbytes\sfor\sthe\spager\stemp\spage\sas\san\soverrun\sbuffer\swhile\nprocessing\scorrupt\sdatabase\sfiles. +D 2019-02-26T17:49:07.980 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -502,7 +502,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 2b9604eb5c12f40a0613e832b6267f5814f84479d570d482ba6f98d7affa7c1c F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 38022624ac9fba1f601d3068d7c393fcc909727fccab556242c93d9c7897b640 +F src/pager.c 5420ef6ea46db11b6ba1231f39fc2a1bf19ccad185efc6dc46f1520a608de4f8 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee @@ -1805,7 +1805,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 848869ced988ca4d0ac76d43f984360fd11997a580719cccf8d55becea4e8fb1 -R 5bfaa50c9d0b312e0c5de93392fc2854 +P 05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d +R 77af06549b97efcb59d5193751ddb805 U drh -Z d36c5219418a3d97914eaaa4ccab9e4b +Z 56c9cac7536ccfb12071d041335842f8 diff --git a/manifest.uuid b/manifest.uuid index 56360e4947..3a39dd1fe1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d \ No newline at end of file +e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index cc4f87a572..4660bbfaba 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3786,8 +3786,14 @@ int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ rc = sqlite3OsFileSize(pPager->fd, &nByte); } if( rc==SQLITE_OK ){ - pNew = (char *)sqlite3PageMalloc(pageSize); - if( !pNew ) rc = SQLITE_NOMEM_BKPT; + /* 8 bytes of zeroed overrun space is sufficient so that the b-tree + * cell header parser will never run off the end of the allocation */ + pNew = (char *)sqlite3PageMalloc(pageSize+8); + if( !pNew ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memset(pNew+pageSize, 0, 8); + } } if( rc==SQLITE_OK ){ From bfa70de11729499021b5cf91e78fd49fa1784d43 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 Feb 2019 17:52:44 +0000 Subject: [PATCH 277/306] New test cases added to test/fuzzdata8.db. FossilOrigin-Name: 61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 991232 -> 1010688 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 0a7fc9d1a1..c082475ac2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allocate\sa\sfew\sextra\sbytes\sfor\sthe\spager\stemp\spage\sas\san\soverrun\sbuffer\swhile\nprocessing\scorrupt\sdatabase\sfiles. -D 2019-02-26T17:49:07.980 +C New\stest\scases\sadded\sto\stest/fuzzdata8.db. +D 2019-02-26T17:52:44.425 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -993,7 +993,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 04d95f81db43fa4a247531d25573544125d9dd2777ae43594c9eb57e2a8b901c +F test/fuzzdata8.db 2328494c8c0c18d95e5e04b05cc6dd94bc6b5baf9641fc36b1e881619b897b54 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1805,7 +1805,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 05b87e0755638d31f6d8918f8758362f8c3981661449b5171180a8498f66bd9d -R 77af06549b97efcb59d5193751ddb805 +P e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 +R a16512abbf69d78b036f59b691e0a9de U drh -Z 56c9cac7536ccfb12071d041335842f8 +Z 48cb44477903aa54b0e5eb2c3b8cff1f diff --git a/manifest.uuid b/manifest.uuid index 3a39dd1fe1..86dc56247b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 \ No newline at end of file +61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index ed0d3497b4622f8ea25c591ae96612ee07a24d8e..8ebedd1d765978c511fcf38d6c4f6727bdc928b7 100644 GIT binary patch delta 19493 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 aX8M&tp#5h(x_+%edEJb?<_p&QAN@bTR2RAc delta 16350 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 Date: Tue, 26 Feb 2019 18:21:08 +0000 Subject: [PATCH 278/306] Minor change to dbfuzz2 that allows it to be compiled against older versions of SQLite. FossilOrigin-Name: 6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbfuzz2.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index c082475ac2..7721fba7b0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sadded\sto\stest/fuzzdata8.db. -D 2019-02-26T17:52:44.425 +C Minor\schange\sto\sdbfuzz2\sthat\sallows\sit\sto\sbe\scompiled\sagainst\solder\sversions\nof\sSQLite. +D 2019-02-26T18:21:08.097 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -785,7 +785,7 @@ F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 29b6c6b39a701b6b5b08035c637674b76e1ecea515b1a184b29e3bd0f2d02dad F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 1065d6debd1003c70dccc498c54fd18f4e9da2a73943ba4a953be7dcaf4f724e +F test/dbfuzz2.c 9a6d58fc669e0881c89342a3ab408a98abd64cab9cb8a51cc85aeee9b96e398a F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1805,7 +1805,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 e7aca0714bc475e04b16e9db78722ce025d2a1382f80cfc0a49cff2af904eae5 -R a16512abbf69d78b036f59b691e0a9de +P 61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a +R 8a086356711bdae53b7d275ff93df2e6 U drh -Z 48cb44477903aa54b0e5eb2c3b8cff1f +Z 49f6be04f686338ed5b2d5276a561231 diff --git a/manifest.uuid b/manifest.uuid index 86dc56247b..05691b35c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a \ No newline at end of file +6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 \ No newline at end of file diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index caf39215e1..67aa88cbb5 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -183,7 +183,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE); x = szMax; +#ifdef SQLITE_FCNTL_SIZE_LIMIT sqlite3_file_control(db, "main", SQLITE_FCNTL_SIZE_LIMIT, &x); +#endif if( bVdbeDebug ){ sqlite3_exec(db, "PRAGMA vdbe_debug=ON", 0, 0, 0); } From 69e224f88adb337cb48ba3e432dcad0e43434bce Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 26 Feb 2019 19:16:49 +0000 Subject: [PATCH 279/306] Reformat the white-space in a few test cases so that the tests work with Tcl 8.6.9. FossilOrigin-Name: 29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 --- ext/session/sessionB.test | 3 +-- manifest | 18 +++++++++--------- manifest.uuid | 2 +- test/fts3expr4.test | 2 +- test/scanstatus.test | 2 +- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/ext/session/sessionB.test b/ext/session/sessionB.test index eae41f76ad..2c103d5e36 100644 --- a/ext/session/sessionB.test +++ b/ext/session/sessionB.test @@ -258,8 +258,7 @@ do_patchconcat_test 4.3.3 { INSERT INTO t2 VALUES('a', 'a', 'a', 'a'); } { DELETE FROM t2 WHERE c = 'a'; -} { -} +} {} # INSERT + UPDATE do_patchconcat_test 4.3.4 { diff --git a/manifest b/manifest index 7721fba7b0..dc02c7c9b6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\schange\sto\sdbfuzz2\sthat\sallows\sit\sto\sbe\scompiled\sagainst\solder\sversions\nof\sSQLite. -D 2019-02-26T18:21:08.097 +C Reformat\sthe\swhite-space\sin\sa\sfew\stest\scases\sso\sthat\sthe\stests\swork\swith\sTcl\s8.6.9. +D 2019-02-26T19:16:49.866 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -411,7 +411,7 @@ F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26 F ext/session/session8.test 8e194b3f655d861ca36de5d4de53f702751bab3b F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069 F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f -F ext/session/sessionB.test 886252dcb7e692e62ef7e357456200912e367823 +F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf F ext/session/sessionD.test 4f91d0ca8afc4c3969c72c9f0b5ea9527e21de29039937d0d973f821e8470724 F ext/session/sessionE.test b2010949c9d7415306f64e3c2072ddabc4b8250c98478d3c0c4d064bce83111d @@ -930,7 +930,7 @@ F test/fts3e.test 1f6c6ac9cc8b772ca256e6b22aaeed50c9350851 F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c77e526 F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 -F test/fts3expr4.test cac5dd815fe6b5921741abdccdde3b7f50b86394de91e13308ee7986859c4a9f +F test/fts3expr4.test f5b2832549f01b1f7f73389fa21d4b875499bc95bf7c8b36271844888c6a0938 F test/fts3expr5.test 1368738e3298a7ce0dee3a44d6ebb8f468b2a76f3d1dd18d4ea6d8bc2eeccc1b F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 @@ -1251,7 +1251,7 @@ F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7 F test/savepoint7.test cde525ea3075283eb950cdcdefe23ead4f700daa F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2 -F test/scanstatus.test d14842d0a2757ee059bcffa365746453d60952ba1077980c9a348a9fefbd232a +F test/scanstatus.test 874e35011779b07725a47dbf1dd6282b0ca04af7e028fb0b534ee544b571be42 F test/schema.test 8f7999be894260f151adf15c2c7540f1c6d6a481 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 @@ -1805,7 +1805,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 61fdfc57b9539cb6da5fc24653da2c8fb7c041a7409df911df11b987ed479a3a -R 8a086356711bdae53b7d275ff93df2e6 -U drh -Z 49f6be04f686338ed5b2d5276a561231 +P 6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 +R 671879425f3f9b82caeef04f70c245b6 +U dan +Z 7bb0b1b162b8573d979a1b96ab7f58d3 diff --git a/manifest.uuid b/manifest.uuid index 05691b35c1..92063a1f4e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 \ No newline at end of file +29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 \ No newline at end of file diff --git a/test/fts3expr4.test b/test/fts3expr4.test index 1bf039e55f..4a6bd293c4 100644 --- a/test/fts3expr4.test +++ b/test/fts3expr4.test @@ -68,7 +68,7 @@ do_icu_expr_test 3.2 {*lOl* *h4h*} { AND {AND {AND {PHRASE 3 0 *} {PHRASE 3 0 lol+}} {PHRASE 3 0 *}} {PHRASE 3 0 h4h+} } -do_simple_expr_test 3.3 { * } { } +do_simple_expr_test 3.3 { * } {} do_simple_expr_test 3.4 { *a } { PHRASE 3 0 a } do_simple_expr_test 3.5 { a*b } { AND {PHRASE 3 0 a+} {PHRASE 3 0 b} } do_simple_expr_test 3.6 { *a*b } { AND {PHRASE 3 0 a+} {PHRASE 3 0 b} } diff --git a/test/scanstatus.test b/test/scanstatus.test index 778a0c911e..1b92ef3fe1 100644 --- a/test/scanstatus.test +++ b/test/scanstatus.test @@ -254,7 +254,7 @@ do_execsql_test 4.0 { } do_execsql_test 4.1.1 { INSERT INTO t1 VALUES(1, 2, 3); } -do_scanstatus_test 4.1.2 { } +do_scanstatus_test 4.1.2 {} do_execsql_test 4.2 { CREATE TABLE p1(x PRIMARY KEY); From f26b1453855dc4d651b59239ef39b43e9447ab15 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 27 Feb 2019 15:26:03 +0000 Subject: [PATCH 280/306] Verify that fts5 auxiliary functions cannot be used in aggregate queries. FossilOrigin-Name: 122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 --- ext/fts5/test/fts5aux.test | 31 +++++++++++++++++++++++++++++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/ext/fts5/test/fts5aux.test b/ext/fts5/test/fts5aux.test index 0216b52539..561067c4bc 100644 --- a/ext/fts5/test/fts5aux.test +++ b/ext/fts5/test/fts5aux.test @@ -275,6 +275,37 @@ do_execsql_test 9.3 { 9 10 } +#------------------------------------------------------------------------- +# Test that aux. functions may not be used in aggregate queries. +# +reset_db +do_execsql_test 10.0 { + CREATE VIRTUAL TABLE t1 USING fts5(x, y, z); + INSERT INTO t1 VALUES('a', 'one two', 1); + INSERT INTO t1 VALUES('b', 'two three', 2); + INSERT INTO t1 VALUES('c', 'three four', 1); + INSERT INTO t1 VALUES('d', 'four five', 2); + INSERT INTO t1 VALUES('e', 'five six', 1); + INSERT INTO t1 VALUES('f', 'six seven', 2); +} +proc firstcol {cmd} { $cmd xColumnText 0 } +sqlite3_fts5_create_function db firstcol firstcol + +do_execsql_test 10.1.1 { + SELECT firstcol(t1) FROM t1 +} {a b c d e f} +do_execsql_test 10.1.2 { + SELECT group_concat(x, '.') FROM t1 +} {a.b.c.d.e.f} + +do_catchsql_test 10.1.3 { + SELECT group_concat(firstcol(t1), '.') FROM t1 +} {1 {unable to use function firstcol in the requested context}} + +do_catchsql_test 10.1.4 { + SELECT group_concat(firstcol(t1), '.') FROM t1 GROUP BY rowid +} {1 {unable to use function firstcol in the requested context}} finish_test + diff --git a/manifest b/manifest index dc02c7c9b6..91e378ed90 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reformat\sthe\swhite-space\sin\sa\sfew\stest\scases\sso\sthat\sthe\stests\swork\swith\sTcl\s8.6.9. -D 2019-02-26T19:16:49.866 +C Verify\sthat\sfts5\sauxiliary\sfunctions\scannot\sbe\sused\sin\saggregate\squeries. +D 2019-02-27T15:26:03.846 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -142,7 +142,7 @@ F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60 F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 F ext/fts5/test/fts5alter.test 5565f7e4605512b69171ac18ca84398603f9f6456dbe377beeca97e83cc242cd F ext/fts5/test/fts5auto.test 78989e6527ce69c9eddbef7392fea5c10b0010cd2b2ae68eec7bc869c471e691 -F ext/fts5/test/fts5aux.test 8e7f9c96f8570f48402f2fd7b74e1ccfadd319fa56ef677321880000f9739846 +F ext/fts5/test/fts5aux.test ebf6f2ff7cb556e83f66991b7f12bff016d3c83d4eab36704b649dd6b1437318 F ext/fts5/test/fts5auxdata.test eacc97ff04892f1a5f3d4df5a73f8bcbc3955ea1d12c9f24137eb1fc079e7611 F ext/fts5/test/fts5bigpl.test 6466c89b38439f0aba26ac09e232a6b963f29b1cbe1304f6a664fe1e7a8f5fd3 F ext/fts5/test/fts5bigtok.test 541119e616c637caea925a8c028c37c2c29e94383e00aa2f9198d530724b6e36 @@ -1805,7 +1805,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 6d39d6a68bf09e0b4f6706218373e74fc03148fd8bdba5031c3de2f750d87cf2 -R 671879425f3f9b82caeef04f70c245b6 +P 29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 +R 71be3f9cadb3d3db22b5f61c5be60610 U dan -Z 7bb0b1b162b8573d979a1b96ab7f58d3 +Z a18dd99afd6d91ff1d4c6dbed66d97ea diff --git a/manifest.uuid b/manifest.uuid index 92063a1f4e..042a028add 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 \ No newline at end of file +122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 \ No newline at end of file From 89d249364e4cdee732374cfdf2966b17bc3fe44a Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 27 Feb 2019 16:38:19 +0000 Subject: [PATCH 281/306] Add the "-returntype" option to the "db function" Tcl method. FossilOrigin-Name: 789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 --- manifest | 14 +++---- manifest.uuid | 2 +- src/tclsqlite.c | 98 ++++++++++++++++++++++++++++++++++----------- test/tclsqlite.test | 77 +++++++++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 91e378ed90..331c3ed6ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Verify\sthat\sfts5\sauxiliary\sfunctions\scannot\sbe\sused\sin\saggregate\squeries. -D 2019-02-27T15:26:03.846 +C Add\sthe\s"-returntype"\soption\sto\sthe\s"db\sfunction"\sTcl\smethod. +D 2019-02-27T16:38:19.320 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -524,7 +524,7 @@ F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c 6b19e7562195aaf881f3e35e2472dc01ae3cb156961db5126c3d616744729b7e +F src/tclsqlite.c de81c50e5112a8106da871b4d2dfef7748fe7625e148f85cc89ec7499b8e4de5 F src/test1.c 353b066e7ec761c4c715c1c20b888e0e7a0b0c0eda7f68c110e032d63713cade F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1366,7 +1366,7 @@ F test/tabfunc01.test 20e98ffe55f35d8d33fd834ca8bf9d4b637e560af8fcd00464b4154d90 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test dca8aa30d84175e7d8c8fc43d3ffa11fa56e23fbdac2679d03833a0f326edf34 +F test/tclsqlite.test 0037c0ca7fd3da08202a807f7b76590019841edb9f459fcfcf52aed7212bf853 F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 2479226e4cb96f4c663eccd2d12c077cf6bda29ca5cc69a8a58a06127105dd62 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@ -1805,7 +1805,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 29d02bf2fa9ecacbcc3e862ca70382f5875da8c1dc7fd27366190045fcc42b15 -R 71be3f9cadb3d3db22b5f61c5be60610 +P 122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 +R 4166c9e01ccb9a254eef55033738e8bf U dan -Z a18dd99afd6d91ff1d4c6dbed66d97ea +Z f227401976c706870557af555984f5d5 diff --git a/manifest.uuid b/manifest.uuid index 042a028add..a8da48124d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 \ No newline at end of file +789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 \ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index eb3bedf9d4..1b0086c7d5 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -93,6 +93,14 @@ typedef struct SqliteDb SqliteDb; /* ** New SQL functions can be created as TCL scripts. Each such function ** is described by an instance of the following structure. +** +** Variable eType may be set to SQLITE_INTEGER, SQLITE_FLOAT, SQLITE_TEXT, +** SQLITE_BLOB or SQLITE_NULL. If it is SQLITE_NULL, then the implementation +** attempts to determine the type of the result based on the Tcl object. +** If it is SQLITE_TEXT or SQLITE_BLOB, then a text (sqlite3_result_text()) +** or blob (sqlite3_result_blob()) is returned. If it is SQLITE_INTEGER +** or SQLITE_FLOAT, then an attempt is made to return an integer or float +** value, falling back to float and then text if this is not possible. */ typedef struct SqlFunc SqlFunc; struct SqlFunc { @@ -100,6 +108,7 @@ struct SqlFunc { Tcl_Obj *pScript; /* The Tcl_Obj representation of the script */ SqliteDb *pDb; /* Database connection that owns this function */ int useEvalObjv; /* True if it is safe to use Tcl_EvalObjv */ + int eType; /* Type of value to return */ char *zName; /* Name of this function */ SqlFunc *pNext; /* Next function on the list of them all */ }; @@ -995,27 +1004,54 @@ static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){ u8 *data; const char *zType = (pVar->typePtr ? pVar->typePtr->name : ""); char c = zType[0]; - if( c=='b' && strcmp(zType,"bytearray")==0 && pVar->bytes==0 ){ - /* Only return a BLOB type if the Tcl variable is a bytearray and - ** has no string representation. */ - data = Tcl_GetByteArrayFromObj(pVar, &n); - sqlite3_result_blob(context, data, n, SQLITE_TRANSIENT); - }else if( c=='b' && strcmp(zType,"boolean")==0 ){ - Tcl_GetIntFromObj(0, pVar, &n); - sqlite3_result_int(context, n); - }else if( c=='d' && strcmp(zType,"double")==0 ){ - double r; - Tcl_GetDoubleFromObj(0, pVar, &r); - sqlite3_result_double(context, r); - }else if( (c=='w' && strcmp(zType,"wideInt")==0) || - (c=='i' && strcmp(zType,"int")==0) ){ - Tcl_WideInt v; - Tcl_GetWideIntFromObj(0, pVar, &v); - sqlite3_result_int64(context, v); - }else{ - data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n); - sqlite3_result_text(context, (char *)data, n, SQLITE_TRANSIENT); + int eType = p->eType; + + if( eType==SQLITE_NULL ){ + if( c=='b' && strcmp(zType,"bytearray")==0 && pVar->bytes==0 ){ + /* Only return a BLOB type if the Tcl variable is a bytearray and + ** has no string representation. */ + eType = SQLITE_BLOB; + }else if( (c=='b' && strcmp(zType,"boolean")==0) + || (c=='w' && strcmp(zType,"wideInt")==0) + || (c=='i' && strcmp(zType,"int")==0) + ){ + eType = SQLITE_INTEGER; + }else if( c=='d' && strcmp(zType,"double")==0 ){ + eType = SQLITE_FLOAT; + }else{ + eType = SQLITE_TEXT; + } } + + switch( eType ){ + case SQLITE_BLOB: { + data = Tcl_GetByteArrayFromObj(pVar, &n); + sqlite3_result_blob(context, data, n, SQLITE_TRANSIENT); + break; + } + case SQLITE_INTEGER: { + Tcl_WideInt v; + if( TCL_OK==Tcl_GetWideIntFromObj(0, pVar, &v) ){ + sqlite3_result_int64(context, v); + break; + } + /* fall-through */ + } + case SQLITE_FLOAT: { + double r; + if( TCL_OK==Tcl_GetDoubleFromObj(0, pVar, &r) ){ + sqlite3_result_double(context, r); + break; + } + /* fall-through */ + } + default: { + data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n); + sqlite3_result_text(context, (char *)data, n, SQLITE_TRANSIENT); + break; + } + } + } } @@ -2646,6 +2682,7 @@ deserialize_error: char *zName; int nArg = -1; int i; + int eType = SQLITE_NULL; if( objc<4 ){ Tcl_WrongNumArgs(interp, 2, objv, "NAME ?SWITCHES? SCRIPT"); return TCL_ERROR; @@ -2653,7 +2690,7 @@ deserialize_error: for(i=3; i<(objc-1); i++){ const char *z = Tcl_GetString(objv[i]); int n = strlen30(z); - if( n>2 && strncmp(z, "-argcount",n)==0 ){ + if( n>1 && strncmp(z, "-argcount",n)==0 ){ if( i==(objc-2) ){ Tcl_AppendResult(interp, "option requires an argument: ", z,(char*)0); return TCL_ERROR; @@ -2666,11 +2703,25 @@ deserialize_error: } i++; }else - if( n>2 && strncmp(z, "-deterministic",n)==0 ){ + if( n>1 && strncmp(z, "-deterministic",n)==0 ){ flags |= SQLITE_DETERMINISTIC; + }else + if( n>1 && strncmp(z, "-returntype", n)==0 ){ + const char *azType[] = {"integer", "real", "text", "blob", "any", 0}; + assert( SQLITE_INTEGER==1 && SQLITE_FLOAT==2 && SQLITE_TEXT==3 ); + assert( SQLITE_BLOB==4 && SQLITE_NULL==5 ); + if( i==(objc-2) ){ + Tcl_AppendResult(interp, "option requires an argument: ", z,(char*)0); + return TCL_ERROR; + } + i++; + if( Tcl_GetIndexFromObj(interp, objv[i], azType, "type", 0, &eType) ){ + return TCL_ERROR; + } + eType++; }else{ Tcl_AppendResult(interp, "bad option \"", z, - "\": must be -argcount or -deterministic", (char*)0 + "\": must be -argcount, -deterministic or -returntype", (char*)0 ); return TCL_ERROR; } @@ -2686,6 +2737,7 @@ deserialize_error: pFunc->pScript = pScript; Tcl_IncrRefCount(pScript); pFunc->useEvalObjv = safeToUseEvalObjv(interp, pScript); + pFunc->eType = eType; rc = sqlite3_create_function(pDb->db, zName, nArg, flags, pFunc, tclSqlFunc, 0, 0); if( rc!=SQLITE_OK ){ diff --git a/test/tclsqlite.test b/test/tclsqlite.test index 36063bc46d..4a674a8f24 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -21,6 +21,7 @@ catch {sqlite3} set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix tcl # Check the error messages generated by tclsqlite # @@ -711,8 +712,84 @@ do_test tcl-16.103 { set res } {1 {a b *} 2 {a *} 3 {a b *}} +#------------------------------------------------------------------------- +# Test the -type option to [db function]. +# +reset_db +proc add {a b} { return [expr $a + $b] } +proc ret {a} { return $a } +db function add_i -returntype integer add +db function add_r -ret real add +db function add_t -return text add +db function add_b -returntype blob add +db function add_a -returntype any add +db function ret_i -returntype int ret +db function ret_r -returntype real ret +db function ret_t -returntype text ret +db function ret_b -returntype blob ret +db function ret_a -r any ret +do_execsql_test 17.0 { + SELECT quote( add_i(2, 3) ); + SELECT quote( add_r(2, 3) ); + SELECT quote( add_t(2, 3) ); + SELECT quote( add_b(2, 3) ); + SELECT quote( add_a(2, 3) ); +} {5 5.0 '5' X'35' 5} + +do_execsql_test 17.1 { + SELECT quote( add_i(2.2, 3.3) ); + SELECT quote( add_r(2.2, 3.3) ); + SELECT quote( add_t(2.2, 3.3) ); + SELECT quote( add_b(2.2, 3.3) ); + SELECT quote( add_a(2.2, 3.3) ); +} {5.5 5.5 '5.5' X'352E35' 5.5} + +do_execsql_test 17.2 { + SELECT quote( ret_i(2.5) ); + SELECT quote( ret_r(2.5) ); + SELECT quote( ret_t(2.5) ); + SELECT quote( ret_b(2.5) ); + SELECT quote( ret_a(2.5) ); +} {2.5 2.5 '2.5' X'322E35' 2.5} + +do_execsql_test 17.3 { + SELECT quote( ret_i('2.5') ); + SELECT quote( ret_r('2.5') ); + SELECT quote( ret_t('2.5') ); + SELECT quote( ret_b('2.5') ); + SELECT quote( ret_a('2.5') ); +} {2.5 2.5 '2.5' X'322E35' '2.5'} + +do_execsql_test 17.4 { + SELECT quote( ret_i('abc') ); + SELECT quote( ret_r('abc') ); + SELECT quote( ret_t('abc') ); + SELECT quote( ret_b('abc') ); + SELECT quote( ret_a('abc') ); +} {'abc' 'abc' 'abc' X'616263' 'abc'} + +do_execsql_test 17.5 { + SELECT quote( ret_i(X'616263') ); + SELECT quote( ret_r(X'616263') ); + SELECT quote( ret_t(X'616263') ); + SELECT quote( ret_b(X'616263') ); + SELECT quote( ret_a(X'616263') ); +} {'abc' 'abc' 'abc' X'616263' X'616263'} + +do_test 17.6.1 { + list [catch { db function xyz -return object ret } msg] $msg +} {1 {bad type "object": must be integer, real, text, blob, or any}} + +do_test 17.6.2 { + list [catch { db function xyz -return ret } msg] $msg +} {1 {option requires an argument: -return}} + +do_test 17.6.3 { + list [catch { db function xyz -n object ret } msg] $msg +} {1 {bad option "-n": must be -argcount, -deterministic or -returntype}} finish_test + From 03199343222fdf2db1ee4b264e79e52d251eb483 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 27 Feb 2019 19:59:56 +0000 Subject: [PATCH 282/306] Fix the readfile() UDF so that it returns an empty BLOB, not an OOM error, when reading an empty file. FossilOrigin-Name: 0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb --- ext/misc/fileio.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index b15e0fda1b..255a4fa2e7 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -152,13 +152,13 @@ static void readFileContents(sqlite3_context *ctx, const char *zName){ fclose(in); return; } - pBuf = sqlite3_malloc64( nIn ); + pBuf = sqlite3_malloc64( nIn ? nIn : 1 ); if( pBuf==0 ){ sqlite3_result_error_nomem(ctx); fclose(in); return; } - if( 1==fread(pBuf, nIn, 1, in) ){ + if( nIn==fread(pBuf, 1, nIn, in) ){ sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free); }else{ sqlite3_result_error_code(ctx, SQLITE_IOERR); diff --git a/manifest b/manifest index 331c3ed6ec..1a05243c1a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"-returntype"\soption\sto\sthe\s"db\sfunction"\sTcl\smethod. -D 2019-02-27T16:38:19.320 +C Fix\sthe\sreadfile()\sUDF\sso\sthat\sit\sreturns\san\sempty\sBLOB,\snot\san\sOOM\serror,\nwhen\sreading\san\sempty\sfile. +D 2019-02-27T19:59:56.536 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -285,7 +285,7 @@ F ext/misc/csv.c 7f047aeb68f5802e7ce6639292095d622a488bb43526ed04810e0649faa71ce F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 +F ext/misc/fileio.c e7864c391e14ccaf73ee4b22f5a55c1eb40ecc93a7f5ee77a1b41b87367ec7ae F ext/misc/fossildelta.c 3cc9a9b2f39889b43cd176c19f286bc7dd652f4c202c202d008481252d820316 F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c @@ -1805,7 +1805,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 122330dba3eb2492875bd02a46442306f73e251408447af5e5914ee0c8d6a110 -R 4166c9e01ccb9a254eef55033738e8bf -U dan -Z f227401976c706870557af555984f5d5 +P 789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 +R 8430a5ae199ad097ee7aa582e73883cd +U drh +Z 4cf753a6552dd62b27fdf5e7f3a478a4 diff --git a/manifest.uuid b/manifest.uuid index a8da48124d..0a8e027f6d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 \ No newline at end of file +0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb \ No newline at end of file From 8e0f794d17e110e145466d99fb8b106ac7ca30fe Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 27 Feb 2019 23:05:14 +0000 Subject: [PATCH 283/306] Enable the LIKE optimization when the ESCAPE keyword is present and the PRAGMA case_sensitive_like pragma is ON. FossilOrigin-Name: 6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/func.c | 4 ++++ test/like3.test | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1a05243c1a..c9649035b7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sreadfile()\sUDF\sso\sthat\sit\sreturns\san\sempty\sBLOB,\snot\san\sOOM\serror,\nwhen\sreading\san\sempty\sfile. -D 2019-02-27T19:59:56.536 +C Enable\sthe\sLIKE\soptimization\swhen\sthe\sESCAPE\skeyword\sis\spresent\sand\sthe\nPRAGMA\scase_sensitive_like\spragma\sis\sON. +D 2019-02-27T23:05:14.316 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -470,7 +470,7 @@ F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c f2d0ecf68213770be4fad83128ce02e67667deebaa0a44061313f7e4f2a4ae28 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 -F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 +F src/func.c 2ccf4ae12430b1ae7096be5f0675887e1bd0732828af0ac0f7496339b7c6edee F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 @@ -1081,7 +1081,7 @@ F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 F test/like.test 11cfd7d4ef8625389df9efc46735ff0b0b41d5e62047ef0f3bc24c380d28a7a6 F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da -F test/like3.test 430691e6057e11a59e934be74c06b85605b80061d45af5714d52886a811efeb7 +F test/like3.test 0ce2630e39e32e42ce02d171f0a315189ca71fec37c5ddfb0191eecc3fe9d4da F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e F test/loadext.test faa4f6eed07a5aac35d57fdd7bc07f8fc82464cfd327567c10cf0ba3c86cde04 @@ -1805,7 +1805,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 789a492b68c353e2b763d67d399722b7ab61bfe09b472466df2821f65cab1be9 -R 8430a5ae199ad097ee7aa582e73883cd +P 0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb +R 5105eecccd0b13c8698eaccb6e160d90 U drh -Z 4cf753a6552dd62b27fdf5e7f3a478a4 +Z 96b31332bdac2a0724df8a5af90860de diff --git a/manifest.uuid b/manifest.uuid index 0a8e027f6d..f38f308993 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb \ No newline at end of file +6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 8b1d4416a4..03595b70d2 100644 --- a/src/func.c +++ b/src/func.c @@ -1806,6 +1806,10 @@ static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){ if( ALWAYS(pDef) ){ pDef->funcFlags |= flagVal; } + pDef = sqlite3FindFunction(db, zName, 3, SQLITE_UTF8, 0); + if( pDef ){ + pDef->funcFlags |= flagVal; + } } /* diff --git a/test/like3.test b/test/like3.test index 575faaf104..622f8335eb 100644 --- a/test/like3.test +++ b/test/like3.test @@ -178,4 +178,56 @@ do_eqp_test like3-5.211 { `--SEARCH TABLE t5b USING COVERING INDEX sqlite_autoindex_t5b_1 (x>? AND x? AND path? AND path? AND path? AND path? AND path? AND path Date: Thu, 28 Feb 2019 13:21:36 +0000 Subject: [PATCH 284/306] Add an "|| CORRUPT_DB" term to an assert() statement in the btree defragmenter. FossilOrigin-Name: 6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 1010688 -> 1013760 bytes 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c9649035b7..2d22cfef55 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\sthe\sLIKE\soptimization\swhen\sthe\sESCAPE\skeyword\sis\spresent\sand\sthe\nPRAGMA\scase_sensitive_like\spragma\sis\sON. -D 2019-02-27T23:05:14.316 +C Add\san\s"||\sCORRUPT_DB"\sterm\sto\san\sassert()\sstatement\sin\sthe\sbtree\sdefragmenter. +D 2019-02-28T13:21:36.882 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -456,7 +456,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c f85f8abe99ec3e72671f0fc9b09114188974fe0b9a3ea9edc77977e853ff75e9 +F src/btree.c 59695c6e5eb527bfefc2b3d8ffebd178ad8686eaeb810c9f57719d6d2b72822e F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 3acec29b23948042173301a8befebae01a98344debf66cbd4467c8b9077707b8 @@ -993,7 +993,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 2328494c8c0c18d95e5e04b05cc6dd94bc6b5baf9641fc36b1e881619b897b54 +F test/fuzzdata8.db 91d6b30312ae7661d8b772314f51759a8a4c565957b25e16cdb9109f89624423 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1805,7 +1805,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 0edad5339e36d69aed9289bb3e60d35f9930386d76a62bb0194c4fdf420d16fb -R 5105eecccd0b13c8698eaccb6e160d90 +P 6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 +R 4025c666f5821a2daa8fcb5b9013eca1 U drh -Z 96b31332bdac2a0724df8a5af90860de +Z a4ece4dce331064a24f4679f8d9a11f2 diff --git a/manifest.uuid b/manifest.uuid index f38f308993..65fb11bfb3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 \ No newline at end of file +6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 9e7a9c0426..d133395659 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1421,7 +1421,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ hdr = pPage->hdrOffset; cellOffset = pPage->cellOffset; nCell = pPage->nCell; - assert( nCell==get2byte(&data[hdr+3]) ); + assert( nCell==get2byte(&data[hdr+3]) || CORRUPT_DB ); iCellFirst = cellOffset + 2*nCell; usableSize = pPage->pBt->usableSize; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 8ebedd1d765978c511fcf38d6c4f6727bdc928b7..8b1cf405720ed53761b5d0251da7d810a84c5406 100644 GIT binary patch delta 15350 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 Q9o%Qwnne2r=kX8!5Bz~6sQ>@~ delta 14994 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 Date: Thu, 28 Feb 2019 13:41:35 +0000 Subject: [PATCH 285/306] Avoid an assert() failure and an undefined left-shift operation in the fts3 snippet() function that could occur if the database was corrupt. FossilOrigin-Name: d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 --- ext/fts3/fts3_snippet.c | 2 +- manifest | 16 +-- manifest.uuid | 2 +- test/fts3corrupt4.test | 220 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 230 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 58a71d2dd6..1a04b71927 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -429,7 +429,7 @@ static void fts3SnippetDetails( char *pCsr = pPhrase->pTail; int iCsr = pPhrase->iTail; - while( iCsr<(iStart+pIter->nSnippet) ){ + while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ int j; u64 mPhrase = (u64)1 << i; u64 mPos = (u64)1 << (iCsr - iStart); diff --git a/manifest b/manifest index 2d22cfef55..c39a4e9d9c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\s"||\sCORRUPT_DB"\sterm\sto\san\sassert()\sstatement\sin\sthe\sbtree\sdefragmenter. -D 2019-02-28T13:21:36.882 +C Avoid\san\sassert()\sfailure\sand\san\sundefined\sleft-shift\soperation\sin\sthe\sfts3\ssnippet()\sfunction\sthat\scould\soccur\sif\sthe\sdatabase\swas\scorrupt. +D 2019-02-28T13:41:35.509 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -89,7 +89,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c d002c29d3e71c15b27326b818c1e49a4d0d5fc342cc8e9522e2bf2a3077c75a2 +F ext/fts3/fts3_snippet.c 0d8362efa59637dc7c09dc88899eb072aa409fe1e0d0fdeda55ec1e562c50310 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 @@ -919,7 +919,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 8733b9589701df24cf5f35ed36fec865edd67f24961f24ac69d751b4221494f7 +F test/fts3corrupt4.test 3f2b9abb5b2fcabb51da09a5956c292e8fc2bf2c27e1f2b86f313e8e232b5bff F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1805,7 +1805,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 6ae4b8c525f446ddb0e0bdd5e4e01e06e2ab975e3effa42fce6a1102b3a39830 -R 4025c666f5821a2daa8fcb5b9013eca1 -U drh -Z a4ece4dce331064a24f4679f8d9a11f2 +P 6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 +R ec544e5efe12bbc6177aac59b37c5a1c +U dan +Z d16afbf29591bc852a3e6830b1d24630 diff --git a/manifest.uuid b/manifest.uuid index 65fb11bfb3..6989a978b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 \ No newline at end of file +d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index d200c95fa9..27b42cb965 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -3476,6 +3476,226 @@ do_catchsql_test 21.1 { SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'R*'; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 22.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-b794c89d922ac9.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 07 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 61 6c 65 74 31 5f 73 65 67 64 69 72 .5taalet1_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 67 64 69 72 egdir_1t1_segdir +| 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 84 65 6e 74 74 31 5f 63 6f 6e 74 1_con.entt1_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 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', '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 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 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 49 53 35 20 45 4e 41 42 4c 45 20 MEMSIS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 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 26 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 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD 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 45 1e 1f 05 00 33 0f 17 ONXNOCASE....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 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX 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 17 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 55 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LU 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 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 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 19 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 4e f5 20 46 54 53 34 ..#..ENABN. FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE 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: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 41 53 ...1..ENABLE DAS +| 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 ab 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 48 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d HRTRIM'...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 43 49 4e 41 52 59 27 20160609XCINARY' +| 4016: 02 04 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 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 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 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 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 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 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 d4 01 02 ff 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 64 d3 09 01 03 ..........gd.... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 19 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 12 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 07 80 00 f3 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 00 00 00 00 00 00 00 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 1b 72 65 62 ity-check....reb +| end crash-b794c89d922ac9.db +}]} {} + +do_catchsql_test 22.1 { + SELECT snippet(t1,'', '', '--',-1,01)==0 + FROM t1 WHERE a MATCH 'rtree OR json1rtree OR json1'; +} {0 {0 0 0 0 0 0 0}} finish_test From 4ddf7f42115eb93c489f966e035dec00af57aa39 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 Feb 2019 14:09:14 +0000 Subject: [PATCH 286/306] New test case loaded into test/fuzzdata8.db. FossilOrigin-Name: 00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1013760 -> 1021952 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c39a4e9d9c..baa5726857 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\san\sassert()\sfailure\sand\san\sundefined\sleft-shift\soperation\sin\sthe\sfts3\ssnippet()\sfunction\sthat\scould\soccur\sif\sthe\sdatabase\swas\scorrupt. -D 2019-02-28T13:41:35.509 +C New\stest\scase\sloaded\sinto\stest/fuzzdata8.db. +D 2019-02-28T14:09:14.893 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -993,7 +993,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 -F test/fuzzdata8.db 91d6b30312ae7661d8b772314f51759a8a4c565957b25e16cdb9109f89624423 +F test/fuzzdata8.db bcdd2175b8876c3679aa1c00874a9f69368f464e498f800d3917bd74a0563127 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1805,7 +1805,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 6bfd8655f006e031c0d4c988356c4b9206efa6bfdb034fde8ffa3361521a4844 -R ec544e5efe12bbc6177aac59b37c5a1c -U dan -Z d16afbf29591bc852a3e6830b1d24630 +P d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 +R 76ee1637810bdaf539a762a9c646979d +U drh +Z ac7f7b28caabfd1523a4f739ee67d612 diff --git a/manifest.uuid b/manifest.uuid index 6989a978b4..cba481dcd3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 \ No newline at end of file +00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 8b1cf405720ed53761b5d0251da7d810a84c5406..230960b9d9e2b144b800e203900d61bce23e5e56 100644 GIT binary patch delta 10610 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 delta 9937 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 Date: Thu, 28 Feb 2019 17:29:19 +0000 Subject: [PATCH 287/306] Add the new "bind_fallback" method to the "sqlite3" object in the TCL interface. FossilOrigin-Name: c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 --- manifest | 14 ++--- manifest.uuid | 2 +- src/tclsqlite.c | 127 ++++++++++++++++++++++++++++++++++---------- test/tclsqlite.test | 59 +++++++++++++++++++- 4 files changed, 164 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index baa5726857..4f2d856111 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scase\sloaded\sinto\stest/fuzzdata8.db. -D 2019-02-28T14:09:14.893 +C Add\sthe\snew\s"bind_fallback"\smethod\sto\sthe\s"sqlite3"\sobject\sin\sthe\sTCL\ninterface. +D 2019-02-28T17:29:19.212 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -524,7 +524,7 @@ F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c de81c50e5112a8106da871b4d2dfef7748fe7625e148f85cc89ec7499b8e4de5 +F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 F src/test1.c 353b066e7ec761c4c715c1c20b888e0e7a0b0c0eda7f68c110e032d63713cade F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1366,7 +1366,7 @@ F test/tabfunc01.test 20e98ffe55f35d8d33fd834ca8bf9d4b637e560af8fcd00464b4154d90 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 0037c0ca7fd3da08202a807f7b76590019841edb9f459fcfcf52aed7212bf853 +F test/tclsqlite.test 5a06962d8f18edf4703931f6b7dacd83678d02fa5c8ced9a7958c007ad58626a F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 2479226e4cb96f4c663eccd2d12c077cf6bda29ca5cc69a8a58a06127105dd62 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@ -1805,7 +1805,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 d5250db6322103326f0d5782ba049996d9ce8784f9e53a3112fb6f09f888f1c3 -R 76ee1637810bdaf539a762a9c646979d +P 00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 +R 448ca78435be9ef8ac1ee1c7bdd459a0 U drh -Z ac7f7b28caabfd1523a4f739ee67d612 +Z 8dd6bd727b5289a2522f6d5168203921 diff --git a/manifest.uuid b/manifest.uuid index cba481dcd3..2283367472 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 \ No newline at end of file +c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 \ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 1b0086c7d5..a78d5676c7 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -159,6 +159,7 @@ struct SqliteDb { char *zTraceV2; /* The trace_v2 callback routine */ char *zProfile; /* The profile callback routine */ char *zProgress; /* The progress callback routine */ + char *zBindFallback; /* Callback to invoke on a binding miss */ char *zAuth; /* The authorization callback routine */ int disableAuth; /* Disable the authorizer if it exists */ char *zNull; /* Text to substitute for an SQL NULL value */ @@ -549,6 +550,9 @@ static void SQLITE_TCLAPI DbDeleteCmd(void *db){ if( pDb->zProfile ){ Tcl_Free(pDb->zProfile); } + if( pDb->zBindFallback ){ + Tcl_Free(pDb->zBindFallback); + } if( pDb->zAuth ){ Tcl_Free(pDb->zAuth); } @@ -1301,6 +1305,8 @@ static int dbPrepareAndBind( int iParm = 0; /* Next free entry in apParm */ char c; int i; + int needResultReset = 0; /* Need to invoke Tcl_ResetResult() */ + int rc = SQLITE_OK; /* Value to return */ Tcl_Interp *interp = pDb->interp; *ppPreStmt = 0; @@ -1388,6 +1394,25 @@ static int dbPrepareAndBind( const char *zVar = sqlite3_bind_parameter_name(pStmt, i); if( zVar!=0 && (zVar[0]=='$' || zVar[0]==':' || zVar[0]=='@') ){ Tcl_Obj *pVar = Tcl_GetVar2Ex(interp, &zVar[1], 0, 0); + if( pVar==0 && pDb->zBindFallback!=0 ){ + Tcl_Obj *pCmd; + int rx; + pCmd = Tcl_NewStringObj(pDb->zBindFallback, -1); + Tcl_IncrRefCount(pCmd); + Tcl_ListObjAppendElement(interp, pCmd, Tcl_NewStringObj(zVar,-1)); + if( needResultReset ) Tcl_ResetResult(interp); + needResultReset = 1; + rx = Tcl_EvalObjEx(interp, pCmd, TCL_EVAL_DIRECT); + Tcl_DecrRefCount(pCmd); + if( rx==TCL_OK ){ + pVar = Tcl_GetObjResult(interp); + }else if( rx==TCL_ERROR ){ + rc = TCL_ERROR; + break; + }else{ + pVar = 0; + } + } if( pVar ){ int n; u8 *data; @@ -1423,12 +1448,14 @@ static int dbPrepareAndBind( }else{ sqlite3_bind_null(pStmt, i); } + if( needResultReset ) Tcl_ResetResult(pDb->interp); } } pPreStmt->nParm = iParm; *ppPreStmt = pPreStmt; + if( needResultReset && rc==TCL_OK ) Tcl_ResetResult(pDb->interp); - return TCL_OK; + return rc; } /* @@ -1887,35 +1914,36 @@ static int SQLITE_TCLAPI DbObjCmd( int choice; int rc = TCL_OK; static const char *DB_strs[] = { - "authorizer", "backup", "busy", - "cache", "changes", "close", - "collate", "collation_needed", "commit_hook", - "complete", "copy", "deserialize", - "enable_load_extension", "errorcode", "eval", - "exists", "function", "incrblob", - "interrupt", "last_insert_rowid", "nullvalue", - "onecolumn", "preupdate", "profile", - "progress", "rekey", "restore", - "rollback_hook", "serialize", "status", - "timeout", "total_changes", "trace", - "trace_v2", "transaction", "unlock_notify", - "update_hook", "version", "wal_hook", - 0 + "authorizer", "backup", "bind_fallback", + "busy", "cache", "changes", + "close", "collate", "collation_needed", + "commit_hook", "complete", "copy", + "deserialize", "enable_load_extension", "errorcode", + "eval", "exists", "function", + "incrblob", "interrupt", "last_insert_rowid", + "nullvalue", "onecolumn", "preupdate", + "profile", "progress", "rekey", + "restore", "rollback_hook", "serialize", + "status", "timeout", "total_changes", + "trace", "trace_v2", "transaction", + "unlock_notify", "update_hook", "version", + "wal_hook", 0 }; enum DB_enum { - DB_AUTHORIZER, DB_BACKUP, DB_BUSY, - DB_CACHE, DB_CHANGES, DB_CLOSE, - DB_COLLATE, DB_COLLATION_NEEDED, DB_COMMIT_HOOK, - DB_COMPLETE, DB_COPY, DB_DESERIALIZE, - DB_ENABLE_LOAD_EXTENSION, DB_ERRORCODE, DB_EVAL, - DB_EXISTS, DB_FUNCTION, DB_INCRBLOB, - DB_INTERRUPT, DB_LAST_INSERT_ROWID, DB_NULLVALUE, - DB_ONECOLUMN, DB_PREUPDATE, DB_PROFILE, - DB_PROGRESS, DB_REKEY, DB_RESTORE, - DB_ROLLBACK_HOOK, DB_SERIALIZE, DB_STATUS, - DB_TIMEOUT, DB_TOTAL_CHANGES, DB_TRACE, - DB_TRACE_V2, DB_TRANSACTION, DB_UNLOCK_NOTIFY, - DB_UPDATE_HOOK, DB_VERSION, DB_WAL_HOOK + DB_AUTHORIZER, DB_BACKUP, DB_BIND_FALLBACK, + DB_BUSY, DB_CACHE, DB_CHANGES, + DB_CLOSE, DB_COLLATE, DB_COLLATION_NEEDED, + DB_COMMIT_HOOK, DB_COMPLETE, DB_COPY, + DB_DESERIALIZE, DB_ENABLE_LOAD_EXTENSION,DB_ERRORCODE, + DB_EVAL, DB_EXISTS, DB_FUNCTION, + DB_INCRBLOB, DB_INTERRUPT, DB_LAST_INSERT_ROWID, + DB_NULLVALUE, DB_ONECOLUMN, DB_PREUPDATE, + DB_PROFILE, DB_PROGRESS, DB_REKEY, + DB_RESTORE, DB_ROLLBACK_HOOK, DB_SERIALIZE, + DB_STATUS, DB_TIMEOUT, DB_TOTAL_CHANGES, + DB_TRACE, DB_TRACE_V2, DB_TRANSACTION, + DB_UNLOCK_NOTIFY, DB_UPDATE_HOOK, DB_VERSION, + DB_WAL_HOOK }; /* don't leave trailing commas on DB_enum, it confuses the AIX xlc compiler */ @@ -2037,6 +2065,49 @@ static int SQLITE_TCLAPI DbObjCmd( break; } + /* $db bind_fallback ?CALLBACK? + ** + ** When resolving bind parameters in an SQL statement, if the parameter + ** cannot be associated with a TCL variable then invoke CALLBACK with a + ** single argument that is the name of the parameter and use the return + ** value of the CALLBACK as the binding. If CALLBACK returns something + ** other than TCL_OK or TCL_ERROR then bind a NULL. + ** + ** If CALLBACK is an empty string, then revert to the default behavior + ** which is to set the binding to NULL. + ** + ** If CALLBACK returns an error, that causes the statement execution to + ** abort. Hence, to configure a connection so that it throws an error + ** on an attempt to bind an unknown variable, do something like this: + ** + ** proc bind_error {name} {error "no such variable: $name"} + ** db bind_fallback bind_error + */ + case DB_BIND_FALLBACK: { + if( objc>3 ){ + Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?"); + return TCL_ERROR; + }else if( objc==2 ){ + if( pDb->zBindFallback ){ + Tcl_AppendResult(interp, pDb->zBindFallback, (char*)0); + } + }else{ + char *zCallback; + int len; + if( pDb->zBindFallback ){ + Tcl_Free(pDb->zBindFallback); + } + zCallback = Tcl_GetStringFromObj(objv[2], &len); + if( zCallback && len>0 ){ + pDb->zBindFallback = Tcl_Alloc( len + 1 ); + memcpy(pDb->zBindFallback, zCallback, len+1); + }else{ + pDb->zBindFallback = 0; + } + } + break; + } + /* $db busy ?CALLBACK? ** ** Invoke the given callback if an SQL statement attempts to open diff --git a/test/tclsqlite.test b/test/tclsqlite.test index 4a674a8f24..319737426f 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -42,7 +42,7 @@ do_test tcl-1.1.1 { do_test tcl-1.2 { set v [catch {db bogus} msg] lappend v $msg -} {1 {bad option "bogus": must be authorizer, backup, busy, cache, changes, close, collate, collation_needed, commit_hook, complete, copy, deserialize, enable_load_extension, errorcode, eval, exists, function, incrblob, interrupt, last_insert_rowid, nullvalue, onecolumn, preupdate, profile, progress, rekey, restore, rollback_hook, serialize, status, timeout, total_changes, trace, trace_v2, transaction, unlock_notify, update_hook, version, or wal_hook}} +} {1 {bad option "bogus": must be authorizer, backup, bind_fallback, busy, cache, changes, close, collate, collation_needed, commit_hook, complete, copy, deserialize, enable_load_extension, errorcode, eval, exists, function, incrblob, interrupt, last_insert_rowid, nullvalue, onecolumn, preupdate, profile, progress, rekey, restore, rollback_hook, serialize, status, timeout, total_changes, trace, trace_v2, transaction, unlock_notify, update_hook, version, or wal_hook}} do_test tcl-1.2.1 { set v [catch {db cache bogus} msg] lappend v $msg @@ -791,5 +791,60 @@ do_test 17.6.3 { list [catch { db function xyz -n object ret } msg] $msg } {1 {bad option "-n": must be -argcount, -deterministic or -returntype}} -finish_test +# 2019-02-28: The "bind_fallback" command. +# +do_test 18.100 { + unset -nocomplain bindings abc def ghi jkl mno e01 e02 + set bindings(abc) [expr {1+2}] + set bindings(def) {hello} + set bindings(ghi) [expr {3.1415926*1.0}] + proc bind_callback {nm} { + global bindings + set n2 [string range $nm 1 end] + if {[info exists bindings($n2)]} { + return $bindings($n2) + } + if {[string match e* $n2]} { + error "no such variable: $nm" + } + return -code return {} + } + db bind_fallback bind_callback + db eval {SELECT $abc, typeof($abc), $def, typeof($def), $ghi, typeof($ghi)} +} {3 integer hello text 3.1415926 real} +do_test 18.110 { + db eval {SELECT quote(@def), typeof(@def)} +} {X'68656C6C6F' blob} +do_execsql_test 18.120 { + SELECT typeof($mno); +} {null} +do_catchsql_test 18.130 { + SELECT $e01; +} {1 {no such variable: $e01}} +do_test 18.140 { + db bind_fallback +} {bind_callback} +do_test 18.200 { + db bind_fallback {} + db eval {SELECT $abc, typeof($abc), $def, typeof($def), $ghi, typeof($ghi)} +} {{} null {} null {} null} +do_test 18.300 { + unset -nocomplain bindings + proc bind_callback {nm} {lappend ::bindings $nm} + db bind_fallback bind_callback + db eval {SELECT $abc, @def, $ghi(123), :mno} + set bindings +} {{$abc} @def {$ghi(123)} :mno} +do_test 18.900 { + set rc [catch {db bind_fallback a b} msg] + lappend rc $msg +} {1 {wrong # args: should be "db bind_fallback ?CALLBACK?"}} +do_test 18.910 { + db bind_fallback bind_fallback_does_not_exist +} {} +do_catchsql_test 19.911 { + SELECT $abc, typeof($abc), $def, typeof($def), $ghi, typeof($ghi); +} {1 {invalid command name "bind_fallback_does_not_exist"}} +db bind_fallback {} +finish_test From 9cb02640419614ae3771ebbffce076474380029b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 Feb 2019 20:10:52 +0000 Subject: [PATCH 288/306] Add the ".parameter" command to the CLI. FossilOrigin-Name: 1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 --- manifest | 12 ++--- manifest.uuid | 2 +- src/shell.c.in | 121 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 4f2d856111..e2da2af99e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\snew\s"bind_fallback"\smethod\sto\sthe\s"sqlite3"\sobject\sin\sthe\sTCL\ninterface. -D 2019-02-28T17:29:19.212 +C Add\sthe\s".parameter"\scommand\sto\sthe\sCLI. +D 2019-02-28T20:10:52.766 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -516,7 +516,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 -F src/shell.c.in a238f3f80f7085d31056c69930ec13a87872da0d0d08fd561f5aff78cc618f5d +F src/shell.c.in 249c0bf34f7ce272cb17162c297c45ab674a52a5d85193a86191f131196de47f F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 @@ -1805,7 +1805,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 00ae0c6c4815366bd2f36bc054b13bc7b568dd0a3caceddf0eba4db33f010ee4 -R 448ca78435be9ef8ac1ee1c7bdd459a0 +P c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 +R 2fecd2e603ada3a0c6460ef11e6e9c28 U drh -Z 8dd6bd727b5289a2522f6d5168203921 +Z f7dd879e1ba76ea61ec7d6d44725ec74 diff --git a/manifest.uuid b/manifest.uuid index 2283367472..91cf4ac998 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 \ No newline at end of file +1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 3474c10ca8..df81c2e99c 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2750,6 +2750,16 @@ static void restore_debug_trace_modes(void){ /* Name of the TEMP table that holds bind parameter values */ #define BIND_PARAM_TABLE "$Parameters" +/* Create the TEMP table used to store parameter bindings */ +static void bind_table_init(ShellState *p){ + sqlite3_exec(p->db, + "CREATE TABLE IF NOT EXISTS temp.[" BIND_PARAM_TABLE "](\n" + " key TEXT PRIMARY KEY,\n" + " value ANY\n" + ") WITHOUT ROWID;", + 0, 0, 0); +} + /* ** Bind parameters on a prepared statement. ** @@ -3547,6 +3557,13 @@ static const char *(azHelp[]) = { " --zip FILE is a ZIP archive", ".output ?FILE? Send output to FILE or stdout if FILE is omitted", " If FILE begins with '|' then open it as a pipe.", + ".parameter CMD ... Manage SQL parameter bindings", + " clear Erase all bindings", + " init Initialize the TEMP table that holds bindings", + " list List the current parameter bindings", + " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", + " PARAMETER should start with '$', ':', '@', or '?'", + " unset PARAMETER Remove PARAMETER from the binding table", ".print STRING... Print literal STRING", #ifndef SQLITE_OMIT_PROGRESS_CALLBACK ".progress N Invoke progress handler after every N opcodes", @@ -7078,6 +7095,110 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else + if( c=='p' && n>=3 && strncmp(azArg[0], "parameter", n)==0 ){ + open_db(p,0); + if( nArg<=1 ) goto parameter_syntax_error; + + /* .parameter clear + ** Clear all bind parameters by dropping the TEMP table that holds them. + */ + if( nArg==2 && strcmp(azArg[1],"clear")==0 ){ + sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp.[" BIND_PARAM_TABLE "];", + 0, 0, 0); + }else + + /* .parameter list + ** List all bind parameters. + */ + if( nArg==2 && strcmp(azArg[1],"list")==0 ){ + sqlite3_stmt *pStmt = 0; + int rx; + int len = 0; + rx = sqlite3_prepare_v2(p->db, + "SELECT max(length(key)) " + "FROM temp.[" BIND_PARAM_TABLE "];", -1, &pStmt, 0); + if( rx==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){ + len = sqlite3_column_int(pStmt, 0); + if( len>40 ) len = 40; + } + sqlite3_finalize(pStmt); + pStmt = 0; + if( len ){ + rx = sqlite3_prepare_v2(p->db, + "SELECT key, quote(value) " + "FROM temp.[" BIND_PARAM_TABLE "];", -1, &pStmt, 0); + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + utf8_printf(p->out, "%-*s %s\n", len, sqlite3_column_text(pStmt,0), + sqlite3_column_text(pStmt,1)); + } + sqlite3_finalize(pStmt); + } + }else + + /* .parameter init + ** Make sure the TEMP table used to hold bind parameters exists. + ** Create it if necessary. + */ + if( nArg==2 && strcmp(azArg[1],"init")==0 ){ + bind_table_init(p); + }else + + /* .parameter set NAME VALUE + ** Set or reset a bind parameter. NAME should be the full parameter + ** name exactly as it appears in the query. (ex: $abc, @def). The + ** VALUE can be in either SQL literal notation, or if not it will be + ** understood to be a text string. + */ + if( nArg==4 && strcmp(azArg[1],"set")==0 ){ + int rx; + char *zSql; + sqlite3_stmt *pStmt; + const char *zKey = azArg[2]; + const char *zValue = azArg[3]; + bind_table_init(p); + zSql = sqlite3_mprintf( + "REPLACE INTO temp.[" BIND_PARAM_TABLE "](key,value)" + "VALUES(%Q,%s);", zKey, zValue); + if( zSql==0 ) shell_out_of_memory(); + pStmt = 0; + rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rx!=SQLITE_OK ){ + sqlite3_finalize(pStmt); + pStmt = 0; + zSql = sqlite3_mprintf( + "REPLACE INTO temp.[" BIND_PARAM_TABLE "](key,value)" + "VALUES(%Q,%Q);", zKey, zValue); + if( zSql==0 ) shell_out_of_memory(); + rx = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rx!=SQLITE_OK ){ + utf8_printf(p->out, "Error: %s\n", sqlite3_errmsg(p->db)); + sqlite3_finalize(pStmt); + pStmt = 0; + rc = 1; + } + } + sqlite3_step(pStmt); + sqlite3_finalize(pStmt); + }else + + /* .parameter unset NAME + ** Remove the NAME binding from the parameter binding table, if it + ** exists. + */ + if( nArg==3 && strcmp(azArg[1],"unset")==0 ){ + char *zSql = sqlite3_mprintf( + "DELETE FROM temp.[" BIND_PARAM_TABLE "] WHERE key=%Q", azArg[2]); + if( zSql==0 ) shell_out_of_memory(); + sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_free(zSql); + }else + /* If no command name matches, show a syntax error */ + parameter_syntax_error: + showHelp(p->out, "parameter"); + }else + if( c=='p' && n>=3 && strncmp(azArg[0], "print", n)==0 ){ int i; for(i=1; i Date: Fri, 1 Mar 2019 18:07:05 +0000 Subject: [PATCH 289/306] In a query that uses a partial index, the expression that is the WHERE clause of the partial index must always be true. Use this fact to avoid evaluating identical terms in the WHERE clause of the query. FossilOrigin-Name: 9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index e2da2af99e..1191584f39 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s".parameter"\scommand\sto\sthe\sCLI. -D 2019-02-28T20:10:52.766 +C In\sa\squery\sthat\suses\sa\spartial\sindex,\sthe\sexpression\sthat\sis\sthe\sWHERE\sclause\nof\sthe\spartial\sindex\smust\salways\sbe\strue.\s\sUse\sthis\sfact\sto\savoid\sevaluating\nidentical\sterms\sin\sthe\sWHERE\sclause\sof\sthe\squery. +D 2019-03-01T18:07:05.251 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -602,7 +602,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c 061848646cc46a137d9038e47e666a955b3b2a1b458365eeed76b004c0053f3b +F src/wherecode.c ce7b21e1be2b981d62683fc59c4ca73a04a7ff2f1ebec23d41baf2da2349afd6 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1805,7 +1805,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 c7f70b6d96338dba201e005104e7f7148c1a8cd767ab05e35b44617c4c797bc5 -R 2fecd2e603ada3a0c6460ef11e6e9c28 +P 1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 +R 999cfe5c6c09ddc9e9ba3498e400f74c U drh -Z f7dd879e1ba76ea61ec7d6d44725ec74 +Z 0f8a04d58b07ebfff6d09b88278bd01c diff --git a/manifest.uuid b/manifest.uuid index 91cf4ac998..5f1016277a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 \ No newline at end of file +9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 79189386b6..758d6b5eec 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1159,6 +1159,34 @@ static void whereIndexExprTrans( } } +/* +** The pTruth expression is always tree because it is the WHERE clause +** a partial index that is driving a query loop. Look through all of the +** WHERE clause terms on the query, and if any of those terms must be +** true because pTruth is true, then mark those WHERE clause terms as +** coded. +*/ +static void whereApplyPartialIndexConstraints( + Expr *pTruth, + int iTabCur, + WhereClause *pWC +){ + int i; + WhereTerm *pTerm; + while( pTruth->op==TK_AND ){ + whereApplyPartialIndexConstraints(pTruth->pLeft, iTabCur, pWC); + pTruth = pTruth->pRight; + } + for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ + Expr *pExpr; + if( pTerm->wtFlags & TERM_CODED ) continue; + pExpr = pTerm->pExpr; + if( sqlite3ExprCompare(0, pExpr, pTruth, iTabCur)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } +} + /* ** Generate code for the start of the iLevel-th loop in the WHERE clause ** implementation described by pWInfo. @@ -1768,6 +1796,14 @@ Bitmask sqlite3WhereCodeOneLoopStart( whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); } + /* If a partial index is driving the loop, try to eliminate WHERE clause + ** terms from the query that must be true due to the WHERE clause of + ** the partial index + */ + if( pIdx->pPartIdxWhere ){ + whereApplyPartialIndexConstraints(pIdx->pPartIdxWhere, iCur, pWC); + } + /* Record the instruction used to terminate the loop. */ if( pLoop->wsFlags & WHERE_ONEROW ){ pLevel->op = OP_Noop; From 10cc16c95418f3c178637026fbc9206a063ec841 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Mar 2019 21:12:40 +0000 Subject: [PATCH 290/306] Fix a minor comment typo. No code changes. FossilOrigin-Name: 9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1191584f39..126183ceaf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sa\squery\sthat\suses\sa\spartial\sindex,\sthe\sexpression\sthat\sis\sthe\sWHERE\sclause\nof\sthe\spartial\sindex\smust\salways\sbe\strue.\s\sUse\sthis\sfact\sto\savoid\sevaluating\nidentical\sterms\sin\sthe\sWHERE\sclause\sof\sthe\squery. -D 2019-03-01T18:07:05.251 +C Fix\sa\sminor\scomment\stypo.\s\sNo\scode\schanges. +D 2019-03-01T21:12:40.335 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -515,7 +515,7 @@ F src/printf.c 93a3d539019264683a444bc043c875e9a6cca43fe935ae7bf6cfff0af3bba118 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 +F src/select.c 9263f5c30dd44c7ac2eb29f40a7ec64322a96885b71c00de6bc30b756c2e1c49 F src/shell.c.in 249c0bf34f7ce272cb17162c297c45ab674a52a5d85193a86191f131196de47f F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1805,7 +1805,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 1f9fa58541dc974989eee9c9a5d453956f7dbcf42965ece2db2cb5dee3f3f5e2 -R 999cfe5c6c09ddc9e9ba3498e400f74c +P 9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 +R a99ec8575458a788b44781da2613b38d U drh -Z 0f8a04d58b07ebfff6d09b88278bd01c +Z 40bc36502bb14ccf3651e57aebfa3d90 diff --git a/manifest.uuid b/manifest.uuid index 5f1016277a..ec9d0645e4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 \ No newline at end of file +9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 \ No newline at end of file diff --git a/src/select.c b/src/select.c index f30cea50de..7d8a425416 100644 --- a/src/select.c +++ b/src/select.c @@ -5306,7 +5306,7 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ ** ** If regAcc is non-zero and there are no min() or max() aggregates ** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator -** registers i register regAcc contains 0. The caller will take care +** registers if register regAcc contains 0. The caller will take care ** of setting and clearing regAcc. */ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ From f10c535fa5de97318abfec7d325a6a8a35919fd0 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Mar 2019 21:33:29 +0000 Subject: [PATCH 291/306] The fts3_tokenizer() function returns NULL if the SQLITE_DBCONFIG_ENABLE_FTS_TOKENIZER setting is disabled, which is is by default. FossilOrigin-Name: f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 --- ext/fts3/README.tokenizers | 6 ++++-- ext/fts3/fts3_tokenizer.c | 4 +++- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/sqlite.h.in | 4 ++-- test/fts3atoken.test | 1 + 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ext/fts3/README.tokenizers b/ext/fts3/README.tokenizers index 7f2345a81f..70bdceff06 100644 --- a/ext/fts3/README.tokenizers +++ b/ext/fts3/README.tokenizers @@ -52,8 +52,10 @@ SECURITY: If the fts3 extension is used in an environment where potentially malicious users may execute arbitrary SQL (i.e. gears), they should be - prevented from invoking the fts3_tokenizer() function, possibly using the - authorisation callback. + prevented from invoking the fts3_tokenizer() function. The + fts3_tokenizer() function is disabled by default. It is only enabled + by SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER. Do not enable it in + security sensitive environments. See "Sample code" below for an example of calling the fts3_tokenizer() function from C code. diff --git a/ext/fts3/fts3_tokenizer.c b/ext/fts3/fts3_tokenizer.c index bfc36af3e3..33c133a228 100644 --- a/ext/fts3/fts3_tokenizer.c +++ b/ext/fts3/fts3_tokenizer.c @@ -106,7 +106,9 @@ static void fts3TokenizerFunc( return; } } - sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + if( fts3TokenizerEnabled(context) ){ + sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); + } } int sqlite3Fts3IsIdChar(char c){ diff --git a/manifest b/manifest index 126183ceaf..bcfe8dba8e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sminor\scomment\stypo.\s\sNo\scode\schanges. -D 2019-03-01T21:12:40.335 +C The\sfts3_tokenizer()\sfunction\sreturns\sNULL\sif\sthe\nSQLITE_DBCONFIG_ENABLE_FTS_TOKENIZER\ssetting\sis\sdisabled,\swhich\sis\sis\nby\sdefault. +D 2019-03-01T21:33:29.039 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -78,7 +78,7 @@ F ext/fts2/fts2_tokenizer1.c 07e223eecb483d448313b5f1553a4f299a7fb7a1 F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a -F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 +F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c 5da1329ccf66b6d597dfb16b1f81aa204133c1ec96117d82a59c20126f483b17 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe @@ -93,7 +93,7 @@ F ext/fts3/fts3_snippet.c 0d8362efa59637dc7c09dc88899eb072aa409fe1e0d0fdeda55ec1 F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 -F ext/fts3/fts3_tokenizer.c a22bf311a71f3efa9d7012d8cc48fc9b0f3dace7 +F ext/fts3/fts3_tokenizer.c ee670e9e0f0dc67fb78d235b2059397e4bf6a3ad8819885c2be6db08b3d35cde F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d @@ -517,7 +517,7 @@ F src/resolve.c 09419ad5c432190b69be7c0c326e03abb548a97c2c50675b81b459e1b382d1d2 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9263f5c30dd44c7ac2eb29f40a7ec64322a96885b71c00de6bc30b756c2e1c49 F src/shell.c.in 249c0bf34f7ce272cb17162c297c45ab674a52a5d85193a86191f131196de47f -F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 +F src/sqlite.h.in f19f7b7646ccd331511b123e2e23d4dc3f3d02f74e1c04d2bb560ea50a323e4c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 F src/sqliteInt.h f253c4ec15e577a293a462e5049f8ea1d0c7a31819b3a88acdd24698df8f4d0b @@ -908,7 +908,7 @@ F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220 -F test/fts3atoken.test 4b4c16fdcfc972f2cdbba212375a060a86ccf5f1 +F test/fts3atoken.test b7a50a58177af017ecda446e66e84d48e21e850e39e8750f1aedad0fd891450e F test/fts3auto.test 19097050a3ca7ab7a43b2be967cb3dfd8ddf841dfdc4eac88deb172ad2f209f2 F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f @@ -1805,7 +1805,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 9b2879629c34fc0a8e99d94648903eb93aabbc7a3682c80cb7382f9a9ca5ffb7 -R a99ec8575458a788b44781da2613b38d +P 9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 +R 6bb845ba94b22e31200ba286777e2ff0 U drh -Z 40bc36502bb14ccf3651e57aebfa3d90 +Z f12ee49595ceb9a1e0b9ecd89bae7dff diff --git a/manifest.uuid b/manifest.uuid index ec9d0645e4..900a959e9c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a0a93c89d3fdd0f9000a9226388e2e53f299165e043913f40b83bf597bfea04 \ No newline at end of file +f5732f4caf7a37a6445c61ae0d0ac14cc9deb897376e73aa36a1ead025b92c69 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f29102727e..21382be201 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2086,8 +2086,8 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] **