Annotation of embedaddon/sqlite3/test/mallocC.test, revision 1.1
1.1 ! misho 1: # 2007 Aug 13
! 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: #
! 12: # This file tests aspects of the malloc failure while parsing
! 13: # CREATE TABLE statements in auto_vacuum mode.
! 14: #
! 15: # $Id: mallocC.test,v 1.10 2009/04/11 16:27:50 drh Exp $
! 16:
! 17: set testdir [file dirname $argv0]
! 18: source $testdir/tester.tcl
! 19: source $testdir/malloc_common.tcl
! 20:
! 21: # Only run these tests if memory debugging is turned on.
! 22: #
! 23: if {!$MEMDEBUG} {
! 24: puts "Skipping mallocC tests: not compiled with -DSQLITE_MEMDEBUG..."
! 25: finish_test
! 26: return
! 27: }
! 28:
! 29: proc do_mallocC_test {tn args} {
! 30: array set ::mallocopts $args
! 31: #set sum [allcksum db]
! 32:
! 33: for {set ::n 1} {true} {incr ::n} {
! 34:
! 35: # Run the SQL. Malloc number $::n is set to fail. A malloc() failure
! 36: # may or may not be reported.
! 37: sqlite3_memdebug_fail $::n -repeat 1
! 38: do_test mallocC-$tn.$::n.1 {
! 39: set res [catchsql [string trim $::mallocopts(-sql)]]
! 40: set rc [expr {
! 41: 0==[string compare $res {1 {out of memory}}] ||
! 42: [db errorcode] == 3082 ||
! 43: 0==[lindex $res 0]
! 44: }]
! 45: if {$rc!=1} {
! 46: puts "Error: $res"
! 47: }
! 48: set rc
! 49: } {1}
! 50:
! 51: # If $::n is greater than the number of malloc() calls required to
! 52: # execute the SQL, then this test is finished. Break out of the loop.
! 53: set nFail [sqlite3_memdebug_fail -1]
! 54: if {$nFail==0} {
! 55: break
! 56: }
! 57:
! 58: # Recover from the malloc failure.
! 59: #
! 60: # Update: The new malloc() failure handling means that a transaction may
! 61: # still be active even if a malloc() has failed. But when these tests were
! 62: # written this was not the case. So do a manual ROLLBACK here so that the
! 63: # tests pass.
! 64: do_test mallocC-$tn.$::n.2 {
! 65: catch {
! 66: execsql {
! 67: ROLLBACK;
! 68: }
! 69: }
! 70: expr 0
! 71: } {0}
! 72:
! 73: # Checksum the database.
! 74: #do_test mallocC-$tn.$::n.3 {
! 75: # allcksum db
! 76: #} $sum
! 77:
! 78: #integrity_check mallocC-$tn.$::n.4
! 79: }
! 80: unset ::mallocopts
! 81: }
! 82:
! 83: sqlite3_extended_result_codes db 1
! 84:
! 85: execsql {
! 86: PRAGMA auto_vacuum=1;
! 87: CREATE TABLE t0(a, b, c);
! 88: }
! 89:
! 90: # The number of memory allocation failures is different on 64-bit
! 91: # and 32-bit systems due to larger structures on 64-bit systems
! 92: # overflowing the lookaside more often. To debug problems, it is
! 93: # sometimes helpful to reduce the size of the lookaside allocation
! 94: # blocks. But this is normally disabled.
! 95: #
! 96: if {0} {
! 97: db close
! 98: sqlite3_shutdown
! 99: sqlite3_config_lookaside 50 500
! 100: sqlite3_initialize
! 101: autoinstall_test_functions
! 102: sqlite3 db test.db
! 103: }
! 104:
! 105: do_mallocC_test 1 -sql {
! 106: BEGIN;
! 107: -- Allocate 32 new root pages. This will exercise the 'extract specific
! 108: -- page from the freelist' code when in auto-vacuum mode (see the
! 109: -- allocatePage() routine in btree.c).
! 110: CREATE TABLE t1(a UNIQUE, b UNIQUE, c UNIQUE);
! 111: CREATE TABLE t2(a UNIQUE, b UNIQUE, c UNIQUE);
! 112: CREATE TABLE t3(a UNIQUE, b UNIQUE, c UNIQUE);
! 113: CREATE TABLE t4(a UNIQUE, b UNIQUE, c UNIQUE);
! 114: CREATE TABLE t5(a UNIQUE, b UNIQUE, c UNIQUE);
! 115: CREATE TABLE t6(a UNIQUE, b UNIQUE, c UNIQUE);
! 116: CREATE TABLE t7(a UNIQUE, b UNIQUE, c UNIQUE);
! 117: CREATE TABLE t8(a UNIQUE, b UNIQUE, c UNIQUE);
! 118:
! 119: ROLLBACK;
! 120: }
! 121:
! 122: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>