Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add further tests for the code on this branch. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | update-delete-limit-fix |
Files: | files | file ages | folders |
SHA3-256: |
f8c4e33f4813e0c909064406b5cc17e2 |
User & Date: | dan 2017-11-10 17:47:54.147 |
Context
2017-11-10
| ||
20:13 | Omit some extra code from non-SQLITE_ENABLE_UPDATE_DELETE_LIMIT builds. (Closed-Leaf check-in: 72be33f9c8 user: dan tags: update-delete-limit-fix) | |
17:47 | Add further tests for the code on this branch. (check-in: f8c4e33f48 user: dan tags: update-delete-limit-fix) | |
16:14 | Fix a problem involving "DELETE/UPDATE...LIMIT" statements that use an INDEXED BY clause. (check-in: 09f94c2c81 user: dan tags: update-delete-limit-fix) | |
Changes
Added test/wherelfault.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | # 2008 October 6 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing fault-injection with the # LIMIT ... OFFSET ... clause of UPDATE and DELETE statements. # set testdir [file dirname $argv0] source $testdir/tester.tcl source $testdir/malloc_common.tcl set testprefix wherelfault ifcapable !update_delete_limit { finish_test return } do_execsql_test 1.0 { CREATE TABLE t1(a, b); INSERT INTO t1 VALUES(1, 'f'); INSERT INTO t1 VALUES(2, 'e'); INSERT INTO t1 VALUES(3, 'd'); INSERT INTO t1 VALUES(4, 'c'); INSERT INTO t1 VALUES(5, 'b'); INSERT INTO t1 VALUES(6, 'a'); CREATE VIEW v1 AS SELECT a,b FROM t1; CREATE TABLE log(op, a); CREATE TRIGGER v1del INSTEAD OF DELETE ON v1 BEGIN INSERT INTO log VALUES('delete', old.a); END; CREATE TRIGGER v1upd INSTEAD OF UPDATE ON v1 BEGIN INSERT INTO log VALUES('update', old.a); END; } faultsim_save_and_close do_faultsim_test 1.1 -prep { faultsim_restore_and_reopen db eval {SELECT * FROM sqlite_master} } -body { execsql { DELETE FROM v1 ORDER BY a LIMIT 3; } } -test { faultsim_test_result {0 {}} } do_faultsim_test 1.2 -prep { faultsim_restore_and_reopen db eval {SELECT * FROM sqlite_master} } -body { execsql { UPDATE v1 SET b = 555 ORDER BY a LIMIT 3 } } -test { faultsim_test_result {0 {}} } #------------------------------------------------------------------------- sqlite3 db test.db do_execsql_test 2.1.0 { CREATE TABLE t2(a, b, c, PRIMARY KEY(a, b)) WITHOUT ROWID; } faultsim_save_and_close do_faultsim_test 2.1 -prep { faultsim_restore_and_reopen db eval {SELECT * FROM sqlite_master} } -body { execsql { DELETE FROM t2 WHERE c=? ORDER BY a DESC LIMIT 10 } } -test { faultsim_test_result {0 {}} } finish_test |
Changes to test/wherelimit2.test.
︙ | ︙ | |||
235 236 237 238 239 240 241 242 243 244 245 246 | 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. # finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | 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. # do_execsql_test 5.0 { CREATE TABLE "x y"("a b" PRIMARY KEY, "c d") WITHOUT ROWID; CREATE INDEX xycd ON "x y"("c d"); INSERT INTO "x y" VALUES('a', 'a'); INSERT INTO "x y" VALUES('b', 'b'); INSERT INTO "x y" VALUES('c', 'c'); INSERT INTO "x y" VALUES('d', 'd'); INSERT INTO "x y" VALUES('e', 'a'); INSERT INTO "x y" VALUES('f', 'b'); INSERT INTO "x y" VALUES('g', 'c'); INSERT INTO "x y" VALUES('h', 'd'); } do_execsql_test 5.1 { BEGIN; DELETE FROM "x y" WHERE "c d"!='e' ORDER BY "c d" LIMIT 2 OFFSET 2; SELECT * FROM "x y" ORDER BY 1; ROLLBACK; } { a a c c d d e a g c h d } do_execsql_test 5.2 { BEGIN; UPDATE "x y" SET "c d"='e' WHERE "c d"!='e' ORDER BY "c d" LIMIT 2 OFFSET 2; SELECT * FROM "x y" ORDER BY 1; ROLLBACK; } { a a b e c c d d e a f e g c h d } proc log {args} { lappend ::log {*}$args } db func log log do_execsql_test 5.3 { CREATE VIEW "v w" AS SELECT * FROM "x y"; CREATE TRIGGER tr1 INSTEAD OF DELETE ON "v w" BEGIN SELECT log(old."a b", old."c d"); END; CREATE TRIGGER tr2 INSTEAD OF UPDATE ON "v w" BEGIN SELECT log(new."a b", new."c d"); END; } do_test 5.4 { set ::log {} execsql { DELETE FROM "v w" ORDER BY "a b" LIMIT 3 } set ::log } {a a b b c c} do_test 5.5 { set ::log {} execsql { UPDATE "v w" SET "a b" = "a b" || 'x' ORDER BY "a b" LIMIT 5; } set ::log } {ax a bx b cx c dx d ex a} finish_test |