]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not use virtual (and hence redundant) WHERE-clause terms to restrict the
authordrh <drh@noemail.net>
Sat, 25 Oct 2014 12:28:25 +0000 (12:28 +0000)
committerdrh <drh@noemail.net>
Sat, 25 Oct 2014 12:28:25 +0000 (12:28 +0000)
content of a automatic partial index.  Show when an automatic partial index
is used in the EXPLAIN QUERY PLAN output.

FossilOrigin-Name: b9ad601eab1d7298d369267eb697c7fa1bc16985

ext/rtree/rtree6.test
manifest
manifest.uuid
src/where.c
src/whereInt.h

index cec3a8da410aae8ea453e195f62a18f6b1a968b3..c9c87e8ad917f80adf53a2e745bc90d344d68e44 100644 (file)
@@ -102,7 +102,7 @@ do_eqp_test rtree6.2.4.2 {
   SELECT * FROM t1,t2 WHERE v=10 and x1<10 and x2>10
 } {
   0 0 0 {SCAN TABLE t1 VIRTUAL TABLE INDEX 2:C0E1} 
-  0 1 1 {SEARCH TABLE t2 USING AUTOMATIC COVERING INDEX (v=?)}
+  0 1 1 {SEARCH TABLE t2 USING AUTOMATIC PARTIAL COVERING INDEX (v=?)}
 }
 
 do_eqp_test rtree6.2.5 {
index e831ecb5262fff5eeb2cb4cd15094ba5db30569a..28fa8e138703e0c79c087bf6ee125cab065ded3f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sthe\sautomatic\sindex\slogic\sso\sthat\sit\screates\sa\spartial\sindex\swhen\ndoing\sso\sgives\sthe\ssame\sanswer\sfor\sless\swork.
-D 2014-10-24T19:28:09.216
+C Do\snot\suse\svirtual\s(and\shence\sredundant)\sWHERE-clause\sterms\sto\srestrict\sthe\ncontent\sof\sa\sautomatic\spartial\sindex.\s\sShow\swhen\san\sautomatic\spartial\sindex\nis\sused\sin\sthe\sEXPLAIN\sQUERY\sPLAN\soutput.
+D 2014-10-25T12:28:25.871
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -130,7 +130,7 @@ F ext/rtree/rtree2.test acbb3a4ce0f4fbc2c304d2b4b784cfa161856bba
 F ext/rtree/rtree3.test a494da55c30ee0bc9b01a91c80c81b387b22d2dc
 F ext/rtree/rtree4.test c8fe384f60ebd49540a5fecc990041bf452eb6e0
 F ext/rtree/rtree5.test 6a510494f12454bf57ef28f45bc7764ea279431e
-F ext/rtree/rtree6.test 0cfbdf27ee086bf16a3da2c6f2d5b3d6473cb27e
+F ext/rtree/rtree6.test 773a90db2dce6a8353dd0d5b64bca69b29761196
 F ext/rtree/rtree7.test 1fa710b9e6bf997a0c1a537b81be7bb6fded1971
 F ext/rtree/rtree8.test db79c812f9e4a11f9b1f3f9934007884610a713a
 F ext/rtree/rtree9.test d86ebf08ff6328895613ed577dd8a2a37c472c34
@@ -302,8 +302,8 @@ F src/vtab.c cb0c194303fea276b48d7d4b6d970b5a96bde8de
 F src/wal.c 10e7de7ce90865a68153f001a61f1d985cd17983
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
-F src/where.c cc0733c59bd8bf6027d28b7d24b1887f4a870215
-F src/whereInt.h 4b459cdbfc9b01f5f27673a35f9967e4dea917e8
+F src/where.c 3312adfda33a9ca85c8a380a642a1a5905398b06
+F src/whereInt.h 19279cd0664ce1d90b9ad3ef0108cb494acfe455
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/aggnested.test b35b4cd69fc913f90d39a575e171e1116c3a4bb7
@@ -1206,7 +1206,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 401235edf40fcd665eaf426cf5155ac6855e8537
-R def8f7d87d0f5784d9eaab2c56b2a690
+P d95d0313c447f5baeabdb17284d8606331ab7d49
+R 9499438a1fccf595ef80fbd4c31b20b8
 U drh
-Z cb611c4b71e8fc233ea4e1005f56a9e0
+Z cdff8327924b867b12e561826d5fe961
index 7417ef4fc1880e2b5205dc0d1df5adb4585ea4fd..8b94233ae707e528569aff1ff6b9747c82ce50a0 100644 (file)
@@ -1 +1 @@
-d95d0313c447f5baeabdb17284d8606331ab7d49
\ No newline at end of file
+b9ad601eab1d7298d369267eb697c7fa1bc16985
\ No newline at end of file
index 8d2a89187008b4d1f0ee8fc44c8b72f7dc8a5bff..2e42b8fc32aa4fae22085a18fe6b0b9c6907cd3d 100644 (file)
@@ -1612,6 +1612,7 @@ static void constructAutomaticIndex(
   idxCols = 0;
   for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
     if( pLoop->prereq==0
+     && (pTerm->wtFlags & TERM_VIRTUAL)==0
      && sqlite3ExprIsTableConstant(pTerm->pExpr, pSrc->iCursor) ){
       pPartial = sqlite3ExprAnd(pParse->db, pPartial,
                                 sqlite3ExprDup(pParse->db, pTerm->pExpr, 0));
@@ -1720,6 +1721,7 @@ static void constructAutomaticIndex(
   if( pPartial ){
     iContinue = sqlite3VdbeMakeLabel(v);
     sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL);
+    pLoop->wsFlags |= WHERE_PARTIALIDX;
   }
   regRecord = sqlite3GetTempReg(pParse);
   sqlite3GenerateIndexKey(pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0);
@@ -2865,6 +2867,8 @@ static void explainOneScan(
         if( isSearch ){
           zFmt = "PRIMARY KEY";
         }
+      }else if( flags & WHERE_PARTIALIDX ){
+        zFmt = "AUTOMATIC PARTIAL COVERING INDEX";
       }else if( flags & WHERE_AUTO_INDEX ){
         zFmt = "AUTOMATIC COVERING INDEX";
       }else if( flags & WHERE_IDX_ONLY ){
index e9eb8b7dd22758dea64540c25c03c0851b8541ed..fd4cfdf88a28692d12091583ab70931cbf788f33 100644 (file)
@@ -459,3 +459,4 @@ struct WhereInfo {
 #define WHERE_AUTO_INDEX   0x00004000  /* Uses an ephemeral index */
 #define WHERE_SKIPSCAN     0x00008000  /* Uses the skip-scan algorithm */
 #define WHERE_UNQ_WANTED   0x00010000  /* WHERE_ONEROW would have been helpful*/
+#define WHERE_PARTIALIDX   0x00020000  /* The automatic index is partial */