]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Remove support for STAT3. The sqlite_stat3 tables are ignored, if they
authordrh <drh@noemail.net>
Thu, 8 Aug 2019 15:24:17 +0000 (15:24 +0000)
committerdrh <drh@noemail.net>
Thu, 8 Aug 2019 15:24:17 +0000 (15:24 +0000)
exist.  STAT4 continues to work as it always has, and as it is a superset of
STAT3 is the recommended replacement.

FossilOrigin-Name: 1e17ea2fd1df4ad49138c787c8fe3207dd0c25c93f9001d52a9b69f8c12e841c

55 files changed:
manifest
manifest.uuid
src/analyze.c
src/build.c
src/ctime.c
src/func.c
src/shell.c.in
src/sqlite.h.in
src/sqliteInt.h
src/test1.c
src/test_config.c
src/util.c
src/vdbeInt.h
src/vdbeapi.c
src/vdbeaux.c
src/vdbemem.c
src/where.c
src/whereInt.h
src/whereexpr.c
test/alter.test
test/altertab.test
test/altertab3.test
test/analyze.test
test/analyze3.test
test/analyze5.test
test/analyze6.test
test/analyze7.test
test/analyze8.test
test/analyzeA.test [deleted file]
test/analyzeB.test [deleted file]
test/auth.test
test/dbstatus.test
test/filter1.test
test/fkey8.test
test/fts3corrupt4.test
test/fts3corrupt5.test
test/fts3expr5.test
test/fts4rename.test
test/index6.test
test/index7.test
test/json104.test
test/like.test
test/mallocA.test
test/minmax4.test
test/skipscan1.test
test/tempdb2.test
test/tkt-cbd054fa6b.test
test/triggerC.test
test/walvfs.test
test/where.test
test/where9.test
test/wild001.test [deleted file]
test/window6.test
test/window9.test
test/without_rowid1.test

index 55625abaef109041cc330d8685fc1e89a24ef85d..4b9a15dfc33a590189753cf7e4e3a11b058afb9b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\sa\sNEVER()\sthat\sis\sreachable\sfrom\sa\scorrupt\sdatabase.
-D 2019-08-08T01:39:07.548
+C Remove\ssupport\sfor\sSTAT3.\s\sThe\ssqlite_stat3\stables\sare\signored,\sif\sthey\nexist.\s\sSTAT4\scontinues\sto\swork\sas\sit\salways\shas,\sand\sas\sit\sis\sa\ssuperset\sof\nSTAT3\sis\sthe\srecommended\sreplacement.
+D 2019-08-08T15:24:17.512
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -458,7 +458,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
 F src/alter.c c1b5e5639b88dcc146db326315f2dea4f7f1c599e524eeb421d544927a0b1e86
-F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644
+F src/analyze.c eed90d1d757cd0de0df037199660553d8cbd35dae7d8c7c1aa84b67508ccc7ad
 F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c
 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06
 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab
@@ -467,10 +467,10 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c 781e4594098dca97db672e52ed17c7f063b5b65db144c0c1bf1e9818e7be1ad4
 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89
 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f
-F src/build.c 14906ec302406e7ba50f5adf07942d1f4af9a7134a2d042b3ccd992787b98e56
+F src/build.c 9217f26f149a9dc3383018e85167187bc256198b29ab42ee5e02bc18fc1c757c
 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
-F src/ctime.c 37f3d21193c4f7d141d0691cced5b39c99951bfef78df9887faf9167b9c42f37
+F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251
 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041
 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319
@@ -478,7 +478,7 @@ F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf
 F src/expr.c 338a6f564f58158d3fe0c6cc71e33f95380f13b3c5e3c03c9f144d6c920c2c81
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e
-F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8
+F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467
 F src/global.c 0c9c45844ae182b458610e4d427834deffcdcd45fbc8c957f6ad82051b8f161f
 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19
 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38
@@ -524,16 +524,16 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb
 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
 F src/select.c 1c2c1d3ca6437349c5bceab29c9d3583f8fedb21ab3366d6f9d7381259af60cf
-F src/shell.c.in 97714cd5e177b6d53fac83c74becf4b19fe0aa8f1a4ed6a4fa1eede4bafb96f7
-F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5
+F src/shell.c.in 3f2c64bf86bef3854bb4ee0a380a9fc05e9f92dafac2babbb929d5aad6f129ad
+F src/sqlite.h.in c6bba28018378b6b43fcf4db7e9f1a3e84b0157ff54dc22ed3977acdac88e051
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5
-F src/sqliteInt.h e24c813896e6649d9ef42b85a83fb362b043858339f8c912979d519e69e3cd57
+F src/sqliteInt.h ffac9a2cb4944a09b589008106067fc40d3ad257facec76112f7d528561adefb
 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424
-F src/test1.c 18f980ceb2611d2cfc59da8bde7dfb4f12f235a6c91bf85ca6efdf855c34493f
+F src/test1.c 42a527975c53d21bcf69a65bedff7b35f09a244b05ad096b7c3160ac0cd30253
 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5
 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644
 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb
@@ -548,7 +548,7 @@ F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0
 F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857
 F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce
 F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274
-F src/test_config.c 5ebafbcd5c75ac1c16bb0c8fe926dc325cc03e780943a88ca50e0d9a4fc4d2f5
+F src/test_config.c e25826d693039cdd45963de378cbf39e3af0e8aa7a8a6fc159876f4e7b5a4f8c
 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f
 F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91
 F src/test_devsym.c 6109b45c3db3ef7b002320947ed448c027356ab8b885156ff535fd8684d4a571
@@ -593,15 +593,15 @@ F src/trigger.c 563df58084fa50aaf22b13ac5b71fdb02c9ffc6f0bf5d262cfe07aade4e20b3f
 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2
 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4
 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507
-F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da
+F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061
 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf
 F src/vdbe.c d0c302d9f58adfbb1f5fd3542cb49ac02a8cc1375808d2a4dcacdc2a8f1fd64b
 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237
-F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92
-F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da
-F src/vdbeaux.c ffcdaf1ce887f00cc43c7fd74508ae6b9d287a65e87febc234c5cecdefeced00
+F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6
+F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e
+F src/vdbeaux.c a262a279d30bcddf851e5f836ac28de1d232062d409b9cf5562d28e66b986a98
 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1
-F src/vdbemem.c f6f277d17d50972571d1394535d4c3d156fdea871d8f327f5b9479984054015a
+F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75
 F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2
 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0
 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3
@@ -609,10 +609,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d
 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
 F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd
-F src/where.c b6055f471431fdb8e2fe388789aaac239823f85c3bd394d53be0e0f727e4cd1c
-F src/whereInt.h 2bb9632f90a1a32952d43a52587209cdd536c3548715d7859bf0c1f9a65a2efd
+F src/where.c bda7162bee2283ae9571c8e1654b67e9e2755525eddd8bd6523c8c6291d60595
+F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb
 F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0
-F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326
+F src/whereexpr.c 029222a0e267c682e6270832d2275b33a4447d397d2f7f147f07e408a6f54e9b
 F src/window.c 98b2571c66246bddadf42e76da45ed970fe7518a4c9c1ccc8cdace0711bfabba
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
@@ -621,7 +621,7 @@ F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1
 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
-F test/alter.test 93dee7c0ff9106fbd53a8bbf519107904b884050a99c4565412c58c37d68c802
+F test/alter.test 16ed8d2470193f34bc711e51506ff1211ebfab8025ca3b9510ff2aef139874cb
 F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687
 F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3
 F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400433
@@ -631,20 +631,18 @@ F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1
 F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b
 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9
 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
-F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f
+F test/altertab.test b2004ac589207fed7e19877bc3f1ad65142be482f269c176ee407e3b4a65f1a0
 F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272
-F test/altertab3.test 9b868b9fc643af9a7d70c0dca984fc6ea91cbb9c5b0bfc678243f3d296c4be48
+F test/altertab3.test c755ef31f8a61911331b46d71e43f6f3ef94af05c56314b168e47520355fa18e
 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
-F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c
-F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8
+F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7
+F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b
 F test/analyze4.test cdf88f3f72b0f0643a1ff6c730fc5af1e42464d47478d9fbac84c333f72c014e
-F test/analyze5.test 765c4e284aa69ca172772aa940946f55629bc8c4
-F test/analyze6.test 7b2667b879976ac4b90d8df80d5456328684f1f6f6fdef9469d6e53401f2f469
-F test/analyze7.test a37f4d9cb699a8af068ae02df1bb08bf844df8e98a92a8126cbff89e226879d8
-F test/analyze8.test e32a970564271114786703750e6939cf81dea4b8580874e38e9213ee092f6936
+F test/analyze5.test fa5131952303ac4146aba101b116b9c8cb89e2637531c334a6df7f7d19dddc0d
+F test/analyze6.test 6c3f7df2996cb6872f355a6ac1eb6d5de00a5a9288214bad7ef25c97d9cc72dc
+F test/analyze7.test 6ef0b12369f61ddeadc7d8a705c40e6b52cb29f63de3a4c56581b510b46b5783
+F test/analyze8.test 36ce54947710bd44e4f9484e1ad07e725ef01a9d7078b417c1bc884356febe4d
 F test/analyze9.test 9fbf0e0101eef4f5dc149769aa14e10b76ee06e7c28598264b32173cd1999a54
-F test/analyzeA.test 22a892d67bd2223126335b99774cce56ba91122cfe82446d2927afc43ad667dc
-F test/analyzeB.test a4c1c3048f6d9e090eb76e83eecb18bcf6d31a70
 F test/analyzeC.test 555a6cc388b9818b6eda6df816f01ce0a75d3a93
 F test/analyzeD.test e50cd0b3e6063216cc0c88a1776e8645dc0bd65a6bb275769cbee33b7fd8d90c
 F test/analyzeE.test 8684e8ac5722fb97c251887ad97e5d496a98af1d
@@ -664,7 +662,7 @@ F test/attach2.test 256bd240da1835fb8408dd59fb7ef71f8358c7a756c46662434d11d07ba3
 F test/attach3.test c59d92791070c59272e00183b7353eeb94915976
 F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c
 F test/attachmalloc.test 12c4f028e570acf9e0a4b0b7fe6f536e21f3d5ebddcece423603d0569beaf438
-F test/auth.test 3310d9c08e928beca42d3eadaaf53cef619d9d275f598565a3758a21ce63138e
+F test/auth.test 2154625c05bc79f0e0ea72cb2358395a8041243caa0fd7ce7617d50da4331794
 F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1
 F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49
 F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec
@@ -799,7 +797,7 @@ F test/dbfuzz001.test e32d14465f1c77712896fda6a1ccc0f037b481c191c1696a9c44f6c9e4
 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee
 F test/dbfuzz2.c c2c9cb40082a77b7e95ffb8b2da1e93322efadfb1c8c1e0001c95a0af1e156c2
 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38
-F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e
+F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759
 F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef
 F test/default.test 3e46c421eebefd2787c2f96673efabf792d360f3a1d5073918cbe450ce672a62
 F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0
@@ -858,7 +856,7 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79
 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717
 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3
 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4
-F test/filter1.test b6d80d882bc2dfc8f5e6eff3799a2b24f23681cae18a5dc7c1770929cd5bc47e
+F test/filter1.test 94a6d26588db0e4e7305e1f0985a99405e98dd034dc393dd6264603eed6645d4
 F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8
 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a
 F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b
@@ -869,7 +867,7 @@ F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d
 F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a
 F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0
 F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d031
-F test/fkey8.test 1d44df25d3b9cba72db4b4324201daf6ae1fc8a85cb68146bd6669a977d8867d
+F test/fkey8.test 48ef829d63f5f7b37aabd4df9363ac05f65539d1da8c4a44251631769d920579
 F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749
 F test/fordelete.test eb93a2f34137bb87bdab88fcab06c0bd92719aff
 F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
@@ -936,8 +934,8 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f
 F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae
 F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3
 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f
-F test/fts3corrupt4.test 97a930e0f2fee35b3fdf21d31637865abc892526160136f92962556bf07d7473
-F test/fts3corrupt5.test 1911bd38381fe7eb28b204e7171937d09e113e5ceb018399ded9f42ec7e6ae66
+F test/fts3corrupt4.test 9c21ef823a72b0b4a09428d78e63a44c961c19b0821682f4e99cdfe147ac105b
+F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5
 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338
 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f
 F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de
@@ -949,7 +947,7 @@ F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c7
 F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a
 F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8
 F test/fts3expr4.test f5b2832549f01b1f7f73389fa21d4b875499bc95bf7c8b36271844888c6a0938
-F test/fts3expr5.test 1368738e3298a7ce0dee3a44d6ebb8f468b2a76f3d1dd18d4ea6d8bc2eeccc1b
+F test/fts3expr5.test a5b9a053becbdb8e973fbf4d6d3abaabeb42d511d1848bd57931f3e0a1cf983e
 F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d
 F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0
 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641
@@ -987,7 +985,7 @@ F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b
 F test/fts4noti.test 5553d7bb2e20bf4a06b23e849352efc022ce6309
 F test/fts4onepass.test d69ddc4ee3415e40b0c5d1d0408488a87614d4f63ba9c44f3e52db541d6b7cc7
 F test/fts4opt.test 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a
-F test/fts4rename.test 6015a355ec3a11a51eb5b88802b3b2c1788786c54b77b17f3e077b7c93ff8611
+F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3cfd0c880
 F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429
 F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95
 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d
@@ -1048,8 +1046,8 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407
 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0
 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6
 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7
-F test/index6.test a6cf96bb70bf57b2221e102060a18af46bc366f704722f410d6f42c13a75534a
-F test/index7.test 2222ccd1858097f734d6ac3d39117334fd1cc26460f92fced4ef57cd15c940c1
+F test/index6.test 7883c35749e3f38282572194ffdbe7d025b1e2938c1e67da2d408ff3c27d9a46
+F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020
 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7
 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721
 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e
@@ -1093,13 +1091,13 @@ F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa
 F test/json101.test 8f8977b00ba02f9a26c1d1f52f29f540f6d5eb162cbd5eb78bb805366d4ab26d
 F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1
 F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b
-F test/json104.test cf0dbd220cba81e6c3cf8bc326e2321049cec05ab0b529308d76f28a52529800
+F test/json104.test 317f4ec4b2d87afbba4d2460cf5be297aea76f2285eb618d276dbcd40a50950f
 F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff
 F test/kvtest.c 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba
 F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63
 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200
 F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7
-F test/like.test 5013f18e7242fe118524fcf8e484b8827bcd5906b509d106f3587c7bfcf274ae
+F test/like.test 3d702d79bf871fa32985b1ce334294c587e3948d3ab972001e811a58577e8b3c
 F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da
 F test/like3.test 62bf82ac674b7d4126e73532e1ad96cdcd8e1752a4ed90b28a6f98305f5a66aa
 F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e
@@ -1125,7 +1123,7 @@ F test/malloc6.test 2f039d9821927eacae43e1831f815e157659a151
 F test/malloc7.test 7c68a32942858bc715284856c5507446bba88c3a
 F test/malloc8.test 9b7a3f8cb9cf0b12fff566e80a980b1767bd961d
 F test/malloc9.test 2307c6ee3703b0a21391f3ea92388b4b73f9105e
-F test/mallocA.test 672cd7dedb63771bade3a6f557f851a4ad161d4a
+F test/mallocA.test aea76f2dd8bcc2d19748f6b911e876cefda74a563753bf26af046e9d34bb97e6
 F test/mallocAll.test 98f1be74bc9f49a858bc4f361fc58e26486798be
 F test/mallocB.test bc475ab850cda896142ab935bbfbc74c24e51ed6
 F test/mallocC.test 3dffe16532f109293ce1ccecd0c31dca55ef08c4
@@ -1151,7 +1149,7 @@ F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08
 F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41
 F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063
 F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354
-F test/minmax4.test 325f0fccb12f3d36049105817a0152a3e9bbf7f194b2610744de899e636c7d69
+F test/minmax4.test 838fe32b812dc50778be3799767cefb5ff59bb04cff81d4f12c0708642f65151
 F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599
 F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d
 F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d
@@ -1329,7 +1327,7 @@ F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5
 F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce
 F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329
-F test/skipscan1.test acbde73b530bfc6618626abebad8868d86cc737c61a52a204fdcd02ded049936
+F test/skipscan1.test 2a64ca7b3e6246bb86b47c9051bfd324603b1b60675fe606513535267713e080
 F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d
 F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5
 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2
@@ -1391,7 +1389,7 @@ F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f
 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
 F test/tclsqlite.test 5a06962d8f18edf4703931f6b7dacd83678d02fa5c8ced9a7958c007ad58626a
 F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08
-F test/tempdb2.test 2479226e4cb96f4c663eccd2d12c077cf6bda29ca5cc69a8a58a06127105dd62
+F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440
 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900
 F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30
 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a
@@ -1457,7 +1455,7 @@ F test/tkt-bd484a090c.test 60460bf946f79a79712b71f202eda501ca99b898
 F test/tkt-bdc6bbbb38.test fc38bb09bdd440e3513a1f5f98fc60a075182d7d
 F test/tkt-c48d99d690.test ba61977d62ab612fc515b3c488a6fbd6464a2447
 F test/tkt-c694113d5.test 82c461924ada5c14866c47e85535b0b0923ba16a2e907e370061a5ca77f65d77
-F test/tkt-cbd054fa6b.test 06ccd57af3c0c7895d0f7dc844f13c51f8258885
+F test/tkt-cbd054fa6b.test 708475ef4d730a6853512c8ce363bcbd3becf0e26826e1f4cd46e2f52ff38edf
 F test/tkt-d11f09d36e.test d999b548fef885d1d1afa49a0e8544ecf436869d
 F test/tkt-d635236375.test 9d37e988b47d87505bc9445be0ca447002df5d09
 F test/tkt-d82e3f3721.test bcc0dfba658d15bab30fd4a9320c9e35d214ce30
@@ -1572,7 +1570,7 @@ F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4
 F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41
 F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d
 F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe
-F test/triggerC.test f1210921924f3a6aaa8c1538115fe56c9c448e8e3033bf0dab38ae78db937c41
+F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51
 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650
 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d
 F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad
@@ -1668,10 +1666,10 @@ F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cf
 F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417
 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f
 F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747
-F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88
+F test/walvfs.test f1accd66c876e3a0f6b4bef5b18d13411062d0ff0a0016e32bb41570474e99fc
 F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec
 F test/wapptest.tcl 3090239c59379d41e1a0644feb6683082fdb86edfab0c668973f8003f22c0e5d x
-F test/where.test 0607caa5a1fbfe7b93b95705981b463a3a0408038f22ae6e9dc11b36902b0e95
+F test/where.test d640c16d33ae671c7583fd575d1a64fd55194dcc4393b877b3028db9ddba5a3b
 F test/where2.test 478d2170637b9211f593120648858593bf2445a1
 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c
 F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8
@@ -1679,7 +1677,7 @@ F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2
 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b
 F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1
 F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f
-F test/where9.test 4fb43ad451758d9535693e110d4398fb6a6e3e153dc57bba5e61f884566c725f
+F test/where9.test 2c554b97bbdb2fdf26c57099f60db8a52bfcf7c147f2c256f9798fa0e267ca85
 F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4
 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
 F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6
@@ -1696,7 +1694,6 @@ F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864
 F test/wherelfault.test 9012e4ef5259058b771606616bd007af5d154e64cc25fa9fd4170f6411db44e3
 F test/wherelimit.test 592081800806d297dd7449b1030c863d2883d6d42901837ccd2e5a9bd962edb0
 F test/wherelimit2.test 9bf0aa56cca40ea0e4c5e2915341355a2bbc0859ec4ce1589197fe2a9d94635f
-F test/wild001.test bca33f499866f04c24510d74baf1e578d4e44b1c
 F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74
 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
@@ -1709,12 +1706,12 @@ F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856e
 F test/window4.tcl 5fbaab489677914ee5686b2008426e336daf88a2f58be7df92757f780a5ebf91
 F test/window4.test bf8f86586ce101bf98e2306e597fa24aadc96c58d70ba4d11f956cf8ca4e0be3
 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e
-F test/window6.test 465e608c021020fb0948a90200e154cd787bc910449e3dafee44c9ca5bd407fe
+F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32
 F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f
 F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f
 F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518
 F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f
-F test/window9.test 7ba6c69d3034b51db4ff680e552dbc01e945850a3e2ae74237581cc00f618978
+F test/window9.test 1fd3ff49119c28006e8f55e48e8425bf4d5bf560195c4df470ef147641004f56
 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0
 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b
 F test/windowfault.test 403693d7d951c5473f052f7ecddb61ed15ac9d212f238b8904ea270ba90f83e5
@@ -1723,7 +1720,7 @@ F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1
 F test/with3.test b5f1372097690c6ef84db2f13fc7e64a88c7263c3f88493605f90597e8a68d45
 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205
 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64
-F test/without_rowid1.test edfccaea4c7d15d9f8ca1c6d7e58df5a7e64969140bcb4598a95edfe1bfd7e7e
+F test/without_rowid1.test f40c2757272ce171b88e4227f14450db2c4d42800d447baa7656a65562d2f8d9
 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99
 F test/without_rowid3.test ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591dba765a3691
 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a
@@ -1838,7 +1835,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 7f2246a17be9915b3492624a3d8deff56694bdc372f7627e3f16c1869415b1a3
-R 993358d1d5d49cd9c39a3b9f8a7f3cb8
+P 30e6ee27a9fb78291c324ac9b80db4579280140430804ecd4692e312f9938525
+R 08be8d4bfd5cad932cdfe93307e785c1
+T *branch * omit-stat3
+T *sym-omit-stat3 *
+T -sym-trunk *
 U drh
-Z 096154c22e200783c49c846795c77c40
+Z f97a070727dd7ccae3c1e0f571407df0
index 94549f2843408958c8ba9cc32e80973d9d36c5ec..e23b2eed1f21876134503758b9abb9a6d992c2f0 100644 (file)
@@ -1 +1 @@
-30e6ee27a9fb78291c324ac9b80db4579280140430804ecd4692e312f9938525
\ No newline at end of file
+1e17ea2fd1df4ad49138c787c8fe3207dd0c25c93f9001d52a9b69f8c12e841c
\ No newline at end of file
index e6b27aaadee7d547527457e343185f501a8662c2..8d792267f50a2b56041c11d2acfc471242649735 100644 (file)
 ** is between 3.6.18 and 3.7.8, inclusive, and unless SQLite is compiled
 ** with SQLITE_ENABLE_STAT2.  The sqlite_stat2 table is deprecated.
 ** The sqlite_stat2 table is superseded by sqlite_stat3, which is only
-** created and used by SQLite versions 3.7.9 and later and with
+** created and used by SQLite versions 3.7.9 through 3.29.0 when
 ** SQLITE_ENABLE_STAT3 defined.  The functionality of sqlite_stat3
-** is a superset of sqlite_stat2.  The sqlite_stat4 is an enhanced
-** version of sqlite_stat3 and is only available when compiled with
-** SQLITE_ENABLE_STAT4 and in SQLite versions 3.8.1 and later.  It is
-** not possible to enable both STAT3 and STAT4 at the same time.  If they
-** are both enabled, then STAT4 takes precedence.
+** is a superset of sqlite_stat2 and is also now deprecated.  The
+** sqlite_stat4 is an enhanced version of sqlite_stat3 and is only 
+** available when compiled with SQLITE_ENABLE_STAT4 and in SQLite
+** versions 3.8.1 and later.  STAT4 is the only variant that is still
+** supported.
 **
 ** For most applications, sqlite_stat1 provides all the statistics required
 ** for the query planner to make good choices.
 
 #if defined(SQLITE_ENABLE_STAT4)
 # define IsStat4     1
-# define IsStat3     0
-#elif defined(SQLITE_ENABLE_STAT3)
-# define IsStat4     0
-# define IsStat3     1
 #else
 # define IsStat4     0
-# define IsStat3     0
 # undef SQLITE_STAT4_SAMPLES
 # define SQLITE_STAT4_SAMPLES 1
 #endif
-#define IsStat34    (IsStat3+IsStat4)  /* 1 for STAT3 or STAT4. 0 otherwise */
 
 /*
 ** This routine generates code that opens the sqlite_statN tables.
@@ -183,14 +177,10 @@ static void openStatTable(
     { "sqlite_stat1", "tbl,idx,stat" },
 #if defined(SQLITE_ENABLE_STAT4)
     { "sqlite_stat4", "tbl,idx,neq,nlt,ndlt,sample" },
-    { "sqlite_stat3", 0 },
-#elif defined(SQLITE_ENABLE_STAT3)
-    { "sqlite_stat3", "tbl,idx,neq,nlt,ndlt,sample" },
-    { "sqlite_stat4", 0 },
 #else
-    { "sqlite_stat3", 0 },
     { "sqlite_stat4", 0 },
 #endif
+    { "sqlite_stat3", 0 },
   };
   int i;
   sqlite3 *db = pParse->db;
@@ -271,7 +261,7 @@ typedef struct Stat4Sample Stat4Sample;
 struct Stat4Sample {
   tRowcnt *anEq;                  /* sqlite_stat4.nEq */
   tRowcnt *anDLt;                 /* sqlite_stat4.nDLt */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   tRowcnt *anLt;                  /* sqlite_stat4.nLt */
   union {
     i64 iRowid;                     /* Rowid in main table of the key */
@@ -302,7 +292,7 @@ struct Stat4Accum {
 
 /* Reclaim memory used by a Stat4Sample
 */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 static void sampleClear(sqlite3 *db, Stat4Sample *p){
   assert( db!=0 );
   if( p->nRowid ){
@@ -314,7 +304,7 @@ static void sampleClear(sqlite3 *db, Stat4Sample *p){
 
 /* Initialize the BLOB value of a ROWID
 */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 static void sampleSetRowid(sqlite3 *db, Stat4Sample *p, int n, const u8 *pData){
   assert( db!=0 );
   if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid);
@@ -330,7 +320,7 @@ static void sampleSetRowid(sqlite3 *db, Stat4Sample *p, int n, const u8 *pData){
 
 /* Initialize the INTEGER value of a ROWID.
 */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 static void sampleSetRowidInt64(sqlite3 *db, Stat4Sample *p, i64 iRowid){
   assert( db!=0 );
   if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid);
@@ -343,7 +333,7 @@ static void sampleSetRowidInt64(sqlite3 *db, Stat4Sample *p, i64 iRowid){
 /*
 ** Copy the contents of object (*pFrom) into (*pTo).
 */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 static void sampleCopy(Stat4Accum *p, Stat4Sample *pTo, Stat4Sample *pFrom){
   pTo->isPSample = pFrom->isPSample;
   pTo->iCol = pFrom->iCol;
@@ -364,7 +354,7 @@ static void sampleCopy(Stat4Accum *p, Stat4Sample *pTo, Stat4Sample *pFrom){
 */
 static void stat4Destructor(void *pOld){
   Stat4Accum *p = (Stat4Accum*)pOld;
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   int i;
   for(i=0; i<p->nCol; i++) sampleClear(p->db, p->aBest+i);
   for(i=0; i<p->mxSample; i++) sampleClear(p->db, p->a+i);
@@ -384,7 +374,7 @@ static void stat4Destructor(void *pOld){
 ** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the
 ** total number of columns in the table.
 **
-** Note 2:  C is only used for STAT3 and STAT4.
+** Note 2:  C is only used for STAT4.
 **
 ** For indexes on ordinary rowid tables, N==K+1.  But for indexes on
 ** WITHOUT ROWID tables, N=K+P where P is the number of columns in the
@@ -407,7 +397,7 @@ static void statInit(
   int nColUp;                     /* nCol rounded up for alignment */
   int n;                          /* Bytes of space to allocate */
   sqlite3 *db;                    /* Database connection */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   int mxSample = SQLITE_STAT4_SAMPLES;
 #endif
 
@@ -424,7 +414,7 @@ static void statInit(
   n = sizeof(*p) 
     + sizeof(tRowcnt)*nColUp                  /* Stat4Accum.anEq */
     + sizeof(tRowcnt)*nColUp                  /* Stat4Accum.anDLt */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
     + sizeof(tRowcnt)*nColUp                  /* Stat4Accum.anLt */
     + sizeof(Stat4Sample)*(nCol+mxSample)     /* Stat4Accum.aBest[], a[] */
     + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample)
@@ -444,7 +434,7 @@ static void statInit(
   p->current.anDLt = (tRowcnt*)&p[1];
   p->current.anEq = &p->current.anDLt[nColUp];
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   {
     u8 *pSpace;                     /* Allocated space not yet assigned */
     int i;                          /* Used to iterate through p->aSample[] */
@@ -479,7 +469,7 @@ static void statInit(
   sqlite3_result_blob(context, p, sizeof(*p), stat4Destructor);
 }
 static const FuncDef statInitFuncdef = {
-  2+IsStat34,      /* nArg */
+  2+IsStat4,       /* nArg */
   SQLITE_UTF8,     /* funcFlags */
   0,               /* pUserData */
   0,               /* pNext */
@@ -519,7 +509,7 @@ static int sampleIsBetterPost(
 }
 #endif
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 /*
 ** Return true if pNew is to be preferred over pOld.
 **
@@ -538,15 +528,11 @@ static int sampleIsBetter(
   assert( IsStat4 || (pNew->iCol==0 && pOld->iCol==0) );
 
   if( (nEqNew>nEqOld) ) return 1;
-#ifdef SQLITE_ENABLE_STAT4
   if( nEqNew==nEqOld ){
     if( pNew->iCol<pOld->iCol ) return 1;
     return (pNew->iCol==pOld->iCol && sampleIsBetterPost(pAccum, pNew, pOld));
   }
   return 0;
-#else
-  return (nEqNew==nEqOld && pNew->iHash>pOld->iHash);
-#endif
 }
 
 /*
@@ -559,7 +545,6 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){
 
   assert( IsStat4 || nEqZero==0 );
 
-#ifdef SQLITE_ENABLE_STAT4
   /* Stat4Accum.nMaxEqZero is set to the maximum number of leading 0
   ** values in the anEq[] array of any sample in Stat4Accum.a[]. In
   ** other words, if nMaxEqZero is n, then it is guaranteed that there
@@ -593,7 +578,6 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){
       goto find_new_min;
     }
   }
-#endif
 
   /* If necessary, remove sample iMin to make room for the new sample. */
   if( p->nSample>=p->mxSample ){
@@ -614,10 +598,8 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){
   /* The "rows less-than" for the rowid column must be greater than that
   ** for the last sample in the p->a[] array. Otherwise, the samples would
   ** be out of order. */
-#ifdef SQLITE_ENABLE_STAT4
   assert( p->nSample==0 
        || pNew->anLt[p->nCol-1] > p->a[p->nSample-1].anLt[p->nCol-1] );
-#endif
 
   /* Insert the new sample */
   pSample = &p->a[p->nSample];
@@ -627,9 +609,7 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){
   /* Zero the first nEqZero entries in the anEq[] array. */
   memset(pSample->anEq, 0, sizeof(tRowcnt)*nEqZero);
 
-#ifdef SQLITE_ENABLE_STAT4
- find_new_min:
-#endif
+find_new_min:
   if( p->nSample>=p->mxSample ){
     int iMin = -1;
     for(i=0; i<p->mxSample; i++){
@@ -642,7 +622,7 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){
     p->iMin = iMin;
   }
 }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 
 /*
 ** Field iChng of the index being scanned has changed. So at this point
@@ -683,28 +663,7 @@ static void samplePushPrevious(Stat4Accum *p, int iChng){
   }
 #endif
 
-#if defined(SQLITE_ENABLE_STAT3) && !defined(SQLITE_ENABLE_STAT4)
-  if( iChng==0 ){
-    tRowcnt nLt = p->current.anLt[0];
-    tRowcnt nEq = p->current.anEq[0];
-
-    /* Check if this is to be a periodic sample. If so, add it. */
-    if( (nLt/p->nPSample)!=(nLt+nEq)/p->nPSample ){
-      p->current.isPSample = 1;
-      sampleInsert(p, &p->current, 0);
-      p->current.isPSample = 0;
-    }else 
-
-    /* Or if it is a non-periodic sample. Add it in this case too. */
-    if( p->nSample<p->mxSample 
-     || sampleIsBetter(p, &p->current, &p->a[p->iMin]) 
-    ){
-      sampleInsert(p, &p->current, 0);
-    }
-  }
-#endif
-
-#ifndef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifndef SQLITE_ENABLE_STAT4
   UNUSED_PARAMETER( p );
   UNUSED_PARAMETER( iChng );
 #endif
@@ -724,7 +683,7 @@ static void samplePushPrevious(Stat4Accum *p, int iChng){
 ** index being analyzed.  The stat_get() SQL function will later be used to
 ** extract relevant information for constructing the sqlite_statN tables.
 **
-** The R parameter is only used for STAT3 and STAT4
+** The R parameter is only used for STAT4
 */
 static void statPush(
   sqlite3_context *context,
@@ -756,14 +715,14 @@ static void statPush(
     }
     for(i=iChng; i<p->nCol; i++){
       p->current.anDLt[i]++;
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
       p->current.anLt[i] += p->current.anEq[i];
 #endif
       p->current.anEq[i] = 1;
     }
   }
   p->nRow++;
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){
     sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2]));
   }else{
@@ -796,7 +755,7 @@ static void statPush(
 #endif
 }
 static const FuncDef statPushFuncdef = {
-  2+IsStat34,      /* nArg */
+  2+IsStat4,       /* nArg */
   SQLITE_UTF8,     /* funcFlags */
   0,               /* pUserData */
   0,               /* pNext */
@@ -827,7 +786,7 @@ static const FuncDef statPushFuncdef = {
 ** parameter will always be a poiner to a Stat4Accum object, never a
 ** NULL.
 **
-** If neither STAT3 nor STAT4 are enabled, then J is always
+** If STAT4 is not enabled, then J is always
 ** STAT_GET_STAT1 and is hence omitted and this routine becomes
 ** a one-parameter function, stat_get(P), that always returns the
 ** stat1 table entry information.
@@ -838,8 +797,8 @@ static void statGet(
   sqlite3_value **argv
 ){
   Stat4Accum *p = (Stat4Accum*)sqlite3_value_blob(argv[0]);
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
-  /* STAT3 and STAT4 have a parameter on this routine. */
+#ifdef SQLITE_ENABLE_STAT4
+  /* STAT4 has a parameter on this routine. */
   int eCall = sqlite3_value_int(argv[1]);
   assert( argc==2 );
   assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ 
@@ -894,7 +853,7 @@ static void statGet(
 
     sqlite3_result_text(context, zRet, -1, sqlite3_free);
   }
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   else if( eCall==STAT_GET_ROWID ){
     if( p->iGet<0 ){
       samplePushPrevious(p, 0);
@@ -923,9 +882,7 @@ static void statGet(
       }
     }
 
-    if( IsStat3 ){
-      sqlite3_result_int64(context, (i64)aCnt[0]);
-    }else{
+    {
       char *zRet = sqlite3MallocZero(p->nCol * 25);
       if( zRet==0 ){
         sqlite3_result_error_nomem(context);
@@ -942,13 +899,13 @@ static void statGet(
       }
     }
   }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 #ifndef SQLITE_DEBUG
   UNUSED_PARAMETER( argc );
 #endif
 }
 static const FuncDef statGetFuncdef = {
-  1+IsStat34,      /* nArg */
+  1+IsStat4,       /* nArg */
   SQLITE_UTF8,     /* funcFlags */
   0,               /* pUserData */
   0,               /* pNext */
@@ -961,7 +918,7 @@ static const FuncDef statGetFuncdef = {
 
 static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){
   assert( regOut!=regStat4 && regOut!=regStat4+1 );
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   sqlite3VdbeAddOp2(v, OP_Integer, iParam, regStat4+1);
 #elif SQLITE_DEBUG
   assert( iParam==STAT_GET_STAT1 );
@@ -970,7 +927,7 @@ static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){
 #endif
   sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4, regOut,
                     (char*)&statGetFuncdef, P4_FUNCDEF);
-  sqlite3VdbeChangeP5(v, 1 + IsStat34);
+  sqlite3VdbeChangeP5(v, 1 + IsStat4);
 }
 
 /*
@@ -997,7 +954,7 @@ static void analyzeOneTable(
   int regNewRowid = iMem++;    /* Rowid for the inserted record */
   int regStat4 = iMem++;       /* Register to hold Stat4Accum object */
   int regChng = iMem++;        /* Index of changed index field */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   int regRowid = iMem++;       /* Rowid argument passed to stat_push() */
 #endif
   int regTemp = iMem++;        /* Temporary use register */
@@ -1131,16 +1088,16 @@ static void analyzeOneTable(
     **    (3) the number of rows in the index,
     **
     **
-    ** The third argument is only used for STAT3 and STAT4
+    ** The third argument is only used for STAT4
     */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
     sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat4+3);
 #endif
     sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat4+1);
     sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regStat4+2);
     sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4+1, regStat4,
                      (char*)&statInitFuncdef, P4_FUNCDEF);
-    sqlite3VdbeChangeP5(v, 2+IsStat34);
+    sqlite3VdbeChangeP5(v, 2+IsStat4);
 
     /* Implementation of the following:
     **
@@ -1211,12 +1168,12 @@ static void analyzeOneTable(
   
     /*
     **  chng_addr_N:
-    **   regRowid = idx(rowid)            // STAT34 only
-    **   stat_push(P, regChng, regRowid)  // 3rd parameter STAT34 only
+    **   regRowid = idx(rowid)            // STAT4 only
+    **   stat_push(P, regChng, regRowid)  // 3rd parameter STAT4 only
     **   Next csr
     **   if !eof(csr) goto next_row;
     */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
     assert( regRowid==(regStat4+2) );
     if( HasRowid(pTab) ){
       sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, regRowid);
@@ -1237,7 +1194,7 @@ static void analyzeOneTable(
     assert( regChng==(regStat4+1) );
     sqlite3VdbeAddOp4(v, OP_Function0, 1, regStat4, regTemp,
                      (char*)&statPushFuncdef, P4_FUNCDEF);
-    sqlite3VdbeChangeP5(v, 2+IsStat34);
+    sqlite3VdbeChangeP5(v, 2+IsStat4);
     sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v);
 
     /* Add the entry to the stat1 table. */
@@ -1251,8 +1208,8 @@ static void analyzeOneTable(
 #endif
     sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
 
-    /* Add the entries to the stat3 or stat4 table. */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+    /* Add the entries to the stat4 table. */
+#ifdef SQLITE_ENABLE_STAT4
     {
       int regEq = regStat1;
       int regLt = regStat1+1;
@@ -1275,21 +1232,17 @@ static void analyzeOneTable(
       callStatGet(v, regStat4, STAT_GET_NDLT, regDLt);
       sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0);
       VdbeCoverage(v);
-#ifdef SQLITE_ENABLE_STAT3
-      sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, 0, regSample);
-#else
       for(i=0; i<nCol; i++){
         sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, i, regCol+i);
       }
       sqlite3VdbeAddOp3(v, OP_MakeRecord, regCol, nCol, regSample);
-#endif
       sqlite3VdbeAddOp3(v, OP_MakeRecord, regTabname, 6, regTemp);
       sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur+1, regNewRowid);
       sqlite3VdbeAddOp3(v, OP_Insert, iStatCur+1, regTemp, regNewRowid);
       sqlite3VdbeAddOp2(v, OP_Goto, 1, addrNext); /* P1==1 for end-of-loop */
       sqlite3VdbeJumpHere(v, addrIsNull);
     }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 
     /* End of analysis */
     sqlite3VdbeJumpHere(v, addrRewind);
@@ -1464,7 +1417,7 @@ static void decodeIntArray(
   int i;
   tRowcnt v;
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   if( z==0 ) z = "";
 #else
   assert( z!=0 );
@@ -1475,7 +1428,7 @@ static void decodeIntArray(
       v = v*10 + c - '0';
       z++;
     }
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
     if( aOut ) aOut[i] = v;
     if( aLog ) aLog[i] = sqlite3LogEst(v);
 #else
@@ -1486,7 +1439,7 @@ static void decodeIntArray(
 #endif
     if( *z==' ' ) z++;
   }
-#ifndef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifndef SQLITE_ENABLE_STAT4
   assert( pIndex!=0 ); {
 #else
   if( pIndex ){
@@ -1551,7 +1504,7 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){
   if( pIndex ){
     tRowcnt *aiRowEst = 0;
     int nCol = pIndex->nKeyCol+1;
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
     /* Index.aiRowEst may already be set here if there are duplicate 
     ** sqlite_stat1 entries for this index. In that case just clobber
     ** the old data with the new instead of allocating a new array.  */
@@ -1587,7 +1540,7 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){
 ** and its contents.
 */
 void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   if( pIdx->aSample ){
     int j;
     for(j=0; j<pIdx->nSample; j++){
@@ -1603,10 +1556,10 @@ void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){
 #else
   UNUSED_PARAMETER(db);
   UNUSED_PARAMETER(pIdx);
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 }
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 /*
 ** Populate the pIdx->aAvgEq[] array based on the samples currently
 ** stored in pIdx->aSample[]. 
@@ -1684,12 +1637,11 @@ static Index *findIndexOrPrimaryKey(
 }
 
 /*
-** Load the content from either the sqlite_stat4 or sqlite_stat3 table 
+** Load the content from either the sqlite_stat4
 ** into the relevant Index.aSample[] arrays.
 **
 ** Arguments zSql1 and zSql2 must point to SQL statements that return
-** data equivalent to the following (statements are different for stat3,
-** see the caller of this function for details):
+** data equivalent to the following:
 **
 **    zSql1: SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx
 **    zSql2: SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4
@@ -1698,7 +1650,6 @@ static Index *findIndexOrPrimaryKey(
 */
 static int loadStatTbl(
   sqlite3 *db,                  /* Database handle */
-  int bStat3,                   /* Assume single column records only */
   const char *zSql1,            /* SQL statement 1 (see above) */
   const char *zSql2,            /* SQL statement 2 (see above) */
   const char *zDb               /* Database name (e.g. "main") */
@@ -1732,17 +1683,15 @@ static int loadStatTbl(
     if( zIndex==0 ) continue;
     nSample = sqlite3_column_int(pStmt, 1);
     pIdx = findIndexOrPrimaryKey(db, zIndex, zDb);
-    assert( pIdx==0 || bStat3 || pIdx->nSample==0 );
+    assert( pIdx==0 || pIdx->nSample==0 );
     /* Index.nSample is non-zero at this point if data has already been
-    ** loaded from the stat4 table. In this case ignore stat3 data.  */
+    ** loaded from the stat4 table. */
     if( pIdx==0 || pIdx->nSample ) continue;
-    if( bStat3==0 ){
-      assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 );
-      if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){
-        nIdxCol = pIdx->nKeyCol;
-      }else{
-        nIdxCol = pIdx->nColumn;
-      }
+    assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 );
+    if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){
+      nIdxCol = pIdx->nKeyCol;
+    }else{
+      nIdxCol = pIdx->nColumn;
     }
     pIdx->nSampleCol = nIdxCol;
     nByte = sizeof(IndexSample) * nSample;
@@ -1784,9 +1733,8 @@ static int loadStatTbl(
     pIdx = findIndexOrPrimaryKey(db, zIndex, zDb);
     if( pIdx==0 ) continue;
     /* This next condition is true if data has already been loaded from 
-    ** the sqlite_stat4 table. In this case ignore stat3 data.  */
+    ** the sqlite_stat4 table. */
     nCol = pIdx->nSampleCol;
-    if( bStat3 && nCol>1 ) continue;
     if( pIdx!=pPrevIdx ){
       initAvgEq(pPrevIdx);
       pPrevIdx = pIdx;
@@ -1819,7 +1767,7 @@ static int loadStatTbl(
 }
 
 /*
-** Load content from the sqlite_stat4 and sqlite_stat3 tables into 
+** Load content from the sqlite_stat4 table into 
 ** the Index.aSample[] arrays of all indices.
 */
 static int loadStat4(sqlite3 *db, const char *zDb){
@@ -1827,37 +1775,28 @@ static int loadStat4(sqlite3 *db, const char *zDb){
 
   assert( db->lookaside.bDisable );
   if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){
-    rc = loadStatTbl(db, 0,
+    rc = loadStatTbl(db,
       "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", 
       "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4",
       zDb
     );
   }
-
-  if( rc==SQLITE_OK && sqlite3FindTable(db, "sqlite_stat3", zDb) ){
-    rc = loadStatTbl(db, 1,
-      "SELECT idx,count(*) FROM %Q.sqlite_stat3 GROUP BY idx", 
-      "SELECT idx,neq,nlt,ndlt,sqlite_record(sample) FROM %Q.sqlite_stat3",
-      zDb
-    );
-  }
-
   return rc;
 }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 
 /*
-** Load the content of the sqlite_stat1 and sqlite_stat3/4 tables. The
+** Load the content of the sqlite_stat1 and sqlite_stat4 tables. The
 ** contents of sqlite_stat1 are used to populate the Index.aiRowEst[]
-** arrays. The contents of sqlite_stat3/4 are used to populate the
+** arrays. The contents of sqlite_stat4 are used to populate the
 ** Index.aSample[] arrays.
 **
 ** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR
-** is returned. In this case, even if SQLITE_ENABLE_STAT3/4 was defined 
-** during compilation and the sqlite_stat3/4 table is present, no data is 
+** is returned. In this case, even if SQLITE_ENABLE_STAT4 was defined 
+** during compilation and the sqlite_stat4 table is present, no data is 
 ** read from it.
 **
-** If SQLITE_ENABLE_STAT3/4 was defined during compilation and the 
+** If SQLITE_ENABLE_STAT4 was defined during compilation and the 
 ** sqlite_stat4 table is not present in the database, SQLITE_ERROR is
 ** returned. However, in this case, data is read from the sqlite_stat1
 ** table (if it is present) before returning.
@@ -1885,7 +1824,7 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
   for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){
     Index *pIdx = sqliteHashData(i);
     pIdx->hasStat1 = 0;
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
     sqlite3DeleteIndexSamples(db, pIdx);
     pIdx->aSample = 0;
 #endif
@@ -1913,7 +1852,7 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
   }
 
   /* Load the statistics from the sqlite_stat4 table. */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   if( rc==SQLITE_OK ){
     db->lookaside.bDisable++;
     rc = loadStat4(db, sInfo.zDatabase);
index a2cd4afeb06ae3e19157d38ed2bbaa0967419b69..57491005a2274b5f9f131cc82f09a5745e5a9141 100644 (file)
@@ -456,7 +456,7 @@ void sqlite3FreeIndex(sqlite3 *db, Index *p){
   sqlite3ExprListDelete(db, p->aColExpr);
   sqlite3DbFree(db, p->zColAff);
   if( p->isResized ) sqlite3DbFree(db, (void *)p->azColl);
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   sqlite3_free(p->aiRowEst);
 #endif
   sqlite3DbFree(db, p);
index ebb6e859156b2524e65177fc59c8674f96ec2d6a..013a0c267023540108a9ca50d0698857a6bb648b 100644 (file)
@@ -306,8 +306,6 @@ static const char * const sqlite3azCompileOpt[] = {
 #endif
 #if defined(SQLITE_ENABLE_STAT4)
   "ENABLE_STAT4",
-#elif defined(SQLITE_ENABLE_STAT3)
-  "ENABLE_STAT3",
 #endif
 #if SQLITE_ENABLE_STMTVTAB
   "ENABLE_STMTVTAB",
index 5aea2d74b8550d7fb997049634b8c1d0bde1f570..34cf6175b4e07027b33330e241ba00f3cd748991 100644 (file)
@@ -1986,9 +1986,6 @@ void sqlite3RegisterBuiltinFunctions(void){
   sqlite3AlterFunctions();
 #endif
   sqlite3WindowFunctions();
-#if defined(SQLITE_ENABLE_STAT3) || defined(SQLITE_ENABLE_STAT4)
-  sqlite3AnalyzeFunctions();
-#endif
   sqlite3RegisterDateTimeFunctions();
   sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc));
 
index 916b11283b38893bd4ae83b1653a4d1fb1e81d53..47b35907eb757bfb287c383d61fb7944c59e3d92 100644 (file)
@@ -7507,8 +7507,6 @@ static int do_meta_command(char *zLine, ShellState *p){
       data.cMode = data.mode = MODE_Insert;
       data.zDestTable = "sqlite_stat1";
       shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg);
-      data.zDestTable = "sqlite_stat3";
-      shell_exec(&data, "SELECT * FROM sqlite_stat3", &zErrMsg);
       data.zDestTable = "sqlite_stat4";
       shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg);
       raw_printf(p->out, "ANALYZE sqlite_master;\n");
@@ -8929,8 +8927,7 @@ static int do_meta_command(char *zLine, ShellState *p){
       }else if( strcmp(zTab, "sqlite_stat1")==0 ){
         appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1"
                            " ORDER BY tbl,idx;", 0);
-      }else if( strcmp(zTab, "sqlite_stat3")==0
-             || strcmp(zTab, "sqlite_stat4")==0 ){
+      }else if( strcmp(zTab, "sqlite_stat4")==0 ){
         appendText(&sQuery, "SELECT * FROM ", 0);
         appendText(&sQuery, zTab, 0);
         appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0);
index 5b3e5a15f34c8eaa804990d98fceef2740e76b4a..20a62894fdb10933970582285eaf0117daea89c5 100644 (file)
@@ -3814,7 +3814,7 @@ int sqlite3_limit(sqlite3*, int id, int newVal);
 ** ^The specific value of WHERE-clause [parameter] might influence the 
 ** choice of query plan if the parameter is the left-hand side of a [LIKE]
 ** or [GLOB] operator or if the parameter is compared to an indexed column
-** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled.
+** and the [SQLITE_ENABLE_STAT4] compile-time option is enabled.
 ** </li>
 ** </ol>
 **
index 86358a7251820d412ee708e18ce0c3dd598979a2..4792919ac7c602c5522244f0b937fc4c8ae5d7a7 100644 (file)
@@ -935,20 +935,6 @@ typedef INT16_TYPE LogEst;
 # define SQLITE_DEFAULT_MMAP_SIZE SQLITE_MAX_MMAP_SIZE
 #endif
 
-/*
-** Only one of SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4 can be defined.
-** Priority is given to SQLITE_ENABLE_STAT4.  If either are defined, also
-** define SQLITE_ENABLE_STAT3_OR_STAT4
-*/
-#ifdef SQLITE_ENABLE_STAT4
-# undef SQLITE_ENABLE_STAT3
-# define SQLITE_ENABLE_STAT3_OR_STAT4 1
-#elif SQLITE_ENABLE_STAT3
-# define SQLITE_ENABLE_STAT3_OR_STAT4 1
-#elif SQLITE_ENABLE_STAT3_OR_STAT4
-# undef SQLITE_ENABLE_STAT3_OR_STAT4
-#endif
-
 /*
 ** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not
 ** the Select query generator tracing logic is turned on.
@@ -1587,7 +1573,7 @@ struct sqlite3 {
 #define SQLITE_OmitNoopJoin   0x0100   /* Omit unused tables in joins */
 #define SQLITE_CountOfView    0x0200   /* The count-of-view optimization */
 #define SQLITE_CursorHints    0x0400   /* Add OP_CursorHint opcodes */
-#define SQLITE_Stat34         0x0800   /* Use STAT3 or STAT4 data */
+#define SQLITE_Stat34         0x0800   /* Use STAT4 data */
    /* TH3 expects the Stat34  ^^^^^^ value to be 0x0800.  Don't change it */
 #define SQLITE_PushDown       0x1000   /* The push-down optimization */
 #define SQLITE_SimplifyJoin   0x2000   /* Convert LEFT JOIN to JOIN */
@@ -2258,7 +2244,7 @@ struct Index {
   unsigned hasStat1:1;     /* aiRowLogEst values come from sqlite_stat1 */
   unsigned bNoQuery:1;     /* Do not use this index to optimize queries */
   unsigned bAscKeyBug:1;   /* True if the bba7b69f9849b5bf bug applies */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   int nSample;             /* Number of elements in aSample[] */
   int nSampleCol;          /* Size of IndexSample.anEq[] and so on */
   tRowcnt *aAvgEq;         /* Average nEq values for keys not in aSample */
@@ -2290,7 +2276,7 @@ struct Index {
 #define XN_EXPR      (-2)     /* Indexed column is an expression */
 
 /*
-** Each sample stored in the sqlite_stat3 table is represented in memory
+** Each sample stored in the sqlite_stat4 table is represented in memory
 ** using a structure of this type.  See documentation at the top of the
 ** analyze.c source file for additional information.
 */
@@ -4214,7 +4200,7 @@ LogEst sqlite3LogEstAdd(LogEst,LogEst);
 LogEst sqlite3LogEstFromDouble(double);
 #endif
 #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \
-    defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \
+    defined(SQLITE_ENABLE_STAT4) || \
     defined(SQLITE_EXPLAIN_ESTIMATED_ROWS)
 u64 sqlite3LogEstToInt(LogEst);
 #endif
@@ -4401,8 +4387,7 @@ int sqlite3ExprCheckIN(Parse*, Expr*);
 # define sqlite3ExprCheckIN(x,y) SQLITE_OK
 #endif
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
-void sqlite3AnalyzeFunctions(void);
+#ifdef SQLITE_ENABLE_STAT4
 int sqlite3Stat4ProbeSetValue(
     Parse*,Index*,UnpackedRecord**,Expr*,int,int,int*);
 int sqlite3Stat4ValueFromExpr(Parse*, Expr*, u8, sqlite3_value**);
index 808765ec17da0d9110a2f6427756a221ae931639..503a270090765fe2ca0718abee3e6f2f2916647b 100644 (file)
@@ -7173,7 +7173,6 @@ static int SQLITE_TCLAPI optimization_control(
     { "order-by-idx-join",   SQLITE_OrderByIdxJoin },
     { "transitive",          SQLITE_Transitive     },
     { "omit-noop-join",      SQLITE_OmitNoopJoin   },
-    { "stat3",               SQLITE_Stat34         },
     { "stat4",               SQLITE_Stat34         },
     { "skip-scan",           SQLITE_SkipScan       },
   };
index 05002349bd262f9ee5014df6aad1e1091c46122f..e6c03308dc1c275e1e3482b82abf2dc3dc5fb47a 100644 (file)
@@ -585,12 +585,6 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY);
 #else
   Tcl_SetVar2(interp, "sqlite_options", "stat4", "0", TCL_GLOBAL_ONLY);
 #endif
-#if defined(SQLITE_ENABLE_STAT3) && !defined(SQLITE_ENABLE_STAT4)
-  Tcl_SetVar2(interp, "sqlite_options", "stat3", "1", TCL_GLOBAL_ONLY);
-#else
-  Tcl_SetVar2(interp, "sqlite_options", "stat3", "0", TCL_GLOBAL_ONLY);
-#endif
-
 #if defined(SQLITE_ENABLE_STMTVTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE)
   Tcl_SetVar2(interp, "sqlite_options", "stmtvtab", "1", TCL_GLOBAL_ONLY);
 #else
index 764bfe919c64dbb65c87eadabc64e703b64b1831..7adce4ef03742530bed5c9719f85483e91b81847 100644 (file)
@@ -1498,7 +1498,7 @@ LogEst sqlite3LogEstFromDouble(double x){
 #endif /* SQLITE_OMIT_VIRTUALTABLE */
 
 #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \
-    defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \
+    defined(SQLITE_ENABLE_STAT4) || \
     defined(SQLITE_EXPLAIN_ESTIMATED_ROWS)
 /*
 ** Convert a LogEst into an integer.
@@ -1516,7 +1516,7 @@ u64 sqlite3LogEstToInt(LogEst x){
     defined(SQLITE_EXPLAIN_ESTIMATED_ROWS)
   if( x>60 ) return (u64)LARGEST_INT64;
 #else
-  /* If only SQLITE_ENABLE_STAT3_OR_STAT4 is on, then the largest input
+  /* If only SQLITE_ENABLE_STAT4 is on, then the largest input
   ** possible to this routine is 310, resulting in a maximum x of 31 */
   assert( x<=60 );
 #endif
index 3332b4838f86e155e3213290554679b7c53cb130..bd035535ab043447911b82903d64f6a09311a752 100644 (file)
@@ -486,9 +486,6 @@ int sqlite3VdbeCursorMoveto(VdbeCursor**, int*);
 int sqlite3VdbeCursorRestore(VdbeCursor*);
 u32 sqlite3VdbeSerialTypeLen(u32);
 u8 sqlite3VdbeOneByteSerialTypeLen(u8);
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
-u32 sqlite3VdbeSerialType(Mem*, int, u32*);
-#endif
 u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32);
 u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
 void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int);
index 83221d97240edd66b1a12c9ded0cc2eaa77483bd..c7968ee60d46d8a26905278e999917ad53265059 100644 (file)
@@ -844,7 +844,7 @@ int sqlite3_vtab_nochange(sqlite3_context *p){
 */
 sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){
   int rc;
-#ifndef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifndef SQLITE_ENABLE_STAT4
   sqlite3_int64 *piTime = &p->pVdbe->iCurrentTime;
   assert( p->pVdbe!=0 );
 #else
@@ -909,7 +909,7 @@ void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){
   AuxData *pAuxData;
 
   assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
-#if SQLITE_ENABLE_STAT3_OR_STAT4
+#if SQLITE_ENABLE_STAT4
   if( pCtx->pVdbe==0 ) return 0;
 #else
   assert( pCtx->pVdbe!=0 );
@@ -943,7 +943,7 @@ void sqlite3_set_auxdata(
   Vdbe *pVdbe = pCtx->pVdbe;
 
   assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   if( pVdbe==0 ) goto failed;
 #else
   assert( pVdbe!=0 );
index 4417cc63a1fa0a47c4ec09cac2480372b39d4579..828304780b481da3906a20713447ea7fa032f108 100644 (file)
@@ -3433,7 +3433,7 @@ int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){
 ** of SQLite will not understand those serial types.
 */
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#if 0 /* Inlined into the OP_MakeRecord opcode */
 /*
 ** Return the serial-type for the value stored in pMem.
 **
@@ -3442,7 +3442,8 @@ int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){
 ** 2019-07-11:  The primary user of this subroutine was the OP_MakeRecord
 ** opcode in the byte-code engine.  But by moving this routine in-line, we
 ** can omit some redundant tests and make that opcode a lot faster.  So
-** this routine is now only used by the STAT3/4 logic.
+** this routine is now only used by the STAT3 logic and STAT3 support has
+** ended.  The code is kept here for historical reference only.
 */
 u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){
   int flags = pMem->flags;
@@ -3503,7 +3504,7 @@ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){
   *pLen = n;
   return ((n*2) + 12 + ((flags&MEM_Str)!=0));
 }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* inlined into OP_MakeRecord */
 
 /*
 ** The sizes for serial types less than 128
@@ -4908,7 +4909,7 @@ void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){
 ** features such as 'now'.
 */
 int sqlite3NotPureFunc(sqlite3_context *pCtx){
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   if( pCtx->pVdbe==0 ) return 1;
 #endif
   if( pCtx->pVdbe->aOp[pCtx->iOp].opcode==OP_PureFunc ){
index af6d41a3824b87eda55dd8819178143c9cadadba..241d6f2ff38d95105e09a9354d07305dd280feaf 100644 (file)
@@ -1303,7 +1303,7 @@ struct ValueNewStat4Ctx {
 ** an sqlite3_value within the UnpackedRecord.a[] array.
 */
 static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   if( p ){
     UnpackedRecord *pRec = p->ppRec[0];
 
@@ -1339,7 +1339,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){
   }
 #else
   UNUSED_PARAMETER(p);
-#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */
+#endif /* defined(SQLITE_ENABLE_STAT4) */
   return sqlite3ValueNew(db);
 }
 
@@ -1363,7 +1363,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){
 ** and sets (*ppVal) to NULL. Or, if an error occurs, (*ppVal) is set to
 ** NULL and an SQLite error code returned.
 */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 static int valueFromFunction(
   sqlite3 *db,                    /* The database connection */
   Expr *p,                        /* The expression to evaluate */
@@ -1446,7 +1446,7 @@ static int valueFromFunction(
 }
 #else
 # define valueFromFunction(a,b,c,d,e,f) SQLITE_OK
-#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */
+#endif /* defined(SQLITE_ENABLE_STAT4) */
 
 /*
 ** Extract a value from the supplied expression in the manner described
@@ -1475,7 +1475,7 @@ static int valueFromExpr(
 
   assert( pExpr!=0 );
   while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft;
-#if defined(SQLITE_ENABLE_STAT3_OR_STAT4)
+#if defined(SQLITE_ENABLE_STAT4)
   if( op==TK_REGISTER ) op = pExpr->op2;
 #else
   if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;
@@ -1568,7 +1568,7 @@ static int valueFromExpr(
                          0, SQLITE_DYNAMIC);
   }
 #endif
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   else if( op==TK_FUNCTION && pCtx!=0 ){
     rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx);
   }
@@ -1585,13 +1585,13 @@ static int valueFromExpr(
   return rc;
 
 no_mem:
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   if( pCtx==0 || pCtx->pParse->nErr==0 )
 #endif
     sqlite3OomFault(db);
   sqlite3DbFree(db, zVal);
   assert( *ppVal==0 );
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   if( pCtx==0 ) sqlite3ValueFree(pVal);
 #else
   assert( pCtx==0 ); sqlite3ValueFree(pVal);
@@ -1619,56 +1619,7 @@ int sqlite3ValueFromExpr(
   return pExpr ? valueFromExpr(db, pExpr, enc, affinity, ppVal, 0) : 0;
 }
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
-/*
-** The implementation of the sqlite_record() function. This function accepts
-** a single argument of any type. The return value is a formatted database 
-** record (a blob) containing the argument value.
-**
-** This is used to convert the value stored in the 'sample' column of the
-** sqlite_stat3 table to the record format SQLite uses internally.
-*/
-static void recordFunc(
-  sqlite3_context *context,
-  int argc,
-  sqlite3_value **argv
-){
-  const int file_format = 1;
-  u32 iSerial;                    /* Serial type */
-  int nSerial;                    /* Bytes of space for iSerial as varint */
-  u32 nVal;                       /* Bytes of space required for argv[0] */
-  int nRet;
-  sqlite3 *db;
-  u8 *aRet;
-
-  UNUSED_PARAMETER( argc );
-  iSerial = sqlite3VdbeSerialType(argv[0], file_format, &nVal);
-  nSerial = sqlite3VarintLen(iSerial);
-  db = sqlite3_context_db_handle(context);
-
-  nRet = 1 + nSerial + nVal;
-  aRet = sqlite3DbMallocRawNN(db, nRet);
-  if( aRet==0 ){
-    sqlite3_result_error_nomem(context);
-  }else{
-    aRet[0] = nSerial+1;
-    putVarint32(&aRet[1], iSerial);
-    sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial);
-    sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT);
-    sqlite3DbFreeNN(db, aRet);
-  }
-}
-
-/*
-** Register built-in functions used to help read ANALYZE data.
-*/
-void sqlite3AnalyzeFunctions(void){
-  static FuncDef aAnalyzeTableFuncs[] = {
-    FUNCTION(sqlite_record,   1, 0, 0, recordFunc),
-  };
-  sqlite3InsertBuiltinFuncs(aAnalyzeTableFuncs, ArraySize(aAnalyzeTableFuncs));
-}
-
+#ifdef SQLITE_ENABLE_STAT4
 /*
 ** Attempt to extract a value from pExpr and use it to construct *ppVal.
 **
index 4d23deb2551500d140de779424750be1fa707ad5..ebf447a31c2fe629714b1e3e3cd1e5350ab1bcde 100644 (file)
@@ -1077,7 +1077,7 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){
 }
 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 /*
 ** Estimate the location of a particular key among all keys in an
 ** index.  Store the results in aStat as follows:
@@ -1270,7 +1270,7 @@ static int whereKeyStats(
   pRec->nField = nField;
   return i;
 }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 
 /*
 ** If it is not NULL, pTerm is a term that provides an upper or lower
@@ -1296,7 +1296,7 @@ static LogEst whereRangeAdjust(WhereTerm *pTerm, LogEst nNew){
 }
 
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 /*
 ** Return the affinity for a single column of an index.
 */
@@ -1311,7 +1311,7 @@ char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCol){
 #endif
 
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 /* 
 ** This function is called to estimate the number of rows visited by a
 ** range-scan on a skip-scan index. For example:
@@ -1417,7 +1417,7 @@ static int whereRangeSkipScanEst(
 
   return rc;
 }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 
 /*
 ** This function is used to estimate the number of rows that will be visited
@@ -1470,7 +1470,7 @@ static int whereRangeScanEst(
   int nOut = pLoop->nOut;
   LogEst nNew;
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   Index *p = pLoop->u.btree.pIndex;
   int nEq = pLoop->u.btree.nEq;
 
@@ -1573,7 +1573,7 @@ static int whereRangeScanEst(
           /* TUNING:  If both iUpper and iLower are derived from the same
           ** sample, then assume they are 4x more selective.  This brings
           ** the estimated selectivity more in line with what it would be
-          ** if estimated without the use of STAT3/4 tables. */
+          ** if estimated without the use of STAT4 tables. */
           if( iLwrIdx==iUprIdx ) nNew -= 20;  assert( 20==sqlite3LogEst(4) );
         }else{
           nNew = 10;        assert( 10==sqlite3LogEst(2) );
@@ -1622,12 +1622,12 @@ static int whereRangeScanEst(
   return rc;
 }
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 /*
 ** Estimate the number of rows that will be returned based on
 ** an equality constraint x=VALUE and where that VALUE occurs in
 ** the histogram data.  This only works when x is the left-most
-** column of an index and sqlite_stat3 histogram data is available
+** column of an index and sqlite_stat4 histogram data is available
 ** for that index.  When pExpr==NULL that means the constraint is
 ** "x IS NULL" instead of "x=VALUE".
 **
@@ -1685,9 +1685,9 @@ static int whereEqualScanEst(
   
   return rc;
 }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 /*
 ** Estimate the number of rows that will be returned based on
 ** an IN constraint where the right-hand side of the IN operator
@@ -1734,7 +1734,7 @@ static int whereInScanEst(
   assert( pBuilder->nRecValid==nRecValid );
   return rc;
 }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 
 
 #ifdef WHERETRACE_ENABLED
@@ -2455,7 +2455,7 @@ static int whereLoopAddBtreeIndex(
     LogEst rCostIdx;
     LogEst nOutUnadjusted;        /* nOut before IN() and WHERE adjustments */
     int nIn = 0;
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
     int nRecValid = pBuilder->nRecValid;
 #endif
     if( (eOp==WO_ISNULL || (pTerm->wtFlags&TERM_VNULL)!=0)
@@ -2613,7 +2613,7 @@ static int whereLoopAddBtreeIndex(
     ** the value of pNew->nOut to account for pTerm (but not nIn/nInMul).  */
     assert( pNew->nOut==saved_nOut );
     if( pNew->wsFlags & WHERE_COLUMN_RANGE ){
-      /* Adjust nOut using stat3/stat4 data. Or, if there is no stat3/stat4
+      /* Adjust nOut using stat4 data. Or, if there is no stat4
       ** data, using some other estimate.  */
       whereRangeScanEst(pParse, pBuilder, pBtm, pTop, pNew);
     }else{
@@ -2627,7 +2627,7 @@ static int whereLoopAddBtreeIndex(
         pNew->nOut += pTerm->truthProb;
         pNew->nOut -= nIn;
       }else{
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
         tRowcnt nOut = 0;
         if( nInMul==0 
          && pProbe->nSample 
@@ -2695,7 +2695,7 @@ static int whereLoopAddBtreeIndex(
       whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nInMul+nIn);
     }
     pNew->nOut = saved_nOut;
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
     pBuilder->nRecValid = nRecValid;
 #endif
   }
@@ -3068,7 +3068,7 @@ static int whereLoopAddBtree(
       ** plan */
       pTab->tabFlags |= TF_StatsUsed;
     }
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
     sqlite3Stat4ProbeFree(pBuilder->pRec);
     pBuilder->nRecValid = 0;
     pBuilder->pRec = 0;
index 9c90f62a1b8071991dd0fad6739004874e8363fe..09e45024c101410245c34f08e49ea079d9a0f343 100644 (file)
@@ -279,10 +279,10 @@ struct WhereTerm {
 #define TERM_ORINFO     0x10   /* Need to free the WhereTerm.u.pOrInfo object */
 #define TERM_ANDINFO    0x20   /* Need to free the WhereTerm.u.pAndInfo obj */
 #define TERM_OR_OK      0x40   /* Used during OR-clause processing */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
 #  define TERM_VNULL    0x80   /* Manufactured x>NULL or x<=NULL term */
 #else
-#  define TERM_VNULL    0x00   /* Disabled if not using stat3 */
+#  define TERM_VNULL    0x00   /* Disabled if not using stat4 */
 #endif
 #define TERM_LIKEOPT    0x100  /* Virtual terms from the LIKE optimization */
 #define TERM_LIKECOND   0x200  /* Conditionally this LIKE operator term */
@@ -399,7 +399,7 @@ struct WhereLoopBuilder {
   ExprList *pOrderBy;       /* ORDER BY clause */
   WhereLoop *pNew;          /* Template WhereLoop */
   WhereOrSet *pOrSet;       /* Record best loops here, if not NULL */
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
+#ifdef SQLITE_ENABLE_STAT4
   UnpackedRecord *pRec;     /* Probe for stat4 (if required) */
   int nRecValid;            /* Number of valid fields currently in pRec */
 #endif
index 9ac940c5a06788954912abf67b26163988b88382..155cef7155cf3f462d8c825deef28436c0e7132a 100644 (file)
@@ -1381,8 +1381,8 @@ static void exprAnalyze(
     }
   }
 
-#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
-  /* When sqlite_stat3 histogram data is available an operator of the
+#ifdef SQLITE_ENABLE_STAT4
+  /* When sqlite_stat4 histogram data is available an operator of the
   ** form "x IS NOT NULL" can sometimes be evaluated more efficiently
   ** as "x>NULL" if x is not an INTEGER PRIMARY KEY.  So construct a
   ** virtual term of that form.
@@ -1418,7 +1418,7 @@ static void exprAnalyze(
       pNewTerm->prereqAll = pTerm->prereqAll;
     }
   }
-#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */
+#endif /* SQLITE_ENABLE_STAT4 */
 
   /* Prevent ON clause terms of a LEFT JOIN from being used to drive
   ** an index for tables to the left of the join.
index d20e5ebccdea4cd5f26d244b04b5378c46d7ee2f..a82456d47bd784c01a922c7aac479cca6bf6619b 100644 (file)
@@ -856,7 +856,6 @@ do_test alter-14.2 {
 set system_table_list {1 sqlite_master}
 catchsql ANALYZE
 ifcapable analyze { lappend system_table_list 2 sqlite_stat1 }
-ifcapable stat3   { lappend system_table_list 3 sqlite_stat3 }
 ifcapable stat4   { lappend system_table_list 4 sqlite_stat4 }
 
 foreach {tn tbl} $system_table_list {
index 602f75345d9b2a6e98dc89172fb186f6883f8374..2eed636e0d0aa90b11e3be408167592c05f7f06b 100644 (file)
@@ -594,4 +594,3 @@ do_execsql_test 18.2.2 {
 } {{CREATE TABLE t0 (c1 INTEGER, PRIMARY KEY(c1))}}
 
 finish_test
-
index 1472c92c5fa02bbf209aa98695523a4b9a558f79..948a351e708c64495026104e6ca4298aa199c2a0 100644 (file)
@@ -383,4 +383,3 @@ do_execsql_test 17.2 {
 
 
 finish_test
-
index 683542f12790b7a08c757b2277cd6c55c6aa0676..ca6c9b096d4238087da81164597273ac953aadef 100644 (file)
@@ -288,7 +288,7 @@ do_test analyze-4.3 {
 } {}
 
 # Verify that DROP TABLE and DROP INDEX remove entries from the 
-# sqlite_stat1, sqlite_stat3 and sqlite_stat4 tables.
+# sqlite_stat1 and sqlite_stat4 tables.
 #
 do_test analyze-5.0 {
   execsql {
@@ -306,13 +306,12 @@ do_test analyze-5.0 {
     SELECT DISTINCT tbl FROM sqlite_stat1 ORDER BY 1;
   }
 } {t3i1 t3i2 t3i3 t4i1 t4i2 t3 t4}
-ifcapable stat4||stat3 {
-  ifcapable stat4 {set stat sqlite_stat4} else {set stat sqlite_stat3}
+ifcapable stat4 {
   do_test analyze-5.1 {
-    execsql "
-      SELECT DISTINCT idx FROM $stat ORDER BY 1;
-      SELECT DISTINCT tbl FROM $stat ORDER BY 1;
-    "
+    execsql {
+      SELECT DISTINCT idx FROM sqlite_stat4 ORDER BY 1;
+      SELECT DISTINCT tbl FROM sqlite_stat4 ORDER BY 1;
+    }
   } {t3i1 t3i2 t3i3 t4i1 t4i2 t3 t4}
 }
 do_test analyze-5.2 {
@@ -322,12 +321,12 @@ do_test analyze-5.2 {
     SELECT DISTINCT tbl FROM sqlite_stat1 ORDER BY 1;
   }
 } {t3i1 t3i3 t4i1 t4i2 t3 t4}
-ifcapable stat4||stat3 {
+ifcapable stat4 {
   do_test analyze-5.3 {
-    execsql "
-      SELECT DISTINCT idx FROM $stat ORDER BY 1;
-      SELECT DISTINCT tbl FROM $stat ORDER BY 1;
-    "
+    execsql {
+      SELECT DISTINCT idx FROM sqlite_stat4 ORDER BY 1;
+      SELECT DISTINCT tbl FROM sqlite_stat4 ORDER BY 1;
+    }
   } {t3i1 t3i3 t4i1 t4i2 t3 t4}
 }
 do_test analyze-5.4 {
@@ -337,12 +336,12 @@ do_test analyze-5.4 {
     SELECT DISTINCT tbl FROM sqlite_stat1 ORDER BY 1;
   }
 } {t4i1 t4i2 t4}
-ifcapable stat4||stat3 {
+ifcapable stat4 {
   do_test analyze-5.5 {
-    execsql "
-      SELECT DISTINCT idx FROM $stat ORDER BY 1;
-      SELECT DISTINCT tbl FROM $stat ORDER BY 1;
-    "
+    execsql {
+      SELECT DISTINCT idx FROM sqlite_stat4 ORDER BY 1;
+      SELECT DISTINCT tbl FROM sqlite_stat4 ORDER BY 1;
+    }
   } {t4i1 t4i2 t4}
 }
 
index b7b324a86843378d30d5a69c12f1dcf297f3993b..8cc344e22bd8bafbb409e7fa5717e9bb1c97b9f8 100644 (file)
@@ -18,7 +18,7 @@ set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix analyze3
 
-ifcapable !stat4&&!stat3 {
+ifcapable !stat4 {
   finish_test
   return
 }
@@ -100,11 +100,7 @@ do_test analyze3-1.1.1 {
     ANALYZE;
   }
 
-  ifcapable stat4 {
-    execsql { SELECT count(*)>0 FROM sqlite_stat4; }
-  } else {
-    execsql { SELECT count(*)>0 FROM sqlite_stat3; }
-  }
+  execsql { SELECT count(*)>0 FROM sqlite_stat4; }
 } {1}
 
 do_execsql_test analyze3-1.1.x {
index ac175c07b5953b74a3541a398b34ad2005994fda..e58457a6776d534ddf12e0feed56a445871838d3 100644 (file)
@@ -17,7 +17,7 @@
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 
-ifcapable !stat4&&!stat3 {
+ifcapable !stat4 {
   finish_test
   return
 }
@@ -67,39 +67,21 @@ do_test analyze5-1.0 {
     CREATE INDEX t1z ON t1(z);  -- integers 0, 1, 2, and 3
     ANALYZE;
   }
-  ifcapable stat4 {
-    db eval {
-      SELECT DISTINCT lindex(test_decode(sample),0) 
-        FROM sqlite_stat4 WHERE idx='t1u' ORDER BY nlt;
-    }
-  } else {
-    db eval {
-      SELECT sample FROM sqlite_stat3 WHERE idx='t1u' ORDER BY nlt;
-    }
+  db eval {
+    SELECT DISTINCT lindex(test_decode(sample),0) 
+      FROM sqlite_stat4 WHERE idx='t1u' ORDER BY nlt;
   }
 } {alpha bravo charlie delta}
 
 do_test analyze5-1.1 {
-  ifcapable stat4 {
-    db eval {
-      SELECT DISTINCT lower(lindex(test_decode(sample), 0)) 
-        FROM sqlite_stat4 WHERE idx='t1v' ORDER BY 1
-    }
-  } else {
-    db eval {
-      SELECT lower(sample) FROM sqlite_stat3 WHERE idx='t1v' ORDER BY 1
-    }
+  db eval {
+    SELECT DISTINCT lower(lindex(test_decode(sample), 0)) 
+      FROM sqlite_stat4 WHERE idx='t1v' ORDER BY 1
   }
 } {alpha bravo charlie delta}
-ifcapable stat4 {
-  do_test analyze5-1.2 {
-    db eval {SELECT idx, count(*) FROM sqlite_stat4 GROUP BY 1 ORDER BY 1}
-  } {t1t 8 t1u 8 t1v 8 t1w 8 t1x 8 t1y 9 t1z 8}
-} else {
-  do_test analyze5-1.2 {
-    db eval {SELECT idx, count(*) FROM sqlite_stat3 GROUP BY 1 ORDER BY 1}
-  } {t1t 4 t1u 4 t1v 4 t1w 4 t1x 4 t1y 2 t1z 4}
-}
+do_test analyze5-1.2 {
+  db eval {SELECT idx, count(*) FROM sqlite_stat4 GROUP BY 1 ORDER BY 1}
+} {t1t 8 t1u 8 t1v 8 t1w 8 t1x 8 t1y 9 t1z 8}
 
 # Verify that range queries generate the correct row count estimates
 #
index 34d00f56ec245bce10eb3175efba66ca61d59672..b6353f266826a44d12345d4ad354039f20a263f6 100644 (file)
@@ -17,7 +17,7 @@
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 
-ifcapable !stat4&&!stat3 {
+ifcapable !stat4 {
   finish_test
   return
 }
index d6da6c1510a80ad99eaa22c1590fa11c0ef38cd8..b3dba0256315c789c64fc6f97d70bd608bcba0f0 100644 (file)
@@ -82,7 +82,7 @@ do_test analyze7-3.1 {
 do_test analyze7-3.2.1 {
   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=?;}
 } {/*SEARCH TABLE t1 USING INDEX t1cd (c=?)*/}
-ifcapable stat4||stat3 {
+ifcapable stat4 {
   # If ENABLE_STAT4 is defined, SQLite comes up with a different estimated
   # row count for (c=2) than it does for (c=?).
   do_test analyze7-3.2.2 {
@@ -99,7 +99,7 @@ do_test analyze7-3.3 {
   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123 AND b=123}
 } {/*SEARCH TABLE t1 USING INDEX t1a (a=?)*/}
 
-ifcapable {!stat4 && !stat3} {
+ifcapable {!stat4} {
   do_test analyze7-3.4 {
     execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=123 AND b=123}
   } {/*SEARCH TABLE t1 USING INDEX t1b (b=?)*/}
index daa83ef4273e7538c23a2bd2bc6f7893136d1524..7c61652e510d8cf5c0ed9ae861958663ea72ab93 100644 (file)
 #***********************************************************************
 #
 # This file implements tests for SQLite library.  The focus of the tests
-# in this file is testing the capabilities of sqlite_stat3.
+# in this file is testing the capabilities of sqlite_stat4.
 #
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 
-ifcapable !stat4&&!stat3 {
+ifcapable !stat4 {
   finish_test
   return
 }
diff --git a/test/analyzeA.test b/test/analyzeA.test
deleted file mode 100644 (file)
index afcbe84..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-# 2013 August 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 automated tests used to verify that the current build
-# (which must be either ENABLE_STAT3 or ENABLE_STAT4) works with both stat3
-# and stat4 data.
-#
-
-set testdir [file dirname $argv0]
-source $testdir/tester.tcl
-set testprefix analyzeA
-
-ifcapable !stat4&&!stat3 {
-  finish_test
-  return
-}
-
-# Populate the stat3 table according to the current contents of the db
-#
-proc populate_stat3 {{bDropTable 1}} {
-  # Open a second connection on database "test.db" and run ANALYZE. If this
-  # is an ENABLE_STAT3 build, this is all that is required to create and
-  # populate the sqlite_stat3 table. 
-  # 
-  sqlite3 db2 test.db
-  execsql { ANALYZE }
-
-  # Now, if this is an ENABLE_STAT4 build, create and populate the 
-  # sqlite_stat3 table based on the stat4 data gathered by the ANALYZE
-  # above. Then drop the sqlite_stat4 table.
-  #
-  ifcapable stat4 {
-    db2 func lindex lindex
-    execsql {
-      PRAGMA writable_schema = on;
-      CREATE TABLE sqlite_stat3(tbl,idx,neq,nlt,ndlt,sample);
-      INSERT INTO sqlite_stat3 
-      SELECT DISTINCT tbl, idx, 
-        lindex(neq,0), lindex(nlt,0), lindex(ndlt,0), test_extract(sample, 0)
-      FROM sqlite_stat4;
-    } db2
-    if {$bDropTable} { execsql {DROP TABLE sqlite_stat4} db2 }
-    execsql { PRAGMA writable_schema = off }
-  }
-
-  # Modify the database schema cookie to ensure that the other connection
-  # reloads the schema.
-  #
-  execsql {
-    CREATE TABLE obscure_tbl_nm(x);
-    DROP TABLE obscure_tbl_nm;
-  } db2
-  db2 close
-}
-
-# Populate the stat4 table according to the current contents of the db
-#
-proc populate_stat4 {{bDropTable 1}} {
-  sqlite3 db2 test.db
-  execsql { ANALYZE }
-
-  ifcapable stat3 {
-    execsql {
-      PRAGMA writable_schema = on;
-      CREATE TABLE sqlite_stat4(tbl,idx,neq,nlt,ndlt,sample);
-      INSERT INTO sqlite_stat4 
-      SELECT tbl, idx, neq, nlt, ndlt, sqlite_record(sample) 
-      FROM sqlite_stat3;
-    } db2
-    if {$bDropTable} { execsql {DROP TABLE sqlite_stat3} db2 }
-    execsql { PRAGMA writable_schema = off }
-  }
-  # Modify the database schema cookie to ensure that the other connection
-  # reloads the schema.
-  #
-  execsql {
-    CREATE TABLE obscure_tbl_nm(x);
-    DROP TABLE obscure_tbl_nm;
-  } db2
-  db2 close
-}
-
-# Populate the stat4 table according to the current contents of the db.
-# Leave deceptive data in the stat3 table. This data should be ignored
-# in favour of that from the stat4 table.
-#
-proc populate_both {} {
-  ifcapable stat4 { populate_stat3 0 }
-  ifcapable stat3 { populate_stat4 0 }
-
-  sqlite3 db2 test.db
-  execsql {
-    PRAGMA writable_schema = on;
-    UPDATE sqlite_stat3 SET idx = 
-      CASE idx WHEN 't1b' THEN 't1c' ELSE 't1b'
-    END;
-    PRAGMA writable_schema = off;
-    CREATE TABLE obscure_tbl_nm(x);
-    DROP TABLE obscure_tbl_nm;
-  } db2
-  db2 close
-}
-
-foreach {tn analyze_cmd} {
-  1 populate_stat4 
-  2 populate_stat3
-  3 populate_both
-} {
-  reset_db
-  do_test 1.$tn.1 {
-    execsql { CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c INT) }
-    for {set i 0} {$i < 100} {incr i} {
-      set c [expr int(pow(1.1,$i)/100)]
-      set b [expr 125 - int(pow(1.1,99-$i))/100]
-      execsql {INSERT INTO t1 VALUES($i, $b, $c)}
-    }
-  } {}
-
-  execsql { CREATE INDEX t1b ON t1(b) }
-  execsql { CREATE INDEX t1c ON t1(c) }
-  $analyze_cmd
-
-  do_execsql_test 1.$tn.2.1 { SELECT count(*) FROM t1 WHERE b=31 } 1
-  do_execsql_test 1.$tn.2.2 { SELECT count(*) FROM t1 WHERE c=0  } 49
-  do_execsql_test 1.$tn.2.3 { SELECT count(*) FROM t1 WHERE b=125  } 49
-  do_execsql_test 1.$tn.2.4 { SELECT count(*) FROM t1 WHERE c=16  } 1
-
-  do_eqp_test 1.$tn.2.5 {
-    SELECT * FROM t1 WHERE b = 31 AND c = 0;
-  } {SEARCH TABLE t1 USING INDEX t1b (b=?)}
-  do_eqp_test 1.$tn.2.6 {
-    SELECT * FROM t1 WHERE b = 125 AND c = 16;
-  } {SEARCH TABLE t1 USING INDEX t1c (c=?)}
-
-  do_execsql_test 1.$tn.3.1 { 
-    SELECT count(*) FROM t1 WHERE b BETWEEN 0 AND 50
-  } {6}
-  do_execsql_test 1.$tn.3.2 { 
-    SELECT count(*) FROM t1 WHERE c BETWEEN 0 AND 50
-  } {90}
-  do_execsql_test 1.$tn.3.3 { 
-    SELECT count(*) FROM t1 WHERE b BETWEEN 75 AND 125
-  } {90}
-  do_execsql_test 1.$tn.3.4 { 
-    SELECT count(*) FROM t1 WHERE c BETWEEN 75 AND 125
-  } {6}
-
-  do_eqp_test 1.$tn.3.5 {
-    SELECT * FROM t1 WHERE b BETWEEN 0 AND 50 AND c BETWEEN 0 AND 50
-  } {SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?)}
-
-  do_eqp_test 1.$tn.3.6 {
-    SELECT * FROM t1 WHERE b BETWEEN 75 AND 125 AND c BETWEEN 75 AND 125
-  } {SEARCH TABLE t1 USING INDEX t1c (c>? AND c<?)}
-
-  do_eqp_test 1.$tn.3.7 {
-    SELECT * FROM t1 WHERE b BETWEEN +0 AND +50 AND c BETWEEN +0 AND +50
-  } {SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?)}
-
-  do_eqp_test 1.$tn.3.8 {
-    SELECT * FROM t1
-     WHERE b BETWEEN cast('0' AS int) AND cast('50.0' AS real)
-       AND c BETWEEN cast('0' AS numeric) AND cast('50.0' AS real)
-  } {SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?)}
-
-  do_eqp_test 1.$tn.3.9 {
-    SELECT * FROM t1 WHERE b BETWEEN +75 AND +125 AND c BETWEEN +75 AND +125
-  } {SEARCH TABLE t1 USING INDEX t1c (c>? AND c<?)}
-
-  do_eqp_test 1.$tn.3.10 {
-    SELECT * FROM t1
-     WHERE b BETWEEN cast('75' AS int) AND cast('125.0' AS real)
-       AND c BETWEEN cast('75' AS numeric) AND cast('125.0' AS real)
-  } {SEARCH TABLE t1 USING INDEX t1c (c>? AND c<?)}
-}
-
-finish_test
diff --git a/test/analyzeB.test b/test/analyzeB.test
deleted file mode 100644 (file)
index e91e7d5..0000000
+++ /dev/null
@@ -1,682 +0,0 @@
-# 2013 August 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 automated tests used to verify that the sqlite_stat3
-# functionality is working. The tests in this file are based on a subset
-# of the sqlite_stat4 tests in analyze9.test.
-#
-
-set testdir [file dirname $argv0]
-source $testdir/tester.tcl
-set testprefix analyzeB
-
-ifcapable !stat3 {
-  finish_test
-  return
-}
-
-do_execsql_test 1.0 {
-  CREATE TABLE t1(a TEXT, b TEXT); 
-  INSERT INTO t1 VALUES('(0)', '(0)');
-  INSERT INTO t1 VALUES('(1)', '(1)');
-  INSERT INTO t1 VALUES('(2)', '(2)');
-  INSERT INTO t1 VALUES('(3)', '(3)');
-  INSERT INTO t1 VALUES('(4)', '(4)');
-  CREATE INDEX i1 ON t1(a, b);
-} {}
-
-
-do_execsql_test 1.1 {
-  ANALYZE;
-} {}
-
-do_execsql_test 1.2 {
-  SELECT tbl,idx,nEq,nLt,nDLt,quote(sample) FROM sqlite_stat3;
-} {
-  t1 i1 1 0 0 '(0)'
-  t1 i1 1 1 1 '(1)'
-  t1 i1 1 2 2 '(2)'
-  t1 i1 1 3 3 '(3)'
-  t1 i1 1 4 4 '(4)'
-}
-
-if {[permutation] != "utf16"} {
-  do_execsql_test 1.3 {
-    SELECT tbl,idx,nEq,nLt,nDLt,quote(sample) FROM sqlite_stat3;
-  } {
-    t1 i1 1 0 0 '(0)'
-    t1 i1 1 1 1 '(1)'
-    t1 i1 1 2 2 '(2)'
-    t1 i1 1 3 3 '(3)'
-    t1 i1 1 4 4 '(4)'
-  }
-}
-
-
-#-------------------------------------------------------------------------
-# This is really just to test SQL user function "test_decode".
-#
-reset_db
-do_execsql_test 2.1 {
-  CREATE TABLE t1(a, b, c);
-  INSERT INTO t1(a) VALUES('some text');
-  INSERT INTO t1(a) VALUES(14);
-  INSERT INTO t1(a) VALUES(NULL);
-  INSERT INTO t1(a) VALUES(22.0);
-  INSERT INTO t1(a) VALUES(x'656667');
-  CREATE INDEX i1 ON t1(a, b, c);
-  ANALYZE;
-  SELECT quote(sample) FROM sqlite_stat3;
-} {
-  NULL 14 22.0 {'some text'} X'656667' 
-}
-
-#-------------------------------------------------------------------------
-# 
-reset_db
-do_execsql_test 3.1 {
-  CREATE TABLE t2(a, b);
-  CREATE INDEX i2 ON t2(a, b);
-  BEGIN;
-}
-
-do_test 3.2 {
-  for {set i 0} {$i < 1000} {incr i} {
-    set a [expr $i / 10]
-    set b [expr int(rand() * 15.0)]
-    execsql { INSERT INTO t2 VALUES($a, $b) }
-  }
-  execsql COMMIT
-} {}
-
-db func lindex lindex
-
-# Each value of "a" occurs exactly 10 times in the table.
-#
-do_execsql_test 3.3.1 {
-  SELECT count(*) FROM t2 GROUP BY a;
-} [lrange [string repeat "10 " 100] 0 99]
-
-# The first element in the "nEq" list of all samples should therefore be 10.
-#
-do_execsql_test 3.3.2 {
-  ANALYZE;
-  SELECT nEq FROM sqlite_stat3;
-} [lrange [string repeat "10 " 100] 0 23]
-
-#-------------------------------------------------------------------------
-# 
-do_execsql_test 3.4 {
-  DROP TABLE IF EXISTS t1;
-  CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
-  INSERT INTO t1 VALUES(1, 1, 'one-a');
-  INSERT INTO t1 VALUES(11, 1, 'one-b');
-  INSERT INTO t1 VALUES(21, 1, 'one-c');
-  INSERT INTO t1 VALUES(31, 1, 'one-d');
-  INSERT INTO t1 VALUES(41, 1, 'one-e');
-  INSERT INTO t1 VALUES(51, 1, 'one-f');
-  INSERT INTO t1 VALUES(61, 1, 'one-g');
-  INSERT INTO t1 VALUES(71, 1, 'one-h');
-  INSERT INTO t1 VALUES(81, 1, 'one-i');
-  INSERT INTO t1 VALUES(91, 1, 'one-j');
-  INSERT INTO t1 SELECT a+1,2,'two' || substr(c,4) FROM t1;
-  INSERT INTO t1 SELECT a+2,3,'three'||substr(c,4) FROM t1 WHERE c GLOB 'one-*';
-  INSERT INTO t1 SELECT a+3,4,'four'||substr(c,4) FROM t1 WHERE c GLOB 'one-*';
-  INSERT INTO t1 SELECT a+4,5,'five'||substr(c,4) FROM t1 WHERE c GLOB 'one-*';
-  INSERT INTO t1 SELECT a+5,6,'six'||substr(c,4) FROM t1 WHERE c GLOB 'one-*'; 
-  CREATE INDEX t1b ON t1(b);
-  ANALYZE;
-  SELECT c FROM t1 WHERE b=3 AND a BETWEEN 30 AND 60;
-} {three-d three-e three-f}
-
-
-#-------------------------------------------------------------------------
-# These tests verify that the sample selection for stat3 appears to be 
-# working as designed.
-#
-
-reset_db
-db func lindex lindex
-db func lrange lrange
-
-do_execsql_test 4.0 {
-  DROP TABLE IF EXISTS t1;
-  CREATE TABLE t1(a, b, c);
-  CREATE INDEX i1 ON t1(c, b, a);
-}
-
-
-proc insert_filler_rows_n {iStart args} {
-  set A(-ncopy) 1
-  set A(-nval) 1
-
-  foreach {k v} $args {
-    if {[info exists A($k)]==0} { error "no such option: $k" }
-    set A($k) $v
-  }
-  if {[llength $args] % 2} {
-    error "option requires an argument: [lindex $args end]"
-  }
-
-  for {set i 0} {$i < $A(-nval)} {incr i} {
-    set iVal [expr $iStart+$i]
-    for {set j 0} {$j < $A(-ncopy)} {incr j} {
-      execsql { INSERT INTO t1 VALUES($iVal, $iVal, $iVal) }
-    }
-  }
-}
-
-do_test 4.1 {
-  execsql { BEGIN }
-  insert_filler_rows_n  0  -ncopy 10 -nval 19
-  insert_filler_rows_n 20  -ncopy  1 -nval 100
-
-  execsql {
-    INSERT INTO t1(c, b, a) VALUES(200, 1, 'a');
-    INSERT INTO t1(c, b, a) VALUES(200, 1, 'b');
-    INSERT INTO t1(c, b, a) VALUES(200, 1, 'c');
-
-    INSERT INTO t1(c, b, a) VALUES(200, 2, 'e');
-    INSERT INTO t1(c, b, a) VALUES(200, 2, 'f');
-
-    INSERT INTO t1(c, b, a) VALUES(201, 3, 'g');
-    INSERT INTO t1(c, b, a) VALUES(201, 4, 'h');
-
-    ANALYZE;
-    SELECT count(*) FROM sqlite_stat3;
-    SELECT count(*) FROM t1;
-  }
-} {24 297}
-
-do_execsql_test 4.2 {
-  SELECT neq, nlt, ndlt, sample FROM sqlite_stat3 ORDER BY rowid LIMIT 16;
-} {
-  10 0 0 0
-  10 10 1 1
-  10 20 2 2
-  10 30 3 3
-  10 40 4 4
-  10 50 5 5
-  10 60 6 6
-  10 70 7 7
-  10 80 8 8
-  10 90 9 9
-  10 100 10 10
-  10 110 11 11
-  10 120 12 12
-  10 130 13 13
-  10 140 14 14
-  10 150 15 15
-}
-
-do_execsql_test 4.3 {
-  SELECT neq, nlt, ndlt, sample FROM sqlite_stat3
-  ORDER BY rowid DESC LIMIT 2;
-} {
-  2 295 120 201
-  5 290 119 200
-}
-
-do_execsql_test 4.4 { SELECT count(DISTINCT c) FROM t1 WHERE c<201 } 120
-do_execsql_test 4.5 { SELECT count(DISTINCT c) FROM t1 WHERE c<200 } 119
-
-reset_db
-do_test 4.7 {
-  execsql { 
-    BEGIN;
-    CREATE TABLE t1(o,t INTEGER PRIMARY KEY);
-    CREATE INDEX i1 ON t1(o);
-  }
-  for {set i 0} {$i<10000} {incr i [expr (($i<1000)?1:10)]} {
-    execsql { INSERT INTO t1 VALUES('x', $i) }
-  }
-  execsql {
-    COMMIT;
-    ANALYZE;
-    SELECT count(*) FROM sqlite_stat3;
-  }
-} {1}
-do_execsql_test 4.8 {
-  SELECT sample FROM sqlite_stat3;
-} {x}
-
-
-#-------------------------------------------------------------------------
-# The following would cause a crash at one point.
-#
-reset_db
-do_execsql_test 5.1 {
-  PRAGMA encoding = 'utf-16';
-  CREATE TABLE t0(v);
-  ANALYZE;
-}
-
-#-------------------------------------------------------------------------
-# This was also crashing (corrupt sqlite_stat3 table).
-#
-reset_db
-do_execsql_test 6.1 {
-  CREATE TABLE t1(a, b);
-  CREATE INDEX i1 ON t1(a);
-  CREATE INDEX i2 ON t1(b);
-  INSERT INTO t1 VALUES(1, 1);
-  INSERT INTO t1 VALUES(2, 2);
-  INSERT INTO t1 VALUES(3, 3);
-  INSERT INTO t1 VALUES(4, 4);
-  INSERT INTO t1 VALUES(5, 5);
-  ANALYZE;
-  PRAGMA writable_schema = 1;
-  CREATE TEMP TABLE x1 AS
-    SELECT tbl,idx,neq,nlt,ndlt,sample FROM sqlite_stat3
-    ORDER BY (rowid%5), rowid;
-  DELETE FROM sqlite_stat3;
-  INSERT INTO sqlite_stat3 SELECT * FROM x1;
-  PRAGMA writable_schema = 0;
-  ANALYZE sqlite_master;
-}
-do_execsql_test 6.2 {
-  SELECT * FROM t1 WHERE a = 'abc';
-}
-
-#-------------------------------------------------------------------------
-# The following tests experiment with adding corrupted records to the
-# 'sample' column of the sqlite_stat3 table.
-#
-reset_db
-sqlite3_db_config_lookaside db 0 0 0
-
-do_execsql_test 7.1 {
-  CREATE TABLE t1(a, b);
-  CREATE INDEX i1 ON t1(a, b);
-  INSERT INTO t1 VALUES(1, 1);
-  INSERT INTO t1 VALUES(2, 2);
-  INSERT INTO t1 VALUES(3, 3);
-  INSERT INTO t1 VALUES(4, 4);
-  INSERT INTO t1 VALUES(5, 5);
-  ANALYZE;
-  UPDATE sqlite_stat3 SET sample = X'' WHERE rowid = 1;
-  ANALYZE sqlite_master;
-}
-
-do_execsql_test 7.2 {
-  UPDATE sqlite_stat3 SET sample = X'FFFF';
-  ANALYZE sqlite_master;
-  SELECT * FROM t1 WHERE a = 1;
-} {1 1}
-
-do_execsql_test 7.3 {
-  ANALYZE;
-  UPDATE sqlite_stat3 SET neq = '0 0 0';
-  ANALYZE sqlite_master;
-  SELECT * FROM t1 WHERE a = 1;
-} {1 1}
-
-do_execsql_test 7.4 {
-  ANALYZE;
-  UPDATE sqlite_stat3 SET ndlt = '0 0 0';
-  ANALYZE sqlite_master;
-  SELECT * FROM t1 WHERE a = 3;
-} {3 3}
-
-do_execsql_test 7.5 {
-  ANALYZE;
-  UPDATE sqlite_stat3 SET nlt = '0 0 0';
-  ANALYZE sqlite_master;
-  SELECT * FROM t1 WHERE a = 5;
-} {5 5}
-
-#-------------------------------------------------------------------------
-#
-reset_db
-do_execsql_test 8.1 {
-  CREATE TABLE t1(x TEXT);
-  CREATE INDEX i1 ON t1(x);
-  INSERT INTO t1 VALUES('1');
-  INSERT INTO t1 VALUES('2');
-  INSERT INTO t1 VALUES('3');
-  INSERT INTO t1 VALUES('4');
-  ANALYZE;
-}
-do_execsql_test 8.2 {
-  SELECT * FROM t1 WHERE x = 3;
-} {3}
-
-#-------------------------------------------------------------------------
-#
-reset_db
-do_execsql_test 9.1 {
-  CREATE TABLE t1(a, b, c, d, e);
-  CREATE INDEX i1 ON t1(a, b, c, d);
-  CREATE INDEX i2 ON t1(e);
-}
-do_test 9.2 {
-  execsql BEGIN;
-  for {set i 0} {$i < 100} {incr i} {
-    execsql "INSERT INTO t1 VALUES('x', 'y', 'z', $i, [expr $i/2])"
-  }
-  for {set i 0} {$i < 20} {incr i} {
-    execsql "INSERT INTO t1 VALUES('x', 'y', 'z', 101, $i)"
-  }
-  for {set i 102} {$i < 200} {incr i} {
-    execsql "INSERT INTO t1 VALUES('x', 'y', 'z', $i, [expr $i/2])"
-  }
-  execsql COMMIT
-  execsql ANALYZE
-} {}
-
-do_eqp_test 9.3.1 {
-  SELECT * FROM t1 WHERE a='x' AND b='y' AND c='z' AND d=101 AND e=5;
-} {/t1 USING INDEX i1/}
-do_eqp_test 9.3.2 {
-  SELECT * FROM t1 WHERE a='x' AND b='y' AND c='z' AND d=99 AND e=5;
-} {/t1 USING INDEX i1/}
-
-set value_d [expr 101]
-do_eqp_test 9.4.1 {
-  SELECT * FROM t1 WHERE a='x' AND b='y' AND c='z' AND d=$value_d AND e=5
-} {/t1 USING INDEX i1/}
-set value_d [expr 99]
-do_eqp_test 9.4.2 {
-  SELECT * FROM t1 WHERE a='x' AND b='y' AND c='z' AND d=$value_d AND e=5
-} {/t1 USING INDEX i1/}
-
-#-------------------------------------------------------------------------
-# Check that the planner takes stat3 data into account when considering
-# "IS NULL" and "IS NOT NULL" constraints.
-#
-do_execsql_test 10.1.1 {
-  DROP TABLE IF EXISTS t3;
-  CREATE TABLE t3(a, b);
-  CREATE INDEX t3a ON t3(a);
-  CREATE INDEX t3b ON t3(b);
-}
-do_test 10.1.2 {
-  for {set i 1} {$i < 100} {incr i} {
-    if {$i>90} { set a $i } else { set a NULL }
-    set b [expr $i % 5]
-    execsql "INSERT INTO t3 VALUES($a, $b)"
-  }
-  execsql ANALYZE
-} {}
-do_eqp_test 10.1.3 {
-  SELECT * FROM t3 WHERE a IS NULL AND b = 2
-} {/t3 USING INDEX t3b/}
-do_eqp_test 10.1.4 {
-  SELECT * FROM t3 WHERE a IS NOT NULL AND b = 2
-} {/t3 USING INDEX t3a/}
-
-#-------------------------------------------------------------------------
-# Check that stat3 data is used correctly with non-default collation
-# sequences.
-#
-foreach {tn schema} {
-  1 {
-    CREATE TABLE t4(a COLLATE nocase, b);
-    CREATE INDEX t4a ON t4(a);
-    CREATE INDEX t4b ON t4(b);
-  }
-  2 {
-    CREATE TABLE t4(a, b);
-    CREATE INDEX t4a ON t4(a COLLATE nocase);
-    CREATE INDEX t4b ON t4(b);
-  }
-} {
-  drop_all_tables
-  do_test 11.$tn.1 { execsql $schema } {}
-
-  do_test 11.$tn.2 {
-    for {set i 0} {$i < 100} {incr i} {
-      if { ($i % 10)==0 } { set a ABC } else { set a DEF }
-      set b [expr $i % 5]
-        execsql { INSERT INTO t4 VALUES($a, $b) }
-    }
-    execsql ANALYZE
-  } {}
-
-  do_eqp_test 11.$tn.3 {
-    SELECT * FROM t4 WHERE a = 'def' AND b = 3;
-  } {/t4 USING INDEX t4b/}
-
-  if {$tn==1} {
-    set sql "SELECT * FROM t4 WHERE a = 'abc' AND b = 3;"
-    do_eqp_test 11.$tn.4 $sql {/t4 USING INDEX t4a/}
-  } else {
-
-    set sql "SELECT * FROM t4 WHERE a = 'abc' COLLATE nocase AND b = 3;"
-    do_eqp_test 11.$tn.5 $sql {/t4 USING INDEX t4a/}
-
-    set sql "SELECT * FROM t4 WHERE a COLLATE nocase = 'abc' AND b = 3;"
-    do_eqp_test 11.$tn.6 $sql {/t4 USING INDEX t4a/}
-  }
-}
-
-#-------------------------------------------------------------------------
-# Test that nothing untoward happens if the stat3 table contains entries
-# for indexes that do not exist. Or NULL values in the idx column.
-# Or NULL values in any of the other columns.
-#
-drop_all_tables
-do_execsql_test 15.1 {
-  CREATE TABLE x1(a, b, UNIQUE(a, b));
-  INSERT INTO x1 VALUES(1, 2);
-  INSERT INTO x1 VALUES(3, 4);
-  INSERT INTO x1 VALUES(5, 6);
-  ANALYZE;
-  INSERT INTO sqlite_stat3 VALUES(NULL, NULL, NULL, NULL, NULL, NULL);
-}
-db close
-sqlite3 db test.db
-do_execsql_test 15.2 { SELECT * FROM x1 } {1 2 3 4 5 6}
-
-do_execsql_test 15.3 {
-  INSERT INTO sqlite_stat3 VALUES(42, 42, 42, 42, 42, 42);
-}
-db close
-sqlite3 db test.db
-do_execsql_test 15.4 { SELECT * FROM x1 } {1 2 3 4 5 6}
-
-do_execsql_test 15.5 {
-  UPDATE sqlite_stat1 SET stat = NULL;
-}
-db close
-sqlite3 db test.db
-do_execsql_test 15.6 { SELECT * FROM x1 } {1 2 3 4 5 6}
-
-do_execsql_test 15.7 {
-  ANALYZE;
-  UPDATE sqlite_stat1 SET tbl = 'no such tbl';
-}
-db close
-sqlite3 db test.db
-do_execsql_test 15.8 { SELECT * FROM x1 } {1 2 3 4 5 6}
-
-do_execsql_test 15.9 {
-  ANALYZE;
-  UPDATE sqlite_stat3 SET neq = NULL, nlt=NULL, ndlt=NULL;
-}
-db close
-sqlite3 db test.db
-do_execsql_test 15.10 { SELECT * FROM x1 } {1 2 3 4 5 6}
-
-# This is just for coverage....
-do_execsql_test 15.11 {
-  ANALYZE;
-  UPDATE sqlite_stat1 SET stat = stat || ' unordered';
-}
-db close
-sqlite3 db test.db
-do_execsql_test 15.12 { SELECT * FROM x1 } {1 2 3 4 5 6}
-
-#-------------------------------------------------------------------------
-# Test that allocations used for sqlite_stat3 samples are included in
-# the quantity returned by SQLITE_DBSTATUS_SCHEMA_USED.
-#
-set one [string repeat x 1000]
-set two [string repeat x 2000]
-do_test 16.1 {
-  reset_db
-  execsql {
-    CREATE TABLE t1(a, UNIQUE(a));
-    INSERT INTO t1 VALUES($one);
-    ANALYZE;
-  }
-  set nByte [lindex [sqlite3_db_status db SCHEMA_USED 0] 1]
-
-  reset_db
-  execsql {
-    CREATE TABLE t1(a, UNIQUE(a));
-    INSERT INTO t1 VALUES($two);
-    ANALYZE;
-  }
-  set nByte2 [lindex [sqlite3_db_status db SCHEMA_USED 0] 1]
-
-  expr {$nByte2 > $nByte+950 && $nByte2 < $nByte+1050}
-} {1}
-
-#-------------------------------------------------------------------------
-# Test that stat3 data may be used with partial indexes.
-#
-do_test 17.1 {
-  reset_db
-  execsql {
-    CREATE TABLE t1(a, b, c, d);
-    CREATE INDEX i1 ON t1(a, b) WHERE d IS NOT NULL;
-    INSERT INTO t1 VALUES(-1, -1, -1, NULL);
-    INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
-    INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
-    INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
-    INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
-    INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
-    INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
-  }
-
-  for {set i 0} {$i < 32} {incr i} {
-    execsql { INSERT INTO t1 VALUES($i%2, $b, $i/2, 'abc') }
-  }
-  execsql {ANALYZE main.t1}
-} {}
-
-do_catchsql_test 17.1.2 {
-  ANALYZE temp.t1;
-} {1 {no such table: temp.t1}}
-
-do_eqp_test 17.2 {
-  SELECT * FROM t1 WHERE d IS NOT NULL AND a=0;
-} {/USING INDEX i1/}
-do_eqp_test 17.3 {
-  SELECT * FROM t1 WHERE d IS NOT NULL AND a=0;
-} {/USING INDEX i1/}
-
-do_execsql_test 17.4 {
-  CREATE INDEX i2 ON t1(c) WHERE d IS NOT NULL;
-  ANALYZE main.i2;
-}
-do_eqp_test 17.5 {
-  SELECT * FROM t1 WHERE d IS NOT NULL AND a=0;
-} {/USING INDEX i1/}
-do_eqp_test 17.6 {
-  SELECT * FROM t1 WHERE d IS NOT NULL AND a=0 AND b=0 AND c=10;
-} {/USING INDEX i2/}
-
-#-------------------------------------------------------------------------
-#
-do_test 18.1 {
-  reset_db
-  execsql {
-    CREATE TABLE t1(a, b);
-    CREATE INDEX i1 ON t1(a, b);
-  }
-  for {set i 0} {$i < 9} {incr i} {
-    execsql {
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-      INSERT INTO t1 VALUES($i, 0);
-    }
-  }
-  execsql ANALYZE
-  execsql { SELECT count(*) FROM sqlite_stat3 }
-} {9}
-
-#-------------------------------------------------------------------------
-# For coverage.
-#
-ifcapable view {
-  do_test 19.1 {
-    reset_db 
-    execsql {
-      CREATE TABLE t1(x, y);
-      CREATE INDEX i1 ON t1(x, y);
-      CREATE VIEW v1 AS SELECT * FROM t1;
-      ANALYZE;
-    }
-  } {}
-}
-ifcapable auth {
-  proc authproc {op args} {
-    if {$op == "SQLITE_ANALYZE"} { return "SQLITE_DENY" }
-    return "SQLITE_OK"
-  }
-  do_test 19.2 {
-    reset_db 
-    db auth authproc
-    execsql {
-      CREATE TABLE t1(x, y);
-      CREATE VIEW v1 AS SELECT * FROM t1;
-    }
-    catchsql ANALYZE
-  } {1 {not authorized}}
-}
-
-#-------------------------------------------------------------------------
-#
-reset_db
-proc r {args} { expr rand() }
-db func r r
-db func lrange lrange
-do_test 20.1 {
-  execsql {
-    CREATE TABLE t1(a,b,c,d);
-    CREATE INDEX i1 ON t1(a,b,c,d);
-  }
-  for {set i 0} {$i < 16} {incr i} {
-    execsql {
-      INSERT INTO t1 VALUES($i, r(), r(), r());
-      INSERT INTO t1 VALUES($i, $i,  r(), r());
-      INSERT INTO t1 VALUES($i, $i,  $i,  r());
-      INSERT INTO t1 VALUES($i, $i,  $i,  $i);
-      INSERT INTO t1 VALUES($i, $i,  $i,  $i);
-      INSERT INTO t1 VALUES($i, $i,  $i,  r());
-      INSERT INTO t1 VALUES($i, $i,  r(), r());
-      INSERT INTO t1 VALUES($i, r(), r(), r());
-    }
-  }
-} {}
-do_execsql_test 20.2 { ANALYZE }
-for {set i 0} {$i<16} {incr i} {
-    set val $i
-    do_execsql_test 20.3.$i {
-      SELECT count(*) FROM sqlite_stat3 WHERE sample=$val
-    } {1}
-}
-
-finish_test
index 354acba64a2f9148ce5d1a59c2bfa099e35d5f6d..cc48fdb9aade4ad71648abf43ebef96995d75078 100644 (file)
@@ -2450,11 +2450,7 @@ ifcapable compound&&subquery {
   ifcapable stat4 {
     set stat4 "sqlite_stat4 "
   } else {
-    ifcapable stat3 {
-      set stat4 "sqlite_stat3 "
-    } else {
-      set stat4 ""
-    }
+    set stat4 ""
   }
   do_test auth-5.2 {
     execsql {
index 564b9c596619598843d38bd1dfb677ac0666384a..8d5d8349cf7aa6d486f09e25ad766987b11bdbbf 100644 (file)
@@ -63,7 +63,7 @@ proc lookaside {db} {
   }
 }
 
-ifcapable stat4||stat3 {
+ifcapable stat4 {
   set STAT3 1
 } else {
   set STAT3 0
index b4a7ba8e6b2a351d417b3d5a8ab64cf28224b28d..e15022fd6f6b46ddaef51263db5f2e7f21aaf0e6 100644 (file)
@@ -102,5 +102,3 @@ do_catchsql_test 2.3 {
 } {1 {misuse of aggregate function count()}}
 
 finish_test
-
-
index 42f997f06fd64d03b6b83ef2636198567f68ef56..085190e6758023ee91af1d9cb0422d8a602a6db5 100644 (file)
@@ -229,4 +229,3 @@ do_execsql_test 5.3 {
 } {ok}
 
 finish_test
-
index b312b7754f3a648f414e1398d71c75981f161efe..fdcfa969f27cc479116d8b06c3a2e202fba966c4 100644 (file)
@@ -5319,4 +5319,3 @@ do_catchsql_test 29.1 {
 } {1 {database disk image is malformed}}
 
 finish_test
-
index d60a8c0caa2a2e992d3d6be0454a9b4c8174bc3b..a8a3b0168e616ad68bf055813151fb6aa63235cc 100644 (file)
@@ -57,4 +57,3 @@ foreach {tn val q bCorrupt} {
 }
 
 finish_test
-
index 8673abb73b18c5128d52bfef640652df54545439..1317befb1c941f2390944749d814eab4ec7a70d2 100644 (file)
@@ -64,4 +64,3 @@ do_test 2.2 {
 } {1 {Error parsing expression}}
 
 finish_test
-
index 1c711e74e6a276200e60a7dd8b3d6c46a53b8ef2..c647d6928e869adfe7e7809e853dc726fb0e49db 100644 (file)
@@ -41,4 +41,3 @@ do_catchsql_test 1.3 {
 } {0 {}}
 
 finish_test
-
index b271954b2884b0a662af14bb0ed2ceaef8d64cc1..5faf0f02ac8f19eb96588f7560bb8fdfb36ced80 100644 (file)
@@ -159,7 +159,7 @@ do_test index6-2.2 {
     SELECT * FROM t2 WHERE a=5;
   }
 } {/.* TABLE t2 USING INDEX t2a1 .*/}
-ifcapable stat4||stat3 {
+ifcapable stat4 {
   execsql ANALYZE
   do_test index6-2.3stat4 {
     execsql {
@@ -438,4 +438,3 @@ do_execsql_test index6-14.2 {
 } {{} row}
 
 finish_test
-
index 33abbafd950bba9f1ff1b118543ad893f6152fe1..f57792e4c211b7ab404cb9b87d01970f9dee8707 100644 (file)
@@ -203,7 +203,7 @@ do_test index7-2.2 {
     SELECT * FROM t2 WHERE a=5;
   }
 } {/.* TABLE t2 USING COVERING INDEX t2a1 .*/}
-ifcapable stat4||stat3 {
+ifcapable stat4 {
   do_test index7-2.3stat4 {
     execsql {
       EXPLAIN QUERY PLAN
index 23864d53dca3d9b63a53d21898bfecf1b8fd0ea1..e56e7edeffcfbb41467eaa6839b73c3d73fb04fc 100644 (file)
@@ -153,5 +153,3 @@ do_execsql_test 405 {
 
 
 finish_test
-
-
index 75ddf9ccc032ee4ed14641850b3a8b20fe5ca2fc..0fc80254ba944aaf2b8f73c3044925212fc2d0d1 100644 (file)
@@ -1114,4 +1114,3 @@ do_execsql_test 16.2 {
 } {{ 1-}}
 
 finish_test
-
index a78073d833c29b28b85f1aa35831de34efffbd4b..ff91d2af2655930cf0dfc9835ece52dcc45c015b 100644 (file)
@@ -96,24 +96,6 @@ do_faultsim_test 6.2 -faults oom* -body {
 } -test {
   faultsim_test_result [list 0 {1 2}]
 }
-ifcapable stat3 {
-  do_test 6.3-prep {
-    execsql {
-      PRAGMA writable_schema = 1;
-      CREATE TABLE sqlite_stat4 AS 
-      SELECT tbl, idx, neq, nlt, ndlt, sqlite_record(sample) AS sample 
-      FROM sqlite_stat3;
-    }
-  } {}
-  do_faultsim_test 6.3 -faults oom* -body {
-    execsql { 
-      ANALYZE sqlite_master;
-      SELECT rowid FROM t1 WHERE a='abc' AND b<'y';
-    }
-  } -test {
-    faultsim_test_result [list 0 {1 2}]
-  }
-}
 
 do_execsql_test 7.0 {
   PRAGMA cache_size = 5;
index 351e528664e59906480cd883425e5b1b4674b930..eeb8bff0bbc40f680456f0d87450fa1a6da62685 100644 (file)
@@ -201,4 +201,3 @@ do_execsql_test 5.1 {
 } {123}
 
 finish_test
-
index 3722cbda065e46011b6cc8eb55c4fe143488e871..da9df8fe5eb56479b38d4a7eb8dae0f9cc894484 100644 (file)
@@ -234,7 +234,6 @@ do_execsql_test skipscan1-5.2 {
   ANALYZE;
   DELETE FROM sqlite_stat1;
   DROP TABLE IF EXISTS sqlite_stat4;
-  DROP TABLE IF EXISTS sqlite_stat3;
   INSERT INTO sqlite_stat1 VALUES('t5','t5i1','2702931 3 2 2 2 2');
   INSERT INTO sqlite_stat1 VALUES('t5','t5i2','2702931 686 2 2 2');
   ANALYZE sqlite_master;
index d814f842bfd62a8cfcf02cd03ee3471664be6c46..37cb4b33badf5fb1aa92ec7218344e2290f90fb4 100644 (file)
@@ -97,4 +97,3 @@ do_execsql_test 2.2 {
 } "[int2str 1001][int2str 1001][int2str 1001]"
 
 finish_test
-
index 2951233a5bb974c5213b7df5bd3950f585848386..86248ca21d932a8a908d099809dd1fe343649b96 100644 (file)
@@ -16,7 +16,7 @@
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 
-ifcapable !stat4&&!stat3 {
+ifcapable !stat4 {
   finish_test
   return
 }
@@ -55,19 +55,12 @@ do_test tkt-cbd05-1.1 {
 } {10}
 do_test tkt-cbd05-1.2 {
   db eval { ANALYZE; }
-  ifcapable stat4 {
-    db eval {
-      PRAGMA writable_schema = 1;
-      CREATE VIEW vvv AS 
-      SELECT tbl,idx,neq,nlt,ndlt,test_extract(sample,0) AS sample
-      FROM sqlite_stat4;
-      PRAGMA writable_schema = 0;
-    }
-  } else {
-    db eval {
-      CREATE VIEW vvv AS 
-      SELECT tbl,idx,neq,nlt,ndlt,sample FROM sqlite_stat3;
-    }
+  db eval {
+    PRAGMA writable_schema = 1;
+    CREATE VIEW vvv AS 
+    SELECT tbl,idx,neq,nlt,ndlt,test_extract(sample,0) AS sample
+    FROM sqlite_stat4;
+    PRAGMA writable_schema = 0;
   }
 } {}
 do_test tkt-cbd05-1.3 {
index d5fd884d05ced00fae6a80b64efead4578bbd49b..a2a06038737c0195acad8381dbddb750c41e58ec 100644 (file)
@@ -1072,4 +1072,3 @@ do_catchsql_test 17.1 {
 
 
 finish_test
-
index cb8005c1c6316b6173d180a4c0c43492442d17e4..8ffc6f9ba2ea23611d7a5b0d4d4c384f97cee337 100644 (file)
@@ -426,4 +426,3 @@ db close
 db2 close
 tvfs delete
 finish_test
-
index 264866fa61ae2627b635f9f618d1fc3a1f2e5af2..59974988392760307daebef934a43213fd7fb041 100644 (file)
@@ -1539,4 +1539,3 @@ do_catchsql_test where-25.5 {
 } {1 {corrupt database}}
 
 finish_test
-
index 7a019d3170e4978dc7cdd46baf68575bcee5777e..b2746093640308deb09dd5b876dc7c0392340c97 100644 (file)
@@ -787,7 +787,7 @@ do_test where9-6.8.2 {
 } {1 {no query solution}}
 
 set solution_possible 0
-ifcapable stat4||stat3 {
+ifcapable stat4 {
   if {[permutation] != "no_optimization"} { set solution_possible 1 }
 }
 if $solution_possible {
@@ -860,11 +860,6 @@ do_test where9-7.0 {
     INSERT INTO t6 SELECT * FROM t5;
     ANALYZE t5;
   }
-  ifcapable stat3 {
-    sqlite3 db2 test.db
-    db2 eval { DROP TABLE IF EXISTS sqlite_stat3 }
-    db2 close
-  }
 } {}
 do_test where9-7.1.1 {
   count_steps {
diff --git a/test/wild001.test b/test/wild001.test
deleted file mode 100644 (file)
index 7fe1404..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-# 2013-07-01
-#
-# 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 is a test case from content taken "from the wild".  In this
-# particular instance, the query was provided with permission by
-# Elan Feingold on 2013-06-27.  His message on the SQLite mailing list
-# on that date reads:
-#
-#------------------------------------------------------------------------------
-# > Can you send (1) the schema (2) the query that is giving problems, and (3)
-# > the content of the sqlite_stat1 table after you have run ANALYZE?   If you
-# > can combine all of the above into a script, that would be great!
-# >
-# > If you send (1..3) above and you give us written permission to include the
-# > query in our test suite, that would be off-the-chain terrific.
-#
-# Please find items 1..3 in this file: http://www.plexapp.com/elan/sqlite_bug.txt
-# 
-# You have our permission to include the query in your test suite.
-# 
-# Thanks for an amazing product.
-#-----------------------------------------------------------------------------
-#
-# This test case merely creates the schema and populates SQLITE_STAT1 and
-# SQLITE_STAT3 then runs an EXPLAIN QUERY PLAN to ensure that the right plan
-# is discovered.  This test case may need to be adjusted for future revisions
-# of the query planner manage to select a better query plan.  The query plan
-# shown here is known to be very fast with the original data.
-#
-# This test should work the same with and without SQLITE_ENABLE_STAT3
-#
-###############################################################################
-
-set testdir [file dirname $argv0]
-source $testdir/tester.tcl
-
-ifcapable !stat3 {
-  finish_test
-  return
-}
-
-do_execsql_test wild001.01 {
-  CREATE TABLE "items" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "secid" integer, "parent_id" integer, "metadata_type" integer, "guid" varchar(255), "media_item_count" integer, "title" varchar(255), "title_sort" varchar(255) COLLATE NOCASE, "original_title" varchar(255), "studio" varchar(255), "rating" float, "rating_count" integer, "tagline" varchar(255), "summary" text, "trivia" text, "quotes" text, "content_rating" varchar(255), "content_rating_age" integer, "index" integer, "absolute_index" integer, "duration" integer, "user_thumb_url" varchar(255), "user_art_url" varchar(255), "user_banner_url" varchar(255), "user_music_url" varchar(255), "user_fields" varchar(255), "tags_genre" varchar(255), "tags_collection" varchar(255), "tags_director" varchar(255), "tags_writer" varchar(255), "tags_star" varchar(255), "originally_available_at" datetime, "available_at" datetime, "expires_at" datetime, "refreshed_at" datetime, "year" integer, "added_at" datetime, "created_at" datetime, "updated_at" datetime, "deleted_at" datetime, "tags_country" varchar(255), "extra_data" varchar(255), "hash" varchar(255));
-  CREATE INDEX "i_secid" ON "items" ("secid" );
-  CREATE INDEX "i_parent_id" ON "items" ("parent_id" );
-  CREATE INDEX "i_created_at" ON "items" ("created_at" );
-  CREATE INDEX "i_index" ON "items" ("index" );
-  CREATE INDEX "i_title" ON "items" ("title" );
-  CREATE INDEX "i_title_sort" ON "items" ("title_sort" );
-  CREATE INDEX "i_guid" ON "items" ("guid" );
-  CREATE INDEX "i_metadata_type" ON "items" ("metadata_type" );
-  CREATE INDEX "i_deleted_at" ON "items" ("deleted_at" );
-  CREATE INDEX "i_secid_ex1" ON "items" ("secid", "metadata_type", "added_at" );
-  CREATE INDEX "i_hash" ON "items" ("hash" );
-  CREATE TABLE "settings" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "account_id" integer, "guid" varchar(255), "rating" float, "view_offset" integer, "view_count" integer, "last_viewed_at" datetime, "created_at" datetime, "updated_at" datetime);
-  CREATE INDEX "s_account_id" ON "settings" ("account_id" );
-  CREATE INDEX "s_guid" ON "settings" ("guid" );
-  ANALYZE;
-  INSERT INTO sqlite_stat1 VALUES('settings','s_guid','4740 1');
-  INSERT INTO sqlite_stat1 VALUES('settings','s_account_id','4740 4740');
-  INSERT INTO sqlite_stat1 VALUES('items','i_hash','27316 2');
-  INSERT INTO sqlite_stat1 VALUES('items','i_secid_ex1','27316 6829 4553 3');
-  INSERT INTO sqlite_stat1 VALUES('items','i_deleted_at','27316 27316');
-  INSERT INTO sqlite_stat1 VALUES('items','i_metadata_type','27316 6829');
-  INSERT INTO sqlite_stat1 VALUES('items','i_guid','27316 2');
-  INSERT INTO sqlite_stat1 VALUES('items','i_title_sort','27316 2');
-  INSERT INTO sqlite_stat1 VALUES('items','i_title','27316 2');
-  INSERT INTO sqlite_stat1 VALUES('items','i_index','27316 144');
-  INSERT INTO sqlite_stat1 VALUES('items','i_created_at','27316 2');
-  INSERT INTO sqlite_stat1 VALUES('items','i_parent_id','27316 15');
-  INSERT INTO sqlite_stat1 VALUES('items','i_secid','27316 6829');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,150,150,'com.plexapp.agents.thetvdb://153021/2/9?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,198,198,'com.plexapp.agents.thetvdb://194031/1/10?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,526,526,'com.plexapp.agents.thetvdb://71256/12/92?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,923,923,'com.plexapp.agents.thetvdb://71256/15/16?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1008,1008,'com.plexapp.agents.thetvdb://71256/15/93?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1053,1053,'com.plexapp.agents.thetvdb://71256/16/21?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1068,1068,'com.plexapp.agents.thetvdb://71256/16/35?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1235,1235,'com.plexapp.agents.thetvdb://71256/17/44?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1255,1255,'com.plexapp.agents.thetvdb://71256/17/62?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1573,1573,'com.plexapp.agents.thetvdb://71663/20/9?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1580,1580,'com.plexapp.agents.thetvdb://71663/21/16?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2000,2000,'com.plexapp.agents.thetvdb://73141/9/8?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2107,2107,'com.plexapp.agents.thetvdb://73244/6/17?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2256,2256,'com.plexapp.agents.thetvdb://74845/4/7?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2408,2408,'com.plexapp.agents.thetvdb://75978/2/21?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2634,2634,'com.plexapp.agents.thetvdb://79126/1/1?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2962,2962,'com.plexapp.agents.thetvdb://79274/3/94?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3160,3160,'com.plexapp.agents.thetvdb://79274/5/129?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3161,3161,'com.plexapp.agents.thetvdb://79274/5/12?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3688,3688,'com.plexapp.agents.thetvdb://79274/8/62?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3714,3714,'com.plexapp.agents.thetvdb://79274/8/86?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,4002,4002,'com.plexapp.agents.thetvdb://79590/13/17?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,4215,4215,'com.plexapp.agents.thetvdb://80727/3/6?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,4381,4381,'com.plexapp.agents.thetvdb://83462/3/24?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('settings','s_account_id',4740,0,0,1);
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,1879,1879,'1113f632ccd52ec8b8d7ca3d6d56da4701e48018');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,2721,2721,'1936154b97bb5567163edaebc2806830ae419ccf');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,3035,3035,'1c122331d4b7bfa0dc2c003ab5fb4f7152b9987a');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,3393,3393,'1f81bdbc9acc3321dc592b1a109ca075731b549a');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,6071,6070,'393cf7713efb4519c7a3d1d5403f0d945d15a16a');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,7462,7461,'4677dd37011f8bd9ae7fbbdd3af6dcd8a5b4ab2d');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,8435,8434,'4ffa339485334e81a5e12e03a63b6508d76401cf');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,8716,8714,'52a093852e6599dd5004857b7ff5b5b82c7cdb25');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,9107,9104,'561183e39f866d97ec728e9ff16ac4ad01466111');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,10942,10939,'66e99b72e29610f49499ae09ee04a376210d1f08');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,12143,12139,'71f0602427e173dc2c551535f73fdb6885fe4302');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,14962,14958,'8ca8e4dfba696019830c19ab8a32c7ece9d8534b');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,15179,15174,'8ebf1a5cf33f8ada1fc5853ac06ac4d7e074f825');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,15375,15370,'908bc211bebdf21c79d2d2b54ebaa442ac1f5cae');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,18215,18210,'ab29e4e18ec5a14fef95aa713d69e31c045a22c1');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,18615,18610,'ae84c008cc0c338bf4f28d798a88575746452f6d');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,18649,18644,'aec7c901353e115aa5307e94018ba7507bec3a45');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,19517,19512,'b75025fbf2e9c504e3c1197ff1b69250402a31f8');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,21251,21245,'c7d32f0e3a8f3a0a3dbd00833833d2ccee62f0fd');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,23616,23610,'dd5ff61479a9bd4100de802515d9dcf72d46f07a');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,24287,24280,'e3db00034301b7555419d4ef6f64769298d5845e');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,24949,24942,'ea336abd197ecd7013854a25a4f4eb9dea7927c6');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,25574,25567,'f018ea5182ec3f32768ca1c3cefbf3ad160ec20b');
-  INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,26139,26132,'f53709a8d81c12cb0f4f8d58004a25dd063de67c');
-  INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',25167,0,0,2);
-  INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',736,25167,1,3);
-  INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',15,25903,2,4);
-  INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',1398,25918,3,5);
-  INSERT INTO sqlite_stat3 VALUES('items','i_deleted_at',27316,0,0,NULL);
-  INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',2149,0,0,1);
-  INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',411,2149,1,2);
-  INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',1440,2560,2,3);
-  INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',23316,4000,3,4);
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,215,215,'com.plexapp.agents.imdb://tt0065702?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,711,711,'com.plexapp.agents.imdb://tt0198781?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,987,986,'com.plexapp.agents.imdb://tt0454876?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1004,1002,'com.plexapp.agents.imdb://tt0464154?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1056,1053,'com.plexapp.agents.imdb://tt0499549?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1120,1116,'com.plexapp.agents.imdb://tt0903624?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1250,1245,'com.plexapp.agents.imdb://tt1268799?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1270,1264,'com.plexapp.agents.imdb://tt1320261?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1376,1369,'com.plexapp.agents.imdb://tt1772341?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,3035,3027,'com.plexapp.agents.thetvdb://153021/3/14?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,6071,6063,'com.plexapp.agents.thetvdb://71173/1/18?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,6342,6334,'com.plexapp.agents.thetvdb://71256/13/4?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,9107,9099,'com.plexapp.agents.thetvdb://72389/2/19?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,11740,11732,'com.plexapp.agents.thetvdb://73893/2/13?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,12143,12135,'com.plexapp.agents.thetvdb://73976/4/23?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,15179,15171,'com.plexapp.agents.thetvdb://75897/16/12?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,17408,17400,'com.plexapp.agents.thetvdb://76808/2/16?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,17984,17976,'com.plexapp.agents.thetvdb://77068/1/16?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,18215,18207,'com.plexapp.agents.thetvdb://77259/1/1?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,21251,21243,'com.plexapp.agents.thetvdb://78957/8/2?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,24287,24279,'com.plexapp.agents.thetvdb://80337/5/8?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,25513,25505,'com.plexapp.agents.thetvdb://82226/6?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,25548,25540,'com.plexapp.agents.thetvdb://82339/2/10?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,26770,26762,'com.plexapp.agents.thetvdb://86901/1/3?lang=en');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1524,0,0,'');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',2,3034,1391,'Attack of the Giant Squid');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',51,4742,2895,'Brad Sherwood');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',11,4912,2996,'Brian Williams');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',39,5847,3857,'Chip Esten');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,6071,4015,'Chuck Versus the DeLorean');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',12,7625,5436,'Denny Siegel');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',30,8924,6618,'Episode 1');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',29,9015,6629,'Episode 2');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',32,9082,6643,'Episode 3');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',28,9135,6654,'Episode 4');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',26,9183,6665,'Episode 5');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',27,9229,6677,'Episode 6');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',22,9266,6688,'Episode 7');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',20,9298,6699,'Episode 8');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',55,11750,8817,'Greg Proops');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,12143,9120,'Hardware Jungle');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',33,14712,11435,'Kathy Greenwood');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',3,15179,11840,'Last Call');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,18215,14601,'Nature or Nurture?');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',12,18241,14623,'Neil DeGrasse Tyson');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',68,19918,16144,'Pilot');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',7,21251,17298,'Reza Aslan');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,24287,20035,'Technoviking');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',1524,0,0,'');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',1,3035,1429,'Anderson Can''t Dance');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',51,4782,2991,'Brad Sherwood');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',11,4936,3079,'Brian Williams');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',39,5694,3783,'Chip Esten');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',1,6071,4100,'Clive Warren');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',12,7144,5078,'Denny Siegel');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',30,8249,6097,'Episode 1');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',29,8340,6108,'Episode 2');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',32,8407,6122,'Episode 3');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',28,8460,6133,'Episode 4');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',26,8508,6144,'Episode 5');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',27,8554,6156,'Episode 6');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',22,8591,6167,'Episode 7');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',20,8623,6178,'Episode 8');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',1,9107,6537,'Fat Albert and the Cosby Kids');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',55,10539,7843,'Greg Proops');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',1,12143,9276,'Iron Age Remains');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',33,13118,10143,'Kathy Greenwood');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',1,15179,11972,'Mink');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',68,17411,14035,'Pilot');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',2,18214,14727,'Reflections');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',4,21250,17481,'The Apartment');
-  INSERT INTO sqlite_stat3 VALUES('items','i_title',1,24287,20283,'The Simpsons Already Did It');
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',4315,95,2,1);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',1553,4410,3,2);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',1485,5963,4,3);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',1414,7448,5,4);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',1367,8862,6,5);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',1328,10229,7,6);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',1161,11557,8,7);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',1108,12718,9,8);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',1033,13826,10,9);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',1014,14859,11,10);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',929,15873,12,11);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',906,16802,13,12);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',844,17708,14,13);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',690,18552,15,14);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',655,19242,16,15);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',625,19897,17,16);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',579,20522,18,17);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',555,21101,19,18);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',526,21656,20,19);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',501,22182,21,20);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',459,22683,22,21);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',439,23142,23,22);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',315,23581,24,23);
-  INSERT INTO sqlite_stat3 VALUES('items','i_index',192,24177,26,25);
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1851,0,0,NULL);
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',373,1857,2,'2011-10-22 14:54:39');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',595,2230,3,'2011-10-22 14:54:41');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',337,2825,4,'2011-10-22 14:54:43');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',361,3378,8,'2011-10-22 14:54:54');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',160,3739,9,'2011-10-22 14:54:56');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',315,4000,11,'2011-10-22 14:54:59');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',321,4334,13,'2011-10-22 14:55:02');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1292,4723,16,'2011-10-22 14:55:06');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',161,6015,17,'2011-10-22 14:55:07');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1,9107,2677,'2012-09-04 18:07:50');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',313,9717,3270,'2012-10-18 16:50:21');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',450,10030,3271,'2012-10-18 16:50:22');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',389,10668,3275,'2012-10-18 16:50:26');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',796,11057,3276,'2012-10-18 16:51:06');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',161,12041,3280,'2012-10-19 19:52:37');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',135,13281,4186,'2013-02-19 00:56:10');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1063,13416,4187,'2013-02-19 00:56:11');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',797,14479,4188,'2013-02-19 00:56:13');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',147,15276,4189,'2013-02-19 00:56:15');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',346,15423,4190,'2013-02-19 00:56:16');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1,18215,6436,'2013-05-05 14:09:54');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',2,21251,8122,'2013-05-24 15:25:45');
-  INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1,24287,11116,'2013-05-26 14:17:39');
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',2560,0,0,NULL);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',18,3022,31,2350);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',10,6068,285,8150);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',158,6346,315,8949);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',34,9094,562,18831);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',20,12139,794,22838);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',134,14033,886,24739);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',159,14167,887,24740);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,14326,888,24741);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,14487,889,24742);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',124,14648,890,24743);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',157,14772,891,24744);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',126,15043,894,24747);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',40,15169,895,24748);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,15243,898,24753);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',138,15404,899,24754);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',160,15542,900,24755);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,15702,901,24756);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,15863,902,24757);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',124,16024,903,24758);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',155,16148,904,24759);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',26,18208,1043,29704);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',2,21251,1282,32952);
-  INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',13,24279,1583,36068);
-  INSERT INTO sqlite_stat3 VALUES('items','i_secid',25167,0,0,2);
-  INSERT INTO sqlite_stat3 VALUES('items','i_secid',736,25167,1,3);
-  INSERT INTO sqlite_stat3 VALUES('items','i_secid',15,25903,2,4);
-  INSERT INTO sqlite_stat3 VALUES('items','i_secid',1398,25918,3,5);
-  ANALYZE sqlite_master;
-  
-  explain query plan
-  select items.title
-    from items
-         join items as child on child.parent_id=items.id
-         join items as grandchild on grandchild.parent_id=child.id
-         join settings
-                    on settings.guid=grandchild.guid
-                   and settings.account_id=1
-   where items.metadata_type=2
-     and items.secid=2
-     and settings.last_viewed_at is not null
-   group by items.id
-   order by settings.last_viewed_at desc
-   limit 10;
-} [list \
- 0 0 3 {SEARCH TABLE settings USING INDEX s_account_id (account_id=?)} \
- 0 1 2 {SEARCH TABLE items AS grandchild USING INDEX i_guid (guid=?)} \
- 0 2 1 {SEARCH TABLE items AS child USING INTEGER PRIMARY KEY (rowid=?)} \
- 0 3 0 {SEARCH TABLE items USING INTEGER PRIMARY KEY (rowid=?)} \
- 0 0 0 {USE TEMP B-TREE FOR GROUP BY} \
- 0 0 0 {USE TEMP B-TREE FOR ORDER BY}]
-
-
-finish_test
index d732dea124f257e2f4dca787d8e892c23990a1a1..c6889c72ac212da5141b4281a08d06069036d110 100644 (file)
@@ -368,4 +368,3 @@ do_execsql_test 11.4.1 {
 }
 
 finish_test
-
index 754761b78bebaf9eea727288ecd1c28536b149be..cf4d83ae8ed6a0c6485d348f78ed6e2c260f3b78 100644 (file)
@@ -174,4 +174,3 @@ foreach {tn sql} {
 
 
 finish_test
-
index 6c04e87ca468ca7ca915c9d7e3ac0ffcd27ef44f..294b13c77a33b2c1aad88517aec480fb32cf1a93 100644 (file)
@@ -102,11 +102,6 @@ do_execsql_test without_rowid1-1.50 {
   ANALYZE;
   SELECT * FROM sqlite_stat1 ORDER BY idx;
 } {t1 t1 {4 2 1} t1 t1bd {4 2 2}}
-ifcapable stat3 {
-  do_execsql_test without_rowid1-1.51 {
-    SELECT DISTINCT tbl, idx FROM sqlite_stat3 ORDER BY idx;
-  } {t1 t1 t1 t1bd}
-}
 ifcapable stat4 {
   do_execsql_test without_rowid1-1.52 {
     SELECT DISTINCT tbl, idx FROM sqlite_stat4 ORDER BY idx;