/ Hex Artifact Content
Login

Artifact 655b972372d2754a3f6c6ed54d7cfd18fde9bd32:


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 33  lloc2.test,v 1.3
0200: 20 32 30 30 35 2f 30 36 2f 30 36 20 31 34 3a 34   2005/06/06 14:4
0210: 35 3a 34 33 20 64 72 68 20 45 78 70 20 24 0a 0a  5:43 drh Exp $..
0220: 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c  set testdir [fil
0230: 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30  e dirname $argv0
0240: 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  ].source $testdi
0250: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20  r/tester.tcl..# 
0260: 4f 6e 6c 79 20 72 75 6e 20 74 68 65 73 65 20 74  Only run these t
0270: 65 73 74 73 20 69 66 20 6d 65 6d 6f 72 79 20 64  ests if memory d
0280: 65 62 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e  ebugging is turn
0290: 65 64 20 6f 6e 2e 0a 23 0a 69 66 20 7b 5b 69 6e  ed on..#.if {[in
02a0: 66 6f 20 63 6f 6d 6d 61 6e 64 20 73 71 6c 69 74  fo command sqlit
02b0: 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 5d 3d 3d  e_malloc_stat]==
02c0: 22 22 7d 20 7b 0a 20 20 70 75 74 73 20 22 53 6b  ""} {.  puts "Sk
02d0: 69 70 70 69 6e 67 20 6d 61 6c 6c 6f 63 20 74 65  ipping malloc te
02e0: 73 74 73 3a 20 6e 6f 74 20 63 6f 6d 70 69 6c 65  sts: not compile
02f0: 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f  d with -DSQLITE_
0300: 44 45 42 55 47 2e 2e 2e 22 0a 20 20 66 69 6e 69  DEBUG...".  fini
0310: 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e  sh_test.  return
0320: 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 67  .}..ifcapable !g
0330: 6c 6f 62 61 6c 72 65 63 6f 76 65 72 20 7b 0a 20  lobalrecover {. 
0340: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
0350: 65 74 75 72 6e 0a 7d 0a 0a 23 20 47 65 6e 65 72  eturn.}..# Gener
0360: 61 74 65 20 61 20 63 68 65 63 6b 73 75 6d 20 62  ate a checksum b
0370: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
0380: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
0390: 62 61 73 65 2e 20 49 66 20 74 68 65 0a 23 20 63  base. If the.# c
03a0: 68 65 63 6b 73 75 6d 20 6f 66 20 74 77 6f 20 64  hecksum of two d
03b0: 61 74 61 62 61 73 65 73 20 69 73 20 74 68 65 20  atabases is the 
03c0: 73 61 6d 65 2c 20 61 6e 64 20 74 68 65 20 69 6e  same, and the in
03d0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 70 61  tegrity-check pa
03e0: 73 73 65 73 0a 23 20 66 6f 72 20 62 6f 74 68 2c  sses.# for both,
03f0: 20 74 68 65 20 74 77 6f 20 64 61 74 61 62 61 73   the two databas
0400: 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
0410: 2e 0a 23 0a 70 72 6f 63 20 63 6b 73 75 6d 20 7b  ..#.proc cksum {
0420: 64 62 7d 20 7b 0a 20 20 73 65 74 20 72 65 74 20  db} {.  set ret 
0430: 5b 6c 69 73 74 5d 0a 20 20 69 66 63 61 70 61 62  [list].  ifcapab
0440: 6c 65 20 74 65 6d 70 64 62 20 7b 0a 20 20 20 20  le tempdb {.    
0450: 73 65 74 20 73 71 6c 20 7b 0a 20 20 20 20 20 20  set sql {.      
0460: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
0470: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
0480: 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
0490: 6c 65 27 20 55 4e 49 4f 4e 0a 20 20 20 20 20 20  le' UNION.      
04a0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
04b0: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
04c0: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d  ter WHERE type =
04d0: 20 27 74 61 62 6c 65 27 20 55 4e 49 4f 4e 0a 20   'table' UNION. 
04e0: 20 20 20 20 20 53 45 4c 45 43 54 20 27 73 71 6c       SELECT 'sql
04f0: 69 74 65 5f 6d 61 73 74 65 72 27 20 55 4e 49 4f  ite_master' UNIO
0500: 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27  N.      SELECT '
0510: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
0520: 65 72 27 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  er'.    }.  } el
0530: 73 65 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c  se {.    set sql
0540: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
0550: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
0560: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79  _master WHERE ty
0570: 70 65 20 3d 20 27 74 61 62 6c 65 27 20 55 4e 49  pe = 'table' UNI
0580: 4f 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  ON.      SELECT 
0590: 27 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 0a  'sqlite_master'.
05a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20      }.  }.  set 
05b0: 74 62 6c 6c 69 73 74 20 5b 24 64 62 20 65 76 61  tbllist [$db eva
05c0: 6c 20 24 73 71 6c 5d 0a 20 20 73 65 74 20 74 78  l $sql].  set tx
05d0: 74 20 7b 7d 0a 20 20 66 6f 72 65 61 63 68 20 74  t {}.  foreach t
05e0: 62 6c 20 24 74 62 6c 6c 69 73 74 20 7b 0a 20 20  bl $tbllist {.  
05f0: 20 20 61 70 70 65 6e 64 20 74 78 74 20 5b 24 64    append txt [$d
0600: 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 2a  b eval "SELECT *
0610: 20 46 52 4f 4d 20 24 74 62 6c 22 5d 0a 20 20 7d   FROM $tbl"].  }
0620: 0a 20 20 23 20 70 75 74 73 20 74 78 74 3d 24 74  .  # puts txt=$t
0630: 78 74 0a 20 20 72 65 74 75 72 6e 20 5b 6d 64 35  xt.  return [md5
0640: 20 24 74 78 74 5d 0a 7d 0a 0a 70 72 6f 63 20 64   $txt].}..proc d
0650: 6f 5f 6d 61 6c 6c 6f 63 32 5f 74 65 73 74 20 7b  o_malloc2_test {
0660: 74 6e 20 61 72 67 73 7d 20 7b 0a 20 20 61 72 72  tn args} {.  arr
0670: 61 79 20 73 65 74 20 3a 3a 6d 61 6c 6c 6f 63 6f  ay set ::malloco
0680: 70 74 73 20 24 61 72 67 73 0a 20 20 73 65 74 20  pts $args.  set 
0690: 73 75 6d 20 5b 63 6b 73 75 6d 20 64 62 5d 0a 0a  sum [cksum db]..
06a0: 20 20 66 6f 72 20 7b 73 65 74 20 3a 3a 6e 20 31    for {set ::n 1
06b0: 7d 20 7b 74 72 75 65 7d 20 7b 69 6e 63 72 20 3a  } {true} {incr :
06c0: 3a 6e 7d 20 7b 0a 0a 20 20 20 20 23 20 52 75 6e  :n} {..    # Run
06d0: 20 74 68 65 20 53 51 4c 2e 20 4d 61 6c 6c 6f 63   the SQL. Malloc
06e0: 20 6e 75 6d 62 65 72 20 24 3a 3a 6e 20 69 73 20   number $::n is 
06f0: 73 65 74 20 74 6f 20 66 61 69 6c 2e 20 41 20 6d  set to fail. A m
0700: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 0a  alloc() failure.
0710: 20 20 20 20 23 20 6d 61 79 20 6f 72 20 6d 61 79      # may or may
0720: 20 6e 6f 74 20 62 65 20 72 65 70 6f 72 74 65 64   not be reported
0730: 2e 0a 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c  ..    sqlite_mal
0740: 6c 6f 63 5f 66 61 69 6c 20 24 3a 3a 6e 0a 20 20  loc_fail $::n.  
0750: 20 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63    do_test malloc
0760: 32 2d 24 74 6e 2e 24 3a 3a 6e 2e 32 20 7b 0a 20  2-$tn.$::n.2 {. 
0770: 20 20 20 20 20 73 65 74 20 72 65 73 20 5b 63 61       set res [ca
0780: 74 63 68 73 71 6c 20 5b 73 74 72 69 6e 67 20 74  tchsql [string t
0790: 72 69 6d 20 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74  rim $::mallocopt
07a0: 73 28 2d 73 71 6c 29 5d 5d 0a 20 20 20 20 20 20  s(-sql)]].      
07b0: 73 65 74 20 72 63 20 5b 65 78 70 72 20 7b 20 0a  set rc [expr { .
07c0: 20 20 20 20 20 20 20 20 30 3d 3d 5b 73 74 72 69          0==[stri
07d0: 6e 67 20 63 6f 6d 70 61 72 65 20 24 72 65 73 20  ng compare $res 
07e0: 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  {1 {out of memor
07f0: 79 7d 7d 5d 20 7c 7c 0a 20 20 20 20 20 20 20 20  y}}] ||.        
0800: 30 3d 3d 5b 6c 69 6e 64 65 78 20 24 72 65 73 20  0==[lindex $res 
0810: 30 5d 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20 20  0].      }].    
0820: 20 20 69 66 20 7b 24 72 63 21 3d 31 7d 20 7b 0a    if {$rc!=1} {.
0830: 20 20 20 20 20 20 20 20 70 75 74 73 20 22 45 72          puts "Er
0840: 72 6f 72 3a 20 24 72 65 73 22 0a 20 20 20 20 20  ror: $res".     
0850: 20 7d 0a 20 20 20 20 20 20 73 65 74 20 72 63 0a   }.      set rc.
0860: 20 20 20 20 7d 20 7b 31 7d 0a 0a 20 20 20 20 23      } {1}..    #
0870: 20 49 66 20 24 3a 3a 6e 20 69 73 20 67 72 65 61   If $::n is grea
0880: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d  ter than the num
0890: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 20  ber of malloc() 
08a0: 63 61 6c 6c 73 20 72 65 71 75 69 72 65 64 20 74  calls required t
08b0: 6f 0a 20 20 20 20 23 20 65 78 65 63 75 74 65 20  o.    # execute 
08c0: 74 68 65 20 53 51 4c 2c 20 74 68 65 6e 20 74 68  the SQL, then th
08d0: 69 73 20 74 65 73 74 20 69 73 20 66 69 6e 69 73  is test is finis
08e0: 68 65 64 2e 20 42 72 65 61 6b 20 6f 75 74 20 6f  hed. Break out o
08f0: 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
0900: 69 66 20 7b 5b 6c 69 6e 64 65 78 20 5b 73 71 6c  if {[lindex [sql
0910: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 5d  ite_malloc_stat]
0920: 20 32 5d 3e 30 7d 20 7b 0a 20 20 20 20 20 20 73   2]>0} {.      s
0930: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
0940: 6c 20 2d 31 0a 20 20 20 20 20 20 62 72 65 61 6b  l -1.      break
0950: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 4e 6f  .    }..    # No
0960: 74 68 69 6e 67 20 73 68 6f 75 6c 64 20 77 6f 72  thing should wor
0970: 6b 20 6e 6f 77 2c 20 62 65 63 61 75 73 65 20 74  k now, because t
0980: 68 65 20 61 6c 6c 6f 63 61 74 6f 72 20 73 68 6f  he allocator sho
0990: 75 6c 64 20 72 65 66 75 73 65 20 74 6f 0a 20 20  uld refuse to.  
09a0: 20 20 23 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79    # allocate any
09b0: 20 6d 65 6d 6f 72 79 2e 0a 20 20 20 20 64 6f 5f   memory..    do_
09c0: 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 24 74 6e  test malloc2-$tn
09d0: 2e 24 3a 3a 6e 2e 33 20 7b 0a 20 20 20 20 20 20  .$::n.3 {.      
09e0: 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54  catchsql {SELECT
09f0: 20 27 6e 6f 74 68 69 6e 67 20 73 68 6f 75 6c 64   'nothing should
0a00: 20 77 6f 72 6b 27 7d 0a 20 20 20 20 7d 20 7b 31   work'}.    } {1
0a10: 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 7d   {out of memory}
0a20: 7d 0a 0a 20 20 20 20 23 20 52 65 63 6f 76 65 72  }..    # Recover
0a30: 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63   from the malloc
0a40: 20 66 61 69 6c 75 72 65 2e 0a 20 20 20 20 64 6f   failure..    do
0a50: 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 24 74  _test malloc2-$t
0a60: 6e 2e 24 3a 3a 6e 2e 34 20 7b 0a 20 20 20 20 20  n.$::n.4 {.     
0a70: 20 69 66 20 30 20 7b 0a 20 20 20 20 20 20 20 20   if 0 {.        
0a80: 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 20  db close.       
0a90: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0aa0: 61 69 6c 20 2d 31 0a 20 20 20 20 20 20 20 20 73  ail -1.        s
0ab0: 65 74 20 3a 3a 44 42 20 5b 73 71 6c 69 74 65 33  et ::DB [sqlite3
0ac0: 20 64 62 20 74 65 73 74 2e 64 62 5d 0a 20 20 20   db test.db].   
0ad0: 20 20 20 20 20 73 65 74 20 64 75 6d 6d 79 20 53       set dummy S
0ae0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 7d  QLITE_OK.      }
0af0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
0b00: 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
0b10: 65 63 6f 76 65 72 0a 20 20 20 20 20 20 7d 0a 20  ecover.      }. 
0b20: 20 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d     } {SQLITE_OK}
0b30: 0a 0a 20 20 20 20 23 20 43 68 65 63 6b 73 75 6d  ..    # Checksum
0b40: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
0b50: 20 20 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f     do_test mallo
0b60: 63 32 2d 24 74 6e 2e 24 3a 3a 6e 2e 35 20 7b 0a  c2-$tn.$::n.5 {.
0b70: 20 20 20 20 20 20 63 6b 73 75 6d 20 64 62 0a 20        cksum db. 
0b80: 20 20 20 7d 20 24 73 75 6d 0a 0a 20 20 20 20 69     } $sum..    i
0b90: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6d  ntegrity_check m
0ba0: 61 6c 6c 6f 63 32 2d 24 74 6e 2e 24 3a 3a 6e 2e  alloc2-$tn.$::n.
0bb0: 36 0a 20 20 69 66 20 7b 24 3a 3a 6e 45 72 72 3e  6.  if {$::nErr>
0bc0: 31 7d 20 72 65 74 75 72 6e 0a 20 20 7d 0a 20 20  1} return.  }.  
0bd0: 75 6e 73 65 74 20 3a 3a 6d 61 6c 6c 6f 63 6f 70  unset ::mallocop
0be0: 74 73 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 61  ts.}..do_test ma
0bf0: 6c 6c 6f 63 32 2e 31 2e 73 65 74 75 70 20 7b 0a  lloc2.1.setup {.
0c00: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0c10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
0c20: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 49  (a, b, c);.    I
0c30: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
0c40: 41 4c 55 45 53 28 31 30 2c 20 32 30 2c 20 33 30  ALUES(10, 20, 30
0c50: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0c60: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 34 30  TO abc VALUES(40
0c70: 2c 20 35 30 2c 20 36 30 29 3b 0a 20 20 20 20 43  , 50, 60);.    C
0c80: 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 5f  REATE INDEX abc_
0c90: 69 20 4f 4e 20 61 62 63 28 61 2c 20 62 2c 20 63  i ON abc(a, b, c
0ca0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 6d  );.  }.} {}.do_m
0cb0: 61 6c 6c 6f 63 32 5f 74 65 73 74 20 31 2e 31 20  alloc2_test 1.1 
0cc0: 2d 73 71 6c 20 7b 0a 20 20 53 45 4c 45 43 54 20  -sql {.  SELECT 
0cd0: 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 7d 0a 64 6f  * FROM abc;.}.do
0ce0: 5f 6d 61 6c 6c 6f 63 32 5f 74 65 73 74 20 31 2e  _malloc2_test 1.
0cf0: 32 20 2d 73 71 6c 20 7b 0a 20 20 55 50 44 41 54  2 -sql {.  UPDAT
0d00: 45 20 61 62 63 20 53 45 54 20 63 20 3d 20 63 2b  E abc SET c = c+
0d10: 31 30 3b 0a 7d 0a 64 6f 5f 6d 61 6c 6c 6f 63 32  10;.}.do_malloc2
0d20: 5f 74 65 73 74 20 31 2e 33 20 2d 73 71 6c 20 7b  _test 1.3 -sql {
0d30: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61  .  INSERT INTO a
0d40: 62 63 20 56 41 4c 55 45 53 28 37 30 2c 20 38 30  bc VALUES(70, 80
0d50: 2c 20 39 30 29 3b 0a 7d 0a 64 6f 5f 6d 61 6c 6c  , 90);.}.do_mall
0d60: 6f 63 32 5f 74 65 73 74 20 31 2e 34 20 2d 73 71  oc2_test 1.4 -sq
0d70: 6c 20 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f  l {.  DELETE FRO
0d80: 4d 20 61 62 63 3b 0a 7d 0a 64 6f 5f 74 65 73 74  M abc;.}.do_test
0d90: 20 6d 61 6c 6c 6f 63 32 2e 31 2e 35 20 7b 0a 20   malloc2.1.5 {. 
0da0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0db0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
0dc0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  ;.  }.} {}..do_t
0dd0: 65 73 74 20 6d 61 6c 6c 6f 63 32 2e 32 2e 73 65  est malloc2.2.se
0de0: 74 75 70 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  tup {.  execsql 
0df0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0e00: 4c 45 20 64 65 66 28 61 2c 20 62 2c 20 63 29 3b  LE def(a, b, c);
0e10: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
0e20: 58 20 64 65 66 5f 69 31 20 4f 4e 20 64 65 66 28  X def_i1 ON def(
0e30: 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  a);.    CREATE I
0e40: 4e 44 45 58 20 64 65 66 5f 69 32 20 4f 4e 20 64  NDEX def_i2 ON d
0e50: 65 66 28 63 29 3b 0a 20 20 20 20 42 45 47 49 4e  ef(c);.    BEGIN
0e60: 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b 73 65 74  ;.  }.  for {set
0e70: 20 69 20 30 7d 20 7b 24 69 3c 32 30 7d 20 7b 69   i 0} {$i<20} {i
0e80: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
0e90: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
0ea0: 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c 55 45  T INTO def VALUE
0eb0: 53 28 72 61 6e 64 73 74 72 28 33 30 30 2c 33 30  S(randstr(300,30
0ec0: 30 29 2c 72 61 6e 64 73 74 72 28 33 30 30 2c 33  0),randstr(300,3
0ed0: 30 30 29 2c 72 61 6e 64 73 74 72 28 33 30 30 2c  00),randstr(300,
0ee0: 33 30 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  300));.    }.  }
0ef0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0f00: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b   COMMIT;.  }.} {
0f10: 7d 0a 64 6f 5f 6d 61 6c 6c 6f 63 32 5f 74 65 73  }.do_malloc2_tes
0f20: 74 20 32 20 2d 73 71 6c 20 7b 0a 20 20 42 45 47  t 2 -sql {.  BEG
0f30: 49 4e 3b 0a 20 20 55 50 44 41 54 45 20 64 65 66  IN;.  UPDATE def
0f40: 20 53 45 54 20 61 20 3d 20 72 61 6e 64 73 74 72   SET a = randstr
0f50: 28 31 30 30 2c 31 30 30 29 20 57 48 45 52 45 20  (100,100) WHERE 
0f60: 28 6f 69 64 25 39 29 3d 3d 30 3b 0a 20 20 49 4e  (oid%9)==0;.  IN
0f70: 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20 53 45  SERT INTO def SE
0f80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66 20  LECT * FROM def 
0f90: 57 48 45 52 45 20 28 6f 69 64 25 31 33 29 3d 3d  WHERE (oid%13)==
0fa0: 30 3b 0a 0a 20 20 43 52 45 41 54 45 20 49 4e 44  0;..  CREATE IND
0fb0: 45 58 20 64 65 66 5f 69 33 20 4f 4e 20 64 65 66  EX def_i3 ON def
0fc0: 28 62 29 3b 0a 0a 20 20 55 50 44 41 54 45 20 64  (b);..  UPDATE d
0fd0: 65 66 20 53 45 54 20 61 20 3d 20 72 61 6e 64 73  ef SET a = rands
0fe0: 74 72 28 31 30 30 2c 31 30 30 29 20 57 48 45 52  tr(100,100) WHER
0ff0: 45 20 28 6f 69 64 25 39 29 3d 3d 31 3b 0a 20 20  E (oid%9)==1;.  
1000: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 66 20  INSERT INTO def 
1010: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65  SELECT * FROM de
1020: 66 20 57 48 45 52 45 20 28 6f 69 64 25 31 33 29  f WHERE (oid%13)
1030: 3d 3d 31 3b 0a 0a 20 20 43 52 45 41 54 45 20 54  ==1;..  CREATE T
1040: 41 42 4c 45 20 64 65 66 32 20 41 53 20 53 45 4c  ABLE def2 AS SEL
1050: 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66 3b 0a  ECT * FROM def;.
1060: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 64 65 66    DROP TABLE def
1070: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1080: 20 64 65 66 20 41 53 20 53 45 4c 45 43 54 20 2a   def AS SELECT *
1090: 20 46 52 4f 4d 20 64 65 66 32 3b 0a 20 20 44 52   FROM def2;.  DR
10a0: 4f 50 20 54 41 42 4c 45 20 64 65 66 32 3b 0a 0a  OP TABLE def2;..
10b0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 64 65    DELETE FROM de
10c0: 66 20 57 48 45 52 45 20 28 6f 69 64 25 39 29 3d  f WHERE (oid%9)=
10d0: 3d 32 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  =2;.  INSERT INT
10e0: 4f 20 64 65 66 20 53 45 4c 45 43 54 20 2a 20 46  O def SELECT * F
10f0: 52 4f 4d 20 64 65 66 20 57 48 45 52 45 20 28 6f  ROM def WHERE (o
1100: 69 64 25 31 33 29 3d 3d 32 3b 0a 20 20 43 4f 4d  id%13)==2;.  COM
1110: 4d 49 54 3b 0a 7d 0a 0a 69 66 63 61 70 61 62 6c  MIT;.}..ifcapabl
1120: 65 20 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f 5f  e tempdb {.  do_
1130: 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2e 33 2e 73  test malloc2.3.s
1140: 65 74 75 70 20 7b 0a 20 20 20 20 65 78 65 63 73  etup {.    execs
1150: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
1160: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 67 68 69  E TEMP TABLE ghi
1170: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 20  (a, b, c);.     
1180: 20 42 45 47 49 4e 3b 0a 20 20 20 20 7d 0a 20 20   BEGIN;.    }.  
1190: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
11a0: 7b 24 69 3c 32 30 7d 20 7b 69 6e 63 72 20 69 7d  {$i<20} {incr i}
11b0: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
11c0: 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   {.      INSERT 
11d0: 49 4e 54 4f 20 67 68 69 20 56 41 4c 55 45 53 28  INTO ghi VALUES(
11e0: 72 61 6e 64 73 74 72 28 33 30 30 2c 33 30 30 29  randstr(300,300)
11f0: 2c 72 61 6e 64 73 74 72 28 33 30 30 2c 33 30 30  ,randstr(300,300
1200: 29 2c 72 61 6e 64 73 74 72 28 33 30 30 2c 33 30  ),randstr(300,30
1210: 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0));.      }.   
1220: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
1230: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
1240: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
1250: 5f 6d 61 6c 6c 6f 63 32 5f 74 65 73 74 20 33 20  _malloc2_test 3 
1260: 2d 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  -sql {.    BEGIN
1270: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
1280: 45 58 20 67 68 69 5f 69 31 20 4f 4e 20 67 68 69  EX ghi_i1 ON ghi
1290: 28 61 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  (a);.    UPDATE 
12a0: 64 65 66 20 53 45 54 20 61 20 3d 20 72 61 6e 64  def SET a = rand
12b0: 73 74 72 28 31 30 30 2c 31 30 30 29 20 57 48 45  str(100,100) WHE
12c0: 52 45 20 28 6f 69 64 25 32 29 3d 3d 30 3b 0a 20  RE (oid%2)==0;. 
12d0: 20 20 20 55 50 44 41 54 45 20 67 68 69 20 53 45     UPDATE ghi SE
12e0: 54 20 61 20 3d 20 72 61 6e 64 73 74 72 28 31 30  T a = randstr(10
12f0: 30 2c 31 30 30 29 20 57 48 45 52 45 20 28 6f 69  0,100) WHERE (oi
1300: 64 25 32 29 3d 3d 30 3b 0a 20 20 20 20 43 4f 4d  d%2)==0;.    COM
1310: 4d 49 54 3b 0a 20 20 7d 0a 7d 0a 0a 23 23 23 23  MIT;.  }.}..####
1320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1360: 23 23 23 23 23 23 23 23 0a 23 20 54 68 65 20 74  ########.# The t
1370: 65 73 74 20 63 61 73 65 73 20 62 65 6c 6f 77 20  est cases below 
1380: 61 72 65 20 74 6f 20 69 6e 63 72 65 61 73 65 20  are to increase 
1390: 74 68 65 20 63 6f 64 65 20 63 6f 76 65 72 61 67  the code coverag
13a0: 65 20 69 6e 20 62 74 72 65 65 2e 63 20 61 6e 64  e in btree.c and
13b0: 20 0a 23 20 70 61 67 65 72 2e 63 20 6f 66 20 74   .# pager.c of t
13c0: 68 69 73 20 74 65 73 74 20 66 69 6c 65 2e 20 54  his test file. T
13d0: 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
13e0: 65 61 63 68 20 6d 61 6c 6c 6f 63 28 29 20 74 68  each malloc() th
13f0: 61 74 20 6f 63 63 75 72 73 20 69 6e 0a 23 20 74  at occurs in.# t
1400: 68 65 73 65 20 74 77 6f 20 73 6f 75 72 63 65 20  hese two source 
1410: 66 69 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  files should be 
1420: 6d 61 64 65 20 74 6f 20 66 61 69 6c 20 61 74 20  made to fail at 
1430: 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 23 0a 63 61  least once..#.ca
1440: 74 63 68 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20  tchsql {.  DROP 
1450: 54 41 42 4c 45 20 67 68 69 3b 0a 7d 0a 64 6f 5f  TABLE ghi;.}.do_
1460: 6d 61 6c 6c 6f 63 32 5f 74 65 73 74 20 34 2e 31  malloc2_test 4.1
1470: 20 2d 73 71 6c 20 7b 0a 20 20 53 45 4c 45 43 54   -sql {.  SELECT
1480: 20 2a 20 46 52 4f 4d 20 64 65 66 20 4f 52 44 45   * FROM def ORDE
1490: 52 20 42 59 20 6f 69 64 20 41 53 43 3b 0a 20 20  R BY oid ASC;.  
14a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65  SELECT * FROM de
14b0: 66 20 4f 52 44 45 52 20 42 59 20 6f 69 64 20 44  f ORDER BY oid D
14c0: 45 53 43 3b 0a 7d 0a 64 6f 5f 6d 61 6c 6c 6f 63  ESC;.}.do_malloc
14d0: 32 5f 74 65 73 74 20 34 2e 32 20 2d 73 71 6c 20  2_test 4.2 -sql 
14e0: 7b 0a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65  {.  PRAGMA cache
14f0: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 42 45  _size = 10;.  BE
1500: 47 49 4e 3b 0a 0a 20 20 2d 2d 20 54 68 69 73 20  GIN;..  -- This 
1510: 77 69 6c 6c 20 70 75 74 20 61 62 6f 75 74 20 32  will put about 2
1520: 35 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  5 pages on the f
1530: 72 65 65 20 6c 69 73 74 2e 0a 20 20 44 45 4c 45  ree list..  DELE
1540: 54 45 20 46 52 4f 4d 20 64 65 66 20 57 48 45 52  TE FROM def WHER
1550: 45 20 31 3b 0a 0a 20 20 2d 2d 20 41 6c 6c 6f 63  E 1;..  -- Alloc
1560: 61 74 65 20 33 32 20 6e 65 77 20 72 6f 6f 74 20  ate 32 new root 
1570: 70 61 67 65 73 2e 20 54 68 69 73 20 77 69 6c 6c  pages. This will
1580: 20 65 78 65 72 63 69 73 65 20 74 68 65 20 27 65   exercise the 'e
1590: 78 74 72 61 63 74 20 73 70 65 63 69 66 69 63 20  xtract specific 
15a0: 0a 20 20 2d 2d 20 70 61 67 65 20 66 72 6f 6d 20  .  -- page from 
15b0: 74 68 65 20 66 72 65 65 6c 69 73 74 27 20 63 6f  the freelist' co
15c0: 64 65 20 77 68 65 6e 20 69 6e 20 61 75 74 6f 2d  de when in auto-
15d0: 76 61 63 75 75 6d 20 6d 6f 64 65 20 28 73 65 65  vacuum mode (see
15e0: 20 74 68 65 0a 20 20 2d 2d 20 61 6c 6c 6f 63 61   the.  -- alloca
15f0: 74 65 50 61 67 65 28 29 20 72 6f 75 74 69 6e 65  tePage() routine
1600: 20 69 6e 20 62 74 72 65 65 2e 63 29 2e 0a 20 20   in btree.c)..  
1610: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1620: 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51  a UNIQUE, b UNIQ
1630: 55 45 2c 20 63 20 55 4e 49 51 55 45 29 3b 0a 20  UE, c UNIQUE);. 
1640: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
1650: 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49  (a UNIQUE, b UNI
1660: 51 55 45 2c 20 63 20 55 4e 49 51 55 45 29 3b 0a  QUE, c UNIQUE);.
1670: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1680: 33 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55 4e  3(a UNIQUE, b UN
1690: 49 51 55 45 2c 20 63 20 55 4e 49 51 55 45 29 3b  IQUE, c UNIQUE);
16a0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
16b0: 74 34 28 61 20 55 4e 49 51 55 45 2c 20 62 20 55  t4(a UNIQUE, b U
16c0: 4e 49 51 55 45 2c 20 63 20 55 4e 49 51 55 45 29  NIQUE, c UNIQUE)
16d0: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
16e0: 20 74 35 28 61 20 55 4e 49 51 55 45 2c 20 62 20   t5(a UNIQUE, b 
16f0: 55 4e 49 51 55 45 2c 20 63 20 55 4e 49 51 55 45  UNIQUE, c UNIQUE
1700: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
1710: 45 20 74 36 28 61 20 55 4e 49 51 55 45 2c 20 62  E t6(a UNIQUE, b
1720: 20 55 4e 49 51 55 45 2c 20 63 20 55 4e 49 51 55   UNIQUE, c UNIQU
1730: 45 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  E);.  CREATE TAB
1740: 4c 45 20 74 37 28 61 20 55 4e 49 51 55 45 2c 20  LE t7(a UNIQUE, 
1750: 62 20 55 4e 49 51 55 45 2c 20 63 20 55 4e 49 51  b UNIQUE, c UNIQ
1760: 55 45 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41  UE);.  CREATE TA
1770: 42 4c 45 20 74 38 28 61 20 55 4e 49 51 55 45 2c  BLE t8(a UNIQUE,
1780: 20 62 20 55 4e 49 51 55 45 2c 20 63 20 55 4e 49   b UNIQUE, c UNI
1790: 51 55 45 29 3b 0a 0a 20 20 52 4f 4c 4c 42 41 43  QUE);..  ROLLBAC
17a0: 4b 3b 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23  K;.}..##########
17b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
17f0: 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 67   Test that the g
1800: 6c 6f 62 61 6c 20 6c 69 6e 6b 65 64 20 6c 69 73  lobal linked lis
1810: 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 68 61  t of database ha
1820: 6e 64 6c 65 73 20 77 6f 72 6b 73 2e 20 41 6e 20  ndles works. An 
1830: 61 73 73 65 72 74 28 29 0a 23 20 77 69 6c 6c 20  assert().# will 
1840: 66 61 69 6c 20 69 66 20 74 68 65 72 65 20 69 73  fail if there is
1850: 20 73 6f 6d 65 20 70 72 6f 62 6c 65 6d 2e 0a 64   some problem..d
1860: 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 35  o_test malloc2-5
1870: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 31   {.  sqlite3 db1
1880: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
1890: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
18a0: 20 73 71 6c 69 74 65 33 20 64 62 33 20 74 65 73   sqlite3 db3 tes
18b0: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64  t.db.  sqlite3 d
18c0: 62 34 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  b4 test.db.  sql
18d0: 69 74 65 33 20 64 62 35 20 74 65 73 74 2e 64 62  ite3 db5 test.db
18e0: 0a 0a 20 20 23 20 43 6c 6f 73 65 20 74 68 65 20  ..  # Close the 
18f0: 68 65 61 64 20 6f 66 20 74 68 65 20 6c 69 73 74  head of the list
1900: 3a 0a 20 20 64 62 35 20 63 6c 6f 73 65 0a 20 20  :.  db5 close.  
1910: 0a 20 20 23 20 43 6c 6f 73 65 20 74 68 65 20 65  .  # Close the e
1920: 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 3a 0a  nd of the list:.
1930: 20 20 64 62 31 20 63 6c 6f 73 65 0a 0a 20 20 23    db1 close..  #
1940: 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20   Close a handle 
1950: 66 72 6f 6d 20 74 68 65 20 6d 69 64 64 6c 65 20  from the middle 
1960: 6f 66 20 74 68 65 20 6c 69 73 74 3a 0a 20 20 64  of the list:.  d
1970: 62 33 20 63 6c 6f 73 65 0a 0a 20 20 23 20 43 6c  b3 close..  # Cl
1980: 6f 73 65 20 74 68 65 20 6f 74 68 65 72 20 74 77  ose the other tw
1990: 6f 2e 20 54 68 65 6e 20 6f 70 65 6e 20 61 6e 64  o. Then open and
19a0: 20 63 6c 6f 73 65 20 6f 6e 65 20 6d 6f 72 65 20   close one more 
19b0: 64 61 74 61 62 61 73 65 2c 20 74 6f 20 6d 61 6b  database, to mak
19c0: 65 0a 20 20 23 20 73 75 72 65 20 74 68 65 20 68  e.  # sure the h
19d0: 65 61 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  ead of the list 
19e0: 77 61 73 20 73 65 74 20 62 61 63 6b 20 74 6f 20  was set back to 
19f0: 4e 55 4c 4c 2e 0a 20 20 64 62 32 20 63 6c 6f 73  NULL..  db2 clos
1a00: 65 0a 20 20 64 62 34 20 63 6c 6f 73 65 0a 20 20  e.  db4 close.  
1a10: 73 71 6c 69 74 65 20 64 62 31 20 74 65 73 74 2e  sqlite db1 test.
1a20: 64 62 0a 20 20 64 62 31 20 63 6c 6f 73 65 0a 7d  db.  db1 close.}
1a30: 20 7b 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23   {}..###########
1a40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20  #############.# 
1a80: 43 68 65 63 6b 20 74 68 61 74 20 69 66 20 61 20  Check that if a 
1a90: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 63 74  statement is act
1aa0: 69 76 65 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  ive sqlite3_glob
1ab0: 61 6c 5f 72 65 63 6f 76 65 72 20 64 6f 65 73 6e  al_recover doesn
1ac0: 27 74 20 72 65 73 65 74 0a 23 20 74 68 65 20 73  't reset.# the s
1ad0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
1ae0: 69 6c 65 64 20 76 61 72 69 61 62 6c 65 2e 0a 64  iled variable..d
1af0: 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 36  o_test malloc2-6
1b00: 2e 31 20 7b 0a 20 20 73 65 74 20 3a 3a 53 54 4d  .1 {.  set ::STM
1b10: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
1b20: 72 65 20 24 3a 3a 44 42 20 7b 53 45 4c 45 43 54  re $::DB {SELECT
1b30: 20 2a 20 46 52 4f 4d 20 64 65 66 7d 20 2d 31 20   * FROM def} -1 
1b40: 44 55 4d 4d 59 5d 0a 20 20 73 71 6c 69 74 65 33  DUMMY].  sqlite3
1b50: 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a 7d 20  _step $::STMT.} 
1b60: 7b 53 51 4c 49 54 45 5f 52 4f 57 7d 0a 64 6f 5f  {SQLITE_ROW}.do_
1b70: 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 36 2e 32  test malloc2-6.2
1b80: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 31   {.  sqlite3 db1
1b90: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
1ba0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20 31 30  e_malloc_fail 10
1bb0: 30 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  0.  catchsql {. 
1bc0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1bd0: 20 64 65 66 3b 0a 20 20 7d 20 64 62 31 0a 7d 20   def;.  } db1.} 
1be0: 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  {1 {out of memor
1bf0: 79 7d 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c  y}}.do_test mall
1c00: 6f 63 32 2d 36 2e 33 20 7b 0a 20 20 73 71 6c 69  oc2-6.3 {.  sqli
1c10: 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
1c20: 65 72 0a 7d 20 7b 53 51 4c 49 54 45 5f 42 55 53  er.} {SQLITE_BUS
1c30: 59 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f  Y}.do_test mallo
1c40: 63 32 2d 36 2e 34 20 7b 0a 20 20 63 61 74 63 68  c2-6.4 {.  catch
1c50: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1c60: 20 27 68 65 6c 6c 6f 27 3b 0a 20 20 7d 0a 7d 20   'hello';.  }.} 
1c70: 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  {1 {out of memor
1c80: 79 7d 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c  y}}.do_test mall
1c90: 6f 63 32 2d 36 2e 35 20 7b 0a 20 20 73 71 6c 69  oc2-6.5 {.  sqli
1ca0: 74 65 33 5f 72 65 73 65 74 20 24 3a 3a 53 54 4d  te3_reset $::STM
1cb0: 54 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  T.} {SQLITE_OK}.
1cc0: 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2d  do_test malloc2-
1cd0: 36 2e 36 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  6.6 {.  sqlite3_
1ce0: 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 0a 7d  global_recover.}
1cf0: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f   {SQLITE_OK}.do_
1d00: 74 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 36 2e 37  test malloc2-6.7
1d10: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
1d20: 20 20 20 20 53 45 4c 45 43 54 20 27 68 65 6c 6c      SELECT 'hell
1d30: 6f 27 3b 0a 20 20 7d 0a 7d 20 7b 30 20 68 65 6c  o';.  }.} {0 hel
1d40: 6c 6f 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c  lo}.do_test mall
1d50: 6f 63 32 2d 36 2e 38 20 7b 0a 20 20 73 71 6c 69  oc2-6.8 {.  sqli
1d60: 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54  te3_step $::STMT
1d70: 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52  .} {SQLITE_ERROR
1d80: 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  }.do_test malloc
1d90: 32 2d 36 2e 39 20 7b 0a 20 20 73 71 6c 69 74 65  2-6.9 {.  sqlite
1da0: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54  3_finalize $::ST
1db0: 4d 54 0a 7d 20 7b 53 51 4c 49 54 45 5f 53 43 48  MT.} {SQLITE_SCH
1dc0: 45 4d 41 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c  EMA}.do_test mal
1dd0: 6c 6f 63 32 2d 36 2e 31 30 20 7b 0a 20 20 64 62  loc2-6.10 {.  db
1de0: 31 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 23  1 close.} {}..##
1df0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e30: 23 23 23 23 23 23 0a 23 20 43 68 65 63 6b 20 74  ######.# Check t
1e40: 68 61 74 20 69 66 20 61 6e 20 69 6e 2d 6d 65 6d  hat if an in-mem
1e50: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
1e60: 62 65 69 6e 67 20 75 73 65 64 20 69 74 20 69 73  being used it is
1e70: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a 23 20   not possible.# 
1e80: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
1e90: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
1ea0: 72 65 2e 0a 69 66 63 61 70 61 62 6c 65 20 6d 65  re..ifcapable me
1eb0: 6d 6f 72 79 64 62 20 7b 0a 20 20 64 6f 5f 74 65  morydb {.  do_te
1ec0: 73 74 20 6d 61 6c 6c 6f 63 32 2d 37 2e 31 20 7b  st malloc2-7.1 {
1ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 31  .    sqlite3 db1
1ee0: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 20 20 6c 69   :memory:.    li
1ef0: 73 74 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  st.  } {}.  do_t
1f00: 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 37 2e 32 20  est malloc2-7.2 
1f10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 6d 61 6c  {.    sqlite_mal
1f20: 6c 6f 63 5f 66 61 69 6c 20 31 30 30 0a 20 20 20  loc_fail 100.   
1f30: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
1f40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1f50: 64 65 66 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 20  def;.    } .  } 
1f60: 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  {1 {out of memor
1f70: 79 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6d 61  y}}.  do_test ma
1f80: 6c 6c 6f 63 32 2d 37 2e 33 20 7b 0a 20 20 20 20  lloc2-7.3 {.    
1f90: 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
1fa0: 65 63 6f 76 65 72 0a 20 20 7d 20 7b 53 51 4c 49  ecover.  } {SQLI
1fb0: 54 45 5f 45 52 52 4f 52 7d 0a 20 20 64 6f 5f 74  TE_ERROR}.  do_t
1fc0: 65 73 74 20 6d 61 6c 6c 6f 63 32 2d 37 2e 34 20  est malloc2-7.4 
1fd0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
1fe0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 68  .      SELECT 'h
1ff0: 65 6c 6c 6f 27 3b 0a 20 20 20 20 7d 0a 20 20 7d  ello';.    }.  }
2000: 20 7b 31 20 7b 6f 75 74 20 6f 66 20 6d 65 6d 6f   {1 {out of memo
2010: 72 79 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6d  ry}}.  do_test m
2020: 61 6c 6c 6f 63 32 2d 37 2e 35 20 7b 0a 20 20 20  alloc2-7.5 {.   
2030: 20 64 62 31 20 63 6c 6f 73 65 0a 20 20 7d 20 7b   db1 close.  } {
2040: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c  }.  do_test mall
2050: 6f 63 32 2d 37 2e 36 20 7b 0a 20 20 20 20 73 71  oc2-7.6 {.    sq
2060: 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
2070: 6f 76 65 72 0a 20 20 7d 20 7b 53 51 4c 49 54 45  over.  } {SQLITE
2080: 5f 4f 4b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6d  _OK}.  do_test m
2090: 61 6c 6c 6f 63 32 2d 37 2e 37 20 7b 0a 20 20 20  alloc2-7.7 {.   
20a0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
20b0: 20 20 53 45 4c 45 43 54 20 27 68 65 6c 6c 6f 27    SELECT 'hello'
20c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 20 68  ;.    }.  } {0 h
20d0: 65 6c 6c 6f 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f  ello}.}..finish_
20e0: 74 65 73 74 0a                                   test.