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