Prevent deep recursions on nested COLLATE operators.
[sqlite.git] / test / tempdb.test
bloba32ef06f445fe9f6ab820f10dbcc61bbefa0d5af
1 # 2008 April 14
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
6 #    May you do good and not evil.
7 #    May you find forgiveness for yourself and forgive others.
8 #    May you share freely, never taking more than you give.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
12 # The focus of this file is in making sure that rolling back
13 # a statement journal works correctly.
15 # $Id: tempdb.test,v 1.4 2009/06/05 17:09:12 drh Exp $
17 set testdir [file dirname $argv0]
18 source $testdir/tester.tcl
20 if {[atomic_batch_write test.db]} {
21   finish_test
22   return
25 # Use a temporary database.
27 db close
28 sqlite3 db {}
30 # Force a statement journal rollback on a database file that
31 # has never been opened.
33 do_test tempdb-1.1 {
34   execsql {
35     BEGIN;
36     CREATE TABLE t1(x UNIQUE);
37     CREATE TABLE t2(y);
38     INSERT INTO t2 VALUES('hello');
39     INSERT INTO t2 VALUES(NULL);
40   }
41   # Because of the transaction, the temporary database file
42   # has not even been opened yet.  The following statement
43   # will cause a statement journal rollback on this non-existant
44   # file.
45   catchsql {
46     INSERT INTO t1
47     SELECT CASE WHEN y IS NULL THEN test_error('oops', 11) ELSE y END
48       FROM t2;
49   }
50 } {1 oops}
52 # Verify that no writes occurred in t1.
54 do_test tempdb-1.2 {
55   execsql {
56     SELECT * FROM t1
57   }
58 } {}
60 do_test tempdb-2.1 {
61   # Set $::jrnl_in_memory if the journal file is expected to be in-memory.
62   # Similarly, set $::subj_in_memory if the sub-journal file is expected
63   # to be in memory. These variables are used to calculate the expected
64   # number of open files in the test cases below.
65   #
66   set jrnl_in_memory [expr {[permutation] eq "inmemory_journal"}]
67   set subj_in_memory [expr {$jrnl_in_memory || $TEMP_STORE>=2}]
69   db close
70   sqlite3 db test.db
71 } {}
72 do_test tempdb-2.2 {
73   execsql {
74     CREATE TABLE t1 (a PRIMARY KEY, b, c);
75     CREATE TABLE t2 (a, b, c);
76     BEGIN;
77       INSERT INTO t1 VALUES(1, 2, 3);
78       INSERT INTO t1 VALUES(4, 5, 6);
79       INSERT INTO t2 VALUES(7, 8, 9);
80       INSERT INTO t2 SELECT * FROM t1;
81   }
82   catchsql { INSERT INTO t1 SELECT * FROM t2 }
83   set sqlite_open_file_count
84 } [expr 1 + (0==$jrnl_in_memory)]
85 do_test tempdb-2.3 {
86   execsql {
87     PRAGMA temp_store = 'memory';
88     ROLLBACK;
89     BEGIN;
90       INSERT INTO t1 VALUES(1, 2, 3);
91       INSERT INTO t1 VALUES(4, 5, 6);
92       INSERT INTO t2 SELECT * FROM t1;
93   }
94   catchsql { INSERT INTO t1 SELECT * FROM t2 }
95   set sqlite_open_file_count
96 } [expr 1 + (0==$jrnl_in_memory)]
98 finish_test