]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the "queryplanner" test permutation. Continuing refinements to NGQP.
authordrh <drh@noemail.net>
Wed, 12 Jun 2013 14:52:39 +0000 (14:52 +0000)
committerdrh <drh@noemail.net>
Wed, 12 Jun 2013 14:52:39 +0000 (14:52 +0000)
FossilOrigin-Name: 25e2cde105a19293bdb9c001b48624e5d7f8c4e5

manifest
manifest.uuid
src/where.c
test/permutations.test
test/where8.test
test/where9.test
test/whereF.test

index 0f0b79ba59409640f91ca708a2652fb507ad7b97..2445afe8f04986e9faa899c7d7d95e29d0757081 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Continue\srefining\sthe\sNGQP
-D 2013-06-12T03:48:41.127
+C Add\sthe\s"queryplanner"\stest\spermutation.\s\sContinuing\srefinements\sto\sNGQP.
+D 2013-06-12T14:52:39.194
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -289,7 +289,7 @@ F src/vtab.c b05e5f1f4902461ba9f5fc49bb7eb7c3a0741a83
 F src/wal.c 436bfceb141b9423c45119e68e444358ee0ed35d
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73
-F src/where.c 3f38f769ef1365d7c8ff5b0ae9341b32f49bf46e
+F src/where.c 67d70ce776aae6e81eddc182357bd5542dc9e023
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6
@@ -707,7 +707,7 @@ F test/pagesize.test 1dd51367e752e742f58e861e65ed7390603827a0
 F test/pcache.test 065aa286e722ab24f2e51792c1f093bf60656b16
 F test/pcache2.test a83efe2dec0d392f814bfc998def1d1833942025
 F test/percentile.test 4614301e38398df7fdd5f28f4ed8f272b328251b
-F test/permutations.test d997a947ab8aabb15f763d50a030b3c11e8ef1b6
+F test/permutations.test 2ab3937fdd34e18712be8f4159ac354c4d27ce1d
 F test/pragma.test 5e7de6c32a5d764f09437d2025f07e4917b9e178
 F test/pragma2.test 3a55f82b954242c642f8342b17dffc8b47472947
 F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552
@@ -1036,15 +1036,15 @@ F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2
 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2
 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b
 F test/where7.test e0741d85b6069effe53c6ed7682e18aa078f4b11
-F test/where8.test d6a283eb7348a8967d44e2a753f117ab0d21d4f3
+F test/where8.test f6b9559723564a042927ee0f22003ac9bed71b21
 F test/where8m.test da346596e19d54f0aba35ebade032a7c47d79739
-F test/where9.test 4094299aea1c5a1ebe172ad832c2467cba23133a
+F test/where9.test f5752185fc19a1ee826a2386a249f05dbc25979b
 F test/whereA.test 24c234263c8fe358f079d5e57d884fb569d2da0a
 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
 F test/whereC.test d6f4ecd4fa2d9429681a5b22a25d2bda8e86ab8a
 F test/whereD.test 6c2feb79ef1f68381b07f39017fe5f9b96da8d62
 F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f
-F test/whereF.test a0e296643cabe5278379bc1a0aa158cf3c54a1c9
+F test/whereF.test 136a7301512d72a08a272806c8767066311b7bc1
 F test/wherelimit.test 5e9fd41e79bb2b2d588ed999d641d9c965619b31
 F test/win32lock.test 7a6bd73a5dcdee39b5bb93e92395e1773a194361
 F test/zeroblob.test caaecfb4f908f7bc086ed238668049f96774d688
@@ -1095,7 +1095,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/wherecosttest.c 4d0393bdbe7230adb712e925863744dd2b7ffc5b
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P ba897100fed291d2025f68d09334f9985312298b
-R 5ed376a4396f55c99b307b2ce75a8d86
+P 40567fddd468d00295275af8df09a7a1785e684a
+R 8ad423cc8976bc762dc67ac33e49e948
 U drh
-Z 47a7a33cc642ca844caf03a37d1ebaba
+Z 7a74b3f46b1e20d0df5f0a7a123b8d69
index d84595d4b9238d08b4e3163c19512eac3fc8e9ab..943b9de7f40de7c939afbcf49a52dab64884e9ec 100644 (file)
@@ -1 +1 @@
-40567fddd468d00295275af8df09a7a1785e684a
\ No newline at end of file
+25e2cde105a19293bdb9c001b48624e5d7f8c4e5
\ No newline at end of file
index 059c2c10154b549c46698779c45e53e5fcb0bcce..06470f6fa481e211f45c453f5e64ec7157ebdc23 100644 (file)
@@ -604,7 +604,7 @@ static void whereSplit(WhereClause *pWC, Expr *pExpr, int op){
 /*
 ** Initialize an expression mask set (a WhereMaskSet object)
 */
-#define initMaskSet(P)  memset(P, 0, sizeof(*P))
+#define initMaskSet(P)  (P)->n=0
 
 /*
 ** Return the bitmask for the given cursor number.  Return 0 if
@@ -4361,7 +4361,7 @@ static int indexMightHelpWithOrderBy(
 ** Return a bitmask where 1s indicate that the corresponding column of
 ** the table is used by an index.  Only the first 63 columns are considered.
 */
-static Bitmask columnsUsedByIndex(Index *pIdx){
+static Bitmask columnsInIndex(Index *pIdx){
   Bitmask m = 0;
   int j;
   for(j=pIdx->nColumn-1; j>=0; j--){
@@ -4431,7 +4431,6 @@ static int whereLoopAddBtree(
 
   /* Automatic indexes */
   if( !pBuilder->pBest
-//   && pTabList->nSrc>1
    && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 
    && !pSrc->viaCoroutine
    && !pSrc->notIndexed
@@ -4476,11 +4475,11 @@ static int whereLoopAddBtree(
       /* Full table scan */
       pNew->iSortIdx = b ? iSortIdx : 0;
       pNew->nOut = rSize;
-      pNew->rRun = whereCostAdd(rSize,rLogSize) + 16 + b*4;
+      pNew->rRun = whereCostAdd(rSize,rLogSize) + 16 - b;
       rc = whereLoopInsert(pBuilder, pNew);
       if( rc ) break;
     }else{
-      Bitmask m = pSrc->colUsed & ~columnsUsedByIndex(pProbe);
+      Bitmask m = pSrc->colUsed & ~columnsInIndex(pProbe);
       pNew->wsFlags = (m==0) ? (WHERE_IDX_ONLY|WHERE_INDEXED) : WHERE_INDEXED;
 
       /* Full scan via index */
@@ -4493,8 +4492,7 @@ static int whereLoopAddBtree(
         pNew->iSortIdx = b ? iSortIdx : 0;
         pNew->nOut = rSize;
         pNew->rRun = whereCostAdd(rSize,rLogSize);
-        if( m!=0 ) pNew->rRun += rLogSize;
-        if( b ) pNew->rRun--;
+        pNew->rRun += ((m!=0) ? rLogSize : 10) - b;
         rc = whereLoopInsert(pBuilder, pNew);
         if( rc ) break;
       }
@@ -4737,15 +4735,17 @@ static int whereLoopAddOr(WhereLoopBuilder *pBuilder, Bitmask mExtra){
         prereq |= sBest.prereq;
       }
       assert( pNew->nLSlot>=1 );
-      pNew->nLTerm = 1;
-      pNew->aLTerm[0] = pTerm;
-      pNew->wsFlags = WHERE_MULTI_OR;
-      pNew->rSetup = 0;
-      pNew->rRun = rTotal;
-      pNew->nOut = nRow;
-      pNew->prereq = prereq;
-      memset(&pNew->u, 0, sizeof(pNew->u));
-      rc = whereLoopInsert(pBuilder, pNew);
+      if( sBest.maskSelf ){
+        pNew->nLTerm = 1;
+        pNew->aLTerm[0] = pTerm;
+        pNew->wsFlags = WHERE_MULTI_OR;
+        pNew->rSetup = 0;
+        pNew->rRun = rTotal;
+        pNew->nOut = nRow;
+        pNew->prereq = prereq;
+        memset(&pNew->u, 0, sizeof(pNew->u));
+        rc = whereLoopInsert(pBuilder, pNew);
+      }
       whereLoopClear(pWInfo->pParse->db, &sBest);
     }
   }
@@ -5327,7 +5327,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){
       }
       if( j!=pIdx->nColumn ) continue;
       pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_ONEROW|WHERE_INDEXED;
-      if( (pItem->colUsed & ~columnsUsedByIndex(pIdx))==0 ){
+      if( (pItem->colUsed & ~columnsInIndex(pIdx))==0 ){
         pLoop->wsFlags |= WHERE_IDX_ONLY;
       }
       pLoop->nLTerm = j;
index bc3ceb80855f619c1b1d5377ad857894d273edf4..7b633019ae9b4e9cecba2bd6dbc8c266be4f23b5 100644 (file)
@@ -213,6 +213,83 @@ test_suite "nofaultsim" -prefix "" -description {
   unset -nocomplain ::G(valgrind)
 }
 
+test_suite "queryplanner" -prefix "" -description {
+  Tests of the query planner and query optimizer
+} -files {
+  alter2.test alter3.test alter4.test alter.test analyze3.test
+  analyze4.test analyze5.test analyze6.test analyze7.test analyze8.test
+  analyze.test attach2.test attach3.test attach4.test attachmalloc.test
+  attach.test autoinc.test autoindex1.test between.test cast.test
+  check.test closure01.test coalesce.test collate1.test collate2.test
+  collate3.test collate4.test collate5.test collate6.test collate7.test
+  collate8.test collate9.test collateA.test colmeta.test colname.test
+  conflict.test count.test coveridxscan.test createtab.test cse.test
+  date.test dbstatus2.test dbstatus.test default.test delete2.test
+  delete3.test delete.test descidx1.test descidx2.test descidx3.test
+  distinctagg.test distinct.test e_createtable.test e_delete.test
+  e_droptrigger.test e_dropview.test e_expr.test e_fkey.test e_insert.test
+  eqp.test e_reindex.test e_resolve.test e_select2.test e_select.test
+  e_update.test exists.test expr.test fkey1.test fkey2.test fkey3.test
+  fkey4.test fkey5.test fkey_malloc.test format4.test func2.test
+  func3.test func.test fuzz2.test fuzz3.test fuzzer1.test fuzz-oss1.test
+  fuzz.test in2.test in3.test in4.test in5.test index2.test index3.test
+  index4.test index5.test indexedby.test indexfault.test index.test
+  insert2.test insert3.test insert4.test insert5.test insert.test
+  instr.test in.test intpkey.test join2.test join3.test join4.test
+  join5.test join6.test join.test like2.test like.test limit.test
+  minmax2.test minmax3.test minmax4.test minmax.test misc1.test misc2.test
+  misc3.test misc4.test misc5.test misc6.test misc7.test orderby1.test
+  orderby2.test orderby3.test orderby4.test randexpr1.test regexp1.test
+  reindex.test rowhash.test rowid.test schema2.test schema3.test
+  schema4.test schema5.test schema.test securedel2.test securedel.test
+  select1.test select2.test select3.test select4.test select5.test
+  select6.test select7.test select8.test select9.test selectA.test
+  selectB.test selectC.test selectD.test selectE.test sidedelete.test
+  sort.test spellfix.test subquery2.test subquery.test subselect.test
+  substr.test tkt-02a8e81d44.test tkt1435.test tkt1443.test tkt1444.test
+  tkt1449.test tkt1473.test tkt1501.test tkt1512.test tkt1514.test
+  tkt1536.test tkt1537.test tkt1567.test tkt1644.test tkt1667.test
+  tkt1873.test tkt2141.test tkt2192.test tkt2213.test tkt2251.test
+  tkt2285.test tkt2332.test tkt2339.test tkt2391.test tkt2409.test
+  tkt2450.test tkt2565.test tkt2640.test tkt2643.test tkt2686.test
+  tkt-26ff0c2d1e.test tkt2767.test tkt2817.test tkt2820.test tkt2822.test
+  tkt2832.test tkt2854.test tkt2920.test tkt2927.test tkt2942.test
+  tkt-2a5629202f.test tkt-2d1a5c67d.test tkt-2ea2425d34.test tkt3080.test
+  tkt3093.test tkt3121.test tkt-31338dca7e.test tkt-313723c356.test
+  tkt3201.test tkt3292.test tkt3298.test tkt3334.test tkt3346.test
+  tkt3357.test tkt3419.test tkt3424.test tkt3442.test tkt3457.test
+  tkt3461.test tkt3493.test tkt3508.test tkt3522.test tkt3527.test
+  tkt3541.test tkt3554.test tkt3581.test tkt35xx.test tkt3630.test
+  tkt3718.test tkt3731.test tkt3757.test tkt3761.test tkt3762.test
+  tkt3773.test tkt3791.test tkt3793.test tkt3810.test tkt3824.test
+  tkt3832.test tkt3838.test tkt3841.test tkt-385a5b56b9.test tkt3871.test
+  tkt3879.test tkt-38cb5df375.test tkt3911.test tkt3918.test tkt3922.test
+  tkt3929.test tkt3935.test tkt3992.test tkt3997.test tkt-3998683a16.test
+  tkt-3a77c9714e.test tkt-3fe897352e.test tkt4018.test tkt-4a03edc4c8.test
+  tkt-4dd95f6943.test tkt-54844eea3f.test tkt-5d863f876e.test
+  tkt-5e10420e8d.test tkt-5ee23731f.test tkt-6bfb98dfc0.test
+  tkt-752e1646fc.test tkt-78e04e52ea.test tkt-7a31705a7e6.test
+  tkt-7bbfb7d442.test tkt-80ba201079.test tkt-80e031a00f.test
+  tkt-8454a207b9.test tkt-91e2e8ba6f.test tkt-94c04eaadb.test
+  tkt-9d68c883.test tkt-a7b7803e.test tkt-b1d3a2e531.test
+  tkt-b351d95f9.test tkt-b72787b1.test tkt-bd484a090c.test
+  tkt-bdc6bbbb38.test tkt-c48d99d690.test tkt-cbd054fa6b.test
+  tkt-d11f09d36e.test tkt-d635236375.test tkt-d82e3f3721.test
+  tkt-f3e5abed55.test tkt-f777251dc7a.test tkt-f7b4edec.test
+  tkt-f973c7ac31.test tkt-fa7bf5ec.test tkt-fc62af4523.test
+  tkt-fc7bd6358f.test trigger1.test trigger2.test trigger3.test
+  trigger4.test trigger5.test trigger6.test trigger7.test trigger8.test
+  trigger9.test triggerA.test triggerB.test triggerC.test triggerD.test
+  types2.test types3.test types.test unique.test unordered.test
+  update.test view.test vtab1.test vtab2.test vtab3.test vtab4.test
+  vtab5.test vtab6.test vtab7.test vtab8.test vtab9.test vtab_alter.test
+  vtabA.test vtabB.test vtabC.test vtabD.test vtab_err.test vtabE.test
+  vtabF.test where2.test where3.test where4.test where5.test where6.test
+  where7.test where8m.test where8.test where9.test whereA.test whereB.test
+  whereC.test whereD.test whereE.test whereF.test wherelimit.test
+  where.test
+}
+
 lappend ::testsuitelist xxx
 #-------------------------------------------------------------------------
 # Define the coverage related test suites:
index 9b6014e708fe589a5c5973e007b6245b88bd4429..6890e3ac596695d3d534ebf013e830c014272e16 100644 (file)
@@ -268,7 +268,7 @@ do_test where8-3.12 {
   execsql_status {
     SELECT a, d FROM t1, t2 WHERE (a=d OR b=e) AND +a<5 ORDER BY a
   }
-} {1 1 2 2 3 3 4 2 4 4 0 0}
+} {1 1 2 2 3 3 4 2 4 4 9 0}
 do_test where8-3.13 {
   execsql_status {
     SELECT a, d FROM t1, t2 WHERE (a=d OR b=e) AND +a<5
index d6a8c597b42567ee62e5b32ed6de225201d90025..4ffcad14704b05dad0b0fe85a93e4825c7e7cf10 100644 (file)
@@ -420,7 +420,7 @@ do_test where9-4.5 {
        AND (c=31031 OR d IS NULL)
      ORDER BY +a
   }
-} {1 {cannot use index: t1b}}
+} {1 {no query solution}}
 do_test where9-4.6 {
   count_steps {
     SELECT a FROM t1 NOT INDEXED
@@ -436,7 +436,7 @@ do_test where9-4.7 {
        AND (c=31031 OR d IS NULL)
      ORDER BY +a
   }
-} {1 {cannot use index: t1c}}
+} {1 {no query solution}}
 do_test where9-4.8 {
   catchsql {
     SELECT a FROM t1 INDEXED BY t1d
@@ -444,7 +444,7 @@ do_test where9-4.8 {
        AND (c=31031 OR d IS NULL)
      ORDER BY +a
   }
-} {1 {cannot use index: t1d}}
+} {1 {no query solution}}
 
 ifcapable explain {
   # The (c=31031 OR d IS NULL) clause is preferred over b>1000 because
@@ -598,7 +598,7 @@ do_test where9-6.3.5 {
         OR (b NOT NULL AND c IS NULL AND d NOT NULL)
         OR (b NOT NULL AND c NOT NULL AND d IS NULL)
   }
-} {scan 98 sort 0}   ;# DELETEs rows 90 91 92 97
+} {scan 0 sort 0}   ;# DELETEs rows 90 91 92 97
 do_test where9-6.3.6 {
   db eval {
     SELECT count(*) FROM t1 UNION ALL
@@ -615,7 +615,7 @@ do_test where9-6.3.7 {
         OR (b NOT NULL AND +c IS NULL AND d NOT NULL)
         OR (b NOT NULL AND c NOT NULL AND d IS NULL)
   }
-} {scan 98 sort 0}   ;# Add 100 to rowids 90 91 92 97
+} {scan 0 sort 0}   ;# Add 100 to rowids 90 91 92 97
 do_test where9-6.3.8 {
   db eval {
     SELECT count(*) FROM t1 UNION ALL
@@ -705,7 +705,7 @@ do_test where9-6.6.1 {
         OR (b NOT NULL AND +c IS NULL AND d NOT NULL)
         OR (b NOT NULL AND c NOT NULL AND d IS NULL)
   }
-} {scan 98 sort 0}   ;# DELETEs rows 90 91 92 97
+} {scan 0 sort 0}   ;# DELETEs rows 90 91 92 97
 do_test where9-6.6.2 {
   db eval {
     SELECT count(*) FROM t1 UNION ALL
@@ -722,7 +722,7 @@ do_test where9-6.6.3 {
         OR (b NOT NULL AND +c IS NULL AND d NOT NULL)
         OR (b NOT NULL AND c NOT NULL AND d IS NULL)
   }
-} {scan 98 sort 0}   ;# Add 100 to rowids 90 91 92 97
+} {scan 0 sort 0}   ;# Add 100 to rowids 90 91 92 97
 do_test where9-6.6.4 {
   db eval {
     SELECT count(*) FROM t1 UNION ALL
@@ -768,19 +768,35 @@ do_test where9-6.7.4 {
 do_test where9-6.8.1 {
   catchsql {
     DELETE FROM t1 INDEXED BY t1b
-     WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
+     WHERE (+b IS NULL AND c NOT NULL AND d NOT NULL)
         OR (b NOT NULL AND c IS NULL AND d NOT NULL)
         OR (b NOT NULL AND c NOT NULL AND d IS NULL)
   }
-} {1 {cannot use index: t1b}}
+} {1 {no query solution}}
 do_test where9-6.8.2 {
   catchsql {
     UPDATE t1 INDEXED BY t1b SET a=a+100
+     WHERE (+b IS NULL AND c NOT NULL AND d NOT NULL)
+        OR (b NOT NULL AND c IS NULL AND d NOT NULL)
+        OR (b NOT NULL AND c NOT NULL AND d IS NULL)
+  }
+} {1 {no query solution}}
+do_test where9-6.8.3 {
+  catchsql {
+    UPDATE t1 INDEXED BY t1b SET a=a+100
+     WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
+        OR (b NOT NULL AND c IS NULL AND d NOT NULL)
+        OR (b NOT NULL AND c NOT NULL AND d IS NULL)
+  }
+} {0 {}}
+do_test where9-6.8.4 {
+  catchsql {
+    DELETE FROM t1 INDEXED BY t1b
      WHERE (b IS NULL AND c NOT NULL AND d NOT NULL)
         OR (b NOT NULL AND c IS NULL AND d NOT NULL)
         OR (b NOT NULL AND c NOT NULL AND d IS NULL)
   }
-} {1 {cannot use index: t1b}}
+} {0 {}}
 
 ############################################################################
 # Test cases where terms inside an OR series are combined with AND terms
index 57bdbee058d8a46a267785982b471d4740b6ca0c..c98312a262e35e583cbfee043fc2de62c4567714 100644 (file)
@@ -46,7 +46,7 @@
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
-set testprefix x
+set testprefix whereF
 
 do_execsql_test 1.0 {
   PRAGMA automatic_index = 0;
@@ -63,7 +63,7 @@ foreach {tn sql} {
 } {
   do_test 1.$tn {
     db eval "EXPLAIN QUERY PLAN $sql"
-   } {/.*SCAN TABLE t2 .*SEARCH TABLE t1 .*/}
+   } {/.*SCAN TABLE t2\y.*SEARCH TABLE t1\y.*/}
 }
 
 do_execsql_test 2.0 {
@@ -84,7 +84,7 @@ foreach {tn sql} {
 } {
   do_test 2.$tn {
     db eval "EXPLAIN QUERY PLAN $sql"
-   } {/.*SCAN TABLE t2 .*SEARCH TABLE t1 .*/}
+   } {/.*SCAN TABLE t2\y.*SEARCH TABLE t1\y.*/}
 }
 
 do_execsql_test 3.0 {
@@ -109,7 +109,7 @@ foreach {tn sql} {
 } {
   do_test 3.$tn {
     db eval "EXPLAIN QUERY PLAN $sql"
-   } {/.*SCAN TABLE t2 .*SEARCH TABLE t1 .*/}
+   } {/.*SCAN TABLE t2\y.*SEARCH TABLE t1\y.*/}
 }
 
 finish_test