mirror of
				https://github.com/sqlite/sqlite.git
				synced 2025-11-03 16:53:36 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			123 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
# 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
 | 
						|
  }
 | 
						|
  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
 |