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>