-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
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
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
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
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
-40567fddd468d00295275af8df09a7a1785e684a
\ No newline at end of file
+25e2cde105a19293bdb9c001b48624e5d7f8c4e5
\ No newline at end of file
/*
** 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
** 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--){
/* Automatic indexes */
if( !pBuilder->pBest
-// && pTabList->nSrc>1
&& (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0
&& !pSrc->viaCoroutine
&& !pSrc->notIndexed
/* 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 */
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;
}
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);
}
}
}
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;
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:
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
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
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
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
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
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
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
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
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
set testdir [file dirname $argv0]
source $testdir/tester.tcl
-set testprefix x
+set testprefix whereF
do_execsql_test 1.0 {
PRAGMA automatic_index = 0;
} {
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 {
} {
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 {
} {
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