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