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