OLD | NEW |
1 # 2008 December 15 | 1 # 2008 December 15 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
11 # | 11 # |
12 # $Id: savepoint.test,v 1.13 2009/07/18 08:30:45 danielk1977 Exp $ | 12 # $Id: savepoint.test,v 1.13 2009/07/18 08:30:45 danielk1977 Exp $ |
13 | 13 |
14 set testdir [file dirname $argv0] | 14 set testdir [file dirname $argv0] |
15 source $testdir/tester.tcl | 15 source $testdir/tester.tcl |
16 | 16 source $testdir/lock_common.tcl |
| 17 source $testdir/malloc_common.tcl |
17 | 18 |
18 #---------------------------------------------------------------------- | 19 #---------------------------------------------------------------------- |
19 # The following tests - savepoint-1.* - test that the SAVEPOINT, RELEASE | 20 # The following tests - savepoint-1.* - test that the SAVEPOINT, RELEASE |
20 # and ROLLBACK TO comands are correctly parsed, and that the auto-commit | 21 # and ROLLBACK TO comands are correctly parsed, and that the auto-commit |
21 # flag is correctly set and unset as a result. | 22 # flag is correctly set and unset as a result. |
22 # | 23 # |
23 do_test savepoint-1.1 { | 24 do_test savepoint-1.1 { |
| 25 wal_set_journal_mode |
24 execsql { | 26 execsql { |
25 SAVEPOINT sp1; | 27 SAVEPOINT sp1; |
26 RELEASE sp1; | 28 RELEASE sp1; |
27 } | 29 } |
28 } {} | 30 } {} |
29 do_test savepoint-1.2 { | 31 do_test savepoint-1.2 { |
30 execsql { | 32 execsql { |
31 SAVEPOINT sp1; | 33 SAVEPOINT sp1; |
32 ROLLBACK TO sp1; | 34 ROLLBACK TO sp1; |
33 } | 35 } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 } {1} | 88 } {1} |
87 do_test savepoint-1.5 { | 89 do_test savepoint-1.5 { |
88 execsql { | 90 execsql { |
89 SAVEPOINT sp1; | 91 SAVEPOINT sp1; |
90 ROLLBACK TO sp1; | 92 ROLLBACK TO sp1; |
91 } | 93 } |
92 } {} | 94 } {} |
93 do_test savepoint-1.6 { | 95 do_test savepoint-1.6 { |
94 execsql COMMIT | 96 execsql COMMIT |
95 } {} | 97 } {} |
| 98 wal_check_journal_mode savepoint-1.7 |
96 | 99 |
97 #------------------------------------------------------------------------ | 100 #------------------------------------------------------------------------ |
98 # These tests - savepoint-2.* - test rollbacks and releases of savepoints | 101 # These tests - savepoint-2.* - test rollbacks and releases of savepoints |
99 # with a very simple data set. | 102 # with a very simple data set. |
100 # | 103 # |
101 | 104 |
102 do_test savepoint-2.1 { | 105 do_test savepoint-2.1 { |
103 execsql { | 106 execsql { |
104 CREATE TABLE t1(a, b, c); | 107 CREATE TABLE t1(a, b, c); |
105 BEGIN; | 108 BEGIN; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 RELEASE two; | 171 RELEASE two; |
169 } | 172 } |
170 execsql { SELECT * FROM t1 } | 173 execsql { SELECT * FROM t1 } |
171 } {1 2 3 a b c d e f} | 174 } {1 2 3 a b c d e f} |
172 do_test savepoint-2.11 { | 175 do_test savepoint-2.11 { |
173 execsql { | 176 execsql { |
174 ROLLBACK; | 177 ROLLBACK; |
175 } | 178 } |
176 execsql { SELECT * FROM t1 } | 179 execsql { SELECT * FROM t1 } |
177 } {} | 180 } {} |
| 181 wal_check_journal_mode savepoint-2.12 |
178 | 182 |
179 #------------------------------------------------------------------------ | 183 #------------------------------------------------------------------------ |
180 # This block of tests - savepoint-3.* - test that when a transaction | 184 # This block of tests - savepoint-3.* - test that when a transaction |
181 # savepoint is rolled back, locks are not released from database files. | 185 # savepoint is rolled back, locks are not released from database files. |
182 # And that when a transaction savepoint is released, they are released. | 186 # And that when a transaction savepoint is released, they are released. |
| 187 # |
| 188 # These tests do not work in WAL mode. WAL mode does not take RESERVED |
| 189 # locks on the database file. |
183 # | 190 # |
184 do_test savepoint-3.1 { | 191 if {[wal_is_wal_mode]==0} { |
185 execsql { SAVEPOINT "transaction" } | 192 do_test savepoint-3.1 { |
186 execsql { PRAGMA lock_status } | 193 execsql { SAVEPOINT "transaction" } |
187 } {main unlocked temp closed} | 194 execsql { PRAGMA lock_status } |
188 | 195 } {main unlocked temp closed} |
189 do_test savepoint-3.2 { | 196 |
190 execsql { INSERT INTO t1 VALUES(1, 2, 3) } | 197 do_test savepoint-3.2 { |
191 execsql { PRAGMA lock_status } | 198 execsql { INSERT INTO t1 VALUES(1, 2, 3) } |
192 } {main reserved temp closed} | 199 execsql { PRAGMA lock_status } |
193 | 200 } {main reserved temp closed} |
194 do_test savepoint-3.3 { | 201 |
195 execsql { ROLLBACK TO "transaction" } | 202 do_test savepoint-3.3 { |
196 execsql { PRAGMA lock_status } | 203 execsql { ROLLBACK TO "transaction" } |
197 } {main reserved temp closed} | 204 execsql { PRAGMA lock_status } |
198 | 205 } {main reserved temp closed} |
199 do_test savepoint-3.4 { | 206 |
200 execsql { INSERT INTO t1 VALUES(1, 2, 3) } | 207 do_test savepoint-3.4 { |
201 execsql { PRAGMA lock_status } | 208 execsql { INSERT INTO t1 VALUES(1, 2, 3) } |
202 } {main reserved temp closed} | 209 execsql { PRAGMA lock_status } |
203 | 210 } {main reserved temp closed} |
204 do_test savepoint-3.5 { | 211 |
205 execsql { RELEASE "transaction" } | 212 do_test savepoint-3.5 { |
206 execsql { PRAGMA lock_status } | 213 execsql { RELEASE "transaction" } |
207 } {main unlocked temp closed} | 214 execsql { PRAGMA lock_status } |
| 215 } {main unlocked temp closed} |
| 216 } |
208 | 217 |
209 #------------------------------------------------------------------------ | 218 #------------------------------------------------------------------------ |
210 # Test that savepoints that include schema modifications are handled | 219 # Test that savepoints that include schema modifications are handled |
211 # correctly. Test cases savepoint-4.*. | 220 # correctly. Test cases savepoint-4.*. |
212 # | 221 # |
213 do_test savepoint-4.1 { | 222 do_test savepoint-4.1 { |
214 execsql { | 223 execsql { |
215 CREATE TABLE t2(d, e, f); | 224 CREATE TABLE t2(d, e, f); |
216 SELECT sql FROM sqlite_master; | 225 SELECT sql FROM sqlite_master; |
217 } | 226 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 execsql { | 266 execsql { |
258 ROLLBACK TO sp1; | 267 ROLLBACK TO sp1; |
259 CREATE TABLE t3(a); | 268 CREATE TABLE t3(a); |
260 INSERT INTO t3 VALUES('value'); | 269 INSERT INTO t3 VALUES('value'); |
261 } | 270 } |
262 execsql {SELECT * FROM t3} | 271 execsql {SELECT * FROM t3} |
263 } {value} | 272 } {value} |
264 do_test savepoint-4.8 { | 273 do_test savepoint-4.8 { |
265 execsql COMMIT | 274 execsql COMMIT |
266 } {} | 275 } {} |
| 276 wal_check_journal_mode savepoint-4.9 |
267 | 277 |
268 #------------------------------------------------------------------------ | 278 #------------------------------------------------------------------------ |
269 # Test some logic errors to do with the savepoint feature. | 279 # Test some logic errors to do with the savepoint feature. |
270 # | 280 # |
271 | 281 |
272 ifcapable incrblob { | 282 ifcapable incrblob { |
273 do_test savepoint-5.1.1 { | 283 do_test savepoint-5.1.1 { |
274 execsql { | 284 execsql { |
275 CREATE TABLE blobs(x); | 285 CREATE TABLE blobs(x); |
276 INSERT INTO blobs VALUES('a twentyeight character blob'); | 286 INSERT INTO blobs VALUES('a twentyeight character blob'); |
(...skipping 28 matching lines...) Expand all Loading... |
305 close $fd | 315 close $fd |
306 execsql {savepoint def} | 316 execsql {savepoint def} |
307 set fd [db incrblob blobs x 1] | 317 set fd [db incrblob blobs x 1] |
308 catchsql {release def} | 318 catchsql {release def} |
309 } {1 {cannot release savepoint - SQL statements in progress}} | 319 } {1 {cannot release savepoint - SQL statements in progress}} |
310 do_test savepoint-5.3.5 { | 320 do_test savepoint-5.3.5 { |
311 close $fd | 321 close $fd |
312 execsql {release abc} | 322 execsql {release abc} |
313 } {} | 323 } {} |
314 | 324 |
| 325 # Rollback mode: |
| 326 # |
| 327 # Open a savepoint transaction and insert a row into the database. Then, |
| 328 # using a second database handle, open a read-only transaction on the |
| 329 # database file. Check that the savepoint transaction cannot be committed |
| 330 # until after the read-only transaction has been closed. |
| 331 # |
| 332 # WAL mode: |
| 333 # |
| 334 # As above, except that the savepoint transaction can be successfully |
| 335 # committed before the read-only transaction has been closed. |
| 336 # |
315 do_test savepoint-5.4.1 { | 337 do_test savepoint-5.4.1 { |
316 execsql { | 338 execsql { |
317 SAVEPOINT main; | 339 SAVEPOINT main; |
318 INSERT INTO blobs VALUES('another blob'); | 340 INSERT INTO blobs VALUES('another blob'); |
319 } | 341 } |
320 } {} | 342 } {} |
321 do_test savepoint-5.4.2 { | 343 do_test savepoint-5.4.2 { |
322 sqlite3 db2 test.db | 344 sqlite3 db2 test.db |
323 execsql { BEGIN ; SELECT * FROM blobs } db2 | 345 execsql { BEGIN ; SELECT count(*) FROM blobs } db2 |
324 catchsql { RELEASE main } | 346 } {1} |
325 } {1 {database is locked}} | 347 if {[wal_is_wal_mode]} { |
326 do_test savepoint-5.4.3 { | 348 do_test savepoint-5.4.3 { catchsql "RELEASE main" } {0 {}} |
327 db2 close | 349 do_test savepoint-5.4.4 { db2 close } {} |
328 catchsql { RELEASE main } | 350 } else { |
329 } {0 {}} | 351 do_test savepoint-5.4.3 { |
330 do_test savepoint-5.4.4 { | 352 catchsql { RELEASE main } |
| 353 } {1 {database is locked}} |
| 354 do_test savepoint-5.4.4 { |
| 355 db2 close |
| 356 catchsql { RELEASE main } |
| 357 } {0 {}} |
| 358 } |
| 359 do_test savepoint-5.4.5 { |
331 execsql { SELECT x FROM blobs WHERE rowid = 2 } | 360 execsql { SELECT x FROM blobs WHERE rowid = 2 } |
332 } {{another blob}} | 361 } {{another blob}} |
| 362 do_test savepoint-5.4.6 { |
| 363 execsql { SELECT count(*) FROM blobs } |
| 364 } {2} |
333 } | 365 } |
| 366 wal_check_journal_mode savepoint-5.5 |
334 | 367 |
335 #------------------------------------------------------------------------- | 368 #------------------------------------------------------------------------- |
336 # The following tests, savepoint-6.*, test an incr-vacuum inside of a | 369 # The following tests, savepoint-6.*, test an incr-vacuum inside of a |
337 # couple of nested savepoints. | 370 # couple of nested savepoints. |
338 # | 371 # |
339 ifcapable {autovacuum && pragma} { | 372 ifcapable {autovacuum && pragma} { |
340 db close | 373 db close |
341 file delete -force test.db | 374 file delete -force test.db |
342 sqlite3 db test.db | 375 sqlite3 db test.db |
343 | 376 |
344 do_test savepoint-6.1 { | 377 do_test savepoint-6.1 { |
345 execsql { | 378 execsql { PRAGMA auto_vacuum = incremental } |
346 PRAGMA auto_vacuum = incremental; | 379 wal_set_journal_mode |
| 380 execsql { |
347 CREATE TABLE t1(a, b, c); | 381 CREATE TABLE t1(a, b, c); |
348 CREATE INDEX i1 ON t1(a, b); | 382 CREATE INDEX i1 ON t1(a, b); |
349 BEGIN; | 383 BEGIN; |
350 INSERT INTO t1 VALUES(randstr(10,400),randstr(10,400),randstr(10,400)); | 384 INSERT INTO t1 VALUES(randstr(10,400),randstr(10,400),randstr(10,400)); |
351 } | 385 } |
352 set r "randstr(10,400)" | 386 set r "randstr(10,400)" |
353 for {set ii 0} {$ii < 10} {incr ii} { | 387 for {set ii 0} {$ii < 10} {incr ii} { |
354 execsql "INSERT INTO t1 SELECT $r, $r, $r FROM t1" | 388 execsql "INSERT INTO t1 SELECT $r, $r, $r FROM t1" |
355 } | 389 } |
356 execsql { COMMIT } | 390 execsql { COMMIT } |
(...skipping 12 matching lines...) Expand all Loading... |
369 SAVEPOINT two; | 403 SAVEPOINT two; |
370 INSERT INTO t1 SELECT randstr(10,400), randstr(10,400), c FROM t1; | 404 INSERT INTO t1 SELECT randstr(10,400), randstr(10,400), c FROM t1; |
371 DELETE FROM t1 WHERE rowid%2; | 405 DELETE FROM t1 WHERE rowid%2; |
372 PRAGMA incr_vacuum; | 406 PRAGMA incr_vacuum; |
373 ROLLBACK TO one; | 407 ROLLBACK TO one; |
374 COMMIT; | 408 COMMIT; |
375 } | 409 } |
376 } {} | 410 } {} |
377 | 411 |
378 integrity_check savepoint-6.4 | 412 integrity_check savepoint-6.4 |
| 413 |
| 414 wal_check_journal_mode savepoint-6.5 |
379 } | 415 } |
380 | 416 |
381 #------------------------------------------------------------------------- | 417 #------------------------------------------------------------------------- |
382 # The following tests, savepoint-7.*, attempt to break the logic | 418 # The following tests, savepoint-7.*, attempt to break the logic |
383 # surrounding savepoints by growing and shrinking the database file. | 419 # surrounding savepoints by growing and shrinking the database file. |
384 # | 420 # |
385 db close | 421 db close |
386 file delete -force test.db | 422 file delete -force test.db |
387 sqlite3 db test.db | 423 sqlite3 db test.db |
388 | 424 |
389 do_test savepoint-7.1 { | 425 do_test savepoint-7.1 { |
| 426 execsql { PRAGMA auto_vacuum = incremental } |
| 427 wal_set_journal_mode |
390 execsql { | 428 execsql { |
391 PRAGMA auto_vacuum = incremental; | |
392 PRAGMA cache_size = 10; | 429 PRAGMA cache_size = 10; |
393 BEGIN; | 430 BEGIN; |
394 CREATE TABLE t1(a PRIMARY KEY, b); | 431 CREATE TABLE t1(a PRIMARY KEY, b); |
395 INSERT INTO t1(a) VALUES('alligator'); | 432 INSERT INTO t1(a) VALUES('alligator'); |
396 INSERT INTO t1(a) VALUES('angelfish'); | 433 INSERT INTO t1(a) VALUES('angelfish'); |
397 INSERT INTO t1(a) VALUES('ant'); | 434 INSERT INTO t1(a) VALUES('ant'); |
398 INSERT INTO t1(a) VALUES('antelope'); | 435 INSERT INTO t1(a) VALUES('antelope'); |
399 INSERT INTO t1(a) VALUES('ape'); | 436 INSERT INTO t1(a) VALUES('ape'); |
400 INSERT INTO t1(a) VALUES('baboon'); | 437 INSERT INTO t1(a) VALUES('baboon'); |
401 INSERT INTO t1(a) VALUES('badger'); | 438 INSERT INTO t1(a) VALUES('badger'); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 SAVEPOINT one; | 479 SAVEPOINT one; |
443 DELETE FROM t2; | 480 DELETE FROM t2; |
444 PRAGMA incremental_vacuum; | 481 PRAGMA incremental_vacuum; |
445 SAVEPOINT two; | 482 SAVEPOINT two; |
446 INSERT INTO t2 SELECT a, b FROM t1; | 483 INSERT INTO t2 SELECT a, b FROM t1; |
447 ROLLBACK TO two; | 484 ROLLBACK TO two; |
448 COMMIT; | 485 COMMIT; |
449 } | 486 } |
450 execsql { PRAGMA integrity_check } | 487 execsql { PRAGMA integrity_check } |
451 } {ok} | 488 } {ok} |
| 489 wal_check_journal_mode savepoint-7.3.3 |
452 | 490 |
453 do_test savepoint-7.4.1 { | 491 do_test savepoint-7.4.1 { |
454 db close | 492 db close |
455 file delete -force test.db | 493 file delete -force test.db |
456 sqlite3 db test.db | 494 sqlite3 db test.db |
| 495 execsql { PRAGMA auto_vacuum = incremental } |
| 496 wal_set_journal_mode |
457 execsql { | 497 execsql { |
458 PRAGMA auto_vacuum = incremental; | |
459 CREATE TABLE t1(a, b, PRIMARY KEY(a, b)); | 498 CREATE TABLE t1(a, b, PRIMARY KEY(a, b)); |
460 INSERT INTO t1 VALUES(randstr(1000,1000), randstr(1000,1000)); | 499 INSERT INTO t1 VALUES(randstr(1000,1000), randstr(1000,1000)); |
461 BEGIN; | 500 BEGIN; |
462 DELETE FROM t1; | 501 DELETE FROM t1; |
463 SAVEPOINT one; | 502 SAVEPOINT one; |
464 PRAGMA incremental_vacuum; | 503 PRAGMA incremental_vacuum; |
465 ROLLBACK TO one; | 504 ROLLBACK TO one; |
466 COMMIT; | 505 COMMIT; |
467 } | 506 } |
468 | 507 |
(...skipping 21 matching lines...) Expand all Loading... |
490 ROLLBACK TO one; | 529 ROLLBACK TO one; |
491 COMMIT; | 530 COMMIT; |
492 PRAGMA integrity_check; | 531 PRAGMA integrity_check; |
493 } | 532 } |
494 } {ok} | 533 } {ok} |
495 do_test savepoint-7.5.2 { | 534 do_test savepoint-7.5.2 { |
496 execsql { | 535 execsql { |
497 DROP TABLE t5; | 536 DROP TABLE t5; |
498 } | 537 } |
499 } {} | 538 } {} |
| 539 wal_check_journal_mode savepoint-7.5.3 |
500 | 540 |
501 # Test oddly named and quoted savepoints. | 541 # Test oddly named and quoted savepoints. |
502 # | 542 # |
503 do_test savepoint-8-1 { | 543 do_test savepoint-8-1 { |
504 execsql { SAVEPOINT "save1" } | 544 execsql { SAVEPOINT "save1" } |
505 execsql { RELEASE save1 } | 545 execsql { RELEASE save1 } |
506 } {} | 546 } {} |
507 do_test savepoint-8-2 { | 547 do_test savepoint-8-2 { |
508 execsql { SAVEPOINT "Including whitespace " } | 548 execsql { SAVEPOINT "Including whitespace " } |
509 execsql { RELEASE "including Whitespace " } | 549 execsql { RELEASE "including Whitespace " } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 } | 631 } |
592 } {} | 632 } {} |
593 | 633 |
594 # The lock state of the TEMP database can vary if SQLITE_TEMP_STORE=3 | 634 # The lock state of the TEMP database can vary if SQLITE_TEMP_STORE=3 |
595 # And the following set of tests is only really interested in the status | 635 # And the following set of tests is only really interested in the status |
596 # of the aux1 and aux2 locks. So record the current lock status of | 636 # of the aux1 and aux2 locks. So record the current lock status of |
597 # TEMP for use in the answers. | 637 # TEMP for use in the answers. |
598 set templockstate [lindex [db eval {PRAGMA lock_status}] 3] | 638 set templockstate [lindex [db eval {PRAGMA lock_status}] 3] |
599 | 639 |
600 | 640 |
601 do_test savepoint-10.2.1 { | 641 if {[wal_is_wal_mode]==0} { |
602 file delete -force test3.db | 642 do_test savepoint-10.2.1 { |
603 file delete -force test2.db | 643 file delete -force test3.db |
604 execsql { | 644 file delete -force test2.db |
605 ATTACH 'test2.db' AS aux1; | 645 execsql { |
606 ATTACH 'test3.db' AS aux2; | 646 ATTACH 'test2.db' AS aux1; |
607 DROP TABLE t1; | 647 ATTACH 'test3.db' AS aux2; |
608 CREATE TABLE main.t1(x, y); | 648 DROP TABLE t1; |
609 CREATE TABLE aux1.t2(x, y); | 649 CREATE TABLE main.t1(x, y); |
610 CREATE TABLE aux2.t3(x, y); | 650 CREATE TABLE aux1.t2(x, y); |
611 SELECT name FROM sqlite_master | 651 CREATE TABLE aux2.t3(x, y); |
612 UNION ALL | 652 SELECT name FROM sqlite_master |
613 SELECT name FROM aux1.sqlite_master | 653 UNION ALL |
614 UNION ALL | 654 SELECT name FROM aux1.sqlite_master |
615 SELECT name FROM aux2.sqlite_master; | 655 UNION ALL |
616 } | 656 SELECT name FROM aux2.sqlite_master; |
617 } {t1 t2 t3} | 657 } |
618 do_test savepoint-10.2.2 { | 658 } {t1 t2 t3} |
619 execsql { PRAGMA lock_status } | 659 do_test savepoint-10.2.2 { |
620 } [list main unlocked temp $templockstate aux1 unlocked aux2 unlocked] | 660 execsql { PRAGMA lock_status } |
621 | 661 } [list main unlocked temp $templockstate aux1 unlocked aux2 unlocked] |
622 do_test savepoint-10.2.3 { | 662 |
623 execsql { | 663 do_test savepoint-10.2.3 { |
624 SAVEPOINT one; | 664 execsql { |
625 INSERT INTO t1 VALUES(1, 2); | 665 SAVEPOINT one; |
626 PRAGMA lock_status; | 666 INSERT INTO t1 VALUES(1, 2); |
627 } | 667 PRAGMA lock_status; |
628 } [list main reserved temp $templockstate aux1 unlocked aux2 unlocked] | 668 } |
629 do_test savepoint-10.2.4 { | 669 } [list main reserved temp $templockstate aux1 unlocked aux2 unlocked] |
630 execsql { | 670 do_test savepoint-10.2.4 { |
631 INSERT INTO t3 VALUES(3, 4); | 671 execsql { |
632 PRAGMA lock_status; | 672 INSERT INTO t3 VALUES(3, 4); |
633 } | 673 PRAGMA lock_status; |
634 } [list main reserved temp $templockstate aux1 unlocked aux2 reserved] | 674 } |
635 do_test savepoint-10.2.5 { | 675 } [list main reserved temp $templockstate aux1 unlocked aux2 reserved] |
636 execsql { | 676 do_test savepoint-10.2.5 { |
637 SAVEPOINT two; | 677 execsql { |
638 INSERT INTO t2 VALUES(5, 6); | |
639 PRAGMA lock_status; | |
640 } | |
641 } [list main reserved temp $templockstate aux1 reserved aux2 reserved] | |
642 do_test savepoint-10.2.6 { | |
643 execsql { SELECT * FROM t2 } | |
644 } {5 6} | |
645 do_test savepoint-10.2.7 { | |
646 execsql { ROLLBACK TO two } | |
647 execsql { SELECT * FROM t2 } | |
648 } {} | |
649 do_test savepoint-10.2.8 { | |
650 execsql { PRAGMA lock_status } | |
651 } [list main reserved temp $templockstate aux1 reserved aux2 reserved] | |
652 do_test savepoint-10.2.9 { | |
653 execsql { SELECT 'a', * FROM t1 UNION ALL SELECT 'b', * FROM t3 } | |
654 } {a 1 2 b 3 4} | |
655 do_test savepoint-10.2.9 { | |
656 execsql { | |
657 INSERT INTO t2 VALUES(5, 6); | |
658 RELEASE one; | |
659 } | |
660 execsql { | |
661 SELECT * FROM t1; | |
662 SELECT * FROM t2; | |
663 SELECT * FROM t3; | |
664 } | |
665 } {1 2 5 6 3 4} | |
666 do_test savepoint-10.2.9 { | |
667 execsql { PRAGMA lock_status } | |
668 } [list main unlocked temp $templockstate aux1 unlocked aux2 unlocked] | |
669 | |
670 do_test savepoint-10.2.10 { | |
671 execsql { | |
672 SAVEPOINT one; | |
673 INSERT INTO t1 VALUES('a', 'b'); | |
674 SAVEPOINT two; | 678 SAVEPOINT two; |
675 INSERT INTO t2 VALUES('c', 'd'); | 679 INSERT INTO t2 VALUES(5, 6); |
676 SAVEPOINT three; | 680 PRAGMA lock_status; |
677 INSERT INTO t3 VALUES('e', 'f'); | 681 } |
678 } | 682 } [list main reserved temp $templockstate aux1 reserved aux2 reserved] |
679 execsql { | 683 do_test savepoint-10.2.6 { |
680 SELECT * FROM t1; | 684 execsql { SELECT * FROM t2 } |
681 SELECT * FROM t2; | 685 } {5 6} |
682 SELECT * FROM t3; | 686 do_test savepoint-10.2.7 { |
683 } | 687 execsql { ROLLBACK TO two } |
684 } {1 2 a b 5 6 c d 3 4 e f} | 688 execsql { SELECT * FROM t2 } |
685 do_test savepoint-10.2.11 { | 689 } {} |
686 execsql { ROLLBACK TO two } | 690 do_test savepoint-10.2.8 { |
687 execsql { | 691 execsql { PRAGMA lock_status } |
688 SELECT * FROM t1; | 692 } [list main reserved temp $templockstate aux1 reserved aux2 reserved] |
689 SELECT * FROM t2; | 693 do_test savepoint-10.2.9 { |
690 SELECT * FROM t3; | 694 execsql { SELECT 'a', * FROM t1 UNION ALL SELECT 'b', * FROM t3 } |
691 } | 695 } {a 1 2 b 3 4} |
692 } {1 2 a b 5 6 3 4} | 696 do_test savepoint-10.2.9 { |
693 do_test savepoint-10.2.12 { | 697 execsql { |
694 execsql { | 698 INSERT INTO t2 VALUES(5, 6); |
695 INSERT INTO t3 VALUES('g', 'h'); | 699 RELEASE one; |
696 ROLLBACK TO two; | 700 } |
697 } | 701 execsql { |
698 execsql { | 702 SELECT * FROM t1; |
699 SELECT * FROM t1; | 703 SELECT * FROM t2; |
700 SELECT * FROM t2; | 704 SELECT * FROM t3; |
701 SELECT * FROM t3; | 705 } |
702 } | 706 } {1 2 5 6 3 4} |
703 } {1 2 a b 5 6 3 4} | 707 do_test savepoint-10.2.9 { |
704 do_test savepoint-10.2.13 { | 708 execsql { PRAGMA lock_status } |
705 execsql { ROLLBACK } | 709 } [list main unlocked temp $templockstate aux1 unlocked aux2 unlocked] |
706 execsql { | 710 |
707 SELECT * FROM t1; | 711 do_test savepoint-10.2.10 { |
708 SELECT * FROM t2; | 712 execsql { |
709 SELECT * FROM t3; | 713 SAVEPOINT one; |
710 } | 714 INSERT INTO t1 VALUES('a', 'b'); |
711 } {1 2 5 6 3 4} | 715 SAVEPOINT two; |
712 do_test savepoint-10.2.14 { | 716 INSERT INTO t2 VALUES('c', 'd'); |
713 execsql { PRAGMA lock_status } | 717 SAVEPOINT three; |
714 } [list main unlocked temp $templockstate aux1 unlocked aux2 unlocked] | 718 INSERT INTO t3 VALUES('e', 'f'); |
| 719 } |
| 720 execsql { |
| 721 SELECT * FROM t1; |
| 722 SELECT * FROM t2; |
| 723 SELECT * FROM t3; |
| 724 } |
| 725 } {1 2 a b 5 6 c d 3 4 e f} |
| 726 do_test savepoint-10.2.11 { |
| 727 execsql { ROLLBACK TO two } |
| 728 execsql { |
| 729 SELECT * FROM t1; |
| 730 SELECT * FROM t2; |
| 731 SELECT * FROM t3; |
| 732 } |
| 733 } {1 2 a b 5 6 3 4} |
| 734 do_test savepoint-10.2.12 { |
| 735 execsql { |
| 736 INSERT INTO t3 VALUES('g', 'h'); |
| 737 ROLLBACK TO two; |
| 738 } |
| 739 execsql { |
| 740 SELECT * FROM t1; |
| 741 SELECT * FROM t2; |
| 742 SELECT * FROM t3; |
| 743 } |
| 744 } {1 2 a b 5 6 3 4} |
| 745 do_test savepoint-10.2.13 { |
| 746 execsql { ROLLBACK } |
| 747 execsql { |
| 748 SELECT * FROM t1; |
| 749 SELECT * FROM t2; |
| 750 SELECT * FROM t3; |
| 751 } |
| 752 } {1 2 5 6 3 4} |
| 753 do_test savepoint-10.2.14 { |
| 754 execsql { PRAGMA lock_status } |
| 755 } [list main unlocked temp $templockstate aux1 unlocked aux2 unlocked] |
| 756 } |
715 | 757 |
716 #------------------------------------------------------------------------- | 758 #------------------------------------------------------------------------- |
717 # The following tests - savepoint-11.* - test the interaction of | 759 # The following tests - savepoint-11.* - test the interaction of |
718 # savepoints and creating or dropping tables and indexes in | 760 # savepoints and creating or dropping tables and indexes in |
719 # auto-vacuum mode. | 761 # auto-vacuum mode. |
720 # | 762 # |
721 do_test savepoint-11.1 { | 763 do_test savepoint-11.1 { |
722 db close | 764 db close |
723 file delete -force test.db | 765 file delete -force test.db |
724 sqlite3 db test.db | 766 sqlite3 db test.db |
| 767 execsql { PRAGMA auto_vacuum = full; } |
| 768 wal_set_journal_mode |
725 execsql { | 769 execsql { |
726 PRAGMA auto_vacuum = full; | |
727 CREATE TABLE t1(a, b, UNIQUE(a, b)); | 770 CREATE TABLE t1(a, b, UNIQUE(a, b)); |
728 INSERT INTO t1 VALUES(1, randstr(1000,1000)); | 771 INSERT INTO t1 VALUES(1, randstr(1000,1000)); |
729 INSERT INTO t1 VALUES(2, randstr(1000,1000)); | 772 INSERT INTO t1 VALUES(2, randstr(1000,1000)); |
730 } | 773 } |
731 } {} | 774 } {} |
732 do_test savepoint-11.2 { | 775 do_test savepoint-11.2 { |
733 execsql { | 776 execsql { |
734 SAVEPOINT one; | 777 SAVEPOINT one; |
735 CREATE TABLE t2(a, b, UNIQUE(a, b)); | 778 CREATE TABLE t2(a, b, UNIQUE(a, b)); |
736 SAVEPOINT two; | 779 SAVEPOINT two; |
737 CREATE TABLE t3(a, b, UNIQUE(a, b)); | 780 CREATE TABLE t3(a, b, UNIQUE(a, b)); |
738 } | 781 } |
739 } {} | 782 } {} |
740 integrity_check savepoint-11.3 | 783 integrity_check savepoint-11.3 |
741 do_test savepoint-11.4 { | 784 do_test savepoint-11.4 { |
742 execsql { ROLLBACK TO two } | 785 execsql { ROLLBACK TO two } |
743 } {} | 786 } {} |
744 integrity_check savepoint-11.5 | 787 integrity_check savepoint-11.5 |
745 do_test savepoint-11.6 { | 788 do_test savepoint-11.6 { |
746 execsql { | 789 execsql { |
747 CREATE TABLE t3(a, b, UNIQUE(a, b)); | 790 CREATE TABLE t3(a, b, UNIQUE(a, b)); |
748 ROLLBACK TO one; | 791 ROLLBACK TO one; |
749 } | 792 } |
750 } {} | 793 } {} |
751 integrity_check savepoint-11.7 | 794 integrity_check savepoint-11.7 |
752 do_test savepoint-11.8 { | 795 do_test savepoint-11.8 { |
753 execsql { ROLLBACK } | 796 execsql { ROLLBACK } |
| 797 execsql { PRAGMA wal_checkpoint } |
754 file size test.db | 798 file size test.db |
755 } {8192} | 799 } {8192} |
756 | 800 |
757 | |
758 do_test savepoint-11.9 { | 801 do_test savepoint-11.9 { |
759 execsql { | 802 execsql { |
760 DROP TABLE IF EXISTS t1; | 803 DROP TABLE IF EXISTS t1; |
761 DROP TABLE IF EXISTS t2; | 804 DROP TABLE IF EXISTS t2; |
762 DROP TABLE IF EXISTS t3; | 805 DROP TABLE IF EXISTS t3; |
763 } | 806 } |
764 } {} | 807 } {} |
765 do_test savepoint-11.10 { | 808 do_test savepoint-11.10 { |
766 execsql { | 809 execsql { |
767 BEGIN; | 810 BEGIN; |
768 CREATE TABLE t1(a, b); | 811 CREATE TABLE t1(a, b); |
769 CREATE TABLE t2(x, y); | 812 CREATE TABLE t2(x, y); |
770 INSERT INTO t2 VALUES(1, 2); | 813 INSERT INTO t2 VALUES(1, 2); |
771 SAVEPOINT one; | 814 SAVEPOINT one; |
772 INSERT INTO t2 VALUES(3, 4); | 815 INSERT INTO t2 VALUES(3, 4); |
773 SAVEPOINT two; | 816 SAVEPOINT two; |
774 DROP TABLE t1; | 817 DROP TABLE t1; |
775 ROLLBACK TO two; | 818 ROLLBACK TO two; |
776 } | 819 } |
777 execsql {SELECT * FROM t2} | 820 execsql {SELECT * FROM t2} |
778 } {1 2 3 4} | 821 } {1 2 3 4} |
779 do_test savepoint-11.11 { | 822 do_test savepoint-11.11 { |
780 execsql COMMIT | 823 execsql COMMIT |
781 } {} | 824 } {} |
782 do_test savepoint-11.12 { | 825 do_test savepoint-11.12 { |
783 execsql {SELECT * FROM t2} | 826 execsql {SELECT * FROM t2} |
784 } {1 2 3 4} | 827 } {1 2 3 4} |
| 828 wal_check_journal_mode savepoint-11.13 |
785 | 829 |
786 #------------------------------------------------------------------------- | 830 #------------------------------------------------------------------------- |
787 # The following tests - savepoint-12.* - test the interaction of | 831 # The following tests - savepoint-12.* - test the interaction of |
788 # savepoints and "ON CONFLICT ROLLBACK" clauses. | 832 # savepoints and "ON CONFLICT ROLLBACK" clauses. |
789 # | 833 # |
790 do_test savepoint-12.1 { | 834 do_test savepoint-12.1 { |
791 execsql { | 835 execsql { |
792 CREATE TABLE t4(a PRIMARY KEY, b); | 836 CREATE TABLE t4(a PRIMARY KEY, b); |
793 INSERT INTO t4 VALUES(1, 'one'); | 837 INSERT INTO t4 VALUES(1, 'one'); |
794 } | 838 } |
(...skipping 13 matching lines...) Expand all Loading... |
808 SAVEPOINT sp2; | 852 SAVEPOINT sp2; |
809 INSERT OR ROLLBACK INTO t4 VALUES(1, 'one'); | 853 INSERT OR ROLLBACK INTO t4 VALUES(1, 'one'); |
810 } | 854 } |
811 } {1 {column a is not unique}} | 855 } {1 {column a is not unique}} |
812 do_test savepoint-12.3 { | 856 do_test savepoint-12.3 { |
813 sqlite3_get_autocommit db | 857 sqlite3_get_autocommit db |
814 } {1} | 858 } {1} |
815 do_test savepoint-12.4 { | 859 do_test savepoint-12.4 { |
816 execsql { SAVEPOINT one } | 860 execsql { SAVEPOINT one } |
817 } {} | 861 } {} |
| 862 wal_check_journal_mode savepoint-12.5 |
818 | 863 |
819 #------------------------------------------------------------------------- | 864 #------------------------------------------------------------------------- |
820 # The following tests - savepoint-13.* - test the interaction of | 865 # The following tests - savepoint-13.* - test the interaction of |
821 # savepoints and "journal_mode = off". | 866 # savepoints and "journal_mode = off". |
822 # | 867 # |
823 do_test savepoint-13.1 { | 868 if {[wal_is_wal_mode]==0} { |
824 db close | 869 do_test savepoint-13.1 { |
825 catch {file delete -force test.db} | 870 db close |
826 sqlite3 db test.db | 871 catch {file delete -force test.db} |
827 execsql { | 872 sqlite3 db test.db |
828 BEGIN; | 873 execsql { |
829 CREATE TABLE t1(a PRIMARY KEY, b); | 874 BEGIN; |
830 INSERT INTO t1 VALUES(1, 2); | 875 CREATE TABLE t1(a PRIMARY KEY, b); |
831 COMMIT; | 876 INSERT INTO t1 VALUES(1, 2); |
832 PRAGMA journal_mode = off; | 877 COMMIT; |
833 } | 878 PRAGMA journal_mode = off; |
834 } {off} | 879 } |
835 do_test savepoint-13.2 { | 880 } {off} |
836 execsql { | 881 do_test savepoint-13.2 { |
837 BEGIN; | 882 execsql { |
838 INSERT INTO t1 VALUES(3, 4); | 883 BEGIN; |
839 INSERT INTO t1 SELECT a+4,b+4 FROM t1; | 884 INSERT INTO t1 VALUES(3, 4); |
840 COMMIT; | 885 INSERT INTO t1 SELECT a+4,b+4 FROM t1; |
841 } | 886 COMMIT; |
| 887 } |
| 888 } {} |
| 889 do_test savepoint-13.3 { |
| 890 execsql { |
| 891 BEGIN; |
| 892 INSERT INTO t1 VALUES(9, 10); |
| 893 SAVEPOINT s1; |
| 894 INSERT INTO t1 VALUES(11, 12); |
| 895 COMMIT; |
| 896 } |
| 897 } {} |
| 898 do_test savepoint-13.4 { |
| 899 execsql { |
| 900 BEGIN; |
| 901 INSERT INTO t1 VALUES(13, 14); |
| 902 SAVEPOINT s1; |
| 903 INSERT INTO t1 VALUES(15, 16); |
| 904 ROLLBACK TO s1; |
| 905 ROLLBACK; |
| 906 SELECT * FROM t1; |
| 907 } |
| 908 } {1 2 3 4 5 6 7 8 9 10 11 12} |
| 909 } |
| 910 |
| 911 db close |
| 912 file delete test.db |
| 913 do_multiclient_test tn { |
| 914 do_test savepoint-14.$tn.1 { |
| 915 sql1 { |
| 916 CREATE TABLE foo(x); |
| 917 INSERT INTO foo VALUES(1); |
| 918 INSERT INTO foo VALUES(2); |
| 919 } |
| 920 sql2 { |
| 921 BEGIN; |
| 922 SELECT * FROM foo; |
| 923 } |
| 924 } {1 2} |
| 925 do_test savepoint-14.$tn.2 { |
| 926 sql1 { |
| 927 SAVEPOINT one; |
| 928 INSERT INTO foo VALUES(1); |
| 929 } |
| 930 csql1 { RELEASE one } |
| 931 } {1 {database is locked}} |
| 932 do_test savepoint-14.$tn.3 { |
| 933 sql1 { ROLLBACK TO one } |
| 934 sql2 { COMMIT } |
| 935 sql1 { RELEASE one } |
| 936 } {} |
| 937 |
| 938 do_test savepoint-14.$tn.4 { |
| 939 sql2 { |
| 940 BEGIN; |
| 941 SELECT * FROM foo; |
| 942 } |
| 943 } {1 2} |
| 944 do_test savepoint-14.$tn.5 { |
| 945 sql1 { |
| 946 SAVEPOINT one; |
| 947 INSERT INTO foo VALUES(1); |
| 948 } |
| 949 csql1 { RELEASE one } |
| 950 } {1 {database is locked}} |
| 951 do_test savepoint-14.$tn.6 { |
| 952 sql2 { COMMIT } |
| 953 sql1 { |
| 954 ROLLBACK TO one; |
| 955 INSERT INTO foo VALUES(3); |
| 956 INSERT INTO foo VALUES(4); |
| 957 INSERT INTO foo VALUES(5); |
| 958 RELEASE one; |
| 959 } |
| 960 } {} |
| 961 do_test savepoint-14.$tn.7 { |
| 962 sql2 { CREATE INDEX fooidx ON foo(x); } |
| 963 sql3 { PRAGMA integrity_check } |
| 964 } {ok} |
| 965 } |
| 966 |
| 967 do_multiclient_test tn { |
| 968 do_test savepoint-15.$tn.1 { |
| 969 sql1 { |
| 970 CREATE TABLE foo(x); |
| 971 INSERT INTO foo VALUES(1); |
| 972 INSERT INTO foo VALUES(2); |
| 973 } |
| 974 sql2 { BEGIN; SELECT * FROM foo; } |
| 975 } {1 2} |
| 976 do_test savepoint-15.$tn.2 { |
| 977 sql1 { |
| 978 PRAGMA locking_mode = EXCLUSIVE; |
| 979 BEGIN; |
| 980 INSERT INTO foo VALUES(3); |
| 981 } |
| 982 csql1 { COMMIT } |
| 983 } {1 {database is locked}} |
| 984 do_test savepoint-15.$tn.3 { |
| 985 sql1 { ROLLBACK } |
| 986 sql2 { COMMIT } |
| 987 sql1 { |
| 988 INSERT INTO foo VALUES(3); |
| 989 PRAGMA locking_mode = NORMAL; |
| 990 INSERT INTO foo VALUES(4); |
| 991 } |
| 992 sql2 { CREATE INDEX fooidx ON foo(x); } |
| 993 sql3 { PRAGMA integrity_check } |
| 994 } {ok} |
| 995 } |
| 996 |
| 997 do_multiclient_test tn { |
| 998 do_test savepoint-16.$tn.1 { |
| 999 sql1 { |
| 1000 CREATE TABLE foo(x); |
| 1001 INSERT INTO foo VALUES(1); |
| 1002 INSERT INTO foo VALUES(2); |
| 1003 } |
| 1004 } {} |
| 1005 do_test savepoint-16.$tn.2 { |
| 1006 |
| 1007 db eval {SELECT * FROM foo} { |
| 1008 sql1 { INSERT INTO foo VALUES(3) } |
| 1009 sql2 { SELECT * FROM foo } |
| 1010 sql1 { INSERT INTO foo VALUES(4) } |
| 1011 break |
| 1012 } |
| 1013 |
| 1014 sql2 { CREATE INDEX fooidx ON foo(x); } |
| 1015 sql3 { PRAGMA integrity_check } |
| 1016 } {ok} |
| 1017 do_test savepoint-16.$tn.3 { |
| 1018 sql1 { SELECT * FROM foo } |
| 1019 } {1 2 3 4} |
| 1020 } |
| 1021 |
| 1022 #------------------------------------------------------------------------- |
| 1023 # This next block of tests verifies that a problem reported on the mailing |
| 1024 # list has been resolved. At one point the second "CREATE TABLE t6" would |
| 1025 # fail as table t6 still existed in the internal cache of the db schema |
| 1026 # (even though it had been removed from the database by the ROLLBACK |
| 1027 # command). |
| 1028 # |
| 1029 sqlite3 db test.db |
| 1030 do_execsql_test savepoint-17.1 { |
| 1031 BEGIN; |
| 1032 CREATE TABLE t6(a, b); |
| 1033 INSERT INTO t6 VALUES(1, 2); |
| 1034 SAVEPOINT one; |
| 1035 INSERT INTO t6 VALUES(3, 4); |
| 1036 ROLLBACK TO one; |
| 1037 SELECT * FROM t6; |
| 1038 ROLLBACK; |
| 1039 } {1 2} |
| 1040 |
| 1041 do_execsql_test savepoint-17.2 { |
| 1042 CREATE TABLE t6(a, b); |
842 } {} | 1043 } {} |
843 do_test savepoint-13.3 { | |
844 execsql { | |
845 BEGIN; | |
846 INSERT INTO t1 VALUES(9, 10); | |
847 SAVEPOINT s1; | |
848 INSERT INTO t1 VALUES(11, 12); | |
849 COMMIT; | |
850 } | |
851 } {} | |
852 do_test savepoint-13.4 { | |
853 execsql { | |
854 BEGIN; | |
855 INSERT INTO t1 VALUES(13, 14); | |
856 SAVEPOINT s1; | |
857 INSERT INTO t1 VALUES(15, 16); | |
858 ROLLBACK TO s1; | |
859 ROLLBACK; | |
860 SELECT * FROM t1; | |
861 } | |
862 } {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16} | |
863 | 1044 |
864 finish_test | 1045 finish_test |
OLD | NEW |