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