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