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