From: dan Date: Fri, 23 May 2014 17:17:06 +0000 (+0000) Subject: Changes to the output of EXPLAIN QUERY PLAN to make it clearer when a query uses... X-Git-Tag: version-3.8.5~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e96f2df3dd544f416071dd400636586ae07c0456;p=thirdparty%2Fsqlite.git Changes to the output of EXPLAIN QUERY PLAN to make it clearer when a query uses the PRIMARY KEY index of a WITHOUT ROWID table. FossilOrigin-Name: 9268df305b90ac11e44b3107bbab5becf38860b7 --- diff --git a/manifest b/manifest index 425e9a2645..c7efb2f184 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index d3ddb95325..b899a71935 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b5cde57166fd874d00dec23d3a59bf3a23979fc5 \ No newline at end of file +9268df305b90ac11e44b3107bbab5becf38860b7 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 5fff010f34..b3939ba643 100644 --- a/src/select.c +++ b/src/select.c @@ -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 diff --git a/src/where.c b/src/where.c index 2daa9f1536..b9385a5ecd 100644 --- a/src/where.c +++ b/src/where.c @@ -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); diff --git a/test/eqp.test b/test/eqp.test index 9e2e9505cc..046088c9c5 100644 --- a/test/eqp.test +++ b/test/eqp.test @@ -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 diff --git a/test/skipscan1.test b/test/skipscan1.test index 81cbc1dbc5..8150b012f6 100644 --- a/test/skipscan1.test +++ b/test/skipscan1.test @@ -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; diff --git a/test/skipscan2.test b/test/skipscan2.test index def559d607..a42ff2d057 100644 --- a/test/skipscan2.test +++ b/test/skipscan2.test @@ -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