modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/avtrans.test (about)

     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