]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add simple tests and bugfixes for DELETE statements that qualify for the OR-optimization.
authordan <dan@noemail.net>
Wed, 9 Dec 2015 10:06:24 +0000 (10:06 +0000)
committerdan <dan@noemail.net>
Wed, 9 Dec 2015 10:06:24 +0000 (10:06 +0000)
FossilOrigin-Name: 10ca7357b27d0657127d553738be3ae6d715b74a

manifest
manifest.uuid
src/delete.c
src/where.c
test/fordelete.test

index 631538862f6a583662ffe0ecd03067b0c8f45d0d..1fba7de89f6ce1ab3511a89768dd36feddaf32be 100644 (file)
--- 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
index f036b4341b16f1a6dc9109c73a1359fc4487abe7..978fb4c1ceabddbc3bb51bce395ee3bec69d3bf4 100644 (file)
@@ -1 +1 @@
-dc236f11181e235ddfe58a7943a462686679bf94
\ No newline at end of file
+10ca7357b27d0657127d553738be3ae6d715b74a
\ No newline at end of file
index cd0be700c057c12d259313740901915b9e2304cc..3999ec38ab6ea9bb374921513bd5a738627409ad 100644 (file)
@@ -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;
index f739fe0c98468fdd95b111bdb70be220fdd5ab45..27195a7cb92ae34c9cf9e447d2e1f1100dbd9ffc 100644 (file)
@@ -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( iExpr<pOrWC->nTerm ){
index 2965b90ab85fb6d0c0f61cb91b9289a42b58074e..b0d5fa327fb5e827a763aafeefd8ac6e107d7531 100644 (file)
@@ -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
 }
 
 #-------------------------------------------------------------------------