]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improvements to EXPLAIN QUERY PLAN formatting. The MULTI-INDEX OR now shows
authordrh <drh@noemail.net>
Mon, 24 Dec 2018 20:21:06 +0000 (20:21 +0000)
committerdrh <drh@noemail.net>
Mon, 24 Dec 2018 20:21:06 +0000 (20:21 +0000)
a separate "INDEX" subtree for each index.  SCALAR SUBQUERY entries provide
a subquery number that is related back to the .selecttrace output.

FossilOrigin-Name: 7153552bac51295c56a1c42ca79d57195851e232509f9e9610375692f48c7e86

17 files changed:
ext/expert/expert1.test
manifest
manifest.uuid
src/expr.c
src/vdbe.h
src/vdbeaux.c
src/wherecode.c
test/autoindex1.test
test/bestindex3.test
test/cost.test
test/eqp.test
test/join5.test
test/tkt-80ba201079.test
test/where7.test
test/where9.test
test/whereI.test
test/with3.test

index 2b4668340d24d3d29f72a5f595803d898990120f..912c074c6025f30ff48f3171e07bacab2eb9b4a9 100644 (file)
@@ -243,8 +243,10 @@ do_setup_rec_test $tn.12.1 {
   CREATE INDEX t7_idx_00000062 ON t7(b);
   CREATE INDEX t7_idx_00000061 ON t7(a);
   MULTI-INDEX OR
-    SEARCH TABLE t7 USING INDEX t7_idx_00000061 (a=?) 
-    SEARCH TABLE t7 USING INDEX t7_idx_00000062 (b=?)
+    INDEX 1
+      SEARCH TABLE t7 USING INDEX t7_idx_00000061 (a=?) 
+    INDEX 2
+      SEARCH TABLE t7 USING INDEX t7_idx_00000062 (b=?)
 }
 
 # rowid terms.
index e80491b3f93dd6ef2e7ab1cf84b8f8e1baa5bcdb..5abdbfbd247f65316cbf0dcd2681e3f634d9d050 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Restore\sa\sline\sof\scode\sthat\swas\spreviously\scommented\sout\sfor\sdebugging.
-D 2018-12-24T14:30:11.325
+C Improvements\sto\sEXPLAIN\sQUERY\sPLAN\sformatting.\s\sThe\sMULTI-INDEX\sOR\snow\sshows\na\sseparate\s"INDEX"\ssubtree\sfor\seach\sindex.\s\sSCALAR\sSUBQUERY\sentries\sprovide\na\ssubquery\snumber\sthat\sis\srelated\sback\sto\sthe\s.selecttrace\soutput.
+D 2018-12-24T20:21:06.021
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6
@@ -46,7 +46,7 @@ F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74
 F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef
 F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3
 F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4
-F ext/expert/expert1.test 333d037021c901322f9afc4a5687648ea23d56f1a0a079358a390664babf01be
+F ext/expert/expert1.test 358e416877a5693fb99d5514f5d88452b5239dc2196b74e0e926718502faef6d
 F ext/expert/sqlite3expert.c 3da865f2286433588260f41e796422c611bceaca3a0bbf9139a619cf7d062c19
 F ext/expert/sqlite3expert.h af6354f8ee5c9e025024e63fec3bd640a802afcc3099a44d804752cf0791d811
 F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72
@@ -462,7 +462,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
 F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9
 F src/delete.c f7938125847e8ef485448db5fbad29acb2991381a02887dd854c1617315ab9fb
-F src/expr.c 7122877f40f506c7ba82fb7d6a8ccedc399f1e133f97292084082ef4cb709926
+F src/expr.c 7e6f3cd438b5023c82c52f45ef3c73d0db576092d26e5927c787a4610c3dd20a
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 012dd7dba1a62fda6b76e633ab303b2232ee2874a685c915065227ab20ad6ae0
 F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f
@@ -582,10 +582,10 @@ F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
 F src/vacuum.c 3ffe64ecfc94b7528c5d7bdb1c3a19d72fec63f2aa846e3b90f8de5dbbddf5aa
 F src/vdbe.c 8d11da49bda1f504927df424923a415043f5825388e02722c4ac4c6eefc87a47
-F src/vdbe.h 8990d668a89890a33326b0a29b992c4014b72f3b6cdcd9ee0e190593c247f9b0
+F src/vdbe.h 55f9ef5d48f6b4b2aa84cba08dab1217400b499e9131d8603289b6ae485bb0d8
 F src/vdbeInt.h 73f5051923f3f29779bfc374c0c68e23b8e5e3792def2e33e51b427edb890abd
 F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4
-F src/vdbeaux.c f00d9b32a250b829a3c00140255a1c37a6463d726bb87ed6bbb80a1ce76a56bd
+F src/vdbeaux.c dfbedc7b39ca2109d9369d21ecaf8c4f8b3b3365c354c6d783ce65d6f9d61aad
 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
 F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9
 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f
@@ -597,7 +597,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
 F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66
 F src/where.c 05877beee56eeed88ea0bdb08a53236a63a2fee293ff3f57b1e679042d434bb4
 F src/whereInt.h f125f29fca80890768e0b2caa14f95db74b2dacd3a122a168f97aa7b64d6968f
-F src/wherecode.c 538ca683d7465648f9ee19064a5c257c4cf135f508cd6405208a969611e69843
+F src/wherecode.c 3e948cbadcb8a3de9935e9cd2d00a9125361aa7c203fb40823a63375e75c0256
 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442
 F src/window.c ea81ecd031ed2cbc14b7db6fd7f4bee2471b894feae5fea0547b15b1e2dd8fb2
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
@@ -654,7 +654,7 @@ F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1
 F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49
 F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec
 F test/autoinc.test 381f494fefa90acd999933829e2934efb6b40906db9d6a39e822e3f7b4c8bf61
-F test/autoindex1.test efdc2ff5d369fa8acc12ca72db93cd4d67bc109b0ee8bfce48824a39965a47bf
+F test/autoindex1.test 96185415f5faacd5b8d7a7f505efddd5abb1f111d58338e9c0b1dc40b87cd3cc
 F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df
 F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e
 F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf
@@ -674,7 +674,7 @@ F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f
 F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c
 F test/bestindex1.test 852170bddbb21daa121fabcc274640ff83d7d8705912e8b5fe7ed2c5a9a9224a
 F test/bestindex2.test 9a0ccd320b6525eec3a706aae6cdab7e1b7b5abca75027e39f39f755e76e5928
-F test/bestindex3.test 001788a114ad96d81d5154fe77c7f1e26e84b3a2b5635ca29e4f96f6decc534e
+F test/bestindex3.test 7622e792ff2da16d262d3cea6ad914591ac4806d57ed128e6c940b7920b47b84
 F test/bestindex4.test 038e3d0789332f3f1d61474f9bbc9c6d08c6bd1783a978f31f38ad82688de601
 F test/bestindex5.test 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9
 F test/bestindex6.test d856a9bb63d927493575823eed44053bc36251e241aa364e54d0f2a2d302e1d4
@@ -752,7 +752,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454
 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b
 F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4
 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4
-F test/cost.test b37db8a10d467a69e71a9f3d40bbb266c2f587742b37c6912f6e3f7185a0e216
+F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34
 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c
 F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf
 F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296
@@ -825,7 +825,7 @@ F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea
 F test/enc2.test 83437a79ba1545a55fb549309175c683fb334473
 F test/enc3.test 6807f7a7740a00361ca8d0ccd66bc60c8dc5f2b6
 F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020
-F test/eqp.test 5e8b1b2d8c45b0102703cece6f3b059435068b2df528b4b6dc489d6cd5afcd66
+F test/eqp.test 84879b63e3110552bf8ce648a3507dc3ceb72109ecec83c2aef0db37a27f6382
 F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9
 F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c
 F test/exclusive.test 1206b87e192497d78c7f35552e86a9d05421498da300fb1cce5ca5351ccde3c3
@@ -1053,7 +1053,7 @@ F test/join.test 2ad9d7fe10e0cc06bc7803c22e5533be11cdadbc592f5f95d789a873b57a5a6
 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417
 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0
 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916
-F test/join5.test 5a2da0c3ea852a7063d3e72fc7d5a04a6de5ef6e6d85092582f69033f7459adc
+F test/join5.test 1df0a9b94f34a6c40c7f708f550dcb1cb80109f0ed774dba5a95915fbfbb6bc9
 F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b
 F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497
 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4
@@ -1402,7 +1402,7 @@ F test/tkt-752e1646fc.test ea78d88d14fe9866bdd991c634483334639e13bf
 F test/tkt-78e04e52ea.test 1b5be1bac961833a9fd70fe50738cb4064822c61f82c54f7d488435ec806ea62
 F test/tkt-7a31705a7e6.test 9e9c057b6a9497c8f7ba7b16871029414ccf6550e7345d9085d6d71c9a56bb6f
 F test/tkt-7bbfb7d442.test 7b2cd79c7a17ae6750e75ec1a7846712a69c9d18
-F test/tkt-80ba201079.test 105a721e6aad0ae3c5946d7615d1e4d03f6145b8
+F test/tkt-80ba201079.test 75d22bbfd118025c9504b025679a6840f7518b2947268ecdce14b7af1b7dd7f3
 F test/tkt-80e031a00f.test 9ee36348b761bf7c14261e002b75a4c0d5a04d4c
 F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c
 F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356
@@ -1639,9 +1639,9 @@ F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcd
 F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8
 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2
 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b
-F test/where7.test e579da972eb3372edc9de850efc221848c763f9e4feafc8426d84a4453b92b23
+F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1
 F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f
-F test/where9.test ad2ddb339d10d324763c3da60502b8631f15a2397b869192fbd4e82f40e167d3
+F test/where9.test 4fb43ad451758d9535693e110d4398fb6a6e3e153dc57bba5e61f884566c725f
 F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4
 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
 F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6
@@ -1650,7 +1650,7 @@ F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f
 F test/whereF.test 3d9412b1199d3e2bed34fcb76b4c48d0bf4df95d27e3f8dd27b6f8b4716d0d89
 F test/whereG.test 0158783235a6dd82fc0e37652b8522b186b9510594ac0a4bff0c4101b4396a52
 F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2
-F test/whereI.test b7769ee8dbefd987fb266715fee887f05f9ff180016b06fca7fa402df739193b
+F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364
 F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a
 F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b
 F test/whereL.test 0a19fc44cd1122040f56c934f1b14d0ca85bde28f270268a428dd9796ea0634c
@@ -1675,7 +1675,7 @@ F test/window6.test 5eae4ae7a590ccf1e605880969ca0bad3955616ac91cad3031baea38748b
 F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b
 F test/with1.test 2465d98ffce80d00553ac7135697c18b0369275b6ecc750daa2af320b8c812ca
 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab
-F test/with3.test 5e8ce2c585170bbbc0544e2a01a4941fa0be173ba5265e5c92eb588cd99a232d
+F test/with3.test 8d26920c88283e0a473ceebd3451554922108ce7b2a6a1157c47eb0a7011212c
 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205
 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64
 F test/without_rowid1.test 533add9100255e4cc430d371b3ecfb79f11f956b86c3a1b9d34413bf8e482d8f
@@ -1792,7 +1792,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 06de44ec9e173992ca9afb89dd2b4e40d2a7e35512c7959603cdceb606f5dfbd
-R 403fbb980b089e81502688b9dd5a105f
+P e53781f5bdf5c7b7d91ffe76565ea2fe5d1b3a9b162b3a88a7017bbe785d4c72
+R d0fd9bbed21fbd142000d4f19c0af44b
 U drh
-Z 334629ebc8107a81830a765325ac5d10
+Z fed7710556b9e8415d41d0c76944e98d
index 735bd59c17ebcd6f2e7e1cc21924f3760e2ec0ea..d89800886fe94a6dddf8ac5f77369f5efa3754d0 100644 (file)
@@ -1 +1 @@
-e53781f5bdf5c7b7d91ffe76565ea2fe5d1b3a9b162b3a88a7017bbe785d4c72
\ No newline at end of file
+7153552bac51295c56a1c42ca79d57195851e232509f9e9610375692f48c7e86
\ No newline at end of file
index 61a3386df88069331a35af56b2233313c6e4a6ec..f0a3a070a6578fc85238558b00bfd24a876f1900 100644 (file)
@@ -2691,10 +2691,15 @@ void sqlite3CodeRhsOfIN(
     ** might not have been invoked yet, so invoke it now as a subroutine. 
     */
     if( ExprHasProperty(pExpr, EP_Subrtn) ){
-      sqlite3VdbeAddOp2(v, OP_Once, 0, sqlite3VdbeCurrentAddr(v)+3);
+      int addr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
+      if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+        ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d",
+              pExpr->x.pSelect->selId));
+      }
       sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn,
                         pExpr->y.sub.iAddr);
       sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable);
+      sqlite3VdbeJumpHere(v, addr);
       return;
     }
 
@@ -2746,7 +2751,7 @@ void sqlite3CodeRhsOfIN(
     if( ALWAYS(pEList->nExpr==nVal) ){
       SelectDest dest;
       int i;
-      sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable);
+      sqlite3SelectDestInit(&dest, SRT_Set, iTab);
       dest.zAffSdst = exprINAffinity(pParse, pExpr);
       pSelect->iLimit = 0;
       testcase( pSelect->selFlags & SF_Distinct );
@@ -2810,17 +2815,17 @@ void sqlite3CodeRhsOfIN(
 
       /* Evaluate the expression and insert it into the temp table */
       if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){
-        sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns);
+        sqlite3VdbeAddOp3(v, OP_InsertInt, iTab, r2, iValToIns);
       }else{
         r3 = sqlite3ExprCodeTarget(pParse, pE2, r1);
         if( isRowid ){
           sqlite3VdbeAddOp2(v, OP_MustBeInt, r3,
                             sqlite3VdbeCurrentAddr(v)+2);
           VdbeCoverage(v);
-          sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3);
+          sqlite3VdbeAddOp3(v, OP_Insert, iTab, r2, r3);
         }else{
           sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1);
-          sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pExpr->iTable, r2, r3, 1);
+          sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1);
         }
       }
     }
@@ -2864,6 +2869,11 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
 
   Vdbe *v = pParse->pVdbe;
   assert( v!=0 );
+  testcase( pExpr->op==TK_EXISTS );
+  testcase( pExpr->op==TK_SELECT );
+  assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT );
+  assert( ExprHasProperty(pExpr, EP_xIsSelect) );
+  pSel = pExpr->x.pSelect;
 
   /* The evaluation of the EXISTS/SELECT must be repeated every time it
   ** is encountered if any of the following is true:
@@ -2879,6 +2889,7 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
     /* If this routine has already been coded, then invoke it as a
     ** subroutine. */
     if( ExprHasProperty(pExpr, EP_Subrtn) ){
+      ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId));
       sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn,
                         pExpr->y.sub.iAddr);
       return pExpr->iTable;
@@ -2904,14 +2915,8 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
   ** In both cases, the query is augmented with "LIMIT 1".  Any 
   ** preexisting limit is discarded in place of the new LIMIT 1.
   */
-  testcase( pExpr->op==TK_EXISTS );
-  testcase( pExpr->op==TK_SELECT );
-  assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT );
-  assert( ExprHasProperty(pExpr, EP_xIsSelect) );
-
-  pSel = pExpr->x.pSelect;
-  ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY",
-        addrOnce?"":"CORRELATED "));
+  ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY %d",
+        addrOnce?"":"CORRELATED ", pSel->selId));
   nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1;
   sqlite3SelectDestInit(&dest, 0, pParse->nMem+1);
   pParse->nMem += nReg;
index f4d360e49ec7666a0e3534f5a1f70443c07bfa66..99c9c7fb91c622ef62fa954a96a0899435b7d0a5 100644 (file)
@@ -208,6 +208,7 @@ VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno);
   void sqlite3VdbeExplain(Parse*,u8,const char*,...);
   void sqlite3VdbeExplainPop(Parse*);
   int sqlite3VdbeExplainParent(Parse*);
+  void sqlite3ExplainBreakpoint(const char*,const char*);
 # define ExplainQueryPlan(P)        sqlite3VdbeExplain P
 # define ExplainQueryPlanPop(P)     sqlite3VdbeExplainPop(P)
 # define ExplainQueryPlanParent(P)  sqlite3VdbeExplainParent(P)
@@ -215,6 +216,12 @@ VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno);
 # define ExplainQueryPlan(P)
 # define ExplainQueryPlanPop(P)
 # define ExplainQueryPlanParent(P) 0
+# define sqlite3ExplainBreakpoint(A,B) /*no-op*/
+#endif
+#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_EXPLAIN)
+  void sqlite3ExplainBreakpoint(const char*,const char*);
+#else
+# define sqlite3ExplainBreakpoint(A,B) /*no-op*/
 #endif
 void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*);
 void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8);
index 5225cbc73f7464c9a6ecc6576706d3d162aa6743..286d4e92bf69ddcda304ec069d3a8d4c8ad30b24 100644 (file)
@@ -350,13 +350,27 @@ int sqlite3VdbeExplainParent(Parse *pParse){
 }
 
 /*
-** Add a new OP_Explain opcode.
+** Set a debugger breakpoint on the following routine in order to
+** monitor the EXPLAIN QUERY PLAN code generation.
+*/
+#if defined(SQLITE_DEBUG)
+void sqlite3ExplainBreakpoint(const char *z1, const char *z2){
+  (void)z1;
+  (void)z2;
+}
+#endif
+
+/*
+** Add a new OP_ opcode.
 **
 ** If the bPush flag is true, then make this opcode the parent for
 ** subsequent Explains until sqlite3VdbeExplainPop() is called.
 */
 void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){
-  if( pParse->explain==2 ){
+#if !defined(SQLITE_DEBUG)
+  if( pParse->explain==2 )
+#endif
+  {
     char *zMsg;
     Vdbe *v;
     va_list ap;
@@ -368,7 +382,10 @@ void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){
     iThis = v->nOp;
     sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0,
                       zMsg, P4_DYNAMIC);
-    if( bPush) pParse->addrExplain = iThis;
+    sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetOp(v,-1)->p4.z);
+    if( bPush){
+      pParse->addrExplain = iThis;
+    }
   }
 }
 
@@ -376,6 +393,7 @@ void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){
 ** Pop the EXPLAIN QUERY PLAN stack one level.
 */
 void sqlite3VdbeExplainPop(Parse *pParse){
+  sqlite3ExplainBreakpoint("POP", 0);
   pParse->addrExplain = sqlite3VdbeExplainParent(pParse);
 }
 #endif /* SQLITE_OMIT_EXPLAIN */
index d238efdc8255d287653b670b0fd335f6d65e4f38..f7cfc4318882a0b937b4fb375b6d52e6a2cf5f07 100644 (file)
@@ -213,6 +213,7 @@ int sqlite3WhereExplainOneScan(
     }
 #endif
     zMsg = sqlite3StrAccumFinish(&str);
+    sqlite3ExplainBreakpoint("",zMsg);
     ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v),
                             pParse->addrExplain, 0, zMsg,P4_DYNAMIC);
   }
@@ -1951,6 +1952,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
           pOrExpr = pAndExpr;
         }
         /* Loop through table entries that match term pOrTerm. */
+        ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1));
         WHERETRACE(0xffff, ("Subplan for OR-clause:\n"));
         pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0,
                                       wctrlFlags, iCovCur);
@@ -2054,6 +2056,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
 
           /* Finish the loop through table entries that match term pOrTerm. */
           sqlite3WhereEnd(pSubWInfo);
+          ExplainQueryPlanPop(pParse);
         }
       }
     }
index 19306c23c982fb1a7dcfab41d74d8bdf0de27852..b08f8cfeb67513cc697d9a612b8c66cce68c799a 100644 (file)
@@ -280,7 +280,7 @@ do_eqp_test autoindex1-600a {
   |--MATERIALIZE xxxxxx
   |  |--SCAN TABLE sheep AS s
   |  |--SEARCH TABLE flock_owner AS prev USING INDEX sqlite_autoindex_flock_owner_1 (flock_no=? AND owner_change_date<?)
-  |  `--CORRELATED SCALAR SUBQUERY
+  |  `--CORRELATED SCALAR SUBQUERY xxxxxx
   |     `--SEARCH TABLE flock_owner AS later USING COVERING INDEX sqlite_autoindex_flock_owner_1 (flock_no=? AND owner_change_date>? AND owner_change_date<?)
   |--SCAN TABLE sheep AS x USING INDEX sheep_reg_flock_index
   `--SEARCH SUBQUERY xxxxxx AS y USING AUTOMATIC COVERING INDEX (sheep_no=?)
index 4b125d4df09e1c2b23fdef93b38e5babd378483b..80038e285545b99d33e2177855d4e6139f59e4a3 100644 (file)
@@ -90,8 +90,10 @@ do_eqp_test 1.3 {
 } {
   QUERY PLAN
   `--MULTI-INDEX OR
-     |--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a EQ ?
-     `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ?
+     |--INDEX 1
+     |  `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a EQ ?
+     `--INDEX 2
+        `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ?
 }
 
 do_eqp_test 1.4 {
@@ -99,8 +101,10 @@ do_eqp_test 1.4 {
 } {
   QUERY PLAN
   `--MULTI-INDEX OR
-     |--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a LIKE ?
-     `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ?
+     |--INDEX 1
+     |  `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:a LIKE ?
+     `--INDEX 2
+        `--SCAN TABLE t1 VIRTUAL TABLE INDEX 0:b EQ ?
 }
 
 do_execsql_test 1.5 {
@@ -150,8 +154,10 @@ ifcapable !icu {
   } [string map {"\n  " \n} {
     QUERY PLAN
     `--MULTI-INDEX OR
-       |--SEARCH TABLE t2 USING INDEX t2x (x>? AND x<?)
-       `--SEARCH TABLE t2 USING INDEX t2y (y=?)
+       |--INDEX 1
+       |  `--SEARCH TABLE t2 USING INDEX t2x (x>? AND x<?)
+       `--INDEX 2
+          `--SEARCH TABLE t2 USING INDEX t2y (y=?)
   }]
 }
 
index 5d23e0ed7bcfb357f763301ca422a30bcf44e5df..2922a0a054dd1da2746eb1b638e5eb76d9783919 100644 (file)
@@ -58,9 +58,12 @@ do_eqp_test 3.2 {
 } {
   QUERY PLAN
   |--MULTI-INDEX OR
-  |  |--SEARCH TABLE t5 USING INDEX t5b (b=?)
-  |  |--SEARCH TABLE t5 USING INDEX t5c (c=?)
-  |  `--SEARCH TABLE t5 USING INDEX t5d (d=?)
+  |  |--INDEX 1
+  |  |  `--SEARCH TABLE t5 USING INDEX t5b (b=?)
+  |  |--INDEX 2
+  |  |  `--SEARCH TABLE t5 USING INDEX t5c (c=?)
+  |  `--INDEX 3
+  |     `--SEARCH TABLE t5 USING INDEX t5d (d=?)
   `--USE TEMP B-TREE FOR ORDER BY
 }
 
@@ -124,8 +127,10 @@ do_eqp_test 6.2 {
 } {
   QUERY PLAN
   |--MULTI-INDEX OR
-  |  |--SEARCH TABLE t3 USING INDEX t3i1 (b>? AND b<?)
-  |  `--SEARCH TABLE t3 USING INDEX t3i2 (c=?)
+  |  |--INDEX 1
+  |  |  `--SEARCH TABLE t3 USING INDEX t3i1 (b>? AND b<?)
+  |  `--INDEX 2
+  |     `--SEARCH TABLE t3 USING INDEX t3i2 (c=?)
   `--USE TEMP B-TREE FOR ORDER BY
 }
 
@@ -149,8 +154,10 @@ do_eqp_test 7.2 {
 } {
   QUERY PLAN
   |--MULTI-INDEX OR
-  |  |--SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?)
-  |  `--SEARCH TABLE t1 USING INDEX t1b (b=?)
+  |  |--INDEX 1
+  |  |  `--SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?)
+  |  `--INDEX 2
+  |     `--SEARCH TABLE t1 USING INDEX t1b (b=?)
   `--USE TEMP B-TREE FOR ORDER BY
 }
 
index 4bcccbdc7974f0de751aa1c8743154c8998f923f..f931f8f340d58dc0383f765f0a175909487acf1c 100644 (file)
@@ -45,8 +45,10 @@ do_eqp_test 1.2 {
 } {
   QUERY PLAN
   |--MULTI-INDEX OR
-  |  |--SEARCH TABLE t1 USING INDEX i1 (a=?)
-  |  `--SEARCH TABLE t1 USING INDEX i2 (b=?)
+  |  |--INDEX 1
+  |  |  `--SEARCH TABLE t1 USING INDEX i1 (a=?)
+  |  `--INDEX 2
+  |     `--SEARCH TABLE t1 USING INDEX i2 (b=?)
   `--SCAN TABLE t2
 }
 do_eqp_test 1.3 {
@@ -55,8 +57,10 @@ do_eqp_test 1.3 {
   QUERY PLAN
   |--SCAN TABLE t2
   `--MULTI-INDEX OR
-     |--SEARCH TABLE t1 USING INDEX i1 (a=?)
-     `--SEARCH TABLE t1 USING INDEX i2 (b=?)
+     |--INDEX 1
+     |  `--SEARCH TABLE t1 USING INDEX i1 (a=?)
+     `--INDEX 2
+        `--SEARCH TABLE t1 USING INDEX i2 (b=?)
 }
 do_eqp_test 1.3 {
   SELECT a FROM t1 ORDER BY a
@@ -225,7 +229,7 @@ do_eqp_test 3.1.1 {
 } {
   QUERY PLAN
   |--SCAN TABLE t1
-  `--SCALAR SUBQUERY
+  `--SCALAR SUBQUERY xxxxxx
      `--SCAN TABLE t1 AS sub
 }
 do_eqp_test 3.1.2 {
@@ -233,7 +237,7 @@ do_eqp_test 3.1.2 {
 } {
   QUERY PLAN
   |--SCAN TABLE t1
-  `--SCALAR SUBQUERY
+  `--SCALAR SUBQUERY xxxxxx
      `--SCAN TABLE t1 AS sub
 }
 do_eqp_test 3.1.3 {
@@ -241,7 +245,7 @@ do_eqp_test 3.1.3 {
 } {
   QUERY PLAN
   |--SCAN TABLE t1
-  `--SCALAR SUBQUERY
+  `--SCALAR SUBQUERY xxxxxx
      |--SCAN TABLE t1 AS sub
      `--USE TEMP B-TREE FOR ORDER BY
 }
@@ -250,7 +254,7 @@ do_eqp_test 3.1.4 {
 } {
   QUERY PLAN
   |--SCAN TABLE t1
-  `--SCALAR SUBQUERY
+  `--SCALAR SUBQUERY xxxxxx
      `--SCAN TABLE t2 USING COVERING INDEX t2i1
 }
 
@@ -302,7 +306,7 @@ det 3.3.3 {
 } {
   QUERY PLAN
   |--SCAN TABLE t1
-  `--CORRELATED SCALAR SUBQUERY
+  `--CORRELATED SCALAR SUBQUERY xxxxxx
      `--SCAN TABLE t2
 }
 
@@ -813,7 +817,7 @@ do_eqp_test 9.1 {
   |--MATERIALIZE xxxxxx
   |  |--SCAN TABLE forumpost AS x USING INDEX forumthread
   |  |--USING ROWID SEARCH ON TABLE private FOR IN-OPERATOR
-  |  |--CORRELATED SCALAR SUBQUERY
+  |  |--CORRELATED SCALAR SUBQUERY xxxxxx
   |  |  |--SEARCH TABLE forumpost USING COVERING INDEX forumthread (froot=?)
   |  |  `--USING ROWID SEARCH ON TABLE private FOR IN-OPERATOR
   |  `--USE TEMP B-TREE FOR ORDER BY
index 2df66e7cf14abd23ab9d3157369a516f3ed1ba7c..31280c5d176dd56ea43802988011b5f4ae13046d 100644 (file)
@@ -267,8 +267,10 @@ do_eqp_test 7.2 {
   QUERY PLAN
   |--SCAN TABLE t1
   `--MULTI-INDEX OR
-     |--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?)
-     `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?)
+     |--INDEX 1
+     |  `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?)
+     `--INDEX 2
+        `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?)
 }
 
 do_execsql_test 7.3 {
index ea0799b5683c12275bf2484f8acb5349a29cbd00..b6cc85f34848b60fe633745769802e979d1553cb 100644 (file)
@@ -110,6 +110,8 @@ do_test tkt-80ba2-200 {
 } {300 object_change 2048}
 do_test tkt-80ba2-201 {
   db eval {
+PRAGMA vdbe_debug=on;
+PRAGMA vdbe_addoptrace=on;
     CREATE INDEX timeline_entry_id_idx on timeline(entry_id);
     SELECT entry_type,
            entry_types.name,
index 5abd0a8bc6bd1ce3feab0c2873beca738069e59c..81111a9de4a209116e81a7359c8e35efaf88c8a0 100644 (file)
@@ -23353,8 +23353,10 @@ do_eqp_test where7-3.2 {
 } {
   QUERY PLAN
   |--MULTI-INDEX OR
-  |  |--SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?)
-  |  `--SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?)
+  |  |--INDEX 1
+  |  |  `--SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?)
+  |  `--INDEX 2
+  |     `--SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?)
   |--SEARCH TABLE t302 USING INDEX t302_c8_c3 (c8=? AND c3>?)
   `--USE TEMP B-TREE FOR ORDER BY
 }
index 87f5c1561527306f4f596993ab4edf1cc461b8ed..7a019d3170e4978dc7cdd46baf68575bcee5777e 100644 (file)
@@ -364,8 +364,10 @@ ifcapable explain {
     QUERY PLAN
     |--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?)
     `--MULTI-INDEX OR
-       |--SEARCH TABLE t2 USING INDEX t2d (d=?)
-       `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)
+       |--INDEX 1
+       |  `--SEARCH TABLE t2 USING INDEX t2d (d=?)
+       `--INDEX 3
+          `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)
   }]
   do_eqp_test where9-3.2 {
     SELECT coalesce(t2.a,9999)
@@ -375,8 +377,10 @@ ifcapable explain {
     QUERY PLAN
     |--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?)
     `--MULTI-INDEX OR
-       |--SEARCH TABLE t2 USING INDEX t2d (d=?)
-       `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)
+       |--INDEX 1
+       |  `--SEARCH TABLE t2 USING INDEX t2d (d=?)
+       `--INDEX 2
+          `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?)
   }]
 } 
 
@@ -456,8 +460,10 @@ do_eqp_test where9-5.1 {
 } {
   QUERY PLAN
   `--MULTI-INDEX OR
-     |--SEARCH TABLE t1 USING INDEX t1c (c=?)
-     `--SEARCH TABLE t1 USING INDEX t1d (d=?)
+     |--INDEX 1
+     |  `--SEARCH TABLE t1 USING INDEX t1c (c=?)
+     `--INDEX 2
+        `--SEARCH TABLE t1 USING INDEX t1d (d=?)
 }
 
 # In contrast, b=1000 is preferred over any OR-clause.
index d08e62c376d4192cc92a7dc17f84b2382ad01156..7bb4ba39ded28971eb1b2f308969ddeca4486dfe 100644 (file)
@@ -31,8 +31,10 @@ do_eqp_test 1.1 {
 } {
   QUERY PLAN
   `--MULTI-INDEX OR
-     |--SEARCH TABLE t1 USING INDEX i1 (b=?)
-     `--SEARCH TABLE t1 USING INDEX i2 (c=?)
+     |--INDEX 1
+     |  `--SEARCH TABLE t1 USING INDEX i1 (b=?)
+     `--INDEX 2
+        `--SEARCH TABLE t1 USING INDEX i2 (c=?)
 }
 
 do_execsql_test 1.2 {
@@ -61,8 +63,10 @@ do_eqp_test 2.1 {
 } {
   QUERY PLAN
   `--MULTI-INDEX OR
-     |--SEARCH TABLE t2 USING INDEX i3 (b=?)
-     `--SEARCH TABLE t2 USING INDEX i4 (c=?)
+     |--INDEX 1
+     |  `--SEARCH TABLE t2 USING INDEX i3 (b=?)
+     `--INDEX 2
+        `--SEARCH TABLE t2 USING INDEX i4 (c=?)
 }
 
 do_execsql_test 2.2 {
index de150b1fc1dd2affca26408af832bb5219f3312d..0f49f0685903b49854a1ba44c5c21d530f0d0e9a 100644 (file)
@@ -120,7 +120,7 @@ do_eqp_test 3.2.2 {
   |--MATERIALIZE xxxxxx
   |  |--SETUP
   |  |  |--SCAN CONSTANT ROW
-  |  |  `--SCALAR SUBQUERY
+  |  |  `--SCALAR SUBQUERY xxxxxx
   |  |     `--SCAN TABLE w2
   |  `--RECURSIVE STEP
   |     |--SCAN TABLE w1