]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem preventing UPDATE statements that use a range-scan on the PK
authordan <dan@noemail.net>
Wed, 11 Jan 2017 15:42:14 +0000 (15:42 +0000)
committerdan <dan@noemail.net>
Wed, 11 Jan 2017 15:42:14 +0000 (15:42 +0000)
index of a WITHOUT ROWID table from using a one-pass strategy.

FossilOrigin-Name: cab86c90945126c24c40cf2dedd053a8c46d00d6

manifest
manifest.uuid
src/update.c
test/update2.test

index e5b56745a1b0be24f903c9d9a6596eb74b35379c..519075486569f1414e5bdfa02fa9c17ad5c1b5ff 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Changes\sto\sallow\ssome\smulti-row\sUPDATE\sstatements\sto\savoid\sthe\stwo-pass\napproach.
-D 2017-01-10T20:04:38.186
+C Fix\sa\sproblem\spreventing\sUPDATE\sstatements\sthat\suse\sa\srange-scan\son\sthe\sPK\nindex\sof\sa\sWITHOUT\sROWID\stable\sfrom\susing\sa\sone-pass\sstrategy.
+D 2017-01-11T15:42:14.353
 F Makefile.in 41bd4cad981487345c4a84081074bcdb876e4b2e
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da
@@ -451,7 +451,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
 F src/tokenize.c 5c2f516876fc27fbd7753913f032f49eb89e83b5
 F src/treeview.c 4e44ade3bfe59d82005039f72e09333ce2b4162c
 F src/trigger.c c9f0810043b265724fdb1bdd466894f984dfc182
-F src/update.c 77a02122e040b8c6e1f13db9ef203e2224dae8f8
+F src/update.c 117bb080654b8c382b590b369f174ec11cca5bb0
 F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c
 F src/util.c a88b0466fddf445ce752226d4698ca3faada620a
 F src/vacuum.c 33c174b28886b2faf26e503b5a49a1c01a9b1c16
@@ -1351,7 +1351,7 @@ F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2
 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97
 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8
 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32
-F test/update2.test e7f23b8ed101b7113c198bbd6f78f508718725c1
+F test/update2.test 2b678973f882d11496f998c01b310be4c4a65a70
 F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568
 F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7
 F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9
@@ -1544,10 +1544,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 e500c15a9f55aed1601f7c14169dd56fd76f1fdd
-R 210f82ca33b63d0d25de1e8cfd9403fd
-T *branch * onepass-update
-T *sym-onepass-update *
-T -sym-trunk *
+P 46db23ccd116ce5b9d949f9293be8a2818411b46
+R a3998d49adecb7e21ad8d0444ff44124
 U dan
-Z 00c5ac8bc1c536bfb67f723788417749
+Z c5a6bc3f18beb290c2a3c904ee96a0c7
index 00d064c0e524851866df652ef42fe30c80086021..294d40d2937f584890be6b6e16e0c54cd3e5ea78 100644 (file)
@@ -1 +1 @@
-46db23ccd116ce5b9d949f9293be8a2818411b46
\ No newline at end of file
+cab86c90945126c24c40cf2dedd053a8c46d00d6
\ No newline at end of file
index c99a4b6e8c61dee1c793eb7624bc7628332cf175..acf43034ff631b24927dfa95ada6175d94cb14e4 100644 (file)
@@ -395,7 +395,10 @@ void sqlite3Update(
   eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
   if( eOnePass==ONEPASS_MULTI ){
     int iCur = aiCurOnePass[1];
-    if( iCur>=0 && aToOpen[iCur-iBaseCur] ) eOnePass = ONEPASS_OFF;
+    if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){
+      eOnePass = ONEPASS_OFF;
+    }
+    assert( iCur!=iDataCur || !HasRowid(pTab) );
   }
   
   if( HasRowid(pTab) ){
index fad31ec423dddd55757191cbbd47008578640a99..8aafb2438b9f22c0b03e02bf906beafff9b29f99 100644 (file)
@@ -81,4 +81,38 @@ do_execsql_test 3.1 {
   SELECT a, c FROM t4 ORDER BY a;
 } {1 5 2 6}
 
+#-------------------------------------------------------------------------
+#
+foreach {tn sql} {
+  1 { CREATE TABLE b1(a INTEGER PRIMARY KEY, b, c) }
+  2 { CREATE TABLE b1(a INT PRIMARY KEY, b, c) WITHOUT ROWID }
+} {
+  execsql { DROP TABLE IF EXISTS b1 }
+  execsql $sql
+  do_execsql_test 4.$tn.0 {
+    CREATE UNIQUE INDEX b1c ON b1(c);
+
+    INSERT INTO b1 VALUES(1, 'a', 1);
+    INSERT INTO b1 VALUES(2, 'b', 15);
+    INSERT INTO b1 VALUES(3, 'c', 3);
+    INSERT INTO b1 VALUES(4, 'd', 4);
+    INSERT INTO b1 VALUES(5, 'e', 5);
+    INSERT INTO b1 VALUES(6, 'f', 6);
+    INSERT INTO b1 VALUES(7, 'g', 7);
+  }
+
+  do_execsql_test 4.$tn.1 {
+    UPDATE OR REPLACE b1 SET c=c+10 WHERE a BETWEEN 4 AND 7;
+    SELECT * FROM b1 ORDER BY a;
+  } {
+    1 a 1
+    3 c 3
+    4 d 14
+    5 e 15
+    6 f 16
+    7 g 17
+  }
+}
+
+
 finish_test