-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
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
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
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
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
-dc236f11181e235ddfe58a7943a462686679bf94
\ No newline at end of file
+10ca7357b27d0657127d553738be3ae6d715b74a
\ No newline at end of file
** 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;
*/
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( iExpr<pOrWC->nTerm ){
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);
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
}
#-------------------------------------------------------------------------