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