persistentstorage/sqlite3api/TEST/TclScript/avtrans.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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