Add the "queryplanner" test permutation. Continuing refinements to NGQP.

FossilOrigin-Name: 25e2cde105a19293bdb9c001b48624e5d7f8c4e5
This commit is contained in:
drh 2013-06-12 14:52:39 +00:00
parent e217efc822
commit fd5874d23d
7 changed files with 136 additions and 43 deletions

View File

@ -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

View File

@ -1 +1 @@
40567fddd468d00295275af8df09a7a1785e684a
25e2cde105a19293bdb9c001b48624e5d7f8c4e5

View 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;

View 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:

View 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

View 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)
}
} {1 {cannot use index: t1b}}
} {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)
}
} {0 {}}
############################################################################
# Test cases where terms inside an OR series are combined with AND terms

View 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