/ Hex Artifact Content
Login

Artifact c8a5b717178bca3f1f4cccebd167b08252833307:


0000: 23 20 32 30 30 35 20 44 65 63 65 6d 62 65 72 20  # 2005 December 
0010: 33 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  30.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  #***************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68 65  ********.#.# The
0170: 20 66 6f 63 75 73 20 6f 66 20 74 68 65 20 74 65   focus of the te
0180: 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  sts in this file
0190: 20 61 72 65 20 49 4f 20 65 72 72 6f 72 73 20 74   are IO errors t
01a0: 68 61 74 20 6f 63 63 75 72 20 69 6e 20 61 20 73  hat occur in a s
01b0: 68 61 72 65 64 0a 23 20 63 61 63 68 65 20 63 6f  hared.# cache co
01c0: 6e 74 65 78 74 2e 20 57 68 61 74 20 68 61 70 70  ntext. What happ
01d0: 65 6e 73 20 74 6f 20 63 6f 6e 6e 65 63 74 69 6f  ens to connectio
01e0: 6e 20 42 20 69 66 20 6f 6e 65 20 63 6f 6e 6e 65  n B if one conne
01f0: 63 74 69 6f 6e 20 41 20 65 6e 63 6f 75 6e 74 65  ction A encounte
0200: 72 73 0a 23 20 61 6e 20 49 4f 2d 65 72 72 6f 72  rs.# an IO-error
0210: 20 77 68 69 6c 73 74 20 72 65 61 64 69 6e 67 20   whilst reading 
0220: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
0230: 69 6c 65 2d 73 79 73 74 65 6d 3f 0a 23 0a 23 20  ile-system?.#.# 
0240: 24 49 64 3a 20 73 68 61 72 65 64 5f 65 72 72 2e  $Id: shared_err.
0250: 74 65 73 74 2c 76 20 31 2e 36 20 32 30 30 36 2f  test,v 1.6 2006/
0260: 30 31 2f 32 33 20 32 33 3a 34 39 3a 33 34 20 64  01/23 23:49:34 d
0270: 72 68 20 45 78 70 20 24 0a 0a 70 72 6f 63 20 73  rh Exp $..proc s
0280: 6b 69 70 20 7b 61 72 67 73 7d 20 7b 7d 0a 0a 0a  kip {args} {}...
0290: 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c  set testdir [fil
02a0: 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30  e dirname $argv0
02b0: 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  ].source $testdi
02c0: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 64 62 20  r/tester.tcl.db 
02d0: 63 6c 6f 73 65 0a 0a 69 66 63 61 70 61 62 6c 65  close..ifcapable
02e0: 20 21 73 68 61 72 65 64 5f 63 61 63 68 65 7c 7c   !shared_cache||
02f0: 21 73 75 62 71 75 65 72 79 20 7b 0a 20 20 66 69  !subquery {.  fi
0300: 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75  nish_test.  retu
0310: 72 6e 0a 7d 0a 73 65 74 20 3a 3a 65 6e 61 62 6c  rn.}.set ::enabl
0320: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b  e_shared_cache [
0330: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0340: 68 61 72 65 64 5f 63 61 63 68 65 20 31 5d 0a 0a  hared_cache 1]..
0350: 0a 23 20 54 6f 64 6f 3a 20 54 68 69 73 20 69 73  .# Todo: This is
0360: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 5b   a copy of the [
0370: 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 5d 20  do_malloc_test] 
0380: 70 72 6f 63 20 69 6e 20 6d 61 6c 6c 6f 63 2e 74  proc in malloc.t
0390: 65 73 74 0a 23 20 49 74 20 77 6f 75 6c 64 20 62  est.# It would b
03a0: 65 20 62 65 74 74 65 72 20 69 66 20 74 68 65 73  e better if thes
03b0: 65 20 77 65 72 65 20 63 6f 6e 73 6f 6c 69 64 61  e were consolida
03c0: 74 65 64 2e 0a 0a 23 20 55 73 61 67 65 3a 20 64  ted...# Usage: d
03d0: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 3c 74  o_malloc_test <t
03e0: 65 73 74 20 6e 75 6d 62 65 72 3e 20 3c 6f 70 74  est number> <opt
03f0: 69 6f 6e 73 2e 2e 2e 3e 0a 23 0a 23 20 54 68 65  ions...>.#.# The
0400: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
0410: 20 3c 74 65 73 74 20 6e 75 6d 62 65 72 3e 2c 20   <test number>, 
0420: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 75 73  is an integer us
0430: 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 0a 23  ed to name the.#
0440: 20 74 65 73 74 73 20 65 78 65 63 75 74 65 64 20   tests executed 
0450: 62 79 20 74 68 69 73 20 70 72 6f 63 2e 20 4f 70  by this proc. Op
0460: 74 69 6f 6e 73 20 61 72 65 20 61 73 20 66 6f 6c  tions are as fol
0470: 6c 6f 77 73 3a 0a 23 0a 23 20 20 20 20 20 2d 74  lows:.#.#     -t
0480: 63 6c 70 72 65 70 20 20 20 20 20 20 20 20 20 20  clprep          
0490: 54 43 4c 20 73 63 72 69 70 74 20 74 6f 20 72 75  TCL script to ru
04a0: 6e 20 74 6f 20 70 72 65 70 61 72 65 20 74 65 73  n to prepare tes
04b0: 74 2e 0a 23 20 20 20 20 20 2d 73 71 6c 70 72 65  t..#     -sqlpre
04c0: 70 20 20 20 20 20 20 20 20 20 20 53 51 4c 20 73  p          SQL s
04d0: 63 72 69 70 74 20 74 6f 20 72 75 6e 20 74 6f 20  cript to run to 
04e0: 70 72 65 70 61 72 65 20 74 65 73 74 2e 0a 23 20  prepare test..# 
04f0: 20 20 20 20 2d 74 63 6c 62 6f 64 79 20 20 20 20      -tclbody    
0500: 20 20 20 20 20 20 54 43 4c 20 73 63 72 69 70 74        TCL script
0510: 20 74 6f 20 72 75 6e 20 77 69 74 68 20 6d 61 6c   to run with mal
0520: 6c 6f 63 20 66 61 69 6c 75 72 65 20 73 69 6d 75  loc failure simu
0530: 6c 61 74 69 6f 6e 2e 0a 23 20 20 20 20 20 2d 73  lation..#     -s
0540: 71 6c 62 6f 64 79 20 20 20 20 20 20 20 20 20 20  qlbody          
0550: 54 43 4c 20 73 63 72 69 70 74 20 74 6f 20 72 75  TCL script to ru
0560: 6e 20 77 69 74 68 20 6d 61 6c 6c 6f 63 20 66 61  n with malloc fa
0570: 69 6c 75 72 65 20 73 69 6d 75 6c 61 74 69 6f 6e  ilure simulation
0580: 2e 0a 23 20 20 20 20 20 2d 63 6c 65 61 6e 75 70  ..#     -cleanup
0590: 20 20 20 20 20 20 20 20 20 20 54 43 4c 20 73 63            TCL sc
05a0: 72 69 70 74 20 74 6f 20 72 75 6e 20 61 66 74 65  ript to run afte
05b0: 72 20 74 68 65 20 74 65 73 74 2e 0a 23 0a 23 20  r the test..#.# 
05c0: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 75 6e  This command run
05d0: 73 20 61 20 73 65 72 69 65 73 20 6f 66 20 74 65  s a series of te
05e0: 73 74 73 20 74 6f 20 76 65 72 69 66 79 20 53 51  sts to verify SQ
05f0: 4c 69 74 65 27 73 20 61 62 69 6c 69 74 79 0a 23  Lite's ability.#
0600: 20 74 6f 20 68 61 6e 64 6c 65 20 61 6e 20 6f 75   to handle an ou
0610: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64  t-of-memory cond
0620: 69 74 69 6f 6e 20 67 72 61 63 65 66 75 6c 6c 79  ition gracefully
0630: 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 0a  . It is assumed.
0640: 23 20 74 68 61 74 20 69 66 20 74 68 69 73 20 63  # that if this c
0650: 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 20  ondition occurs 
0660: 61 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 20  a malloc() call 
0670: 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 0a 23 20  will return a.# 
0680: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 4c 69  NULL pointer. Li
0690: 6e 75 78 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  nux, for example
06a0: 2c 20 64 6f 65 73 6e 27 74 20 64 6f 20 74 68 61  , doesn't do tha
06b0: 74 20 62 79 20 64 65 66 61 75 6c 74 2e 20 53 65  t by default. Se
06c0: 65 0a 23 20 74 68 65 20 22 42 55 47 53 22 20 73  e.# the "BUGS" s
06d0: 65 63 74 69 6f 6e 20 6f 66 20 6d 61 6c 6c 6f 63  ection of malloc
06e0: 28 33 29 2e 0a 23 0a 23 20 45 61 63 68 20 69 74  (3)..#.# Each it
06f0: 65 72 61 74 69 6f 6e 20 6f 66 20 61 20 6c 6f 6f  eration of a loo
0700: 70 2c 20 74 68 65 20 54 43 4c 20 63 6f 6d 6d 61  p, the TCL comma
0710: 6e 64 73 20 69 6e 20 61 6e 79 20 61 72 67 75 6d  nds in any argum
0720: 65 6e 74 20 70 61 73 73 65 64 0a 23 20 74 6f 20  ent passed.# to 
0730: 74 68 65 20 2d 74 63 6c 62 6f 64 79 20 73 77 69  the -tclbody swi
0740: 74 63 68 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  tch, followed by
0750: 20 74 68 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64   the SQL command
0760: 73 20 69 6e 20 61 6e 79 20 61 72 67 75 6d 65 6e  s in any argumen
0770: 74 0a 23 20 70 61 73 73 65 64 20 74 6f 20 74 68  t.# passed to th
0780: 65 20 2d 73 71 6c 62 6f 64 79 20 73 77 69 74 63  e -sqlbody switc
0790: 68 20 61 72 65 20 65 78 65 63 75 74 65 64 2e 20  h are executed. 
07a0: 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 74  Each iteration t
07b0: 68 65 0a 23 20 4e 74 68 20 63 61 6c 6c 20 74 6f  he.# Nth call to
07c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
07d0: 69 73 20 6d 61 64 65 20 74 6f 20 66 61 69 6c 2c  is made to fail,
07e0: 20 77 68 65 72 65 20 4e 20 69 73 20 69 6e 63 72   where N is incr
07f0: 65 61 73 65 64 0a 23 20 65 61 63 68 20 74 69 6d  eased.# each tim
0800: 65 20 74 68 65 20 6c 6f 6f 70 20 72 75 6e 73 20  e the loop runs 
0810: 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 31 2e  starting from 1.
0820: 20 57 68 65 6e 20 61 6c 6c 20 63 6f 6d 6d 61 6e   When all comman
0830: 64 73 20 65 78 65 63 75 74 65 0a 23 20 73 75 63  ds execute.# suc
0840: 63 65 73 73 66 75 6c 6c 79 2c 20 74 68 65 20 6c  cessfully, the l
0850: 6f 6f 70 20 65 6e 64 73 2e 0a 23 0a 70 72 6f 63  oop ends..#.proc
0860: 20 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20   do_malloc_test 
0870: 7b 74 6e 20 61 72 67 73 7d 20 7b 0a 20 20 61 72  {tn args} {.  ar
0880: 72 61 79 20 75 6e 73 65 74 20 3a 3a 6d 61 6c 6c  ray unset ::mall
0890: 6f 63 6f 70 74 73 20 0a 20 20 61 72 72 61 79 20  ocopts .  array 
08a0: 73 65 74 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73  set ::mallocopts
08b0: 20 24 61 72 67 73 0a 0a 20 20 73 65 74 20 3a 3a   $args..  set ::
08c0: 67 6f 20 31 0a 20 20 66 6f 72 20 7b 73 65 74 20  go 1.  for {set 
08d0: 3a 3a 6e 20 31 7d 20 7b 24 3a 3a 67 6f 20 26 26  ::n 1} {$::go &&
08e0: 20 24 3a 3a 6e 20 3c 20 35 30 30 30 30 7d 20 7b   $::n < 50000} {
08f0: 69 6e 63 72 20 3a 3a 6e 7d 20 7b 0a 20 20 20 20  incr ::n} {.    
0900: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 5f 6d  do_test shared_m
0910: 61 6c 6c 6f 63 2d 24 74 6e 2e 24 3a 3a 6e 20 7b  alloc-$tn.$::n {
0920: 0a 0a 20 20 20 20 20 20 23 20 52 65 6d 6f 76 65  ..      # Remove
0930: 20 61 6c 6c 20 74 72 61 63 65 73 20 6f 66 20 64   all traces of d
0940: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 65  atabase files te
0950: 73 74 2e 64 62 20 61 6e 64 20 74 65 73 74 32 2e  st.db and test2.
0960: 64 62 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  db from the file
0970: 73 0a 20 20 20 20 20 20 23 20 73 79 73 74 65 6d  s.      # system
0980: 2e 20 54 68 65 6e 20 6f 70 65 6e 20 28 65 6d 70  . Then open (emp
0990: 74 79 20 64 61 74 61 62 61 73 65 29 20 22 74 65  ty database) "te
09a0: 73 74 2e 64 62 22 20 77 69 74 68 20 74 68 65 20  st.db" with the 
09b0: 68 61 6e 64 6c 65 20 5b 64 62 5d 2e 0a 20 20 20  handle [db]..   
09c0: 20 20 20 23 20 0a 20 20 20 20 20 20 73 71 6c 69     # .      sqli
09d0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20 30  te_malloc_fail 0
09e0: 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 64 62  .      catch {db
09f0: 20 63 6c 6f 73 65 7d 20 0a 20 20 20 20 20 20 63   close} .      c
0a00: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
0a10: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
0a20: 7d 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 66  }.      catch {f
0a30: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
0a40: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
0a50: 6c 7d 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b  l}.      catch {
0a60: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
0a70: 63 65 20 74 65 73 74 32 2e 64 62 7d 0a 20 20 20  ce test2.db}.   
0a80: 20 20 20 63 61 74 63 68 20 7b 66 69 6c 65 20 64     catch {file d
0a90: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
0aa0: 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 7d 0a 20  t2.db-journal}. 
0ab0: 20 20 20 20 20 63 61 74 63 68 20 7b 73 71 6c 69       catch {sqli
0ac0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 7d 20  te3 db test.db} 
0ad0: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 44 42 20  .      set ::DB 
0ae0: 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  [sqlite3_connect
0af0: 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a  ion_pointer db].
0b00: 0a 20 20 20 20 20 20 23 20 45 78 65 63 75 74 65  .      # Execute
0b10: 20 61 6e 79 20 2d 74 63 6c 70 72 65 70 20 61 6e   any -tclprep an
0b20: 64 20 2d 73 71 6c 70 72 65 70 20 73 63 72 69 70  d -sqlprep scrip
0b30: 74 73 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20  ts..      #.    
0b40: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0b50: 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28  ts ::mallocopts(
0b60: 2d 74 63 6c 70 72 65 70 29 5d 7d 20 7b 0a 20 20  -tclprep)]} {.  
0b70: 20 20 20 20 20 20 65 76 61 6c 20 24 3a 3a 6d 61        eval $::ma
0b80: 6c 6c 6f 63 6f 70 74 73 28 2d 74 63 6c 70 72 65  llocopts(-tclpre
0b90: 70 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p).      }.     
0ba0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
0bb0: 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d  s ::mallocopts(-
0bc0: 73 71 6c 70 72 65 70 29 5d 7d 20 7b 0a 20 20 20  sqlprep)]} {.   
0bd0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 24 3a 3a       execsql $::
0be0: 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 73 71 6c 70  mallocopts(-sqlp
0bf0: 72 65 70 29 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rep).      }..  
0c00: 20 20 20 20 23 20 4e 6f 77 20 73 65 74 20 74 68      # Now set th
0c10: 65 20 24 7b 3a 3a 6e 7d 74 68 20 6d 61 6c 6c 6f  e ${::n}th mallo
0c20: 63 28 29 20 74 6f 20 66 61 69 6c 20 61 6e 64 20  c() to fail and 
0c30: 65 78 65 63 75 74 65 20 74 68 65 20 2d 74 63 6c  execute the -tcl
0c40: 62 6f 64 79 20 61 6e 64 0a 20 20 20 20 20 20 23  body and.      #
0c50: 20 2d 73 71 6c 62 6f 64 79 20 73 63 72 69 70 74   -sqlbody script
0c60: 73 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20  s..      #.     
0c70: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
0c80: 61 69 6c 20 24 3a 3a 6e 0a 20 20 20 20 20 20 73  ail $::n.      s
0c90: 65 74 20 3a 3a 6d 61 6c 6c 6f 63 62 6f 64 79 20  et ::mallocbody 
0ca0: 7b 7d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  {}.      if {[in
0cb0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6d 61 6c 6c  fo exists ::mall
0cc0: 6f 63 6f 70 74 73 28 2d 74 63 6c 62 6f 64 79 29  ocopts(-tclbody)
0cd0: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ]} {.        app
0ce0: 65 6e 64 20 3a 3a 6d 61 6c 6c 6f 63 62 6f 64 79  end ::mallocbody
0cf0: 20 22 24 3a 3a 6d 61 6c 6c 6f 63 6f 70 74 73 28   "$::mallocopts(
0d00: 2d 74 63 6c 62 6f 64 79 29 5c 6e 22 0a 20 20 20  -tclbody)\n".   
0d10: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 7b 5b     }.      if {[
0d20: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6d 61  info exists ::ma
0d30: 6c 6c 6f 63 6f 70 74 73 28 2d 73 71 6c 62 6f 64  llocopts(-sqlbod
0d40: 79 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 61  y)]} {.        a
0d50: 70 70 65 6e 64 20 3a 3a 6d 61 6c 6c 6f 63 62 6f  ppend ::mallocbo
0d60: 64 79 20 22 64 62 20 65 76 61 6c 20 7b 24 3a 3a  dy "db eval {$::
0d70: 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 73 71 6c 62  mallocopts(-sqlb
0d80: 6f 64 79 29 7d 22 0a 20 20 20 20 20 20 7d 0a 20  ody)}".      }. 
0d90: 20 20 20 20 20 73 65 74 20 76 20 5b 63 61 74 63       set v [catc
0da0: 68 20 24 3a 3a 6d 61 6c 6c 6f 63 62 6f 64 79 20  h $::mallocbody 
0db0: 6d 73 67 5d 0a 0a 20 20 20 20 20 20 73 65 74 20  msg]..      set 
0dc0: 6c 65 66 74 6f 76 65 72 20 5b 6c 69 6e 64 65 78  leftover [lindex
0dd0: 20 5b 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f   [sqlite_malloc_
0de0: 73 74 61 74 5d 20 32 5d 0a 20 20 20 20 20 20 69  stat] 2].      i
0df0: 66 20 7b 24 6c 65 66 74 6f 76 65 72 3e 30 7d 20  f {$leftover>0} 
0e00: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 6c  {.        if {$l
0e10: 65 66 74 6f 76 65 72 3e 31 7d 20 7b 70 75 74 73  eftover>1} {puts
0e20: 20 22 5c 6e 4c 65 66 74 6f 76 65 72 3a 20 24 6c   "\nLeftover: $l
0e30: 65 66 74 6f 76 65 72 5c 6e 52 65 74 75 72 6e 3d  eftover\nReturn=
0e40: 24 76 20 20 4d 65 73 73 61 67 65 3d 24 6d 73 67  $v  Message=$msg
0e50: 22 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a  "}.        set :
0e60: 3a 67 6f 20 30 0a 20 20 20 20 20 20 20 20 69 66  :go 0.        if
0e70: 20 7b 24 76 7d 20 7b 0a 20 20 20 20 20 20 20 20   {$v} {.        
0e80: 20 20 70 75 74 73 20 22 5c 6e 45 72 72 6f 72 20    puts "\nError 
0e90: 6d 65 73 73 61 67 65 20 72 65 74 75 72 6e 65 64  message returned
0ea0: 3a 20 24 6d 73 67 22 0a 20 20 20 20 20 20 20 20  : $msg".        
0eb0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
0ec0: 20 20 20 73 65 74 20 76 20 7b 31 20 31 7d 0a 20     set v {1 1}. 
0ed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
0ee0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
0ef0: 73 65 74 20 76 32 20 5b 65 78 70 72 20 7b 24 6d  set v2 [expr {$m
0f00: 73 67 3d 3d 22 22 20 7c 7c 20 24 6d 73 67 3d 3d  sg=="" || $msg==
0f10: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 7d  "out of memory"}
0f20: 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ].        if {!$
0f30: 76 32 7d 20 7b 70 75 74 73 20 22 5c 6e 45 72 72  v2} {puts "\nErr
0f40: 6f 72 20 6d 65 73 73 61 67 65 20 72 65 74 75 72  or message retur
0f50: 6e 65 64 3a 20 24 6d 73 67 22 7d 0a 20 20 20 20  ned: $msg"}.    
0f60: 20 20 20 20 6c 61 70 70 65 6e 64 20 76 20 24 76      lappend v $v
0f70: 32 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  2.      }.    } 
0f80: 7b 31 20 31 7d 0a 0a 20 20 20 20 73 71 6c 69 74  {1 1}..    sqlit
0f90: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20 30 0a  e_malloc_fail 0.
0fa0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0fb0: 69 73 74 73 20 3a 3a 6d 61 6c 6c 6f 63 6f 70 74  ists ::mallocopt
0fc0: 73 28 2d 63 6c 65 61 6e 75 70 29 5d 7d 20 7b 0a  s(-cleanup)]} {.
0fd0: 20 20 20 20 20 20 63 61 74 63 68 20 5b 6c 69 73        catch [lis
0fe0: 74 20 75 70 6c 65 76 65 6c 20 23 30 20 24 3a 3a  t uplevel #0 $::
0ff0: 6d 61 6c 6c 6f 63 6f 70 74 73 28 2d 63 6c 65 61  mallocopts(-clea
1000: 6e 75 70 29 5d 20 6d 73 67 0a 20 20 20 20 7d 0a  nup)] msg.    }.
1010: 20 20 7d 0a 20 20 75 6e 73 65 74 20 3a 3a 6d 61    }.  unset ::ma
1020: 6c 6c 6f 63 6f 70 74 73 0a 7d 0a 0a 0a 64 6f 5f  llocopts.}...do_
1030: 69 6f 65 72 72 5f 74 65 73 74 20 73 68 61 72 65  ioerr_test share
1040: 64 5f 69 6f 65 72 72 2d 31 20 2d 74 63 6c 70 72  d_ioerr-1 -tclpr
1050: 65 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  ep {.  sqlite3 d
1060: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
1070: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
1080: 41 20 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74  A read_uncommitt
1090: 65 64 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41  ed = 1;.    CREA
10a0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
10b0: 63 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  c);.    BEGIN;. 
10c0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
10d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
10e0: 20 20 7d 20 64 62 32 0a 7d 20 2d 73 71 6c 62 6f    } db2.} -sqlbo
10f0: 64 79 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  dy {.  SELECT * 
1100: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1110: 65 72 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  er;.  INSERT INT
1120: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 2c  O t1 VALUES(1,2,
1130: 33 29 3b 0a 20 20 42 45 47 49 4e 20 54 52 41 4e  3);.  BEGIN TRAN
1140: 53 41 43 54 49 4f 4e 3b 0a 20 20 49 4e 53 45 52  SACTION;.  INSER
1150: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1160: 28 31 2c 32 2c 33 29 3b 0a 20 20 49 4e 53 45 52  (1,2,3);.  INSER
1170: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1180: 28 34 2c 35 2c 36 29 3b 0a 20 20 52 4f 4c 4c 42  (4,5,6);.  ROLLB
1190: 41 43 4b 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  ACK;.  SELECT * 
11a0: 46 52 4f 4d 20 74 31 3b 0a 20 20 42 45 47 49 4e  FROM t1;.  BEGIN
11b0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 0a 20 20   TRANSACTION;.  
11c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
11d0: 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20  ALUES(1,2,3);.  
11e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
11f0: 41 4c 55 45 53 28 34 2c 35 2c 36 29 3b 0a 20 20  ALUES(4,5,6);.  
1200: 43 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54  COMMIT;.  SELECT
1210: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 44 45   * FROM t1;.  DE
1220: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
1230: 52 45 20 61 3c 31 30 30 3b 0a 7d 20 2d 63 6c 65  RE a<100;.} -cle
1240: 61 6e 75 70 20 7b 0a 20 20 64 6f 5f 74 65 73 74  anup {.  do_test
1250: 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 31 2e   shared_ioerr-1.
1260: 24 6e 2e 63 6c 65 61 6e 75 70 2e 31 20 7b 0a 20  $n.cleanup.1 {. 
1270: 20 20 20 73 65 74 20 72 65 73 20 5b 63 61 74 63     set res [catc
1280: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  hsql {.      SEL
1290: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
12a0: 20 20 20 7d 20 64 62 32 5d 0a 20 20 20 20 73 65     } db2].    se
12b0: 74 20 70 6f 73 73 69 62 6c 65 5f 72 65 73 75 6c  t possible_resul
12c0: 74 73 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  ts [list        
12d0: 20 20 20 20 5c 0a 20 20 20 20 20 20 22 31 20 7b      \.      "1 {
12e0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 22  disk I/O error}"
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 5c 0a 20 20 20 20 20 20 22 30 20 7b 31 20 32 20  \.      "0 {1 2 
1310: 33 7d 22 20 20 20 20 20 20 20 20 20 20 20 20 20  3}"             
1320: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1330: 20 20 20 20 22 30 20 7b 31 20 32 20 33 20 31 20      "0 {1 2 3 1 
1340: 32 20 33 20 34 20 35 20 36 7d 22 20 20 20 20 20  2 3 4 5 6}"     
1350: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20          \.      
1360: 22 30 20 7b 31 20 32 20 33 20 31 20 32 20 33 20  "0 {1 2 3 1 2 3 
1370: 34 20 35 20 36 20 31 20 32 20 33 20 34 20 35 20  4 5 6 1 2 3 4 5 
1380: 36 7d 22 20 5c 0a 20 20 20 20 20 20 22 30 20 7b  6}" \.      "0 {
1390: 7d 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }"              
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 5c 0a 20 20 20 20 5d 0a 20 20 20 20 73 65 74 20  \.    ].    set 
13c0: 72 63 20 5b 65 78 70 72 20 5b 6c 73 65 61 72 63  rc [expr [lsearc
13d0: 68 20 2d 65 78 61 63 74 20 24 70 6f 73 73 69 62  h -exact $possib
13e0: 6c 65 5f 72 65 73 75 6c 74 73 20 24 72 65 73 5d  le_results $res]
13f0: 20 3e 3d 20 30 5d 0a 20 20 20 20 69 66 20 7b 24   >= 0].    if {$
1400: 72 63 20 21 3d 20 31 7d 20 7b 0a 20 20 20 20 20  rc != 1} {.     
1410: 20 70 75 74 73 20 22 22 0a 20 20 20 20 20 20 70   puts "".      p
1420: 75 74 73 20 22 52 65 73 75 6c 74 3a 20 24 72 65  uts "Result: $re
1430: 73 22 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  s".    }.    set
1440: 20 72 63 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 62   rc.  } {1}.  db
1450: 32 20 63 6c 6f 73 65 0a 7d 0a 0a 64 6f 5f 69 6f  2 close.}..do_io
1460: 65 72 72 5f 74 65 73 74 20 73 68 61 72 65 64 5f  err_test shared_
1470: 69 6f 65 72 72 2d 32 20 2d 74 63 6c 70 72 65 70  ioerr-2 -tclprep
1480: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
1490: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
14a0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
14b0: 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65 64  read_uncommitted
14c0: 20 3d 20 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b   = 1;.    BEGIN;
14d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
14e0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
14f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 6f  INSERT INTO t1(o
1500: 69 64 29 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29  id) VALUES(NULL)
1510: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1520: 4f 20 74 31 28 6f 69 64 29 20 53 45 4c 45 43 54  O t1(oid) SELECT
1530: 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20   NULL FROM t1;. 
1540: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1550: 31 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e 55  1(oid) SELECT NU
1560: 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  LL FROM t1;.    
1570: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 6f  INSERT INTO t1(o
1580: 69 64 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20  id) SELECT NULL 
1590: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
15a0: 45 52 54 20 49 4e 54 4f 20 74 31 28 6f 69 64 29  ERT INTO t1(oid)
15b0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f   SELECT NULL FRO
15c0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
15d0: 20 49 4e 54 4f 20 74 31 28 6f 69 64 29 20 53 45   INTO t1(oid) SE
15e0: 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74  LECT NULL FROM t
15f0: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
1600: 54 4f 20 74 31 28 6f 69 64 29 20 53 45 4c 45 43  TO t1(oid) SELEC
1610: 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a  T NULL FROM t1;.
1620: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1630: 74 31 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e  t1(oid) SELECT N
1640: 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ULL FROM t1;.   
1650: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
1660: 6f 69 64 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c  oid) SELECT NULL
1670: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
1680: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 6f 69 64  SERT INTO t1(oid
1690: 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52  ) SELECT NULL FR
16a0: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
16b0: 54 20 49 4e 54 4f 20 74 31 28 6f 69 64 29 20 53  T INTO t1(oid) S
16c0: 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20  ELECT NULL FROM 
16d0: 74 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  t1;.    UPDATE t
16e0: 31 20 73 65 74 20 61 20 3d 20 6f 69 64 2c 20 62  1 set a = oid, b
16f0: 20 3d 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c   = 'abcdefghijkl
1700: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31  mnopqrstuvwxyz01
1710: 32 33 34 35 36 37 38 39 27 3b 0a 20 20 20 20 43  23456789';.    C
1720: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
1730: 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 43 4f 4d  N t1(a);.    COM
1740: 4d 49 54 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  MIT;.    BEGIN;.
1750: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1760: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
1770: 0a 20 20 7d 20 64 62 32 0a 7d 20 2d 74 63 6c 62  .  } db2.} -tclb
1780: 6f 64 79 20 7b 0a 20 20 73 65 74 20 3a 3a 72 65  ody {.  set ::re
1790: 73 69 64 78 20 30 0a 20 20 65 78 65 63 73 71 6c  sidx 0.  execsql
17a0: 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   {DELETE FROM t1
17b0: 20 57 48 45 52 45 20 30 20 3d 20 28 61 20 25 20   WHERE 0 = (a % 
17c0: 32 29 3b 7d 0a 20 20 69 6e 63 72 20 3a 3a 72 65  2);}.  incr ::re
17d0: 73 69 64 78 0a 0a 20 20 23 20 57 68 65 6e 20 74  sidx..  # When t
17e0: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
17f0: 62 65 67 69 6e 73 20 74 68 65 20 74 61 62 6c 65  begins the table
1800: 20 63 6f 6e 74 61 69 6e 73 20 35 31 32 20 65 6e   contains 512 en
1810: 74 72 69 65 73 2e 20 54 68 65 0a 20 20 23 20 74  tries. The.  # t
1820: 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  wo statements to
1830: 67 65 74 68 65 72 20 61 64 64 20 35 31 32 2b 31  gether add 512+1
1840: 34 36 20 6d 6f 72 65 20 69 66 20 69 74 20 73 75  46 more if it su
1850: 63 63 65 65 64 73 2e 20 0a 20 20 23 20 28 31 30  cceeds. .  # (10
1860: 32 34 2f 37 3d 3d 31 34 36 29 0a 20 20 65 78 65  24/7==146).  exe
1870: 63 73 71 6c 20 7b 42 45 47 49 4e 3b 7d 0a 20 20  csql {BEGIN;}.  
1880: 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20  execsql {INSERT 
1890: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61  INTO t1 SELECT a
18a0: 2b 31 2c 20 62 20 46 52 4f 4d 20 74 31 3b 7d 0a  +1, b FROM t1;}.
18b0: 20 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52    execsql {INSER
18c0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
18d0: 20 27 73 74 72 69 6e 67 27 20 7c 7c 20 61 2c 20   'string' || a, 
18e0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
18f0: 30 20 3d 20 28 61 25 37 29 3b 7d 0a 20 20 65 78  0 = (a%7);}.  ex
1900: 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 3b 7d 0a  ecsql {COMMIT;}.
1910: 0a 20 20 69 6e 63 72 20 3a 3a 72 65 73 69 64 78  .  incr ::residx
1920: 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20 20  .} -cleanup {.  
1930: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69  do_test shared_i
1940: 6f 65 72 72 2d 32 2e 24 6e 2e 63 6c 65 61 6e 75  oerr-2.$n.cleanu
1950: 70 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 72 65  p.1 {.    set re
1960: 73 20 5b 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  s [catchsql {.  
1970: 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61      SELECT max(a
1980: 29 2c 20 6d 69 6e 28 61 29 2c 20 63 6f 75 6e 74  ), min(a), count
1990: 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (*) FROM (SELECT
19a0: 20 61 20 46 52 4f 4d 20 74 31 20 6f 72 64 65 72   a FROM t1 order
19b0: 20 62 79 20 61 29 3b 0a 20 20 20 20 7d 20 64 62   by a);.    } db
19c0: 32 5d 0a 20 20 20 20 73 65 74 20 70 6f 73 73 69  2].    set possi
19d0: 62 6c 65 5f 72 65 73 75 6c 74 73 20 5b 6c 69 73  ble_results [lis
19e0: 74 20 5c 0a 20 20 20 20 20 20 7b 30 20 7b 31 30  t \.      {0 {10
19f0: 32 34 20 31 20 31 30 32 34 7d 7d 20 20 20 20 20  24 1 1024}}     
1a00: 20 20 20 5c 0a 20 20 20 20 20 20 7b 30 20 7b 31     \.      {0 {1
1a10: 30 32 33 20 31 20 35 31 32 7d 7d 20 20 20 20 20  023 1 512}}     
1a20: 20 20 20 20 5c 0a 20 20 20 20 20 20 7b 30 20 7b      \.      {0 {
1a30: 73 74 72 69 6e 67 39 39 34 20 31 20 31 31 37 30  string994 1 1170
1a40: 7d 7d 20 20 20 5c 0a 20 20 20 20 5d 0a 20 20 20  }}   \.    ].   
1a50: 20 73 65 74 20 69 64 78 20 5b 6c 73 65 61 72 63   set idx [lsearc
1a60: 68 20 2d 65 78 61 63 74 20 24 70 6f 73 73 69 62  h -exact $possib
1a70: 6c 65 5f 72 65 73 75 6c 74 73 20 24 72 65 73 5d  le_results $res]
1a80: 0a 20 20 20 20 73 65 74 20 73 75 63 63 65 73 73  .    set success
1a90: 20 5b 65 78 70 72 20 7b 24 69 64 78 3d 3d 24 3a   [expr {$idx==$:
1aa0: 3a 72 65 73 69 64 78 20 7c 7c 20 24 72 65 73 3d  :residx || $res=
1ab0: 3d 22 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72  ="1 {disk I/O er
1ac0: 72 6f 72 7d 22 7d 5d 0a 20 20 20 20 69 66 20 7b  ror}"}].    if {
1ad0: 21 24 73 75 63 63 65 73 73 7d 20 7b 0a 20 20 20  !$success} {.   
1ae0: 20 20 20 70 75 74 73 20 22 22 0a 20 20 20 20 20     puts "".     
1af0: 20 70 75 74 73 20 22 52 65 73 75 6c 74 3a 20 5c   puts "Result: \
1b00: 22 24 72 65 73 5c 22 20 28 24 3a 3a 72 65 73 69  "$res\" ($::resi
1b10: 64 78 29 22 0a 20 20 20 20 7d 0a 20 20 20 20 73  dx)".    }.    s
1b20: 65 74 20 73 75 63 63 65 73 73 0a 20 20 7d 20 7b  et success.  } {
1b30: 31 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d  1}.  db2 close.}
1b40: 0a 0a 23 20 54 68 69 73 20 74 65 73 74 20 69 73  ..# This test is
1b50: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 72 6f   designed to pro
1b60: 76 6f 6b 65 20 61 6e 20 49 4f 20 65 72 72 6f 72  voke an IO error
1b70: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 70   when a cursor p
1b80: 6f 73 69 74 69 6f 6e 20 69 73 0a 23 20 22 73 61  osition is.# "sa
1b90: 76 65 64 22 20 28 62 65 63 61 75 73 65 20 61 6e  ved" (because an
1ba0: 6f 74 68 65 72 20 63 75 72 73 6f 72 20 69 73 20  other cursor is 
1bb0: 67 6f 69 6e 67 20 74 6f 20 6d 6f 64 69 66 79 20  going to modify 
1bc0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 74  the underlying t
1bd0: 61 62 6c 65 29 2e 20 0a 23 20 0a 64 6f 5f 69 6f  able). .# .do_io
1be0: 65 72 72 5f 74 65 73 74 20 73 68 61 72 65 64 5f  err_test shared_
1bf0: 69 6f 65 72 72 2d 33 20 2d 74 63 6c 70 72 65 70  ioerr-3 -tclprep
1c00: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
1c10: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
1c20: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
1c30: 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65 64  read_uncommitted
1c40: 20 3d 20 31 3b 0a 20 20 20 20 50 52 41 47 4d 41   = 1;.    PRAGMA
1c50: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
1c60: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
1c70: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1c80: 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c  (a, b, UNIQUE(a,
1c90: 20 62 29 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20   b));.  } db2.  
1ca0: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
1cb0: 69 20 3c 20 32 30 30 7d 20 7b 69 6e 63 72 20 69  i < 200} {incr i
1cc0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 61 20 5b 73  } {.    set a [s
1cd0: 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 73 74 72  tring range [str
1ce0: 69 6e 67 20 72 65 70 65 61 74 20 22 5b 66 6f 72  ing repeat "[for
1cf0: 6d 61 74 20 25 30 33 64 20 24 69 5d 2e 22 20 35  mat %03d $i]." 5
1d00: 5d 20 30 20 65 6e 64 2d 31 5d 0a 0a 20 20 20 20  ] 0 end-1]..    
1d10: 73 65 74 20 62 20 5b 73 74 72 69 6e 67 20 72 65  set b [string re
1d20: 70 65 61 74 20 24 69 20 32 30 30 30 5d 0a 20 20  peat $i 2000].  
1d30: 20 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52    execsql {INSER
1d40: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1d50: 28 24 61 2c 20 24 62 29 7d 20 64 62 32 0a 20 20  ($a, $b)} db2.  
1d60: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 4f 4d  }.  execsql {COM
1d70: 4d 49 54 7d 20 64 62 32 0a 20 20 73 65 74 20 3a  MIT} db2.  set :
1d80: 3a 44 42 32 20 5b 73 71 6c 69 74 65 33 5f 63 6f  :DB2 [sqlite3_co
1d90: 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
1da0: 20 64 62 32 5d 0a 20 20 73 65 74 20 3a 3a 53 54   db2].  set ::ST
1db0: 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  MT [sqlite3_prep
1dc0: 61 72 65 20 24 3a 3a 44 42 32 20 22 53 45 4c 45  are $::DB2 "SELE
1dd0: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT a FROM t1 ORD
1de0: 45 52 20 42 59 20 61 22 20 2d 31 20 44 55 4d 4d  ER BY a" -1 DUMM
1df0: 59 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  Y].  sqlite3_ste
1e00: 70 20 24 3a 3a 53 54 4d 54 20 20 20 20 20 20 20  p $::STMT       
1e10: 3b 23 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 73  ;# Cursor points
1e20: 20 61 74 20 30 30 30 2e 30 30 30 2e 30 30 30 2e   at 000.000.000.
1e30: 30 30 30 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  000.  sqlite3_st
1e40: 65 70 20 24 3a 3a 53 54 4d 54 20 20 20 20 20 20  ep $::STMT      
1e50: 20 3b 23 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   ;# Cursor point
1e60: 73 20 61 74 20 30 30 31 2e 30 30 31 2e 30 30 31  s at 001.001.001
1e70: 2e 30 30 31 0a 0a 7d 20 2d 74 63 6c 62 6f 64 79  .001..} -tclbody
1e80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1e90: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
1ea0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1eb0: 55 45 53 28 27 32 30 31 2e 32 30 31 2e 32 30 31  UES('201.201.201
1ec0: 2e 32 30 31 2e 32 30 31 27 2c 20 4e 55 4c 4c 29  .201.201', NULL)
1ed0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
1ee0: 53 45 54 20 61 20 3d 20 27 32 30 32 2e 32 30 32  SET a = '202.202
1ef0: 2e 32 30 32 2e 32 30 32 2e 32 30 32 27 20 57 48  .202.202.202' WH
1f00: 45 52 45 20 61 20 4c 49 4b 45 20 27 32 30 31 25  ERE a LIKE '201%
1f10: 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  ';.    COMMIT;. 
1f20: 20 7d 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a   }.} -cleanup {.
1f30: 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64    do_test shared
1f40: 5f 69 6f 65 72 72 2d 33 2e 24 6e 2e 63 6c 65 61  _ioerr-3.$n.clea
1f50: 6e 75 70 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69  nup.1 {.    sqli
1f60: 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54  te3_step $::STMT
1f70: 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 52 4f 57  .  } {SQLITE_ROW
1f80: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  }.  do_test shar
1f90: 65 64 5f 69 6f 65 72 72 2d 33 2e 24 6e 2e 63 6c  ed_ioerr-3.$n.cl
1fa0: 65 61 6e 75 70 2e 32 20 7b 0a 20 20 20 20 73 71  eanup.2 {.    sq
1fb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1fc0: 74 20 24 3a 3a 53 54 4d 54 20 30 0a 20 20 7d 20  t $::STMT 0.  } 
1fd0: 7b 30 30 32 2e 30 30 32 2e 30 30 32 2e 30 30 32  {002.002.002.002
1fe0: 2e 30 30 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20  .002}.  do_test 
1ff0: 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 33 2e 24  shared_ioerr-3.$
2000: 6e 2e 63 6c 65 61 6e 75 70 2e 33 20 7b 0a 20 20  n.cleanup.3 {.  
2010: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2020: 7a 65 20 24 3a 3a 53 54 4d 54 0a 20 20 7d 20 7b  ze $::STMT.  } {
2030: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 23 20 64 62 32  SQLITE_OK}.# db2
2040: 20 65 76 61 6c 20 7b 73 65 6c 65 63 74 20 2a 20   eval {select * 
2050: 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
2060: 65 72 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  er}.  db2 close.
2070: 7d 0a 0a 23 20 4f 6e 6c 79 20 72 75 6e 20 74 68  }..# Only run th
2080: 65 73 65 20 74 65 73 74 73 20 69 66 20 6d 65 6d  ese tests if mem
2090: 6f 72 79 20 64 65 62 75 67 67 69 6e 67 20 69 73  ory debugging is
20a0: 20 74 75 72 6e 65 64 20 6f 6e 2e 0a 23 0a 69 66   turned on..#.if
20b0: 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 20   {[info command 
20c0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73 74  sqlite_malloc_st
20d0: 61 74 5d 3d 3d 22 22 7d 20 7b 0a 20 20 20 70 75  at]==""} {.   pu
20e0: 74 73 20 22 53 6b 69 70 70 69 6e 67 20 6d 61 6c  ts "Skipping mal
20f0: 6c 6f 63 20 74 65 73 74 73 3a 20 6e 6f 74 20 63  loc tests: not c
2100: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53  ompiled with -DS
2110: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 2e 2e  QLITE_MEMDEBUG..
2120: 2e 22 0a 20 20 20 66 69 6e 69 73 68 5f 74 65 73  .".   finish_tes
2130: 74 0a 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23  t.   return.}..#
2140: 20 50 72 6f 76 6f 6b 65 20 61 20 6d 61 6c 6c 6f   Provoke a mallo
2150: 63 28 29 20 66 61 69 6c 75 72 65 20 77 68 65 6e  c() failure when
2160: 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   a cursor positi
2170: 6f 6e 20 69 73 20 62 65 69 6e 67 20 73 61 76 65  on is being save
2180: 64 2e 20 54 68 69 73 0a 23 20 6f 6e 6c 79 20 68  d. This.# only h
2190: 61 70 70 65 6e 73 20 77 69 74 68 20 69 6e 64 65  appens with inde
21a0: 78 20 63 75 72 73 6f 72 73 20 28 62 65 63 61 75  x cursors (becau
21b0: 73 65 20 74 68 65 79 20 6d 61 6c 6c 6f 63 28 29  se they malloc()
21c0: 20 73 70 61 63 65 20 74 6f 20 73 61 76 65 20 74   space to save t
21d0: 68 65 0a 23 20 63 75 72 72 65 6e 74 20 6b 65 79  he.# current key
21e0: 20 76 61 6c 75 65 29 2e 20 49 74 20 64 6f 65 73   value). It does
21f0: 20 6e 6f 74 20 68 61 70 70 65 6e 20 77 69 74 68   not happen with
2200: 20 74 61 62 6c 65 73 2c 20 62 65 63 61 75 73 65   tables, because
2210: 20 61 6e 20 69 6e 74 65 67 65 72 0a 23 20 6b 65   an integer.# ke
2220: 79 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  y does not requi
2230: 72 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 74 6f  re a malloc() to
2240: 20 73 74 6f 72 65 2e 20 0a 23 0a 23 20 54 68 65   store. .#.# The
2250: 20 6c 69 62 72 61 72 79 20 73 68 6f 75 6c 64 20   library should 
2260: 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
2270: 5f 4e 4f 4d 45 4d 20 74 6f 20 74 68 65 20 63 61  _NOMEM to the ca
2280: 6c 6c 65 72 2e 20 54 68 65 20 71 75 65 72 79 20  ller. The query 
2290: 74 68 61 74 0a 23 20 6f 77 6e 73 20 74 68 65 20  that.# owns the 
22a0: 63 75 72 73 6f 72 20 28 74 68 65 20 6f 6e 65 20  cursor (the one 
22b0: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
22c0: 73 69 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73 61  sition is not sa
22d0: 76 65 64 29 20 73 68 6f 75 6c 64 0a 23 20 63 6f  ved) should.# co
22e0: 6e 74 69 6e 75 65 20 75 6e 61 66 66 65 63 74 65  ntinue unaffecte
22f0: 64 2e 0a 23 20 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f  d..# .do_malloc_
2300: 74 65 73 74 20 34 20 2d 74 63 6c 70 72 65 70 20  test 4 -tclprep 
2310: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
2320: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
2330: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 72  l {.    PRAGMA r
2340: 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead_uncommitted 
2350: 3d 20 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  = 1;.    BEGIN;.
2360: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2370: 20 74 31 28 61 2c 20 62 2c 20 55 4e 49 51 55 45   t1(a, b, UNIQUE
2380: 28 61 2c 20 62 29 29 3b 0a 20 20 7d 20 64 62 32  (a, b));.  } db2
2390: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
23a0: 20 7b 24 69 20 3c 20 35 7d 20 7b 69 6e 63 72 20   {$i < 5} {incr 
23b0: 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 61 20 5b  i} {.    set a [
23c0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 24 69  string repeat $i
23d0: 20 31 30 5d 0a 20 20 20 20 73 65 74 20 62 20 5b   10].    set b [
23e0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 24 69  string repeat $i
23f0: 20 32 30 30 30 5d 0a 20 20 20 20 65 78 65 63 73   2000].    execs
2400: 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql {INSERT INTO 
2410: 74 31 20 56 41 4c 55 45 53 28 24 61 2c 20 24 62  t1 VALUES($a, $b
2420: 29 7d 20 64 62 32 0a 20 20 7d 0a 20 20 65 78 65  )} db2.  }.  exe
2430: 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 20 64 62  csql {COMMIT} db
2440: 32 0a 20 20 73 65 74 20 3a 3a 44 42 32 20 5b 73  2.  set ::DB2 [s
2450: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
2460: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32 5d 0a 20  n_pointer db2]. 
2470: 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71 6c   set ::STMT [sql
2480: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a  ite3_prepare $::
2490: 44 42 32 20 22 53 45 4c 45 43 54 20 61 20 46 52  DB2 "SELECT a FR
24a0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
24b0: 22 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 73 71  " -1 DUMMY].  sq
24c0: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
24d0: 4d 54 20 20 20 20 20 20 20 3b 23 20 43 75 72 73  MT       ;# Curs
24e0: 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 30 30 30  or points at 000
24f0: 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65  0000000.  sqlite
2500: 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 20 20  3_step $::STMT  
2510: 20 20 20 20 20 3b 23 20 43 75 72 73 6f 72 20 70       ;# Cursor p
2520: 6f 69 6e 74 73 20 61 74 20 31 31 31 31 31 31 31  oints at 1111111
2530: 31 31 31 0a 7d 20 2d 74 63 6c 62 6f 64 79 20 7b  111.} -tclbody {
2540: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2550: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2560: 56 41 4c 55 45 53 28 36 2c 20 4e 55 4c 4c 29 3b  VALUES(6, NULL);
2570: 0a 20 20 7d 0a 7d 20 2d 63 6c 65 61 6e 75 70 20  .  }.} -cleanup 
2580: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  {.  do_test shar
2590: 65 64 5f 6d 61 6c 6c 6f 63 2d 34 2e 24 3a 3a 6e  ed_malloc-4.$::n
25a0: 2e 63 6c 65 61 6e 75 70 2e 31 20 7b 0a 20 20 20  .cleanup.1 {.   
25b0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a   sqlite3_step $:
25c0: 3a 53 54 4d 54 0a 20 20 7d 20 7b 53 51 4c 49 54  :STMT.  } {SQLIT
25d0: 45 5f 52 4f 57 7d 0a 20 20 64 6f 5f 74 65 73 74  E_ROW}.  do_test
25e0: 20 73 68 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 34   shared_malloc-4
25f0: 2e 24 3a 3a 6e 2e 63 6c 65 61 6e 75 70 2e 32 20  .$::n.cleanup.2 
2600: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  {.    sqlite3_co
2610: 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 53 54 4d  lumn_text $::STM
2620: 54 20 30 0a 20 20 7d 20 7b 32 32 32 32 32 32 32  T 0.  } {2222222
2630: 32 32 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 73  222}.  do_test s
2640: 68 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 34 2e 24  hared_malloc-4.$
2650: 3a 3a 6e 2e 63 6c 65 61 6e 75 70 2e 33 20 7b 0a  ::n.cleanup.3 {.
2660: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2670: 6c 69 7a 65 20 24 3a 3a 53 54 4d 54 0a 20 20 7d  lize $::STMT.  }
2680: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 23 20 64   {SQLITE_OK}.# d
2690: 62 32 20 65 76 61 6c 20 7b 73 65 6c 65 63 74 20  b2 eval {select 
26a0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  * from sqlite_ma
26b0: 73 74 65 72 7d 0a 20 20 64 62 32 20 63 6c 6f 73  ster}.  db2 clos
26c0: 65 0a 7d 0a 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74  e.}..do_malloc_t
26d0: 65 73 74 20 35 20 2d 74 63 6c 62 6f 64 79 20 7b  est 5 -tclbody {
26e0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 58 20 74  .  sqlite3 dbX t
26f0: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
2700: 20 64 62 59 20 74 65 73 74 2e 64 62 0a 20 20 64   dbY test.db.  d
2710: 62 58 20 63 6c 6f 73 65 0a 20 20 64 62 59 20 63  bX close.  dbY c
2720: 6c 6f 73 65 0a 7d 20 2d 63 6c 65 61 6e 75 70 20  lose.} -cleanup 
2730: 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 58 20 63  {.  catch {dbX c
2740: 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20 7b 64  lose}.  catch {d
2750: 62 59 20 63 6c 6f 73 65 7d 0a 7d 0a 0a 63 61 74  bY close}.}..cat
2760: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 73 71  ch {db close}.sq
2770: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
2780: 72 65 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e 61  red_cache $::ena
2790: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
27a0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.