From 58ed374370522f7da3ec6d81d3c968e172399bb1 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 15 Jan 2019 14:31:01 +0000 Subject: [PATCH] Fix a problem triggered by DELETE statements with WHERE clauses that use the OR-optimization on some virtual tables. FossilOrigin-Name: ecf5caa7e9825a8b03d15ee525ec68be78c55926ddfaca27a040a7614caf0e85 --- ext/rtree/rtree6.test | 10 ++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 3 ++- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ext/rtree/rtree6.test b/ext/rtree/rtree6.test index 0cf6efacbc..bc9ff84298 100644 --- a/ext/rtree/rtree6.test +++ b/ext/rtree/rtree6.test @@ -15,6 +15,7 @@ if {![info exists testdir]} { set testdir [file join [file dirname [info script]] .. .. test] } source $testdir/tester.tcl +set testprefix rtree6 ifcapable {!rtree || rtree_int_only} { finish_test @@ -167,5 +168,14 @@ do_execsql_test rtree6-3.5 { x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>1.1 } {} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE t1 USING rtree(id,x0,x1,y0,y1); +} +do_execsql_test 4.1 { + DELETE FROM t1 WHERE x0>1 AND x1<2 OR y0<92; +} + expand_all_sql db finish_test diff --git a/manifest b/manifest index 6b9aea40c0..3233dc5ce1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sscalar\sfunction\s"prefix_length()"\sto\sext/misc/prefixes.c. -D 2019-01-14T20:44:00.309 +C Fix\sa\sproblem\striggered\sby\sDELETE\sstatements\swith\sWHERE\sclauses\sthat\suse\sthe\nOR-optimization\son\ssome\svirtual\stables. +D 2019-01-15T14:31:01.754 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777 @@ -374,7 +374,7 @@ F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e5 F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2e55d3142 -F ext/rtree/rtree6.test c8623cf9facccd74987e63709c4573545bfe541d929722e1ca8a549d5b03ad11 +F ext/rtree/rtree6.test 1252a0439da01d2f1f5cbbdeeb80455a2d68b9bae2a9787937b167a5e3957828 F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf @@ -598,7 +598,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 -F src/where.c 7a1db797b6576d66424845666b122f8bc3eda0f2eb8b21518baf40407bbdf6ac +F src/where.c dc293ea4230adf9a323fb2e5750eff565347567a3cd6538f7d0fa93b11c2baae F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 @@ -1800,7 +1800,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 11b8a4cba747ca214fe3506caa3b711c87be4d55412754e673cc0603afefb086 -R 32ab1d3eba68373a1b0b1f4de28ca909 +P 0bf1550507d9d3c8a41f8a50db3a59bf808f0a4e24637dc0905d35579305eca7 +R 2c397297f134bc6152efa0485df52b10 U dan -Z fb1a50e31aa836559e45fed0b6204d9c +Z 19d23f22b9b5c0ebccb0826a548951f8 diff --git a/manifest.uuid b/manifest.uuid index e315bc4b42..844ff99792 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0bf1550507d9d3c8a41f8a50db3a59bf808f0a4e24637dc0905d35579305eca7 \ No newline at end of file +ecf5caa7e9825a8b03d15ee525ec68be78c55926ddfaca27a040a7614caf0e85 \ No newline at end of file diff --git a/src/where.c b/src/where.c index be86816af2..bb9787fcee 100644 --- a/src/where.c +++ b/src/where.c @@ -4919,9 +4919,10 @@ WhereInfo *sqlite3WhereBegin( if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ int wsFlags = pWInfo->a[0].pWLoop->wsFlags; int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + assert( !(wsFlags & WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pTab) ); if( bOnerow || ( 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) - && 0==(wsFlags & WHERE_VIRTUALTABLE) + && !IsVirtual(pTabList->a[0].pTab) && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) )){ pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI;