Home | History | Annotate | Download | only in test
      1 # 2010 February 18
      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 #
     12 # The tests in this file check that SQLite uses (or does not use) a
     13 # statement journal for various SQL statements.
     14 #
     15 
     16 set testdir [file dirname $argv0]
     17 source $testdir/tester.tcl
     18 
     19 do_test stmt-1.1 {
     20   execsql { CREATE TABLE t1(a integer primary key, b INTEGER NOT NULL) }
     21 } {}
     22 
     23 # The following tests verify the method used for the tests in this file -
     24 # that if a statement journal is required by a statement it is opened and
     25 # remains open until the current transaction is committed or rolled back.
     26 #
     27 # This only work if SQLITE_TEMP_STORE!=3
     28 #
     29 if {$::TEMP_STORE==3} {
     30   finish_test
     31   return
     32 }
     33 do_test stmt-1.2 {
     34   set sqlite_open_file_count
     35 } {1}
     36 do_test stmt-1.3 {
     37   execsql {
     38     PRAGMA temp_store = file;
     39     BEGIN;
     40       INSERT INTO t1 VALUES(1, 1);
     41   }
     42   set sqlite_open_file_count
     43 } {2}
     44 do_test stmt-1.4 {
     45   execsql {
     46     INSERT INTO t1 SELECT a+1, b+1 FROM t1;
     47   }
     48   set sqlite_open_file_count
     49 } {3}
     50 do_test stmt-1.5 {
     51   execsql COMMIT
     52   set sqlite_open_file_count
     53 } {1}
     54 do_test stmt-1.6.1 {
     55   execsql {
     56     BEGIN;
     57       INSERT INTO t1 SELECT a+2, b+2 FROM t1;
     58   }
     59   set sqlite_open_file_count
     60 } {2}
     61 do_test stmt-1.6.2 {
     62   execsql { INSERT INTO t1 SELECT a+4, b+4 FROM t1 }
     63   set sqlite_open_file_count
     64 } {3}
     65 do_test stmt-1.7 {
     66   execsql COMMIT
     67   set sqlite_open_file_count
     68 } {1}
     69 
     70 
     71 proc filecount {testname sql expected} {
     72   uplevel [list do_test $testname [subst -nocommand {
     73     execsql BEGIN
     74     execsql { $sql }
     75     set ret [set sqlite_open_file_count]
     76     execsql ROLLBACK
     77     set ret
     78   }] $expected]
     79 }
     80 
     81 filecount stmt-2.1 { INSERT INTO t1 VALUES(9, 9)  } 2
     82 filecount stmt-2.2 { REPLACE INTO t1 VALUES(9, 9) } 2
     83 filecount stmt-2.3 { INSERT INTO t1 SELECT 9, 9   } 2
     84 filecount stmt-2.4 { 
     85     INSERT INTO t1 SELECT 9, 9;
     86     INSERT INTO t1 SELECT 10, 10;
     87 } 3
     88 
     89 do_test stmt-2.5 {
     90   execsql { CREATE INDEX i1 ON t1(b) }
     91 } {}
     92 filecount stmt-2.6 { 
     93   REPLACE INTO t1 VALUES(5, 5);
     94   REPLACE INTO t1 VALUES(5, 5); 
     95 } 3
     96 
     97 finish_test
     98