]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Changes to the output of EXPLAIN QUERY PLAN to make it clearer when a query uses...
authordan <dan@noemail.net>
Fri, 23 May 2014 17:17:06 +0000 (17:17 +0000)
committerdan <dan@noemail.net>
Fri, 23 May 2014 17:17:06 +0000 (17:17 +0000)
FossilOrigin-Name: 9268df305b90ac11e44b3107bbab5becf38860b7

manifest
manifest.uuid
src/select.c
src/where.c
test/eqp.test
test/skipscan1.test
test/skipscan2.test

index 425e9a264588cc5625e89260535ce80444297241..c7efb2f1845f1acc4918bc9b66232409b2366ed6 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C In\sthe\scommand-line\sshell,\sif\sthree\sor\smore\sinterrupt\ssignals\s(control-c)\nare\sreceived\sin\sa\srow\swithout\sa\sresponse\sfrom\ssqlite3_interrupt()\sthen\ncall\sexit(1)\simmediately.\s\sThis\sallows\scontrol-C\sto\sinterrupt\sthe\sshell\neven\sif\sit\sis\sstuck\sin\sa\scomputation\sor\sloop\sthat\sdoes\snot\sinvolve\sthe\nVDBE.
-D 2014-05-23T12:03:47.471
+C Changes\sto\sthe\soutput\sof\sEXPLAIN\sQUERY\sPLAN\sto\smake\sit\sclearer\swhen\sa\squery\suses\sthe\sPRIMARY\sKEY\sindex\sof\sa\sWITHOUT\sROWID\stable.
+D 2014-05-23T17:17:06.736
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in dd2b1aba364ff9b05de41086f74407f285c57670
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -220,7 +220,7 @@ F src/printf.c e5a0005f8b3de21f85da6a709d2fbee76775bf4b
 F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece
 F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66
 F src/rowset.c a9c9aae3234b44a6d7c6f5a3cadf90dce1e627be
-F src/select.c 089c4d46f067a5cccae93524c6377f981ba99bd9
+F src/select.c a6e8fe35d2929911448fe29fc9194eec73c6c0a5
 F src/shell.c 86a6aa8417c50f61b9f7da8c8733a2606d07a313
 F src/sqlite.h.in 564fc23db33870b5096b20d72df7491ce0b8b74f
 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
@@ -294,7 +294,7 @@ F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
 F src/wal.c 76e7fc6de229bea8b30bb2539110f03a494dc3a8
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c 11edb74d587bc87b33ca96a5173e3ec1b8389e45
-F src/where.c fd4b525cd5ab652cea2fbc71ac15c975271ca461
+F src/where.c 9d351a5ecefdcc104d0bb7d9b5631dce4d60757c
 F src/whereInt.h 6804c2e5010378568c2bb1350477537755296a46
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@@ -456,7 +456,7 @@ F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea
 F test/enc2.test 83437a79ba1545a55fb549309175c683fb334473
 F test/enc3.test 90683ad0e6ea587b9d5542ca93568af9a9858c40
 F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020
-F test/eqp.test 90b56d03a93a2e7bb90f88be6083a8ea53f11a0e
+F test/eqp.test 85873fa5816c48915c82c4e74cb5c35a5b48160f
 F test/errmsg.test f31592a594b44ee121371d25ddd5d63497bb3401
 F test/eval.test bc269c365ba877554948441e91ad5373f9f91be3
 F test/exclusive.test c7ebbc756eacf544c108b15eed64d7d4e5f86b75
@@ -822,8 +822,8 @@ F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5
 F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868
 F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329
-F test/skipscan1.test bed8cbe9d554c8c27afb6c88500f704c86a9196f
-F test/skipscan2.test 03206134fd1e3aac391e578ba2ee531b25d33877
+F test/skipscan1.test 28c7faa41a0d7265040ecb0a0abd90c0904270b2
+F test/skipscan2.test d1d1450952b7275f0b0a3a981f0230532743951a
 F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f
 F test/softheap1.test 40562fe6cac6d9827b7b42b86d45aedf12c15e24
 F test/sort.test 0e4456e729e5a92a625907c63dcdedfbe72c5dc5
@@ -1172,7 +1172,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 9a2dd18776cc7003752980be0a0920a8799e5f35
-R 89228faedfb11c58ca8a5f2f2fdd1632
-U drh
-Z 5594636828b263886b55cc678f3ac12f
+P b5cde57166fd874d00dec23d3a59bf3a23979fc5
+R 95b58110418b282213fae9a9ae120c97
+U dan
+Z 904df162d630dffcdb8ed4cc227020da
index d3ddb95325fdc2621de0328b8a7b65cedda7eb1d..b899a7193547e95b673f9d525ae8f33544447bc2 100644 (file)
@@ -1 +1 @@
-b5cde57166fd874d00dec23d3a59bf3a23979fc5
\ No newline at end of file
+9268df305b90ac11e44b3107bbab5becf38860b7
\ No newline at end of file
index 5fff010f34c01c15fe6c6d750d3e01cce68834a2..b3939ba643730d9505b9ba565bdcec76c0f4ac17 100644 (file)
@@ -4498,10 +4498,11 @@ static void explainSimpleCount(
   Index *pIdx                     /* Index used to optimize scan, or NULL */
 ){
   if( pParse->explain==2 ){
+    int bCover = (pIdx!=0 && (HasRowid(pTab) || pIdx->autoIndex!=2));
     char *zEqp = sqlite3MPrintf(pParse->db, "SCAN TABLE %s%s%s",
-        pTab->zName, 
-        pIdx ? " USING COVERING INDEX " : "",
-        pIdx ? pIdx->zName : ""
+        pTab->zName,
+        bCover ? " USING COVERING INDEX " : "",
+        bCover ? pIdx->zName : ""
     );
     sqlite3VdbeAddOp4(
         pParse->pVdbe, OP_Explain, pParse->iSelectId, 0, 0, zEqp, P4_DYNAMIC
index 2daa9f1536b607e4ead34dbc924a249d114928ff..b9385a5ecd74600815a26a99a6fdf448838d896f 100644 (file)
@@ -2718,13 +2718,20 @@ static void explainOneScan(
     if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0
      && ALWAYS(pLoop->u.btree.pIndex!=0)
     ){
+      const char *zFmt;
+      Index *pIdx = pLoop->u.btree.pIndex;
       char *zWhere = explainIndexRange(db, pLoop, pItem->pTab);
-      zMsg = sqlite3MAppendf(db, zMsg,
-               ((flags & WHERE_AUTO_INDEX) ? 
-                   "%s USING AUTOMATIC %sINDEX%.0s%s" :
-                   "%s USING %sINDEX %s%s"), 
-               zMsg, ((flags & WHERE_IDX_ONLY) ? "COVERING " : ""),
-               pLoop->u.btree.pIndex->zName, zWhere);
+      assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) );
+      if( !HasRowid(pItem->pTab) && pIdx->autoIndex==2 ){
+        zFmt = zWhere ? "%s USING PRIMARY KEY%.0s%s" : "%s%.0s%s";
+      }else if( flags & WHERE_AUTO_INDEX ){
+        zFmt = "%s USING AUTOMATIC COVERING INDEX%.0s%s";
+      }else if( flags & WHERE_IDX_ONLY ){
+        zFmt = "%s USING COVERING INDEX %s%s";
+      }else{
+        zFmt = "%s USING INDEX %s%s";
+      }
+      zMsg = sqlite3MAppendf(db, zMsg, zFmt, zMsg, pIdx->zName, zWhere);
       sqlite3DbFree(db, zWhere);
     }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){
       zMsg = sqlite3MAppendf(db, zMsg, "%s USING INTEGER PRIMARY KEY", zMsg);
index 9e2e9505cc15f448f62ebaf5adc62eb0f28e83f7..046088c9c57dc6615f3a14a207997b21a9b1ec59 100644 (file)
@@ -598,5 +598,49 @@ det 7.5 "SELECT count(*) FROM t2" {
   0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1}
 }
 
+#-------------------------------------------------------------------------
+# The following tests - eqp-8.* - test that queries that use the OP_Count
+# optimization return something sensible with EQP.
+#
+drop_all_tables
+
+do_execsql_test 8.0 {
+  CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID;
+  CREATE TABLE t2(a, b, c);
+}
+
+det 8.1.1 "SELECT * FROM t2" {
+  0 0 0 {SCAN TABLE t2}
+}
+
+det 8.1.2 "SELECT * FROM t2 WHERE rowid=?" {
+  0 0 0 {SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?)}
+}
+
+det 8.1.3 "SELECT count(*) FROM t2" {
+  0 0 0 {SCAN TABLE t2}
+}
+
+det 8.2.1 "SELECT * FROM t1" {
+  0 0 0 {SCAN TABLE t1}
+}
+
+det 8.2.2 "SELECT * FROM t1 WHERE b=?" {
+  0 0 0 {SEARCH TABLE t1 USING PRIMARY KEY (b=?)}
+}
+
+det 8.2.3 "SELECT * FROM t1 WHERE b=? AND c=?" {
+  0 0 0 {SEARCH TABLE t1 USING PRIMARY KEY (b=? AND c=?)}
+}
+
+det 8.2.4 "SELECT count(*) FROM t1" {
+  0 0 0 {SCAN TABLE t1}
+}
+
+
+
+
+
+
 
 finish_test
index 81cbc1dbc5701600385c9e4dcf7ff92d5ebcc586..8150b012f6d4e2ec9d62df787a8dafb65dfdf148 100644 (file)
@@ -181,7 +181,7 @@ do_execsql_test skipscan1-3.2 {
 do_execsql_test skipscan1-3.2eqp {
   EXPLAIN QUERY PLAN
   SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a;
-} {/* INDEX sqlite_autoindex_t3_1 (ANY(a) AND b=?)*/}
+} {/* PRIMARY KEY (ANY(a) AND b=?)*/}
 do_execsql_test skipscan1-3.2sort {
   EXPLAIN QUERY PLAN
   SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a;
index def559d607ce8633ad88fb165f59fe4971c3fc87..a42ff2d0578de69155c38a3a36c25a8d703d64a9 100644 (file)
@@ -199,7 +199,7 @@ do_test skipscan2-3.2 {
 } {}
 do_eqp_test skipscan2-3.3eqp {
   SELECT * FROM t3 WHERE b=42;
-} {0 0 0 {SEARCH TABLE t3 USING COVERING INDEX sqlite_autoindex_t3_1 (ANY(a) AND b=?)}}
+} {0 0 0 {SEARCH TABLE t3 USING PRIMARY KEY (ANY(a) AND b=?)}}
 
 
 finish_test