OLD | NEW |
1 # 2010 April 13 | 1 # 2010 April 13 |
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 #*********************************************************************** |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 128*/ | 54 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 128*/ |
55 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 256 */ | 55 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 256 */ |
56 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 512 */ | 56 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 512 */ |
57 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 1024 */ | 57 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 1024 */ |
58 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 2048 */ | 58 INSERT INTO t1 SELECT a_string(800) FROM t1; /* 2048 */ |
59 INSERT INTO t1 SELECT a_string(800) FROM t1 LIMIT 1970; /* 4018 */ | 59 INSERT INTO t1 SELECT a_string(800) FROM t1 LIMIT 1970; /* 4018 */ |
60 COMMIT; | 60 COMMIT; |
61 PRAGMA cache_size = 10; | 61 PRAGMA cache_size = 10; |
62 } | 62 } |
63 set x [wal_frame_count test.db-wal 1024] | 63 set x [wal_frame_count test.db-wal 1024] |
64 if {$::G(perm:name)=="memsubsys1"} { | 64 if {[permutation]=="memsubsys1"} { |
65 if {$x==4251 || $x==4290} {set x 4056} | 65 if {$x==4251 || $x==4290} {set x 4056} |
66 } | 66 } |
67 set x | 67 set x |
68 } 4056 | 68 } 4056 |
69 | 69 |
70 for {set i 1} {$i < 50} {incr i} { | 70 for {set i 1} {$i < 50} {incr i} { |
71 | 71 |
72 do_test wal3-1.$i.1 { | 72 do_test wal3-1.$i.1 { |
73 set str [a_string 800] | 73 set str [a_string 800] |
74 execsql { UPDATE t1 SET x = $str WHERE rowid = $i } | 74 execsql { UPDATE t1 SET x = $str WHERE rowid = $i } |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 } | 213 } |
214 do_test wal3-3.$tn { | 214 do_test wal3-3.$tn { |
215 forcedelete test.db test.db-wal test.db-journal | 215 forcedelete test.db test.db-wal test.db-journal |
216 | 216 |
217 testvfs T | 217 testvfs T |
218 T filter {} | 218 T filter {} |
219 T script sync_counter | 219 T script sync_counter |
220 sqlite3 db test.db -vfs T | 220 sqlite3 db test.db -vfs T |
221 | 221 |
222 execsql "PRAGMA synchronous = $syncmode" | 222 execsql "PRAGMA synchronous = $syncmode" |
| 223 execsql "PRAGMA checkpoint_fullfsync = 0" |
223 execsql { PRAGMA journal_mode = WAL } | 224 execsql { PRAGMA journal_mode = WAL } |
224 execsql { CREATE TABLE filler(a,b,c); } | 225 execsql { CREATE TABLE filler(a,b,c); } |
225 | 226 |
226 set ::syncs [list] | 227 set ::syncs [list] |
227 T filter xSync | 228 T filter xSync |
228 execsql { | 229 execsql { |
229 CREATE TABLE x(y); | 230 CREATE TABLE x(y); |
230 INSERT INTO x VALUES('z'); | 231 INSERT INTO x VALUES('z'); |
231 PRAGMA wal_checkpoint; | 232 PRAGMA wal_checkpoint; |
232 } | 233 } |
233 T filter {} | 234 T filter {} |
234 set ::syncs | 235 set ::syncs |
235 } $synccount | 236 } $synccount |
236 | 237 |
237 db close | 238 db close |
238 T delete | 239 T delete |
239 } | 240 } |
240 | 241 |
241 #------------------------------------------------------------------------- | |
242 # When recovering the contents of a WAL file, a process obtains the WRITER | |
243 # lock, then locks all other bytes before commencing recovery. If it fails | |
244 # to lock all other bytes (because some other process is holding a read | |
245 # lock) it should retry up to 100 times. Then return SQLITE_PROTOCOL to the | |
246 # caller. Test this (test case wal3-4.3). | |
247 # | |
248 # Also test the effect of hitting an SQLITE_BUSY while attempting to obtain | |
249 # the WRITER lock (should be the same). Test case wal3-4.4. | |
250 # | |
251 proc lock_callback {method filename handle lock} { | |
252 lappend ::locks $lock | |
253 } | |
254 do_test wal3-4.1 { | |
255 testvfs T | |
256 T filter xShmLock | |
257 T script lock_callback | |
258 set ::locks [list] | |
259 sqlite3 db test.db -vfs T | |
260 execsql { SELECT * FROM x } | |
261 lrange $::locks 0 3 | |
262 } [list {0 1 lock exclusive} {1 7 lock exclusive} \ | |
263 {1 7 unlock exclusive} {0 1 unlock exclusive} \ | |
264 ] | |
265 do_test wal3-4.2 { | |
266 db close | |
267 set ::locks [list] | |
268 sqlite3 db test.db -vfs T | |
269 execsql { SELECT * FROM x } | |
270 lrange $::locks 0 3 | |
271 } [list {0 1 lock exclusive} {1 7 lock exclusive} \ | |
272 {1 7 unlock exclusive} {0 1 unlock exclusive} \ | |
273 ] | |
274 proc lock_callback {method filename handle lock} { | |
275 if {$lock == "1 7 lock exclusive"} { return SQLITE_BUSY } | |
276 return SQLITE_OK | |
277 } | |
278 puts "# Warning: This next test case causes SQLite to call xSleep(1) 100 times." | |
279 puts "# Normally this equates to a 100ms delay, but if SQLite is built on unix" | |
280 puts "# without HAVE_USLEEP defined, it may be 100 seconds." | |
281 do_test wal3-4.3 { | |
282 db close | |
283 set ::locks [list] | |
284 sqlite3 db test.db -vfs T | |
285 catchsql { SELECT * FROM x } | |
286 } {1 {locking protocol}} | |
287 | |
288 puts "# Warning: Same again!" | |
289 proc lock_callback {method filename handle lock} { | |
290 if {$lock == "0 1 lock exclusive"} { return SQLITE_BUSY } | |
291 return SQLITE_OK | |
292 } | |
293 do_test wal3-4.4 { | |
294 db close | |
295 set ::locks [list] | |
296 sqlite3 db test.db -vfs T | |
297 catchsql { SELECT * FROM x } | |
298 } {1 {locking protocol}} | |
299 db close | |
300 T delete | |
301 | |
302 | 242 |
303 #------------------------------------------------------------------------- | 243 #------------------------------------------------------------------------- |
304 # Only one client may run recovery at a time. Test this mechanism. | 244 # Only one client may run recovery at a time. Test this mechanism. |
305 # | 245 # |
306 # When client-2 tries to open a read transaction while client-1 is | 246 # When client-2 tries to open a read transaction while client-1 is |
307 # running recovery, it fails to obtain a lock on an aReadMark[] slot | 247 # running recovery, it fails to obtain a lock on an aReadMark[] slot |
308 # (because they are all locked by recovery). It then tries to obtain | 248 # (because they are all locked by recovery). It then tries to obtain |
309 # a shared lock on the RECOVER lock to see if there really is a | 249 # a shared lock on the RECOVER lock to see if there really is a |
310 # recovery running or not. | 250 # recovery running or not. |
311 # | 251 # |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 execsql { SELECT * FROM blue } db2 | 550 execsql { SELECT * FROM blue } db2 |
611 } {1 2 3 4 5 6} | 551 } {1 2 3 4 5 6} |
612 do_test wal3-7.2.2 { | 552 do_test wal3-7.2.2 { |
613 set ::locks | 553 set ::locks |
614 } {{5 1 lock shared} {5 1 unlock shared} {4 1 lock shared} {4 1 unlock shared}} | 554 } {{5 1 lock shared} {5 1 unlock shared} {4 1 lock shared} {4 1 unlock shared}} |
615 | 555 |
616 db close | 556 db close |
617 db2 close | 557 db2 close |
618 T delete | 558 T delete |
619 | 559 |
620 #------------------------------------------------------------------------- | |
621 # | |
622 do_test wal3-8.1 { | |
623 forcedelete test.db test.db-journal test.db wal | |
624 sqlite3 db test.db | |
625 sqlite3 db2 test.db | |
626 execsql { | |
627 PRAGMA auto_vacuum = off; | |
628 PRAGMA journal_mode = WAL; | |
629 CREATE TABLE b(c); | |
630 INSERT INTO b VALUES('Tehran'); | |
631 INSERT INTO b VALUES('Qom'); | |
632 INSERT INTO b VALUES('Markazi'); | |
633 PRAGMA wal_checkpoint; | |
634 } | |
635 } {wal 0 5 5} | |
636 do_test wal3-8.2 { | |
637 execsql { SELECT * FROM b } | |
638 } {Tehran Qom Markazi} | |
639 do_test wal3-8.3 { | |
640 db eval { SELECT * FROM b } { | |
641 db eval { INSERT INTO b VALUES('Qazvin') } | |
642 set r [db2 eval { SELECT * FROM b }] | |
643 break | |
644 } | |
645 set r | |
646 } {Tehran Qom Markazi Qazvin} | |
647 do_test wal3-8.4 { | |
648 execsql { | |
649 INSERT INTO b VALUES('Gilan'); | |
650 INSERT INTO b VALUES('Ardabil'); | |
651 } | |
652 } {} | |
653 db2 close | |
654 | |
655 faultsim_save_and_close | |
656 testvfs T -default 1 | |
657 faultsim_restore_and_reopen | |
658 T filter xShmLock | |
659 T script lock_callback | |
660 | |
661 proc lock_callback {method file handle spec} { | |
662 if {$spec == "1 7 unlock exclusive"} { | |
663 T filter {} | |
664 set ::r [catchsql { SELECT * FROM b } db2] | |
665 } | |
666 } | |
667 sqlite3 db test.db | |
668 sqlite3 db2 test.db | |
669 do_test wal3-8.5 { | |
670 execsql { SELECT * FROM b } | |
671 } {Tehran Qom Markazi Qazvin Gilan Ardabil} | |
672 do_test wal3-8.6 { | |
673 set ::r | |
674 } {1 {locking protocol}} | |
675 | |
676 db close | |
677 db2 close | |
678 | |
679 faultsim_restore_and_reopen | |
680 sqlite3 db2 test.db | |
681 T filter xShmLock | |
682 T script lock_callback | |
683 proc lock_callback {method file handle spec} { | |
684 if {$spec == "1 7 unlock exclusive"} { | |
685 T filter {} | |
686 set ::r [catchsql { SELECT * FROM b } db2] | |
687 } | |
688 } | |
689 unset ::r | |
690 do_test wal3-8.5 { | |
691 execsql { SELECT * FROM b } | |
692 } {Tehran Qom Markazi Qazvin Gilan Ardabil} | |
693 do_test wal3-8.6 { | |
694 set ::r | |
695 } {1 {locking protocol}} | |
696 | |
697 db close | |
698 db2 close | |
699 T delete | |
700 | 560 |
701 #------------------------------------------------------------------------- | 561 #------------------------------------------------------------------------- |
702 # When a connection opens a read-lock on the database, it searches for | 562 # When a connection opens a read-lock on the database, it searches for |
703 # an aReadMark[] slot that is already set to the mxFrame value for the | 563 # an aReadMark[] slot that is already set to the mxFrame value for the |
704 # new transaction. If it cannot find one, it attempts to obtain an | 564 # new transaction. If it cannot find one, it attempts to obtain an |
705 # exclusive lock on an aReadMark[] slot for the purposes of modifying | 565 # exclusive lock on an aReadMark[] slot for the purposes of modifying |
706 # the value, then drops back to a shared-lock for the duration of the | 566 # the value, then drops back to a shared-lock for the duration of the |
707 # transaction. | 567 # transaction. |
708 # | 568 # |
709 # This test case verifies that if an exclusive lock cannot be obtained | 569 # This test case verifies that if an exclusive lock cannot be obtained |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 | 642 |
783 expr {[file size test.db-wal] > [expr 1032*9000]} | 643 expr {[file size test.db-wal] > [expr 1032*9000]} |
784 } 1 | 644 } 1 |
785 | 645 |
786 do_test wal3-10.$tn.2 { | 646 do_test wal3-10.$tn.2 { |
787 sql2 {PRAGMA integrity_check} | 647 sql2 {PRAGMA integrity_check} |
788 } {ok} | 648 } {ok} |
789 } | 649 } |
790 | 650 |
791 finish_test | 651 finish_test |
OLD | NEW |