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