Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Bring the ancient malloc3.test file closer into relevance with the latest core code. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
9793a21c13a1188383b4be64df86629f |
User & Date: | mistachkin 2012-12-06 04:19:24.854 |
Context
2012-12-06
| ||
04:33 | For the sqlite3-all.c target, use backslashes when calling the splitter script via the MSVC makefile. (check-in: d507648d82 user: mistachkin tags: trunk) | |
04:19 | Bring the ancient malloc3.test file closer into relevance with the latest core code. (check-in: 9793a21c13 user: mistachkin tags: trunk) | |
02:56 | Stop using the TCL_LIBS configuration variable when linking with Tcl. Remove superfluous 'rm' command from the "clean" target. (check-in: 1551277208 user: drh tags: trunk) | |
Changes
Changes to test/malloc3.test.
︙ | ︙ | |||
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | #-------------------------------------------------------------------------- # These procs are used to build up a "program" in global variable # ::run_test_script. At the end of this file, the proc [run_test] is used # to execute the program (and all test cases contained therein). # set ::run_test_script [list] proc TEST {id t} {lappend ::run_test_script -test [list $id $t]} proc PREP {p} {lappend ::run_test_script -prep [string trim $p]} proc DEBUG {s} {lappend ::run_test_script -debug $s} # SQL -- # # SQL ?-norollback? <sql-text> # # Add an 'SQL' primitive to the program (see notes above). If the -norollback # switch is present, then the statement is not allowed to automatically roll # back any active transaction if malloc() fails. It must rollback the statement # transaction only. # proc SQL {a1 {a2 ""}} { | > | | | > | | | 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | #-------------------------------------------------------------------------- # These procs are used to build up a "program" in global variable # ::run_test_script. At the end of this file, the proc [run_test] is used # to execute the program (and all test cases contained therein). # set ::run_test_sql_id 0 set ::run_test_script [list] proc TEST {id t} {lappend ::run_test_script -test [list $id $t]} proc PREP {p} {lappend ::run_test_script -prep [string trim $p]} proc DEBUG {s} {lappend ::run_test_script -debug $s} # SQL -- # # SQL ?-norollback? <sql-text> # # Add an 'SQL' primitive to the program (see notes above). If the -norollback # switch is present, then the statement is not allowed to automatically roll # back any active transaction if malloc() fails. It must rollback the statement # transaction only. # proc SQL {a1 {a2 ""}} { # An SQL primitive parameter is a list of three elements, an id, a boolean # value indicating if the statement may cause transaction rollback when # malloc() fails, and the sql statement itself. set id [incr ::run_test_sql_id] if {$a2 == ""} { lappend ::run_test_script -sql [list $id true [string trim $a1]] } else { lappend ::run_test_script -sql [list $id false [string trim $a2]] } } # TEST_AUTOCOMMIT -- # # A shorthand test to see if a transaction is active or not. The first # argument - $id - is the integer number of the test case. The second |
︙ | ︙ | |||
254 255 256 257 258 259 260 | } } {abc abc abc_i abc abc_t abc abc_v abc_v 1 2 3} } set sql { BEGIN;DELETE FROM abc; } | | | 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | } } {abc abc abc_i abc abc_t abc abc_v abc_v 1 2 3} } set sql { BEGIN;DELETE FROM abc; } for {set i 1} {$i < 100} {incr i} { set a $i set b "String value $i" set c [string repeat X $i] append sql "INSERT INTO abc VALUES ($a, '$b', '$c');" } append sql {COMMIT;} PREP $sql |
︙ | ︙ | |||
525 526 527 528 529 530 531 | proc run_test {arglist iRepeat {pcstart 0} {iFailStart 1}} { if {[llength $arglist] %2} { error "Uneven number of arguments to TEST" } for {set i 0} {$i < $pcstart} {incr i} { | | | | > > > > < < > > > > > | | | > | | | < | | | | | > | | | 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 | proc run_test {arglist iRepeat {pcstart 0} {iFailStart 1}} { if {[llength $arglist] %2} { error "Uneven number of arguments to TEST" } for {set i 0} {$i < $pcstart} {incr i} { set k2 [lindex $arglist [expr {2 * $i}]] set v2 [lindex $arglist [expr {2 * $i + 1}]] set ac [sqlite3_get_autocommit $::DB] ;# Auto-Commit switch -- $k2 { -sql {db eval [lindex $v2 2]} -prep {db eval $v2} -debug {eval $v2} } set nac [sqlite3_get_autocommit $::DB] ;# New Auto-Commit if {$ac && !$nac} {set begin_pc $i} } db rollback_hook [list incr ::rollback_hook_count] set iFail $iFailStart set pc $pcstart while {$pc*2 < [llength $arglist]} { # Fetch the current instruction type and payload. set k [lindex $arglist [expr {2 * $pc}]] set v [lindex $arglist [expr {2 * $pc + 1}]] # Id of this iteration: set iterid "pc=$pc.iFail=$iFail$k" switch -- $k { -test { foreach {id script} $v {} set testid "malloc3-(test $id).$iterid" eval $script incr pc } -sql { set ::rollback_hook_count 0 set id [lindex $v 0] set testid "malloc3-(integrity $id).$iterid" set ac [sqlite3_get_autocommit $::DB] ;# Auto-Commit sqlite3_memdebug_fail $iFail -repeat 0 set rc [catch {db eval [lindex $v 2]} msg] ;# True error occurs set nac [sqlite3_get_autocommit $::DB] ;# New Auto-Commit if {$rc != 0 && $nac && !$ac} { # Before [db eval] the auto-commit flag was clear. Now it # is set. Since an error occured we assume this was not a # commit - therefore a rollback occured. Check that the # rollback-hook was invoked. do_test malloc3-rollback_hook_count.$iterid { set ::rollback_hook_count } {1} } set nFail [sqlite3_memdebug_fail -1 -benigncnt nBenign] if {$rc == 0} { # Successful execution of sql. The number of failed malloc() # calls should be equal to the number of benign failures. # Otherwise a malloc() failed and the error was not reported. # set expr {$nFail!=$nBenign} if {[expr $expr]} { error "Unreported malloc() failure, test \"$testid\", $expr" } if {$ac && !$nac} { # Before the [db eval] the auto-commit flag was set, now it # is clear. We can deduce that a "BEGIN" statement has just # been successfully executed. set begin_pc $pc } incr pc set iFail 1 integrity_check $testid } elseif {[regexp {.*out of memory} $msg] || [db errorcode] == 3082} { # Out of memory error, as expected. # integrity_check $testid incr iFail if {$nac && !$ac} { if {![lindex $v 1] && [db errorcode] != 3082} { # error "Statement \"[lindex $v 2]\" caused a rollback" } for {set i $begin_pc} {$i < $pc} {incr i} { set k2 [lindex $arglist [expr {2 * $i}]] set v2 [lindex $arglist [expr {2 * $i + 1}]] set catchupsql "" switch -- $k2 { -sql {set catchupsql [lindex $v2 2]} -prep {set catchupsql $v2} } db eval $catchupsql } } } else { error $msg } # back up to the previous "-test" block. while {[lindex $arglist [expr {2 * ($pc - 1)}]] == "-test"} { incr pc -1 } } -prep { db eval $v incr pc } -debug { eval $v incr pc } default { error "Unknown switch: $k" } } } } # Turn off the Tcl interface's prepared statement caching facility. Then # run the tests with "persistent" malloc failures. sqlite3_extended_result_codes db 1 db cache size 0 run_test $::run_test_script 1 # Close and reopen the db. db close |
︙ | ︙ |