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