| OLD | NEW |
| 1 # 2009 January 30 | 1 # 2009 January 30 |
| 2 # | 2 # |
| 3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
| 4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
| 5 # | 5 # |
| 6 # May you do good and not evil. | 6 # May you do good and not evil. |
| 7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
| 8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
| 9 # | 9 # |
| 10 #*********************************************************************** | 10 #*********************************************************************** |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 } | 66 } |
| 67 } {} | 67 } {} |
| 68 | 68 |
| 69 # Sanity check to verify that the [test_contents] proc works. | 69 # Sanity check to verify that the [test_contents] proc works. |
| 70 # | 70 # |
| 71 test_contents backup-1.2 db main db main | 71 test_contents backup-1.2 db main db main |
| 72 | 72 |
| 73 # Check that it is possible to create and finish backup operations. | 73 # Check that it is possible to create and finish backup operations. |
| 74 # | 74 # |
| 75 do_test backup-1.3.1 { | 75 do_test backup-1.3.1 { |
| 76 file delete test2.db | 76 delete_file test2.db |
| 77 sqlite3 db2 test2.db | 77 sqlite3 db2 test2.db |
| 78 sqlite3_backup B db2 main db main | 78 sqlite3_backup B db2 main db main |
| 79 } {B} | 79 } {B} |
| 80 do_test backup-1.3.2 { | 80 do_test backup-1.3.2 { |
| 81 B finish | 81 B finish |
| 82 } {SQLITE_OK} | 82 } {SQLITE_OK} |
| 83 do_test backup-1.3.3 { | 83 do_test backup-1.3.3 { |
| 84 info commands B | 84 info commands B |
| 85 } {} | 85 } {} |
| 86 | 86 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 sqlite3 db $zSrcFile | 161 sqlite3 db $zSrcFile |
| 162 sqlite3 db2 $zDestFile | 162 sqlite3 db2 $zDestFile |
| 163 set db_dest db2 | 163 set db_dest db2 |
| 164 set file_dest temp | 164 set file_dest temp |
| 165 }] { | 165 }] { |
| 166 foreach rows_dest {0 3 10} { | 166 foreach rows_dest {0 3 10} { |
| 167 foreach pgsz_dest {512 1024 2048} { | 167 foreach pgsz_dest {512 1024 2048} { |
| 168 foreach nPagePerStep {1 200} { | 168 foreach nPagePerStep {1 200} { |
| 169 | 169 |
| 170 # Open the databases. | 170 # Open the databases. |
| 171 catch { file delete test.db } | 171 catch { delete_file test.db } |
| 172 catch { file delete test2.db } | 172 catch { delete_file test2.db } |
| 173 eval $zOpenScript | 173 eval $zOpenScript |
| 174 | 174 |
| 175 # Set to true if copying to an in-memory destination. Copying to an | 175 # Set to true if copying to an in-memory destination. Copying to an |
| 176 # in-memory destination is only possible if the initial destination | 176 # in-memory destination is only possible if the initial destination |
| 177 # page size is the same as the source page size (in this case 1024 bytes). | 177 # page size is the same as the source page size (in this case 1024 bytes). |
| 178 # | 178 # |
| 179 set isMemDest [expr { | 179 set isMemDest [expr { |
| 180 $zDestFile eq ":memory:" || $file_dest eq "temp" && $TEMP_STORE>=2 | 180 $zDestFile eq ":memory:" || $file_dest eq "temp" && $TEMP_STORE>=2 |
| 181 }] | 181 }] |
| 182 | 182 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 # | 272 # |
| 273 # * Target database page-size is the same as the source, OR | 273 # * Target database page-size is the same as the source, OR |
| 274 # * Target database page-size is larger than the source, OR | 274 # * Target database page-size is larger than the source, OR |
| 275 # * Target database page-size is smaller than the source. | 275 # * Target database page-size is smaller than the source. |
| 276 # | 276 # |
| 277 set iTest 1 | 277 set iTest 1 |
| 278 foreach nSrcPg {10 64 65 66 100} { | 278 foreach nSrcPg {10 64 65 66 100} { |
| 279 foreach nDestRow {10 100} { | 279 foreach nDestRow {10 100} { |
| 280 foreach nDestPgsz {512 1024 2048 4096} { | 280 foreach nDestPgsz {512 1024 2048 4096} { |
| 281 | 281 |
| 282 catch { file delete test.db } | 282 catch { delete_file test.db } |
| 283 catch { file delete test2.db } | 283 catch { delete_file test2.db } |
| 284 sqlite3 db test.db | 284 sqlite3 db test.db |
| 285 sqlite3 db2 test2.db | 285 sqlite3 db2 test2.db |
| 286 | 286 |
| 287 # Set up the content of the two databases. | 287 # Set up the content of the two databases. |
| 288 # | 288 # |
| 289 execsql { PRAGMA page_size = 1024 } | 289 execsql { PRAGMA page_size = 1024 } |
| 290 execsql "PRAGMA page_size = $nDestPgsz" db2 | 290 execsql "PRAGMA page_size = $nDestPgsz" db2 |
| 291 foreach db {db db2} { | 291 foreach db {db db2} { |
| 292 execsql { | 292 execsql { |
| 293 BEGIN; | 293 BEGIN; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 320 | 320 |
| 321 db close | 321 db close |
| 322 db2 close | 322 db2 close |
| 323 incr iTest | 323 incr iTest |
| 324 } | 324 } |
| 325 } | 325 } |
| 326 } | 326 } |
| 327 | 327 |
| 328 #-------------------------------------------------------------------- | 328 #-------------------------------------------------------------------- |
| 329 do_test backup-3.$iTest.1 { | 329 do_test backup-3.$iTest.1 { |
| 330 catch { file delete -force test.db } | 330 catch { forcedelete test.db } |
| 331 catch { file delete -force test2.db } | 331 catch { forcedelete test2.db } |
| 332 sqlite3 db test.db | 332 sqlite3 db test.db |
| 333 set iTab 1 | 333 set iTab 1 |
| 334 | 334 |
| 335 db eval { PRAGMA page_size = 512 } | 335 db eval { PRAGMA page_size = 512 } |
| 336 while {[file size test.db] <= $::sqlite_pending_byte} { | 336 while {[file size test.db] <= $::sqlite_pending_byte} { |
| 337 db eval "CREATE TABLE t${iTab}(a, b, c)" | 337 db eval "CREATE TABLE t${iTab}(a, b, c)" |
| 338 incr iTab | 338 incr iTab |
| 339 } | 339 } |
| 340 | 340 |
| 341 sqlite3 db2 test2.db | 341 sqlite3 db2 test2.db |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 sqlite3_errmsg db | 385 sqlite3_errmsg db |
| 386 } {unknown database aux} | 386 } {unknown database aux} |
| 387 do_test backup-4.1.3 { | 387 do_test backup-4.1.3 { |
| 388 catch { sqlite3_backup B db main db2 aux } | 388 catch { sqlite3_backup B db main db2 aux } |
| 389 } {1} | 389 } {1} |
| 390 do_test backup-4.1.4 { | 390 do_test backup-4.1.4 { |
| 391 sqlite3_errmsg db | 391 sqlite3_errmsg db |
| 392 } {unknown database aux} | 392 } {unknown database aux} |
| 393 | 393 |
| 394 do_test backup-4.2.1 { | 394 do_test backup-4.2.1 { |
| 395 catch { file delete -force test3.db } | 395 catch { forcedelete test3.db } |
| 396 catch { file delete -force test4.db } | 396 catch { forcedelete test4.db } |
| 397 execsql { | 397 execsql { |
| 398 ATTACH 'test3.db' AS aux1; | 398 ATTACH 'test3.db' AS aux1; |
| 399 CREATE TABLE aux1.t1(a, b); | 399 CREATE TABLE aux1.t1(a, b); |
| 400 } | 400 } |
| 401 execsql { | 401 execsql { |
| 402 ATTACH 'test4.db' AS aux2; | 402 ATTACH 'test4.db' AS aux2; |
| 403 CREATE TABLE aux2.t2(a, b); | 403 CREATE TABLE aux2.t2(a, b); |
| 404 } db2 | 404 } db2 |
| 405 sqlite3_backup B db aux1 db2 aux2 | 405 sqlite3_backup B db aux1 db2 aux2 |
| 406 } {B} | 406 } {B} |
| 407 do_test backup-4.2.2 { | 407 do_test backup-4.2.2 { |
| 408 catchsql { DETACH aux2 } db2 | 408 catchsql { DETACH aux2 } db2 |
| 409 } {1 {database aux2 is locked}} | 409 } {1 {database aux2 is locked}} |
| 410 do_test backup-4.2.3 { | 410 do_test backup-4.2.3 { |
| 411 B step 50 | 411 B step 50 |
| 412 } {SQLITE_DONE} | 412 } {SQLITE_DONE} |
| 413 do_test backup-4.2.4 { | 413 do_test backup-4.2.4 { |
| 414 B finish | 414 B finish |
| 415 } {SQLITE_OK} | 415 } {SQLITE_OK} |
| 416 | 416 |
| 417 do_test backup-4.3.1 { | 417 do_test backup-4.3.1 { |
| 418 sqlite3_backup B db aux1 db2 aux2 | 418 sqlite3_backup B db aux1 db2 aux2 |
| 419 } {B} | 419 } {B} |
| 420 do_test backup-4.3.2 { | 420 do_test backup-4.3.2 { |
| 421 db2 cache flush | 421 db2 cache flush |
| 422 sqlite3_close db2 | 422 sqlite3_close db2 |
| 423 } {SQLITE_BUSY} | 423 } {SQLITE_BUSY} |
| 424 do_test backup-4.3.3 { | 424 do_test backup-4.3.3 { |
| 425 sqlite3_errmsg db2 | 425 sqlite3_errmsg db2 |
| 426 } {unable to close due to unfinished backup operation} | 426 } {unable to close due to unfinalized statements or unfinished backups} |
| 427 do_test backup-4.3.4 { | 427 do_test backup-4.3.4 { |
| 428 B step 50 | 428 B step 50 |
| 429 } {SQLITE_DONE} | 429 } {SQLITE_DONE} |
| 430 do_test backup-4.3.5 { | 430 do_test backup-4.3.5 { |
| 431 B finish | 431 B finish |
| 432 } {SQLITE_OK} | 432 } {SQLITE_OK} |
| 433 | 433 |
| 434 do_test backup-4.4.1 { | 434 do_test backup-4.4.1 { |
| 435 set rc [catch {sqlite3_backup B db main db aux1}] | 435 set rc [catch {sqlite3_backup B db main db aux1}] |
| 436 list $rc [sqlite3_errcode db] [sqlite3_errmsg db] | 436 list $rc [sqlite3_errcode db] [sqlite3_errmsg db] |
| 437 } {1 SQLITE_ERROR {source and destination must be distinct}} | 437 } {1 SQLITE_ERROR {source and destination must be distinct}} |
| 438 db close | 438 db close |
| 439 db2 close | 439 db2 close |
| 440 | 440 |
| 441 do_test backup-4.5.1 { | 441 do_test backup-4.5.1 { |
| 442 catch { file delete -force test.db } | 442 catch { forcedelete test.db } |
| 443 sqlite3 db test.db | 443 sqlite3 db test.db |
| 444 sqlite3 db2 :memory: | 444 sqlite3 db2 :memory: |
| 445 execsql { | 445 execsql { |
| 446 CREATE TABLE t1(a, b); | 446 CREATE TABLE t1(a, b); |
| 447 INSERT INTO t1 VALUES(1, 2); | 447 INSERT INTO t1 VALUES(1, 2); |
| 448 } | 448 } |
| 449 execsql { | 449 execsql { |
| 450 PRAGMA page_size = 4096; | 450 PRAGMA page_size = 4096; |
| 451 CREATE TABLE t2(a, b); | 451 CREATE TABLE t2(a, b); |
| 452 INSERT INTO t2 VALUES(3, 4); | 452 INSERT INTO t2 VALUES(3, 4); |
| 453 } db2 | 453 } db2 |
| 454 sqlite3_backup B db2 main db main | 454 sqlite3_backup B db2 main db main |
| 455 } {B} | 455 } {B} |
| 456 do_test backup-4.5.2 { | 456 do_test backup-4.5.2 { |
| 457 B step 5000 | 457 B step 5000 |
| 458 } {SQLITE_READONLY} | 458 } {SQLITE_READONLY} |
| 459 do_test backup-4.5.3 { | 459 do_test backup-4.5.3 { |
| 460 B finish | 460 B finish |
| 461 } {SQLITE_READONLY} | 461 } {SQLITE_READONLY} |
| 462 | 462 |
| 463 db close | 463 db close |
| 464 db2 close | 464 db2 close |
| 465 # | 465 # |
| 466 # End of backup-5.* tests. | 466 # End of backup-4.* tests. |
| 467 #--------------------------------------------------------------------- | 467 #--------------------------------------------------------------------- |
| 468 | 468 |
| 469 #--------------------------------------------------------------------- | 469 #--------------------------------------------------------------------- |
| 470 # The following tests, backup-5.*, test that the backup works properly | 470 # The following tests, backup-5.*, test that the backup works properly |
| 471 # when the source database is modified during the backup. Test cases | 471 # when the source database is modified during the backup. Test cases |
| 472 # are organized as follows: | 472 # are organized as follows: |
| 473 # | 473 # |
| 474 # backup-5.x.1.*: Nothing special. Modify the database mid-backup. | 474 # backup-5.x.1.*: Nothing special. Modify the database mid-backup. |
| 475 # | 475 # |
| 476 # backup-5.x.2.*: Modify the database mid-backup so that one or more | 476 # backup-5.x.2.*: Modify the database mid-backup so that one or more |
| 477 # pages are written out due to cache stress. Then | 477 # pages are written out due to cache stress. Then |
| 478 # rollback the transaction. | 478 # rollback the transaction. |
| 479 # | 479 # |
| 480 # backup-5.x.3.*: Database is vacuumed. | 480 # backup-5.x.3.*: Database is vacuumed. |
| 481 # | 481 # |
| 482 # backup-5.x.4.*: Database is vacuumed and the page-size modified. | 482 # backup-5.x.4.*: Database is vacuumed and the page-size modified. |
| 483 # | 483 # |
| 484 # backup-5.x.5.*: Database is shrunk via incr-vacuum. | 484 # backup-5.x.5.*: Database is shrunk via incr-vacuum. |
| 485 # | 485 # |
| 486 # Each test is run three times, in the following configurations: | 486 # Each test is run three times, in the following configurations: |
| 487 # | 487 # |
| 488 # 1) Backing up file-to-file. The writer writes via an external pager. | 488 # 1) Backing up file-to-file. The writer writes via an external pager. |
| 489 # 2) Backing up file-to-file. The writer writes via the same pager as | 489 # 2) Backing up file-to-file. The writer writes via the same pager as |
| 490 # is used by the backup operation. | 490 # is used by the backup operation. |
| 491 # 3) Backing up memory-to-file. | 491 # 3) Backing up memory-to-file. |
| 492 # | 492 # |
| 493 set iTest 0 | 493 set iTest 0 |
| 494 file delete -force bak.db-wal | 494 forcedelete bak.db-wal |
| 495 foreach {writer file} {db test.db db3 test.db db :memory:} { | 495 foreach {writer file} {db test.db db3 test.db db :memory:} { |
| 496 incr iTest | 496 incr iTest |
| 497 catch { file delete bak.db } | 497 catch { delete_file bak.db } |
| 498 sqlite3 db2 bak.db | 498 sqlite3 db2 bak.db |
| 499 catch { file delete $file } | 499 catch { delete_file $file } |
| 500 sqlite3 db $file | 500 sqlite3 db $file |
| 501 sqlite3 db3 $file | 501 sqlite3 db3 $file |
| 502 | 502 |
| 503 do_test backup-5.$iTest.1.1 { | 503 do_test backup-5.$iTest.1.1 { |
| 504 execsql { | 504 execsql { |
| 505 BEGIN; | 505 BEGIN; |
| 506 CREATE TABLE t1(a, b); | 506 CREATE TABLE t1(a, b); |
| 507 CREATE INDEX i1 ON t1(a, b); | 507 CREATE INDEX i1 ON t1(a, b); |
| 508 INSERT INTO t1 VALUES(1, randstr(1000,1000)); | 508 INSERT INTO t1 VALUES(1, randstr(1000,1000)); |
| 509 INSERT INTO t1 VALUES(2, randstr(1000,1000)); | 509 INSERT INTO t1 VALUES(2, randstr(1000,1000)); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 } {SQLITE_DONE} | 590 } {SQLITE_DONE} |
| 591 do_test backup-5.$iTest.4.4 { | 591 do_test backup-5.$iTest.4.4 { |
| 592 B finish | 592 B finish |
| 593 } {SQLITE_OK} | 593 } {SQLITE_OK} |
| 594 integrity_check backup-5.$iTest.4.5 db2 | 594 integrity_check backup-5.$iTest.4.5 db2 |
| 595 test_contents backup-5.$iTest.4.6 db main db2 main | 595 test_contents backup-5.$iTest.4.6 db main db2 main |
| 596 | 596 |
| 597 catch {db close} | 597 catch {db close} |
| 598 catch {db2 close} | 598 catch {db2 close} |
| 599 catch {db3 close} | 599 catch {db3 close} |
| 600 catch { file delete bak.db } | 600 catch { delete_file bak.db } |
| 601 sqlite3 db2 bak.db | 601 sqlite3 db2 bak.db |
| 602 catch { file delete $file } | 602 catch { delete_file $file } |
| 603 sqlite3 db $file | 603 sqlite3 db $file |
| 604 sqlite3 db3 $file | 604 sqlite3 db3 $file |
| 605 do_test backup-5.$iTest.5.1 { | 605 do_test backup-5.$iTest.5.1 { |
| 606 execsql { | 606 execsql { |
| 607 PRAGMA auto_vacuum = incremental; | 607 PRAGMA auto_vacuum = incremental; |
| 608 BEGIN; | 608 BEGIN; |
| 609 CREATE TABLE t1(a, b); | 609 CREATE TABLE t1(a, b); |
| 610 CREATE INDEX i1 ON t1(a, b); | 610 CREATE INDEX i1 ON t1(a, b); |
| 611 INSERT INTO t1 VALUES(1, randstr(1000,1000)); | 611 INSERT INTO t1 VALUES(1, randstr(1000,1000)); |
| 612 INSERT INTO t1 VALUES(2, randstr(1000,1000)); | 612 INSERT INTO t1 VALUES(2, randstr(1000,1000)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 637 catch {db3 close} | 637 catch {db3 close} |
| 638 } | 638 } |
| 639 # | 639 # |
| 640 # End of backup-5.* tests. | 640 # End of backup-5.* tests. |
| 641 #--------------------------------------------------------------------- | 641 #--------------------------------------------------------------------- |
| 642 | 642 |
| 643 #--------------------------------------------------------------------- | 643 #--------------------------------------------------------------------- |
| 644 # Test the sqlite3_backup_remaining() and backup_pagecount() APIs. | 644 # Test the sqlite3_backup_remaining() and backup_pagecount() APIs. |
| 645 # | 645 # |
| 646 do_test backup-6.1 { | 646 do_test backup-6.1 { |
| 647 catch { file delete -force test.db } | 647 catch { forcedelete test.db } |
| 648 catch { file delete -force test2.db } | 648 catch { forcedelete test2.db } |
| 649 sqlite3 db test.db | 649 sqlite3 db test.db |
| 650 sqlite3 db2 test2.db | 650 sqlite3 db2 test2.db |
| 651 execsql { | 651 execsql { |
| 652 BEGIN; | 652 BEGIN; |
| 653 CREATE TABLE t1(a, b); | 653 CREATE TABLE t1(a, b); |
| 654 CREATE INDEX i1 ON t1(a, b); | 654 CREATE INDEX i1 ON t1(a, b); |
| 655 INSERT INTO t1 VALUES(1, randstr(1000,1000)); | 655 INSERT INTO t1 VALUES(1, randstr(1000,1000)); |
| 656 INSERT INTO t1 VALUES(2, randstr(1000,1000)); | 656 INSERT INTO t1 VALUES(2, randstr(1000,1000)); |
| 657 INSERT INTO t1 VALUES(3, randstr(1000,1000)); | 657 INSERT INTO t1 VALUES(3, randstr(1000,1000)); |
| 658 INSERT INTO t1 VALUES(4, randstr(1000,1000)); | 658 INSERT INTO t1 VALUES(4, randstr(1000,1000)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 # | 694 # |
| 695 # backup-7.1.*: Source database is externally locked (return SQLITE_BUSY). | 695 # backup-7.1.*: Source database is externally locked (return SQLITE_BUSY). |
| 696 # | 696 # |
| 697 # backup-7.2.*: Attempt to step the backup process while a | 697 # backup-7.2.*: Attempt to step the backup process while a |
| 698 # write-transaction is underway on the source pager (return | 698 # write-transaction is underway on the source pager (return |
| 699 # SQLITE_LOCKED). | 699 # SQLITE_LOCKED). |
| 700 # | 700 # |
| 701 # backup-7.3.*: Destination database is externally locked (return SQLITE_BUSY). | 701 # backup-7.3.*: Destination database is externally locked (return SQLITE_BUSY). |
| 702 # | 702 # |
| 703 do_test backup-7.0 { | 703 do_test backup-7.0 { |
| 704 catch { file delete -force test.db } | 704 catch { forcedelete test.db } |
| 705 catch { file delete -force test2.db } | 705 catch { forcedelete test2.db } |
| 706 sqlite3 db2 test2.db | 706 sqlite3 db2 test2.db |
| 707 sqlite3 db test.db | 707 sqlite3 db test.db |
| 708 execsql { | 708 execsql { |
| 709 CREATE TABLE t1(a, b); | 709 CREATE TABLE t1(a, b); |
| 710 CREATE INDEX i1 ON t1(a, b); | 710 CREATE INDEX i1 ON t1(a, b); |
| 711 INSERT INTO t1 VALUES(1, randstr(1000,1000)); | 711 INSERT INTO t1 VALUES(1, randstr(1000,1000)); |
| 712 INSERT INTO t1 SELECT a+ 1, randstr(1000,1000) FROM t1; | 712 INSERT INTO t1 SELECT a+ 1, randstr(1000,1000) FROM t1; |
| 713 INSERT INTO t1 SELECT a+ 2, randstr(1000,1000) FROM t1; | 713 INSERT INTO t1 SELECT a+ 2, randstr(1000,1000) FROM t1; |
| 714 INSERT INTO t1 SELECT a+ 4, randstr(1000,1000) FROM t1; | 714 INSERT INTO t1 SELECT a+ 4, randstr(1000,1000) FROM t1; |
| 715 INSERT INTO t1 SELECT a+ 8, randstr(1000,1000) FROM t1; | 715 INSERT INTO t1 SELECT a+ 8, randstr(1000,1000) FROM t1; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 747 } {SQLITE_DONE} | 747 } {SQLITE_DONE} |
| 748 do_test backup-7.2.4 { | 748 do_test backup-7.2.4 { |
| 749 B finish | 749 B finish |
| 750 } {SQLITE_OK} | 750 } {SQLITE_OK} |
| 751 test_contents backup-7.2.5 db main db2 main | 751 test_contents backup-7.2.5 db main db2 main |
| 752 integrity_check backup-7.3.6 db2 | 752 integrity_check backup-7.3.6 db2 |
| 753 | 753 |
| 754 do_test backup-7.3.1 { | 754 do_test backup-7.3.1 { |
| 755 db2 close | 755 db2 close |
| 756 db3 close | 756 db3 close |
| 757 file delete -force test2.db | 757 forcedelete test2.db |
| 758 sqlite3 db2 test2.db | 758 sqlite3 db2 test2.db |
| 759 sqlite3 db3 test2.db | 759 sqlite3 db3 test2.db |
| 760 | 760 |
| 761 sqlite3_backup B db2 main db main | 761 sqlite3_backup B db2 main db main |
| 762 execsql { BEGIN ; CREATE TABLE t2(a, b); } db3 | 762 execsql { BEGIN ; CREATE TABLE t2(a, b); } db3 |
| 763 | 763 |
| 764 B step 5 | 764 B step 5 |
| 765 } {SQLITE_BUSY} | 765 } {SQLITE_BUSY} |
| 766 do_test backup-7.3.2 { | 766 do_test backup-7.3.2 { |
| 767 execsql { COMMIT } db3 | 767 execsql { COMMIT } db3 |
| 768 B step 5000 | 768 B step 5000 |
| 769 } {SQLITE_DONE} | 769 } {SQLITE_DONE} |
| 770 do_test backup-7.3.3 { | 770 do_test backup-7.3.3 { |
| 771 B finish | 771 B finish |
| 772 } {SQLITE_OK} | 772 } {SQLITE_OK} |
| 773 test_contents backup-7.3.4 db main db2 main | 773 test_contents backup-7.3.4 db main db2 main |
| 774 integrity_check backup-7.3.5 db2 | 774 integrity_check backup-7.3.5 db2 |
| 775 catch { db2 close } | 775 catch { db2 close } |
| 776 catch { db3 close } | 776 catch { db3 close } |
| 777 | 777 |
| 778 #----------------------------------------------------------------------- | 778 #----------------------------------------------------------------------- |
| 779 # The following tests, backup-8.*, test attaching multiple backup | 779 # The following tests, backup-8.*, test attaching multiple backup |
| 780 # processes to the same source database. Also, reading from the source | 780 # processes to the same source database. Also, reading from the source |
| 781 # database while a read transaction is active. | 781 # database while a read transaction is active. |
| 782 # | 782 # |
| 783 # These tests reuse the database "test.db" left over from backup-7.*. | 783 # These tests reuse the database "test.db" left over from backup-7.*. |
| 784 # | 784 # |
| 785 do_test backup-8.1 { | 785 do_test backup-8.1 { |
| 786 catch { file delete -force test2.db } | 786 catch { forcedelete test2.db } |
| 787 catch { file delete -force test3.db } | 787 catch { forcedelete test3.db } |
| 788 sqlite3 db2 test2.db | 788 sqlite3 db2 test2.db |
| 789 sqlite3 db3 test3.db | 789 sqlite3 db3 test3.db |
| 790 | 790 |
| 791 sqlite3_backup B2 db2 main db main | 791 sqlite3_backup B2 db2 main db main |
| 792 sqlite3_backup B3 db3 main db main | 792 sqlite3_backup B3 db3 main db main |
| 793 list [B2 finish] [B3 finish] | 793 list [B2 finish] [B3 finish] |
| 794 } {SQLITE_OK SQLITE_OK} | 794 } {SQLITE_OK SQLITE_OK} |
| 795 do_test backup-8.2 { | 795 do_test backup-8.2 { |
| 796 sqlite3_backup B3 db3 main db main | 796 sqlite3_backup B3 db3 main db main |
| 797 sqlite3_backup B2 db2 main db main | 797 sqlite3_backup B2 db2 main db main |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 858 do_test backup-9.2.2 { | 858 do_test backup-9.2.2 { |
| 859 B remaining | 859 B remaining |
| 860 } {0} | 860 } {0} |
| 861 do_test backup-9.2.3 { | 861 do_test backup-9.2.3 { |
| 862 B finish | 862 B finish |
| 863 } {SQLITE_OK} | 863 } {SQLITE_OK} |
| 864 catch {db2 close} | 864 catch {db2 close} |
| 865 | 865 |
| 866 ifcapable memorymanage { | 866 ifcapable memorymanage { |
| 867 db close | 867 db close |
| 868 file delete -force test.db | 868 forcedelete test.db |
| 869 file delete -force bak.db | 869 forcedelete bak.db |
| 870 | 870 |
| 871 sqlite3 db test.db | 871 sqlite3 db test.db |
| 872 sqlite3 db2 test.db | 872 sqlite3 db2 test.db |
| 873 sqlite3 db3 bak.db | 873 sqlite3 db3 bak.db |
| 874 | 874 |
| 875 do_test backup-10.1.1 { | 875 do_test backup-10.1.1 { |
| 876 execsql { | 876 execsql { |
| 877 BEGIN; | 877 BEGIN; |
| 878 CREATE TABLE t1(a, b); | 878 CREATE TABLE t1(a, b); |
| 879 INSERT INTO t1 VALUES(1, randstr(1000,1000)); | 879 INSERT INTO t1 VALUES(1, randstr(1000,1000)); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 | 911 |
| 912 | 912 |
| 913 #----------------------------------------------------------------------- | 913 #----------------------------------------------------------------------- |
| 914 # Test that if the database is written to via the same database handle being | 914 # Test that if the database is written to via the same database handle being |
| 915 # used as the source by a backup operation: | 915 # used as the source by a backup operation: |
| 916 # | 916 # |
| 917 # 10.1.*: If the db is in-memory, the backup is restarted. | 917 # 10.1.*: If the db is in-memory, the backup is restarted. |
| 918 # 10.2.*: If the db is a file, the backup is not restarted. | 918 # 10.2.*: If the db is a file, the backup is not restarted. |
| 919 # | 919 # |
| 920 db close | 920 db close |
| 921 file delete -force test.db test.db-journal | 921 forcedelete test.db test.db-journal |
| 922 foreach {tn file rc} { | 922 foreach {tn file rc} { |
| 923 1 test.db SQLITE_DONE | 923 1 test.db SQLITE_DONE |
| 924 2 :memory: SQLITE_OK | 924 2 :memory: SQLITE_OK |
| 925 } { | 925 } { |
| 926 do_test backup-10.$tn.1 { | 926 do_test backup-10.$tn.1 { |
| 927 sqlite3 db $file | 927 sqlite3 db $file |
| 928 execsql { | 928 execsql { |
| 929 CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB); | 929 CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB); |
| 930 BEGIN; | 930 BEGIN; |
| 931 INSERT INTO t1 VALUES(NULL, randomblob(200)); | 931 INSERT INTO t1 VALUES(NULL, randomblob(200)); |
| 932 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; | 932 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; |
| 933 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; | 933 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; |
| 934 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; | 934 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; |
| 935 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; | 935 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; |
| 936 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; | 936 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; |
| 937 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; | 937 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; |
| 938 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; | 938 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; |
| 939 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; | 939 INSERT INTO t1 SELECT NULL, randomblob(200) FROM t1; |
| 940 COMMIT; | 940 COMMIT; |
| 941 SELECT count(*) FROM t1; | 941 SELECT count(*) FROM t1; |
| 942 } | 942 } |
| 943 } {256} | 943 } {256} |
| 944 | 944 |
| 945 do_test backup-10.$tn.2 { | 945 do_test backup-10.$tn.2 { |
| 946 set pgs [execsql {pragma page_count}] | 946 set pgs [execsql {pragma page_count}] |
| 947 expr {$pgs > 50 && $pgs < 75} | 947 expr {$pgs > 50 && $pgs < 75} |
| 948 } {1} | 948 } {1} |
| 949 | 949 |
| 950 do_test backup-10.$tn.3 { | 950 do_test backup-10.$tn.3 { |
| 951 file delete -force bak.db bak.db-journal | 951 forcedelete bak.db bak.db-journal |
| 952 sqlite3 db2 bak.db | 952 sqlite3 db2 bak.db |
| 953 sqlite3_backup B db2 main db main | 953 sqlite3_backup B db2 main db main |
| 954 B step 50 | 954 B step 50 |
| 955 } {SQLITE_OK} | 955 } {SQLITE_OK} |
| 956 | 956 |
| 957 do_test backup-10.$tn.4 { | 957 do_test backup-10.$tn.4 { |
| 958 execsql { UPDATE t1 SET b = randomblob(200) WHERE a IN (1, 250) } | 958 execsql { UPDATE t1 SET b = randomblob(200) WHERE a IN (1, 250) } |
| 959 } {} | 959 } {} |
| 960 | 960 |
| 961 do_test backup-10.$tn.5 { | 961 do_test backup-10.$tn.5 { |
| 962 B step 50 | 962 B step 50 |
| 963 } $rc | 963 } $rc |
| 964 | 964 |
| 965 do_test backup-10.$tn.6 { | 965 do_test backup-10.$tn.6 { |
| 966 B finish | 966 B finish |
| 967 } {SQLITE_OK} | 967 } {SQLITE_OK} |
| 968 | 968 |
| 969 db2 close | 969 db2 close |
| 970 } | 970 } |
| 971 | 971 |
| 972 finish_test | 972 finish_test |
| OLD | NEW |