/ Hex Artifact Content
Login

Artifact 5375a1cd53caffd56fd06410c5bddc10f6dccded:


0000: 23 20 32 30 30 35 20 4d 61 72 63 68 20 31 38 0a  # 2005 March 18.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 68  e attempts to ch
0180: 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 69 62  eck that the lib
0190: 72 61 72 79 20 63 61 6e 20 72 65 63 6f 76 65 72  rary can recover
01a0: 20 66 72 6f 6d 20 61 20 6d 61 6c 6c 6f 63 28 29   from a malloc()
01b0: 0a 23 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  .# failure when 
01c0: 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
01d0: 65 63 6f 76 65 72 28 29 20 69 73 20 69 6e 76 6f  ecover() is invo
01e0: 6b 65 64 2e 0a 23 0a 23 20 24 49 64 3a 20 6d 61  ked..#.# $Id: ma
01f0: 6c 6c 6f 63 32 2e 74 65 73 74 2c 76 20 31 2e 31  lloc2.test,v 1.1
0200: 20 32 30 30 35 2f 30 33 2f 32 31 20 30 34 3a 30   2005/03/21 04:0
0210: 34 3a 30 33 20 64 61 6e 69 65 6c 6b 31 39 37 37  4:03 danielk1977
0220: 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74   Exp $..set test
0230: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0240: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0250: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
0260: 2e 74 63 6c 0a 0a 23 20 4f 6e 6c 79 20 72 75 6e  .tcl..# Only run
0270: 20 74 68 65 73 65 20 74 65 73 74 73 20 69 66 20   these tests if 
0280: 6d 65 6d 6f 72 79 20 64 65 62 75 67 67 69 6e 67  memory debugging
0290: 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2e 0a 23   is turned on..#
02a0: 0a 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d 61  .if {[info comma
02b0: 6e 64 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  nd sqlite_malloc
02c0: 5f 73 74 61 74 5d 3d 3d 22 22 7d 20 7b 0a 20 20  _stat]==""} {.  
02d0: 70 75 74 73 20 22 53 6b 69 70 70 69 6e 67 20 6d  puts "Skipping m
02e0: 61 6c 6c 6f 63 20 74 65 73 74 73 3a 20 6e 6f 74  alloc tests: not
02f0: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d   compiled with -
0300: 44 53 51 4c 49 54 45 5f 44 45 42 55 47 2e 2e 2e  DSQLITE_DEBUG...
0310: 22 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  ".  finish_test.
0320: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 69 66 63 61    return.}..ifca
0330: 70 61 62 6c 65 20 21 67 6c 6f 62 61 6c 72 65 63  pable !globalrec
0340: 6f 76 65 72 20 7b 0a 20 20 66 69 6e 69 73 68 5f  over {.  finish_
0350: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
0360: 0a 23 20 47 65 6e 65 72 61 74 65 20 61 20 63 68  .# Generate a ch
0370: 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20  ecksum based on 
0380: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
0390: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
03a0: 20 74 68 65 0a 23 20 63 68 65 63 6b 73 75 6d 20   the.# checksum 
03b0: 6f 66 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  of two databases
03c0: 20 69 73 20 74 68 65 20 73 61 6d 65 2c 20 61 6e   is the same, an
03d0: 64 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  d the integrity-
03e0: 63 68 65 63 6b 20 70 61 73 73 65 73 0a 23 20 66  check passes.# f
03f0: 6f 72 20 62 6f 74 68 2c 20 74 68 65 20 74 77 6f  or both, the two
0400: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 69   databases are i
0410: 64 65 6e 74 69 63 61 6c 2e 0a 23 0a 70 72 6f 63  dentical..#.proc
0420: 20 63 6b 73 75 6d 20 7b 64 62 7d 20 7b 0a 20 20   cksum {db} {.  
0430: 73 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20  set ret [list]. 
0440: 20 73 65 74 20 73 71 6c 20 7b 0a 20 20 20 20 53   set sql {.    S
0450: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
0460: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
0470: 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c  ERE type = 'tabl
0480: 65 27 20 55 4e 49 4f 4e 0a 20 20 20 20 53 45 4c  e' UNION.    SEL
0490: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
04a0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
04b0: 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 74   WHERE type = 't
04c0: 61 62 6c 65 27 20 55 4e 49 4f 4e 0a 20 20 20 20  able' UNION.    
04d0: 53 45 4c 45 43 54 20 27 73 71 6c 69 74 65 5f 6d  SELECT 'sqlite_m
04e0: 61 73 74 65 72 27 20 55 4e 49 4f 4e 0a 20 20 20  aster' UNION.   
04f0: 20 53 45 4c 45 43 54 20 27 73 71 6c 69 74 65 5f   SELECT 'sqlite_
0500: 74 65 6d 70 5f 6d 61 73 74 65 72 27 0a 20 20 7d  temp_master'.  }
0510: 0a 20 20 66 6f 72 65 61 63 68 20 74 62 6c 20 5b  .  foreach tbl [
0520: 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 7b  $db eval $sql] {
0530: 0a 20 20 20 20 73 65 74 20 63 6f 6c 73 20 5b 6c  .    set cols [l
0540: 69 73 74 5d 0a 20 20 20 20 24 64 62 20 65 76 61  ist].    $db eva
0550: 6c 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  l "PRAGMA table_
0560: 69 6e 66 6f 28 24 74 62 6c 29 22 20 7b 0a 20 20  info($tbl)" {.  
0570: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6c 73      lappend cols
0580: 20 24 6e 61 6d 65 0a 20 20 20 20 7d 0a 20 20 20   $name.    }.   
0590: 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54   set sql "SELECT
05a0: 20 6d 64 35 73 75 6d 28 5b 6a 6f 69 6e 20 24 63   md5sum([join $c
05b0: 6f 6c 73 20 2c 5d 29 20 46 52 4f 4d 20 24 74 62  ols ,]) FROM $tb
05c0: 6c 22 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72  l".    lappend r
05d0: 65 74 20 5b 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e  et [db onecolumn
05e0: 20 24 73 71 6c 5d 0a 20 20 7d 0a 20 20 72 65 74   $sql].  }.  ret
05f0: 75 72 6e 20 24 72 65 74 0a 7d 0a 0a 70 72 6f 63  urn $ret.}..proc
0600: 20 64 6f 5f 6d 61 6c 6c 6f 63 32 5f 74 65 73 74   do_malloc2_test
0610: 20 7b 74 6e 20 61 72 67 73 7d 20 7b 0a 20 20 61   {tn args} {.  a
0620: 72 72 61 79 20 73 65 74 20 3a 3a 6d 61 6c 6c 6f  rray set ::mallo
0630: 63 6f 70 74 73 20 24 61 72 67 73 0a 20 20 73 65  copts $args.  se
0640: 74 20 73 75 6d 20 5b 63 6b 73 75 6d 20 64 62 5d  t sum [cksum db]
0650: 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 3a 3a 6e  ..  for {set ::n
0660: 20 31 7d 20 7b 74 72 75 65 7d 20 7b 69 6e 63 72   1} {true} {incr
0670: 20 3a 3a 6e 7d 20 7b 0a 0a 20 20 20 20 23 20 52   ::n} {..    # R
0680: 75 6e 20 74 68 65 20 53 51 4c 2e 20 4d 61 6c 6c  un the SQL. Mall
0690: 6f 63 20 6e 75 6d 62 65 72 20 24 3a 3a 6e 20 69  oc number $::n i
06a0: 73 20 73 65 74 20 74 6f 20 66 61 69 6c 2e 20 41  s set to fail. A
06b0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
06c0: 65 0a 20 20 20 20 23 20 6d 61 79 20 6f 72 20 6d  e.    # may or m
06d0: 61 79 20 6e 6f 74 20 62 65 20 72 65 70 6f 72 74  ay not be report
06e0: 65 64 2e 0a 20 20 20 20 73 71 6c 69 74 65 5f 6d  ed..    sqlite_m
06f0: 61 6c 6c 6f 63 5f 66 61 69 6c 20 24 3a 3a 6e 0a  alloc_fail $::n.
0700: 20 20 20 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c      do_test mall
0710: 6f 63 32 2d 24 74 6e 2e 24 3a 3a 6e 2e 32 20 7b  oc2-$tn.$::n.2 {
0720: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 20 5b  .      set res [
0730: 63 61 74 63 68 73 71 6c 20 24 3a 3a 6d 61 6c 6c  catchsql $::mall
0740: 6f 63 6f 70 74 73 28 2d 73 71 6c 29 5d 0a 20 20  ocopts(-sql)].  
0750: 20 20 20 20 73 65 74 20 72 63 20 5b 65 78 70 72      set rc [expr
0760: 20 7b 20 0a 20 20 20 20 20 20 20 20 30 3d 3d 5b   { .        0==[
0770: 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 24  string compare $
0780: 72 65 73 20 7b 31 20 7b 6f 75 74 20 6f 66 20 6d  res {1 {out of m
0790: 65 6d 6f 72 79 7d 7d 5d 20 7c 7c 0a 20 20 20 20  emory}}] ||.    
07a0: 20 20 20 20 30 3d 3d 5b 6c 69 6e 64 65 78 20 24      0==[lindex $
07b0: 72 65 73 20 30 5d 0a 20 20 20 20 20 20 7d 5d 0a  res 0].      }].
07c0: 20 20 20 20 20 20 69 66 20 7b 24 72 63 21 3d 31        if {$rc!=1
07d0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 70 75 74 73  } {.        puts
07e0: 20 22 45 72 72 6f 72 3a 20 24 72 65 73 22 0a 20   "Error: $res". 
07f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74       }.      set
0800: 20 72 63 0a 20 20 20 20 7d 20 7b 31 7d 0a 0a 20   rc.    } {1}.. 
0810: 20 20 20 23 20 49 66 20 24 3a 3a 6e 20 69 73 20     # If $::n is 
0820: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
0830: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f   number of mallo
0840: 63 28 29 20 63 61 6c 6c 73 20 72 65 71 75 69 72  c() calls requir
0850: 65 64 20 74 6f 0a 20 20 20 20 23 20 65 78 65 63  ed to.    # exec
0860: 75 74 65 20 74 68 65 20 53 51 4c 2c 20 74 68 65  ute the SQL, the
0870: 6e 20 74 68 69 73 20 74 65 73 74 20 69 73 20 66  n this test is f
0880: 69 6e 69 73 68 65 64 2e 20 42 72 65 61 6b 20 6f  inished. Break o
0890: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  ut of the loop..
08a0: 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20      if {[lindex 
08b0: 5b 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73  [sqlite_malloc_s
08c0: 74 61 74 5d 20 32 5d 3e 30 7d 20 7b 0a 20 20 20  tat] 2]>0} {.   
08d0: 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63     sqlite_malloc
08e0: 5f 66 61 69 6c 20 2d 31 0a 20 20 20 20 20 20 62  _fail -1.      b
08f0: 72 65 61 6b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  reak.    }..    
0900: 23 20 4e 6f 74 68 69 6e 67 20 73 68 6f 75 6c 64  # Nothing should
0910: 20 77 6f 72 6b 20 6e 6f 77 2c 20 62 65 63 61 75   work now, becau
0920: 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 6f 72  se the allocator
0930: 20 73 68 6f 75 6c 64 20 72 65 66 75 73 65 20 74   should refuse t
0940: 6f 0a 20 20 20 20 23 20 61 6c 6c 6f 63 61 74 65  o.    # allocate
0950: 20 61 6e 79 20 6d 65 6d 6f 72 79 2e 0a 20 20 20   any memory..   
0960: 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 32   do_test malloc2
0970: 2d 24 74 6e 2e 24 3a 3a 6e 2e 33 20 7b 0a 20 20  -$tn.$::n.3 {.  
0980: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45      catchsql {SE
0990: 4c 45 43 54 20 27 6e 6f 74 68 69 6e 67 20 73 68  LECT 'nothing sh
09a0: 6f 75 6c 64 20 77 6f 72 6b 27 7d 0a 20 20 20 20  ould work'}.    
09b0: 7d 20 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d  } {1 {out of mem
09c0: 6f 72 79 7d 7d 0a 0a 20 20 20 20 23 20 52 65 63  ory}}..    # Rec
09d0: 6f 76 65 72 20 66 72 6f 6d 20 74 68 65 20 6d 61  over from the ma
09e0: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 2e 0a 20 20  lloc failure..  
09f0: 20 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63    do_test malloc
0a00: 32 2d 24 74 6e 2e 24 3a 3a 6e 2e 34 20 7b 0a 20  2-$tn.$::n.4 {. 
0a10: 20 20 20 20 20 69 66 20 30 20 7b 0a 20 20 20 20       if 0 {.    
0a20: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
0a30: 20 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c 6c       sqlite_mall
0a40: 6f 63 5f 66 61 69 6c 20 2d 31 0a 20 20 20 20 20  oc_fail -1.     
0a50: 20 20 20 73 65 74 20 3a 3a 44 42 20 5b 73 71 6c     set ::DB [sql
0a60: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 5d  ite3 db test.db]
0a70: 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 75 6d  .        set dum
0a80: 6d 79 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  my SQLITE_OK.   
0a90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
0aa0: 20 20 20 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62      sqlite3_glob
0ab0: 61 6c 5f 72 65 63 6f 76 65 72 0a 20 20 20 20 20  al_recover.     
0ac0: 20 7d 0a 20 20 20 20 7d 20 7b 53 51 4c 49 54 45   }.    } {SQLITE
0ad0: 5f 4f 4b 7d 0a 0a 20 20 20 20 23 20 43 68 65 63  _OK}..    # Chec
0ae0: 6b 73 75 6d 20 74 68 65 20 64 61 74 61 62 61 73  ksum the databas
0af0: 65 2e 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 6d  e..    do_test m
0b00: 61 6c 6c 6f 63 32 2d 24 74 6e 2e 24 3a 3a 6e 2e  alloc2-$tn.$::n.
0b10: 35 20 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d 20  5 {.      cksum 
0b20: 64 62 0a 20 20 20 20 7d 20 24 73 75 6d 0a 0a 20  db.    } $sum.. 
0b30: 20 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65     integrity_che
0b40: 63 6b 20 6d 61 6c 6c 6f 63 32 2d 24 74 6e 2e 24  ck malloc2-$tn.$
0b50: 3a 3a 6e 2e 36 0a 20 20 69 66 20 7b 24 3a 3a 6e  ::n.6.  if {$::n
0b60: 45 72 72 3e 31 7d 20 72 65 74 75 72 6e 0a 20 20  Err>1} return.  
0b70: 7d 0a 20 20 75 6e 73 65 74 20 3a 3a 6d 61 6c 6c  }.  unset ::mall
0b80: 6f 63 6f 70 74 73 0a 7d 0a 0a 64 6f 5f 74 65 73  ocopts.}..do_tes
0b90: 74 20 6d 61 6c 6c 6f 63 32 2e 31 2e 73 65 74 75  t malloc2.1.setu
0ba0: 70 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  p {.  execsql {.
0bb0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0bc0: 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20   abc(a, b, c);. 
0bd0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
0be0: 62 63 20 56 41 4c 55 45 53 28 31 30 2c 20 32 30  bc VALUES(10, 20
0bf0: 2c 20 33 30 29 3b 0a 20 20 20 20 49 4e 53 45 52  , 30);.    INSER
0c00: 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45  T INTO abc VALUE
0c10: 53 28 34 30 2c 20 35 30 2c 20 36 30 29 3b 0a 20  S(40, 50, 60);. 
0c20: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
0c30: 61 62 63 5f 69 20 4f 4e 20 61 62 63 28 61 2c 20  abc_i ON abc(a, 
0c40: 62 2c 20 63 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  b, c);.  }.} {}.
0c50: 64 6f 5f 6d 61 6c 6c 6f 63 32 5f 74 65 73 74 20  do_malloc2_test 
0c60: 31 2e 31 20 2d 73 71 6c 20 7b 0a 20 20 53 45 4c  1.1 -sql {.  SEL
0c70: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a  ECT * FROM abc;.
0c80: 7d 0a 64 6f 5f 6d 61 6c 6c 6f 63 32 5f 74 65 73  }.do_malloc2_tes
0c90: 74 20 31 2e 32 20 2d 73 71 6c 20 7b 0a 20 20 55  t 1.2 -sql {.  U
0ca0: 50 44 41 54 45 20 61 62 63 20 53 45 54 20 63 20  PDATE abc SET c 
0cb0: 3d 20 63 2b 31 30 3b 0a 7d 0a 64 6f 5f 6d 61 6c  = c+10;.}.do_mal
0cc0: 6c 6f 63 32 5f 74 65 73 74 20 31 2e 33 20 2d 73  loc2_test 1.3 -s
0cd0: 71 6c 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e  ql {.  INSERT IN
0ce0: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 37 30  TO abc VALUES(70
0cf0: 2c 20 38 30 2c 20 39 30 29 3b 0a 7d 0a 64 6f 5f  , 80, 90);.}.do_
0d00: 6d 61 6c 6c 6f 63 32 5f 74 65 73 74 20 31 2e 34  malloc2_test 1.4
0d10: 20 2d 73 71 6c 20 7b 0a 20 20 44 45 4c 45 54 45   -sql {.  DELETE
0d20: 20 46 52 4f 4d 20 61 62 63 3b 0a 7d 0a 64 6f 5f   FROM abc;.}.do_
0d30: 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2e 31 2e 35  test malloc2.1.5
0d40: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0d50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0d60: 20 61 62 63 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a   abc;.  }.} {}..
0d70: 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2e  do_test malloc2.
0d80: 32 2e 73 65 74 75 70 20 7b 0a 20 20 65 78 65 63  2.setup {.  exec
0d90: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
0da0: 20 54 41 42 4c 45 20 64 65 66 28 61 2c 20 62 2c   TABLE def(a, b,
0db0: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   c);.    CREATE 
0dc0: 49 4e 44 45 58 20 64 65 66 5f 69 31 20 4f 4e 20  INDEX def_i1 ON 
0dd0: 64 65 66 28 61 29 3b 0a 20 20 20 20 43 52 45 41  def(a);.    CREA
0de0: 54 45 20 49 4e 44 45 58 20 64 65 66 5f 69 32 20  TE INDEX def_i2 
0df0: 4f 4e 20 64 65 66 28 63 29 3b 0a 20 20 20 20 42  ON def(c);.    B
0e00: 45 47 49 4e 3b 0a 20 20 7d 0a 20 20 66 6f 72 20  EGIN;.  }.  for 
0e10: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 32 30  {set i 0} {$i<20
0e20: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
0e30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
0e40: 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56  NSERT INTO def V
0e50: 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28 33 30  ALUES(randstr(30
0e60: 30 2c 33 30 30 29 2c 72 61 6e 64 73 74 72 28 33  0,300),randstr(3
0e70: 30 30 2c 33 30 30 29 2c 72 61 6e 64 73 74 72 28  00,300),randstr(
0e80: 33 30 30 2c 33 30 30 29 29 3b 0a 20 20 20 20 7d  300,300));.    }
0e90: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
0ea0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
0eb0: 0a 7d 20 7b 7d 0a 64 6f 5f 6d 61 6c 6c 6f 63 32  .} {}.do_malloc2
0ec0: 5f 74 65 73 74 20 32 20 2d 73 71 6c 20 7b 0a 20  _test 2 -sql {. 
0ed0: 20 42 45 47 49 4e 3b 0a 20 20 55 50 44 41 54 45   BEGIN;.  UPDATE
0ee0: 20 64 65 66 20 53 45 54 20 61 20 3d 20 72 61 6e   def SET a = ran
0ef0: 64 73 74 72 28 31 30 30 2c 31 30 30 29 20 57 48  dstr(100,100) WH
0f00: 45 52 45 20 28 6f 69 64 25 39 29 3d 3d 30 3b 0a  ERE (oid%9)==0;.
0f10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65    INSERT INTO de
0f20: 66 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  f SELECT * FROM 
0f30: 64 65 66 20 57 48 45 52 45 20 28 6f 69 64 25 31  def WHERE (oid%1
0f40: 33 29 3d 3d 30 3b 0a 0a 20 20 43 52 45 41 54 45  3)==0;..  CREATE
0f50: 20 49 4e 44 45 58 20 64 65 66 5f 69 33 20 4f 4e   INDEX def_i3 ON
0f60: 20 64 65 66 28 62 29 3b 0a 0a 20 20 55 50 44 41   def(b);..  UPDA
0f70: 54 45 20 64 65 66 20 53 45 54 20 61 20 3d 20 72  TE def SET a = r
0f80: 61 6e 64 73 74 72 28 31 30 30 2c 31 30 30 29 20  andstr(100,100) 
0f90: 57 48 45 52 45 20 28 6f 69 64 25 39 29 3d 3d 31  WHERE (oid%9)==1
0fa0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0fb0: 64 65 66 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  def SELECT * FRO
0fc0: 4d 20 64 65 66 20 57 48 45 52 45 20 28 6f 69 64  M def WHERE (oid
0fd0: 25 31 33 29 3d 3d 31 3b 0a 0a 20 20 43 52 45 41  %13)==1;..  CREA
0fe0: 54 45 20 54 41 42 4c 45 20 64 65 66 32 20 41 53  TE TABLE def2 AS
0ff0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64   SELECT * FROM d
1000: 65 66 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  ef;.  DROP TABLE
1010: 20 64 65 66 3b 0a 20 20 43 52 45 41 54 45 20 54   def;.  CREATE T
1020: 41 42 4c 45 20 64 65 66 20 41 53 20 53 45 4c 45  ABLE def AS SELE
1030: 43 54 20 2a 20 46 52 4f 4d 20 64 65 66 32 3b 0a  CT * FROM def2;.
1040: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 64 65 66    DROP TABLE def
1050: 32 3b 0a 0a 20 20 44 45 4c 45 54 45 20 46 52 4f  2;..  DELETE FRO
1060: 4d 20 64 65 66 20 57 48 45 52 45 20 28 6f 69 64  M def WHERE (oid
1070: 25 39 29 3d 3d 32 3b 0a 20 20 49 4e 53 45 52 54  %9)==2;.  INSERT
1080: 20 49 4e 54 4f 20 64 65 66 20 53 45 4c 45 43 54   INTO def SELECT
1090: 20 2a 20 46 52 4f 4d 20 64 65 66 20 57 48 45 52   * FROM def WHER
10a0: 45 20 28 6f 69 64 25 31 33 29 3d 3d 32 3b 0a 20  E (oid%13)==2;. 
10b0: 20 43 4f 4d 4d 49 54 3b 0a 7d 0a 0a 64 6f 5f 74   COMMIT;.}..do_t
10c0: 65 73 74 20 6d 61 6c 6c 6f 63 32 2e 33 2e 73 65  est malloc2.3.se
10d0: 74 75 70 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  tup {.  execsql 
10e0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  {.    CREATE TEM
10f0: 50 20 54 41 42 4c 45 20 67 68 69 28 61 2c 20 62  P TABLE ghi(a, b
1100: 2c 20 63 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  , c);.    BEGIN;
1110: 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  .  }.  for {set 
1120: 69 20 30 7d 20 7b 24 69 3c 32 30 7d 20 7b 69 6e  i 0} {$i<20} {in
1130: 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63  cr i} {.    exec
1140: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
1150: 20 49 4e 54 4f 20 67 68 69 20 56 41 4c 55 45 53   INTO ghi VALUES
1160: 28 72 61 6e 64 73 74 72 28 33 30 30 2c 33 30 30  (randstr(300,300
1170: 29 2c 72 61 6e 64 73 74 72 28 33 30 30 2c 33 30  ),randstr(300,30
1180: 30 29 2c 72 61 6e 64 73 74 72 28 33 30 30 2c 33  0),randstr(300,3
1190: 30 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  00));.    }.  }.
11a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
11b0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d  COMMIT;.  }.} {}
11c0: 0a 64 6f 5f 6d 61 6c 6c 6f 63 32 5f 74 65 73 74  .do_malloc2_test
11d0: 20 33 20 2d 73 71 6c 20 7b 0a 20 20 42 45 47 49   3 -sql {.  BEGI
11e0: 4e 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  N;.  CREATE INDE
11f0: 58 20 67 68 69 5f 69 31 20 4f 4e 20 67 68 69 28  X ghi_i1 ON ghi(
1200: 61 29 3b 0a 20 20 55 50 44 41 54 45 20 64 65 66  a);.  UPDATE def
1210: 20 53 45 54 20 61 20 3d 20 72 61 6e 64 73 74 72   SET a = randstr
1220: 28 31 30 30 2c 31 30 30 29 20 57 48 45 52 45 20  (100,100) WHERE 
1230: 28 6f 69 64 25 32 29 3d 3d 30 3b 0a 20 20 55 50  (oid%2)==0;.  UP
1240: 44 41 54 45 20 67 68 69 20 53 45 54 20 61 20 3d  DATE ghi SET a =
1250: 20 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30 30   randstr(100,100
1260: 29 20 57 48 45 52 45 20 28 6f 69 64 25 32 29 3d  ) WHERE (oid%2)=
1270: 3d 30 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 7d 0a  =0;.  COMMIT;.}.
1280: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
1290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20  #############.# 
12d0: 54 68 65 20 74 65 73 74 20 63 61 73 65 73 20 62  The test cases b
12e0: 65 6c 6f 77 20 61 72 65 20 74 6f 20 69 6e 63 72  elow are to incr
12f0: 65 61 73 65 20 74 68 65 20 63 6f 64 65 20 63 6f  ease the code co
1300: 76 65 72 61 67 65 20 69 6e 20 62 74 72 65 65 2e  verage in btree.
1310: 63 20 61 6e 64 20 0a 23 20 70 61 67 65 72 2e 63  c and .# pager.c
1320: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 69   of this test fi
1330: 6c 65 2e 20 54 68 65 20 69 64 65 61 20 69 73 20  le. The idea is 
1340: 74 68 61 74 20 65 61 63 68 20 6d 61 6c 6c 6f 63  that each malloc
1350: 28 29 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  () that occurs i
1360: 6e 0a 23 20 74 68 65 73 65 20 74 77 6f 20 73 6f  n.# these two so
1370: 75 72 63 65 20 66 69 6c 65 73 20 73 68 6f 75 6c  urce files shoul
1380: 64 20 62 65 20 6d 61 64 65 20 74 6f 20 66 61 69  d be made to fai
1390: 6c 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  l at least once.
13a0: 0a 23 0a 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .#.catchsql {.  
13b0: 44 52 4f 50 20 54 41 42 4c 45 20 67 68 69 3b 0a  DROP TABLE ghi;.
13c0: 7d 0a 64 6f 5f 6d 61 6c 6c 6f 63 32 5f 74 65 73  }.do_malloc2_tes
13d0: 74 20 34 2e 31 20 2d 73 71 6c 20 7b 0a 20 20 53  t 4.1 -sql {.  S
13e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66  ELECT * FROM def
13f0: 20 4f 52 44 45 52 20 42 59 20 6f 69 64 20 41 53   ORDER BY oid AS
1400: 43 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  C;.  SELECT * FR
1410: 4f 4d 20 64 65 66 20 4f 52 44 45 52 20 42 59 20  OM def ORDER BY 
1420: 6f 69 64 20 44 45 53 43 3b 0a 7d 0a 64 6f 5f 6d  oid DESC;.}.do_m
1430: 61 6c 6c 6f 63 32 5f 74 65 73 74 20 34 2e 32 20  alloc2_test 4.2 
1440: 2d 73 71 6c 20 7b 0a 20 20 50 52 41 47 4d 41 20  -sql {.  PRAGMA 
1450: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
1460: 0a 20 20 42 45 47 49 4e 3b 0a 0a 20 20 2d 2d 20  .  BEGIN;..  -- 
1470: 54 68 69 73 20 77 69 6c 6c 20 70 75 74 20 61 62  This will put ab
1480: 6f 75 74 20 32 35 20 70 61 67 65 73 20 6f 6e 20  out 25 pages on 
1490: 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
14a0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 64 65 66   DELETE FROM def
14b0: 20 57 48 45 52 45 20 31 3b 0a 0a 20 20 2d 2d 20   WHERE 1;..  -- 
14c0: 41 6c 6c 6f 63 61 74 65 20 33 32 20 6e 65 77 20  Allocate 32 new 
14d0: 72 6f 6f 74 20 70 61 67 65 73 2e 20 54 68 69 73  root pages. This
14e0: 20 77 69 6c 6c 20 65 78 65 72 63 69 73 65 20 74   will exercise t
14f0: 68 65 20 27 65 78 74 72 61 63 74 20 73 70 65 63  he 'extract spec
1500: 69 66 69 63 20 0a 20 20 2d 2d 20 70 61 67 65 20  ific .  -- page 
1510: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
1520: 74 27 20 63 6f 64 65 20 77 68 65 6e 20 69 6e 20  t' code when in 
1530: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
1540: 20 28 73 65 65 20 74 68 65 0a 20 20 2d 2d 20 61   (see the.  -- a
1550: 6c 6c 6f 63 61 74 65 50 61 67 65 28 29 20 72 6f  llocatePage() ro
1560: 75 74 69 6e 65 20 69 6e 20 62 74 72 65 65 2e 63  utine in btree.c
1570: 29 2e 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  )..  CREATE TABL
1580: 45 20 74 31 28 61 20 55 4e 49 51 55 45 2c 20 62  E t1(a UNIQUE, b
1590: 20 55 4e 49 51 55 45 2c 20 63 20 55 4e 49 51 55   UNIQUE, c UNIQU
15a0: 45 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  E);.  CREATE TAB
15b0: 4c 45 20 74 32 28 61 20 55 4e 49 51 55 45 2c 20  LE t2(a UNIQUE, 
15c0: 62 20 55 4e 49 51 55 45 2c 20 63 20 55 4e 49 51  b UNIQUE, c UNIQ
15d0: 55 45 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41  UE);.  CREATE TA
15e0: 42 4c 45 20 74 33 28 61 20 55 4e 49 51 55 45 2c  BLE t3(a UNIQUE,
15f0: 20 62 20 55 4e 49 51 55 45 2c 20 63 20 55 4e 49   b UNIQUE, c UNI
1600: 51 55 45 29 3b 0a 20 20 43 52 45 41 54 45 20 54  QUE);.  CREATE T
1610: 41 42 4c 45 20 74 34 28 61 20 55 4e 49 51 55 45  ABLE t4(a UNIQUE
1620: 2c 20 62 20 55 4e 49 51 55 45 2c 20 63 20 55 4e  , b UNIQUE, c UN
1630: 49 51 55 45 29 3b 0a 20 20 43 52 45 41 54 45 20  IQUE);.  CREATE 
1640: 54 41 42 4c 45 20 74 35 28 61 20 55 4e 49 51 55  TABLE t5(a UNIQU
1650: 45 2c 20 62 20 55 4e 49 51 55 45 2c 20 63 20 55  E, b UNIQUE, c U
1660: 4e 49 51 55 45 29 3b 0a 20 20 43 52 45 41 54 45  NIQUE);.  CREATE
1670: 20 54 41 42 4c 45 20 74 36 28 61 20 55 4e 49 51   TABLE t6(a UNIQ
1680: 55 45 2c 20 62 20 55 4e 49 51 55 45 2c 20 63 20  UE, b UNIQUE, c 
1690: 55 4e 49 51 55 45 29 3b 0a 20 20 43 52 45 41 54  UNIQUE);.  CREAT
16a0: 45 20 54 41 42 4c 45 20 74 37 28 61 20 55 4e 49  E TABLE t7(a UNI
16b0: 51 55 45 2c 20 62 20 55 4e 49 51 55 45 2c 20 63  QUE, b UNIQUE, c
16c0: 20 55 4e 49 51 55 45 29 3b 0a 20 20 43 52 45 41   UNIQUE);.  CREA
16d0: 54 45 20 54 41 42 4c 45 20 74 38 28 61 20 55 4e  TE TABLE t8(a UN
16e0: 49 51 55 45 2c 20 62 20 55 4e 49 51 55 45 2c 20  IQUE, b UNIQUE, 
16f0: 63 20 55 4e 49 51 55 45 29 3b 0a 0a 20 20 52 4f  c UNIQUE);..  RO
1700: 4c 4c 42 41 43 4b 3b 0a 7d 0a 0a 23 23 23 23 23  LLBACK;.}..#####
1710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1740: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1750: 23 23 23 0a 23 20 54 65 73 74 20 74 68 61 74 20  ###.# Test that 
1760: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 6e 6b 65  the global linke
1770: 64 20 6c 69 73 74 20 6f 66 20 64 61 74 61 62 61  d list of databa
1780: 73 65 20 68 61 6e 64 6c 65 73 20 77 6f 72 6b 73  se handles works
1790: 2e 20 41 6e 20 61 73 73 65 72 74 28 29 0a 23 20  . An assert().# 
17a0: 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 74 68 65  will fail if the
17b0: 72 65 20 69 73 20 73 6f 6d 65 20 70 72 6f 62 6c  re is some probl
17c0: 65 6d 2e 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c  em..do_test mall
17d0: 6f 63 32 2d 35 20 7b 0a 20 20 73 71 6c 69 74 65  oc2-5 {.  sqlite
17e0: 33 20 64 62 31 20 74 65 73 74 2e 64 62 0a 20 20  3 db1 test.db.  
17f0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
1800: 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62  .db.  sqlite3 db
1810: 33 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69  3 test.db.  sqli
1820: 74 65 33 20 64 62 34 20 74 65 73 74 2e 64 62 0a  te3 db4 test.db.
1830: 20 20 73 71 6c 69 74 65 33 20 64 62 35 20 74 65    sqlite3 db5 te
1840: 73 74 2e 64 62 0a 0a 20 20 23 20 43 6c 6f 73 65  st.db..  # Close
1850: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
1860: 20 6c 69 73 74 3a 0a 20 20 64 62 35 20 63 6c 6f   list:.  db5 clo
1870: 73 65 0a 20 20 0a 20 20 23 20 43 6c 6f 73 65 20  se.  .  # Close 
1880: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
1890: 69 73 74 3a 0a 20 20 64 62 31 20 63 6c 6f 73 65  ist:.  db1 close
18a0: 0a 0a 20 20 23 20 43 6c 6f 73 65 20 61 20 68 61  ..  # Close a ha
18b0: 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 69  ndle from the mi
18c0: 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 69 73 74  ddle of the list
18d0: 3a 0a 20 20 64 62 33 20 63 6c 6f 73 65 0a 0a 20  :.  db3 close.. 
18e0: 20 23 20 43 6c 6f 73 65 20 74 68 65 20 6f 74 68   # Close the oth
18f0: 65 72 20 74 77 6f 2e 20 54 68 65 6e 20 6f 70 65  er two. Then ope
1900: 6e 20 61 6e 64 20 63 6c 6f 73 65 20 6f 6e 65 20  n and close one 
1910: 6d 6f 72 65 20 64 61 74 61 62 61 73 65 2c 20 74  more database, t
1920: 6f 20 6d 61 6b 65 0a 20 20 23 20 73 75 72 65 20  o make.  # sure 
1930: 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20  the head of the 
1940: 6c 69 73 74 20 77 61 73 20 73 65 74 20 62 61 63  list was set bac
1950: 6b 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 64 62 32  k to NULL..  db2
1960: 20 63 6c 6f 73 65 0a 20 20 64 62 34 20 63 6c 6f   close.  db4 clo
1970: 73 65 0a 20 20 73 71 6c 69 74 65 20 64 62 31 20  se.  sqlite db1 
1980: 74 65 73 74 2e 64 62 0a 20 20 64 62 31 20 63 6c  test.db.  db1 cl
1990: 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 23 23 23 23 23  ose.} {}..######
19a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19e0: 23 23 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20  ##.# Check that 
19f0: 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 69  if a statement i
1a00: 73 20 61 63 74 69 76 65 20 73 71 6c 69 74 65 33  s active sqlite3
1a10: 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 20  _global_recover 
1a20: 64 6f 65 73 6e 27 74 20 72 65 73 65 74 0a 23 20  doesn't reset.# 
1a30: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  the sqlite3_mall
1a40: 6f 63 5f 66 61 69 6c 65 64 20 76 61 72 69 61 62  oc_failed variab
1a50: 6c 65 2e 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c  le..do_test mall
1a60: 6f 63 32 2d 36 2e 31 20 7b 0a 20 20 73 65 74 20  oc2-6.1 {.  set 
1a70: 3a 3a 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  ::STMT [sqlite3_
1a80: 70 72 65 70 61 72 65 20 24 3a 3a 44 42 20 7b 53  prepare $::DB {S
1a90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66  ELECT * FROM def
1aa0: 7d 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 73 71  } -1 DUMMY].  sq
1ab0: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
1ac0: 4d 54 0a 7d 20 7b 53 51 4c 49 54 45 5f 52 4f 57  MT.} {SQLITE_ROW
1ad0: 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  }.do_test malloc
1ae0: 32 2d 36 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  2-6.2 {.  sqlite
1af0: 33 20 64 62 31 20 74 65 73 74 2e 64 62 0a 20 20  3 db1 test.db.  
1b00: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
1b10: 69 6c 20 31 30 30 0a 20 20 63 61 74 63 68 73 71  il 100.  catchsq
1b20: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
1b30: 20 46 52 4f 4d 20 64 65 66 3b 0a 20 20 7d 20 64   FROM def;.  } d
1b40: 62 31 0a 7d 20 7b 31 20 7b 6f 75 74 20 6f 66 20  b1.} {1 {out of 
1b50: 6d 65 6d 6f 72 79 7d 7d 0a 64 6f 5f 74 65 73 74  memory}}.do_test
1b60: 20 6d 61 6c 6c 6f 63 32 2d 36 2e 33 20 7b 0a 20   malloc2-6.3 {. 
1b70: 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
1b80: 72 65 63 6f 76 65 72 0a 7d 20 7b 53 51 4c 49 54  recover.} {SQLIT
1b90: 45 5f 42 55 53 59 7d 0a 64 6f 5f 74 65 73 74 20  E_BUSY}.do_test 
1ba0: 6d 61 6c 6c 6f 63 32 2d 36 2e 34 20 7b 0a 20 20  malloc2-6.4 {.  
1bb0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
1bc0: 45 4c 45 43 54 20 27 68 65 6c 6c 6f 27 3b 0a 20  ELECT 'hello';. 
1bd0: 20 7d 0a 7d 20 7b 31 20 7b 6f 75 74 20 6f 66 20   }.} {1 {out of 
1be0: 6d 65 6d 6f 72 79 7d 7d 0a 64 6f 5f 74 65 73 74  memory}}.do_test
1bf0: 20 6d 61 6c 6c 6f 63 32 2d 36 2e 35 20 7b 0a 20   malloc2-6.5 {. 
1c00: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 24   sqlite3_reset $
1c10: 3a 3a 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54 45  ::STMT.} {SQLITE
1c20: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c  _OK}.do_test mal
1c30: 6c 6f 63 32 2d 36 2e 36 20 7b 0a 20 20 73 71 6c  loc2-6.6 {.  sql
1c40: 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
1c50: 76 65 72 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b  ver.} {SQLITE_OK
1c60: 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  }.do_test malloc
1c70: 32 2d 36 2e 37 20 7b 0a 20 20 63 61 74 63 68 73  2-6.7 {.  catchs
1c80: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1c90: 27 68 65 6c 6c 6f 27 3b 0a 20 20 7d 0a 7d 20 7b  'hello';.  }.} {
1ca0: 30 20 68 65 6c 6c 6f 7d 0a 64 6f 5f 74 65 73 74  0 hello}.do_test
1cb0: 20 6d 61 6c 6c 6f 63 32 2d 36 2e 38 20 7b 0a 20   malloc2-6.8 {. 
1cc0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a   sqlite3_step $:
1cd0: 3a 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54 45 5f  :STMT.} {SQLITE_
1ce0: 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 6d  ERROR}.do_test m
1cf0: 61 6c 6c 6f 63 32 2d 36 2e 39 20 7b 0a 20 20 73  alloc2-6.9 {.  s
1d00: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
1d10: 24 3a 3a 53 54 4d 54 0a 7d 20 7b 53 51 4c 49 54  $::STMT.} {SQLIT
1d20: 45 5f 53 43 48 45 4d 41 7d 0a 64 6f 5f 74 65 73  E_SCHEMA}.do_tes
1d30: 74 20 6d 61 6c 6c 6f 63 32 2d 36 2e 31 30 20 7b  t malloc2-6.10 {
1d40: 0a 20 20 64 62 31 20 63 6c 6f 73 65 0a 7d 20 7b  .  db1 close.} {
1d50: 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  }..#############
1d60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d90: 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43 68  ###########.# Ch
1da0: 65 63 6b 20 74 68 61 74 20 69 66 20 61 6e 20 69  eck that if an i
1db0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1dc0: 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  e is being used 
1dd0: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
1de0: 6c 65 0a 23 20 74 6f 20 72 65 63 6f 76 65 72 20  le.# to recover 
1df0: 66 72 6f 6d 20 61 20 6d 61 6c 6c 6f 63 28 29 20  from a malloc() 
1e00: 66 61 69 6c 75 72 65 2e 0a 69 66 63 61 70 61 62  failure..ifcapab
1e10: 6c 65 20 6d 65 6d 6f 72 79 64 62 20 7b 0a 20 20  le memorydb {.  
1e20: 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2d  do_test malloc2-
1e30: 37 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  7.1 {.    sqlite
1e40: 33 20 64 62 31 20 3a 6d 65 6d 6f 72 79 3a 0a 20  3 db1 :memory:. 
1e50: 20 20 20 6c 69 73 74 0a 20 20 7d 20 7b 7d 0a 20     list.  } {}. 
1e60: 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 32   do_test malloc2
1e70: 2d 37 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74  -7.2 {.    sqlit
1e80: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20 31 30  e_malloc_fail 10
1e90: 30 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  0.    catchsql {
1ea0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
1eb0: 46 52 4f 4d 20 64 65 66 3b 0a 20 20 20 20 7d 20  FROM def;.    } 
1ec0: 0a 20 20 7d 20 7b 31 20 7b 6f 75 74 20 6f 66 20  .  } {1 {out of 
1ed0: 6d 65 6d 6f 72 79 7d 7d 0a 20 20 64 6f 5f 74 65  memory}}.  do_te
1ee0: 73 74 20 6d 61 6c 6c 6f 63 32 2d 37 2e 33 20 7b  st malloc2-7.3 {
1ef0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .    sqlite3_glo
1f00: 62 61 6c 5f 72 65 63 6f 76 65 72 0a 20 20 7d 20  bal_recover.  } 
1f10: 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 20  {SQLITE_ERROR}. 
1f20: 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 32   do_test malloc2
1f30: 2d 37 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68  -7.4 {.    catch
1f40: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
1f50: 43 54 20 27 68 65 6c 6c 6f 27 3b 0a 20 20 20 20  CT 'hello';.    
1f60: 7d 0a 20 20 7d 20 7b 31 20 7b 6f 75 74 20 6f 66  }.  } {1 {out of
1f70: 20 6d 65 6d 6f 72 79 7d 7d 0a 20 20 64 6f 5f 74   memory}}.  do_t
1f80: 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 37 2e 35 20  est malloc2-7.5 
1f90: 7b 0a 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a  {.    db1 close.
1fa0: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
1fb0: 20 6d 61 6c 6c 6f 63 32 2d 37 2e 36 20 7b 0a 20   malloc2-7.6 {. 
1fc0: 20 20 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61     sqlite3_globa
1fd0: 6c 5f 72 65 63 6f 76 65 72 0a 20 20 7d 20 7b 53  l_recover.  } {S
1fe0: 51 4c 49 54 45 5f 4f 4b 7d 0a 20 20 64 6f 5f 74  QLITE_OK}.  do_t
1ff0: 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 37 2e 37 20  est malloc2-7.7 
2000: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
2010: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 68  .      SELECT 'h
2020: 65 6c 6c 6f 27 3b 0a 20 20 20 20 7d 0a 20 20 7d  ello';.    }.  }
2030: 20 7b 30 20 68 65 6c 6c 6f 7d 0a 7d 0a 0a 66 69   {0 hello}.}..fi
2040: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.