xref: /sqlite-3.40.0/test/trans.test (revision 99744fa4)
1b19a2bc6Sdrh# 2001 September 15
2c4a3c779Sdrh#
3b19a2bc6Sdrh# The author disclaims copyright to this source code.  In place of
4b19a2bc6Sdrh# a legal notice, here is a blessing:
5c4a3c779Sdrh#
6b19a2bc6Sdrh#    May you do good and not evil.
7b19a2bc6Sdrh#    May you find forgiveness for yourself and forgive others.
8b19a2bc6Sdrh#    May you share freely, never taking more than you give.
9c4a3c779Sdrh#
10c4a3c779Sdrh#***********************************************************************
11c4a3c779Sdrh# This file implements regression tests for SQLite library.  The
12c4a3c779Sdrh# focus of this script is database locks.
13c4a3c779Sdrh#
14c4a3c779Sdrh
15c4a3c779Sdrh
16c4a3c779Sdrhset testdir [file dirname $argv0]
17c4a3c779Sdrhsource $testdir/tester.tcl
18c4a3c779Sdrh
19c4a3c779Sdrh# Create several tables to work with.
20c4a3c779Sdrh#
21e106de63Sdanwal_set_journal_mode
22c4a3c779Sdrhdo_test trans-1.0 {
23c4a3c779Sdrh  execsql {
24c4a3c779Sdrh    CREATE TABLE one(a int PRIMARY KEY, b text);
25c4a3c779Sdrh    INSERT INTO one VALUES(1,'one');
26c4a3c779Sdrh    INSERT INTO one VALUES(2,'two');
27c4a3c779Sdrh    INSERT INTO one VALUES(3,'three');
28c4a3c779Sdrh    SELECT b FROM one ORDER BY a;
29c4a3c779Sdrh  }
30c4a3c779Sdrh} {one two three}
311ef2ca0fSdrhintegrity_check trans-1.0.1
32c4a3c779Sdrhdo_test trans-1.1 {
33c4a3c779Sdrh  execsql {
34c4a3c779Sdrh    CREATE TABLE two(a int PRIMARY KEY, b text);
35c4a3c779Sdrh    INSERT INTO two VALUES(1,'I');
36c4a3c779Sdrh    INSERT INTO two VALUES(5,'V');
37c4a3c779Sdrh    INSERT INTO two VALUES(10,'X');
38c4a3c779Sdrh    SELECT b FROM two ORDER BY a;
39c4a3c779Sdrh  }
40c4a3c779Sdrh} {I V X}
41*99744fa4Sdrhdo_test trans-1.2.1 {
42*99744fa4Sdrh  sqlite3_txn_state db
43*99744fa4Sdrh} {0}
44*99744fa4Sdrhdo_test trans-1.2.2 {
45*99744fa4Sdrh  sqlite3_txn_state db main
46*99744fa4Sdrh} {0}
47*99744fa4Sdrhdo_test trans-1.2.3 {
48*99744fa4Sdrh  sqlite3_txn_state db temp
49*99744fa4Sdrh} {0}
50*99744fa4Sdrhdo_test trans-1.2.4 {
51*99744fa4Sdrh  sqlite3_txn_state db no-such-schema
52*99744fa4Sdrh} {-1}
53*99744fa4Sdrh
54c4a3c779Sdrhdo_test trans-1.9 {
55ef4ac8f9Sdrh  sqlite3 altdb test.db
56c4a3c779Sdrh  execsql {SELECT b FROM one ORDER BY a} altdb
57c4a3c779Sdrh} {one two three}
58c4a3c779Sdrhdo_test trans-1.10 {
59c4a3c779Sdrh  execsql {SELECT b FROM two ORDER BY a} altdb
60c4a3c779Sdrh} {I V X}
612150432eSdrhintegrity_check trans-1.11
62e106de63Sdanwal_check_journal_mode trans-1.12
63c4a3c779Sdrh
64c4a3c779Sdrh# Basic transactions
65c4a3c779Sdrh#
66c4a3c779Sdrhdo_test trans-2.1 {
67c4a3c779Sdrh  set v [catch {execsql {BEGIN}} msg]
68c4a3c779Sdrh  lappend v $msg
69c4a3c779Sdrh} {0 {}}
70*99744fa4Sdrhdo_test trans-2.1b {
71*99744fa4Sdrh  sqlite3_txn_state db
72*99744fa4Sdrh} {0}
73c4a3c779Sdrhdo_test trans-2.2 {
74c4a3c779Sdrh  set v [catch {execsql {END}} msg]
75c4a3c779Sdrh  lappend v $msg
76c4a3c779Sdrh} {0 {}}
77c4a3c779Sdrhdo_test trans-2.3 {
78c4a3c779Sdrh  set v [catch {execsql {BEGIN TRANSACTION}} msg]
79c4a3c779Sdrh  lappend v $msg
80c4a3c779Sdrh} {0 {}}
81c4a3c779Sdrhdo_test trans-2.4 {
82c4a3c779Sdrh  set v [catch {execsql {COMMIT TRANSACTION}} msg]
83c4a3c779Sdrh  lappend v $msg
84c4a3c779Sdrh} {0 {}}
85c4a3c779Sdrhdo_test trans-2.5 {
86c4a3c779Sdrh  set v [catch {execsql {BEGIN TRANSACTION 'foo'}} msg]
87c4a3c779Sdrh  lappend v $msg
88c4a3c779Sdrh} {0 {}}
89c4a3c779Sdrhdo_test trans-2.6 {
90c4a3c779Sdrh  set v [catch {execsql {ROLLBACK TRANSACTION 'foo'}} msg]
91c4a3c779Sdrh  lappend v $msg
92c4a3c779Sdrh} {0 {}}
93c4a3c779Sdrhdo_test trans-2.10 {
94c4a3c779Sdrh  execsql {
95c4a3c779Sdrh    BEGIN;
96c4a3c779Sdrh    SELECT a FROM one ORDER BY a;
97c4a3c779Sdrh    SELECT a FROM two ORDER BY a;
98c4a3c779Sdrh    END;
99c4a3c779Sdrh  }
100c4a3c779Sdrh} {1 2 3 1 5 10}
1012150432eSdrhintegrity_check trans-2.11
102e106de63Sdanwal_check_journal_mode trans-2.12
103c4a3c779Sdrh
104c4a3c779Sdrh# Check the locking behavior
105c4a3c779Sdrh#
106c4a3c779Sdrhdo_test trans-3.1 {
107c4a3c779Sdrh  execsql {
108c4a3c779Sdrh    BEGIN;
1091d850a72Sdanielk1977    UPDATE one SET a = 0 WHERE 0;
110c4a3c779Sdrh    SELECT a FROM one ORDER BY a;
111c4a3c779Sdrh  }
112c4a3c779Sdrh} {1 2 3}
113*99744fa4Sdrhdo_test trans-3.1b {
114*99744fa4Sdrh  sqlite3_txn_state db
115*99744fa4Sdrh} {2}
116*99744fa4Sdrhdo_test trans-3.1c {
117*99744fa4Sdrh  sqlite3_txn_state db main
118*99744fa4Sdrh} {2}
119*99744fa4Sdrhdo_test trans-3.1d {
120*99744fa4Sdrh  sqlite3_txn_state db temp
121*99744fa4Sdrh} {0}
122*99744fa4Sdrh
123c4a3c779Sdrhdo_test trans-3.2 {
124a60accbdSdrh  catchsql {
125c4a3c779Sdrh    SELECT a FROM two ORDER BY a;
126a60accbdSdrh  } altdb
127a60accbdSdrh} {0 {1 5 10}}
128aef0bf64Sdanielk1977
129c4a3c779Sdrhdo_test trans-3.3 {
130a60accbdSdrh  catchsql {
131c4a3c779Sdrh    SELECT a FROM one ORDER BY a;
132a60accbdSdrh  } altdb
133a60accbdSdrh} {0 {1 2 3}}
134c4a3c779Sdrhdo_test trans-3.4 {
135a60accbdSdrh  catchsql {
136c4a3c779Sdrh    INSERT INTO one VALUES(4,'four');
137a60accbdSdrh  }
138c4a3c779Sdrh} {0 {}}
139c73d1f5aSdrhdo_test trans-3.5 {
140a60accbdSdrh  catchsql {
141c4a3c779Sdrh    SELECT a FROM two ORDER BY a;
142a60accbdSdrh  } altdb
143a60accbdSdrh} {0 {1 5 10}}
144c73d1f5aSdrhdo_test trans-3.6 {
145a60accbdSdrh  catchsql {
146c4a3c779Sdrh    SELECT a FROM one ORDER BY a;
147a60accbdSdrh  } altdb
148a60accbdSdrh} {0 {1 2 3}}
149c73d1f5aSdrhdo_test trans-3.7 {
150a60accbdSdrh  catchsql {
151c4a3c779Sdrh    INSERT INTO two VALUES(4,'IV');
152a60accbdSdrh  }
153c4a3c779Sdrh} {0 {}}
154c73d1f5aSdrhdo_test trans-3.8 {
155a60accbdSdrh  catchsql {
156c4a3c779Sdrh    SELECT a FROM two ORDER BY a;
157a60accbdSdrh  } altdb
158a60accbdSdrh} {0 {1 5 10}}
159c73d1f5aSdrhdo_test trans-3.9 {
160a60accbdSdrh  catchsql {
161c4a3c779Sdrh    SELECT a FROM one ORDER BY a;
162a60accbdSdrh  } altdb
163a60accbdSdrh} {0 {1 2 3}}
164c4a3c779Sdrhdo_test trans-3.10 {
165c4a3c779Sdrh  execsql {END TRANSACTION}
166c4a3c779Sdrh} {}
167*99744fa4Sdrhdo_test trans-3.10b {
168*99744fa4Sdrh  sqlite3_txn_state db
169*99744fa4Sdrh} {0}
170*99744fa4Sdrh
171aef0bf64Sdanielk1977
172c4a3c779Sdrhdo_test trans-3.11 {
173c4a3c779Sdrh  set v [catch {execsql {
174c4a3c779Sdrh    SELECT a FROM two ORDER BY a;
175c4a3c779Sdrh  } altdb} msg]
176c4a3c779Sdrh  lappend v $msg
177c4a3c779Sdrh} {0 {1 4 5 10}}
178c4a3c779Sdrhdo_test trans-3.12 {
179c4a3c779Sdrh  set v [catch {execsql {
180c4a3c779Sdrh    SELECT a FROM one ORDER BY a;
181c4a3c779Sdrh  } altdb} msg]
182c4a3c779Sdrh  lappend v $msg
183c4a3c779Sdrh} {0 {1 2 3 4}}
184c4a3c779Sdrhdo_test trans-3.13 {
185c4a3c779Sdrh  set v [catch {execsql {
186c4a3c779Sdrh    SELECT a FROM two ORDER BY a;
187c4a3c779Sdrh  } db} msg]
188c4a3c779Sdrh  lappend v $msg
189c4a3c779Sdrh} {0 {1 4 5 10}}
190c4a3c779Sdrhdo_test trans-3.14 {
191c4a3c779Sdrh  set v [catch {execsql {
192c4a3c779Sdrh    SELECT a FROM one ORDER BY a;
193c4a3c779Sdrh  } db} msg]
194c4a3c779Sdrh  lappend v $msg
195c4a3c779Sdrh} {0 {1 2 3 4}}
1962150432eSdrhintegrity_check trans-3.15
197e106de63Sdanwal_check_journal_mode trans-3.16
198c4a3c779Sdrh
199d400728aSdrhdo_test trans-4.1 {
200d400728aSdrh  set v [catch {execsql {
201d400728aSdrh    COMMIT;
202d400728aSdrh  } db} msg]
203d400728aSdrh  lappend v $msg
2046b8b8749Sdrh} {1 {cannot commit - no transaction is active}}
205d400728aSdrhdo_test trans-4.2 {
206d400728aSdrh  set v [catch {execsql {
207d400728aSdrh    ROLLBACK;
208d400728aSdrh  } db} msg]
209d400728aSdrh  lappend v $msg
2106b8b8749Sdrh} {1 {cannot rollback - no transaction is active}}
211d400728aSdrhdo_test trans-4.3 {
212a60accbdSdrh  catchsql {
213d400728aSdrh    BEGIN TRANSACTION;
2141d850a72Sdanielk1977    UPDATE two SET a = 0 WHERE 0;
215d400728aSdrh    SELECT a FROM two ORDER BY a;
216a60accbdSdrh  } db
217d400728aSdrh} {0 {1 4 5 10}}
218d400728aSdrhdo_test trans-4.4 {
219a60accbdSdrh  catchsql {
220d400728aSdrh    SELECT a FROM two ORDER BY a;
221a60accbdSdrh  } altdb
222a60accbdSdrh} {0 {1 4 5 10}}
223d400728aSdrhdo_test trans-4.5 {
224a60accbdSdrh  catchsql {
225d400728aSdrh    SELECT a FROM one ORDER BY a;
226a60accbdSdrh  } altdb
227a60accbdSdrh} {0 {1 2 3 4}}
228d400728aSdrhdo_test trans-4.6 {
229a60accbdSdrh  catchsql {
230d400728aSdrh    BEGIN TRANSACTION;
231d400728aSdrh    SELECT a FROM one ORDER BY a;
232a60accbdSdrh  } db
2336b8b8749Sdrh} {1 {cannot start a transaction within a transaction}}
234d400728aSdrhdo_test trans-4.7 {
235a60accbdSdrh  catchsql {
236d400728aSdrh    SELECT a FROM two ORDER BY a;
237a60accbdSdrh  } altdb
238a60accbdSdrh} {0 {1 4 5 10}}
239d400728aSdrhdo_test trans-4.8 {
240a60accbdSdrh  catchsql {
241d400728aSdrh    SELECT a FROM one ORDER BY a;
242a60accbdSdrh  } altdb
243a60accbdSdrh} {0 {1 2 3 4}}
244d400728aSdrhdo_test trans-4.9 {
245d400728aSdrh  set v [catch {execsql {
246d400728aSdrh    END TRANSACTION;
247d400728aSdrh    SELECT a FROM two ORDER BY a;
248d400728aSdrh  } db} msg]
249d400728aSdrh  lappend v $msg
250d400728aSdrh} {0 {1 4 5 10}}
251d400728aSdrhdo_test trans-4.10 {
252d400728aSdrh  set v [catch {execsql {
253d400728aSdrh    SELECT a FROM two ORDER BY a;
254d400728aSdrh  } altdb} msg]
255d400728aSdrh  lappend v $msg
256d400728aSdrh} {0 {1 4 5 10}}
257d400728aSdrhdo_test trans-4.11 {
258d400728aSdrh  set v [catch {execsql {
259d400728aSdrh    SELECT a FROM one ORDER BY a;
260d400728aSdrh  } altdb} msg]
261d400728aSdrh  lappend v $msg
262d400728aSdrh} {0 {1 2 3 4}}
2632150432eSdrhintegrity_check trans-4.12
264e106de63Sdanwal_check_journal_mode trans-4.13
265e106de63Sdanwal_check_journal_mode trans-4.14 altdb
2662150432eSdrhdo_test trans-4.98 {
267c4a3c779Sdrh  altdb close
268c4a3c779Sdrh  execsql {
269c4a3c779Sdrh    DROP TABLE one;
270c4a3c779Sdrh    DROP TABLE two;
271c4a3c779Sdrh  }
272c4a3c779Sdrh} {}
2732150432eSdrhintegrity_check trans-4.99
274c4a3c779Sdrh
275c73d1f5aSdrh# Check out the commit/rollback behavior of the database
276c73d1f5aSdrh#
277c73d1f5aSdrhdo_test trans-5.1 {
278c73d1f5aSdrh  execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
279c73d1f5aSdrh} {}
280c73d1f5aSdrhdo_test trans-5.2 {
281c73d1f5aSdrh  execsql {BEGIN TRANSACTION}
282c73d1f5aSdrh  execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
283c73d1f5aSdrh} {}
284*99744fa4Sdrhdo_test trans-5.2b {
285*99744fa4Sdrh  sqlite3_txn_state db
286*99744fa4Sdrh} {1}
287*99744fa4Sdrhdo_test trans-5.2c {
288*99744fa4Sdrh  sqlite3_txn_state db main
289*99744fa4Sdrh} {1}
290*99744fa4Sdrhdo_test trans-5.2d {
291*99744fa4Sdrh  sqlite3_txn_state db temp
292*99744fa4Sdrh} {0}
293c73d1f5aSdrhdo_test trans-5.3 {
294c73d1f5aSdrh  execsql {CREATE TABLE one(a text, b int)}
295c73d1f5aSdrh  execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
296c73d1f5aSdrh} {one}
297c73d1f5aSdrhdo_test trans-5.4 {
298c73d1f5aSdrh  execsql {SELECT a,b FROM one ORDER BY b}
299c73d1f5aSdrh} {}
300c73d1f5aSdrhdo_test trans-5.5 {
301c73d1f5aSdrh  execsql {INSERT INTO one(a,b) VALUES('hello', 1)}
302c73d1f5aSdrh  execsql {SELECT a,b FROM one ORDER BY b}
303c73d1f5aSdrh} {hello 1}
304c73d1f5aSdrhdo_test trans-5.6 {
305c73d1f5aSdrh  execsql {ROLLBACK}
306c73d1f5aSdrh  execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
307c73d1f5aSdrh} {}
308c73d1f5aSdrhdo_test trans-5.7 {
309c73d1f5aSdrh  set v [catch {
310c73d1f5aSdrh    execsql {SELECT a,b FROM one ORDER BY b}
311c73d1f5aSdrh  } msg]
312c73d1f5aSdrh  lappend v $msg
313c73d1f5aSdrh} {1 {no such table: one}}
314d400728aSdrh
315afa4a020Sdrh# Test commits and rollbacks of table CREATE TABLEs, CREATE INDEXs
316afa4a020Sdrh# DROP TABLEs and DROP INDEXs
317afa4a020Sdrh#
318afa4a020Sdrhdo_test trans-5.8 {
319afa4a020Sdrh  execsql {
320afa4a020Sdrh    SELECT name fROM sqlite_master
321afa4a020Sdrh    WHERE type='table' OR type='index'
322afa4a020Sdrh    ORDER BY name
323afa4a020Sdrh  }
324afa4a020Sdrh} {}
325afa4a020Sdrhdo_test trans-5.9 {
326afa4a020Sdrh  execsql {
327afa4a020Sdrh    BEGIN TRANSACTION;
328afa4a020Sdrh    CREATE TABLE t1(a int, b int, c int);
329afa4a020Sdrh    SELECT name fROM sqlite_master
330afa4a020Sdrh    WHERE type='table' OR type='index'
331afa4a020Sdrh    ORDER BY name;
332afa4a020Sdrh  }
333afa4a020Sdrh} {t1}
334afa4a020Sdrhdo_test trans-5.10 {
335afa4a020Sdrh  execsql {
336afa4a020Sdrh    CREATE INDEX i1 ON t1(a);
337afa4a020Sdrh    SELECT name fROM sqlite_master
338afa4a020Sdrh    WHERE type='table' OR type='index'
339afa4a020Sdrh    ORDER BY name;
340afa4a020Sdrh  }
341afa4a020Sdrh} {i1 t1}
342afa4a020Sdrhdo_test trans-5.11 {
343afa4a020Sdrh  execsql {
344afa4a020Sdrh    COMMIT;
345afa4a020Sdrh    SELECT name fROM sqlite_master
346afa4a020Sdrh    WHERE type='table' OR type='index'
347afa4a020Sdrh    ORDER BY name;
348afa4a020Sdrh  }
349afa4a020Sdrh} {i1 t1}
350afa4a020Sdrhdo_test trans-5.12 {
351afa4a020Sdrh  execsql {
352afa4a020Sdrh    BEGIN TRANSACTION;
353afa4a020Sdrh    CREATE TABLE t2(a int, b int, c int);
354afa4a020Sdrh    CREATE INDEX i2a ON t2(a);
355afa4a020Sdrh    CREATE INDEX i2b ON t2(b);
356afa4a020Sdrh    DROP TABLE t1;
357afa4a020Sdrh    SELECT name fROM sqlite_master
358afa4a020Sdrh    WHERE type='table' OR type='index'
359afa4a020Sdrh    ORDER BY name;
360afa4a020Sdrh  }
361afa4a020Sdrh} {i2a i2b t2}
362afa4a020Sdrhdo_test trans-5.13 {
363afa4a020Sdrh  execsql {
364afa4a020Sdrh    ROLLBACK;
365afa4a020Sdrh    SELECT name fROM sqlite_master
366afa4a020Sdrh    WHERE type='table' OR type='index'
367afa4a020Sdrh    ORDER BY name;
368afa4a020Sdrh  }
369afa4a020Sdrh} {i1 t1}
370afa4a020Sdrhdo_test trans-5.14 {
371afa4a020Sdrh  execsql {
372afa4a020Sdrh    BEGIN TRANSACTION;
373afa4a020Sdrh    DROP INDEX i1;
374afa4a020Sdrh    SELECT name fROM sqlite_master
375afa4a020Sdrh    WHERE type='table' OR type='index'
376afa4a020Sdrh    ORDER BY name;
377afa4a020Sdrh  }
378afa4a020Sdrh} {t1}
379afa4a020Sdrhdo_test trans-5.15 {
380afa4a020Sdrh  execsql {
381afa4a020Sdrh    ROLLBACK;
382afa4a020Sdrh    SELECT name fROM sqlite_master
383afa4a020Sdrh    WHERE type='table' OR type='index'
384afa4a020Sdrh    ORDER BY name;
385afa4a020Sdrh  }
386afa4a020Sdrh} {i1 t1}
387afa4a020Sdrhdo_test trans-5.16 {
388afa4a020Sdrh  execsql {
389afa4a020Sdrh    BEGIN TRANSACTION;
390afa4a020Sdrh    DROP INDEX i1;
391afa4a020Sdrh    CREATE TABLE t2(x int, y int, z int);
392afa4a020Sdrh    CREATE INDEX i2x ON t2(x);
393afa4a020Sdrh    CREATE INDEX i2y ON t2(y);
394afa4a020Sdrh    INSERT INTO t2 VALUES(1,2,3);
395afa4a020Sdrh    SELECT name fROM sqlite_master
396afa4a020Sdrh    WHERE type='table' OR type='index'
397afa4a020Sdrh    ORDER BY name;
398afa4a020Sdrh  }
399afa4a020Sdrh} {i2x i2y t1 t2}
400afa4a020Sdrhdo_test trans-5.17 {
401afa4a020Sdrh  execsql {
402afa4a020Sdrh    COMMIT;
403afa4a020Sdrh    SELECT name fROM sqlite_master
404afa4a020Sdrh    WHERE type='table' OR type='index'
405afa4a020Sdrh    ORDER BY name;
406afa4a020Sdrh  }
407afa4a020Sdrh} {i2x i2y t1 t2}
408afa4a020Sdrhdo_test trans-5.18 {
409afa4a020Sdrh  execsql {
410afa4a020Sdrh    SELECT * FROM t2;
411afa4a020Sdrh  }
412afa4a020Sdrh} {1 2 3}
413afa4a020Sdrhdo_test trans-5.19 {
414afa4a020Sdrh  execsql {
415afa4a020Sdrh    SELECT x FROM t2 WHERE y=2;
416afa4a020Sdrh  }
417afa4a020Sdrh} {1}
418afa4a020Sdrhdo_test trans-5.20 {
419afa4a020Sdrh  execsql {
420afa4a020Sdrh    BEGIN TRANSACTION;
421afa4a020Sdrh    DROP TABLE t1;
422afa4a020Sdrh    DROP TABLE t2;
423afa4a020Sdrh    SELECT name fROM sqlite_master
424afa4a020Sdrh    WHERE type='table' OR type='index'
425afa4a020Sdrh    ORDER BY name;
426afa4a020Sdrh  }
427afa4a020Sdrh} {}
428afa4a020Sdrhdo_test trans-5.21 {
429afa4a020Sdrh  set r [catch {execsql {
430afa4a020Sdrh    SELECT * FROM t2
431afa4a020Sdrh  }} msg]
432afa4a020Sdrh  lappend r $msg
433afa4a020Sdrh} {1 {no such table: t2}}
434afa4a020Sdrhdo_test trans-5.22 {
435afa4a020Sdrh  execsql {
436afa4a020Sdrh    ROLLBACK;
437afa4a020Sdrh    SELECT name fROM sqlite_master
438afa4a020Sdrh    WHERE type='table' OR type='index'
439afa4a020Sdrh    ORDER BY name;
440afa4a020Sdrh  }
441afa4a020Sdrh} {i2x i2y t1 t2}
442afa4a020Sdrhdo_test trans-5.23 {
443afa4a020Sdrh  execsql {
444afa4a020Sdrh    SELECT * FROM t2;
445afa4a020Sdrh  }
446afa4a020Sdrh} {1 2 3}
4472150432eSdrhintegrity_check trans-5.23
4482150432eSdrh
449afa4a020Sdrh
45074e24cd0Sdrh# Try to DROP and CREATE tables and indices with the same name
45174e24cd0Sdrh# within a transaction.  Make sure ROLLBACK works.
45274e24cd0Sdrh#
45374e24cd0Sdrhdo_test trans-6.1 {
45474e24cd0Sdrh  execsql2 {
45574e24cd0Sdrh    INSERT INTO t1 VALUES(1,2,3);
45674e24cd0Sdrh    BEGIN TRANSACTION;
45774e24cd0Sdrh    DROP TABLE t1;
45874e24cd0Sdrh    CREATE TABLE t1(p,q,r);
45974e24cd0Sdrh    ROLLBACK;
46074e24cd0Sdrh    SELECT * FROM t1;
46174e24cd0Sdrh  }
46274e24cd0Sdrh} {a 1 b 2 c 3}
46374e24cd0Sdrhdo_test trans-6.2 {
46474e24cd0Sdrh  execsql2 {
46574e24cd0Sdrh    INSERT INTO t1 VALUES(1,2,3);
46674e24cd0Sdrh    BEGIN TRANSACTION;
46774e24cd0Sdrh    DROP TABLE t1;
46874e24cd0Sdrh    CREATE TABLE t1(p,q,r);
46974e24cd0Sdrh    COMMIT;
47074e24cd0Sdrh    SELECT * FROM t1;
47174e24cd0Sdrh  }
47274e24cd0Sdrh} {}
47374e24cd0Sdrhdo_test trans-6.3 {
47474e24cd0Sdrh  execsql2 {
47574e24cd0Sdrh    INSERT INTO t1 VALUES(1,2,3);
47674e24cd0Sdrh    SELECT * FROM t1;
47774e24cd0Sdrh  }
47874e24cd0Sdrh} {p 1 q 2 r 3}
47974e24cd0Sdrhdo_test trans-6.4 {
48074e24cd0Sdrh  execsql2 {
48174e24cd0Sdrh    BEGIN TRANSACTION;
48274e24cd0Sdrh    DROP TABLE t1;
48374e24cd0Sdrh    CREATE TABLE t1(a,b,c);
48474e24cd0Sdrh    INSERT INTO t1 VALUES(4,5,6);
48574e24cd0Sdrh    SELECT * FROM t1;
48674e24cd0Sdrh    DROP TABLE t1;
48774e24cd0Sdrh  }
48874e24cd0Sdrh} {a 4 b 5 c 6}
48974e24cd0Sdrhdo_test trans-6.5 {
49074e24cd0Sdrh  execsql2 {
49174e24cd0Sdrh    ROLLBACK;
49274e24cd0Sdrh    SELECT * FROM t1;
49374e24cd0Sdrh  }
49474e24cd0Sdrh} {p 1 q 2 r 3}
49574e24cd0Sdrhdo_test trans-6.6 {
49674e24cd0Sdrh  execsql2 {
49774e24cd0Sdrh    BEGIN TRANSACTION;
49874e24cd0Sdrh    DROP TABLE t1;
49974e24cd0Sdrh    CREATE TABLE t1(a,b,c);
50074e24cd0Sdrh    INSERT INTO t1 VALUES(4,5,6);
50174e24cd0Sdrh    SELECT * FROM t1;
50274e24cd0Sdrh    DROP TABLE t1;
50374e24cd0Sdrh  }
50474e24cd0Sdrh} {a 4 b 5 c 6}
50574e24cd0Sdrhdo_test trans-6.7 {
50674e24cd0Sdrh  catchsql {
50774e24cd0Sdrh    COMMIT;
50874e24cd0Sdrh    SELECT * FROM t1;
50974e24cd0Sdrh  }
51074e24cd0Sdrh} {1 {no such table: t1}}
51174e24cd0Sdrh
512d229ca94Sdrh# Repeat on a table with an automatically generated index.
513d229ca94Sdrh#
514d229ca94Sdrhdo_test trans-6.10 {
515d229ca94Sdrh  execsql2 {
516d229ca94Sdrh    CREATE TABLE t1(a unique,b,c);
517d229ca94Sdrh    INSERT INTO t1 VALUES(1,2,3);
518d229ca94Sdrh    BEGIN TRANSACTION;
519d229ca94Sdrh    DROP TABLE t1;
520d229ca94Sdrh    CREATE TABLE t1(p unique,q,r);
521d229ca94Sdrh    ROLLBACK;
522d229ca94Sdrh    SELECT * FROM t1;
523d229ca94Sdrh  }
524d229ca94Sdrh} {a 1 b 2 c 3}
525d229ca94Sdrhdo_test trans-6.11 {
526d229ca94Sdrh  execsql2 {
527d229ca94Sdrh    BEGIN TRANSACTION;
528d229ca94Sdrh    DROP TABLE t1;
529d229ca94Sdrh    CREATE TABLE t1(p unique,q,r);
530d229ca94Sdrh    COMMIT;
531d229ca94Sdrh    SELECT * FROM t1;
532d229ca94Sdrh  }
533d229ca94Sdrh} {}
534d229ca94Sdrhdo_test trans-6.12 {
535d229ca94Sdrh  execsql2 {
536d229ca94Sdrh    INSERT INTO t1 VALUES(1,2,3);
537d229ca94Sdrh    SELECT * FROM t1;
538d229ca94Sdrh  }
539d229ca94Sdrh} {p 1 q 2 r 3}
540d229ca94Sdrhdo_test trans-6.13 {
541d229ca94Sdrh  execsql2 {
542d229ca94Sdrh    BEGIN TRANSACTION;
543d229ca94Sdrh    DROP TABLE t1;
544d229ca94Sdrh    CREATE TABLE t1(a unique,b,c);
545d229ca94Sdrh    INSERT INTO t1 VALUES(4,5,6);
546d229ca94Sdrh    SELECT * FROM t1;
547d229ca94Sdrh    DROP TABLE t1;
548d229ca94Sdrh  }
549d229ca94Sdrh} {a 4 b 5 c 6}
550d229ca94Sdrhdo_test trans-6.14 {
551d229ca94Sdrh  execsql2 {
552d229ca94Sdrh    ROLLBACK;
553d229ca94Sdrh    SELECT * FROM t1;
554d229ca94Sdrh  }
555d229ca94Sdrh} {p 1 q 2 r 3}
556d229ca94Sdrhdo_test trans-6.15 {
557d229ca94Sdrh  execsql2 {
558d229ca94Sdrh    BEGIN TRANSACTION;
559d229ca94Sdrh    DROP TABLE t1;
560d229ca94Sdrh    CREATE TABLE t1(a unique,b,c);
561d229ca94Sdrh    INSERT INTO t1 VALUES(4,5,6);
562d229ca94Sdrh    SELECT * FROM t1;
563d229ca94Sdrh    DROP TABLE t1;
564d229ca94Sdrh  }
565d229ca94Sdrh} {a 4 b 5 c 6}
566d229ca94Sdrhdo_test trans-6.16 {
567d229ca94Sdrh  catchsql {
568d229ca94Sdrh    COMMIT;
569d229ca94Sdrh    SELECT * FROM t1;
570d229ca94Sdrh  }
571d229ca94Sdrh} {1 {no such table: t1}}
572d229ca94Sdrh
573d229ca94Sdrhdo_test trans-6.20 {
57474e24cd0Sdrh  execsql {
57574e24cd0Sdrh    CREATE TABLE t1(a integer primary key,b,c);
57674e24cd0Sdrh    INSERT INTO t1 VALUES(1,-2,-3);
57774e24cd0Sdrh    INSERT INTO t1 VALUES(4,-5,-6);
57874e24cd0Sdrh    SELECT * FROM t1;
57974e24cd0Sdrh  }
58074e24cd0Sdrh} {1 -2 -3 4 -5 -6}
581d229ca94Sdrhdo_test trans-6.21 {
58274e24cd0Sdrh  execsql {
58374e24cd0Sdrh    CREATE INDEX i1 ON t1(b);
58474e24cd0Sdrh    SELECT * FROM t1 WHERE b<1;
58574e24cd0Sdrh  }
58674e24cd0Sdrh} {4 -5 -6 1 -2 -3}
587d229ca94Sdrhdo_test trans-6.22 {
58874e24cd0Sdrh  execsql {
58974e24cd0Sdrh    BEGIN TRANSACTION;
59074e24cd0Sdrh    DROP INDEX i1;
59174e24cd0Sdrh    SELECT * FROM t1 WHERE b<1;
59274e24cd0Sdrh    ROLLBACK;
59374e24cd0Sdrh  }
59474e24cd0Sdrh} {1 -2 -3 4 -5 -6}
595d229ca94Sdrhdo_test trans-6.23 {
59674e24cd0Sdrh  execsql {
59774e24cd0Sdrh    SELECT * FROM t1 WHERE b<1;
59874e24cd0Sdrh  }
59974e24cd0Sdrh} {4 -5 -6 1 -2 -3}
600d229ca94Sdrhdo_test trans-6.24 {
60174e24cd0Sdrh  execsql {
60274e24cd0Sdrh    BEGIN TRANSACTION;
60374e24cd0Sdrh    DROP TABLE t1;
60474e24cd0Sdrh    ROLLBACK;
60574e24cd0Sdrh    SELECT * FROM t1 WHERE b<1;
60674e24cd0Sdrh  }
60774e24cd0Sdrh} {4 -5 -6 1 -2 -3}
60874e24cd0Sdrh
609d229ca94Sdrhdo_test trans-6.25 {
61074e24cd0Sdrh  execsql {
61174e24cd0Sdrh    BEGIN TRANSACTION;
61274e24cd0Sdrh    DROP INDEX i1;
61374e24cd0Sdrh    CREATE INDEX i1 ON t1(c);
61474e24cd0Sdrh    SELECT * FROM t1 WHERE b<1;
61574e24cd0Sdrh  }
61674e24cd0Sdrh} {1 -2 -3 4 -5 -6}
617d229ca94Sdrhdo_test trans-6.26 {
61874e24cd0Sdrh  execsql {
61974e24cd0Sdrh    SELECT * FROM t1 WHERE c<1;
62074e24cd0Sdrh  }
62174e24cd0Sdrh} {4 -5 -6 1 -2 -3}
622d229ca94Sdrhdo_test trans-6.27 {
62374e24cd0Sdrh  execsql {
62474e24cd0Sdrh    ROLLBACK;
62574e24cd0Sdrh    SELECT * FROM t1 WHERE b<1;
62674e24cd0Sdrh  }
62774e24cd0Sdrh} {4 -5 -6 1 -2 -3}
628d229ca94Sdrhdo_test trans-6.28 {
62974e24cd0Sdrh  execsql {
63074e24cd0Sdrh    SELECT * FROM t1 WHERE c<1;
63174e24cd0Sdrh  }
63274e24cd0Sdrh} {1 -2 -3 4 -5 -6}
63374e24cd0Sdrh
634d229ca94Sdrh# The following repeats steps 6.20 through 6.28, but puts a "unique"
635d229ca94Sdrh# constraint the first field of the table in order to generate an
636d229ca94Sdrh# automatic index.
637d229ca94Sdrh#
638d229ca94Sdrhdo_test trans-6.30 {
639d229ca94Sdrh  execsql {
640d229ca94Sdrh    BEGIN TRANSACTION;
641d229ca94Sdrh    DROP TABLE t1;
642d229ca94Sdrh    CREATE TABLE t1(a int unique,b,c);
643d229ca94Sdrh    COMMIT;
644d229ca94Sdrh    INSERT INTO t1 VALUES(1,-2,-3);
645d229ca94Sdrh    INSERT INTO t1 VALUES(4,-5,-6);
646d229ca94Sdrh    SELECT * FROM t1 ORDER BY a;
647d229ca94Sdrh  }
648d229ca94Sdrh} {1 -2 -3 4 -5 -6}
649d229ca94Sdrhdo_test trans-6.31 {
650d229ca94Sdrh  execsql {
651d229ca94Sdrh    CREATE INDEX i1 ON t1(b);
652d229ca94Sdrh    SELECT * FROM t1 WHERE b<1;
653d229ca94Sdrh  }
654d229ca94Sdrh} {4 -5 -6 1 -2 -3}
655d229ca94Sdrhdo_test trans-6.32 {
656d229ca94Sdrh  execsql {
657d229ca94Sdrh    BEGIN TRANSACTION;
658d229ca94Sdrh    DROP INDEX i1;
659d229ca94Sdrh    SELECT * FROM t1 WHERE b<1;
660d229ca94Sdrh    ROLLBACK;
661d229ca94Sdrh  }
662d229ca94Sdrh} {1 -2 -3 4 -5 -6}
663d229ca94Sdrhdo_test trans-6.33 {
664d229ca94Sdrh  execsql {
665d229ca94Sdrh    SELECT * FROM t1 WHERE b<1;
666d229ca94Sdrh  }
667d229ca94Sdrh} {4 -5 -6 1 -2 -3}
668d229ca94Sdrhdo_test trans-6.34 {
669d229ca94Sdrh  execsql {
670d229ca94Sdrh    BEGIN TRANSACTION;
671d229ca94Sdrh    DROP TABLE t1;
672d229ca94Sdrh    ROLLBACK;
673d229ca94Sdrh    SELECT * FROM t1 WHERE b<1;
674d229ca94Sdrh  }
675d229ca94Sdrh} {4 -5 -6 1 -2 -3}
67674e24cd0Sdrh
677d229ca94Sdrhdo_test trans-6.35 {
678d229ca94Sdrh  execsql {
679d229ca94Sdrh    BEGIN TRANSACTION;
680d229ca94Sdrh    DROP INDEX i1;
681d229ca94Sdrh    CREATE INDEX i1 ON t1(c);
682d229ca94Sdrh    SELECT * FROM t1 WHERE b<1;
683d229ca94Sdrh  }
684d229ca94Sdrh} {1 -2 -3 4 -5 -6}
685d229ca94Sdrhdo_test trans-6.36 {
686d229ca94Sdrh  execsql {
687d229ca94Sdrh    SELECT * FROM t1 WHERE c<1;
688d229ca94Sdrh  }
689d229ca94Sdrh} {4 -5 -6 1 -2 -3}
690da9e0346Sdrhdo_test trans-6.37 {
691da9e0346Sdrh  execsql {
692da9e0346Sdrh    DROP INDEX i1;
693da9e0346Sdrh    SELECT * FROM t1 WHERE c<1;
694da9e0346Sdrh  }
695da9e0346Sdrh} {1 -2 -3 4 -5 -6}
696da9e0346Sdrhdo_test trans-6.38 {
697d229ca94Sdrh  execsql {
698d229ca94Sdrh    ROLLBACK;
699d229ca94Sdrh    SELECT * FROM t1 WHERE b<1;
700d229ca94Sdrh  }
701d229ca94Sdrh} {4 -5 -6 1 -2 -3}
702da9e0346Sdrhdo_test trans-6.39 {
703d229ca94Sdrh  execsql {
704d229ca94Sdrh    SELECT * FROM t1 WHERE c<1;
705d229ca94Sdrh  }
706d229ca94Sdrh} {1 -2 -3 4 -5 -6}
7072150432eSdrhintegrity_check trans-6.40
70874e24cd0Sdrh
70928b4e489Sdrh# Test to make sure rollback restores the database back to its original
71028b4e489Sdrh# state.
71128b4e489Sdrh#
71228b4e489Sdrhdo_test trans-7.1 {
71328b4e489Sdrh  execsql {BEGIN}
71428b4e489Sdrh  for {set i 0} {$i<1000} {incr i} {
71528b4e489Sdrh    set r1 [expr {rand()}]
71628b4e489Sdrh    set r2 [expr {rand()}]
71728b4e489Sdrh    set r3 [expr {rand()}]
71828b4e489Sdrh    execsql "INSERT INTO t2 VALUES($r1,$r2,$r3)"
71928b4e489Sdrh  }
72028b4e489Sdrh  execsql {COMMIT}
72128b4e489Sdrh  set ::checksum [execsql {SELECT md5sum(x,y,z) FROM t2}]
72228b4e489Sdrh  set ::checksum2 [
72328b4e489Sdrh    execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
72428b4e489Sdrh  ]
72528b4e489Sdrh  execsql {SELECT count(*) FROM t2}
72628b4e489Sdrh} {1001}
72728b4e489Sdrhdo_test trans-7.2 {
72828b4e489Sdrh  execsql {SELECT md5sum(x,y,z) FROM t2}
72928b4e489Sdrh} $checksum
73028b4e489Sdrhdo_test trans-7.2.1 {
73128b4e489Sdrh  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
73228b4e489Sdrh} $checksum2
73328b4e489Sdrhdo_test trans-7.3 {
73428b4e489Sdrh  execsql {
73528b4e489Sdrh    BEGIN;
73628b4e489Sdrh    DELETE FROM t2;
73728b4e489Sdrh    ROLLBACK;
73828b4e489Sdrh    SELECT md5sum(x,y,z) FROM t2;
73928b4e489Sdrh  }
74028b4e489Sdrh} $checksum
74128b4e489Sdrhdo_test trans-7.4 {
74228b4e489Sdrh  execsql {
74328b4e489Sdrh    BEGIN;
74428b4e489Sdrh    INSERT INTO t2 SELECT * FROM t2;
74528b4e489Sdrh    ROLLBACK;
74628b4e489Sdrh    SELECT md5sum(x,y,z) FROM t2;
74728b4e489Sdrh  }
74828b4e489Sdrh} $checksum
74928b4e489Sdrhdo_test trans-7.5 {
75028b4e489Sdrh  execsql {
75128b4e489Sdrh    BEGIN;
75228b4e489Sdrh    DELETE FROM t2;
75328b4e489Sdrh    ROLLBACK;
75428b4e489Sdrh    SELECT md5sum(x,y,z) FROM t2;
75528b4e489Sdrh  }
75628b4e489Sdrh} $checksum
75728b4e489Sdrhdo_test trans-7.6 {
75828b4e489Sdrh  execsql {
75928b4e489Sdrh    BEGIN;
76028b4e489Sdrh    INSERT INTO t2 SELECT * FROM t2;
76128b4e489Sdrh    ROLLBACK;
76228b4e489Sdrh    SELECT md5sum(x,y,z) FROM t2;
76328b4e489Sdrh  }
76428b4e489Sdrh} $checksum
76528b4e489Sdrhdo_test trans-7.7 {
76628b4e489Sdrh  execsql {
76728b4e489Sdrh    BEGIN;
76828b4e489Sdrh    CREATE TABLE t3 AS SELECT * FROM t2;
76928b4e489Sdrh    INSERT INTO t2 SELECT * FROM t3;
77028b4e489Sdrh    ROLLBACK;
77128b4e489Sdrh    SELECT md5sum(x,y,z) FROM t2;
77228b4e489Sdrh  }
77328b4e489Sdrh} $checksum
77428b4e489Sdrhdo_test trans-7.8 {
77528b4e489Sdrh  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
77628b4e489Sdrh} $checksum2
77753c0f748Sdanielk1977ifcapable tempdb {
77828b4e489Sdrh  do_test trans-7.9 {
77928b4e489Sdrh    execsql {
78028b4e489Sdrh      BEGIN;
78128b4e489Sdrh      CREATE TEMP TABLE t3 AS SELECT * FROM t2;
78228b4e489Sdrh      INSERT INTO t2 SELECT * FROM t3;
78328b4e489Sdrh      ROLLBACK;
78428b4e489Sdrh      SELECT md5sum(x,y,z) FROM t2;
78528b4e489Sdrh    }
78628b4e489Sdrh  } $checksum
78753c0f748Sdanielk1977}
78828b4e489Sdrhdo_test trans-7.10 {
78928b4e489Sdrh  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
79028b4e489Sdrh} $checksum2
79153c0f748Sdanielk1977ifcapable tempdb {
79228b4e489Sdrh  do_test trans-7.11 {
79328b4e489Sdrh    execsql {
79428b4e489Sdrh      BEGIN;
79528b4e489Sdrh      CREATE TEMP TABLE t3 AS SELECT * FROM t2;
79628b4e489Sdrh      INSERT INTO t2 SELECT * FROM t3;
79728b4e489Sdrh      DROP INDEX i2x;
79828b4e489Sdrh      DROP INDEX i2y;
79928b4e489Sdrh      CREATE INDEX i3a ON t3(x);
80028b4e489Sdrh      ROLLBACK;
80128b4e489Sdrh      SELECT md5sum(x,y,z) FROM t2;
80228b4e489Sdrh    }
80328b4e489Sdrh  } $checksum
80453c0f748Sdanielk1977}
80528b4e489Sdrhdo_test trans-7.12 {
80628b4e489Sdrh  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
80728b4e489Sdrh} $checksum2
80853c0f748Sdanielk1977ifcapable tempdb {
80928b4e489Sdrh  do_test trans-7.13 {
81028b4e489Sdrh    execsql {
81128b4e489Sdrh      BEGIN;
81228b4e489Sdrh      DROP TABLE t2;
81328b4e489Sdrh      ROLLBACK;
81428b4e489Sdrh      SELECT md5sum(x,y,z) FROM t2;
81528b4e489Sdrh    }
81628b4e489Sdrh  } $checksum
81753c0f748Sdanielk1977}
81828b4e489Sdrhdo_test trans-7.14 {
81928b4e489Sdrh  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
82028b4e489Sdrh} $checksum2
8212150432eSdrhintegrity_check trans-7.15
822e106de63Sdanwal_check_journal_mode trans-7.16
82328b4e489Sdrh
82428b4e489Sdrh# Arrange for another process to begin modifying the database but abort
82528b4e489Sdrh# and die in the middle of the modification.  Then have this process read
82628b4e489Sdrh# the database.  This process should detect the journal file and roll it
82728b4e489Sdrh# back.  Verify that this happens correctly.
82828b4e489Sdrh#
82928b4e489Sdrhset fd [open test.tcl w]
83028b4e489Sdrhputs $fd {
83162e5a81aSdanielk1977  sqlite3_test_control_pending_byte 0x0010000
832ef4ac8f9Sdrh  sqlite3 db test.db
83328b4e489Sdrh  db eval {
834489c4677Sdrh    PRAGMA default_cache_size=20;
83528b4e489Sdrh    BEGIN;
83628b4e489Sdrh    CREATE TABLE t3 AS SELECT * FROM t2;
83728b4e489Sdrh    DELETE FROM t2;
83828b4e489Sdrh  }
83928b4e489Sdrh  sqlite_abort
84028b4e489Sdrh}
84128b4e489Sdrhclose $fd
84228b4e489Sdrhdo_test trans-8.1 {
84328b4e489Sdrh  catch {exec [info nameofexec] test.tcl}
84428b4e489Sdrh  execsql {SELECT md5sum(x,y,z) FROM t2}
84528b4e489Sdrh} $checksum
84628b4e489Sdrhdo_test trans-8.2 {
84728b4e489Sdrh  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
84828b4e489Sdrh} $checksum2
8492150432eSdrhintegrity_check trans-8.3
85016e45a43Sdrhset fd [open test.tcl w]
85116e45a43Sdrhputs $fd {
85262e5a81aSdanielk1977  sqlite3_test_control_pending_byte 0x0010000
85316e45a43Sdrh  sqlite3 db test.db
85416e45a43Sdrh  db eval {
85516e45a43Sdrh    PRAGMA journal_mode=persist;
85616e45a43Sdrh    PRAGMA default_cache_size=20;
85716e45a43Sdrh    BEGIN;
85816e45a43Sdrh    CREATE TABLE t3 AS SELECT * FROM t2;
85916e45a43Sdrh    DELETE FROM t2;
86016e45a43Sdrh  }
86116e45a43Sdrh  sqlite_abort
86216e45a43Sdrh}
86316e45a43Sdrhclose $fd
86416e45a43Sdrhdo_test trans-8.4 {
86516e45a43Sdrh  catch {exec [info nameofexec] test.tcl}
86616e45a43Sdrh  execsql {SELECT md5sum(x,y,z) FROM t2}
86716e45a43Sdrh} $checksum
86816e45a43Sdrhdo_test trans-8.5 {
86916e45a43Sdrh  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
87016e45a43Sdrh} $checksum2
87116e45a43Sdrhintegrity_check trans-8.6
872e106de63Sdanwal_check_journal_mode trans-8.7
87362e5a81aSdanielk1977
874193a6b41Sdrh# In the following sequence of tests, compute the MD5 sum of the content
875193a6b41Sdrh# of a table, make lots of modifications to that table, then do a rollback.
876193a6b41Sdrh# Verify that after the rollback, the MD5 checksum is unchanged.
877193a6b41Sdrh#
878193a6b41Sdrhdo_test trans-9.1 {
879193a6b41Sdrh  execsql {
8804303feedSdrh    PRAGMA default_cache_size=10;
8814303feedSdrh  }
8824303feedSdrh  db close
883ef4ac8f9Sdrh  sqlite3 db test.db
8844303feedSdrh  execsql {
885193a6b41Sdrh    BEGIN;
886193a6b41Sdrh    CREATE TABLE t3(x TEXT);
887193a6b41Sdrh    INSERT INTO t3 VALUES(randstr(10,400));
888193a6b41Sdrh    INSERT INTO t3 VALUES(randstr(10,400));
889193a6b41Sdrh    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
890193a6b41Sdrh    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
891193a6b41Sdrh    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
892193a6b41Sdrh    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
893193a6b41Sdrh    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
894193a6b41Sdrh    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
895193a6b41Sdrh    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
896193a6b41Sdrh    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
897193a6b41Sdrh    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
898193a6b41Sdrh    COMMIT;
899193a6b41Sdrh    SELECT count(*) FROM t3;
900193a6b41Sdrh  }
901193a6b41Sdrh} {1024}
902e106de63Sdanwal_check_journal_mode trans-9.1.1
903193a6b41Sdrh
904193a6b41Sdrh# The following procedure computes a "signature" for table "t3".  If
905193a6b41Sdrh# T3 changes in any way, the signature should change.
906193a6b41Sdrh#
907193a6b41Sdrh# This is used to test ROLLBACK.  We gather a signature for t3, then
908193a6b41Sdrh# make lots of changes to t3, then rollback and take another signature.
909193a6b41Sdrh# The two signatures should be the same.
910193a6b41Sdrh#
911193a6b41Sdrhproc signature {} {
912193a6b41Sdrh  return [db eval {SELECT count(*), md5sum(x) FROM t3}]
913193a6b41Sdrh}
914193a6b41Sdrh
915193a6b41Sdrh# Repeat the following group of tests 20 times for quick testing and
916193a6b41Sdrh# 40 times for full testing.  Each iteration of the test makes table
917193a6b41Sdrh# t3 a little larger, and thus takes a little longer, so doing 40 tests
918193a6b41Sdrh# is more than 2.0 times slower than doing 20 tests.  Considerably more.
919193a6b41Sdrh#
9208be0245dSdanielk1977# Also, if temporary tables are stored in memory and the test pcache
9218be0245dSdanielk1977# is in use, only 20 iterations. Otherwise the test pcache runs out
9228be0245dSdanielk1977# of page slots and SQLite reports "out of memory".
9238be0245dSdanielk1977#
924430e74cdSdanif {[info exists G(isquick)] || (
925430e74cdSdan  $TEMP_STORE==3 && [regexp {^pcache[[:digit:]]*$} [permutation]]
9268be0245dSdanielk1977) } {
927193a6b41Sdrh  set limit 20
928430e74cdSdan} elseif {[info exists G(issoak)]} {
92944548eccSdrh  set limit 100
930193a6b41Sdrh} else {
931193a6b41Sdrh  set limit 40
932193a6b41Sdrh}
933193a6b41Sdrh
934193a6b41Sdrh# Do rollbacks.  Make sure the signature does not change.
935193a6b41Sdrh#
936193a6b41Sdrhfor {set i 2} {$i<=$limit} {incr i} {
937193a6b41Sdrh  set ::sig [signature]
938193a6b41Sdrh  set cnt [lindex $::sig 0]
9394303feedSdrh  if {$i%2==0} {
940ac530b1aSdrh    execsql {PRAGMA fullfsync=ON}
9414303feedSdrh  } else {
942ac530b1aSdrh    execsql {PRAGMA fullfsync=OFF}
9434303feedSdrh  }
944b851b2c9Sdrh  set sqlite_sync_count 0
945b851b2c9Sdrh  set sqlite_fullsync_count 0
946193a6b41Sdrh  do_test trans-9.$i.1-$cnt {
947193a6b41Sdrh     execsql {
948193a6b41Sdrh       BEGIN;
949193a6b41Sdrh       DELETE FROM t3 WHERE random()%10!=0;
950193a6b41Sdrh       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
951193a6b41Sdrh       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
952193a6b41Sdrh       ROLLBACK;
953193a6b41Sdrh     }
954193a6b41Sdrh     signature
955193a6b41Sdrh  } $sig
956193a6b41Sdrh  do_test trans-9.$i.2-$cnt {
957193a6b41Sdrh     execsql {
958193a6b41Sdrh       BEGIN;
959193a6b41Sdrh       DELETE FROM t3 WHERE random()%10!=0;
960193a6b41Sdrh       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
961193a6b41Sdrh       DELETE FROM t3 WHERE random()%10!=0;
962193a6b41Sdrh       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
963193a6b41Sdrh       ROLLBACK;
964193a6b41Sdrh     }
965193a6b41Sdrh     signature
966193a6b41Sdrh  } $sig
967193a6b41Sdrh  if {$i<$limit} {
968b851b2c9Sdrh    do_test trans-9.$i.3-$cnt {
969193a6b41Sdrh       execsql {
970193a6b41Sdrh         INSERT INTO t3 SELECT randstr(10,400) FROM t3 WHERE random()%10==0;
971193a6b41Sdrh       }
972193a6b41Sdrh    } {}
9730cf408ffSdan    catch flush_async_queue
974748f763fSdrh    if {$tcl_platform(platform)=="unix"} {
975b851b2c9Sdrh      do_test trans-9.$i.4-$cnt {
976b851b2c9Sdrh         expr {$sqlite_sync_count>0}
977b851b2c9Sdrh      } 1
9783bdca9c9Sdanielk1977      ifcapable pager_pragmas {
979b851b2c9Sdrh        do_test trans-9.$i.5-$cnt {
980b851b2c9Sdrh           expr {$sqlite_fullsync_count>0}
981b851b2c9Sdrh        } [expr {$i%2==0}]
9823bdca9c9Sdanielk1977      } else {
9833bdca9c9Sdanielk1977        do_test trans-9.$i.5-$cnt {
9844152e677Sdanielk1977          expr {$sqlite_fullsync_count==0}
9853bdca9c9Sdanielk1977        } {1}
9863bdca9c9Sdanielk1977      }
987193a6b41Sdrh    }
988748f763fSdrh  }
989e106de63Sdan
990e106de63Sdan  wal_check_journal_mode trans-9.$i.6-$cnt
99174587e55Sdrh  set ::pager_old_format 0
992193a6b41Sdrh}
99328b4e489Sdrh
994c4a3c779Sdrhfinish_test
995