wasCSharpSQLite – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 # 2001 September 15
2 #
3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
5 #
6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give.
9 #
10 #***********************************************************************
11 # This file implements regression tests for SQLite library. This
12 # file is a copy of "trans.test" modified to run under autovacuum mode.
13 # the point is to stress the autovacuum logic and try to get it to fail.
14 #
15 # $Id: avtrans.test,v 1.6 2007/09/12 17:01:45 danielk1977 Exp $
16  
17  
18 set testdir [file dirname $argv0]
19 source $testdir/tester.tcl
20  
21  
22 # Create several tables to work with.
23 #
24 do_test avtrans-1.0 {
25 execsql { PRAGMA auto_vacuum=ON }
26 wal_set_journal_mode
27 execsql {
28 CREATE TABLE one(a int PRIMARY KEY, b text);
29 INSERT INTO one VALUES(1,'one');
30 INSERT INTO one VALUES(2,'two');
31 INSERT INTO one VALUES(3,'three');
32 SELECT b FROM one ORDER BY a;
33 }
34 } {one two three}
35 do_test avtrans-1.1 {
36 execsql {
37 CREATE TABLE two(a int PRIMARY KEY, b text);
38 INSERT INTO two VALUES(1,'I');
39 INSERT INTO two VALUES(5,'V');
40 INSERT INTO two VALUES(10,'X');
41 SELECT b FROM two ORDER BY a;
42 }
43 } {I V X}
44 do_test avtrans-1.9 {
45 sqlite3 altdb test.db
46 execsql {SELECT b FROM one ORDER BY a} altdb
47 } {one two three}
48 do_test avtrans-1.10 {
49 execsql {SELECT b FROM two ORDER BY a} altdb
50 } {I V X}
51 integrity_check avtrans-1.11
52 wal_check_journal_mode avtrans-1.12
53  
54 # Basic transactions
55 #
56 do_test avtrans-2.1 {
57 set v [catch {execsql {BEGIN}} msg]
58 lappend v $msg
59 } {0 {}}
60 do_test avtrans-2.2 {
61 set v [catch {execsql {END}} msg]
62 lappend v $msg
63 } {0 {}}
64 do_test avtrans-2.3 {
65 set v [catch {execsql {BEGIN TRANSACTION}} msg]
66 lappend v $msg
67 } {0 {}}
68 do_test avtrans-2.4 {
69 set v [catch {execsql {COMMIT TRANSACTION}} msg]
70 lappend v $msg
71 } {0 {}}
72 do_test avtrans-2.5 {
73 set v [catch {execsql {BEGIN TRANSACTION 'foo'}} msg]
74 lappend v $msg
75 } {0 {}}
76 do_test avtrans-2.6 {
77 set v [catch {execsql {ROLLBACK TRANSACTION 'foo'}} msg]
78 lappend v $msg
79 } {0 {}}
80 do_test avtrans-2.10 {
81 execsql {
82 BEGIN;
83 SELECT a FROM one ORDER BY a;
84 SELECT a FROM two ORDER BY a;
85 END;
86 }
87 } {1 2 3 1 5 10}
88 integrity_check avtrans-2.11
89 wal_check_journal_mode avtrans-2.12
90  
91 # Check the locking behavior
92 #
93 sqlite3_soft_heap_limit 0
94 do_test avtrans-3.1 {
95 execsql {
96 BEGIN;
97 UPDATE one SET a = 0 WHERE 0;
98 SELECT a FROM one ORDER BY a;
99 }
100 } {1 2 3}
101 do_test avtrans-3.2 {
102 catchsql {
103 SELECT a FROM two ORDER BY a;
104 } altdb
105 } {0 {1 5 10}}
106 do_test avtrans-3.3 {
107 catchsql {
108 SELECT a FROM one ORDER BY a;
109 } altdb
110 } {0 {1 2 3}}
111 do_test avtrans-3.4 {
112 catchsql {
113 INSERT INTO one VALUES(4,'four');
114 }
115 } {0 {}}
116 do_test avtrans-3.5 {
117 catchsql {
118 SELECT a FROM two ORDER BY a;
119 } altdb
120 } {0 {1 5 10}}
121 do_test avtrans-3.6 {
122 catchsql {
123 SELECT a FROM one ORDER BY a;
124 } altdb
125 } {0 {1 2 3}}
126 do_test avtrans-3.7 {
127 catchsql {
128 INSERT INTO two VALUES(4,'IV');
129 }
130 } {0 {}}
131 do_test avtrans-3.8 {
132 catchsql {
133 SELECT a FROM two ORDER BY a;
134 } altdb
135 } {0 {1 5 10}}
136 do_test avtrans-3.9 {
137 catchsql {
138 SELECT a FROM one ORDER BY a;
139 } altdb
140 } {0 {1 2 3}}
141 do_test avtrans-3.10 {
142 execsql {END TRANSACTION}
143 } {}
144 do_test avtrans-3.11 {
145 set v [catch {execsql {
146 SELECT a FROM two ORDER BY a;
147 } altdb} msg]
148 lappend v $msg
149 } {0 {1 4 5 10}}
150 do_test avtrans-3.12 {
151 set v [catch {execsql {
152 SELECT a FROM one ORDER BY a;
153 } altdb} msg]
154 lappend v $msg
155 } {0 {1 2 3 4}}
156 do_test avtrans-3.13 {
157 set v [catch {execsql {
158 SELECT a FROM two ORDER BY a;
159 } db} msg]
160 lappend v $msg
161 } {0 {1 4 5 10}}
162 do_test avtrans-3.14 {
163 set v [catch {execsql {
164 SELECT a FROM one ORDER BY a;
165 } db} msg]
166 lappend v $msg
167 } {0 {1 2 3 4}}
168 sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit)
169 integrity_check avtrans-3.15
170  
171 do_test avtrans-4.1 {
172 set v [catch {execsql {
173 COMMIT;
174 } db} msg]
175 lappend v $msg
176 } {1 {cannot commit - no transaction is active}}
177 do_test avtrans-4.2 {
178 set v [catch {execsql {
179 ROLLBACK;
180 } db} msg]
181 lappend v $msg
182 } {1 {cannot rollback - no transaction is active}}
183 do_test avtrans-4.3 {
184 catchsql {
185 BEGIN TRANSACTION;
186 UPDATE two SET a = 0 WHERE 0;
187 SELECT a FROM two ORDER BY a;
188 } db
189 } {0 {1 4 5 10}}
190 do_test avtrans-4.4 {
191 catchsql {
192 SELECT a FROM two ORDER BY a;
193 } altdb
194 } {0 {1 4 5 10}}
195 do_test avtrans-4.5 {
196 catchsql {
197 SELECT a FROM one ORDER BY a;
198 } altdb
199 } {0 {1 2 3 4}}
200 do_test avtrans-4.6 {
201 catchsql {
202 BEGIN TRANSACTION;
203 SELECT a FROM one ORDER BY a;
204 } db
205 } {1 {cannot start a transaction within a transaction}}
206 do_test avtrans-4.7 {
207 catchsql {
208 SELECT a FROM two ORDER BY a;
209 } altdb
210 } {0 {1 4 5 10}}
211 do_test avtrans-4.8 {
212 catchsql {
213 SELECT a FROM one ORDER BY a;
214 } altdb
215 } {0 {1 2 3 4}}
216 do_test avtrans-4.9 {
217 set v [catch {execsql {
218 END TRANSACTION;
219 SELECT a FROM two ORDER BY a;
220 } db} msg]
221 lappend v $msg
222 } {0 {1 4 5 10}}
223 do_test avtrans-4.10 {
224 set v [catch {execsql {
225 SELECT a FROM two ORDER BY a;
226 } altdb} msg]
227 lappend v $msg
228 } {0 {1 4 5 10}}
229 do_test avtrans-4.11 {
230 set v [catch {execsql {
231 SELECT a FROM one ORDER BY a;
232 } altdb} msg]
233 lappend v $msg
234 } {0 {1 2 3 4}}
235 integrity_check avtrans-4.12
236 do_test avtrans-4.98 {
237 altdb close
238 execsql {
239 DROP TABLE one;
240 DROP TABLE two;
241 }
242 } {}
243 integrity_check avtrans-4.99
244  
245 # Check out the commit/rollback behavior of the database
246 #
247 do_test avtrans-5.1 {
248 execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
249 } {}
250 do_test avtrans-5.2 {
251 execsql {BEGIN TRANSACTION}
252 execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
253 } {}
254 do_test avtrans-5.3 {
255 execsql {CREATE TABLE one(a text, b int)}
256 execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
257 } {one}
258 do_test avtrans-5.4 {
259 execsql {SELECT a,b FROM one ORDER BY b}
260 } {}
261 do_test avtrans-5.5 {
262 execsql {INSERT INTO one(a,b) VALUES('hello', 1)}
263 execsql {SELECT a,b FROM one ORDER BY b}
264 } {hello 1}
265 do_test avtrans-5.6 {
266 execsql {ROLLBACK}
267 execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
268 } {}
269 do_test avtrans-5.7 {
270 set v [catch {
271 execsql {SELECT a,b FROM one ORDER BY b}
272 } msg]
273 lappend v $msg
274 } {1 {no such table: one}}
275  
276 # Test commits and rollbacks of table CREATE TABLEs, CREATE INDEXs
277 # DROP TABLEs and DROP INDEXs
278 #
279 do_test avtrans-5.8 {
280 execsql {
281 SELECT name fROM sqlite_master
282 WHERE type='table' OR type='index'
283 ORDER BY name
284 }
285 } {}
286 do_test avtrans-5.9 {
287 execsql {
288 BEGIN TRANSACTION;
289 CREATE TABLE t1(a int, b int, c int);
290 SELECT name fROM sqlite_master
291 WHERE type='table' OR type='index'
292 ORDER BY name;
293 }
294 } {t1}
295 do_test avtrans-5.10 {
296 execsql {
297 CREATE INDEX i1 ON t1(a);
298 SELECT name fROM sqlite_master
299 WHERE type='table' OR type='index'
300 ORDER BY name;
301 }
302 } {i1 t1}
303 do_test avtrans-5.11 {
304 execsql {
305 COMMIT;
306 SELECT name fROM sqlite_master
307 WHERE type='table' OR type='index'
308 ORDER BY name;
309 }
310 } {i1 t1}
311 do_test avtrans-5.12 {
312 execsql {
313 BEGIN TRANSACTION;
314 CREATE TABLE t2(a int, b int, c int);
315 CREATE INDEX i2a ON t2(a);
316 CREATE INDEX i2b ON t2(b);
317 DROP TABLE t1;
318 SELECT name fROM sqlite_master
319 WHERE type='table' OR type='index'
320 ORDER BY name;
321 }
322 } {i2a i2b t2}
323 do_test avtrans-5.13 {
324 execsql {
325 ROLLBACK;
326 SELECT name fROM sqlite_master
327 WHERE type='table' OR type='index'
328 ORDER BY name;
329 }
330 } {i1 t1}
331 do_test avtrans-5.14 {
332 execsql {
333 BEGIN TRANSACTION;
334 DROP INDEX i1;
335 SELECT name fROM sqlite_master
336 WHERE type='table' OR type='index'
337 ORDER BY name;
338 }
339 } {t1}
340 do_test avtrans-5.15 {
341 execsql {
342 ROLLBACK;
343 SELECT name fROM sqlite_master
344 WHERE type='table' OR type='index'
345 ORDER BY name;
346 }
347 } {i1 t1}
348 do_test avtrans-5.16 {
349 execsql {
350 BEGIN TRANSACTION;
351 DROP INDEX i1;
352 CREATE TABLE t2(x int, y int, z int);
353 CREATE INDEX i2x ON t2(x);
354 CREATE INDEX i2y ON t2(y);
355 INSERT INTO t2 VALUES(1,2,3);
356 SELECT name fROM sqlite_master
357 WHERE type='table' OR type='index'
358 ORDER BY name;
359 }
360 } {i2x i2y t1 t2}
361 do_test avtrans-5.17 {
362 execsql {
363 COMMIT;
364 SELECT name fROM sqlite_master
365 WHERE type='table' OR type='index'
366 ORDER BY name;
367 }
368 } {i2x i2y t1 t2}
369 do_test avtrans-5.18 {
370 execsql {
371 SELECT * FROM t2;
372 }
373 } {1 2 3}
374 do_test avtrans-5.19 {
375 execsql {
376 SELECT x FROM t2 WHERE y=2;
377 }
378 } {1}
379 do_test avtrans-5.20 {
380 execsql {
381 BEGIN TRANSACTION;
382 DROP TABLE t1;
383 DROP TABLE t2;
384 SELECT name fROM sqlite_master
385 WHERE type='table' OR type='index'
386 ORDER BY name;
387 }
388 } {}
389 do_test avtrans-5.21 {
390 set r [catch {execsql {
391 SELECT * FROM t2
392 }} msg]
393 lappend r $msg
394 } {1 {no such table: t2}}
395 do_test avtrans-5.22 {
396 execsql {
397 ROLLBACK;
398 SELECT name fROM sqlite_master
399 WHERE type='table' OR type='index'
400 ORDER BY name;
401 }
402 } {i2x i2y t1 t2}
403 do_test avtrans-5.23 {
404 execsql {
405 SELECT * FROM t2;
406 }
407 } {1 2 3}
408 integrity_check avtrans-5.23
409  
410  
411 # Try to DROP and CREATE tables and indices with the same name
412 # within a transaction. Make sure ROLLBACK works.
413 #
414 do_test avtrans-6.1 {
415 execsql2 {
416 INSERT INTO t1 VALUES(1,2,3);
417 BEGIN TRANSACTION;
418 DROP TABLE t1;
419 CREATE TABLE t1(p,q,r);
420 ROLLBACK;
421 SELECT * FROM t1;
422 }
423 } {a 1 b 2 c 3}
424 do_test avtrans-6.2 {
425 execsql2 {
426 INSERT INTO t1 VALUES(1,2,3);
427 BEGIN TRANSACTION;
428 DROP TABLE t1;
429 CREATE TABLE t1(p,q,r);
430 COMMIT;
431 SELECT * FROM t1;
432 }
433 } {}
434 do_test avtrans-6.3 {
435 execsql2 {
436 INSERT INTO t1 VALUES(1,2,3);
437 SELECT * FROM t1;
438 }
439 } {p 1 q 2 r 3}
440 do_test avtrans-6.4 {
441 execsql2 {
442 BEGIN TRANSACTION;
443 DROP TABLE t1;
444 CREATE TABLE t1(a,b,c);
445 INSERT INTO t1 VALUES(4,5,6);
446 SELECT * FROM t1;
447 DROP TABLE t1;
448 }
449 } {a 4 b 5 c 6}
450 do_test avtrans-6.5 {
451 execsql2 {
452 ROLLBACK;
453 SELECT * FROM t1;
454 }
455 } {p 1 q 2 r 3}
456 do_test avtrans-6.6 {
457 execsql2 {
458 BEGIN TRANSACTION;
459 DROP TABLE t1;
460 CREATE TABLE t1(a,b,c);
461 INSERT INTO t1 VALUES(4,5,6);
462 SELECT * FROM t1;
463 DROP TABLE t1;
464 }
465 } {a 4 b 5 c 6}
466 do_test avtrans-6.7 {
467 catchsql {
468 COMMIT;
469 SELECT * FROM t1;
470 }
471 } {1 {no such table: t1}}
472  
473 # Repeat on a table with an automatically generated index.
474 #
475 do_test avtrans-6.10 {
476 execsql2 {
477 CREATE TABLE t1(a unique,b,c);
478 INSERT INTO t1 VALUES(1,2,3);
479 BEGIN TRANSACTION;
480 DROP TABLE t1;
481 CREATE TABLE t1(p unique,q,r);
482 ROLLBACK;
483 SELECT * FROM t1;
484 }
485 } {a 1 b 2 c 3}
486 do_test avtrans-6.11 {
487 execsql2 {
488 BEGIN TRANSACTION;
489 DROP TABLE t1;
490 CREATE TABLE t1(p unique,q,r);
491 COMMIT;
492 SELECT * FROM t1;
493 }
494 } {}
495 do_test avtrans-6.12 {
496 execsql2 {
497 INSERT INTO t1 VALUES(1,2,3);
498 SELECT * FROM t1;
499 }
500 } {p 1 q 2 r 3}
501 do_test avtrans-6.13 {
502 execsql2 {
503 BEGIN TRANSACTION;
504 DROP TABLE t1;
505 CREATE TABLE t1(a unique,b,c);
506 INSERT INTO t1 VALUES(4,5,6);
507 SELECT * FROM t1;
508 DROP TABLE t1;
509 }
510 } {a 4 b 5 c 6}
511 do_test avtrans-6.14 {
512 execsql2 {
513 ROLLBACK;
514 SELECT * FROM t1;
515 }
516 } {p 1 q 2 r 3}
517 do_test avtrans-6.15 {
518 execsql2 {
519 BEGIN TRANSACTION;
520 DROP TABLE t1;
521 CREATE TABLE t1(a unique,b,c);
522 INSERT INTO t1 VALUES(4,5,6);
523 SELECT * FROM t1;
524 DROP TABLE t1;
525 }
526 } {a 4 b 5 c 6}
527 do_test avtrans-6.16 {
528 catchsql {
529 COMMIT;
530 SELECT * FROM t1;
531 }
532 } {1 {no such table: t1}}
533  
534 do_test avtrans-6.20 {
535 execsql {
536 CREATE TABLE t1(a integer primary key,b,c);
537 INSERT INTO t1 VALUES(1,-2,-3);
538 INSERT INTO t1 VALUES(4,-5,-6);
539 SELECT * FROM t1;
540 }
541 } {1 -2 -3 4 -5 -6}
542 do_test avtrans-6.21 {
543 execsql {
544 CREATE INDEX i1 ON t1(b);
545 SELECT * FROM t1 WHERE b<1;
546 }
547 } {4 -5 -6 1 -2 -3}
548 do_test avtrans-6.22 {
549 execsql {
550 BEGIN TRANSACTION;
551 DROP INDEX i1;
552 SELECT * FROM t1 WHERE b<1;
553 ROLLBACK;
554 }
555 } {1 -2 -3 4 -5 -6}
556 do_test avtrans-6.23 {
557 execsql {
558 SELECT * FROM t1 WHERE b<1;
559 }
560 } {4 -5 -6 1 -2 -3}
561 do_test avtrans-6.24 {
562 execsql {
563 BEGIN TRANSACTION;
564 DROP TABLE t1;
565 ROLLBACK;
566 SELECT * FROM t1 WHERE b<1;
567 }
568 } {4 -5 -6 1 -2 -3}
569  
570 do_test avtrans-6.25 {
571 execsql {
572 BEGIN TRANSACTION;
573 DROP INDEX i1;
574 CREATE INDEX i1 ON t1(c);
575 SELECT * FROM t1 WHERE b<1;
576 }
577 } {1 -2 -3 4 -5 -6}
578 do_test avtrans-6.26 {
579 execsql {
580 SELECT * FROM t1 WHERE c<1;
581 }
582 } {4 -5 -6 1 -2 -3}
583 do_test avtrans-6.27 {
584 execsql {
585 ROLLBACK;
586 SELECT * FROM t1 WHERE b<1;
587 }
588 } {4 -5 -6 1 -2 -3}
589 do_test avtrans-6.28 {
590 execsql {
591 SELECT * FROM t1 WHERE c<1;
592 }
593 } {1 -2 -3 4 -5 -6}
594  
595 # The following repeats steps 6.20 through 6.28, but puts a "unique"
596 # constraint the first field of the table in order to generate an
597 # automatic index.
598 #
599 do_test avtrans-6.30 {
600 execsql {
601 BEGIN TRANSACTION;
602 DROP TABLE t1;
603 CREATE TABLE t1(a int unique,b,c);
604 COMMIT;
605 INSERT INTO t1 VALUES(1,-2,-3);
606 INSERT INTO t1 VALUES(4,-5,-6);
607 SELECT * FROM t1 ORDER BY a;
608 }
609 } {1 -2 -3 4 -5 -6}
610 do_test avtrans-6.31 {
611 execsql {
612 CREATE INDEX i1 ON t1(b);
613 SELECT * FROM t1 WHERE b<1;
614 }
615 } {4 -5 -6 1 -2 -3}
616 do_test avtrans-6.32 {
617 execsql {
618 BEGIN TRANSACTION;
619 DROP INDEX i1;
620 SELECT * FROM t1 WHERE b<1;
621 ROLLBACK;
622 }
623 } {1 -2 -3 4 -5 -6}
624 do_test avtrans-6.33 {
625 execsql {
626 SELECT * FROM t1 WHERE b<1;
627 }
628 } {4 -5 -6 1 -2 -3}
629 do_test avtrans-6.34 {
630 execsql {
631 BEGIN TRANSACTION;
632 DROP TABLE t1;
633 ROLLBACK;
634 SELECT * FROM t1 WHERE b<1;
635 }
636 } {4 -5 -6 1 -2 -3}
637  
638 do_test avtrans-6.35 {
639 execsql {
640 BEGIN TRANSACTION;
641 DROP INDEX i1;
642 CREATE INDEX i1 ON t1(c);
643 SELECT * FROM t1 WHERE b<1;
644 }
645 } {1 -2 -3 4 -5 -6}
646 do_test avtrans-6.36 {
647 execsql {
648 SELECT * FROM t1 WHERE c<1;
649 }
650 } {4 -5 -6 1 -2 -3}
651 do_test avtrans-6.37 {
652 execsql {
653 DROP INDEX i1;
654 SELECT * FROM t1 WHERE c<1;
655 }
656 } {1 -2 -3 4 -5 -6}
657 do_test avtrans-6.38 {
658 execsql {
659 ROLLBACK;
660 SELECT * FROM t1 WHERE b<1;
661 }
662 } {4 -5 -6 1 -2 -3}
663 do_test avtrans-6.39 {
664 execsql {
665 SELECT * FROM t1 WHERE c<1;
666 }
667 } {1 -2 -3 4 -5 -6}
668 integrity_check avtrans-6.40
669  
670 ifcapable !floatingpoint {
671 finish_test
672 return
673 }
674  
675 # Test to make sure rollback restores the database back to its original
676 # state.
677 #
678 do_test avtrans-7.1 {
679 execsql {BEGIN}
680 for {set i 0} {$i<1000} {incr i} {
681 set r1 [expr {rand()}]
682 set r2 [expr {rand()}]
683 set r3 [expr {rand()}]
684 execsql "INSERT INTO t2 VALUES($r1,$r2,$r3)"
685 }
686 execsql {COMMIT}
687 set ::checksum [execsql {SELECT md5sum(x,y,z) FROM t2}]
688 set ::checksum2 [
689 execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
690 ]
691 execsql {SELECT count(*) FROM t2}
692 } {1001}
693 do_test avtrans-7.2 {
694 execsql {SELECT md5sum(x,y,z) FROM t2}
695 } $checksum
696 do_test avtrans-7.2.1 {
697 execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
698 } $checksum2
699 do_test avtrans-7.3 {
700 execsql {
701 BEGIN;
702 DELETE FROM t2;
703 ROLLBACK;
704 SELECT md5sum(x,y,z) FROM t2;
705 }
706 } $checksum
707 do_test avtrans-7.4 {
708 execsql {
709 BEGIN;
710 INSERT INTO t2 SELECT * FROM t2;
711 ROLLBACK;
712 SELECT md5sum(x,y,z) FROM t2;
713 }
714 } $checksum
715 do_test avtrans-7.5 {
716 execsql {
717 BEGIN;
718 DELETE FROM t2;
719 ROLLBACK;
720 SELECT md5sum(x,y,z) FROM t2;
721 }
722 } $checksum
723 do_test avtrans-7.6 {
724 execsql {
725 BEGIN;
726 INSERT INTO t2 SELECT * FROM t2;
727 ROLLBACK;
728 SELECT md5sum(x,y,z) FROM t2;
729 }
730 } $checksum
731 do_test avtrans-7.7 {
732 execsql {
733 BEGIN;
734 CREATE TABLE t3 AS SELECT * FROM t2;
735 INSERT INTO t2 SELECT * FROM t3;
736 ROLLBACK;
737 SELECT md5sum(x,y,z) FROM t2;
738 }
739 } $checksum
740 do_test avtrans-7.8 {
741 execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
742 } $checksum2
743 ifcapable tempdb {
744 do_test avtrans-7.9 {
745 execsql {
746 BEGIN;
747 CREATE TEMP TABLE t3 AS SELECT * FROM t2;
748 INSERT INTO t2 SELECT * FROM t3;
749 ROLLBACK;
750 SELECT md5sum(x,y,z) FROM t2;
751 }
752 } $checksum
753 }
754 do_test avtrans-7.10 {
755 execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
756 } $checksum2
757 ifcapable tempdb {
758 do_test avtrans-7.11 {
759 execsql {
760 BEGIN;
761 CREATE TEMP TABLE t3 AS SELECT * FROM t2;
762 INSERT INTO t2 SELECT * FROM t3;
763 DROP INDEX i2x;
764 DROP INDEX i2y;
765 CREATE INDEX i3a ON t3(x);
766 ROLLBACK;
767 SELECT md5sum(x,y,z) FROM t2;
768 }
769 } $checksum
770 }
771 do_test avtrans-7.12 {
772 execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
773 } $checksum2
774 ifcapable tempdb {
775 do_test avtrans-7.13 {
776 execsql {
777 BEGIN;
778 DROP TABLE t2;
779 ROLLBACK;
780 SELECT md5sum(x,y,z) FROM t2;
781 }
782 } $checksum
783 }
784 do_test avtrans-7.14 {
785 execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
786 } $checksum2
787 integrity_check avtrans-7.15
788  
789 # Arrange for another process to begin modifying the database but abort
790 # and die in the middle of the modification. Then have this process read
791 # the database. This process should detect the journal file and roll it
792 # back. Verify that this happens correctly.
793 #
794 set fd [open test.tcl w]
795 puts $fd {
796 sqlite3 db test.db
797 db eval {
798 PRAGMA default_cache_size=20;
799 BEGIN;
800 CREATE TABLE t3 AS SELECT * FROM t2;
801 DELETE FROM t2;
802 }
803 sqlite_abort
804 }
805 close $fd
806 do_test avtrans-8.1 {
807 catch {exec [info nameofexec] test.tcl}
808 execsql {SELECT md5sum(x,y,z) FROM t2}
809 } $checksum
810 do_test avtrans-8.2 {
811 execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
812 } $checksum2
813 integrity_check avtrans-8.3
814  
815 # In the following sequence of tests, compute the MD5 sum of the content
816 # of a table, make lots of modifications to that table, then do a rollback.
817 # Verify that after the rollback, the MD5 checksum is unchanged.
818 #
819 do_test avtrans-9.1 {
820 execsql {
821 PRAGMA default_cache_size=10;
822 }
823 db close
824 sqlite3 db test.db
825 execsql {
826 BEGIN;
827 CREATE TABLE t3(x TEXT);
828 INSERT INTO t3 VALUES(randstr(10,400));
829 INSERT INTO t3 VALUES(randstr(10,400));
830 INSERT INTO t3 SELECT randstr(10,400) FROM t3;
831 INSERT INTO t3 SELECT randstr(10,400) FROM t3;
832 INSERT INTO t3 SELECT randstr(10,400) FROM t3;
833 INSERT INTO t3 SELECT randstr(10,400) FROM t3;
834 INSERT INTO t3 SELECT randstr(10,400) FROM t3;
835 INSERT INTO t3 SELECT randstr(10,400) FROM t3;
836 INSERT INTO t3 SELECT randstr(10,400) FROM t3;
837 INSERT INTO t3 SELECT randstr(10,400) FROM t3;
838 INSERT INTO t3 SELECT randstr(10,400) FROM t3;
839 COMMIT;
840 SELECT count(*) FROM t3;
841 }
842 } {1024}
843  
844 # The following procedure computes a "signature" for table "t3". If
845 # T3 changes in any way, the signature should change.
846 #
847 # This is used to test ROLLBACK. We gather a signature for t3, then
848 # make lots of changes to t3, then rollback and take another signature.
849 # The two signatures should be the same.
850 #
851 proc signature {} {
852 return [db eval {SELECT count(*), md5sum(x) FROM t3}]
853 }
854  
855 # Repeat the following group of tests 20 times for quick testing and
856 # 40 times for full testing. Each iteration of the test makes table
857 # t3 a little larger, and thus takes a little longer, so doing 40 tests
858 # is more than 2.0 times slower than doing 20 tests. Considerably more.
859 #
860 if {[info exists G(isquick)]} {
861 set limit 20
862 } else {
863 set limit 40
864 }
865  
866 # Do rollbacks. Make sure the signature does not change.
867 #
868 for {set i 2} {$i<=$limit} {incr i} {
869 set ::sig [signature]
870 set cnt [lindex $::sig 0]
871 if {$i%2==0} {
872 execsql {PRAGMA fullfsync=ON}
873 } else {
874 execsql {PRAGMA fullfsync=OFF}
875 }
876 set sqlite_sync_count 0
877 set sqlite_fullsync_count 0
878 do_test avtrans-9.$i.1-$cnt {
879 execsql {
880 BEGIN;
881 DELETE FROM t3 WHERE random()%10!=0;
882 INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
883 INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
884 ROLLBACK;
885 }
886 signature
887 } $sig
888 do_test avtrans-9.$i.2-$cnt {
889 execsql {
890 BEGIN;
891 DELETE FROM t3 WHERE random()%10!=0;
892 INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
893 DELETE FROM t3 WHERE random()%10!=0;
894 INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
895 ROLLBACK;
896 }
897 signature
898 } $sig
899 if {$i<$limit} {
900 do_test avtrans-9.$i.3-$cnt {
901 execsql {
902 INSERT INTO t3 SELECT randstr(10,400) FROM t3 WHERE random()%10==0;
903 }
904 } {}
905 if {$tcl_platform(platform)=="unix"} {
906 do_test avtrans-9.$i.4-$cnt {
907 expr {$sqlite_sync_count>0}
908 } 1
909 ifcapable pager_pragmas {
910 do_test avtrans-9.$i.5-$cnt {
911 expr {$sqlite_fullsync_count>0}
912 } [expr {$i%2==0}]
913 } else {
914 do_test avtrans-9.$i.5-$cnt {
915 expr {$sqlite_fullsync_count==0}
916 } {1}
917 }
918 }
919 wal_check_journal_mode avtrans-9.$i-6.$cnt
920 }
921 set ::pager_old_format 0
922 }
923 integrity_check avtrans-10.1
924 wal_check_journal_mode avtrans-10.2
925  
926 finish_test