xref: /illumos-gate/usr/src/lib/libsqlite/test/trans.test (revision 1da57d551424de5a9d469760be7c4b4d4f10a755)
1*1da57d55SToomas Soome#
2c5c4113dSnw141292# 2001 September 15
3c5c4113dSnw141292#
4c5c4113dSnw141292# The author disclaims copyright to this source code.  In place of
5c5c4113dSnw141292# a legal notice, here is a blessing:
6c5c4113dSnw141292#
7c5c4113dSnw141292#    May you do good and not evil.
8c5c4113dSnw141292#    May you find forgiveness for yourself and forgive others.
9c5c4113dSnw141292#    May you share freely, never taking more than you give.
10c5c4113dSnw141292#
11c5c4113dSnw141292#***********************************************************************
12c5c4113dSnw141292# This file implements regression tests for SQLite library.  The
13c5c4113dSnw141292# focus of this script is database locks.
14c5c4113dSnw141292#
15c5c4113dSnw141292# $Id: trans.test,v 1.19 2004/03/08 13:26:18 drh Exp $
16c5c4113dSnw141292
17c5c4113dSnw141292
18c5c4113dSnw141292set testdir [file dirname $argv0]
19c5c4113dSnw141292source $testdir/tester.tcl
20c5c4113dSnw141292
21c5c4113dSnw141292
22c5c4113dSnw141292# Create several tables to work with.
23c5c4113dSnw141292#
24c5c4113dSnw141292do_test trans-1.0 {
25c5c4113dSnw141292  execsql {
26c5c4113dSnw141292    CREATE TABLE one(a int PRIMARY KEY, b text);
27c5c4113dSnw141292    INSERT INTO one VALUES(1,'one');
28c5c4113dSnw141292    INSERT INTO one VALUES(2,'two');
29c5c4113dSnw141292    INSERT INTO one VALUES(3,'three');
30c5c4113dSnw141292    SELECT b FROM one ORDER BY a;
31c5c4113dSnw141292  }
32c5c4113dSnw141292} {one two three}
33c5c4113dSnw141292do_test trans-1.1 {
34c5c4113dSnw141292  execsql {
35c5c4113dSnw141292    CREATE TABLE two(a int PRIMARY KEY, b text);
36c5c4113dSnw141292    INSERT INTO two VALUES(1,'I');
37c5c4113dSnw141292    INSERT INTO two VALUES(5,'V');
38c5c4113dSnw141292    INSERT INTO two VALUES(10,'X');
39c5c4113dSnw141292    SELECT b FROM two ORDER BY a;
40c5c4113dSnw141292  }
41c5c4113dSnw141292} {I V X}
42c5c4113dSnw141292do_test trans-1.9 {
43c5c4113dSnw141292  sqlite altdb test.db
44c5c4113dSnw141292  execsql {SELECT b FROM one ORDER BY a} altdb
45c5c4113dSnw141292} {one two three}
46c5c4113dSnw141292do_test trans-1.10 {
47c5c4113dSnw141292  execsql {SELECT b FROM two ORDER BY a} altdb
48c5c4113dSnw141292} {I V X}
49c5c4113dSnw141292integrity_check trans-1.11
50c5c4113dSnw141292
51c5c4113dSnw141292# Basic transactions
52c5c4113dSnw141292#
53c5c4113dSnw141292do_test trans-2.1 {
54c5c4113dSnw141292  set v [catch {execsql {BEGIN}} msg]
55c5c4113dSnw141292  lappend v $msg
56c5c4113dSnw141292} {0 {}}
57c5c4113dSnw141292do_test trans-2.2 {
58c5c4113dSnw141292  set v [catch {execsql {END}} msg]
59c5c4113dSnw141292  lappend v $msg
60c5c4113dSnw141292} {0 {}}
61c5c4113dSnw141292do_test trans-2.3 {
62c5c4113dSnw141292  set v [catch {execsql {BEGIN TRANSACTION}} msg]
63c5c4113dSnw141292  lappend v $msg
64c5c4113dSnw141292} {0 {}}
65c5c4113dSnw141292do_test trans-2.4 {
66c5c4113dSnw141292  set v [catch {execsql {COMMIT TRANSACTION}} msg]
67c5c4113dSnw141292  lappend v $msg
68c5c4113dSnw141292} {0 {}}
69c5c4113dSnw141292do_test trans-2.5 {
70c5c4113dSnw141292  set v [catch {execsql {BEGIN TRANSACTION 'foo'}} msg]
71c5c4113dSnw141292  lappend v $msg
72c5c4113dSnw141292} {0 {}}
73c5c4113dSnw141292do_test trans-2.6 {
74c5c4113dSnw141292  set v [catch {execsql {ROLLBACK TRANSACTION 'foo'}} msg]
75c5c4113dSnw141292  lappend v $msg
76c5c4113dSnw141292} {0 {}}
77c5c4113dSnw141292do_test trans-2.10 {
78c5c4113dSnw141292  execsql {
79c5c4113dSnw141292    BEGIN;
80c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
81c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
82c5c4113dSnw141292    END;
83c5c4113dSnw141292  }
84c5c4113dSnw141292} {1 2 3 1 5 10}
85c5c4113dSnw141292integrity_check trans-2.11
86c5c4113dSnw141292
87c5c4113dSnw141292# Check the locking behavior
88c5c4113dSnw141292#
89c5c4113dSnw141292do_test trans-3.1 {
90c5c4113dSnw141292  execsql {
91c5c4113dSnw141292    BEGIN;
92c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
93c5c4113dSnw141292  }
94c5c4113dSnw141292} {1 2 3}
95c5c4113dSnw141292do_test trans-3.2 {
96c5c4113dSnw141292  set v [catch {execsql {
97c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
98c5c4113dSnw141292  } altdb} msg]
99c5c4113dSnw141292  lappend v $msg
100c5c4113dSnw141292} {1 {database is locked}}
101c5c4113dSnw141292do_test trans-3.3 {
102c5c4113dSnw141292  set v [catch {execsql {
103c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
104c5c4113dSnw141292  } altdb} msg]
105c5c4113dSnw141292  lappend v $msg
106c5c4113dSnw141292} {1 {database is locked}}
107c5c4113dSnw141292do_test trans-3.4 {
108c5c4113dSnw141292  set v [catch {execsql {
109c5c4113dSnw141292    INSERT INTO one VALUES(4,'four');
110c5c4113dSnw141292  }} msg]
111c5c4113dSnw141292  lappend v $msg
112c5c4113dSnw141292} {0 {}}
113c5c4113dSnw141292do_test trans-3.5 {
114c5c4113dSnw141292  set v [catch {execsql {
115c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
116c5c4113dSnw141292  } altdb} msg]
117c5c4113dSnw141292  lappend v $msg
118c5c4113dSnw141292} {1 {database is locked}}
119c5c4113dSnw141292do_test trans-3.6 {
120c5c4113dSnw141292  set v [catch {execsql {
121c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
122c5c4113dSnw141292  } altdb} msg]
123c5c4113dSnw141292  lappend v $msg
124c5c4113dSnw141292} {1 {database is locked}}
125c5c4113dSnw141292do_test trans-3.7 {
126c5c4113dSnw141292  set v [catch {execsql {
127c5c4113dSnw141292    INSERT INTO two VALUES(4,'IV');
128c5c4113dSnw141292  }} msg]
129c5c4113dSnw141292  lappend v $msg
130c5c4113dSnw141292} {0 {}}
131c5c4113dSnw141292do_test trans-3.8 {
132c5c4113dSnw141292  set v [catch {execsql {
133c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
134c5c4113dSnw141292  } altdb} msg]
135c5c4113dSnw141292  lappend v $msg
136c5c4113dSnw141292} {1 {database is locked}}
137c5c4113dSnw141292do_test trans-3.9 {
138c5c4113dSnw141292  set v [catch {execsql {
139c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
140c5c4113dSnw141292  } altdb} msg]
141c5c4113dSnw141292  lappend v $msg
142c5c4113dSnw141292} {1 {database is locked}}
143c5c4113dSnw141292do_test trans-3.10 {
144c5c4113dSnw141292  execsql {END TRANSACTION}
145c5c4113dSnw141292} {}
146c5c4113dSnw141292do_test trans-3.11 {
147c5c4113dSnw141292  set v [catch {execsql {
148c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
149c5c4113dSnw141292  } altdb} msg]
150c5c4113dSnw141292  lappend v $msg
151c5c4113dSnw141292} {0 {1 4 5 10}}
152c5c4113dSnw141292do_test trans-3.12 {
153c5c4113dSnw141292  set v [catch {execsql {
154c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
155c5c4113dSnw141292  } altdb} msg]
156c5c4113dSnw141292  lappend v $msg
157c5c4113dSnw141292} {0 {1 2 3 4}}
158c5c4113dSnw141292do_test trans-3.13 {
159c5c4113dSnw141292  set v [catch {execsql {
160c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
161c5c4113dSnw141292  } db} msg]
162c5c4113dSnw141292  lappend v $msg
163c5c4113dSnw141292} {0 {1 4 5 10}}
164c5c4113dSnw141292do_test trans-3.14 {
165c5c4113dSnw141292  set v [catch {execsql {
166c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
167c5c4113dSnw141292  } db} msg]
168c5c4113dSnw141292  lappend v $msg
169c5c4113dSnw141292} {0 {1 2 3 4}}
170c5c4113dSnw141292integrity_check trans-3.15
171c5c4113dSnw141292
172c5c4113dSnw141292do_test trans-4.1 {
173c5c4113dSnw141292  set v [catch {execsql {
174c5c4113dSnw141292    COMMIT;
175c5c4113dSnw141292  } db} msg]
176c5c4113dSnw141292  lappend v $msg
177c5c4113dSnw141292} {1 {cannot commit - no transaction is active}}
178c5c4113dSnw141292do_test trans-4.2 {
179c5c4113dSnw141292  set v [catch {execsql {
180c5c4113dSnw141292    ROLLBACK;
181c5c4113dSnw141292  } db} msg]
182c5c4113dSnw141292  lappend v $msg
183c5c4113dSnw141292} {1 {cannot rollback - no transaction is active}}
184c5c4113dSnw141292do_test trans-4.3 {
185c5c4113dSnw141292  set v [catch {execsql {
186c5c4113dSnw141292    BEGIN TRANSACTION;
187c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
188c5c4113dSnw141292  } db} msg]
189c5c4113dSnw141292  lappend v $msg
190c5c4113dSnw141292} {0 {1 4 5 10}}
191c5c4113dSnw141292do_test trans-4.4 {
192c5c4113dSnw141292  set v [catch {execsql {
193c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
194c5c4113dSnw141292  } altdb} msg]
195c5c4113dSnw141292  lappend v $msg
196c5c4113dSnw141292} {1 {database is locked}}
197c5c4113dSnw141292do_test trans-4.5 {
198c5c4113dSnw141292  set v [catch {execsql {
199c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
200c5c4113dSnw141292  } altdb} msg]
201c5c4113dSnw141292  lappend v $msg
202c5c4113dSnw141292} {1 {database is locked}}
203c5c4113dSnw141292do_test trans-4.6 {
204c5c4113dSnw141292  set v [catch {execsql {
205c5c4113dSnw141292    BEGIN TRANSACTION;
206c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
207c5c4113dSnw141292  } db} msg]
208c5c4113dSnw141292  lappend v $msg
209c5c4113dSnw141292} {1 {cannot start a transaction within a transaction}}
210c5c4113dSnw141292do_test trans-4.7 {
211c5c4113dSnw141292  set v [catch {execsql {
212c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
213c5c4113dSnw141292  } altdb} msg]
214c5c4113dSnw141292  lappend v $msg
215c5c4113dSnw141292} {1 {database is locked}}
216c5c4113dSnw141292do_test trans-4.8 {
217c5c4113dSnw141292  set v [catch {execsql {
218c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
219c5c4113dSnw141292  } altdb} msg]
220c5c4113dSnw141292  lappend v $msg
221c5c4113dSnw141292} {1 {database is locked}}
222c5c4113dSnw141292do_test trans-4.9 {
223c5c4113dSnw141292  set v [catch {execsql {
224c5c4113dSnw141292    END TRANSACTION;
225c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
226c5c4113dSnw141292  } db} msg]
227c5c4113dSnw141292  lappend v $msg
228c5c4113dSnw141292} {0 {1 4 5 10}}
229c5c4113dSnw141292do_test trans-4.10 {
230c5c4113dSnw141292  set v [catch {execsql {
231c5c4113dSnw141292    SELECT a FROM two ORDER BY a;
232c5c4113dSnw141292  } altdb} msg]
233c5c4113dSnw141292  lappend v $msg
234c5c4113dSnw141292} {0 {1 4 5 10}}
235c5c4113dSnw141292do_test trans-4.11 {
236c5c4113dSnw141292  set v [catch {execsql {
237c5c4113dSnw141292    SELECT a FROM one ORDER BY a;
238c5c4113dSnw141292  } altdb} msg]
239c5c4113dSnw141292  lappend v $msg
240c5c4113dSnw141292} {0 {1 2 3 4}}
241c5c4113dSnw141292integrity_check trans-4.12
242c5c4113dSnw141292do_test trans-4.98 {
243c5c4113dSnw141292  altdb close
244c5c4113dSnw141292  execsql {
245c5c4113dSnw141292    DROP TABLE one;
246c5c4113dSnw141292    DROP TABLE two;
247c5c4113dSnw141292  }
248c5c4113dSnw141292} {}
249c5c4113dSnw141292integrity_check trans-4.99
250c5c4113dSnw141292
251c5c4113dSnw141292# Check out the commit/rollback behavior of the database
252c5c4113dSnw141292#
253c5c4113dSnw141292do_test trans-5.1 {
254c5c4113dSnw141292  execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
255c5c4113dSnw141292} {}
256c5c4113dSnw141292do_test trans-5.2 {
257c5c4113dSnw141292  execsql {BEGIN TRANSACTION}
258c5c4113dSnw141292  execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
259c5c4113dSnw141292} {}
260c5c4113dSnw141292do_test trans-5.3 {
261c5c4113dSnw141292  execsql {CREATE TABLE one(a text, b int)}
262c5c4113dSnw141292  execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
263c5c4113dSnw141292} {one}
264c5c4113dSnw141292do_test trans-5.4 {
265c5c4113dSnw141292  execsql {SELECT a,b FROM one ORDER BY b}
266c5c4113dSnw141292} {}
267c5c4113dSnw141292do_test trans-5.5 {
268c5c4113dSnw141292  execsql {INSERT INTO one(a,b) VALUES('hello', 1)}
269c5c4113dSnw141292  execsql {SELECT a,b FROM one ORDER BY b}
270c5c4113dSnw141292} {hello 1}
271c5c4113dSnw141292do_test trans-5.6 {
272c5c4113dSnw141292  execsql {ROLLBACK}
273c5c4113dSnw141292  execsql {SELECT name FROM sqlite_master WHERE type='table' ORDER BY name}
274c5c4113dSnw141292} {}
275c5c4113dSnw141292do_test trans-5.7 {
276c5c4113dSnw141292  set v [catch {
277c5c4113dSnw141292    execsql {SELECT a,b FROM one ORDER BY b}
278c5c4113dSnw141292  } msg]
279c5c4113dSnw141292  lappend v $msg
280c5c4113dSnw141292} {1 {no such table: one}}
281c5c4113dSnw141292
282c5c4113dSnw141292# Test commits and rollbacks of table CREATE TABLEs, CREATE INDEXs
283c5c4113dSnw141292# DROP TABLEs and DROP INDEXs
284c5c4113dSnw141292#
285c5c4113dSnw141292do_test trans-5.8 {
286c5c4113dSnw141292  execsql {
287c5c4113dSnw141292    SELECT name fROM sqlite_master
288c5c4113dSnw141292    WHERE type='table' OR type='index'
289c5c4113dSnw141292    ORDER BY name
290c5c4113dSnw141292  }
291c5c4113dSnw141292} {}
292c5c4113dSnw141292do_test trans-5.9 {
293c5c4113dSnw141292  execsql {
294c5c4113dSnw141292    BEGIN TRANSACTION;
295c5c4113dSnw141292    CREATE TABLE t1(a int, b int, c int);
296c5c4113dSnw141292    SELECT name fROM sqlite_master
297c5c4113dSnw141292    WHERE type='table' OR type='index'
298c5c4113dSnw141292    ORDER BY name;
299c5c4113dSnw141292  }
300c5c4113dSnw141292} {t1}
301c5c4113dSnw141292do_test trans-5.10 {
302c5c4113dSnw141292  execsql {
303c5c4113dSnw141292    CREATE INDEX i1 ON t1(a);
304c5c4113dSnw141292    SELECT name fROM sqlite_master
305c5c4113dSnw141292    WHERE type='table' OR type='index'
306c5c4113dSnw141292    ORDER BY name;
307c5c4113dSnw141292  }
308c5c4113dSnw141292} {i1 t1}
309c5c4113dSnw141292do_test trans-5.11 {
310c5c4113dSnw141292  execsql {
311c5c4113dSnw141292    COMMIT;
312c5c4113dSnw141292    SELECT name fROM sqlite_master
313c5c4113dSnw141292    WHERE type='table' OR type='index'
314c5c4113dSnw141292    ORDER BY name;
315c5c4113dSnw141292  }
316c5c4113dSnw141292} {i1 t1}
317c5c4113dSnw141292do_test trans-5.12 {
318c5c4113dSnw141292  execsql {
319c5c4113dSnw141292    BEGIN TRANSACTION;
320c5c4113dSnw141292    CREATE TABLE t2(a int, b int, c int);
321c5c4113dSnw141292    CREATE INDEX i2a ON t2(a);
322c5c4113dSnw141292    CREATE INDEX i2b ON t2(b);
323c5c4113dSnw141292    DROP TABLE t1;
324c5c4113dSnw141292    SELECT name fROM sqlite_master
325c5c4113dSnw141292    WHERE type='table' OR type='index'
326c5c4113dSnw141292    ORDER BY name;
327c5c4113dSnw141292  }
328c5c4113dSnw141292} {i2a i2b t2}
329c5c4113dSnw141292do_test trans-5.13 {
330c5c4113dSnw141292  execsql {
331c5c4113dSnw141292    ROLLBACK;
332c5c4113dSnw141292    SELECT name fROM sqlite_master
333c5c4113dSnw141292    WHERE type='table' OR type='index'
334c5c4113dSnw141292    ORDER BY name;
335c5c4113dSnw141292  }
336c5c4113dSnw141292} {i1 t1}
337c5c4113dSnw141292do_test trans-5.14 {
338c5c4113dSnw141292  execsql {
339c5c4113dSnw141292    BEGIN TRANSACTION;
340c5c4113dSnw141292    DROP INDEX i1;
341c5c4113dSnw141292    SELECT name fROM sqlite_master
342c5c4113dSnw141292    WHERE type='table' OR type='index'
343c5c4113dSnw141292    ORDER BY name;
344c5c4113dSnw141292  }
345c5c4113dSnw141292} {t1}
346c5c4113dSnw141292do_test trans-5.15 {
347c5c4113dSnw141292  execsql {
348c5c4113dSnw141292    ROLLBACK;
349c5c4113dSnw141292    SELECT name fROM sqlite_master
350c5c4113dSnw141292    WHERE type='table' OR type='index'
351c5c4113dSnw141292    ORDER BY name;
352c5c4113dSnw141292  }
353c5c4113dSnw141292} {i1 t1}
354c5c4113dSnw141292do_test trans-5.16 {
355c5c4113dSnw141292  execsql {
356c5c4113dSnw141292    BEGIN TRANSACTION;
357c5c4113dSnw141292    DROP INDEX i1;
358c5c4113dSnw141292    CREATE TABLE t2(x int, y int, z int);
359c5c4113dSnw141292    CREATE INDEX i2x ON t2(x);
360c5c4113dSnw141292    CREATE INDEX i2y ON t2(y);
361c5c4113dSnw141292    INSERT INTO t2 VALUES(1,2,3);
362c5c4113dSnw141292    SELECT name fROM sqlite_master
363c5c4113dSnw141292    WHERE type='table' OR type='index'
364c5c4113dSnw141292    ORDER BY name;
365c5c4113dSnw141292  }
366c5c4113dSnw141292} {i2x i2y t1 t2}
367c5c4113dSnw141292do_test trans-5.17 {
368c5c4113dSnw141292  execsql {
369c5c4113dSnw141292    COMMIT;
370c5c4113dSnw141292    SELECT name fROM sqlite_master
371c5c4113dSnw141292    WHERE type='table' OR type='index'
372c5c4113dSnw141292    ORDER BY name;
373c5c4113dSnw141292  }
374c5c4113dSnw141292} {i2x i2y t1 t2}
375c5c4113dSnw141292do_test trans-5.18 {
376c5c4113dSnw141292  execsql {
377c5c4113dSnw141292    SELECT * FROM t2;
378c5c4113dSnw141292  }
379c5c4113dSnw141292} {1 2 3}
380c5c4113dSnw141292do_test trans-5.19 {
381c5c4113dSnw141292  execsql {
382c5c4113dSnw141292    SELECT x FROM t2 WHERE y=2;
383c5c4113dSnw141292  }
384c5c4113dSnw141292} {1}
385c5c4113dSnw141292do_test trans-5.20 {
386c5c4113dSnw141292  execsql {
387c5c4113dSnw141292    BEGIN TRANSACTION;
388c5c4113dSnw141292    DROP TABLE t1;
389c5c4113dSnw141292    DROP TABLE t2;
390c5c4113dSnw141292    SELECT name fROM sqlite_master
391c5c4113dSnw141292    WHERE type='table' OR type='index'
392c5c4113dSnw141292    ORDER BY name;
393c5c4113dSnw141292  }
394c5c4113dSnw141292} {}
395c5c4113dSnw141292do_test trans-5.21 {
396c5c4113dSnw141292  set r [catch {execsql {
397c5c4113dSnw141292    SELECT * FROM t2
398c5c4113dSnw141292  }} msg]
399c5c4113dSnw141292  lappend r $msg
400c5c4113dSnw141292} {1 {no such table: t2}}
401c5c4113dSnw141292do_test trans-5.22 {
402c5c4113dSnw141292  execsql {
403c5c4113dSnw141292    ROLLBACK;
404c5c4113dSnw141292    SELECT name fROM sqlite_master
405c5c4113dSnw141292    WHERE type='table' OR type='index'
406c5c4113dSnw141292    ORDER BY name;
407c5c4113dSnw141292  }
408c5c4113dSnw141292} {i2x i2y t1 t2}
409c5c4113dSnw141292do_test trans-5.23 {
410c5c4113dSnw141292  execsql {
411c5c4113dSnw141292    SELECT * FROM t2;
412c5c4113dSnw141292  }
413c5c4113dSnw141292} {1 2 3}
414c5c4113dSnw141292integrity_check trans-5.23
415c5c4113dSnw141292
416c5c4113dSnw141292
417c5c4113dSnw141292# Try to DROP and CREATE tables and indices with the same name
418c5c4113dSnw141292# within a transaction.  Make sure ROLLBACK works.
419c5c4113dSnw141292#
420c5c4113dSnw141292do_test trans-6.1 {
421c5c4113dSnw141292  execsql2 {
422c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2,3);
423c5c4113dSnw141292    BEGIN TRANSACTION;
424c5c4113dSnw141292    DROP TABLE t1;
425c5c4113dSnw141292    CREATE TABLE t1(p,q,r);
426c5c4113dSnw141292    ROLLBACK;
427c5c4113dSnw141292    SELECT * FROM t1;
428c5c4113dSnw141292  }
429c5c4113dSnw141292} {a 1 b 2 c 3}
430c5c4113dSnw141292do_test trans-6.2 {
431c5c4113dSnw141292  execsql2 {
432c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2,3);
433c5c4113dSnw141292    BEGIN TRANSACTION;
434c5c4113dSnw141292    DROP TABLE t1;
435c5c4113dSnw141292    CREATE TABLE t1(p,q,r);
436c5c4113dSnw141292    COMMIT;
437c5c4113dSnw141292    SELECT * FROM t1;
438c5c4113dSnw141292  }
439c5c4113dSnw141292} {}
440c5c4113dSnw141292do_test trans-6.3 {
441c5c4113dSnw141292  execsql2 {
442c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2,3);
443c5c4113dSnw141292    SELECT * FROM t1;
444c5c4113dSnw141292  }
445c5c4113dSnw141292} {p 1 q 2 r 3}
446c5c4113dSnw141292do_test trans-6.4 {
447c5c4113dSnw141292  execsql2 {
448c5c4113dSnw141292    BEGIN TRANSACTION;
449c5c4113dSnw141292    DROP TABLE t1;
450c5c4113dSnw141292    CREATE TABLE t1(a,b,c);
451c5c4113dSnw141292    INSERT INTO t1 VALUES(4,5,6);
452c5c4113dSnw141292    SELECT * FROM t1;
453c5c4113dSnw141292    DROP TABLE t1;
454c5c4113dSnw141292  }
455c5c4113dSnw141292} {a 4 b 5 c 6}
456c5c4113dSnw141292do_test trans-6.5 {
457c5c4113dSnw141292  execsql2 {
458c5c4113dSnw141292    ROLLBACK;
459c5c4113dSnw141292    SELECT * FROM t1;
460c5c4113dSnw141292  }
461c5c4113dSnw141292} {p 1 q 2 r 3}
462c5c4113dSnw141292do_test trans-6.6 {
463c5c4113dSnw141292  execsql2 {
464c5c4113dSnw141292    BEGIN TRANSACTION;
465c5c4113dSnw141292    DROP TABLE t1;
466c5c4113dSnw141292    CREATE TABLE t1(a,b,c);
467c5c4113dSnw141292    INSERT INTO t1 VALUES(4,5,6);
468c5c4113dSnw141292    SELECT * FROM t1;
469c5c4113dSnw141292    DROP TABLE t1;
470c5c4113dSnw141292  }
471c5c4113dSnw141292} {a 4 b 5 c 6}
472c5c4113dSnw141292do_test trans-6.7 {
473c5c4113dSnw141292  catchsql {
474c5c4113dSnw141292    COMMIT;
475c5c4113dSnw141292    SELECT * FROM t1;
476c5c4113dSnw141292  }
477c5c4113dSnw141292} {1 {no such table: t1}}
478c5c4113dSnw141292
479c5c4113dSnw141292# Repeat on a table with an automatically generated index.
480c5c4113dSnw141292#
481c5c4113dSnw141292do_test trans-6.10 {
482c5c4113dSnw141292  execsql2 {
483c5c4113dSnw141292    CREATE TABLE t1(a unique,b,c);
484c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2,3);
485c5c4113dSnw141292    BEGIN TRANSACTION;
486c5c4113dSnw141292    DROP TABLE t1;
487c5c4113dSnw141292    CREATE TABLE t1(p unique,q,r);
488c5c4113dSnw141292    ROLLBACK;
489c5c4113dSnw141292    SELECT * FROM t1;
490c5c4113dSnw141292  }
491c5c4113dSnw141292} {a 1 b 2 c 3}
492c5c4113dSnw141292do_test trans-6.11 {
493c5c4113dSnw141292  execsql2 {
494c5c4113dSnw141292    BEGIN TRANSACTION;
495c5c4113dSnw141292    DROP TABLE t1;
496c5c4113dSnw141292    CREATE TABLE t1(p unique,q,r);
497c5c4113dSnw141292    COMMIT;
498c5c4113dSnw141292    SELECT * FROM t1;
499c5c4113dSnw141292  }
500c5c4113dSnw141292} {}
501c5c4113dSnw141292do_test trans-6.12 {
502c5c4113dSnw141292  execsql2 {
503c5c4113dSnw141292    INSERT INTO t1 VALUES(1,2,3);
504c5c4113dSnw141292    SELECT * FROM t1;
505c5c4113dSnw141292  }
506c5c4113dSnw141292} {p 1 q 2 r 3}
507c5c4113dSnw141292do_test trans-6.13 {
508c5c4113dSnw141292  execsql2 {
509c5c4113dSnw141292    BEGIN TRANSACTION;
510c5c4113dSnw141292    DROP TABLE t1;
511c5c4113dSnw141292    CREATE TABLE t1(a unique,b,c);
512c5c4113dSnw141292    INSERT INTO t1 VALUES(4,5,6);
513c5c4113dSnw141292    SELECT * FROM t1;
514c5c4113dSnw141292    DROP TABLE t1;
515c5c4113dSnw141292  }
516c5c4113dSnw141292} {a 4 b 5 c 6}
517c5c4113dSnw141292do_test trans-6.14 {
518c5c4113dSnw141292  execsql2 {
519c5c4113dSnw141292    ROLLBACK;
520c5c4113dSnw141292    SELECT * FROM t1;
521c5c4113dSnw141292  }
522c5c4113dSnw141292} {p 1 q 2 r 3}
523c5c4113dSnw141292do_test trans-6.15 {
524c5c4113dSnw141292  execsql2 {
525c5c4113dSnw141292    BEGIN TRANSACTION;
526c5c4113dSnw141292    DROP TABLE t1;
527c5c4113dSnw141292    CREATE TABLE t1(a unique,b,c);
528c5c4113dSnw141292    INSERT INTO t1 VALUES(4,5,6);
529c5c4113dSnw141292    SELECT * FROM t1;
530c5c4113dSnw141292    DROP TABLE t1;
531c5c4113dSnw141292  }
532c5c4113dSnw141292} {a 4 b 5 c 6}
533c5c4113dSnw141292do_test trans-6.16 {
534c5c4113dSnw141292  catchsql {
535c5c4113dSnw141292    COMMIT;
536c5c4113dSnw141292    SELECT * FROM t1;
537c5c4113dSnw141292  }
538c5c4113dSnw141292} {1 {no such table: t1}}
539c5c4113dSnw141292
540c5c4113dSnw141292do_test trans-6.20 {
541c5c4113dSnw141292  execsql {
542c5c4113dSnw141292    CREATE TABLE t1(a integer primary key,b,c);
543c5c4113dSnw141292    INSERT INTO t1 VALUES(1,-2,-3);
544c5c4113dSnw141292    INSERT INTO t1 VALUES(4,-5,-6);
545c5c4113dSnw141292    SELECT * FROM t1;
546c5c4113dSnw141292  }
547c5c4113dSnw141292} {1 -2 -3 4 -5 -6}
548c5c4113dSnw141292do_test trans-6.21 {
549c5c4113dSnw141292  execsql {
550c5c4113dSnw141292    CREATE INDEX i1 ON t1(b);
551c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
552c5c4113dSnw141292  }
553c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
554c5c4113dSnw141292do_test trans-6.22 {
555c5c4113dSnw141292  execsql {
556c5c4113dSnw141292    BEGIN TRANSACTION;
557c5c4113dSnw141292    DROP INDEX i1;
558c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
559c5c4113dSnw141292    ROLLBACK;
560c5c4113dSnw141292  }
561c5c4113dSnw141292} {1 -2 -3 4 -5 -6}
562c5c4113dSnw141292do_test trans-6.23 {
563c5c4113dSnw141292  execsql {
564c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
565c5c4113dSnw141292  }
566c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
567c5c4113dSnw141292do_test trans-6.24 {
568c5c4113dSnw141292  execsql {
569c5c4113dSnw141292    BEGIN TRANSACTION;
570c5c4113dSnw141292    DROP TABLE t1;
571c5c4113dSnw141292    ROLLBACK;
572c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
573c5c4113dSnw141292  }
574c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
575c5c4113dSnw141292
576c5c4113dSnw141292do_test trans-6.25 {
577c5c4113dSnw141292  execsql {
578c5c4113dSnw141292    BEGIN TRANSACTION;
579c5c4113dSnw141292    DROP INDEX i1;
580c5c4113dSnw141292    CREATE INDEX i1 ON t1(c);
581c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
582c5c4113dSnw141292  }
583c5c4113dSnw141292} {1 -2 -3 4 -5 -6}
584c5c4113dSnw141292do_test trans-6.26 {
585c5c4113dSnw141292  execsql {
586c5c4113dSnw141292    SELECT * FROM t1 WHERE c<1;
587c5c4113dSnw141292  }
588c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
589c5c4113dSnw141292do_test trans-6.27 {
590c5c4113dSnw141292  execsql {
591c5c4113dSnw141292    ROLLBACK;
592c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
593c5c4113dSnw141292  }
594c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
595c5c4113dSnw141292do_test trans-6.28 {
596c5c4113dSnw141292  execsql {
597c5c4113dSnw141292    SELECT * FROM t1 WHERE c<1;
598c5c4113dSnw141292  }
599c5c4113dSnw141292} {1 -2 -3 4 -5 -6}
600c5c4113dSnw141292
601c5c4113dSnw141292# The following repeats steps 6.20 through 6.28, but puts a "unique"
602c5c4113dSnw141292# constraint the first field of the table in order to generate an
603c5c4113dSnw141292# automatic index.
604c5c4113dSnw141292#
605c5c4113dSnw141292do_test trans-6.30 {
606c5c4113dSnw141292  execsql {
607c5c4113dSnw141292    BEGIN TRANSACTION;
608c5c4113dSnw141292    DROP TABLE t1;
609c5c4113dSnw141292    CREATE TABLE t1(a int unique,b,c);
610c5c4113dSnw141292    COMMIT;
611c5c4113dSnw141292    INSERT INTO t1 VALUES(1,-2,-3);
612c5c4113dSnw141292    INSERT INTO t1 VALUES(4,-5,-6);
613c5c4113dSnw141292    SELECT * FROM t1 ORDER BY a;
614c5c4113dSnw141292  }
615c5c4113dSnw141292} {1 -2 -3 4 -5 -6}
616c5c4113dSnw141292do_test trans-6.31 {
617c5c4113dSnw141292  execsql {
618c5c4113dSnw141292    CREATE INDEX i1 ON t1(b);
619c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
620c5c4113dSnw141292  }
621c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
622c5c4113dSnw141292do_test trans-6.32 {
623c5c4113dSnw141292  execsql {
624c5c4113dSnw141292    BEGIN TRANSACTION;
625c5c4113dSnw141292    DROP INDEX i1;
626c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
627c5c4113dSnw141292    ROLLBACK;
628c5c4113dSnw141292  }
629c5c4113dSnw141292} {1 -2 -3 4 -5 -6}
630c5c4113dSnw141292do_test trans-6.33 {
631c5c4113dSnw141292  execsql {
632c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
633c5c4113dSnw141292  }
634c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
635c5c4113dSnw141292do_test trans-6.34 {
636c5c4113dSnw141292  execsql {
637c5c4113dSnw141292    BEGIN TRANSACTION;
638c5c4113dSnw141292    DROP TABLE t1;
639c5c4113dSnw141292    ROLLBACK;
640c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
641c5c4113dSnw141292  }
642c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
643c5c4113dSnw141292
644c5c4113dSnw141292do_test trans-6.35 {
645c5c4113dSnw141292  execsql {
646c5c4113dSnw141292    BEGIN TRANSACTION;
647c5c4113dSnw141292    DROP INDEX i1;
648c5c4113dSnw141292    CREATE INDEX i1 ON t1(c);
649c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
650c5c4113dSnw141292  }
651c5c4113dSnw141292} {1 -2 -3 4 -5 -6}
652c5c4113dSnw141292do_test trans-6.36 {
653c5c4113dSnw141292  execsql {
654c5c4113dSnw141292    SELECT * FROM t1 WHERE c<1;
655c5c4113dSnw141292  }
656c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
657c5c4113dSnw141292do_test trans-6.37 {
658c5c4113dSnw141292  execsql {
659c5c4113dSnw141292    DROP INDEX i1;
660c5c4113dSnw141292    SELECT * FROM t1 WHERE c<1;
661c5c4113dSnw141292  }
662c5c4113dSnw141292} {1 -2 -3 4 -5 -6}
663c5c4113dSnw141292do_test trans-6.38 {
664c5c4113dSnw141292  execsql {
665c5c4113dSnw141292    ROLLBACK;
666c5c4113dSnw141292    SELECT * FROM t1 WHERE b<1;
667c5c4113dSnw141292  }
668c5c4113dSnw141292} {4 -5 -6 1 -2 -3}
669c5c4113dSnw141292do_test trans-6.39 {
670c5c4113dSnw141292  execsql {
671c5c4113dSnw141292    SELECT * FROM t1 WHERE c<1;
672c5c4113dSnw141292  }
673c5c4113dSnw141292} {1 -2 -3 4 -5 -6}
674c5c4113dSnw141292integrity_check trans-6.40
675c5c4113dSnw141292
676c5c4113dSnw141292# Test to make sure rollback restores the database back to its original
677c5c4113dSnw141292# state.
678c5c4113dSnw141292#
679c5c4113dSnw141292do_test trans-7.1 {
680c5c4113dSnw141292  execsql {BEGIN}
681c5c4113dSnw141292  for {set i 0} {$i<1000} {incr i} {
682c5c4113dSnw141292    set r1 [expr {rand()}]
683c5c4113dSnw141292    set r2 [expr {rand()}]
684c5c4113dSnw141292    set r3 [expr {rand()}]
685c5c4113dSnw141292    execsql "INSERT INTO t2 VALUES($r1,$r2,$r3)"
686c5c4113dSnw141292  }
687c5c4113dSnw141292  execsql {COMMIT}
688c5c4113dSnw141292  set ::checksum [execsql {SELECT md5sum(x,y,z) FROM t2}]
689c5c4113dSnw141292  set ::checksum2 [
690c5c4113dSnw141292    execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
691c5c4113dSnw141292  ]
692c5c4113dSnw141292  execsql {SELECT count(*) FROM t2}
693c5c4113dSnw141292} {1001}
694c5c4113dSnw141292do_test trans-7.2 {
695c5c4113dSnw141292  execsql {SELECT md5sum(x,y,z) FROM t2}
696c5c4113dSnw141292} $checksum
697c5c4113dSnw141292do_test trans-7.2.1 {
698c5c4113dSnw141292  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
699c5c4113dSnw141292} $checksum2
700c5c4113dSnw141292do_test trans-7.3 {
701c5c4113dSnw141292  execsql {
702c5c4113dSnw141292    BEGIN;
703c5c4113dSnw141292    DELETE FROM t2;
704c5c4113dSnw141292    ROLLBACK;
705c5c4113dSnw141292    SELECT md5sum(x,y,z) FROM t2;
706c5c4113dSnw141292  }
707c5c4113dSnw141292} $checksum
708c5c4113dSnw141292do_test trans-7.4 {
709c5c4113dSnw141292  execsql {
710c5c4113dSnw141292    BEGIN;
711c5c4113dSnw141292    INSERT INTO t2 SELECT * FROM t2;
712c5c4113dSnw141292    ROLLBACK;
713c5c4113dSnw141292    SELECT md5sum(x,y,z) FROM t2;
714c5c4113dSnw141292  }
715c5c4113dSnw141292} $checksum
716c5c4113dSnw141292do_test trans-7.5 {
717c5c4113dSnw141292  execsql {
718c5c4113dSnw141292    BEGIN;
719c5c4113dSnw141292    DELETE FROM t2;
720c5c4113dSnw141292    ROLLBACK;
721c5c4113dSnw141292    SELECT md5sum(x,y,z) FROM t2;
722c5c4113dSnw141292  }
723c5c4113dSnw141292} $checksum
724c5c4113dSnw141292do_test trans-7.6 {
725c5c4113dSnw141292  execsql {
726c5c4113dSnw141292    BEGIN;
727c5c4113dSnw141292    INSERT INTO t2 SELECT * FROM t2;
728c5c4113dSnw141292    ROLLBACK;
729c5c4113dSnw141292    SELECT md5sum(x,y,z) FROM t2;
730c5c4113dSnw141292  }
731c5c4113dSnw141292} $checksum
732c5c4113dSnw141292do_test trans-7.7 {
733c5c4113dSnw141292  execsql {
734c5c4113dSnw141292    BEGIN;
735c5c4113dSnw141292    CREATE TABLE t3 AS SELECT * FROM t2;
736c5c4113dSnw141292    INSERT INTO t2 SELECT * FROM t3;
737c5c4113dSnw141292    ROLLBACK;
738c5c4113dSnw141292    SELECT md5sum(x,y,z) FROM t2;
739c5c4113dSnw141292  }
740c5c4113dSnw141292} $checksum
741c5c4113dSnw141292do_test trans-7.8 {
742c5c4113dSnw141292  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
743c5c4113dSnw141292} $checksum2
744c5c4113dSnw141292do_test trans-7.9 {
745c5c4113dSnw141292  execsql {
746c5c4113dSnw141292    BEGIN;
747c5c4113dSnw141292    CREATE TEMP TABLE t3 AS SELECT * FROM t2;
748c5c4113dSnw141292    INSERT INTO t2 SELECT * FROM t3;
749c5c4113dSnw141292    ROLLBACK;
750c5c4113dSnw141292    SELECT md5sum(x,y,z) FROM t2;
751c5c4113dSnw141292  }
752c5c4113dSnw141292} $checksum
753c5c4113dSnw141292do_test trans-7.10 {
754c5c4113dSnw141292  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
755c5c4113dSnw141292} $checksum2
756c5c4113dSnw141292do_test trans-7.11 {
757c5c4113dSnw141292  execsql {
758c5c4113dSnw141292    BEGIN;
759c5c4113dSnw141292    CREATE TEMP TABLE t3 AS SELECT * FROM t2;
760c5c4113dSnw141292    INSERT INTO t2 SELECT * FROM t3;
761c5c4113dSnw141292    DROP INDEX i2x;
762c5c4113dSnw141292    DROP INDEX i2y;
763c5c4113dSnw141292    CREATE INDEX i3a ON t3(x);
764c5c4113dSnw141292    ROLLBACK;
765c5c4113dSnw141292    SELECT md5sum(x,y,z) FROM t2;
766c5c4113dSnw141292  }
767c5c4113dSnw141292} $checksum
768c5c4113dSnw141292do_test trans-7.12 {
769c5c4113dSnw141292  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
770c5c4113dSnw141292} $checksum2
771c5c4113dSnw141292do_test trans-7.13 {
772c5c4113dSnw141292  execsql {
773c5c4113dSnw141292    BEGIN;
774c5c4113dSnw141292    DROP TABLE t2;
775c5c4113dSnw141292    ROLLBACK;
776c5c4113dSnw141292    SELECT md5sum(x,y,z) FROM t2;
777c5c4113dSnw141292  }
778c5c4113dSnw141292} $checksum
779c5c4113dSnw141292do_test trans-7.14 {
780c5c4113dSnw141292  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
781c5c4113dSnw141292} $checksum2
782c5c4113dSnw141292integrity_check trans-7.15
783c5c4113dSnw141292
784c5c4113dSnw141292# Arrange for another process to begin modifying the database but abort
785c5c4113dSnw141292# and die in the middle of the modification.  Then have this process read
786c5c4113dSnw141292# the database.  This process should detect the journal file and roll it
787c5c4113dSnw141292# back.  Verify that this happens correctly.
788c5c4113dSnw141292#
789c5c4113dSnw141292set fd [open test.tcl w]
790c5c4113dSnw141292puts $fd {
791c5c4113dSnw141292  sqlite db test.db
792c5c4113dSnw141292  db eval {
793c5c4113dSnw141292    PRAGMA default_cache_size=20;
794c5c4113dSnw141292    BEGIN;
795c5c4113dSnw141292    CREATE TABLE t3 AS SELECT * FROM t2;
796c5c4113dSnw141292    DELETE FROM t2;
797c5c4113dSnw141292  }
798c5c4113dSnw141292  sqlite_abort
799c5c4113dSnw141292}
800c5c4113dSnw141292close $fd
801c5c4113dSnw141292do_test trans-8.1 {
802c5c4113dSnw141292  catch {exec [info nameofexec] test.tcl}
803c5c4113dSnw141292  execsql {SELECT md5sum(x,y,z) FROM t2}
804c5c4113dSnw141292} $checksum
805c5c4113dSnw141292do_test trans-8.2 {
806c5c4113dSnw141292  execsql {SELECT md5sum(type,name,tbl_name,rootpage,sql) FROM sqlite_master}
807c5c4113dSnw141292} $checksum2
808c5c4113dSnw141292integrity_check trans-8.3
809c5c4113dSnw141292
810c5c4113dSnw141292# In the following sequence of tests, compute the MD5 sum of the content
811c5c4113dSnw141292# of a table, make lots of modifications to that table, then do a rollback.
812c5c4113dSnw141292# Verify that after the rollback, the MD5 checksum is unchanged.
813c5c4113dSnw141292#
814c5c4113dSnw141292do_test trans-9.1 {
815c5c4113dSnw141292  execsql {
816c5c4113dSnw141292    PRAGMA default_cache_size=10;
817c5c4113dSnw141292  }
818c5c4113dSnw141292  db close
819c5c4113dSnw141292  sqlite db test.db
820c5c4113dSnw141292  execsql {
821c5c4113dSnw141292    BEGIN;
822c5c4113dSnw141292    CREATE TABLE t3(x TEXT);
823c5c4113dSnw141292    INSERT INTO t3 VALUES(randstr(10,400));
824c5c4113dSnw141292    INSERT INTO t3 VALUES(randstr(10,400));
825c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
826c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
827c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
828c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
829c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
830c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
831c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
832c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
833c5c4113dSnw141292    INSERT INTO t3 SELECT randstr(10,400) FROM t3;
834c5c4113dSnw141292    COMMIT;
835c5c4113dSnw141292    SELECT count(*) FROM t3;
836c5c4113dSnw141292  }
837c5c4113dSnw141292} {1024}
838c5c4113dSnw141292
839c5c4113dSnw141292# The following procedure computes a "signature" for table "t3".  If
840c5c4113dSnw141292# T3 changes in any way, the signature should change.
841c5c4113dSnw141292#
842c5c4113dSnw141292# This is used to test ROLLBACK.  We gather a signature for t3, then
843c5c4113dSnw141292# make lots of changes to t3, then rollback and take another signature.
844c5c4113dSnw141292# The two signatures should be the same.
845c5c4113dSnw141292#
846c5c4113dSnw141292proc signature {} {
847c5c4113dSnw141292  return [db eval {SELECT count(*), md5sum(x) FROM t3}]
848c5c4113dSnw141292}
849c5c4113dSnw141292
850c5c4113dSnw141292# Repeat the following group of tests 20 times for quick testing and
851c5c4113dSnw141292# 40 times for full testing.  Each iteration of the test makes table
852c5c4113dSnw141292# t3 a little larger, and thus takes a little longer, so doing 40 tests
853c5c4113dSnw141292# is more than 2.0 times slower than doing 20 tests.  Considerably more.
854c5c4113dSnw141292#
855c5c4113dSnw141292if {[info exists ISQUICK]} {
856c5c4113dSnw141292  set limit 20
857c5c4113dSnw141292} else {
858c5c4113dSnw141292  set limit 40
859c5c4113dSnw141292}
860c5c4113dSnw141292
861c5c4113dSnw141292# Do rollbacks.  Make sure the signature does not change.
862c5c4113dSnw141292#
863c5c4113dSnw141292for {set i 2} {$i<=$limit} {incr i} {
864c5c4113dSnw141292  set ::sig [signature]
865c5c4113dSnw141292  set cnt [lindex $::sig 0]
866c5c4113dSnw141292  set ::journal_format [expr {($i%3)+1}]
867c5c4113dSnw141292  if {$i%2==0} {
868c5c4113dSnw141292    execsql {PRAGMA synchronous=FULL}
869c5c4113dSnw141292  } else {
870c5c4113dSnw141292    execsql {PRAGMA synchronous=NORMAL}
871c5c4113dSnw141292  }
872c5c4113dSnw141292  do_test trans-9.$i.1-$cnt {
873c5c4113dSnw141292     execsql {
874c5c4113dSnw141292       BEGIN;
875c5c4113dSnw141292       DELETE FROM t3 WHERE random()%10!=0;
876c5c4113dSnw141292       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
877c5c4113dSnw141292       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
878c5c4113dSnw141292       ROLLBACK;
879c5c4113dSnw141292     }
880c5c4113dSnw141292     signature
881c5c4113dSnw141292  } $sig
882c5c4113dSnw141292  do_test trans-9.$i.2-$cnt {
883c5c4113dSnw141292     execsql {
884c5c4113dSnw141292       BEGIN;
885c5c4113dSnw141292       DELETE FROM t3 WHERE random()%10!=0;
886c5c4113dSnw141292       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
887c5c4113dSnw141292       DELETE FROM t3 WHERE random()%10!=0;
888c5c4113dSnw141292       INSERT INTO t3 SELECT randstr(10,10)||x FROM t3;
889c5c4113dSnw141292       ROLLBACK;
890c5c4113dSnw141292     }
891c5c4113dSnw141292     signature
892c5c4113dSnw141292  } $sig
893c5c4113dSnw141292  if {$i<$limit} {
894c5c4113dSnw141292    do_test trans-9.$i.9-$cnt {
895c5c4113dSnw141292       execsql {
896c5c4113dSnw141292         INSERT INTO t3 SELECT randstr(10,400) FROM t3 WHERE random()%10==0;
897c5c4113dSnw141292       }
898c5c4113dSnw141292    } {}
899c5c4113dSnw141292  }
900c5c4113dSnw141292  set ::pager_old_format 0
901c5c4113dSnw141292}
902c5c4113dSnw141292
903c5c4113dSnw141292finish_test
904