/ Hex Artifact Content
Login

Artifact fd368e31fe98d4779ed80442f311ed9f03bcd1f7:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 2a 2a 2a 0a 23 0a 23 20 54 68  *********.#.# Th
0170: 69 73 20 66 69 6c 65 20 61 74 74 65 6d 70 74 73  is file attempts
0180: 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 62 65   to check the be
0190: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 53 51  havior of the SQ
01a0: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 6e 20  Lite library in 
01b0: 0a 23 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  .# an out-of-mem
01c0: 6f 72 79 20 73 69 74 75 61 74 69 6f 6e 2e 20 57  ory situation. W
01d0: 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  hen compiled wit
01e0: 68 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  h -DSQLITE_DEBUG
01f0: 3d 31 2c 20 0a 23 20 74 68 65 20 53 51 4c 69 74  =1, .# the SQLit
0200: 65 20 6c 69 62 72 61 72 79 20 61 63 63 65 70 74  e library accept
0210: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6d 6d  s a special comm
0220: 61 6e 64 20 28 73 71 6c 69 74 65 33 5f 6d 65 6d  and (sqlite3_mem
0230: 64 65 62 75 67 5f 66 61 69 6c 20 4e 20 43 29 0a  debug_fail N C).
0240: 23 20 77 68 69 63 68 20 63 61 75 73 65 73 20 74  # which causes t
0250: 68 65 20 4e 2d 74 68 20 6d 61 6c 6c 6f 63 20 74  he N-th malloc t
0260: 6f 20 66 61 69 6c 2e 20 20 54 68 69 73 20 73 70  o fail.  This sp
0270: 65 63 69 61 6c 20 66 65 61 74 75 72 65 20 69 73  ecial feature is
0280: 20 75 73 65 64 0a 23 20 74 6f 20 73 65 65 20 77   used.# to see w
0290: 68 61 74 20 68 61 70 70 65 6e 73 20 69 6e 20 74  hat happens in t
02a0: 68 65 20 6c 69 62 72 61 72 79 20 69 66 20 61 20  he library if a 
02b0: 6d 61 6c 6c 6f 63 20 77 65 72 65 20 74 6f 20 72  malloc were to r
02c0: 65 61 6c 6c 79 20 66 61 69 6c 0a 23 20 64 75 65  eally fail.# due
02d0: 20 74 6f 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65   to an out-of-me
02e0: 6d 6f 72 79 20 73 69 74 75 61 74 69 6f 6e 2e 0a  mory situation..
02f0: 23 0a 23 20 24 49 64 3a 20 6d 61 6c 6c 6f 63 2e  #.# $Id: malloc.
0300: 74 65 73 74 2c 76 20 31 2e 38 31 20 32 30 30 39  test,v 1.81 2009
0310: 2f 30 36 2f 32 34 20 31 33 3a 31 33 3a 34 35 20  /06/24 13:13:45 
0320: 64 72 68 20 45 78 70 20 24 0a 0a 73 65 74 20 74  drh Exp $..set t
0330: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0340: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0350: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
0360: 74 65 72 2e 74 63 6c 0a 0a 0a 23 20 4f 6e 6c 79  ter.tcl...# Only
0370: 20 72 75 6e 20 74 68 65 73 65 20 74 65 73 74 73   run these tests
0380: 20 69 66 20 6d 65 6d 6f 72 79 20 64 65 62 75 67   if memory debug
0390: 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  ging is turned o
03a0: 6e 2e 0a 23 0a 73 6f 75 72 63 65 20 24 74 65 73  n..#.source $tes
03b0: 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d 6d  tdir/malloc_comm
03c0: 6f 6e 2e 74 63 6c 0a 69 66 20 7b 21 24 4d 45 4d  on.tcl.if {!$MEM
03d0: 44 45 42 55 47 7d 20 7b 0a 20 20 20 70 75 74 73  DEBUG} {.   puts
03e0: 20 22 53 6b 69 70 70 69 6e 67 20 6d 61 6c 6c 6f   "Skipping mallo
03f0: 63 20 74 65 73 74 73 3a 20 6e 6f 74 20 63 6f 6d  c tests: not com
0400: 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c  piled with -DSQL
0410: 49 54 45 5f 4d 45 4d 44 45 42 55 47 2e 2e 2e 22  ITE_MEMDEBUG..."
0420: 0a 20 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  .   finish_test.
0430: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 44     return.}..# D
0440: 6f 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6d 65  o a couple of me
0450: 6d 6f 72 79 20 64 75 6d 70 73 20 6a 75 73 74 20  mory dumps just 
0460: 74 6f 20 65 78 65 72 63 69 73 65 20 74 68 65 20  to exercise the 
0470: 6d 65 6d 6f 72 79 20 64 75 6d 70 20 6c 6f 67 69  memory dump logi
0480: 63 0a 23 20 74 68 61 74 20 74 68 61 74 20 77 65  c.# that that we
0490: 20 63 61 6e 20 73 61 79 20 74 68 61 74 20 77 65   can say that we
04a0: 20 68 61 76 65 2e 0a 23 0a 70 75 74 73 20 73 74   have..#.puts st
04b0: 64 65 72 72 20 22 54 68 69 73 20 69 73 20 61 20  derr "This is a 
04c0: 74 65 73 74 2e 20 20 49 67 6e 6f 72 65 20 74 68  test.  Ignore th
04d0: 65 20 65 72 72 6f 72 20 74 68 61 74 20 66 6f 6c  e error that fol
04e0: 6c 6f 77 73 3a 22 0a 73 71 6c 69 74 65 33 5f 6d  lows:".sqlite3_m
04f0: 65 6d 64 65 62 75 67 5f 64 75 6d 70 20 24 74 65  emdebug_dump $te
0500: 73 74 64 69 72 0a 70 75 74 73 20 22 4d 65 6d 6f  stdir.puts "Memo
0510: 72 79 20 64 75 6d 70 20 74 6f 20 66 69 6c 65 20  ry dump to file 
0520: 6d 65 6d 64 75 6d 70 2e 74 78 74 2e 2e 2e 22 0a  memdump.txt...".
0530: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
0540: 5f 64 75 6d 70 20 6d 65 6d 64 75 6d 70 2e 74 78  _dump memdump.tx
0550: 74 0a 0a 69 66 63 61 70 61 62 6c 65 20 62 6c 6f  t..ifcapable blo
0560: 62 6c 69 74 26 26 73 75 62 71 75 65 72 79 20 7b  blit&&subquery {
0570: 0a 20 20 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73  .  do_malloc_tes
0580: 74 20 31 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20  t 1 -tclprep {. 
0590: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 7d 20     db close.  } 
05a0: 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20 20 20 69  -tclbody {.    i
05b0: 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c 69 74  f {[catch {sqlit
05c0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 7d 5d 7d  e3 db test.db}]}
05d0: 20 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22   {.      error "
05e0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 0a 20  out of memory". 
05f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
0600: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
0610: 5f 63 6f 64 65 73 20 64 62 20 31 0a 20 20 7d 20  _codes db 1.  } 
0620: 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 20 20 20 44  -sqlbody {.    D
0630: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
0640: 53 54 53 20 74 31 3b 0a 20 20 20 20 43 52 45 41  STS t1;.    CREA
0650: 54 45 20 54 41 42 4c 45 20 74 31 28 0a 20 20 20  TE TABLE t1(.   
0660: 20 20 20 20 61 20 69 6e 74 2c 20 62 20 66 6c 6f      a int, b flo
0670: 61 74 2c 20 63 20 64 6f 75 62 6c 65 2c 20 64 20  at, c double, d 
0680: 74 65 78 74 2c 20 65 20 76 61 72 63 68 61 72 28  text, e varchar(
0690: 32 30 29 2c 0a 20 20 20 20 20 20 20 70 72 69 6d  20),.       prim
06a0: 61 72 79 20 6b 65 79 28 61 2c 62 2c 63 29 0a 20  ary key(a,b,c). 
06b0: 20 20 20 29 3b 0a 20 20 20 20 43 52 45 41 54 45     );.    CREATE
06c0: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
06d0: 61 2c 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  a,b);.    INSERT
06e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
06f0: 31 2c 32 2e 33 2c 34 2e 35 2c 27 68 69 27 2c 78  1,2.3,4.5,'hi',x
0700: 27 37 34 36 38 36 35 37 32 36 35 30 30 27 29 3b  '746865726500');
0710: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0720: 20 74 31 20 56 41 4c 55 45 53 28 36 2c 37 2e 30   t1 VALUES(6,7.0
0730: 2c 30 2e 38 2c 27 68 65 6c 6c 6f 27 2c 27 6f 75  ,0.8,'hello','ou
0740: 74 20 79 6f 6e 64 65 72 27 29 3b 0a 20 20 20 20  t yonder');.    
0750: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0760: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 76 67  ;.    SELECT avg
0770: 28 62 29 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  (b) FROM t1 GROU
0780: 50 20 42 59 20 61 20 48 41 56 49 4e 47 20 62 3e  P BY a HAVING b>
0790: 32 30 2e 30 3b 0a 20 20 20 20 44 45 4c 45 54 45  20.0;.    DELETE
07a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
07b0: 20 49 4e 20 28 53 45 4c 45 43 54 20 6d 69 6e 28   IN (SELECT min(
07c0: 61 29 20 46 52 4f 4d 20 74 31 29 3b 0a 20 20 20  a) FROM t1);.   
07d0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
07e0: 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 65  , group_concat(e
07f0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53  ) FROM t1;.    S
0800: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20  ELECT b FROM t1 
0810: 4f 52 44 45 52 20 42 59 20 31 20 43 4f 4c 4c 41  ORDER BY 1 COLLA
0820: 54 45 20 6e 6f 63 61 73 65 3b 0a 20 20 7d 20 0a  TE nocase;.  } .
0830: 7d 0a 0a 23 20 45 6e 73 75 72 65 20 74 68 61 74  }..# Ensure that
0840: 20 6e 6f 20 66 69 6c 65 20 64 65 73 63 72 69 70   no file descrip
0850: 74 6f 72 73 20 77 65 72 65 20 6c 65 61 6b 65 64  tors were leaked
0860: 2e 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  ..do_test malloc
0870: 2d 31 2e 58 20 7b 0a 20 20 63 61 74 63 68 20 7b  -1.X {.  catch {
0880: 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 65 74 20  db close}.  set 
0890: 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65  sqlite_open_file
08a0: 5f 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 0a 69 66  _count.} {0}..if
08b0: 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79  capable subquery
08c0: 20 7b 0a 20 20 64 6f 5f 6d 61 6c 6c 6f 63 5f 74   {.  do_malloc_t
08d0: 65 73 74 20 32 20 2d 73 71 6c 62 6f 64 79 20 7b  est 2 -sqlbody {
08e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
08f0: 45 20 74 31 28 61 20 69 6e 74 2c 20 62 20 69 6e  E t1(a int, b in
0900: 74 20 64 65 66 61 75 6c 74 20 27 61 62 63 27 2c  t default 'abc',
0910: 20 63 20 69 6e 74 20 64 65 66 61 75 6c 74 20 31   c int default 1
0920: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
0930: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
0940: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0950: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 31  TO t1 VALUES(1,1
0960: 2c 27 39 39 20 61 62 63 64 65 66 67 68 69 6a 6b  ,'99 abcdefghijk
0970: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 27  lmnopqrstuvwxyz'
0980: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0990: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 34  TO t1 VALUES(2,4
09a0: 2c 27 39 38 20 61 62 63 64 65 66 67 68 69 6a 6b  ,'98 abcdefghijk
09b0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 27  lmnopqrstuvwxyz'
09c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
09d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 39  TO t1 VALUES(3,9
09e0: 2c 27 39 37 20 61 62 63 64 65 66 67 68 69 6a 6b  ,'97 abcdefghijk
09f0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 27  lmnopqrstuvwxyz'
0a00: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0a10: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 31  TO t1 VALUES(4,1
0a20: 36 2c 27 39 36 20 61 62 63 64 65 66 67 68 69 6a  6,'96 abcdefghij
0a30: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
0a40: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
0a50: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
0a60: 32 35 2c 27 39 35 20 61 62 63 64 65 66 67 68 69  25,'95 abcdefghi
0a70: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
0a80: 7a 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  z');.    INSERT 
0a90: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36  INTO t1 VALUES(6
0aa0: 2c 33 36 2c 27 39 34 20 61 62 63 64 65 66 67 68  ,36,'94 abcdefgh
0ab0: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
0ac0: 79 7a 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  yz');.    SELECT
0ad0: 20 27 73 74 75 66 66 27 2c 20 63 6f 75 6e 74 28   'stuff', count(
0ae0: 2a 29 20 61 73 20 27 6f 74 68 65 72 20 73 74 75  *) as 'other stu
0af0: 66 66 27 2c 20 6d 61 78 28 61 2b 31 30 29 20 46  ff', max(a+10) F
0b00: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55 50 44 41  ROM t1;.    UPDA
0b10: 54 45 20 74 31 20 53 45 54 20 62 3d 62 7c 7c 62  TE t1 SET b=b||b
0b20: 7c 7c 62 7c 7c 62 3b 0a 20 20 20 20 55 50 44 41  ||b||b;.    UPDA
0b30: 54 45 20 74 31 20 53 45 54 20 62 3d 61 20 57 48  TE t1 SET b=a WH
0b40: 45 52 45 20 61 20 69 6e 20 28 31 30 2c 31 32 2c  ERE a in (10,12,
0b50: 32 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  22);.    INSERT 
0b60: 49 4e 54 4f 20 74 31 28 63 2c 62 2c 61 29 20 56  INTO t1(c,b,a) V
0b70: 41 4c 55 45 53 28 32 30 2c 31 30 2c 35 29 3b 0a  ALUES(20,10,5);.
0b80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0b90: 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t1 SELECT * FROM
0ba0: 20 74 31 0a 20 20 20 20 20 20 20 20 57 48 45 52   t1.        WHER
0bb0: 45 20 61 20 49 4e 20 28 53 45 4c 45 43 54 20 61  E a IN (SELECT a
0bc0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
0bd0: 3c 31 30 29 3b 0a 20 20 20 20 44 45 4c 45 54 45  <10);.    DELETE
0be0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
0bf0: 3e 3d 31 30 3b 0a 20 20 20 20 44 52 4f 50 20 49  >=10;.    DROP I
0c00: 4e 44 45 58 20 69 31 3b 0a 20 20 20 20 44 45 4c  NDEX i1;.    DEL
0c10: 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  ETE FROM t1;.  }
0c20: 20 0a 7d 0a 0a 23 20 45 6e 73 75 72 65 20 74 68   .}..# Ensure th
0c30: 61 74 20 6e 6f 20 66 69 6c 65 20 64 65 73 63 72  at no file descr
0c40: 69 70 74 6f 72 73 20 77 65 72 65 20 6c 65 61 6b  iptors were leak
0c50: 65 64 2e 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c  ed..do_test mall
0c60: 6f 63 2d 32 2e 58 20 7b 0a 20 20 63 61 74 63 68  oc-2.X {.  catch
0c70: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 65   {db close}.  se
0c80: 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69  t sqlite_open_fi
0c90: 6c 65 5f 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 0a  le_count.} {0}..
0ca0: 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 33  do_malloc_test 3
0cb0: 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 20 42 45   -sqlbody {.  BE
0cc0: 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b  GIN TRANSACTION;
0cd0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0ce0: 74 31 28 61 20 69 6e 74 2c 20 62 20 69 6e 74 2c  t1(a int, b int,
0cf0: 20 63 20 69 6e 74 29 3b 0a 20 20 43 52 45 41 54   c int);.  CREAT
0d00: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
0d10: 28 61 2c 62 29 3b 0a 20 20 49 4e 53 45 52 54 20  (a,b);.  INSERT 
0d20: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0d30: 2c 31 2c 39 39 29 3b 0a 20 20 49 4e 53 45 52 54  ,1,99);.  INSERT
0d40: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0d50: 32 2c 34 2c 39 38 29 3b 0a 20 20 49 4e 53 45 52  2,4,98);.  INSER
0d60: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0d70: 28 33 2c 39 2c 39 37 29 3b 0a 20 20 49 4e 53 45  (3,9,97);.  INSE
0d80: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0d90: 53 28 34 2c 31 36 2c 39 36 29 3b 0a 20 20 49 4e  S(4,16,96);.  IN
0da0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0db0: 55 45 53 28 35 2c 32 35 2c 39 35 29 3b 0a 20 20  UES(5,25,95);.  
0dc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0dd0: 41 4c 55 45 53 28 36 2c 33 36 2c 39 34 29 3b 0a  ALUES(6,36,94);.
0de0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0df0: 28 63 2c 62 2c 61 29 20 56 41 4c 55 45 53 28 32  (c,b,a) VALUES(2
0e00: 30 2c 31 30 2c 35 29 3b 0a 20 20 44 45 4c 45 54  0,10,5);.  DELET
0e10: 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  E FROM t1 WHERE 
0e20: 61 3e 3d 31 30 3b 0a 20 20 44 52 4f 50 20 49 4e  a>=10;.  DROP IN
0e30: 44 45 58 20 69 31 3b 0a 20 20 44 45 4c 45 54 45  DEX i1;.  DELETE
0e40: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 52 4f 4c 4c   FROM t1;.  ROLL
0e50: 42 41 43 4b 3b 0a 7d 20 0a 0a 0a 23 20 45 6e 73  BACK;.} ...# Ens
0e60: 75 72 65 20 74 68 61 74 20 6e 6f 20 66 69 6c 65  ure that no file
0e70: 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 65 72   descriptors wer
0e80: 65 20 6c 65 61 6b 65 64 2e 0a 64 6f 5f 74 65 73  e leaked..do_tes
0e90: 74 20 6d 61 6c 6c 6f 63 2d 33 2e 58 20 7b 0a 20  t malloc-3.X {. 
0ea0: 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65   catch {db close
0eb0: 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6f  }.  set sqlite_o
0ec0: 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 7d  pen_file_count.}
0ed0: 20 7b 30 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20   {0}..ifcapable 
0ee0: 73 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f  subquery {.  do_
0ef0: 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 34 20 2d 73  malloc_test 4 -s
0f00: 71 6c 62 6f 64 79 20 7b 0a 20 20 20 20 42 45 47  qlbody {.    BEG
0f10: 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 0a  IN TRANSACTION;.
0f20: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0f30: 20 74 31 28 61 20 69 6e 74 2c 20 62 20 69 6e 74   t1(a int, b int
0f40: 2c 20 63 20 69 6e 74 29 3b 0a 20 20 20 20 43 52  , c int);.    CR
0f50: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
0f60: 20 74 31 28 61 2c 62 29 3b 0a 20 20 20 20 49 4e   t1(a,b);.    IN
0f70: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0f80: 55 45 53 28 31 2c 31 2c 39 39 29 3b 0a 20 20 20  UES(1,1,99);.   
0f90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0fa0: 56 41 4c 55 45 53 28 32 2c 34 2c 39 38 29 3b 0a  VALUES(2,4,98);.
0fb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0fc0: 74 31 20 56 41 4c 55 45 53 28 33 2c 39 2c 39 37  t1 VALUES(3,9,97
0fd0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0fe0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 31  TO t1 VALUES(4,1
0ff0: 36 2c 39 36 29 3b 0a 20 20 20 20 49 4e 53 45 52  6,96);.    INSER
1000: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1010: 28 35 2c 32 35 2c 39 35 29 3b 0a 20 20 20 20 49  (5,25,95);.    I
1020: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1030: 4c 55 45 53 28 36 2c 33 36 2c 39 34 29 3b 0a 20  LUES(6,36,94);. 
1040: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
1050: 20 62 3d 61 20 57 48 45 52 45 20 61 20 69 6e 20   b=a WHERE a in 
1060: 28 31 30 2c 31 32 2c 32 32 29 3b 0a 20 20 20 20  (10,12,22);.    
1070: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1080: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 0a  ELECT * FROM t1.
1090: 20 20 20 20 20 20 20 57 48 45 52 45 20 61 20 49         WHERE a I
10a0: 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
10b0: 20 74 31 20 57 48 45 52 45 20 61 3c 31 30 29 3b   t1 WHERE a<10);
10c0: 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20  .    DROP INDEX 
10d0: 69 31 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  i1;.    DELETE F
10e0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43 4f 4d 4d  ROM t1;.    COMM
10f0: 49 54 3b 0a 20 20 7d 20 0a 7d 0a 0a 23 20 45 6e  IT;.  } .}..# En
1100: 73 75 72 65 20 74 68 61 74 20 6e 6f 20 66 69 6c  sure that no fil
1110: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 65  e descriptors we
1120: 72 65 20 6c 65 61 6b 65 64 2e 0a 64 6f 5f 74 65  re leaked..do_te
1130: 73 74 20 6d 61 6c 6c 6f 63 2d 34 2e 58 20 7b 0a  st malloc-4.X {.
1140: 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73    catch {db clos
1150: 65 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f  e}.  set sqlite_
1160: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a  open_file_count.
1170: 7d 20 7b 30 7d 0a 0a 69 66 63 61 70 61 62 6c 65  } {0}..ifcapable
1180: 20 74 72 69 67 67 65 72 20 7b 0a 20 20 64 6f 5f   trigger {.  do_
1190: 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 35 20 2d 73  malloc_test 5 -s
11a0: 71 6c 62 6f 64 79 20 7b 0a 20 20 20 20 42 45 47  qlbody {.    BEG
11b0: 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 0a  IN TRANSACTION;.
11c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
11d0: 20 74 31 28 61 2c 62 29 3b 0a 20 20 20 20 43 52   t1(a,b);.    CR
11e0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c  EATE TABLE t2(x,
11f0: 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  y);.    CREATE T
1200: 52 49 47 47 45 52 20 72 31 20 41 46 54 45 52 20  RIGGER r1 AFTER 
1210: 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 57 48 45  INSERT ON t1 WHE
1220: 4e 20 6e 65 77 2e 61 20 3d 20 32 20 42 45 47 49  N new.a = 2 BEGI
1230: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
1240: 4e 54 4f 20 74 32 28 78 2c 79 29 20 56 41 4c 55  NTO t2(x,y) VALU
1250: 45 53 28 6e 65 77 2e 72 6f 77 69 64 2c 31 29 3b  ES(new.rowid,1);
1260: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1270: 54 4f 20 74 32 28 78 2c 79 29 20 53 45 4c 45 43  TO t2(x,y) SELEC
1280: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
1290: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
12a0: 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  2 SELECT * FROM 
12b0: 74 32 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  t2;.      UPDATE
12c0: 20 74 32 20 53 45 54 20 79 3d 79 2b 31 20 57 48   t2 SET y=y+1 WH
12d0: 45 52 45 20 78 3d 6e 65 77 2e 72 6f 77 69 64 3b  ERE x=new.rowid;
12e0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 31 32  .      SELECT 12
12f0: 33 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  3;.      DELETE 
1300: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 3d  FROM t2 WHERE x=
1310: 6e 65 77 2e 72 6f 77 69 64 3b 0a 20 20 20 20 45  new.rowid;.    E
1320: 4e 44 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ND;.    INSERT I
1330: 4e 54 4f 20 74 31 28 61 2c 62 29 20 56 41 4c 55  NTO t1(a,b) VALU
1340: 45 53 28 32 2c 33 29 3b 0a 20 20 20 20 43 4f 4d  ES(2,3);.    COM
1350: 4d 49 54 3b 0a 20 20 7d 20 0a 7d 0a 0a 23 20 45  MIT;.  } .}..# E
1360: 6e 73 75 72 65 20 74 68 61 74 20 6e 6f 20 66 69  nsure that no fi
1370: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
1380: 65 72 65 20 6c 65 61 6b 65 64 2e 0a 64 6f 5f 74  ere leaked..do_t
1390: 65 73 74 20 6d 61 6c 6c 6f 63 2d 35 2e 58 20 7b  est malloc-5.X {
13a0: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
13b0: 73 65 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65  se}.  set sqlite
13c0: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
13d0: 0a 7d 20 7b 30 7d 0a 0a 69 66 63 61 70 61 62 6c  .} {0}..ifcapabl
13e0: 65 20 76 61 63 75 75 6d 20 7b 0a 20 20 64 6f 5f  e vacuum {.  do_
13f0: 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 36 20 2d 73  malloc_test 6 -s
1400: 71 6c 70 72 65 70 20 7b 0a 20 20 20 20 42 45 47  qlprep {.    BEG
1410: 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 0a  IN TRANSACTION;.
1420: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1430: 20 74 31 28 61 29 3b 0a 20 20 20 20 49 4e 53 45   t1(a);.    INSE
1440: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1450: 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  S(1);.    INSERT
1460: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
1470: 61 2a 32 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  a*2 FROM t1;.   
1480: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1490: 53 45 4c 45 43 54 20 61 2a 32 20 46 52 4f 4d 20  SELECT a*2 FROM 
14a0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
14b0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2a  NTO t1 SELECT a*
14c0: 32 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  2 FROM t1;.    I
14d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
14e0: 4c 45 43 54 20 61 2a 32 20 46 52 4f 4d 20 74 31  LECT a*2 FROM t1
14f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1500: 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2a 32 20  O t1 SELECT a*2 
1510: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
1520: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1530: 43 54 20 61 2a 32 20 46 52 4f 4d 20 74 31 3b 0a  CT a*2 FROM t1;.
1540: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1550: 74 31 20 53 45 4c 45 43 54 20 61 2a 32 20 46 52  t1 SELECT a*2 FR
1560: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
1570: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1580: 20 61 2a 32 20 46 52 4f 4d 20 74 31 3b 0a 20 20   a*2 FROM t1;.  
1590: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
15a0: 20 53 45 4c 45 43 54 20 61 2a 32 20 46 52 4f 4d   SELECT a*2 FROM
15b0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
15c0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
15d0: 2a 32 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *2 FROM t1;.    
15e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 77  DELETE FROM t1 w
15f0: 68 65 72 65 20 72 6f 77 69 64 25 35 20 3d 20 30  here rowid%5 = 0
1600: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
1610: 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 20 20  } -sqlbody {.   
1620: 20 56 41 43 55 55 4d 3b 0a 20 20 7d 20 0a 7d 0a   VACUUM;.  } .}.
1630: 0a 61 75 74 6f 69 6e 73 74 61 6c 6c 5f 74 65 73  .autoinstall_tes
1640: 74 5f 66 75 6e 63 74 69 6f 6e 73 0a 64 6f 5f 6d  t_functions.do_m
1650: 61 6c 6c 6f 63 5f 74 65 73 74 20 37 20 2d 73 71  alloc_test 7 -sq
1660: 6c 70 72 65 70 20 7b 0a 20 20 43 52 45 41 54 45  lprep {.  CREATE
1670: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
1680: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1690: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
16a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
16b0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
16c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
16d0: 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20  VALUES(5, 6);.  
16e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
16f0: 41 4c 55 45 53 28 37 2c 20 72 61 6e 64 73 74 72  ALUES(7, randstr
1700: 28 31 32 30 30 2c 31 32 30 30 29 29 3b 0a 7d 20  (1200,1200));.} 
1710: 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 20 53 45 4c  -sqlbody {.  SEL
1720: 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20  ECT min(a) FROM 
1730: 74 31 20 57 48 45 52 45 20 61 3c 36 20 47 52 4f  t1 WHERE a<6 GRO
1740: 55 50 20 42 59 20 62 3b 0a 20 20 53 45 4c 45 43  UP BY b;.  SELEC
1750: 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T a FROM t1 WHER
1760: 45 20 61 3c 36 20 4f 52 44 45 52 20 42 59 20 61  E a<6 ORDER BY a
1770: 3b 0a 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ;.  SELECT b FRO
1780: 4d 20 74 31 20 57 48 45 52 45 20 61 3e 36 3b 0a  M t1 WHERE a>6;.
1790: 7d 0a 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20  }..# This block 
17a0: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 74  is designed to t
17b0: 65 73 74 20 74 68 61 74 20 73 6f 6d 65 20 6d 61  est that some ma
17c0: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 74 68  lloc failures th
17d0: 61 74 20 6d 61 79 0a 23 20 6f 63 63 75 72 20 69  at may.# occur i
17e0: 6e 20 76 64 62 65 61 70 69 2e 63 2e 20 53 70 65  n vdbeapi.c. Spe
17f0: 63 69 66 69 63 61 6c 6c 79 2c 20 69 66 20 61 20  cifically, if a 
1800: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 74  malloc failure t
1810: 68 61 74 20 6f 63 63 75 72 73 0a 23 20 77 68 65  hat occurs.# whe
1820: 6e 20 63 6f 6e 76 65 72 74 69 6e 67 20 55 54 46  n converting UTF
1830: 2d 31 36 20 74 65 78 74 20 74 6f 20 69 6e 74 65  -16 text to inte
1840: 67 65 72 73 20 61 6e 64 20 72 65 61 6c 20 6e 75  gers and real nu
1850: 6d 62 65 72 73 20 69 73 20 68 61 6e 64 6c 65 64  mbers is handled
1860: 0a 23 20 63 6f 72 72 65 63 74 6c 79 2e 20 0a 23  .# correctly. .#
1870: 0a 23 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .# This is done 
1880: 62 79 20 72 65 74 72 69 65 76 69 6e 67 20 61 20  by retrieving a 
1890: 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  string from the 
18a0: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
18b0: 61 6e 64 0a 23 20 6d 61 6e 69 70 75 6c 61 74 69  and.# manipulati
18c0: 6e 67 20 69 74 20 75 73 69 6e 67 20 74 68 65 20  ng it using the 
18d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a  sqlite3_column_*
18e0: 2a 2a 20 41 50 49 73 2e 20 54 68 69 73 20 64 6f  ** APIs. This do
18f0: 65 73 6e 27 74 20 0a 23 20 61 63 74 75 61 6c 6c  esn't .# actuall
1900: 79 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  y return an erro
1910: 72 20 74 6f 20 74 68 65 20 75 73 65 72 20 77 68  r to the user wh
1920: 65 6e 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  en a malloc() fa
1930: 69 6c 73 2e 2e 20 54 68 61 74 20 0a 23 20 63 6f  ils.. That .# co
1940: 75 6c 64 20 62 65 20 76 69 65 77 65 64 20 61 73  uld be viewed as
1950: 20 61 20 62 75 67 2e 0a 23 0a 23 20 54 68 65 73   a bug..#.# Thes
1960: 65 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e  e tests only run
1970: 20 69 66 20 55 54 46 2d 31 36 20 73 75 70 70 6f   if UTF-16 suppo
1980: 72 74 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69  rt is compiled i
1990: 6e 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 75  n..#.ifcapable u
19a0: 74 66 31 36 20 7b 0a 20 20 73 65 74 20 3a 3a 53  tf16 {.  set ::S
19b0: 54 4d 54 20 7b 7d 0a 20 20 64 6f 5f 6d 61 6c 6c  TMT {}.  do_mall
19c0: 6f 63 5f 74 65 73 74 20 38 20 2d 74 63 6c 70 72  oc_test 8 -tclpr
19d0: 65 70 20 7b 0a 20 20 20 20 73 65 74 20 73 71 6c  ep {.    set sql
19e0: 20 22 53 45 4c 45 43 54 20 27 5b 73 74 72 69 6e   "SELECT '[strin
19f0: 67 20 72 65 70 65 61 74 20 61 62 63 20 32 30 5d  g repeat abc 20]
1a00: 27 2c 20 27 5b 73 74 72 69 6e 67 20 72 65 70 65  ', '[string repe
1a10: 61 74 20 64 65 66 20 32 30 5d 27 2c 20 3f 22 0a  at def 20]', ?".
1a20: 20 20 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b      set ::STMT [
1a30: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
1a40: 64 62 20 24 73 71 6c 20 2d 31 20 58 5d 0a 20 20  db $sql -1 X].  
1a50: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24    sqlite3_step $
1a60: 3a 3a 53 54 4d 54 0a 20 20 20 20 69 66 20 7b 20  ::STMT.    if { 
1a70: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
1a80: 62 79 74 65 4f 72 64 65 72 29 3d 3d 22 6c 69 74  byteOrder)=="lit
1a90: 74 6c 65 45 6e 64 69 61 6e 22 20 7d 20 7b 0a 20  tleEndian" } {. 
1aa0: 20 20 20 20 20 73 65 74 20 3a 3a 62 6f 6d 73 74       set ::bomst
1ab0: 72 20 22 5c 78 46 46 5c 78 46 45 22 0a 20 20 20  r "\xFF\xFE".   
1ac0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1ad0: 73 65 74 20 3a 3a 62 6f 6d 73 74 72 20 22 5c 78  set ::bomstr "\x
1ae0: 46 45 5c 78 46 46 22 0a 20 20 20 20 7d 0a 20 20  FE\xFF".    }.  
1af0: 20 20 61 70 70 65 6e 64 20 3a 3a 62 6f 6d 73 74    append ::bomst
1b00: 72 20 5b 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76  r [encoding conv
1b10: 65 72 74 74 6f 20 75 6e 69 63 6f 64 65 20 22 31  ertto unicode "1
1b20: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
1b30: 38 39 5f 31 32 33 34 35 36 37 38 39 22 5d 0a 20  89_123456789"]. 
1b40: 20 7d 20 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20   } -tclbody {.  
1b50: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1b60: 5f 74 65 78 74 31 36 20 24 3a 3a 53 54 4d 54 20  _text16 $::STMT 
1b70: 30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  0.    sqlite3_co
1b80: 6c 75 6d 6e 5f 69 6e 74 20 24 3a 3a 53 54 4d 54  lumn_int $::STMT
1b90: 20 30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63   0.    sqlite3_c
1ba0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 20 24 3a 3a  olumn_text16 $::
1bb0: 53 54 4d 54 20 31 0a 20 20 20 20 73 71 6c 69 74  STMT 1.    sqlit
1bc0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
1bd0: 20 24 3a 3a 53 54 4d 54 20 31 0a 20 20 20 20 73   $::STMT 1.    s
1be0: 65 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f 72  et rc [sqlite3_r
1bf0: 65 73 65 74 20 24 3a 3a 53 54 4d 54 5d 0a 20 20  eset $::STMT].  
1c00: 20 20 69 66 20 7b 24 72 63 20 65 71 20 22 53 51    if {$rc eq "SQ
1c10: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 7d 20 7b 65 72  LITE_NOMEM"} {er
1c20: 72 6f 72 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror "out of memo
1c30: 72 79 22 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  ry"}.    sqlite3
1c40: 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 24 3a 3a  _bind_text16 $::
1c50: 53 54 4d 54 20 31 20 24 3a 3a 62 6f 6d 73 74 72  STMT 1 $::bomstr
1c60: 20 36 30 0a 20 20 20 20 23 63 61 74 63 68 20 7b   60.    #catch {
1c70: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1c80: 20 24 3a 3a 53 54 4d 54 7d 0a 20 20 20 20 23 69   $::STMT}.    #i
1c90: 66 20 7b 5b 6c 69 6e 64 65 78 20 5b 73 71 6c 69  f {[lindex [sqli
1ca0: 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 5d 20  te_malloc_stat] 
1cb0: 32 5d 3c 3d 30 7d 20 7b 0a 20 20 20 20 23 20 20  2]<=0} {.    #  
1cc0: 65 72 72 6f 72 20 22 6f 75 74 20 6f 66 20 6d 65  error "out of me
1cd0: 6d 6f 72 79 22 0a 20 20 20 20 23 7d 0a 20 20 7d  mory".    #}.  }
1ce0: 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20 20 20 20   -cleanup {.    
1cf0: 69 66 20 7b 24 3a 3a 53 54 4d 54 21 3d 22 22 7d  if {$::STMT!=""}
1d00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1d10: 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d  _finalize $::STM
1d20: 54 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 53 54  T.      set ::ST
1d30: 4d 54 20 7b 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a  MT {}.    }.  }.
1d40: 7d 0a 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20  }..# This block 
1d50: 74 65 73 74 73 20 74 68 61 74 20 6d 61 6c 6c 6f  tests that mallo
1d60: 63 28 29 20 66 61 69 6c 75 72 65 73 20 74 68 61  c() failures tha
1d70: 74 20 6f 63 63 75 72 20 77 68 69 6c 73 74 20 63  t occur whilst c
1d80: 6f 6d 6d 69 74 69 6e 67 0a 23 20 61 20 6d 75 6c  ommiting.# a mul
1d90: 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
1da0: 69 6f 6e 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ion are handled 
1db0: 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 64 6f 5f  correctly..#.do_
1dc0: 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 39 20 2d 73  malloc_test 9 -s
1dd0: 71 6c 70 72 65 70 20 7b 0a 20 20 41 54 54 41 43  qlprep {.  ATTAC
1de0: 48 20 27 74 65 73 74 32 2e 64 62 27 20 61 73 20  H 'test2.db' as 
1df0: 74 65 73 74 32 3b 0a 20 20 43 52 45 41 54 45 20  test2;.  CREATE 
1e00: 54 41 42 4c 45 20 61 62 63 31 28 61 2c 20 62 2c  TABLE abc1(a, b,
1e10: 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   c);.  CREATE TA
1e20: 42 4c 45 20 74 65 73 74 32 2e 61 62 63 32 28 61  BLE test2.abc2(a
1e30: 2c 20 62 2c 20 63 29 3b 0a 7d 20 2d 73 71 6c 62  , b, c);.} -sqlb
1e40: 6f 64 79 20 7b 0a 20 20 42 45 47 49 4e 3b 0a 20  ody {.  BEGIN;. 
1e50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
1e60: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  1 VALUES(1, 2, 3
1e70: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1e80: 20 61 62 63 32 20 56 41 4c 55 45 53 28 31 2c 20   abc2 VALUES(1, 
1e90: 32 2c 20 33 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  2, 3);.  COMMIT;
1ea0: 0a 7d 0a 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b  .}..# This block
1eb0: 20 74 65 73 74 73 20 6d 61 6c 6c 6f 63 28 29 20   tests malloc() 
1ec0: 66 61 69 6c 75 72 65 73 20 74 68 61 74 20 6f 63  failures that oc
1ed0: 63 75 72 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  cur while openin
1ee0: 67 20 61 20 0a 23 20 63 6f 6e 6e 65 63 74 69 6f  g a .# connectio
1ef0: 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 2e  n to a database.
1f00: 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20  .do_malloc_test 
1f10: 31 30 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20  10 -tclprep {.  
1f20: 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65  catch {db2 close
1f30: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66  }.  db close.  f
1f40: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
1f50: 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  db test.db-journ
1f60: 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  al.  sqlite3 db 
1f70: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
1f80: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
1f90: 74 5f 63 6f 64 65 73 20 64 62 20 31 0a 20 20 64  t_codes db 1.  d
1fa0: 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54  b eval {CREATE T
1fb0: 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63  ABLE abc(a, b, c
1fc0: 29 7d 0a 7d 20 2d 74 63 6c 62 6f 64 79 20 7b 0a  )}.} -tclbody {.
1fd0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c    db close.  sql
1fe0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
1ff0: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  .  sqlite3_exten
2000: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
2010: 20 64 62 32 20 31 0a 20 20 64 62 32 20 65 76 61   db2 1.  db2 eva
2020: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
2030: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a   sqlite_master}.
2040: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 23    db2 close.}..#
2050: 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
2060: 73 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  s malloc() failu
2070: 72 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 77  res that occur w
2080: 69 74 68 69 6e 20 63 61 6c 6c 73 20 74 6f 0a 23  ithin calls to.#
2090: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
20a0: 66 75 6e 63 74 69 6f 6e 28 29 2e 0a 64 6f 5f 6d  function()..do_m
20b0: 61 6c 6c 6f 63 5f 74 65 73 74 20 31 31 20 2d 74  alloc_test 11 -t
20c0: 63 6c 62 6f 64 79 20 7b 0a 20 20 73 65 74 20 72  clbody {.  set r
20d0: 63 20 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74  c [sqlite3_creat
20e0: 65 5f 66 75 6e 63 74 69 6f 6e 20 64 62 5d 0a 20  e_function db]. 
20f0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
2100: 63 68 20 24 72 63 20 53 51 4c 49 54 45 5f 4f 4b  ch $rc SQLITE_OK
2110: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 63 20  ]} {.    set rc 
2120: 5b 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  [sqlite3_create_
2130: 61 67 67 72 65 67 61 74 65 20 64 62 5d 0a 20 20  aggregate db].  
2140: 7d 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  }.  if {[string 
2150: 6d 61 74 63 68 20 24 72 63 20 53 51 4c 49 54 45  match $rc SQLITE
2160: 5f 4e 4f 4d 45 4d 5d 7d 20 7b 0a 20 20 20 20 65  _NOMEM]} {.    e
2170: 72 72 6f 72 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rror "out of mem
2180: 6f 72 79 22 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 6d  ory".  }.}..do_m
2190: 61 6c 6c 6f 63 5f 74 65 73 74 20 31 32 20 2d 74  alloc_test 12 -t
21a0: 63 6c 62 6f 64 79 20 7b 0a 20 20 73 65 74 20 73  clbody {.  set s
21b0: 71 6c 31 36 20 5b 65 6e 63 6f 64 69 6e 67 20 63  ql16 [encoding c
21c0: 6f 6e 76 65 72 74 74 6f 20 75 6e 69 63 6f 64 65  onvertto unicode
21d0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
21e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 5d 0a  sqlite_master"].
21f0: 20 20 61 70 70 65 6e 64 20 73 71 6c 31 36 20 22    append sql16 "
2200: 5c 30 30 5c 30 30 22 0a 20 20 73 65 74 20 3a 3a  \00\00".  set ::
2210: 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70 72  STMT [sqlite3_pr
2220: 65 70 61 72 65 31 36 20 64 62 20 24 73 71 6c 31  epare16 db $sql1
2230: 36 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 73 71  6 -1 DUMMY].  sq
2240: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
2250: 3a 3a 53 54 4d 54 0a 7d 0a 0a 23 20 54 65 73 74  ::STMT.}..# Test
2260: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 77   malloc errors w
2270: 68 65 6e 20 72 65 70 6c 61 79 69 6e 67 20 74 77  hen replaying tw
2280: 6f 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 20 66  o hot journals f
2290: 72 6f 6d 20 61 20 32 2d 66 69 6c 65 20 0a 23 20  rom a 2-file .# 
22a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 69 66 63  transaction..ifc
22b0: 61 70 61 62 6c 65 20 63 72 61 73 68 74 65 73 74  apable crashtest
22c0: 26 26 61 74 74 61 63 68 20 7b 0a 20 20 64 6f 5f  &&attach {.  do_
22d0: 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 31 33 20 2d  malloc_test 13 -
22e0: 74 63 6c 70 72 65 70 20 7b 0a 20 20 20 20 73 65  tclprep {.    se
22f0: 74 20 72 63 20 5b 63 72 61 73 68 73 71 6c 20 2d  t rc [crashsql -
2300: 64 65 6c 61 79 20 31 20 2d 66 69 6c 65 20 74 65  delay 1 -file te
2310: 73 74 32 2e 64 62 20 7b 0a 20 20 20 20 20 20 41  st2.db {.      A
2320: 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27  TTACH 'test2.db'
2330: 20 61 73 20 61 75 78 3b 0a 20 20 20 20 20 20 50   as aux;.      P
2340: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
2350: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 42 45 47   = 10;.      BEG
2360: 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
2370: 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c   TABLE aux.t2(a,
2380: 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52   b, c);.      CR
2390: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
23a0: 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 4f   b, c);.      CO
23b0: 4d 4d 49 54 3b 0a 20 20 20 20 7d 5d 0a 20 20 20  MMIT;.    }].   
23c0: 20 69 66 20 7b 24 72 63 21 3d 22 31 20 7b 63 68   if {$rc!="1 {ch
23d0: 69 6c 64 20 70 72 6f 63 65 73 73 20 65 78 69 74  ild process exit
23e0: 65 64 20 61 62 6e 6f 72 6d 61 6c 6c 79 7d 22 7d  ed abnormally}"}
23f0: 20 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22   {.      error "
2400: 57 72 6f 6e 67 20 65 72 72 6f 72 20 6d 65 73 73  Wrong error mess
2410: 61 67 65 3a 20 24 72 63 22 0a 20 20 20 20 7d 0a  age: $rc".    }.
2420: 20 20 7d 20 2d 74 63 6c 62 6f 64 79 20 7b 0a 20    } -tclbody {. 
2430: 20 20 20 64 62 20 65 76 61 6c 20 7b 41 54 54 41     db eval {ATTA
2440: 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 61 73  CH 'test2.db' as
2450: 20 61 75 78 3b 7d 0a 20 20 20 20 73 65 74 20 72   aux;}.    set r
2460: 63 20 5b 63 61 74 63 68 20 7b 64 62 20 65 76 61  c [catch {db eva
2470: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
2480: 20 2a 20 46 52 4f 4d 20 74 31 3b 20 0a 20 20 20   * FROM t1; .   
2490: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
24a0: 20 74 32 3b 0a 20 20 20 20 7d 7d 20 65 72 72 5d   t2;.    }} err]
24b0: 0a 20 20 20 20 69 66 20 7b 24 72 63 20 26 26 20  .    if {$rc && 
24c0: 24 65 72 72 21 3d 22 6e 6f 20 73 75 63 68 20 74  $err!="no such t
24d0: 61 62 6c 65 3a 20 74 31 22 7d 20 7b 0a 20 20 20  able: t1"} {.   
24e0: 20 20 20 65 72 72 6f 72 20 24 65 72 72 0a 20 20     error $err.  
24f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 69 66 20 7b 24    }.  }.}..if {$
2500: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
2510: 74 66 6f 72 6d 29 21 3d 22 77 69 6e 64 6f 77 73  tform)!="windows
2520: 22 7d 20 7b 0a 20 20 64 6f 5f 6d 61 6c 6c 6f 63  "} {.  do_malloc
2530: 5f 74 65 73 74 20 31 34 20 2d 74 63 6c 70 72 65  _test 14 -tclpre
2540: 70 20 7b 0a 20 20 20 20 63 61 74 63 68 20 7b 64  p {.    catch {d
2550: 62 20 63 6c 6f 73 65 7d 0a 20 20 20 20 73 71 6c  b close}.    sql
2560: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
2570: 62 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  b.    sqlite3_ex
2580: 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
2590: 64 65 73 20 64 62 32 20 31 0a 20 20 20 20 64 62  des db2 1.    db
25a0: 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 50  2 eval {.      P
25b0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
25c0: 64 65 20 3d 20 44 45 4c 45 54 45 3b 20 20 20 20  de = DELETE;    
25d0: 2f 2a 20 46 6f 72 20 69 6e 6d 65 6d 6f 72 79 5f  /* For inmemory_
25e0: 6a 6f 75 72 6e 61 6c 20 70 65 72 6d 75 74 61 74  journal permutat
25f0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 50 52 41  ion */.      PRA
2600: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
2610: 3d 20 30 3b 0a 20 20 20 20 20 20 43 52 45 41 54  = 0;.      CREAT
2620: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
2630: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2640: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
2650: 20 32 29 3b 0a 20 20 20 20 20 20 42 45 47 49 4e   2);.      BEGIN
2660: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2670: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
2680: 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   4);.    }.    f
2690: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 32 2e 64  orcecopy test2.d
26a0: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 66 6f  b test.db.    fo
26b0: 72 63 65 63 6f 70 79 20 74 65 73 74 32 2e 64 62  rcecopy test2.db
26c0: 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 2e 64 62  -journal test.db
26d0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 64 62 32  -journal.    db2
26e0: 20 63 6c 6f 73 65 0a 20 20 7d 20 2d 74 63 6c 62   close.  } -tclb
26f0: 6f 64 79 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  ody {.    sqlite
2700: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
2710: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
2720: 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 64  d_result_codes d
2730: 62 20 31 0a 0a 20 20 20 20 23 20 49 66 20 61 6e  b 1..    # If an
2740: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 6f   out-of-memory o
2750: 63 63 75 72 73 20 77 69 74 68 69 6e 20 61 20 63  ccurs within a c
2760: 61 6c 6c 20 74 6f 20 61 20 56 46 53 20 6c 61 79  all to a VFS lay
2770: 65 72 20 66 75 6e 63 74 69 6f 6e 20 64 75 72 69  er function duri
2780: 6e 67 0a 20 20 20 20 23 20 68 6f 74 2d 6a 6f 75  ng.    # hot-jou
2790: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  rnal rollback, s
27a0: 71 6c 69 74 65 20 77 69 6c 6c 20 72 65 70 6f 72  qlite will repor
27b0: 74 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  t SQLITE_CORRUPT
27c0: 2e 20 53 65 65 20 63 6f 6d 6d 69 74 0a 20 20 20  . See commit.   
27d0: 20 23 20 5b 35 36 36 38 5d 20 66 6f 72 20 64 65   # [5668] for de
27e0: 74 61 69 6c 73 2e 0a 20 20 20 20 73 65 74 20 72  tails..    set r
27f0: 63 20 5b 63 61 74 63 68 20 7b 64 62 20 65 76 61  c [catch {db eva
2800: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
2810: 4d 20 74 31 20 7d 7d 20 6d 73 67 5d 0a 20 20 20  M t1 }} msg].   
2820: 20 69 66 20 7b 24 6d 73 67 20 65 71 20 22 64 61   if {$msg eq "da
2830: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
2840: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 7d  e is malformed"}
2850: 20 7b 20 73 65 74 20 6d 73 67 20 22 6f 75 74 20   { set msg "out 
2860: 6f 66 20 6d 65 6d 6f 72 79 22 20 7d 0a 20 20 20  of memory" }.   
2870: 20 69 66 20 7b 24 72 63 7d 20 7b 20 65 72 72 6f   if {$rc} { erro
2880: 72 20 24 6d 73 67 20 7d 0a 20 20 20 20 73 65 74  r $msg }.    set
2890: 20 6d 73 67 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63   msg.  }.}..proc
28a0: 20 73 74 72 69 6e 67 5f 63 6f 6d 70 61 72 65 20   string_compare 
28b0: 7b 61 20 62 7d 20 7b 0a 20 20 72 65 74 75 72 6e  {a b} {.  return
28c0: 20 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65   [string compare
28d0: 20 24 61 20 24 62 5d 0a 7d 0a 0a 23 20 54 65 73   $a $b].}..# Tes
28e0: 74 20 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  t for malloc() f
28f0: 61 69 6c 75 72 65 73 20 69 6e 20 73 71 6c 69 74  ailures in sqlit
2900: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
2910: 69 6f 6e 28 29 20 61 6e 64 20 0a 23 20 73 71 6c  ion() and .# sql
2920: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
2930: 61 74 69 6f 6e 31 36 28 29 2e 0a 23 0a 69 66 63  ation16()..#.ifc
2940: 61 70 61 62 6c 65 20 75 74 66 31 36 20 7b 0a 20  apable utf16 {. 
2950: 20 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20   do_malloc_test 
2960: 31 35 20 2d 73 74 61 72 74 20 34 20 2d 74 63 6c  15 -start 4 -tcl
2970: 62 6f 64 79 20 7b 0a 20 20 20 20 64 62 20 63 6f  body {.    db co
2980: 6c 6c 61 74 65 20 73 74 72 69 6e 67 5f 63 6f 6d  llate string_com
2990: 70 61 72 65 20 73 74 72 69 6e 67 5f 63 6f 6d 70  pare string_comp
29a0: 61 72 65 0a 20 20 20 20 69 66 20 7b 5b 63 61 74  are.    if {[cat
29b0: 63 68 20 7b 61 64 64 5f 74 65 73 74 5f 63 6f 6c  ch {add_test_col
29c0: 6c 61 74 65 20 64 62 20 31 20 31 20 31 7d 20 6d  late db 1 1 1} m
29d0: 73 67 5d 7d 20 7b 0a 20 20 20 20 20 20 69 66 20  sg]} {.      if 
29e0: 7b 24 6d 73 67 3d 3d 22 53 51 4c 49 54 45 5f 4e  {$msg=="SQLITE_N
29f0: 4f 4d 45 4d 22 7d 20 7b 73 65 74 20 6d 73 67 20  OMEM"} {set msg 
2a00: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 7d  "out of memory"}
2a10: 0a 20 20 20 20 20 20 65 72 72 6f 72 20 24 6d 73  .      error $ms
2a20: 67 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 64  g.    }.  .    d
2a30: 62 20 63 6f 6d 70 6c 65 74 65 20 7b 53 45 4c 45  b complete {SELE
2a40: 43 54 20 22 68 65 6c 6c 6f 20 22 22 22 7c 7c 27  CT "hello """||'
2a50: 77 6f 72 6c 64 22 27 20 5b 6d 69 63 72 6f 73 6f  world"' [microso
2a60: 66 74 5d 2c 20 2a 20 46 52 4f 4d 20 61 6e 69 63  ft], * FROM anic
2a70: 65 74 61 62 6c 65 3b 7d 0a 20 20 20 20 64 62 20  etable;}.    db 
2a80: 63 6f 6d 70 6c 65 74 65 20 7b 2d 2d 20 55 73 65  complete {-- Use
2a90: 66 75 6c 20 63 6f 6d 6d 65 6e 74 7d 0a 20 20 0a  ful comment}.  .
2aa0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2ab0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2ac0: 20 74 31 28 61 2c 20 62 20 43 4f 4c 4c 41 54 45   t1(a, b COLLATE
2ad0: 20 73 74 72 69 6e 67 5f 63 6f 6d 70 61 72 65 29   string_compare)
2ae0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2af0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 30  NTO t1 VALUES(10
2b00: 2c 20 27 73 74 72 69 6e 67 27 29 3b 0a 20 20 20  , 'string');.   
2b10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2b20: 31 20 56 41 4c 55 45 53 28 31 30 2c 20 27 73 74  1 VALUES(10, 'st
2b30: 72 69 6e 67 32 27 29 3b 0a 20 20 20 20 7d 0a 20  ring2');.    }. 
2b40: 20 7d 0a 7d 0a 0a 23 20 41 6c 73 6f 20 74 65 73   }.}..# Also tes
2b50: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  t sqlite3_comple
2b60: 74 65 28 29 2e 20 54 68 65 72 65 20 61 72 65 20  te(). There are 
2b70: 28 63 75 72 72 65 6e 74 6c 79 29 20 6e 6f 20 6d  (currently) no m
2b80: 61 6c 6c 6f 63 28 29 0a 23 20 63 61 6c 6c 73 20  alloc().# calls 
2b90: 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
2ba0: 2c 20 62 75 74 20 74 65 73 74 20 61 6e 79 77 61  , but test anywa
2bb0: 79 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  y against future
2bc0: 20 63 68 61 6e 67 65 73 2e 0a 23 0a 64 6f 5f 6d   changes..#.do_m
2bd0: 61 6c 6c 6f 63 5f 74 65 73 74 20 31 36 20 2d 74  alloc_test 16 -t
2be0: 63 6c 62 6f 64 79 20 7b 0a 20 20 64 62 20 63 6f  clbody {.  db co
2bf0: 6d 70 6c 65 74 65 20 7b 53 45 4c 45 43 54 20 22  mplete {SELECT "
2c00: 68 65 6c 6c 6f 20 22 22 22 7c 7c 27 77 6f 72 6c  hello """||'worl
2c10: 64 22 27 20 5b 6d 69 63 72 6f 73 6f 66 74 5d 2c  d"' [microsoft],
2c20: 20 2a 20 46 52 4f 4d 20 61 6e 69 63 65 74 61 62   * FROM anicetab
2c30: 6c 65 3b 7d 0a 20 20 64 62 20 63 6f 6d 70 6c 65  le;}.  db comple
2c40: 74 65 20 7b 2d 2d 20 55 73 65 66 75 6c 20 63 6f  te {-- Useful co
2c50: 6d 6d 65 6e 74 7d 0a 20 20 64 62 20 65 76 61 6c  mment}.  db eval
2c60: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
2c70: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2c80: 65 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 20 54 65 73  er;.  }.}..# Tes
2c90: 74 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 6d 61  t handling of ma
2ca0: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
2cb0: 69 6e 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  in sqlite3_open1
2cc0: 36 28 29 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  6()..#.ifcapable
2cd0: 20 75 74 66 31 36 20 7b 0a 20 20 64 6f 5f 6d 61   utf16 {.  do_ma
2ce0: 6c 6c 6f 63 5f 74 65 73 74 20 31 37 20 2d 74 63  lloc_test 17 -tc
2cf0: 6c 62 6f 64 79 20 7b 0a 20 20 20 20 73 65 74 20  lbody {.    set 
2d00: 44 42 32 20 30 0a 20 20 20 20 73 65 74 20 53 54  DB2 0.    set ST
2d10: 4d 54 20 30 0a 20 20 0a 20 20 20 20 23 20 6f 70  MT 0.  .    # op
2d20: 65 6e 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  en database usin
2d30: 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  g sqlite3_open16
2d40: 28 29 0a 20 20 20 20 73 65 74 20 66 69 6c 65 6e  ().    set filen
2d50: 61 6d 65 20 5b 65 6e 63 6f 64 69 6e 67 20 63 6f  ame [encoding co
2d60: 6e 76 65 72 74 74 6f 20 75 6e 69 63 6f 64 65 20  nvertto unicode 
2d70: 74 65 73 74 2e 64 62 5d 0a 20 20 20 20 61 70 70  test.db].    app
2d80: 65 6e 64 20 66 69 6c 65 6e 61 6d 65 20 22 5c 78  end filename "\x
2d90: 30 30 5c 78 30 30 22 0a 20 20 20 20 73 65 74 20  00\x00".    set 
2da0: 44 42 32 20 5b 73 71 6c 69 74 65 33 5f 6f 70 65  DB2 [sqlite3_ope
2db0: 6e 31 36 20 24 66 69 6c 65 6e 61 6d 65 20 2d 75  n16 $filename -u
2dc0: 6e 75 73 65 64 5d 0a 20 20 20 20 69 66 20 7b 30  nused].    if {0
2dd0: 3d 3d 24 44 42 32 7d 20 7b 0a 20 20 20 20 20 20  ==$DB2} {.      
2de0: 65 72 72 6f 72 20 22 6f 75 74 20 6f 66 20 6d 65  error "out of me
2df0: 6d 6f 72 79 22 0a 20 20 20 20 7d 0a 20 20 20 20  mory".    }.    
2e00: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
2e10: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 24 44  _result_codes $D
2e20: 42 32 20 31 0a 20 20 0a 20 20 20 20 23 20 50 72  B2 1.  .    # Pr
2e30: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 0a  epare statement.
2e40: 20 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63      set rc [catc
2e50: 68 20 7b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  h {sqlite3_prepa
2e60: 72 65 20 24 44 42 32 20 7b 53 45 4c 45 43 54 20  re $DB2 {SELECT 
2e70: 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
2e80: 73 74 65 72 7d 20 2d 31 20 58 7d 20 6d 73 67 5d  ster} -1 X} msg]
2e90: 0a 20 20 20 20 69 66 20 7b 5b 73 71 6c 69 74 65  .    if {[sqlite
2ea0: 33 5f 65 72 72 63 6f 64 65 20 24 44 42 32 5d 20  3_errcode $DB2] 
2eb0: 65 71 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52  eq "SQLITE_IOERR
2ec0: 2b 31 32 22 7d 20 7b 0a 20 20 20 20 20 20 65 72  +12"} {.      er
2ed0: 72 6f 72 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror "out of memo
2ee0: 72 79 22 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ry".    }.    if
2ef0: 20 7b 5b 72 65 67 65 78 70 20 22 2e 2a 61 75 74   {[regexp ".*aut
2f00: 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
2f10: 20 6c 6f 61 64 69 6e 67 2e 2a 22 20 5b 73 71 6c   loading.*" [sql
2f20: 69 74 65 33 5f 65 72 72 6d 73 67 20 24 44 42 32  ite3_errmsg $DB2
2f30: 5d 5d 7d 20 7b 0a 20 20 20 20 20 20 65 72 72 6f  ]]} {.      erro
2f40: 72 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r "out of memory
2f50: 22 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b  ".    }.    if {
2f60: 24 72 63 7d 20 7b 0a 20 20 20 20 20 20 65 72 72  $rc} {.      err
2f70: 6f 72 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  or [string range
2f80: 20 24 6d 73 67 20 34 20 65 6e 64 5d 0a 20 20 20   $msg 4 end].   
2f90: 20 7d 0a 20 20 20 20 73 65 74 20 53 54 4d 54 20   }.    set STMT 
2fa0: 24 6d 73 67 0a 20 20 0a 20 20 20 20 23 20 46 69  $msg.  .    # Fi
2fb0: 6e 61 6c 69 7a 65 20 73 74 61 74 65 6d 65 6e 74  nalize statement
2fc0: 0a 20 20 20 20 73 65 74 20 72 63 20 5b 73 71 6c  .    set rc [sql
2fd0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53  ite3_finalize $S
2fe0: 54 4d 54 5d 0a 20 20 20 20 69 66 20 7b 24 72 63  TMT].    if {$rc
2ff0: 21 3d 22 53 51 4c 49 54 45 5f 4f 4b 22 7d 20 7b  !="SQLITE_OK"} {
3000: 0a 20 20 20 20 20 20 65 72 72 6f 72 20 5b 73 71  .      error [sq
3010: 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 24 44 42  lite3_errmsg $DB
3020: 32 5d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  2].    }.    set
3030: 20 53 54 4d 54 20 30 0a 20 20 0a 20 20 20 20 23   STMT 0.  .    #
3040: 20 43 6c 6f 73 65 20 64 61 74 61 62 61 73 65 0a   Close database.
3050: 20 20 20 20 73 65 74 20 72 63 20 5b 73 71 6c 69      set rc [sqli
3060: 74 65 33 5f 63 6c 6f 73 65 20 24 44 42 32 5d 0a  te3_close $DB2].
3070: 20 20 20 20 69 66 20 7b 24 72 63 21 3d 22 53 51      if {$rc!="SQ
3080: 4c 49 54 45 5f 4f 4b 22 7d 20 7b 0a 20 20 20 20  LITE_OK"} {.    
3090: 20 20 65 72 72 6f 72 20 5b 73 71 6c 69 74 65 33    error [sqlite3
30a0: 5f 65 72 72 6d 73 67 20 24 44 42 32 5d 0a 20 20  _errmsg $DB2].  
30b0: 20 20 7d 0a 20 20 20 20 73 65 74 20 44 42 32 20    }.    set DB2 
30c0: 30 0a 20 20 7d 20 2d 63 6c 65 61 6e 75 70 20 7b  0.  } -cleanup {
30d0: 0a 20 20 20 20 69 66 20 7b 24 53 54 4d 54 21 3d  .    if {$STMT!=
30e0: 22 30 22 7d 20 7b 0a 20 20 20 20 20 20 73 71 6c  "0"} {.      sql
30f0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53  ite3_finalize $S
3100: 54 4d 54 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  TMT.    }.    if
3110: 20 7b 24 44 42 32 21 3d 22 30 22 7d 20 7b 0a 20   {$DB2!="0"} {. 
3120: 20 20 20 20 20 73 65 74 20 72 63 20 5b 73 71 6c       set rc [sql
3130: 69 74 65 33 5f 63 6c 6f 73 65 20 24 44 42 32 5d  ite3_close $DB2]
3140: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 20  .    }.  }.}..# 
3150: 54 65 73 74 20 68 61 6e 64 6c 69 6e 67 20 6f 66  Test handling of
3160: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
3170: 65 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 65 72  es in sqlite3_er
3180: 72 6d 73 67 31 36 28 29 2e 0a 23 0a 69 66 63 61  rmsg16()..#.ifca
3190: 70 61 62 6c 65 20 75 74 66 31 36 20 7b 0a 20 20  pable utf16 {.  
31a0: 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 31  do_malloc_test 1
31b0: 38 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 20  8 -tclprep {.   
31c0: 20 63 61 74 63 68 20 7b 0a 20 20 20 20 20 20 64   catch {.      d
31d0: 62 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 5b  b eval "SELECT [
31e0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 6c 6f  string repeat lo
31f0: 6e 67 63 6f 6c 75 6d 6e 6e 61 6d 65 20 31 30 5d  ngcolumnname 10]
3200: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
3210: 74 65 72 22 0a 20 20 20 20 7d 0a 20 20 7d 20 2d  ter".    }.  } -
3220: 74 63 6c 62 6f 64 79 20 7b 0a 20 20 20 20 73 65  tclbody {.    se
3230: 74 20 75 74 66 31 36 20 5b 73 71 6c 69 74 65 33  t utf16 [sqlite3
3240: 5f 65 72 72 6d 73 67 31 36 20 5b 73 71 6c 69 74  _errmsg16 [sqlit
3250: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
3260: 69 6e 74 65 72 20 64 62 5d 5d 0a 20 20 20 20 62  inter db]].    b
3270: 69 6e 61 72 79 20 73 63 61 6e 20 24 75 74 66 31  inary scan $utf1
3280: 36 20 63 2a 20 62 79 74 65 73 0a 20 20 20 20 69  6 c* bytes.    i
3290: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 79 74  f {[llength $byt
32a0: 65 73 5d 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20  es]==0} {.      
32b0: 65 72 72 6f 72 20 22 6f 75 74 20 6f 66 20 6d 65  error "out of me
32c0: 6d 6f 72 79 22 0a 20 20 20 20 7d 0a 20 20 7d 0a  mory".    }.  }.
32d0: 7d 0a 0a 23 20 54 68 69 73 20 74 65 73 74 20 69  }..# This test i
32e0: 73 20 61 69 6d 65 64 20 61 74 20 63 6f 76 65 72  s aimed at cover
32f0: 61 67 65 20 74 65 73 74 69 6e 67 2e 20 53 70 65  age testing. Spe
3300: 63 69 66 69 63 6c 79 2c 20 69 74 20 69 73 20 73  cificly, it is s
3310: 75 70 70 6f 73 65 64 20 74 6f 0a 23 20 63 61 75  upposed to.# cau
3320: 73 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 6e  se a malloc() on
3330: 6c 79 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6e  ly used when con
3340: 76 65 72 74 69 6e 67 20 62 65 74 77 65 65 6e 20  verting between 
3350: 74 68 65 20 74 77 6f 20 75 74 66 2d 31 36 20 0a  the two utf-16 .
3360: 23 20 65 6e 63 6f 64 69 6e 67 73 20 74 6f 20 66  # encodings to f
3370: 61 69 6c 20 28 69 2e 65 2e 20 6c 69 74 74 6c 65  ail (i.e. little
3380: 2d 65 6e 64 69 61 6e 2d 3e 62 69 67 2d 65 6e 64  -endian->big-end
3390: 69 61 6e 29 2e 20 49 74 20 6f 6e 6c 79 20 61 63  ian). It only ac
33a0: 74 75 61 6c 6c 79 20 0a 23 20 68 69 74 73 20 74  tually .# hits t
33b0: 68 69 73 20 6d 61 6c 6c 6f 63 28 29 20 6f 6e 20  his malloc() on 
33c0: 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 68 6f  little-endian ho
33d0: 73 74 73 2e 0a 23 0a 73 65 74 20 73 74 61 74 69  sts..#.set stati
33e0: 63 5f 73 74 72 69 6e 67 20 22 5c 78 30 30 68 5c  c_string "\x00h\
33f0: 78 30 30 65 5c 78 30 30 6c 5c 78 30 30 6c 5c 78  x00e\x00l\x00l\x
3400: 30 30 6f 22 0a 66 6f 72 20 7b 73 65 74 20 6c 20  00o".for {set l 
3410: 30 7d 20 7b 24 6c 3c 31 30 7d 20 7b 69 6e 63 72  0} {$l<10} {incr
3420: 20 6c 7d 20 7b 0a 20 20 61 70 70 65 6e 64 20 73   l} {.  append s
3430: 74 61 74 69 63 5f 73 74 72 69 6e 67 20 24 73 74  tatic_string $st
3440: 61 74 69 63 5f 73 74 72 69 6e 67 0a 7d 0a 61 70  atic_string.}.ap
3450: 70 65 6e 64 20 73 74 61 74 69 63 5f 73 74 72 69  pend static_stri
3460: 6e 67 20 22 5c 78 30 30 5c 78 30 30 22 0a 64 6f  ng "\x00\x00".do
3470: 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 31 39 20  _malloc_test 19 
3480: 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 65 78 65  -tclprep {.  exe
3490: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
34a0: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 55 54  A encoding = "UT
34b0: 46 31 36 62 65 22 3b 0a 20 20 20 20 43 52 45 41  F16be";.    CREA
34c0: 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20  TE TABLE abc(a, 
34d0: 62 2c 20 63 29 3b 0a 20 20 7d 0a 7d 20 2d 74 63  b, c);.  }.} -tc
34e0: 6c 62 6f 64 79 20 7b 0a 20 20 75 6e 73 65 74 20  lbody {.  unset 
34f0: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 53 54  -nocomplain ::ST
3500: 4d 54 0a 20 20 73 65 74 20 72 20 5b 63 61 74 63  MT.  set r [catc
3510: 68 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 53 54  h {.    set ::ST
3520: 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  MT [sqlite3_prep
3530: 61 72 65 20 64 62 20 7b 53 45 4c 45 43 54 20 3f  are db {SELECT ?
3540: 7d 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 20 20  } -1 DUMMY].    
3550: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
3560: 74 31 36 20 2d 73 74 61 74 69 63 20 24 3a 3a 53  t16 -static $::S
3570: 54 4d 54 20 31 20 24 73 74 61 74 69 63 5f 73 74  TMT 1 $static_st
3580: 72 69 6e 67 20 31 31 32 0a 20 20 7d 20 6d 73 67  ring 112.  } msg
3590: 5d 0a 20 20 69 66 20 7b 24 72 7d 20 7b 65 72 72  ].  if {$r} {err
35a0: 6f 72 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  or [string range
35b0: 20 24 6d 73 67 20 34 20 65 6e 64 5d 7d 0a 20 20   $msg 4 end]}.  
35c0: 73 65 74 20 6d 73 67 0a 7d 20 2d 63 6c 65 61 6e  set msg.} -clean
35d0: 75 70 20 7b 0a 20 20 69 66 20 7b 5b 69 6e 66 6f  up {.  if {[info
35e0: 20 65 78 69 73 74 73 20 3a 3a 53 54 4d 54 5d 7d   exists ::STMT]}
35f0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   {.    sqlite3_f
3600: 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54 0a  inalize $::STMT.
3610: 20 20 7d 0a 7d 0a 75 6e 73 65 74 20 73 74 61 74    }.}.unset stat
3620: 69 63 5f 73 74 72 69 6e 67 0a 0a 23 20 4d 61 6b  ic_string..# Mak
3630: 65 20 73 75 72 65 20 53 51 4c 49 54 45 5f 4e 4f  e sure SQLITE_NO
3640: 4d 45 4d 20 69 73 20 72 65 70 6f 72 74 65 64 20  MEM is reported 
3650: 6f 75 74 20 6f 6e 20 61 6e 20 41 54 54 41 43 48  out on an ATTACH
3660: 20 66 61 69 6c 75 72 65 20 65 76 65 6e 0a 23 20   failure even.# 
3670: 77 68 65 6e 20 74 68 65 20 6d 61 6c 6c 6f 63 20  when the malloc 
3680: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
3690: 69 74 68 69 6e 20 74 68 65 20 6e 65 73 74 65 64  ithin the nested
36a0: 20 70 61 72 73 65 2e 0a 23 0a 69 66 63 61 70 61   parse..#.ifcapa
36b0: 62 6c 65 20 61 74 74 61 63 68 20 7b 0a 20 20 64  ble attach {.  d
36c0: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 32 30  o_malloc_test 20
36d0: 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 20 20   -tclprep {.    
36e0: 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 66 6f 72  db close.    for
36f0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64  cedelete test2.d
3700: 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e  b test2.db-journ
3710: 61 6c 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  al.    sqlite3 d
3720: 62 20 74 65 73 74 32 2e 64 62 0a 20 20 20 20 73  b test2.db.    s
3730: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
3740: 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 64 62 20  result_codes db 
3750: 31 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 43  1.    db eval {C
3760: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
3770: 29 3b 7d 0a 20 20 20 20 64 62 20 63 6c 6f 73 65  );}.    db close
3780: 0a 20 20 7d 20 2d 74 63 6c 62 6f 64 79 20 7b 0a  .  } -tclbody {.
3790: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
37a0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
37b0: 64 62 7d 5d 7d 20 7b 0a 20 20 20 20 20 20 65 72  db}]} {.      er
37c0: 72 6f 72 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror "out of memo
37d0: 72 79 22 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ry".    }.    sq
37e0: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
37f0: 65 73 75 6c 74 5f 63 6f 64 65 73 20 64 62 20 31  esult_codes db 1
3800: 0a 20 20 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a  .  } -sqlbody {.
3810: 20 20 20 20 41 54 54 41 43 48 20 44 41 54 41 42      ATTACH DATAB
3820: 41 53 45 20 27 74 65 73 74 32 2e 64 62 27 20 41  ASE 'test2.db' A
3830: 53 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54  S t2;.    SELECT
3840: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
3850: 44 45 54 41 43 48 20 44 41 54 41 42 41 53 45 20  DETACH DATABASE 
3860: 74 32 3b 0a 20 20 7d 20 0a 7d 0a 0a 23 20 54 65  t2;.  } .}..# Te
3870: 73 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  st malloc failur
3880: 65 20 77 68 69 6c 73 74 20 69 6e 73 74 61 6c 6c  e whilst install
3890: 69 6e 67 20 61 20 66 6f 72 65 69 67 6e 20 6b 65  ing a foreign ke
38a0: 79 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 66  y..#.ifcapable f
38b0: 6f 72 65 69 67 6e 6b 65 79 20 7b 0a 20 20 64 6f  oreignkey {.  do
38c0: 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 32 31 20  _malloc_test 21 
38d0: 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 20 20 20 43  -sqlbody {.    C
38e0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28  REATE TABLE abc(
38f0: 61 2c 20 62 2c 20 63 2c 20 46 4f 52 45 49 47 4e  a, b, c, FOREIGN
3900: 20 4b 45 59 28 61 29 20 52 45 46 45 52 45 4e 43   KEY(a) REFERENC
3910: 45 53 20 61 62 63 28 62 29 29 0a 20 20 7d 20 0a  ES abc(b)).  } .
3920: 7d 0a 0a 23 20 54 65 73 74 20 6d 61 6c 6c 6f 63  }..# Test malloc
3930: 20 66 61 69 6c 75 72 65 20 69 6e 20 61 6e 20 73   failure in an s
3940: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
3950: 32 28 29 20 63 61 6c 6c 2e 0a 23 0a 64 6f 5f 6d  2() call..#.do_m
3960: 61 6c 6c 6f 63 5f 74 65 73 74 20 32 32 20 2d 74  alloc_test 22 -t
3970: 63 6c 62 6f 64 79 20 7b 0a 20 20 73 65 74 20 3a  clbody {.  set :
3980: 3a 53 54 4d 54 20 22 22 0a 20 20 73 65 74 20 72  :STMT "".  set r
3990: 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 73 65   [catch {.    se
39a0: 74 20 3a 3a 53 54 4d 54 20 5b 0a 20 20 20 20 20  t ::STMT [.     
39b0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
39c0: 5f 76 32 20 64 62 20 22 53 45 4c 45 43 54 20 2a  _v2 db "SELECT *
39d0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
39e0: 74 65 72 22 20 2d 31 20 44 55 4d 4d 59 0a 20 20  ter" -1 DUMMY.  
39f0: 20 20 5d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 69    ].  } msg].  i
3a00: 66 20 7b 24 72 7d 20 7b 65 72 72 6f 72 20 5b 73  f {$r} {error [s
3a10: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6d 73 67  tring range $msg
3a20: 20 34 20 65 6e 64 5d 7d 0a 7d 20 2d 63 6c 65 61   4 end]}.} -clea
3a30: 6e 75 70 20 7b 0a 20 20 69 66 20 7b 24 3a 3a 53  nup {.  if {$::S
3a40: 54 4d 54 20 6e 65 20 22 22 7d 20 7b 0a 20 20 20  TMT ne ""} {.   
3a50: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
3a60: 65 20 24 3a 3a 53 54 4d 54 0a 20 20 20 20 73 65  e $::STMT.    se
3a70: 74 20 3a 3a 53 54 4d 54 20 22 22 0a 20 20 7d 0a  t ::STMT "".  }.
3a80: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 7b 70 61  }..ifcapable {pa
3a90: 67 65 72 5f 70 72 61 67 6d 61 73 7d 20 7b 0a 20  ger_pragmas} {. 
3aa0: 20 23 20 54 68 69 73 20 74 65 73 74 73 20 61 20   # This tests a 
3ab0: 73 70 65 63 69 61 6c 20 63 61 73 65 20 2d 20 74  special case - t
3ac0: 68 61 74 20 61 6e 20 65 72 72 6f 72 20 74 68 61  hat an error tha
3ad0: 74 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  t occurs while t
3ae0: 68 65 20 70 61 67 65 72 0a 20 20 23 20 69 73 20  he pager.  # is 
3af0: 74 72 79 69 6e 67 20 74 6f 20 72 65 63 6f 76 65  trying to recove
3b00: 72 20 66 72 6f 6d 20 65 72 72 6f 72 2d 73 74 61  r from error-sta
3b10: 74 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  te in exclusive-
3b20: 61 63 63 65 73 73 20 6d 6f 64 65 20 77 6f 72 6b  access mode work
3b30: 73 2e 0a 20 20 23 0a 20 20 64 6f 5f 6d 61 6c 6c  s..  #.  do_mall
3b40: 6f 63 5f 74 65 73 74 20 32 33 20 2d 74 63 6c 70  oc_test 23 -tclp
3b50: 72 65 70 20 7b 0a 20 20 20 20 64 62 20 65 76 61  rep {.    db eva
3b60: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
3b70: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
3b80: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c  ;.      PRAGMA l
3b90: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78  ocking_mode = ex
3ba0: 63 6c 75 73 69 76 65 3b 0a 20 20 20 20 20 20 42  clusive;.      B
3bb0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
3bc0: 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20  TE TABLE abc(a, 
3bd0: 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52 45  b, c);.      CRE
3be0: 41 54 45 20 49 4e 44 45 58 20 61 62 63 5f 69 20  ATE INDEX abc_i 
3bf0: 4f 4e 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b  ON abc(a, b, c);
3c00: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3c10: 54 4f 20 61 62 63 20 0a 20 20 20 20 20 20 20 20  TO abc .        
3c20: 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28 31  VALUES(randstr(1
3c30: 30 30 2c 31 30 30 29 2c 20 72 61 6e 64 73 74 72  00,100), randstr
3c40: 28 31 30 30 2c 31 30 30 29 2c 20 72 61 6e 64 73  (100,100), rands
3c50: 74 72 28 31 30 30 2c 31 30 30 29 29 3b 0a 20 20  tr(100,100));.  
3c60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3c70: 61 62 63 20 0a 20 20 20 20 20 20 20 20 53 45 4c  abc .        SEL
3c80: 45 43 54 20 72 61 6e 64 73 74 72 28 31 30 30 2c  ECT randstr(100,
3c90: 31 30 30 29 2c 20 72 61 6e 64 73 74 72 28 31 30  100), randstr(10
3ca0: 30 2c 31 30 30 29 2c 20 72 61 6e 64 73 74 72 28  0,100), randstr(
3cb0: 31 30 30 2c 31 30 30 29 20 46 52 4f 4d 20 61 62  100,100) FROM ab
3cc0: 63 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  c;.      INSERT 
3cd0: 49 4e 54 4f 20 61 62 63 20 0a 20 20 20 20 20 20  INTO abc .      
3ce0: 20 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72    SELECT randstr
3cf0: 28 31 30 30 2c 31 30 30 29 2c 20 72 61 6e 64 73  (100,100), rands
3d00: 74 72 28 31 30 30 2c 31 30 30 29 2c 20 72 61 6e  tr(100,100), ran
3d10: 64 73 74 72 28 31 30 30 2c 31 30 30 29 20 46 52  dstr(100,100) FR
3d20: 4f 4d 20 61 62 63 3b 0a 20 20 20 20 20 20 49 4e  OM abc;.      IN
3d30: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 0a 20  SERT INTO abc . 
3d40: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 61         SELECT ra
3d50: 6e 64 73 74 72 28 31 30 30 2c 31 30 30 29 2c 20  ndstr(100,100), 
3d60: 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30 30 29  randstr(100,100)
3d70: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30  , randstr(100,10
3d80: 30 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20  0) FROM abc;.   
3d90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
3da0: 62 63 20 0a 20 20 20 20 20 20 20 20 53 45 4c 45  bc .        SELE
3db0: 43 54 20 72 61 6e 64 73 74 72 28 31 30 30 2c 31  CT randstr(100,1
3dc0: 30 30 29 2c 20 72 61 6e 64 73 74 72 28 31 30 30  00), randstr(100
3dd0: 2c 31 30 30 29 2c 20 72 61 6e 64 73 74 72 28 31  ,100), randstr(1
3de0: 30 30 2c 31 30 30 29 20 46 52 4f 4d 20 61 62 63  00,100) FROM abc
3df0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3e00: 4e 54 4f 20 61 62 63 20 0a 20 20 20 20 20 20 20  NTO abc .       
3e10: 20 53 45 4c 45 43 54 20 72 61 6e 64 73 74 72 28   SELECT randstr(
3e20: 31 30 30 2c 31 30 30 29 2c 20 72 61 6e 64 73 74  100,100), randst
3e30: 72 28 31 30 30 2c 31 30 30 29 2c 20 72 61 6e 64  r(100,100), rand
3e40: 73 74 72 28 31 30 30 2c 31 30 30 29 20 46 52 4f  str(100,100) FRO
3e50: 4d 20 61 62 63 3b 0a 20 20 20 20 20 20 43 4f 4d  M abc;.      COM
3e60: 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  MIT;.    }.  .  
3e70: 20 20 23 20 54 68 69 73 20 70 75 74 73 20 74 68    # This puts th
3e80: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 65 72 72  e pager into err
3e90: 6f 72 20 73 74 61 74 65 2e 0a 20 20 20 20 23 0a  or state..    #.
3ea0: 20 20 20 20 64 62 20 65 76 61 6c 20 42 45 47 49      db eval BEGI
3eb0: 4e 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 55  N.    db eval {U
3ec0: 50 44 41 54 45 20 61 62 63 20 53 45 54 20 61 20  PDATE abc SET a 
3ed0: 3d 20 30 20 57 48 45 52 45 20 6f 69 64 25 32 7d  = 0 WHERE oid%2}
3ee0: 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  .    set ::sqlit
3ef0: 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  e_io_error_pendi
3f00: 6e 67 20 31 30 0a 20 20 20 20 63 61 74 63 68 20  ng 10.    catch 
3f10: 7b 64 62 20 65 76 61 6c 20 7b 52 4f 4c 4c 42 41  {db eval {ROLLBA
3f20: 43 4b 7d 7d 20 6d 73 67 0a 0a 20 20 7d 20 2d 74  CK}} msg..  } -t
3f30: 63 6c 62 6f 64 79 20 7b 0a 20 20 20 20 23 20 49  clbody {.    # I
3f40: 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  f an out-of-memo
3f50: 72 79 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ry occurs within
3f60: 20 61 20 63 61 6c 6c 20 74 6f 20 61 20 56 46 53   a call to a VFS
3f70: 20 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e 20   layer function 
3f80: 64 75 72 69 6e 67 0a 20 20 20 20 23 20 68 6f 74  during.    # hot
3f90: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
3fa0: 6b 2c 20 73 71 6c 69 74 65 20 77 69 6c 6c 20 72  k, sqlite will r
3fb0: 65 70 6f 72 74 20 53 51 4c 49 54 45 5f 43 4f 52  eport SQLITE_COR
3fc0: 52 55 50 54 2e 20 53 65 65 20 63 6f 6d 6d 69 74  RUPT. See commit
3fd0: 0a 20 20 20 20 23 20 5b 35 36 36 38 5d 20 66 6f  .    # [5668] fo
3fe0: 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 73  r details..    s
3ff0: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 64 62  et rc [catch {db
4000: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a   eval { SELECT *
4010: 20 46 52 4f 4d 20 61 62 63 20 4c 49 4d 49 54 20   FROM abc LIMIT 
4020: 31 30 20 7d 7d 20 6d 73 67 5d 0a 20 20 20 20 69  10 }} msg].    i
4030: 66 20 7b 24 6d 73 67 20 65 71 20 22 64 61 74 61  f {$msg eq "data
4040: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
4050: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 7d 20 7b  is malformed"} {
4060: 20 73 65 74 20 6d 73 67 20 22 6f 75 74 20 6f 66   set msg "out of
4070: 20 6d 65 6d 6f 72 79 22 20 7d 0a 20 20 20 20 69   memory" }.    i
4080: 66 20 7b 24 72 63 7d 20 7b 20 65 72 72 6f 72 20  f {$rc} { error 
4090: 24 6d 73 67 20 7d 0a 20 20 20 20 73 65 74 20 6d  $msg }.    set m
40a0: 73 67 0a 20 20 7d 20 2d 63 6c 65 61 6e 75 70 20  sg.  } -cleanup 
40b0: 7b 0a 20 20 20 20 73 65 74 20 65 20 5b 64 62 20  {.    set e [db 
40c0: 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74  eval {PRAGMA int
40d0: 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 5d 0a 20  egrity_check}]. 
40e0: 20 20 20 69 66 20 7b 24 65 20 6e 65 20 22 6f 6b     if {$e ne "ok
40f0: 22 7d 20 7b 65 72 72 6f 72 20 24 65 7d 0a 20 20  "} {error $e}.  
4100: 7d 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 63  }.}..ifcapable c
4110: 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 64 6f 5f 6d  ompound {.  do_m
4120: 61 6c 6c 6f 63 5f 74 65 73 74 20 32 34 20 2d 73  alloc_test 24 -s
4130: 71 6c 70 72 65 70 20 7b 0a 20 20 20 20 43 52 45  qlprep {.    CRE
4140: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
4150: 62 2c 20 63 29 0a 20 20 7d 20 2d 73 71 6c 62 6f  b, c).  } -sqlbo
4160: 64 79 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  dy {.    SELECT 
4170: 31 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  1 FROM t1 UNION 
4180: 53 45 4c 45 43 54 20 32 20 46 52 4f 4d 20 74 31  SELECT 2 FROM t1
4190: 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a   ORDER BY 1.  }.
41a0: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 76 69 65  }..ifcapable vie
41b0: 77 26 26 74 72 69 67 67 65 72 20 7b 0a 20 20 64  w&&trigger {.  d
41c0: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 32 35  o_malloc_test 25
41d0: 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20 20 20 20   -sqlprep {.    
41e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
41f0: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52  a, b, c);.    CR
4200: 45 41 54 45 20 56 49 45 57 20 76 31 20 41 53 20  EATE VIEW v1 AS 
4210: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4220: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
4230: 47 47 45 52 20 76 31 74 31 20 49 4e 53 54 45 41  GGER v1t1 INSTEA
4240: 44 20 4f 46 20 44 45 4c 45 54 45 20 4f 4e 20 76  D OF DELETE ON v
4250: 31 20 42 45 47 49 4e 20 53 45 4c 45 43 54 20 31  1 BEGIN SELECT 1
4260: 3b 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54  ; END;.    CREAT
4270: 45 20 54 52 49 47 47 45 52 20 76 31 74 32 20 49  E TRIGGER v1t2 I
4280: 4e 53 54 45 41 44 20 4f 46 20 49 4e 53 45 52 54  NSTEAD OF INSERT
4290: 20 4f 4e 20 76 31 20 42 45 47 49 4e 20 53 45 4c   ON v1 BEGIN SEL
42a0: 45 43 54 20 31 3b 20 45 4e 44 3b 0a 20 20 20 20  ECT 1; END;.    
42b0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 76  CREATE TRIGGER v
42c0: 31 74 33 20 49 4e 53 54 45 41 44 20 4f 46 20 55  1t3 INSTEAD OF U
42d0: 50 44 41 54 45 20 4f 4e 20 76 31 20 42 45 47 49  PDATE ON v1 BEGI
42e0: 4e 20 53 45 4c 45 43 54 20 31 3b 20 45 4e 44 3b  N SELECT 1; END;
42f0: 0a 20 20 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a  .  } -sqlbody {.
4300: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
4310: 76 31 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  v1 WHERE a = 1;.
4320: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4330: 76 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  v1 VALUES(1, 2, 
4340: 33 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20 76  3);.    UPDATE v
4350: 31 20 53 45 54 20 61 20 3d 20 31 20 57 48 45 52  1 SET a = 1 WHER
4360: 45 20 62 20 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a  E b = 2;.  }.}..
4370: 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 32  do_malloc_test 2
4380: 35 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20 20 43  5 -sqlprep {.  C
4390: 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28  REATE TABLE abc(
43a0: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41  a, b, c);.  CREA
43b0: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 61  TE INDEX i1 ON a
43c0: 62 63 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45  bc(a, b);.  INSE
43d0: 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55  RT INTO abc VALU
43e0: 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 49  ES(1, 2, 3);.  I
43f0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
4400: 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a  ALUES(4, 5, 6);.
4410: 7d 20 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20 23  } -tclbody {.  #
4420: 20 46 6f 72 20 65 61 63 68 20 55 50 44 41 54 45   For each UPDATE
4430: 20 65 78 65 63 75 74 65 64 2c 20 74 68 65 20 63   executed, the c
4440: 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74  ursor used for t
4450: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
4460: 65 6e 74 0a 20 20 23 20 6d 75 73 74 20 62 65 20  ent.  # must be 
4470: 22 73 61 76 65 64 22 2e 20 42 65 63 61 75 73 65  "saved". Because
4480: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
4490: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c  pen on an index,
44a0: 20 74 68 69 73 20 72 65 71 75 69 72 65 73 0a 20   this requires. 
44b0: 20 23 20 61 20 6d 61 6c 6c 6f 63 28 29 20 74 6f   # a malloc() to
44c0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
44d0: 74 6f 20 73 61 76 65 20 74 68 65 20 69 6e 64 65  to save the inde
44e0: 78 20 6b 65 79 2e 20 54 68 69 73 20 74 65 73 74  x key. This test
44f0: 20 63 61 73 65 20 69 73 0a 20 20 23 20 61 69 6d   case is.  # aim
4500: 65 64 20 61 74 20 74 65 73 74 69 6e 67 20 74 68  ed at testing th
4510: 65 20 72 65 73 70 6f 6e 73 65 20 6f 66 20 74 68  e response of th
4520: 65 20 6c 69 62 72 61 72 79 20 74 6f 20 61 20 66  e library to a f
4530: 61 69 6c 75 72 65 20 69 6e 20 74 68 61 74 0a 20  ailure in that. 
4540: 20 23 20 70 61 72 74 69 63 75 6c 61 72 20 6d 61   # particular ma
4550: 6c 6c 6f 63 28 29 20 63 61 6c 6c 2e 0a 20 20 64  lloc() call..  d
4560: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 61  b eval {SELECT a
4570: 20 46 52 4f 4d 20 61 62 63 20 4f 52 44 45 52 20   FROM abc ORDER 
4580: 42 59 20 61 7d 20 7b 0a 20 20 20 20 64 62 20 65  BY a} {.    db e
4590: 76 61 6c 20 7b 55 50 44 41 54 45 20 61 62 63 20  val {UPDATE abc 
45a0: 53 45 54 20 62 20 3d 20 62 20 2d 20 31 20 57 48  SET b = b - 1 WH
45b0: 45 52 45 20 61 20 3d 20 24 61 7d 0a 20 20 7d 0a  ERE a = $a}.  }.
45c0: 7d 0a 0a 23 20 54 68 69 73 20 74 65 73 74 20 69  }..# This test i
45d0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 74 65  s designed to te
45e0: 73 74 20 61 20 73 70 65 63 69 66 69 63 20 6a 75  st a specific ju
45f0: 6e 63 74 75 72 65 20 69 6e 20 74 68 65 20 73 71  ncture in the sq
4600: 6c 69 74 65 20 63 6f 64 65 2e 0a 23 20 54 68 65  lite code..# The
4610: 20 64 61 74 61 62 61 73 65 20 73 65 74 20 75 70   database set up
4620: 20 62 79 20 2d 73 71 6c 70 72 65 70 20 73 63 72   by -sqlprep scr
4630: 69 70 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ipt contains a s
4640: 69 6e 67 6c 65 20 74 61 62 6c 65 20 42 2d 54 72  ingle table B-Tr
4650: 65 65 0a 23 20 6f 66 20 68 65 69 67 68 74 20 32  ee.# of height 2
4660: 2e 20 49 6e 20 74 68 65 20 2d 74 63 6c 62 6f 64  . In the -tclbod
4670: 79 20 73 63 72 69 70 74 2c 20 74 68 65 20 65 78  y script, the ex
4680: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
4690: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 23 20 69 73 20  connection.# is 
46a0: 63 6c 6f 73 65 64 20 61 6e 64 20 61 20 6e 65 77  closed and a new
46b0: 20 6f 6e 65 20 6f 70 65 6e 65 64 20 61 6e 64 20   one opened and 
46c0: 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 61  used to insert a
46d0: 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74 68   new row into th
46e0: 65 0a 23 20 74 61 62 6c 65 20 42 2d 54 72 65 65  e.# table B-Tree
46f0: 2e 20 42 79 20 75 73 69 6e 67 20 61 20 6e 65 77  . By using a new
4700: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74 68 65   connection, the
4710: 20 6f 75 74 63 6f 6d 65 20 6f 66 20 61 20 6d 61   outcome of a ma
4720: 6c 6c 6f 63 28 29 20 0a 23 20 66 61 69 6c 75 72  lloc() .# failur
4730: 65 20 77 68 69 6c 65 20 73 65 65 6b 69 6e 67 20  e while seeking 
4740: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
4750: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 42 2d  d side of the B-
4760: 54 72 65 65 20 74 6f 20 69 6e 73 65 72 74 20 0a  Tree to insert .
4770: 23 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 63  # a new record c
4780: 61 6e 20 62 65 20 74 65 73 74 65 64 2e 0a 23 0a  an be tested..#.
4790: 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 32  do_malloc_test 2
47a0: 36 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20 20 42  6 -sqlprep {.  B
47b0: 45 47 49 4e 3b 0a 20 20 43 52 45 41 54 45 20 54  EGIN;.  CREATE T
47c0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
47d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
47e0: 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d  VALUES(1, random
47f0: 62 6c 6f 62 28 32 31 30 29 29 3b 0a 20 20 49 4e  blob(210));.  IN
4800: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4810: 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(1, randomblo
4820: 62 28 32 31 30 29 29 3b 0a 20 20 49 4e 53 45 52  b(210));.  INSER
4830: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4840: 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  (1, randomblob(2
4850: 31 30 29 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  10));.  INSERT I
4860: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
4870: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 31 30 29   randomblob(210)
4880: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
4890: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61   t1 VALUES(1, ra
48a0: 6e 64 6f 6d 62 6c 6f 62 28 32 31 30 29 29 3b 0a  ndomblob(210));.
48b0: 20 20 43 4f 4d 4d 49 54 3b 0a 7d 20 2d 74 63 6c    COMMIT;.} -tcl
48c0: 62 6f 64 79 20 7b 0a 20 20 64 62 20 63 6c 6f 73  body {.  db clos
48d0: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
48e0: 65 73 74 2e 64 62 0a 20 20 64 62 20 65 76 61 6c  est.db.  db eval
48f0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4900: 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64  1 VALUES(1, rand
4910: 6f 6d 62 6c 6f 62 28 32 31 30 29 29 20 7d 0a 7d  omblob(210)) }.}
4920: 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 6e 6f  ..# Test that no
4930: 20 6d 65 6d 6f 72 79 20 69 73 20 6c 65 61 6b 65   memory is leake
4940: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6d 61  d following a ma
4950: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 69  lloc() failure i
4960: 6e 0a 23 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  n.# sqlite3_init
4970: 69 61 6c 69 7a 65 28 29 2e 0a 23 0a 64 6f 5f 6d  ialize()..#.do_m
4980: 61 6c 6c 6f 63 5f 74 65 73 74 20 32 37 20 2d 74  alloc_test 27 -t
4990: 63 6c 70 72 65 70 20 7b 0a 20 20 64 62 20 63 6c  clprep {.  db cl
49a0: 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 73 68  ose.  sqlite3_sh
49b0: 75 74 64 6f 77 6e 0a 7d 20 2d 74 63 6c 62 6f 64  utdown.} -tclbod
49c0: 79 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 73 71  y {.  set rc [sq
49d0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
49e0: 5d 0a 20 20 69 66 20 7b 24 72 63 20 3d 3d 20 22  ].  if {$rc == "
49f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 7d 20 7b  SQLITE_NOMEM"} {
4a00: 0a 20 20 20 20 65 72 72 6f 72 20 22 6f 75 74 20  .    error "out 
4a10: 6f 66 20 6d 65 6d 6f 72 79 22 0a 20 20 7d 0a 7d  of memory".  }.}
4a20: 0a 61 75 74 6f 69 6e 73 74 61 6c 6c 5f 74 65 73  .autoinstall_tes
4a30: 74 5f 66 75 6e 63 74 69 6f 6e 73 0a 0a 23 20 54  t_functions..# T
4a40: 65 73 74 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  est that malloc 
4a50: 66 61 69 6c 75 72 65 73 20 74 68 61 74 20 6f 63  failures that oc
4a60: 63 75 72 20 77 68 69 6c 65 20 70 72 6f 63 65 73  cur while proces
4a70: 73 69 6e 67 20 49 4e 44 45 58 45 44 20 42 59 0a  sing INDEXED BY.
4a80: 23 20 63 6c 61 75 73 65 73 20 61 72 65 20 68 61  # clauses are ha
4a90: 6e 64 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  ndled correctly.
4aa0: 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20  .do_malloc_test 
4ab0: 32 38 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20 20  28 -sqlprep {.  
4ac0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4ad0: 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20  a, b);.  CREATE 
4ae0: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
4af0: 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49 45 57  );.  CREATE VIEW
4b00: 20 76 31 20 41 53 20 53 45 4c 45 43 54 20 2a 20   v1 AS SELECT * 
4b10: 46 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20  FROM t1 INDEXED 
4b20: 42 59 20 69 31 20 57 48 45 52 45 20 61 20 3d 20  BY i1 WHERE a = 
4b30: 31 30 3b 0a 7d 20 2d 73 71 6c 62 6f 64 79 20 7b  10;.} -sqlbody {
4b40: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
4b50: 20 74 31 20 49 4e 44 45 58 45 44 20 42 59 20 69   t1 INDEXED BY i
4b60: 31 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20  1 ORDER BY a;.  
4b70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 31  SELECT * FROM v1
4b80: 3b 0a 7d 0a 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74  ;.}..do_malloc_t
4b90: 65 73 74 20 32 39 20 2d 73 71 6c 70 72 65 70 20  est 29 -sqlprep 
4ba0: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
4bb0: 20 74 31 28 61 20 54 45 58 54 2c 20 62 20 54 45   t1(a TEXT, b TE
4bc0: 58 54 29 3b 0a 7d 20 2d 73 71 6c 62 6f 64 79 20  XT);.} -sqlbody 
4bd0: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
4be0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 2d 32 33  t1 VALUES(1, -23
4bf0: 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  4);.  INSERT INT
4c00: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
4c10: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM t1 UNION ALL 
4c20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4c30: 3b 0a 7d 0a 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74  ;.}..do_malloc_t
4c40: 65 73 74 20 33 30 20 2d 74 63 6c 70 72 65 70 20  est 30 -tclprep 
4c50: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20  {.  db eval {.  
4c60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4c70: 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  1(x PRIMARY KEY)
4c80: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4c90: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
4ca0: 73 74 72 28 35 30 30 2c 35 30 30 29 29 3b 0a 20  str(500,500));. 
4cb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4cc0: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72  1 VALUES(randstr
4cd0: 28 35 30 30 2c 35 30 30 29 29 3b 0a 20 20 20 20  (500,500));.    
4ce0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4cf0: 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28 35 30  ALUES(randstr(50
4d00: 30 2c 35 30 30 29 29 3b 0a 20 20 7d 0a 20 20 64  0,500));.  }.  d
4d10: 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  b close.  sqlite
4d20: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20  3 db test.db..  
4d30: 23 20 54 68 65 20 44 45 4c 45 54 45 20 63 6f 6d  # The DELETE com
4d40: 6d 61 6e 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  mand in the foll
4d50: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65  owing block move
4d60: 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
4d70: 61 67 65 73 20 74 68 61 74 0a 20 20 23 20 61 72  ages that.  # ar
4d80: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72  e part of the pr
4d90: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
4da0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4db0: 2e 20 42 75 74 20 69 74 20 64 6f 65 73 20 6e 6f  . But it does no
4dc0: 74 0a 20 20 23 20 61 63 74 75 61 6c 6c 79 20 6c  t.  # actually l
4dd0: 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  oad the content 
4de0: 6f 66 20 74 68 65 20 70 61 67 65 73 2e 20 54 68  of the pages. Th
4df0: 69 73 20 6c 65 61 64 73 20 74 6f 20 74 68 65 20  is leads to the 
4e00: 70 65 63 75 6c 69 61 72 0a 20 20 23 20 73 69 74  peculiar.  # sit
4e10: 75 61 74 69 6f 6e 20 77 68 65 72 65 20 63 61 63  uation where cac
4e20: 68 65 20 65 6e 74 72 69 65 73 20 65 78 69 73 74  he entries exist
4e30: 2c 20 62 75 74 20 61 72 65 20 6e 6f 74 20 70 6f  , but are not po
4e40: 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74  pulated with dat
4e50: 61 2e 0a 20 20 23 20 54 68 65 79 20 61 72 65 20  a..  # They are 
4e60: 70 6f 70 75 6c 61 74 65 64 20 6e 65 78 74 20 74  populated next t
4e70: 69 6d 65 20 74 68 65 79 20 61 72 65 20 72 65 71  ime they are req
4e80: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 62 2d  uested by the b-
4e90: 74 72 65 65 20 6c 61 79 65 72 2e 0a 20 20 23 0a  tree layer..  #.
4ea0: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
4eb0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c  BEGIN;.      DEL
4ec0: 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ETE FROM t1;.   
4ed0: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d   ROLLBACK;.  }.}
4ee0: 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 20 2d 2d   -sqlbody {.  --
4ef0: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
4f00: 72 65 71 75 69 72 65 73 20 74 68 65 20 27 6e 6f  requires the 'no
4f10: 2d 63 6f 6e 74 65 6e 74 27 20 70 61 67 65 73 20  -content' pages 
4f20: 6c 6f 61 64 65 64 20 62 79 20 74 68 65 20 44 45  loaded by the DE
4f30: 4c 45 54 45 0a 20 20 2d 2d 20 73 74 61 74 65 6d  LETE.  -- statem
4f40: 65 6e 74 20 61 62 6f 76 65 2e 20 57 68 65 6e 20  ent above. When 
4f50: 72 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 70  requesting the p
4f60: 61 67 65 73 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ages, the conten
4f70: 74 20 69 73 20 6c 6f 61 64 65 64 0a 20 20 2d 2d  t is loaded.  --
4f80: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4f90: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 6f 69  se file. The poi
4fa0: 6e 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  nt of this test 
4fb0: 63 61 73 65 20 69 73 20 74 6f 20 74 65 73 74 20  case is to test 
4fc0: 68 61 6e 64 6c 69 6e 67 0a 20 20 2d 2d 20 6f 66  handling.  -- of
4fd0: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 28   malloc errors (
4fe0: 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 49 54 45  including SQLITE
4ff0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 65 72 72  _IOERR_NOMEM err
5000: 6f 72 73 29 20 77 68 65 6e 20 6c 6f 61 64 69 6e  ors) when loadin
5010: 67 0a 20 20 2d 2d 20 74 68 65 20 63 6f 6e 74 65  g.  -- the conte
5020: 6e 74 2e 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  nt..  SELECT * F
5030: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
5040: 78 3b 0a 7d 0a 0a 23 20 41 66 74 65 72 20 63 6f  x;.}..# After co
5050: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
5060: 61 63 74 69 6f 6e 20 69 6e 20 70 65 72 73 69 73  action in persis
5070: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
5080: 65 2c 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 0a  e, if a journal.
5090: 23 20 73 69 7a 65 20 6c 69 6d 69 74 20 69 73 20  # size limit is 
50a0: 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 69 74  configured SQLit
50b0: 65 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f  e may attempt to
50c0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
50d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 23 20 54 68  urnal file..# Th
50e0: 69 73 20 74 65 73 74 20 76 65 72 69 66 69 65 73  is test verifies
50f0: 20 74 68 65 20 6c 69 62 72 61 72 69 65 73 20 72   the libraries r
5100: 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 6d 61 6c  esponse to a mal
5110: 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 64 75  loc() failure du
5120: 72 69 6e 67 0a 23 20 74 68 69 73 20 6f 70 65 72  ring.# this oper
5130: 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 6d 61 6c 6c  ation..#.do_mall
5140: 6f 63 5f 74 65 73 74 20 33 31 20 2d 73 71 6c 70  oc_test 31 -sqlp
5150: 72 65 70 20 7b 0a 20 20 50 52 41 47 4d 41 20 6a  rep {.  PRAGMA j
5160: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 70 65  ournal_mode = pe
5170: 72 73 69 73 74 3b 0a 20 20 50 52 41 47 4d 41 20  rsist;.  PRAGMA 
5180: 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d  journal_size_lim
5190: 69 74 20 3d 20 31 30 32 34 3b 0a 20 20 43 52 45  it = 1024;.  CRE
51a0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
51b0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
51c0: 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 20 49  } -sqlbody {.  I
51d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
51e0: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 7d 0a 0a 23  LUES(1, 2);.}..#
51f0: 20 57 68 65 6e 20 77 72 69 74 74 65 6e 2c 20 74   When written, t
5200: 68 69 73 20 74 65 73 74 20 70 72 6f 76 6f 6b 65  his test provoke
5210: 64 20 61 6e 20 6f 62 73 63 75 72 65 20 63 68 61  d an obscure cha
5220: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 62 75 67 2e  nge-counter bug.
5230: 0a 23 20 0a 23 20 49 66 2c 20 77 68 65 6e 20 72  .# .# If, when r
5240: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
5250: 69 76 65 20 6d 6f 64 65 2c 20 61 20 6d 61 6c 6c  ive mode, a mall
5260: 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 63 63  oc() failure occ
5270: 75 72 73 0a 23 20 61 66 74 65 72 20 74 68 65 20  urs.# after the 
5280: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
5290: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 68 61 73  ange-counter has
52a0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 62 75   been written bu
52b0: 74 0a 23 20 62 65 66 6f 72 65 20 74 68 65 20 74  t.# before the t
52c0: 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
52d0: 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  een committed, t
52e0: 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
52f0: 69 6f 6e 0a 23 20 69 73 20 61 75 74 6f 6d 61 74  ion.# is automat
5300: 69 63 61 6c 6c 79 20 72 6f 6c 6c 65 64 20 62 61  ically rolled ba
5310: 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 6e 74  ck. However, int
5320: 65 72 6e 61 6c 6c 79 20 74 68 65 20 0a 23 20 50  ernally the .# P
5330: 61 67 65 72 2e 63 68 61 6e 67 65 43 6f 75 6e 74  ager.changeCount
5340: 65 72 44 6f 6e 65 20 66 6c 61 67 20 77 61 73 20  erDone flag was 
5350: 62 65 69 6e 67 20 6c 65 66 74 20 73 65 74 2e 20  being left set. 
5360: 54 68 69 73 20 6d 65 61 6e 73 0a 23 20 74 68 61  This means.# tha
5370: 74 20 69 66 20 74 68 65 20 73 61 6d 65 20 63 6f  t if the same co
5380: 6e 6e 65 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  nnection attempt
5390: 73 20 61 6e 6f 74 68 65 72 20 74 72 61 6e 73 61  s another transa
53a0: 63 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 0a  ction following.
53b0: 23 20 74 68 65 20 6d 61 6c 6c 6f 63 20 66 61 69  # the malloc fai
53c0: 6c 75 72 65 20 61 6e 64 20 72 6f 6c 6c 62 61 63  lure and rollbac
53d0: 6b 2c 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  k, the change co
53e0: 75 6e 74 65 72 20 77 69 6c 6c 20 6e 6f 74 0a 23  unter will not.#
53f0: 20 62 65 20 75 70 64 61 74 65 64 2e 20 54 68 69   be updated. Thi
5400: 73 20 63 6f 75 6c 64 20 63 6f 72 72 75 70 74 20  s could corrupt 
5410: 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  another processe
5420: 73 20 63 61 63 68 65 2e 0a 23 0a 64 6f 5f 6d 61  s cache..#.do_ma
5430: 6c 6c 6f 63 5f 74 65 73 74 20 33 32 20 2d 74 63  lloc_test 32 -tc
5440: 6c 70 72 65 70 20 7b 0a 20 20 23 20 42 75 69 6c  lprep {.  # Buil
5450: 64 20 61 20 73 6d 61 6c 6c 20 64 61 74 61 62 61  d a small databa
5460: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  se containing an
5470: 20 69 6e 64 65 78 65 64 20 74 61 62 6c 65 2e 0a   indexed table..
5480: 20 20 23 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a    #.  db eval {.
5490: 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69      PRAGMA locki
54a0: 6e 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c  ng_mode = normal
54b0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
54c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
54d0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
54e0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
54f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
5500: 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53   'one');.    INS
5510: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5520: 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
5530: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5540: 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65   VALUES(3, 'thre
5550: 65 27 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  e');.    COMMIT;
5560: 0a 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b  .    PRAGMA lock
5570: 69 6e 67 5f 6d 6f 64 65 20 3d 20 65 78 63 6c 75  ing_mode = exclu
5580: 73 69 76 65 3b 0a 20 20 7d 0a 0a 20 20 23 20 4f  sive;.  }..  # O
5590: 70 65 6e 20 61 20 73 65 63 6f 6e 64 20 64 61 74  pen a second dat
55a0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
55b0: 2e 20 4c 6f 61 64 20 74 68 65 20 74 61 62 6c 65  . Load the table
55c0: 20 28 62 75 74 20 6e 6f 74 20 69 6e 64 65 78 29   (but not index)
55d0: 0a 20 20 23 20 69 6e 74 6f 20 74 68 65 20 73 65  .  # into the se
55e0: 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  cond connections
55f0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 0a 20 20   pager cache..  
5600: 23 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  #.  sqlite3 db2 
5610: 74 65 73 74 2e 64 62 0a 20 20 64 62 32 20 65 76  test.db.  db2 ev
5620: 61 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41  al { .    PRAGMA
5630: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d 20   locking_mode = 
5640: 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 53 45 4c 45  normal;.    SELE
5650: 43 54 20 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT b FROM t1;.  
5660: 7d 0a 0a 7d 20 2d 74 63 6c 62 6f 64 79 20 7b 0a  }..} -tclbody {.
5670: 20 20 23 20 52 75 6e 6e 69 6e 67 20 69 6e 20 65    # Running in e
5680: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 70  xclusive mode, p
5690: 65 72 66 6f 72 6d 20 61 20 64 61 74 61 62 61 73  erform a databas
56a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  e transaction th
56b0: 61 74 20 0a 20 20 23 20 6d 6f 64 69 66 69 65 73  at .  # modifies
56c0: 20 62 6f 74 68 20 74 68 65 20 64 61 74 61 62 61   both the databa
56d0: 73 65 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  se table and ind
56e0: 65 78 2e 20 46 6f 72 20 69 74 65 72 61 74 69 6f  ex. For iteratio
56f0: 6e 73 20 77 68 65 72 65 0a 20 20 23 20 74 68 65  ns where.  # the
5700: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
5710: 6f 63 63 75 72 73 20 61 66 74 65 72 20 75 70 64  occurs after upd
5720: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5730: 20 63 6f 75 6e 74 65 72 20 62 75 74 0a 20 20 23   counter but.  #
5740: 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
5750: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
5760: 6f 6e 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20  on, this should 
5770: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 0a 20 20  result in the.  
5780: 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  # transaction be
5790: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
57a0: 62 75 74 20 74 68 65 20 63 68 61 6e 67 65 43 6f  but the changeCo
57b0: 75 6e 74 65 72 44 6f 6e 65 20 66 6c 61 67 0a 20  unterDone flag. 
57c0: 20 23 20 6c 65 66 74 20 73 65 74 2e 0a 20 20 23   # left set..  #
57d0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 55 50 44  .  db eval { UPD
57e0: 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 61  ATE t1 SET a = a
57f0: 20 2b 20 33 20 7d 0a 7d 20 2d 63 6c 65 61 6e 75   + 3 }.} -cleanu
5800: 70 20 7b 0a 0a 20 20 23 20 50 65 72 66 6f 72 6d  p {..  # Perform
5810: 20 61 6e 6f 74 68 65 72 20 74 72 61 6e 73 61 63   another transac
5820: 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 66  tion using the f
5830: 69 72 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  irst connection.
5840: 20 55 6e 6c 6f 63 6b 0a 20 20 23 20 74 68 65 20   Unlock.  # the 
5850: 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 64  database after d
5860: 6f 69 6e 67 20 73 6f 2e 20 49 66 20 74 68 69 73  oing so. If this
5870: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   is one of the r
5880: 69 67 68 74 20 69 74 65 72 61 74 69 6f 6e 73 2c  ight iterations,
5890: 0a 20 20 23 20 74 68 65 6e 20 74 68 69 73 20 73  .  # then this s
58a0: 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20  hould result in 
58b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
58c0: 74 65 6e 74 73 20 62 65 69 6e 67 20 75 70 64 61  tents being upda
58d0: 74 65 64 20 62 75 74 0a 20 20 23 20 74 68 65 20  ted but.  # the 
58e0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6c  change-counter l
58f0: 65 66 74 20 61 73 20 69 74 20 69 73 2e 0a 20 20  eft as it is..  
5900: 23 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 0a 20  #.  db eval { . 
5910: 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e     PRAGMA lockin
5920: 67 5f 6d 6f 64 65 20 3d 20 6e 6f 72 6d 61 6c 3b  g_mode = normal;
5930: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
5940: 45 54 20 61 20 3d 20 61 20 2b 20 33 3b 0a 20 20  ET a = a + 3;.  
5950: 7d 0a 0a 20 20 23 20 4e 6f 77 20 64 6f 20 61 6e  }..  # Now do an
5960: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
5970: 20 77 69 74 68 20 74 68 65 20 73 65 63 6f 6e 64   with the second
5980: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65   connection. The
5990: 20 73 65 63 6f 6e 64 0a 20 20 23 20 63 6f 6e 6e   second.  # conn
59a0: 65 63 74 69 6f 6e 20 73 74 69 6c 6c 20 68 61 73  ection still has
59b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
59c0: 62 6c 65 20 69 6e 20 69 74 73 20 63 61 63 68 65  ble in its cache
59d0: 2e 20 49 66 20 74 68 69 73 20 69 73 0a 20 20 23  . If this is.  #
59e0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6d 61 67 69   one of the magi
59f0: 63 20 69 74 65 72 61 74 69 6f 6e 73 20 61 6e 64  c iterations and
5a00: 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
5a10: 74 65 72 20 77 61 73 20 6e 6f 74 20 6d 6f 64 69  ter was not modi
5a20: 66 69 65 64 2c 0a 20 20 23 20 74 68 65 6e 20 69  fied,.  # then i
5a30: 74 20 77 6f 6e 27 74 20 72 65 61 6c 69 7a 65 20  t won't realize 
5a40: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 64 20  that the cached 
5a50: 64 61 74 61 20 69 73 20 6f 75 74 20 6f 66 20 64  data is out of d
5a60: 61 74 65 2e 20 53 69 6e 63 65 0a 20 20 23 20 74  ate. Since.  # t
5a70: 68 65 20 63 61 63 68 65 64 20 64 61 74 61 20 77  he cached data w
5a80: 6f 6e 27 74 20 6d 61 74 63 68 20 74 68 65 20 75  on't match the u
5a90: 70 20 74 6f 20 64 61 74 65 20 69 6e 64 65 78 20  p to date index 
5aa0: 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d 0a 20  data read from. 
5ab0: 20 23 20 74 68 65 20 64 61 74 61 62 61 73 65 20   # the database 
5ac0: 66 69 6c 65 2c 20 74 68 65 20 69 6e 74 65 67 72  file, the integr
5ad0: 69 74 79 20 63 68 65 63 6b 20 73 68 6f 75 6c 64  ity check should
5ae0: 20 66 61 69 6c 2e 0a 20 20 23 0a 20 20 73 65 74   fail..  #.  set
5af0: 20 7a 52 65 70 65 61 74 20 22 74 72 61 6e 73 69   zRepeat "transi
5b00: 65 6e 74 22 0a 20 20 69 66 20 7b 24 3a 3a 69 52  ent".  if {$::iR
5b10: 65 70 65 61 74 7d 20 7b 73 65 74 20 7a 52 65 70  epeat} {set zRep
5b20: 65 61 74 20 22 70 65 72 73 69 73 74 65 6e 74 22  eat "persistent"
5b30: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6d 61 6c 6c  }.  do_test mall
5b40: 6f 63 2d 33 32 2e 24 7a 52 65 70 65 61 74 2e 24  oc-32.$zRepeat.$
5b50: 7b 3a 3a 6e 7d 2e 69 6e 74 65 67 72 69 74 79 20  {::n}.integrity 
5b60: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 50  {.    execsql {P
5b70: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
5b80: 63 68 65 63 6b 7d 20 64 62 32 0a 20 20 7d 20 7b  check} db2.  } {
5b90: 6f 6b 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  ok}.  db2 close.
5ba0: 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  }..# The followi
5bb0: 6e 67 20 74 77 6f 20 4f 4f 4d 20 74 65 73 74 73  ng two OOM tests
5bc0: 20 76 65 72 69 66 79 20 74 68 61 74 20 4f 4f 4d   verify that OOM
5bd0: 20 68 61 6e 64 6c 69 6e 67 20 77 6f 72 6b 73 20   handling works 
5be0: 69 6e 20 74 68 65 0a 23 20 63 6f 64 65 20 75 73  in the.# code us
5bf0: 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 22  ed to optimize "
5c00: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
5c10: 46 52 4f 4d 20 3c 74 62 6c 3e 22 2e 0a 23 0a 64  FROM <tbl>"..#.d
5c20: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 33 33  o_malloc_test 33
5c30: 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 64 62   -tclprep {.  db
5c40: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 63   eval { PRAGMA c
5c50: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d  ache_size = 10 }
5c60: 0a 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f  .  db transactio
5c70: 6e 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20  n {.    db eval 
5c80: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61  { CREATE TABLE a
5c90: 62 63 28 61 2c 20 62 29 20 7d 0a 20 20 20 20 66  bc(a, b) }.    f
5ca0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
5cb0: 3c 35 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  <500} {incr i} {
5cc0: 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b  .      db eval {
5cd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
5ce0: 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28 31  VALUES(randstr(1
5cf0: 30 30 2c 31 30 30 29 2c 20 72 61 6e 64 73 74 72  00,100), randstr
5d00: 28 31 30 30 30 2c 31 30 30 30 29 29 7d 0a 20 20  (1000,1000))}.  
5d10: 20 20 7d 0a 20 20 7d 0a 7d 20 2d 73 71 6c 62 6f    }.  }.} -sqlbo
5d20: 64 79 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f  dy {.  SELECT co
5d30: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 63 3b  unt(*) FROM abc;
5d40: 0a 7d 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73  .}.do_malloc_tes
5d50: 74 20 33 34 20 2d 74 63 6c 70 72 65 70 20 7b 0a  t 34 -tclprep {.
5d60: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
5d70: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
5d80: 31 30 20 7d 0a 20 20 64 62 20 74 72 61 6e 73 61  10 }.  db transa
5d90: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 64 62 20 65  ction {.    db e
5da0: 76 61 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42  val { CREATE TAB
5db0: 4c 45 20 61 62 63 28 61 20 50 52 49 4d 41 52 59  LE abc(a PRIMARY
5dc0: 20 4b 45 59 2c 20 62 29 20 7d 0a 20 20 20 20 66   KEY, b) }.    f
5dd0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
5de0: 3c 35 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  <500} {incr i} {
5df0: 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b  .      db eval {
5e00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
5e10: 56 41 4c 55 45 53 28 72 61 6e 64 73 74 72 28 31  VALUES(randstr(1
5e20: 30 30 2c 31 30 30 29 2c 20 72 61 6e 64 73 74 72  00,100), randstr
5e30: 28 31 30 30 30 2c 31 30 30 30 29 29 7d 0a 20 20  (1000,1000))}.  
5e40: 20 20 7d 0a 20 20 7d 0a 7d 20 2d 73 71 6c 62 6f    }.  }.} -sqlbo
5e50: 64 79 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f  dy {.  SELECT co
5e60: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 62 63 3b  unt(*) FROM abc;
5e70: 0a 7d 0a 0a 70 72 6f 63 20 66 20 7b 61 72 67 73  .}..proc f {args
5e80: 7d 20 7b 20 65 72 72 6f 72 20 22 51 75 69 74 65  } { error "Quite
5e90: 20 61 20 6c 6f 6e 67 20 65 72 72 6f 72 21 22 20   a long error!" 
5ea0: 7d 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74  }.do_malloc_test
5eb0: 20 33 35 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20   35 -tclprep {. 
5ec0: 20 64 62 20 66 75 6e 63 20 66 20 66 0a 20 20 73   db func f f.  s
5ed0: 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71 6c 69 74  et ::STMT [sqlit
5ee0: 65 33 5f 70 72 65 70 61 72 65 20 64 62 20 22 53  e3_prepare db "S
5ef0: 45 4c 45 43 54 20 66 28 29 22 20 2d 31 20 44 55  ELECT f()" -1 DU
5f00: 4d 4d 59 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73  MMY].  sqlite3_s
5f10: 74 65 70 20 24 3a 3a 53 54 4d 54 0a 7d 20 2d 74  tep $::STMT.} -t
5f20: 63 6c 62 6f 64 79 20 7b 0a 20 20 73 71 6c 69 74  clbody {.  sqlit
5f30: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53  e3_finalize $::S
5f40: 54 4d 54 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b  TMT.} -cleanup {
5f50: 0a 20 20 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e  .  # At one poin
5f60: 74 20 61 6e 20 61 73 73 65 72 74 28 20 21 64 62  t an assert( !db
5f70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5f80: 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 6e 20 74   could fail in t
5f90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 23  he following.  #
5fa0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
5fb0: 5f 65 72 72 6d 73 67 28 29 2e 20 42 65 63 61 75  _errmsg(). Becau
5fc0: 73 65 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  se sqlite3_final
5fd0: 69 7a 65 28 29 20 68 61 64 20 66 61 69 6c 65 64  ize() had failed
5fe0: 20 74 6f 20 63 6c 65 61 72 0a 20 20 23 20 74 68   to clear.  # th
5ff0: 65 20 66 6c 61 67 20 62 65 66 6f 72 65 20 72 65  e flag before re
6000: 74 75 72 6e 69 6e 67 2e 0a 20 20 73 71 6c 69 74  turning..  sqlit
6010: 65 33 5f 65 72 72 6d 73 67 31 36 20 64 62 0a 7d  e3_errmsg16 db.}
6020: 0a 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74  ..do_malloc_test
6030: 20 33 36 20 2d 73 71 6c 70 72 65 70 20 7b 0a 20   36 -sqlprep {. 
6040: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
6050: 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54  (a, b);.  INSERT
6060: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6070: 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  1, 2);.  INSERT 
6080: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
6090: 2c 20 34 29 3b 0a 7d 20 2d 73 71 6c 62 6f 64 79  , 4);.} -sqlbody
60a0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 65 73 74   {.  SELECT test
60b0: 5f 61 67 67 5f 65 72 72 6d 73 67 31 36 28 29 2c  _agg_errmsg16(),
60c0: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 61 29   group_concat(a)
60d0: 20 46 52 4f 4d 20 74 31 0a 7d 0a 0a 23 20 41 74   FROM t1.}..# At
60e0: 20 6f 6e 65 20 70 6f 69 6e 74 2c 20 69 66 20 61   one point, if a
60f0: 6e 20 4f 4f 4d 20 6f 63 63 75 72 72 65 64 20 69  n OOM occurred i
6100: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
6110: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 73 68 61   obtaining a sha
6120: 72 65 64 20 6c 6f 63 6b 0a 23 20 6f 6e 20 74 68  red lock.# on th
6130: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6140: 20 74 68 65 20 66 69 6c 65 20 72 65 6d 61 69 6e   the file remain
6150: 65 64 20 6c 6f 63 6b 65 64 2e 20 54 68 69 73 20  ed locked. This 
6160: 74 65 73 74 20 63 61 73 65 20 65 6e 73 75 72 65  test case ensure
6170: 73 0a 23 20 74 68 61 74 20 62 75 67 20 68 61 73  s.# that bug has
6180: 20 62 65 65 6e 20 66 69 78 65 64 2e 69 0a 69 66   been fixed.i.if
6190: 20 7b 5b 64 62 20 65 76 61 6c 20 7b 50 52 41 47   {[db eval {PRAG
61a0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 7d  MA locking_mode}
61b0: 5d 21 3d 22 65 78 63 6c 75 73 69 76 65 22 7d 20  ]!="exclusive"} 
61c0: 7b 0a 20 20 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65  {.  do_malloc_te
61d0: 73 74 20 33 37 20 2d 74 63 6c 70 72 65 70 20 7b  st 37 -tclprep {
61e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
61f0: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65   test.db.    exe
6200: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45  csql {.      CRE
6210: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
6220: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
6230: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6240: 31 2c 20 32 29 3b 0a 20 20 20 20 7d 20 64 62 32  1, 2);.    } db2
6250: 0a 20 20 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a  .  } -sqlbody {.
6260: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
6270: 4d 20 74 31 3b 0a 20 20 7d 20 2d 63 6c 65 61 6e  M t1;.  } -clean
6280: 75 70 20 7b 0a 20 20 20 20 23 20 54 72 79 20 74  up {.    # Try t
6290: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
62a0: 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 63 6f  atabase using co
62b0: 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 32 5d 2e 20  nnection [db2]. 
62c0: 49 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64  If connection [d
62d0: 62 5d 0a 20 20 20 20 23 20 68 61 73 20 63 6f 72  b].    # has cor
62e0: 72 65 63 74 6c 79 20 72 65 6c 65 61 73 65 64 20  rectly released 
62f0: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2c  the shared lock,
6300: 20 74 68 69 73 20 77 72 69 74 65 20 61 74 74 65   this write atte
6310: 6d 70 74 20 73 68 6f 75 6c 64 20 0a 20 20 20 20  mpt should .    
6320: 23 20 73 75 63 63 65 65 64 2e 20 49 66 20 5b 64  # succeed. If [d
6330: 62 5d 20 68 61 73 20 6e 6f 74 20 72 65 6c 65 61  b] has not relea
6340: 73 65 64 20 74 68 65 20 6c 6f 63 6b 2c 20 74 68  sed the lock, th
6350: 69 73 20 73 68 6f 75 6c 64 20 68 69 74 20 61 6e  is should hit an
6360: 20 0a 20 20 20 20 23 20 53 51 4c 49 54 45 5f 42   .    # SQLITE_B
6370: 55 53 59 20 65 72 72 6f 72 2e 0a 20 20 20 20 64  USY error..    d
6380: 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 2d 33 36  o_test malloc-36
6390: 2e 24 7a 52 65 70 65 61 74 2e 24 7b 3a 3a 6e 7d  .$zRepeat.${::n}
63a0: 2e 75 6e 6c 6f 63 6b 65 64 20 7b 0a 20 20 20 20  .unlocked {.    
63b0: 20 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52    execsql {INSER
63c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
63d0: 28 33 2c 20 34 29 7d 20 64 62 32 0a 20 20 20 20  (3, 4)} db2.    
63e0: 7d 20 7b 7d 0a 20 20 20 20 64 62 32 20 63 6c 6f  } {}.    db2 clo
63f0: 73 65 0a 20 20 7d 0a 20 20 63 61 74 63 68 20 7b  se.  }.  catch {
6400: 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 7d 0a 0a   db2 close }.}..
6410: 0a 23 20 54 65 73 74 20 74 68 61 74 20 69 66 20  .# Test that if 
6420: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
6430: 75 72 73 2c 20 61 75 78 2d 64 61 74 61 20 69 73  urs, aux-data is
6440: 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79   still correctly
6450: 20 64 65 73 74 72 6f 79 65 64 2e 0a 23 20 54 68   destroyed..# Th
6460: 69 73 20 74 65 73 74 20 63 61 73 65 20 77 61 73  is test case was
6470: 20 63 61 75 73 69 6e 67 20 65 69 74 68 65 72 20   causing either 
6480: 61 20 6d 65 6d 6f 72 79 2d 6c 65 61 6b 20 6f 72  a memory-leak or
6490: 20 61 6e 20 61 73 73 65 72 74 28 29 20 66 61 69   an assert() fai
64a0: 6c 75 72 65 0a 23 20 61 74 20 6f 6e 65 20 70 6f  lure.# at one po
64b0: 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
64c0: 6e 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  n the configurat
64d0: 69 6f 6e 2e 0a 23 0a 64 6f 5f 6d 61 6c 6c 6f 63  ion..#.do_malloc
64e0: 5f 74 65 73 74 20 33 39 20 2d 74 63 6c 70 72 65  _test 39 -tclpre
64f0: 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  p {.  sqlite3 db
6500: 20 74 65 73 74 2e 64 62 0a 7d 20 2d 73 71 6c 62   test.db.} -sqlb
6510: 6f 64 79 20 7b 0a 20 20 53 45 4c 45 43 54 20 74  ody {.  SELECT t
6520: 65 73 74 5f 61 75 78 64 61 74 61 28 27 61 62 63  est_auxdata('abc
6530: 27 2c 20 27 64 65 66 27 29 3b 0a 7d 20 2d 63 6c  ', 'def');.} -cl
6540: 65 61 6e 75 70 20 7b 0a 20 20 64 62 20 63 6c 6f  eanup {.  db clo
6550: 73 65 0a 7d 0a 0a 23 20 45 6e 73 75 72 65 20 74  se.}..# Ensure t
6560: 68 61 74 20 6e 6f 20 66 69 6c 65 20 64 65 73 63  hat no file desc
6570: 72 69 70 74 6f 72 73 20 77 65 72 65 20 6c 65 61  riptors were lea
6580: 6b 65 64 2e 0a 64 6f 5f 74 65 73 74 20 6d 61 6c  ked..do_test mal
6590: 6c 6f 63 2d 39 39 2e 58 20 7b 0a 20 20 63 61 74  loc-99.X {.  cat
65a0: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20  ch {db close}.  
65b0: 73 65 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  set sqlite_open_
65c0: 66 69 6c 65 5f 63 6f 75 6e 74 0a 7d 20 7b 30 7d  file_count.} {0}
65d0: 0a 0a 70 75 74 73 20 6f 70 65 6e 2d 66 69 6c 65  ..puts open-file
65e0: 2d 63 6f 75 6e 74 3d 24 73 71 6c 69 74 65 5f 6f  -count=$sqlite_o
65f0: 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 66  pen_file_count.f
6600: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.