From: dan Date: Fri, 10 Nov 2017 16:14:26 +0000 (+0000) Subject: Fix a problem involving "DELETE/UPDATE...LIMIT" statements that use an INDEXED X-Git-Tag: version-3.22.0~200^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ca3e3c3f1a4c2efdde91a36f35a2ce7df47c02f9;p=thirdparty%2Fsqlite.git Fix a problem involving "DELETE/UPDATE...LIMIT" statements that use an INDEXED BY clause. FossilOrigin-Name: 09f94c2c8199b0d23a45cc062ca9561f9e5ddfcba117100e41889ce199d21bdb --- diff --git a/manifest b/manifest index 72f23a851b..2d902bb312 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index ebde4c85ea..03929fbdcf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35477a3dcceadf5dade8e036d5a2ce91b9ca83c4b85d309db233bdbcf538b1cc \ No newline at end of file +09f94c2c8199b0d23a45cc062ca9561f9e5ddfcba117100e41889ce199d21bdb \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index 34c5feb8b7..0d8737756a 100644 --- a/src/delete.c +++ b/src/delete.c @@ -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, diff --git a/test/wherelimit2.test b/test/wherelimit2.test index 1bf0168b50..fbcc14aa50 100644 --- a/test/wherelimit2.test +++ b/test/wherelimit2.test @@ -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.