From: dan Date: Wed, 9 Dec 2015 10:06:24 +0000 (+0000) Subject: Add simple tests and bugfixes for DELETE statements that qualify for the OR-optimization. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=54815111e2473f9ce919d65184cf7eb060ae6873;p=thirdparty%2Fsqlite.git Add simple tests and bugfixes for DELETE statements that qualify for the OR-optimization. FossilOrigin-Name: 10ca7357b27d0657127d553738be3ae6d715b74a --- diff --git a/manifest b/manifest index 631538862f..1fba7de89f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\swith\sthis\sbranch. -D 2015-12-09T08:13:55.067 +C Add\ssimple\stests\sand\sbugfixes\sfor\sDELETE\sstatements\sthat\squalify\sfor\sthe\sOR-optimization. +D 2015-12-09T10:06:24.300 F Makefile.in 28bcd6149e050dff35d4dcfd97e890cd387a499d F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc e8fdca1cb89a1b58b5f4d3a130ea9a3d28cb314d @@ -291,7 +291,7 @@ F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 60e135af364d777a9ab41c97e5e89cd224da6198 F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/dbstat.c ffd63fc8ba7541476ced189b95e95d7f2bc63f78 -F src/delete.c 97d9d98151a9668e4e3e2b49b09b4af78d756031 +F src/delete.c 5f5bd96158929acc5f9c74fa928ee7d8a6b73f0b F src/expr.c ccb93d7b7e1ac5d187c9b153bae145933f93ee5c F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 31900763094a3736a5fc887469202eb579fef2d0 @@ -418,7 +418,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 1569802364cd192bbd5c4a8ea3fd6de593edecbd F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c 93f5c7ec7fbcf055fdf618cf43d9d1f0969842bc +F src/where.c b3b70c8e0f02a4f5f0722322615d93e3f9fb337b F src/whereInt.h e20801d89e34de1912bb6a3babb30c390da27add F src/wherecode.c dfbfe198e418b01f208b489e088edd230c91a4e7 F src/whereexpr.c eebba8340c90de73b3d3bbe8c43b84559b8e6e2c @@ -634,7 +634,7 @@ F test/fkey6.test abb59f866c1b44926fd02d1fdd217d831fe04f48 F test/fkey7.test 72e915890ee4a005daaf3002cb208e8fe973ac13 F test/fkey8.test 8f08203458321e6c19a263829de4cfc936274ab0 F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 -F test/fordelete.test 235fab593b486cc8de2fb64348544fe79e1855ad +F test/fordelete.test 3648283f90ab7a8e046d9b0c54e497a80ff7b2a2 F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb F test/fts-9fd058691.test 78b887e30ae6816df0e1fed6259de4b5a64ad33c F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7 @@ -1408,7 +1408,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d52376df53f8d17c6f6e7ca8cc8da2a24f257a7f 901d0b8f3b72e96ffa8e9436993a12980f5ebd51 -R 832f18ec9c40efc445a0eb414e96d686 +P dc236f11181e235ddfe58a7943a462686679bf94 +R de0ef9c8056887209ad87620155e0e85 U dan -Z 50ae4a90ed221c2b42ce0b4ffd54920e +Z 30ab9b4c4efed643a26b238b5eccdd20 diff --git a/manifest.uuid b/manifest.uuid index f036b4341b..978fb4c1ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dc236f11181e235ddfe58a7943a462686679bf94 \ No newline at end of file +10ca7357b27d0657127d553738be3ae6d715b74a \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index cd0be700c0..3999ec38ab 100644 --- a/src/delete.c +++ b/src/delete.c @@ -214,10 +214,11 @@ limit_where_cleanup_2: ** sqlite3WalkExpr() callback used by deleteSetColUsed(). */ static int deleteSetColUsedExpr(Walker *pWalker, Expr *pExpr){ - if( pExpr->op==TK_COLUMN ){ - int i = pExpr->iColumn; - if( i>=0 ){ - pWalker->u.pSrcList->a[0].colUsed |= ((Bitmask)1)<<(i>=BMS ? BMS-1 : i); + int iCol; + if( pExpr->op==TK_COLUMN && (iCol = pExpr->iColumn)>=0 ){ + struct SrcList_item *pItem = &pWalker->u.pSrcList->a[0]; + if( pItem->iCursor==pExpr->iTable ){ + pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); } } return WRC_Continue; diff --git a/src/where.c b/src/where.c index f739fe0c98..27195a7cb9 100644 --- a/src/where.c +++ b/src/where.c @@ -1813,13 +1813,12 @@ void sqlite3WhereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ */ Expr *sqlite3WhereSplitExpr(WhereInfo *pWInfo, int iExpr){ sqlite3 *db = pWInfo->pParse->db; - WhereLoop *pLoop = pWInfo->pLoops; + WhereLoop *pLoop = pWInfo->a[0].pWLoop; WhereTerm *pTerm = pLoop->aLTerm[0]; WhereClause *pOrWC = &pTerm->u.pOrInfo->wc; Expr *pExpr = 0; assert( pWInfo->eOnePass==ONEPASS_SPLIT_DELETE ); - assert( pLoop->pNextLoop==0 ); assert( (pTerm->wtFlags & TERM_ORINFO)!=0 ); if( iExprnTerm ){ diff --git a/test/fordelete.test b/test/fordelete.test index 2965b90ab8..b0d5fa327f 100644 --- a/test/fordelete.test +++ b/test/fordelete.test @@ -61,7 +61,7 @@ foreach {tn sql res} { do_adp_test 1.$tn $sql $res } -do_execsql_test 2.0 { +do_execsql_test 2.1.0 { CREATE TABLE t2(a, b, c); CREATE INDEX t2a ON t2(a); CREATE INDEX t2b ON t2(b); @@ -74,7 +74,38 @@ foreach {tn sql res} { 4 { DELETE FROM t2 WHERE +a=? } { t2 t2a* t2b* t2c* } 5 { DELETE FROM t2 WHERE rowid=? } { t2 t2a* t2b* t2c* } } { - do_adp_test 2.$tn $sql $res + do_adp_test 2.1.$tn $sql $res +} + +foreach {tn where res} { + 1 { a=? OR b=? } { t2* t2* t2a t2a* t2b t2b* t2c* t2c* } + 2 { a=? OR (b=? AND +c=?) } { t2 t2* t2a t2a* t2b t2b* t2c* t2c* } + 3 { (a=? OR b=?) AND +c=? } { t2 t2 t2a t2a* t2b t2b* t2c* t2c* } + 4 { (c=? OR b=?) } { t2* t2* t2a* t2a* t2b t2b* t2c t2c* } + 5 { (c=? OR b=?) AND EXISTS (SELECT 1 FROM t1 WHERE t1.a=?) } + { t2* t2* t2a* t2a* t2b t2b* t2c t2c* } +} { + do_adp_test 2.2.$tn "DELETE FROM t2 WHERE $where" $res +} + +do_execsql_test 2.3.0 { + CREATE TABLE t3(x, y, z); + CREATE INDEX t3xy ON t3(x, y); + CREATE INDEX t3zy ON t3(z, y); + CREATE INDEX t3zx ON t3(z, x); + CREATE INDEX t3x ON t3(x); +} + +foreach {tn where res} { + 1 { x=? OR z=? } + { t3* t3* t3x t3x* t3xy* t3xy* t3zx t3zx* t3zy* t3zy* } + + 2 { (x=? OR z=?) AND y=? } + { t3* t3* t3x* t3x* t3xy t3xy* t3zx* t3zx* t3zy t3zy* } + + 3 { (y=? OR z=?) AND x=? } { t3 t3x t3xy* t3zx* t3zy* } +} { + do_adp_test 2.3.$tn "DELETE FROM t3 WHERE $where" $res } #-------------------------------------------------------------------------