diff options
Diffstat (limited to 'third_party/sqlite/src/test/mallocC.test')
-rw-r--r-- | third_party/sqlite/src/test/mallocC.test | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/third_party/sqlite/src/test/mallocC.test b/third_party/sqlite/src/test/mallocC.test new file mode 100644 index 0000000..7316704 --- /dev/null +++ b/third_party/sqlite/src/test/mallocC.test @@ -0,0 +1,123 @@ +# 2007 Aug 13 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file tests aspects of the malloc failure while parsing +# CREATE TABLE statements in auto_vacuum mode. +# +# $Id: mallocC.test,v 1.10 2009/04/11 16:27:50 drh Exp $ + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/malloc_common.tcl + +# Only run these tests if memory debugging is turned on. +# +if {!$MEMDEBUG} { + puts "Skipping mallocC tests: not compiled with -DSQLITE_MEMDEBUG..." + finish_test + return +} + +proc do_mallocC_test {tn args} { + array set ::mallocopts $args + #set sum [allcksum db] + + for {set ::n 1} {true} {incr ::n} { + + # Run the SQL. Malloc number $::n is set to fail. A malloc() failure + # may or may not be reported. + sqlite3_memdebug_fail $::n -repeat 1 + do_test mallocC-$tn.$::n.1 { + set res [catchsql [string trim $::mallocopts(-sql)]] + set rc [expr { + 0==[string compare $res {1 {out of memory}}] || + [db errorcode] == 3082 || + 0==[lindex $res 0] + }] + if {$rc!=1} { + puts "Error: $res" + } + set rc + } {1} + + # If $::n is greater than the number of malloc() calls required to + # execute the SQL, then this test is finished. Break out of the loop. + set nFail [sqlite3_memdebug_fail -1] + if {$nFail==0} { + break + } + + # Recover from the malloc failure. + # + # Update: The new malloc() failure handling means that a transaction may + # still be active even if a malloc() has failed. But when these tests were + # written this was not the case. So do a manual ROLLBACK here so that the + # tests pass. + do_test mallocC-$tn.$::n.2 { + catch { + execsql { + ROLLBACK; + } + } + expr 0 + } {0} + + # Checksum the database. + #do_test mallocC-$tn.$::n.3 { + # allcksum db + #} $sum + + #integrity_check mallocC-$tn.$::n.4 + if {$::nErr>1} return + } + unset ::mallocopts +} + +sqlite3_extended_result_codes db 1 + +execsql { + PRAGMA auto_vacuum=1; + CREATE TABLE t0(a, b, c); +} + +# The number of memory allocation failures is different on 64-bit +# and 32-bit systems due to larger structures on 64-bit systems +# overflowing the lookaside more often. To debug problems, it is +# sometimes helpful to reduce the size of the lookaside allocation +# blocks. But this is normally disabled. +# +if {0} { + db close + sqlite3_shutdown + sqlite3_config_lookaside 50 500 + sqlite3_initialize + autoinstall_test_functions + sqlite3 db test.db +} + +do_mallocC_test 1 -sql { + BEGIN; + -- Allocate 32 new root pages. This will exercise the 'extract specific + -- page from the freelist' code when in auto-vacuum mode (see the + -- allocatePage() routine in btree.c). + CREATE TABLE t1(a UNIQUE, b UNIQUE, c UNIQUE); + CREATE TABLE t2(a UNIQUE, b UNIQUE, c UNIQUE); + CREATE TABLE t3(a UNIQUE, b UNIQUE, c UNIQUE); + CREATE TABLE t4(a UNIQUE, b UNIQUE, c UNIQUE); + CREATE TABLE t5(a UNIQUE, b UNIQUE, c UNIQUE); + CREATE TABLE t6(a UNIQUE, b UNIQUE, c UNIQUE); + CREATE TABLE t7(a UNIQUE, b UNIQUE, c UNIQUE); + CREATE TABLE t8(a UNIQUE, b UNIQUE, c UNIQUE); + + ROLLBACK; +} + +finish_test |