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