]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem involving "DELETE/UPDATE...LIMIT" statements that use an INDEXED
authordan <dan@noemail.net>
Fri, 10 Nov 2017 16:14:26 +0000 (16:14 +0000)
committerdan <dan@noemail.net>
Fri, 10 Nov 2017 16:14:26 +0000 (16:14 +0000)
BY clause.

FossilOrigin-Name: 09f94c2c8199b0d23a45cc062ca9561f9e5ddfcba117100e41889ce199d21bdb

manifest
manifest.uuid
src/delete.c
test/wherelimit2.test

index 72f23a851bec3e9e018d35fb539b330051759d2f..2d902bb312dd135ce66ea9891d0214e52bc45a3f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sproblem\swith\s(DELETE...LIMIT)\sstatements\sagainst\sWITHOUT\sROWID\stables\nwith\sa\ssingle\scolumn\sPK.
-D 2017-11-10T15:42:21.918
+C Fix\sa\sproblem\sinvolving\s"DELETE/UPDATE...LIMIT"\sstatements\sthat\suse\san\sINDEXED\nBY\sclause.
+D 2017-11-10T16:14:26.225
 F Makefile.in b142eb20482922153ebc77b261cdfd0a560ed05a81e9f6d9a2b0e8192922a1d2
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc a55372a22454e742ba7c8f6edf05b83213ec01125166ad7dcee0567e2f7fc81b
@@ -422,7 +422,7 @@ F src/ctime.c ff1be3eed7bdd75aaca61ca8dc848f7c9f850ef2fb9cb56f2734e922a098f9c0
 F src/date.c 48f743d88bbe88f848532d333cca84f26e52a4f217e86f86be7fc1b919c33d74
 F src/dbpage.c 432f46fb47c99ae1f0e2863fe595038a6f9d3b59f4a3dabe5f86ec2a88758fde
 F src/dbstat.c 7a4ba8518b6369ef3600c49cf9c918ad979acba610b2aebef1b656d649b96720
-F src/delete.c cd86beec4f64491270f52521a45f0d335e29766b165511d025ee11119839375a
+F src/delete.c 2b9f2d34c9420cbe6d83e99d08d735d8ba6b70729123b8c50909a7fa74a048d3
 F src/expr.c 0016b95aed1df47ebc0eb7415bd621841d72dbffd3bfb62210e50e71d83b4691
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 5ff2c895fe087756d8085dc1a9bc229b5670e2a65c3929dd87c71e43649af333
@@ -1558,7 +1558,7 @@ F test/whereJ.test 55a3221706a7ab706293f17cc8f96da563bf0767
 F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b
 F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864
 F test/wherelimit.test 1dee70c9cc147330156d75e23de88f771e624998b03ae316cb64e1d249f129d8
-F test/wherelimit2.test 565fc74c3f96c3f08f3c20e233530e4c5532e6dfa01d1acc8dd2da5009a3dfd3
+F test/wherelimit2.test 85e3fc3e61e100d8da27323c5cb30ed5881013c3b9100bb26ac5fd52d594c79b
 F test/wild001.test bca33f499866f04c24510d74baf1e578d4e44b1c
 F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74
 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
@@ -1674,7 +1674,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 584b88aaf89ab30cb51185396b7b50c6ecba286add023a26ab41d865b9c605ce
-R d15b259ca771d410cbcab13660cb7826
+P 35477a3dcceadf5dade8e036d5a2ce91b9ca83c4b85d309db233bdbcf538b1cc
+R 07fcc16cd40c06e7e9266df3e5decf1a
 U dan
-Z 4ca2b1e389083d1c64078c78c67450a8
+Z 02c3e7941017d253308184d6859dc937
index ebde4c85ea4ff5f8005f4f1e5a949d94d182beaa..03929fbdcf0675cb8b803e127507b7ab1878ca4f 100644 (file)
@@ -1 +1 @@
-35477a3dcceadf5dade8e036d5a2ce91b9ca83c4b85d309db233bdbcf538b1cc
\ No newline at end of file
+09f94c2c8199b0d23a45cc062ca9561f9e5ddfcba117100e41889ce199d21bdb
\ No newline at end of file
index 34c5feb8b7770fcda694abac2300bf00e80b0345..0d8737756ab0d6388fa0a7a99f71c3a6fae3cee9 100644 (file)
@@ -202,6 +202,7 @@ Expr *sqlite3LimitWhere(
   pSrc->a[0].pTab = 0;
   pSelectSrc = sqlite3SrcListDup(pParse->db, pSrc, 0);
   pSrc->a[0].pTab = pTab;
+  pSrc->a[0].pIBIndex = 0;
 
   /* generate the SELECT expression tree. */
   pSelect = sqlite3SelectNew(pParse, pEList, pSelectSrc, pWhere, 0 ,0, 
index 1bf0168b50112223cada235ca35bd8f68b081087..fbcc14aa5029f7174374ba307ad31695fb42e5dc 100644 (file)
@@ -74,7 +74,7 @@ do_execsql_test 1.4 {
 #-------------------------------------------------------------------------
 # Simple test using WITHOUT ROWID table.
 #
-do_execsql_test 2.0 {
+do_execsql_test 2.1.0 {
   CREATE TABLE t2(a, b, c, PRIMARY KEY(a, b)) WITHOUT ROWID;
   INSERT INTO t2 VALUES(1, 1, 'h');
   INSERT INTO t2 VALUES(1, 2, 'g');
@@ -86,14 +86,14 @@ do_execsql_test 2.0 {
   INSERT INTO t2 VALUES(4, 2, 'a');
 }
 
-do_execsql_test 2.1 {
+do_execsql_test 2.1.1 {
   BEGIN;
     DELETE FROM t2 WHERE b=1 ORDER BY c LIMIT 2;
     SELECT c FROM t2 ORDER BY 1;
   ROLLBACK;
 } {a c e f g h}
 
-do_execsql_test 2.2 {
+do_execsql_test 2.1.2 {
   BEGIN;
     UPDATE t2 SET c=NULL ORDER BY a, b DESC LIMIT 3 OFFSET 1;
     SELECT a, b, c FROM t2;
@@ -109,6 +109,42 @@ do_execsql_test 2.2 {
   4 2 a
 }
 
+do_execsql_test 2.2.0 {
+  DROP TABLE t2;
+  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c) WITHOUT ROWID;
+  INSERT INTO t2 VALUES(1, 1, 'h');
+  INSERT INTO t2 VALUES(2, 2, 'g');
+  INSERT INTO t2 VALUES(3, 1, 'f');
+  INSERT INTO t2 VALUES(4, 2, 'e');
+  INSERT INTO t2 VALUES(5, 1, 'd');
+  INSERT INTO t2 VALUES(6, 2, 'c');
+  INSERT INTO t2 VALUES(7, 1, 'b');
+  INSERT INTO t2 VALUES(8, 2, 'a');
+}
+
+do_execsql_test 2.2.1 {
+  BEGIN;
+    DELETE FROM t2 WHERE b=1 ORDER BY c LIMIT 2;
+    SELECT c FROM t2 ORDER BY 1;
+  ROLLBACK;
+} {a c e f g h}
+
+do_execsql_test 2.2.2 {
+  BEGIN;
+    UPDATE t2 SET c=NULL ORDER BY a DESC LIMIT 3 OFFSET 1;
+    SELECT a, b, c FROM t2;
+  ROLLBACK;
+} {
+  1 1 h
+  2 2 g 
+  3 1 f
+  4 2 e
+  5 1 {}
+  6 2 {} 
+  7 1 {} 
+  8 2 a
+}
+
 #-------------------------------------------------------------------------
 # Test using a virtual table
 #
@@ -164,29 +200,41 @@ ifcapable fts5 {
 #-------------------------------------------------------------------------
 # Test using INDEXED BY clauses.
 #
-foreach {tn t} {1 "" 2 "WITHOUT ROWID"} {
-  execsql "DROP TABLE IF EXISTS x1"
-  execsql "CREATE TABLE x1(a INTEGER PRIMARY KEY, b, c, d) $t"
-  do_execsql_test 4.$tn.0 {
-    CREATE INDEX x1bc ON x1(b, c);
-    INSERT INTO x1 VALUES(1,1,1,1);
-    INSERT INTO x1 VALUES(2,1,2,2);
-    INSERT INTO x1 VALUES(3,2,1,3);
-    INSERT INTO x1 VALUES(4,2,2,3);
-    INSERT INTO x1 VALUES(5,3,1,2);
-    INSERT INTO x1 VALUES(6,3,2,1);
-  }
-
-  do_execsql_test 4.$tn.1 {
-    BEGIN;
-      DELETE FROM x1 ORDER BY a LIMIT 2;
-      SELECT a FROM x1;
-    ROLLBACK;
-  } {3 4 5 6}
+do_execsql_test 4.0 {
+  CREATE TABLE x1(a INTEGER PRIMARY KEY, b, c, d);
+  CREATE INDEX x1bc ON x1(b, c);
+  INSERT INTO x1 VALUES(1,1,1,1);
+  INSERT INTO x1 VALUES(2,1,2,2);
+  INSERT INTO x1 VALUES(3,2,1,3);
+  INSERT INTO x1 VALUES(4,2,2,3);
+  INSERT INTO x1 VALUES(5,3,1,2);
+  INSERT INTO x1 VALUES(6,3,2,1);
 }
 
+do_execsql_test 4.1 {
+  BEGIN;
+    DELETE FROM x1 ORDER BY a LIMIT 2;
+    SELECT a FROM x1;
+  ROLLBACK;
+} {3 4 5 6}
+
+do_catchsql_test 4.2 {
+  DELETE FROM x1 INDEXED BY x1bc WHERE d=3 LIMIT 1;
+} {1 {no query solution}}
+
+do_execsql_test 4.3 {
+  DELETE FROM x1 INDEXED BY x1bc WHERE b=3 LIMIT 1;
+  SELECT a FROM x1;
+} {1 2 3 4 6}
 
+do_catchsql_test 4.4 {
+  UPDATE x1 INDEXED BY x1bc SET d=5 WHERE d=3 LIMIT 1;
+} {1 {no query solution}}
 
+do_execsql_test 4.5 {
+  UPDATE x1 INDEXED BY x1bc SET d=5 WHERE b=2 LIMIT 1;
+  SELECT a, d FROM x1;
+} {1 1 2 2 3 5 4 3 6 1}
 
 #-------------------------------------------------------------------------
 # Test using object names that require quoting.