/ Hex Artifact Content
Login

Artifact ca197017cb84146a99937fc3183b4c9371bf0b4b:


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 32 33 20 32 30 30 38  test,v 1.23 2008
0260: 2f 30 39 2f 32 39 20 31 34 3a 31 32 3a 35 37 20  /09/29 14:12:57 
0270: 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20  danielk1977 Exp 
0280: 24 0a 0a 70 72 6f 63 20 73 6b 69 70 20 7b 61 72  $..proc skip {ar
0290: 67 73 7d 20 7b 7d 0a 0a 0a 73 65 74 20 74 65 73  gs} {}...set tes
02a0: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
02b0: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
02c0: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
02d0: 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 65  r.tcl.source $te
02e0: 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f 6d  stdir/malloc_com
02f0: 6d 6f 6e 2e 74 63 6c 0a 64 62 20 63 6c 6f 73 65  mon.tcl.db close
0300: 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 73 68 61  ..ifcapable !sha
0310: 72 65 64 5f 63 61 63 68 65 7c 7c 21 73 75 62 71  red_cache||!subq
0320: 75 65 72 79 20 7b 0a 20 20 66 69 6e 69 73 68 5f  uery {.  finish_
0330: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
0340: 0a 73 65 74 20 3a 3a 65 6e 61 62 6c 65 5f 73 68  .set ::enable_sh
0350: 61 72 65 64 5f 63 61 63 68 65 20 5b 73 71 6c 69  ared_cache [sqli
0360: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
0370: 64 5f 63 61 63 68 65 20 31 5d 0a 0a 64 6f 5f 69  d_cache 1]..do_i
0380: 6f 65 72 72 5f 74 65 73 74 20 73 68 61 72 65 64  oerr_test shared
0390: 5f 69 6f 65 72 72 2d 31 20 2d 74 63 6c 70 72 65  _ioerr-1 -tclpre
03a0: 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  p {.  sqlite3 db
03b0: 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  2 test.db.  exec
03c0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
03d0: 20 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65   read_uncommitte
03e0: 64 20 3d 20 31 3b 0a 20 20 20 20 43 52 45 41 54  d = 1;.    CREAT
03f0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
0400: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
0410: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0420: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
0430: 20 7d 20 64 62 32 0a 7d 20 2d 73 71 6c 62 6f 64   } db2.} -sqlbod
0440: 79 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  y {.  SELECT * F
0450: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
0460: 72 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  r;.  INSERT INTO
0470: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 2c 33   t1 VALUES(1,2,3
0480: 29 3b 0a 20 20 42 45 47 49 4e 20 54 52 41 4e 53  );.  BEGIN TRANS
0490: 41 43 54 49 4f 4e 3b 0a 20 20 49 4e 53 45 52 54  ACTION;.  INSERT
04a0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
04b0: 31 2c 32 2c 33 29 3b 0a 20 20 49 4e 53 45 52 54  1,2,3);.  INSERT
04c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
04d0: 34 2c 35 2c 36 29 3b 0a 20 20 52 4f 4c 4c 42 41  4,5,6);.  ROLLBA
04e0: 43 4b 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  CK;.  SELECT * F
04f0: 52 4f 4d 20 74 31 3b 0a 20 20 42 45 47 49 4e 20  ROM t1;.  BEGIN 
0500: 54 52 41 4e 53 41 43 54 49 4f 4e 3b 0a 20 20 49  TRANSACTION;.  I
0510: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0520: 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 49  LUES(1,2,3);.  I
0530: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0540: 4c 55 45 53 28 34 2c 35 2c 36 29 3b 0a 20 20 43  LUES(4,5,6);.  C
0550: 4f 4d 4d 49 54 3b 0a 20 20 53 45 4c 45 43 54 20  OMMIT;.  SELECT 
0560: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 44 45 4c  * FROM t1;.  DEL
0570: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
0580: 45 20 61 3c 31 30 30 3b 0a 7d 20 2d 63 6c 65 61  E a<100;.} -clea
0590: 6e 75 70 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  nup {.  do_test 
05a0: 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 31 2e 24  shared_ioerr-1.$
05b0: 6e 2e 63 6c 65 61 6e 75 70 2e 31 20 7b 0a 20 20  n.cleanup.1 {.  
05c0: 20 20 73 65 74 20 72 65 73 20 5b 63 61 74 63 68    set res [catch
05d0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
05e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
05f0: 20 20 7d 20 64 62 32 5d 0a 20 20 20 20 73 65 74    } db2].    set
0600: 20 70 6f 73 73 69 62 6c 65 5f 72 65 73 75 6c 74   possible_result
0610: 73 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20  s [list         
0620: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 22 31        \.      "1
0630: 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   {disk I/O error
0640: 7d 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }"              
0650: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 22 30 20       \.      "0 
0660: 7b 31 20 32 20 33 7d 22 20 20 20 20 20 20 20 20  {1 2 3}"        
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0680: 20 20 20 20 5c 0a 20 20 20 20 20 20 22 30 20 7b      \.      "0 {
0690: 31 20 32 20 33 20 31 20 32 20 33 20 34 20 35 20  1 2 3 1 2 3 4 5 
06a0: 36 7d 22 20 20 20 20 20 20 20 20 20 20 20 20 20  6}"             
06b0: 20 20 20 5c 0a 20 20 20 20 20 20 22 30 20 7b 31     \.      "0 {1
06c0: 20 32 20 33 20 31 20 32 20 33 20 34 20 35 20 36   2 3 1 2 3 4 5 6
06d0: 20 31 20 32 20 33 20 34 20 35 20 36 7d 22 20 20   1 2 3 4 5 6}"  
06e0: 20 20 5c 0a 20 20 20 20 20 20 22 30 20 7b 7d 22    \.      "0 {}"
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 20 5c 0a 20 20 20 20 20 20 22 31 20 7b 64 61 74   \.      "1 {dat
0720: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
0730: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 7d 22 20   is malformed}" 
0740: 5c 0a 20 20 20 20 5d 0a 20 20 20 20 73 65 74 20  \.    ].    set 
0750: 72 63 20 5b 65 78 70 72 20 5b 6c 73 65 61 72 63  rc [expr [lsearc
0760: 68 20 2d 65 78 61 63 74 20 24 70 6f 73 73 69 62  h -exact $possib
0770: 6c 65 5f 72 65 73 75 6c 74 73 20 24 72 65 73 5d  le_results $res]
0780: 20 3e 3d 20 30 5d 0a 20 20 20 20 69 66 20 7b 24   >= 0].    if {$
0790: 72 63 20 21 3d 20 31 7d 20 7b 0a 20 20 20 20 20  rc != 1} {.     
07a0: 20 70 75 74 73 20 22 22 0a 20 20 20 20 20 20 70   puts "".      p
07b0: 75 74 73 20 22 52 65 73 75 6c 74 3a 20 24 72 65  uts "Result: $re
07c0: 73 22 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  s".    }.    set
07d0: 20 72 63 0a 20 20 7d 20 7b 31 7d 0a 0a 20 20 23   rc.  } {1}..  #
07e0: 20 54 68 65 20 22 64 61 74 61 62 61 73 65 20 64   The "database d
07f0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
0800: 66 6f 72 6d 65 64 22 20 69 73 20 61 20 73 70 65  formed" is a spe
0810: 63 69 61 6c 20 63 61 73 65 20 74 68 61 74 20 63  cial case that c
0820: 61 6e 0a 20 20 23 20 6f 63 63 75 72 20 69 66 20  an.  # occur if 
0830: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
0840: 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
0850: 62 61 63 6b 20 69 6e 20 74 68 65 20 7b 53 45 4c  back in the {SEL
0860: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
0870: 20 23 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f   # statement abo
0880: 76 65 2e 20 54 68 69 73 20 74 65 73 74 20 69 73  ve. This test is
0890: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
08a0: 65 72 65 20 69 73 20 6e 6f 20 72 65 61 6c 20 64  ere is no real d
08b0: 61 74 61 62 61 73 65 0a 20 20 23 20 63 6f 72 72  atabase.  # corr
08c0: 75 70 74 69 6f 6e 2e 0a 20 20 64 62 32 20 63 6c  uption..  db2 cl
08d0: 6f 73 65 0a 20 20 64 6f 5f 74 65 73 74 20 73 68  ose.  do_test sh
08e0: 61 72 65 64 5f 69 6f 65 72 72 2d 31 2e 24 6e 2e  ared_ioerr-1.$n.
08f0: 63 6c 65 61 6e 75 70 2e 32 20 7b 0a 20 20 20 20  cleanup.2 {.    
0900: 65 78 65 63 73 71 6c 20 7b 70 72 61 67 6d 61 20  execsql {pragma 
0910: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d  integrity_check}
0920: 20 64 62 0a 20 20 7d 20 7b 6f 6b 7d 0a 7d 0a 0a   db.  } {ok}.}..
0930: 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20 73 68  do_ioerr_test sh
0940: 61 72 65 64 5f 69 6f 65 72 72 2d 32 20 2d 74 63  ared_ioerr-2 -tc
0950: 6c 70 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65  lprep {.  sqlite
0960: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
0970: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
0980: 41 47 4d 41 20 72 65 61 64 5f 75 6e 63 6f 6d 6d  AGMA read_uncomm
0990: 69 74 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 42  itted = 1;.    B
09a0: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
09b0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
09c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
09d0: 20 74 31 28 6f 69 64 29 20 56 41 4c 55 45 53 28   t1(oid) VALUES(
09e0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52  NULL);.    INSER
09f0: 54 20 49 4e 54 4f 20 74 31 28 6f 69 64 29 20 53  T INTO t1(oid) S
0a00: 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20  ELECT NULL FROM 
0a10: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
0a20: 4e 54 4f 20 74 31 28 6f 69 64 29 20 53 45 4c 45  NTO t1(oid) SELE
0a30: 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b  CT NULL FROM t1;
0a40: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0a50: 20 74 31 28 6f 69 64 29 20 53 45 4c 45 43 54 20   t1(oid) SELECT 
0a60: 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20  NULL FROM t1;.  
0a70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0a80: 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e 55 4c  (oid) SELECT NUL
0a90: 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  L FROM t1;.    I
0aa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 6f 69  NSERT INTO t1(oi
0ab0: 64 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46  d) SELECT NULL F
0ac0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
0ad0: 52 54 20 49 4e 54 4f 20 74 31 28 6f 69 64 29 20  RT INTO t1(oid) 
0ae0: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d  SELECT NULL FROM
0af0: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
0b00: 49 4e 54 4f 20 74 31 28 6f 69 64 29 20 53 45 4c  INTO t1(oid) SEL
0b10: 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31  ECT NULL FROM t1
0b20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0b30: 4f 20 74 31 28 6f 69 64 29 20 53 45 4c 45 43 54  O t1(oid) SELECT
0b40: 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20   NULL FROM t1;. 
0b50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0b60: 31 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e 55  1(oid) SELECT NU
0b70: 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  LL FROM t1;.    
0b80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 6f  INSERT INTO t1(o
0b90: 69 64 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20  id) SELECT NULL 
0ba0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55 50 44  FROM t1;.    UPD
0bb0: 41 54 45 20 74 31 20 73 65 74 20 61 20 3d 20 6f  ATE t1 set a = o
0bc0: 69 64 2c 20 62 20 3d 20 27 61 62 63 64 65 66 67  id, b = 'abcdefg
0bd0: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
0be0: 78 79 7a 30 31 32 33 34 35 36 37 38 39 27 3b 0a  xyz0123456789';.
0bf0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
0c00: 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
0c10: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 42 45    COMMIT;.    BE
0c20: 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  GIN;.    SELECT 
0c30: 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
0c40: 73 74 65 72 3b 0a 20 20 7d 20 64 62 32 0a 7d 20  ster;.  } db2.} 
0c50: 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20 73 65 74  -tclbody {.  set
0c60: 20 3a 3a 72 65 73 69 64 78 20 30 0a 20 20 65 78   ::residx 0.  ex
0c70: 65 63 73 71 6c 20 7b 44 45 4c 45 54 45 20 46 52  ecsql {DELETE FR
0c80: 4f 4d 20 74 31 20 57 48 45 52 45 20 30 20 3d 20  OM t1 WHERE 0 = 
0c90: 28 61 20 25 20 32 29 3b 7d 0a 20 20 69 6e 63 72  (a % 2);}.  incr
0ca0: 20 3a 3a 72 65 73 69 64 78 0a 0a 20 20 23 20 57   ::residx..  # W
0cb0: 68 65 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hen this transac
0cc0: 74 69 6f 6e 20 62 65 67 69 6e 73 20 74 68 65 20  tion begins the 
0cd0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 35  table contains 5
0ce0: 31 32 20 65 6e 74 72 69 65 73 2e 20 54 68 65 0a  12 entries. The.
0cf0: 20 20 23 20 74 77 6f 20 73 74 61 74 65 6d 65 6e    # two statemen
0d00: 74 73 20 74 6f 67 65 74 68 65 72 20 61 64 64 20  ts together add 
0d10: 35 31 32 2b 31 34 36 20 6d 6f 72 65 20 69 66 20  512+146 more if 
0d20: 69 74 20 73 75 63 63 65 65 64 73 2e 20 0a 20 20  it succeeds. .  
0d30: 23 20 28 31 30 32 34 2f 37 3d 3d 31 34 36 29 0a  # (1024/7==146).
0d40: 20 20 65 78 65 63 73 71 6c 20 7b 42 45 47 49 4e    execsql {BEGIN
0d50: 3b 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 49 4e  ;}.  execsql {IN
0d60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0d70: 45 43 54 20 61 2b 31 2c 20 62 20 46 52 4f 4d 20  ECT a+1, b FROM 
0d80: 74 31 3b 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  t1;}.  execsql {
0d90: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
0da0: 45 4c 45 43 54 20 27 73 74 72 69 6e 67 27 20 7c  ELECT 'string' |
0db0: 7c 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 20 57  | a, b FROM t1 W
0dc0: 48 45 52 45 20 30 20 3d 20 28 61 25 37 29 3b 7d  HERE 0 = (a%7);}
0dd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 4f 4d 4d  .  execsql {COMM
0de0: 49 54 3b 7d 0a 0a 20 20 69 6e 63 72 20 3a 3a 72  IT;}..  incr ::r
0df0: 65 73 69 64 78 0a 7d 20 2d 63 6c 65 61 6e 75 70  esidx.} -cleanup
0e00: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 52 4f   {.  catchsql RO
0e10: 4c 4c 42 41 43 4b 0a 20 20 64 6f 5f 74 65 73 74  LLBACK.  do_test
0e20: 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 32 2e   shared_ioerr-2.
0e30: 24 6e 2e 63 6c 65 61 6e 75 70 2e 31 20 7b 0a 20  $n.cleanup.1 {. 
0e40: 20 20 20 73 65 74 20 72 65 73 20 5b 63 61 74 63     set res [catc
0e50: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  hsql {.      SEL
0e60: 45 43 54 20 6d 61 78 28 61 29 2c 20 6d 69 6e 28  ECT max(a), min(
0e70: 61 29 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  a), count(*) FRO
0e80: 4d 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  M (SELECT a FROM
0e90: 20 74 31 20 6f 72 64 65 72 20 62 79 20 61 29 3b   t1 order by a);
0ea0: 0a 20 20 20 20 7d 20 64 62 32 5d 0a 20 20 20 20  .    } db2].    
0eb0: 73 65 74 20 70 6f 73 73 69 62 6c 65 5f 72 65 73  set possible_res
0ec0: 75 6c 74 73 20 5b 6c 69 73 74 20 5c 0a 20 20 20  ults [list \.   
0ed0: 20 20 20 7b 30 20 7b 31 30 32 34 20 31 20 31 30     {0 {1024 1 10
0ee0: 32 34 7d 7d 20 20 20 20 20 20 20 20 5c 0a 20 20  24}}        \.  
0ef0: 20 20 20 20 7b 30 20 7b 31 30 32 33 20 31 20 35      {0 {1023 1 5
0f00: 31 32 7d 7d 20 20 20 20 20 20 20 20 20 5c 0a 20  12}}         \. 
0f10: 20 20 20 20 20 7b 30 20 7b 73 74 72 69 6e 67 39       {0 {string9
0f20: 39 34 20 31 20 31 31 37 30 7d 7d 20 20 20 5c 0a  94 1 1170}}   \.
0f30: 20 20 20 20 5d 0a 20 20 20 20 73 65 74 20 69 64      ].    set id
0f40: 78 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63  x [lsearch -exac
0f50: 74 20 24 70 6f 73 73 69 62 6c 65 5f 72 65 73 75  t $possible_resu
0f60: 6c 74 73 20 24 72 65 73 5d 0a 20 20 20 20 73 65  lts $res].    se
0f70: 74 20 73 75 63 63 65 73 73 20 5b 65 78 70 72 20  t success [expr 
0f80: 7b 24 69 64 78 3d 3d 24 3a 3a 72 65 73 69 64 78  {$idx==$::residx
0f90: 20 7c 7c 20 24 72 65 73 3d 3d 22 31 20 7b 64 69   || $res=="1 {di
0fa0: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 22 7d 5d  sk I/O error}"}]
0fb0: 0a 20 20 20 20 69 66 20 7b 21 24 73 75 63 63 65  .    if {!$succe
0fc0: 73 73 7d 20 7b 0a 20 20 20 20 20 20 70 75 74 73  ss} {.      puts
0fd0: 20 22 22 0a 20 20 20 20 20 20 70 75 74 73 20 22   "".      puts "
0fe0: 52 65 73 75 6c 74 3a 20 5c 22 24 72 65 73 5c 22  Result: \"$res\"
0ff0: 20 28 24 3a 3a 72 65 73 69 64 78 29 22 0a 20 20   ($::residx)".  
1000: 20 20 7d 0a 20 20 20 20 73 65 74 20 73 75 63 63    }.    set succ
1010: 65 73 73 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 62  ess.  } {1}.  db
1020: 32 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 54 68 69  2 close.}..# Thi
1030: 73 20 74 65 73 74 20 69 73 20 64 65 73 69 67 6e  s test is design
1040: 65 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20 61 6e  ed to provoke an
1050: 20 49 4f 20 65 72 72 6f 72 20 77 68 65 6e 20 61   IO error when a
1060: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1070: 20 69 73 0a 23 20 22 73 61 76 65 64 22 20 28 62   is.# "saved" (b
1080: 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 20 63  ecause another c
1090: 75 72 73 6f 72 20 69 73 20 67 6f 69 6e 67 20 74  ursor is going t
10a0: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 75 6e 64  o modify the und
10b0: 65 72 6c 79 69 6e 67 20 74 61 62 6c 65 29 2e 20  erlying table). 
10c0: 0a 23 20 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73  .# .do_ioerr_tes
10d0: 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 33  t shared_ioerr-3
10e0: 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 73 71   -tclprep {.  sq
10f0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
1100: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
1110: 20 20 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e    PRAGMA read_un
1120: 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20  committed = 1;. 
1130: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
1140: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42  size = 10;.    B
1150: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
1160: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
1170: 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20  UNIQUE(a, b));. 
1180: 20 7d 20 64 62 32 0a 20 20 66 6f 72 20 7b 73 65   } db2.  for {se
1190: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 32 30 30  t i 0} {$i < 200
11a0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
11b0: 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67 20 72   set a [string r
11c0: 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70  ange [string rep
11d0: 65 61 74 20 22 5b 66 6f 72 6d 61 74 20 25 30 33  eat "[format %03
11e0: 64 20 24 69 5d 2e 22 20 35 5d 20 30 20 65 6e 64  d $i]." 5] 0 end
11f0: 2d 31 5d 0a 0a 20 20 20 20 73 65 74 20 62 20 5b  -1]..    set b [
1200: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 24 69  string repeat $i
1210: 20 32 30 30 30 5d 0a 20 20 20 20 65 78 65 63 73   2000].    execs
1220: 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql {INSERT INTO 
1230: 74 31 20 56 41 4c 55 45 53 28 24 61 2c 20 24 62  t1 VALUES($a, $b
1240: 29 7d 20 64 62 32 0a 20 20 7d 0a 20 20 65 78 65  )} db2.  }.  exe
1250: 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 20 64 62  csql {COMMIT} db
1260: 32 0a 20 20 73 65 74 20 3a 3a 44 42 32 20 5b 73  2.  set ::DB2 [s
1270: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
1280: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32 5d 0a 20  n_pointer db2]. 
1290: 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71 6c   set ::STMT [sql
12a0: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a  ite3_prepare $::
12b0: 44 42 32 20 22 53 45 4c 45 43 54 20 61 20 46 52  DB2 "SELECT a FR
12c0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
12d0: 22 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 73 71  " -1 DUMMY].  sq
12e0: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
12f0: 4d 54 20 20 20 20 20 20 20 3b 23 20 43 75 72 73  MT       ;# Curs
1300: 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 30 30 30  or points at 000
1310: 2e 30 30 30 2e 30 30 30 2e 30 30 30 0a 20 20 73  .000.000.000.  s
1320: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53  qlite3_step $::S
1330: 54 4d 54 20 20 20 20 20 20 20 3b 23 20 43 75 72  TMT       ;# Cur
1340: 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 30 30  sor points at 00
1350: 31 2e 30 30 31 2e 30 30 31 2e 30 30 31 0a 0a 7d  1.001.001.001..}
1360: 20 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20 65 78   -tclbody {.  ex
1370: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
1380: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
1390: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 32 30  TO t1 VALUES('20
13a0: 31 2e 32 30 31 2e 32 30 31 2e 32 30 31 2e 32 30  1.201.201.201.20
13b0: 31 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 55  1', NULL);.    U
13c0: 50 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d  PDATE t1 SET a =
13d0: 20 27 32 30 32 2e 32 30 32 2e 32 30 32 2e 32 30   '202.202.202.20
13e0: 32 2e 32 30 32 27 20 57 48 45 52 45 20 61 20 4c  2.202' WHERE a L
13f0: 49 4b 45 20 27 32 30 31 25 27 3b 0a 20 20 20 20  IKE '201%';.    
1400: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 2d 63  COMMIT;.  }.} -c
1410: 6c 65 61 6e 75 70 20 7b 0a 20 20 73 65 74 20 3a  leanup {.  set :
1420: 3a 73 74 65 70 72 63 20 20 5b 73 71 6c 69 74 65  :steprc  [sqlite
1430: 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 5d 0a  3_step $::STMT].
1440: 20 20 73 65 74 20 3a 3a 63 6f 6c 75 6d 6e 20 20    set ::column  
1450: 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  [sqlite3_column_
1460: 74 65 78 74 20 24 3a 3a 53 54 4d 54 20 30 5d 0a  text $::STMT 0].
1470: 20 20 73 65 74 20 3a 3a 66 69 6e 61 6c 72 63 20    set ::finalrc 
1480: 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a  [sqlite3_finaliz
1490: 65 20 24 3a 3a 53 54 4d 54 5d 0a 0a 20 20 23 20  e $::STMT]..  # 
14a0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
14b0: 70 6f 73 73 69 62 6c 65 20 6f 75 74 63 6f 6d 65  possible outcome
14c0: 73 20 68 65 72 65 20 28 61 73 73 75 6d 69 6e 67  s here (assuming
14d0: 20 70 65 72 73 69 73 74 65 6e 74 20 49 4f 20 65   persistent IO e
14e0: 72 72 6f 72 73 29 3a 0a 20 20 23 0a 20 20 23 20  rrors):.  #.  # 
14f0: 31 2e 20 49 66 20 74 68 65 20 5b 73 71 6c 69 74  1. If the [sqlit
1500: 65 33 5f 73 74 65 70 5d 20 64 69 64 20 6e 6f 74  e3_step] did not
1510: 20 72 65 71 75 69 72 65 20 61 6e 79 20 49 4f 20   require any IO 
1520: 28 72 65 71 75 69 72 65 64 20 70 61 67 65 73 20  (required pages 
1530: 69 6e 0a 20 20 23 20 20 20 20 74 68 65 20 63 61  in.  #    the ca
1540: 63 68 65 29 2c 20 74 68 65 6e 20 74 68 65 20 6e  che), then the n
1550: 65 78 74 20 72 6f 77 20 28 22 30 30 32 2e 2e 2e  ext row ("002...
1560: 22 29 20 6d 61 79 20 62 65 20 72 65 74 72 69 65  ") may be retrie
1570: 76 65 64 20 0a 20 20 23 20 20 20 20 73 75 63 63  ved .  #    succ
1580: 65 73 73 66 75 6c 6c 79 2e 0a 20 20 23 0a 20 20  essfully..  #.  
1590: 23 20 32 2e 20 49 66 20 74 68 65 20 5b 73 71 6c  # 2. If the [sql
15a0: 69 74 65 33 5f 73 74 65 70 5d 20 64 6f 65 73 20  ite3_step] does 
15b0: 72 65 71 75 69 72 65 20 49 4f 2c 20 74 68 65 6e  require IO, then
15c0: 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 5d 20   [sqlite3_step] 
15d0: 72 65 74 75 72 6e 73 0a 20 20 23 20 20 20 20 53  returns.  #    S
15e0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20  QLITE_ERROR and 
15f0: 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a  [sqlite3_finaliz
1600: 65 5d 20 72 65 74 75 72 6e 73 20 49 4f 45 52 52  e] returns IOERR
1610: 2e 0a 20 20 23 0a 20 20 23 20 33 2e 20 49 66 2c  ..  #.  # 3. If,
1620: 20 61 66 74 65 72 20 74 68 65 20 69 6e 69 74 69   after the initi
1630: 61 6c 20 49 4f 20 65 72 72 6f 72 2c 20 53 51 4c  al IO error, SQL
1640: 69 74 65 20 74 72 69 65 64 20 74 6f 20 72 6f 6c  ite tried to rol
1650: 6c 62 61 63 6b 20 74 68 65 0a 20 20 23 20 20 20  lback the.  #   
1660: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
1670: 69 6f 6e 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ion and a second
1680: 20 49 4f 20 65 72 72 6f 72 20 77 61 73 20 65 6e   IO error was en
1690: 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 0a  countered, then.
16a0: 20 20 23 20 20 20 20 73 74 61 74 65 6d 65 6e 74    #    statement
16b0: 20 24 3a 3a 53 54 4d 54 20 77 69 6c 6c 20 68 61   $::STMT will ha
16c0: 76 65 20 62 65 65 6e 20 61 62 6f 72 74 65 64 2e  ve been aborted.
16d0: 20 54 68 69 73 20 6d 65 61 6e 73 20 5b 73 71 6c   This means [sql
16e0: 69 74 65 33 5f 73 74 6d 74 5d 0a 20 20 23 20 20  ite3_stmt].  #  
16f0: 20 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45    returns SQLITE
1700: 5f 41 42 4f 52 54 2c 20 61 6e 64 20 74 68 65 20  _ABORT, and the 
1710: 73 74 61 74 65 6d 65 6e 74 20 63 75 72 73 6f 72  statement cursor
1720: 20 64 6f 65 73 20 6e 6f 74 20 6d 6f 76 65 2e 20   does not move. 
1730: 69 2e 65 2e 0a 20 20 23 20 20 20 20 5b 73 71 6c  i.e..  #    [sql
1740: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5d 20 73 74 69  ite3_column] sti
1750: 6c 6c 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  ll returns the c
1760: 75 72 72 65 6e 74 20 72 6f 77 20 28 22 30 30 31  urrent row ("001
1770: 2e 2e 2e 22 29 20 61 6e 64 0a 20 20 23 20 20 20  ...") and.  #   
1780: 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   [sqlite3_finali
1790: 7a 65 5d 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ze] returns SQLI
17a0: 54 45 5f 4f 4b 2e 0a 20 20 23 0a 0a 20 20 64 6f  TE_OK..  #..  do
17b0: 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69 6f 65  _test shared_ioe
17c0: 72 72 2d 33 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e  rr-3.$n.cleanup.
17d0: 31 20 7b 0a 20 20 20 20 65 78 70 72 20 7b 0a 20  1 {.    expr {. 
17e0: 20 20 20 20 20 24 3a 3a 73 74 65 70 72 63 20 65       $::steprc e
17f0: 71 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 7c  q "SQLITE_ROW" |
1800: 7c 20 0a 20 20 20 20 20 20 24 3a 3a 73 74 65 70  | .      $::step
1810: 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 45 52  rc eq "SQLITE_ER
1820: 52 4f 52 22 20 7c 7c 0a 20 20 20 20 20 20 24 3a  ROR" ||.      $:
1830: 3a 73 74 65 70 72 63 20 65 71 20 22 53 51 4c 49  :steprc eq "SQLI
1840: 54 45 5f 41 42 4f 52 54 22 20 0a 20 20 20 20 7d  TE_ABORT" .    }
1850: 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74 65  .  } {1}.  do_te
1860: 73 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d  st shared_ioerr-
1870: 33 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e 32 20 7b  3.$n.cleanup.2 {
1880: 0a 20 20 20 20 65 78 70 72 20 7b 0a 20 20 20 20  .    expr {.    
1890: 20 20 28 24 3a 3a 73 74 65 70 72 63 20 65 71 20    ($::steprc eq 
18a0: 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 26 26 20  "SQLITE_ROW" && 
18b0: 24 3a 3a 63 6f 6c 75 6d 6e 20 65 71 20 22 30 30  $::column eq "00
18c0: 32 2e 30 30 32 2e 30 30 32 2e 30 30 32 2e 30 30  2.002.002.002.00
18d0: 32 22 29 20 7c 7c 0a 20 20 20 20 20 20 28 24 3a  2") ||.      ($:
18e0: 3a 73 74 65 70 72 63 20 65 71 20 22 53 51 4c 49  :steprc eq "SQLI
18f0: 54 45 5f 45 52 52 4f 52 22 20 26 26 20 24 3a 3a  TE_ERROR" && $::
1900: 63 6f 6c 75 6d 6e 20 65 71 20 22 22 29 20 7c 7c  column eq "") ||
1910: 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65 70 72  .      ($::stepr
1920: 63 20 65 71 20 22 53 51 4c 49 54 45 5f 41 42 4f  c eq "SQLITE_ABO
1930: 52 54 22 20 26 26 20 24 3a 3a 63 6f 6c 75 6d 6e  RT" && $::column
1940: 20 65 71 20 22 30 30 31 2e 30 30 31 2e 30 30 31   eq "001.001.001
1950: 2e 30 30 31 2e 30 30 31 22 29 20 0a 20 20 20 20  .001.001") .    
1960: 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74  }.  } {1}.  do_t
1970: 65 73 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72  est shared_ioerr
1980: 2d 33 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e 33 20  -3.$n.cleanup.3 
1990: 7b 0a 20 20 20 20 65 78 70 72 20 7b 0a 20 20 20  {.    expr {.   
19a0: 20 20 20 28 24 3a 3a 73 74 65 70 72 63 20 65 71     ($::steprc eq
19b0: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 26 26   "SQLITE_ROW" &&
19c0: 20 24 3a 3a 66 69 6e 61 6c 72 63 20 65 71 20 22   $::finalrc eq "
19d0: 53 51 4c 49 54 45 5f 4f 4b 22 29 20 7c 7c 0a 20  SQLITE_OK") ||. 
19e0: 20 20 20 20 20 28 24 3a 3a 73 74 65 70 72 63 20       ($::steprc 
19f0: 65 71 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52  eq "SQLITE_ERROR
1a00: 22 20 26 26 20 24 3a 3a 66 69 6e 61 6c 72 63 20  " && $::finalrc 
1a10: 65 71 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52  eq "SQLITE_IOERR
1a20: 22 29 20 7c 7c 0a 20 20 20 20 20 20 28 24 3a 3a  ") ||.      ($::
1a30: 73 74 65 70 72 63 20 65 71 20 22 53 51 4c 49 54  steprc eq "SQLIT
1a40: 45 5f 45 52 52 4f 52 22 20 26 26 20 24 3a 3a 66  E_ERROR" && $::f
1a50: 69 6e 61 6c 72 63 20 65 71 20 22 53 51 4c 49 54  inalrc eq "SQLIT
1a60: 45 5f 41 42 4f 52 54 22 29 0a 20 20 20 20 7d 0a  E_ABORT").    }.
1a70: 20 20 7d 20 7b 31 7d 0a 0a 23 20 64 62 32 20 65    } {1}..# db2 e
1a80: 76 61 6c 20 7b 73 65 6c 65 63 74 20 2a 20 66 72  val {select * fr
1a90: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
1aa0: 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a  }.  db2 close.}.
1ab0: 0a 23 20 54 68 69 73 20 69 73 20 61 20 72 65 70  .# This is a rep
1ac0: 65 61 74 20 6f 66 20 74 68 65 20 70 72 65 76 69  eat of the previ
1ad0: 6f 75 73 20 74 65 73 74 20 65 78 63 65 70 74 20  ous test except 
1ae0: 74 68 61 74 20 74 68 69 73 20 74 69 6d 65 20 77  that this time w
1af0: 65 0a 23 20 61 72 65 20 64 6f 69 6e 67 20 61 20  e.# are doing a 
1b00: 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63  reverse-order sc
1b10: 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  an of the table 
1b20: 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  when the cursor 
1b30: 69 73 0a 23 20 22 73 61 76 65 64 22 2e 0a 23 20  is.# "saved"..# 
1b40: 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20 73  .do_ioerr_test s
1b50: 68 61 72 65 64 5f 69 6f 65 72 72 2d 33 72 65 76  hared_ioerr-3rev
1b60: 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 73 71   -tclprep {.  sq
1b70: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
1b80: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
1b90: 20 20 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e    PRAGMA read_un
1ba0: 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20  committed = 1;. 
1bb0: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
1bc0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42  size = 10;.    B
1bd0: 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45  EGIN;.    CREATE
1be0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
1bf0: 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20  UNIQUE(a, b));. 
1c00: 20 7d 20 64 62 32 0a 20 20 66 6f 72 20 7b 73 65   } db2.  for {se
1c10: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 32 30 30  t i 0} {$i < 200
1c20: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
1c30: 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67 20 72   set a [string r
1c40: 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70  ange [string rep
1c50: 65 61 74 20 22 5b 66 6f 72 6d 61 74 20 25 30 33  eat "[format %03
1c60: 64 20 24 69 5d 2e 22 20 35 5d 20 30 20 65 6e 64  d $i]." 5] 0 end
1c70: 2d 31 5d 0a 0a 20 20 20 20 73 65 74 20 62 20 5b  -1]..    set b [
1c80: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 24 69  string repeat $i
1c90: 20 32 30 30 30 5d 0a 20 20 20 20 65 78 65 63 73   2000].    execs
1ca0: 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql {INSERT INTO 
1cb0: 74 31 20 56 41 4c 55 45 53 28 24 61 2c 20 24 62  t1 VALUES($a, $b
1cc0: 29 7d 20 64 62 32 0a 20 20 7d 0a 20 20 65 78 65  )} db2.  }.  exe
1cd0: 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 20 64 62  csql {COMMIT} db
1ce0: 32 0a 20 20 73 65 74 20 3a 3a 44 42 32 20 5b 73  2.  set ::DB2 [s
1cf0: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
1d00: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32 5d 0a 20  n_pointer db2]. 
1d10: 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71 6c   set ::STMT [sql
1d20: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a  ite3_prepare $::
1d30: 44 42 32 20 5c 0a 20 20 20 20 20 20 20 20 20 20  DB2 \.          
1d40: 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   "SELECT a FROM 
1d50: 74 31 20 4f 52 44 45 52 20 42 59 20 61 20 44 45  t1 ORDER BY a DE
1d60: 53 43 22 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20  SC" -1 DUMMY].  
1d70: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a  sqlite3_step $::
1d80: 53 54 4d 54 20 20 20 20 20 20 20 3b 23 20 43 75  STMT       ;# Cu
1d90: 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 31  rsor points at 1
1da0: 39 39 2e 31 39 39 2e 31 39 39 2e 31 39 39 2e 31  99.199.199.199.1
1db0: 39 39 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  99.  sqlite3_ste
1dc0: 70 20 24 3a 3a 53 54 4d 54 20 20 20 20 20 20 20  p $::STMT       
1dd0: 3b 23 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 73  ;# Cursor points
1de0: 20 61 74 20 31 39 38 2e 31 39 38 2e 31 39 38 2e   at 198.198.198.
1df0: 31 39 38 2e 31 39 38 0a 0a 7d 20 2d 74 63 6c 62  198.198..} -tclb
1e00: 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ody {.  execsql 
1e10: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
1e20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1e30: 56 41 4c 55 45 53 28 27 32 30 31 2e 32 30 31 2e  VALUES('201.201.
1e40: 32 30 31 2e 32 30 31 2e 32 30 31 27 2c 20 4e 55  201.201.201', NU
1e50: 4c 4c 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  LL);.    UPDATE 
1e60: 74 31 20 53 45 54 20 61 20 3d 20 27 32 30 32 2e  t1 SET a = '202.
1e70: 32 30 32 2e 32 30 32 2e 32 30 32 2e 32 30 32 27  202.202.202.202'
1e80: 20 57 48 45 52 45 20 61 20 4c 49 4b 45 20 27 32   WHERE a LIKE '2
1e90: 30 31 25 27 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  01%';.    COMMIT
1ea0: 3b 0a 20 20 7d 0a 7d 20 2d 63 6c 65 61 6e 75 70  ;.  }.} -cleanup
1eb0: 20 7b 0a 20 20 73 65 74 20 3a 3a 73 74 65 70 72   {.  set ::stepr
1ec0: 63 20 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70  c  [sqlite3_step
1ed0: 20 24 3a 3a 53 54 4d 54 5d 0a 20 20 73 65 74 20   $::STMT].  set 
1ee0: 3a 3a 63 6f 6c 75 6d 6e 20 20 5b 73 71 6c 69 74  ::column  [sqlit
1ef0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24  e3_column_text $
1f00: 3a 3a 53 54 4d 54 20 30 5d 0a 20 20 73 65 74 20  ::STMT 0].  set 
1f10: 3a 3a 66 69 6e 61 6c 72 63 20 5b 73 71 6c 69 74  ::finalrc [sqlit
1f20: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53  e3_finalize $::S
1f30: 54 4d 54 5d 0a 0a 20 20 23 20 54 68 65 72 65 20  TMT]..  # There 
1f40: 61 72 65 20 74 68 72 65 65 20 70 6f 73 73 69 62  are three possib
1f50: 6c 65 20 6f 75 74 63 6f 6d 65 73 20 68 65 72 65  le outcomes here
1f60: 20 28 61 73 73 75 6d 69 6e 67 20 70 65 72 73 69   (assuming persi
1f70: 73 74 65 6e 74 20 49 4f 20 65 72 72 6f 72 73 29  stent IO errors)
1f80: 3a 0a 20 20 23 0a 20 20 23 20 31 2e 20 49 66 20  :.  #.  # 1. If 
1f90: 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 73 74 65  the [sqlite3_ste
1fa0: 70 5d 20 64 69 64 20 6e 6f 74 20 72 65 71 75 69  p] did not requi
1fb0: 72 65 20 61 6e 79 20 49 4f 20 28 72 65 71 75 69  re any IO (requi
1fc0: 72 65 64 20 70 61 67 65 73 20 69 6e 0a 20 20 23  red pages in.  #
1fd0: 20 20 20 20 74 68 65 20 63 61 63 68 65 29 2c 20      the cache), 
1fe0: 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  then the next ro
1ff0: 77 20 28 22 30 30 32 2e 2e 2e 22 29 20 6d 61 79  w ("002...") may
2000: 20 62 65 20 72 65 74 72 69 65 76 65 64 20 0a 20   be retrieved . 
2010: 20 23 20 20 20 20 73 75 63 63 65 73 73 66 75 6c   #    successful
2020: 6c 79 2e 0a 20 20 23 0a 20 20 23 20 32 2e 20 49  ly..  #.  # 2. I
2030: 66 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 73  f the [sqlite3_s
2040: 74 65 70 5d 20 64 6f 65 73 20 72 65 71 75 69 72  tep] does requir
2050: 65 20 49 4f 2c 20 74 68 65 6e 20 5b 73 71 6c 69  e IO, then [sqli
2060: 74 65 33 5f 73 74 65 70 5d 20 72 65 74 75 72 6e  te3_step] return
2070: 73 0a 20 20 23 20 20 20 20 53 51 4c 49 54 45 5f  s.  #    SQLITE_
2080: 45 52 52 4f 52 20 61 6e 64 20 5b 73 71 6c 69 74  ERROR and [sqlit
2090: 65 33 5f 66 69 6e 61 6c 69 7a 65 5d 20 72 65 74  e3_finalize] ret
20a0: 75 72 6e 73 20 49 4f 45 52 52 2e 0a 20 20 23 0a  urns IOERR..  #.
20b0: 20 20 23 20 33 2e 20 49 66 2c 20 61 66 74 65 72    # 3. If, after
20c0: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 49 4f 20   the initial IO 
20d0: 65 72 72 6f 72 2c 20 53 51 4c 69 74 65 20 74 72  error, SQLite tr
20e0: 69 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ied to rollback 
20f0: 74 68 65 0a 20 20 23 20 20 20 20 61 63 74 69 76  the.  #    activ
2100: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
2110: 64 20 61 20 73 65 63 6f 6e 64 20 49 4f 20 65 72  d a second IO er
2120: 72 6f 72 20 77 61 73 20 65 6e 63 6f 75 6e 74 65  ror was encounte
2130: 72 65 64 2c 20 74 68 65 6e 0a 20 20 23 20 20 20  red, then.  #   
2140: 20 73 74 61 74 65 6d 65 6e 74 20 24 3a 3a 53 54   statement $::ST
2150: 4d 54 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  MT will have bee
2160: 6e 20 61 62 6f 72 74 65 64 2e 20 54 68 69 73 20  n aborted. This 
2170: 6d 65 61 6e 73 20 5b 73 71 6c 69 74 65 33 5f 73  means [sqlite3_s
2180: 74 6d 74 5d 0a 20 20 23 20 20 20 20 72 65 74 75  tmt].  #    retu
2190: 72 6e 73 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  rns SQLITE_ABORT
21a0: 2c 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d  , and the statem
21b0: 65 6e 74 20 63 75 72 73 6f 72 20 64 6f 65 73 20  ent cursor does 
21c0: 6e 6f 74 20 6d 6f 76 65 2e 20 69 2e 65 2e 0a 20  not move. i.e.. 
21d0: 20 23 20 20 20 20 5b 73 71 6c 69 74 65 33 5f 63   #    [sqlite3_c
21e0: 6f 6c 75 6d 6e 5d 20 73 74 69 6c 6c 20 72 65 74  olumn] still ret
21f0: 75 72 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  urns the current
2200: 20 72 6f 77 20 28 22 30 30 31 2e 2e 2e 22 29 20   row ("001...") 
2210: 61 6e 64 0a 20 20 23 20 20 20 20 5b 73 71 6c 69  and.  #    [sqli
2220: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 5d 20 72 65  te3_finalize] re
2230: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
2240: 0a 20 20 23 0a 0a 20 20 64 6f 5f 74 65 73 74 20  .  #..  do_test 
2250: 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 33 72 65  shared_ioerr-3re
2260: 76 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e 31 20 7b  v.$n.cleanup.1 {
2270: 0a 20 20 20 20 65 78 70 72 20 7b 0a 20 20 20 20  .    expr {.    
2280: 20 20 24 3a 3a 73 74 65 70 72 63 20 65 71 20 22    $::steprc eq "
2290: 53 51 4c 49 54 45 5f 52 4f 57 22 20 7c 7c 20 0a  SQLITE_ROW" || .
22a0: 20 20 20 20 20 20 24 3a 3a 73 74 65 70 72 63 20        $::steprc 
22b0: 65 71 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52  eq "SQLITE_ERROR
22c0: 22 20 7c 7c 0a 20 20 20 20 20 20 24 3a 3a 73 74  " ||.      $::st
22d0: 65 70 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f  eprc eq "SQLITE_
22e0: 41 42 4f 52 54 22 20 0a 20 20 20 20 7d 0a 20 20  ABORT" .    }.  
22f0: 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20  } {1}.  do_test 
2300: 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 33 72 65  shared_ioerr-3re
2310: 76 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e 32 20 7b  v.$n.cleanup.2 {
2320: 0a 20 20 20 20 65 78 70 72 20 7b 0a 20 20 20 20  .    expr {.    
2330: 20 20 28 24 3a 3a 73 74 65 70 72 63 20 65 71 20    ($::steprc eq 
2340: 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 26 26 20  "SQLITE_ROW" && 
2350: 24 3a 3a 63 6f 6c 75 6d 6e 20 65 71 20 22 31 39  $::column eq "19
2360: 37 2e 31 39 37 2e 31 39 37 2e 31 39 37 2e 31 39  7.197.197.197.19
2370: 37 22 29 20 7c 7c 0a 20 20 20 20 20 20 28 24 3a  7") ||.      ($:
2380: 3a 73 74 65 70 72 63 20 65 71 20 22 53 51 4c 49  :steprc eq "SQLI
2390: 54 45 5f 45 52 52 4f 52 22 20 26 26 20 24 3a 3a  TE_ERROR" && $::
23a0: 63 6f 6c 75 6d 6e 20 65 71 20 22 22 29 20 7c 7c  column eq "") ||
23b0: 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65 70 72  .      ($::stepr
23c0: 63 20 65 71 20 22 53 51 4c 49 54 45 5f 41 42 4f  c eq "SQLITE_ABO
23d0: 52 54 22 20 26 26 20 24 3a 3a 63 6f 6c 75 6d 6e  RT" && $::column
23e0: 20 65 71 20 22 31 39 38 2e 31 39 38 2e 31 39 38   eq "198.198.198
23f0: 2e 31 39 38 2e 31 39 38 22 29 20 0a 20 20 20 20  .198.198") .    
2400: 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74  }.  } {1}.  do_t
2410: 65 73 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72  est shared_ioerr
2420: 2d 33 72 65 76 2e 24 6e 2e 63 6c 65 61 6e 75 70  -3rev.$n.cleanup
2430: 2e 33 20 7b 0a 20 20 20 20 65 78 70 72 20 7b 0a  .3 {.    expr {.
2440: 20 20 20 20 20 20 28 24 3a 3a 73 74 65 70 72 63        ($::steprc
2450: 20 65 71 20 22 53 51 4c 49 54 45 5f 52 4f 57 22   eq "SQLITE_ROW"
2460: 20 26 26 20 24 3a 3a 66 69 6e 61 6c 72 63 20 65   && $::finalrc e
2470: 71 20 22 53 51 4c 49 54 45 5f 4f 4b 22 29 20 7c  q "SQLITE_OK") |
2480: 7c 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65 70  |.      ($::step
2490: 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 45 52  rc eq "SQLITE_ER
24a0: 52 4f 52 22 20 26 26 20 24 3a 3a 66 69 6e 61 6c  ROR" && $::final
24b0: 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 49 4f  rc eq "SQLITE_IO
24c0: 45 52 52 22 29 20 7c 7c 0a 20 20 20 20 20 20 28  ERR") ||.      (
24d0: 24 3a 3a 73 74 65 70 72 63 20 65 71 20 22 53 51  $::steprc eq "SQ
24e0: 4c 49 54 45 5f 45 52 52 4f 52 22 20 26 26 20 24  LITE_ERROR" && $
24f0: 3a 3a 66 69 6e 61 6c 72 63 20 65 71 20 22 53 51  ::finalrc eq "SQ
2500: 4c 49 54 45 5f 41 42 4f 52 54 22 29 0a 20 20 20  LITE_ABORT").   
2510: 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 23 20 64 62   }.  } {1}..# db
2520: 32 20 65 76 61 6c 20 7b 73 65 6c 65 63 74 20 2a  2 eval {select *
2530: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
2540: 74 65 72 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  ter}.  db2 close
2550: 0a 7d 0a 0a 23 20 50 72 6f 76 6f 6b 65 20 61 20  .}..# Provoke a 
2560: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
2570: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 70   when a cursor p
2580: 6f 73 69 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  osition is being
2590: 20 73 61 76 65 64 2e 20 54 68 69 73 0a 23 20 6f   saved. This.# o
25a0: 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 69 74 68  nly happens with
25b0: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 73 20 28   index cursors (
25c0: 62 65 63 61 75 73 65 20 74 68 65 79 20 6d 61 6c  because they mal
25d0: 6c 6f 63 28 29 20 73 70 61 63 65 20 74 6f 20 73  loc() space to s
25e0: 61 76 65 20 74 68 65 0a 23 20 63 75 72 72 65 6e  ave the.# curren
25f0: 74 20 6b 65 79 20 76 61 6c 75 65 29 2e 20 49 74  t key value). It
2600: 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
2610: 20 77 69 74 68 20 74 61 62 6c 65 73 2c 20 62 65   with tables, be
2620: 63 61 75 73 65 20 61 6e 20 69 6e 74 65 67 65 72  cause an integer
2630: 0a 23 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  .# key does not 
2640: 72 65 71 75 69 72 65 20 61 20 6d 61 6c 6c 6f 63  require a malloc
2650: 28 29 20 74 6f 20 73 74 6f 72 65 2e 20 0a 23 0a  () to store. .#.
2660: 23 20 54 68 65 20 6c 69 62 72 61 72 79 20 73 68  # The library sh
2670: 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 6e 20 53  ould return an S
2680: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 74 6f 20 74  QLITE_NOMEM to t
2690: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 71  he caller. The q
26a0: 75 65 72 79 20 74 68 61 74 0a 23 20 6f 77 6e 73  uery that.# owns
26b0: 20 74 68 65 20 63 75 72 73 6f 72 20 28 74 68 65   the cursor (the
26c0: 20 6f 6e 65 20 66 6f 72 20 77 68 69 63 68 20 74   one for which t
26d0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 6e  he position is n
26e0: 6f 74 20 73 61 76 65 64 29 20 73 68 6f 75 6c 64  ot saved) should
26f0: 0a 23 20 63 6f 6e 74 69 6e 75 65 20 75 6e 61 66  .# continue unaf
2700: 66 65 63 74 65 64 2e 0a 23 20 0a 64 6f 5f 6d 61  fected..# .do_ma
2710: 6c 6c 6f 63 5f 74 65 73 74 20 73 68 61 72 65 64  lloc_test shared
2720: 5f 65 72 72 2d 34 20 2d 74 63 6c 70 72 65 70 20  _err-4 -tclprep 
2730: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
2740: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
2750: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 72  l {.    PRAGMA r
2760: 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead_uncommitted 
2770: 3d 20 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  = 1;.    BEGIN;.
2780: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2790: 20 74 31 28 61 2c 20 62 2c 20 55 4e 49 51 55 45   t1(a, b, UNIQUE
27a0: 28 61 2c 20 62 29 29 3b 0a 20 20 7d 20 64 62 32  (a, b));.  } db2
27b0: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
27c0: 20 7b 24 69 20 3c 20 35 7d 20 7b 69 6e 63 72 20   {$i < 5} {incr 
27d0: 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 61 20 5b  i} {.    set a [
27e0: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 24 69  string repeat $i
27f0: 20 31 30 5d 0a 20 20 20 20 73 65 74 20 62 20 5b   10].    set b [
2800: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 24 69  string repeat $i
2810: 20 32 30 30 30 5d 0a 20 20 20 20 65 78 65 63 73   2000].    execs
2820: 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  ql {INSERT INTO 
2830: 74 31 20 56 41 4c 55 45 53 28 24 61 2c 20 24 62  t1 VALUES($a, $b
2840: 29 7d 20 64 62 32 0a 20 20 7d 0a 20 20 65 78 65  )} db2.  }.  exe
2850: 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 20 64 62  csql {COMMIT} db
2860: 32 0a 20 20 73 65 74 20 3a 3a 44 42 32 20 5b 73  2.  set ::DB2 [s
2870: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
2880: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32 5d 0a 20  n_pointer db2]. 
2890: 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71 6c   set ::STMT [sql
28a0: 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a  ite3_prepare $::
28b0: 44 42 32 20 22 53 45 4c 45 43 54 20 61 20 46 52  DB2 "SELECT a FR
28c0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
28d0: 22 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20 73 71  " -1 DUMMY].  sq
28e0: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
28f0: 4d 54 20 20 20 20 20 20 20 3b 23 20 43 75 72 73  MT       ;# Curs
2900: 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 30 30 30  or points at 000
2910: 30 30 30 30 30 30 30 0a 20 20 73 71 6c 69 74 65  0000000.  sqlite
2920: 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 20 20  3_step $::STMT  
2930: 20 20 20 20 20 3b 23 20 43 75 72 73 6f 72 20 70       ;# Cursor p
2940: 6f 69 6e 74 73 20 61 74 20 31 31 31 31 31 31 31  oints at 1111111
2950: 31 31 31 0a 7d 20 2d 74 63 6c 62 6f 64 79 20 7b  111.} -tclbody {
2960: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2970: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2980: 56 41 4c 55 45 53 28 36 2c 20 4e 55 4c 4c 29 3b  VALUES(6, NULL);
2990: 0a 20 20 7d 0a 7d 20 2d 63 6c 65 61 6e 75 70 20  .  }.} -cleanup 
29a0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  {.  do_test shar
29b0: 65 64 5f 6d 61 6c 6c 6f 63 2d 34 2e 24 3a 3a 6e  ed_malloc-4.$::n
29c0: 2e 63 6c 65 61 6e 75 70 2e 31 20 7b 0a 20 20 20  .cleanup.1 {.   
29d0: 20 73 65 74 20 3a 3a 72 63 20 5b 73 71 6c 69 74   set ::rc [sqlit
29e0: 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 5d  e3_step $::STMT]
29f0: 0a 20 20 20 20 65 78 70 72 20 7b 24 3a 3a 72 63  .    expr {$::rc
2a00: 3d 3d 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 7c  =="SQLITE_ROW" |
2a10: 7c 20 24 3a 3a 72 63 3d 3d 22 53 51 4c 49 54 45  | $::rc=="SQLITE
2a20: 5f 45 52 52 4f 52 22 7d 0a 20 20 7d 20 7b 31 7d  _ERROR"}.  } {1}
2a30: 0a 20 20 69 66 20 7b 24 3a 3a 72 63 3d 3d 22 53  .  if {$::rc=="S
2a40: 51 4c 49 54 45 5f 52 4f 57 22 7d 20 7b 0a 20 20  QLITE_ROW"} {.  
2a50: 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64    do_test shared
2a60: 5f 6d 61 6c 6c 6f 63 2d 34 2e 24 3a 3a 6e 2e 63  _malloc-4.$::n.c
2a70: 6c 65 61 6e 75 70 2e 32 20 7b 0a 20 20 20 20 20  leanup.2 {.     
2a80: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2a90: 74 65 78 74 20 24 3a 3a 53 54 4d 54 20 30 0a 20  text $::STMT 0. 
2aa0: 20 20 20 7d 20 7b 32 32 32 32 32 32 32 32 32 32     } {2222222222
2ab0: 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20  }.  }.  do_test 
2ac0: 73 68 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 34 2e  shared_malloc-4.
2ad0: 24 3a 3a 6e 2e 63 6c 65 61 6e 75 70 2e 33 20 7b  $::n.cleanup.3 {
2ae0: 0a 20 20 20 73 65 74 20 72 63 20 5b 73 71 6c 69  .   set rc [sqli
2af0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a  te3_finalize $::
2b00: 53 54 4d 54 5d 0a 20 20 20 65 78 70 72 20 7b 24  STMT].   expr {$
2b10: 72 63 3d 3d 22 53 51 4c 49 54 45 5f 4f 4b 22 20  rc=="SQLITE_OK" 
2b20: 7c 7c 20 24 72 63 3d 3d 22 53 51 4c 49 54 45 5f  || $rc=="SQLITE_
2b30: 41 42 4f 52 54 22 20 7c 7c 0a 20 20 20 20 20 20  ABORT" ||.      
2b40: 20 20 20 24 72 63 3d 3d 22 53 51 4c 49 54 45 5f     $rc=="SQLITE_
2b50: 4e 4f 4d 45 4d 22 20 7c 7c 20 24 72 63 3d 3d 22  NOMEM" || $rc=="
2b60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 7d 0a 20  SQLITE_IOERR"}. 
2b70: 20 7d 20 7b 31 7d 0a 23 20 64 62 32 20 65 76 61   } {1}.# db2 eva
2b80: 6c 20 7b 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d  l {select * from
2b90: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a   sqlite_master}.
2ba0: 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 64    db2 close.}..d
2bb0: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 73 68  o_malloc_test sh
2bc0: 61 72 65 64 5f 65 72 72 2d 35 20 2d 74 63 6c 62  ared_err-5 -tclb
2bd0: 6f 64 79 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  ody {.  db close
2be0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 58 20 74  .  sqlite3 dbX t
2bf0: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
2c00: 20 64 62 59 20 74 65 73 74 2e 64 62 0a 20 20 64   dbY test.db.  d
2c10: 62 58 20 63 6c 6f 73 65 0a 20 20 64 62 59 20 63  bX close.  dbY c
2c20: 6c 6f 73 65 0a 7d 20 2d 63 6c 65 61 6e 75 70 20  lose.} -cleanup 
2c30: 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 58 20 63  {.  catch {dbX c
2c40: 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20 7b 64  lose}.  catch {d
2c50: 62 59 20 63 6c 6f 73 65 7d 0a 7d 0a 0a 64 6f 5f  bY close}.}..do_
2c60: 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 73 68 61 72  malloc_test shar
2c70: 65 64 5f 65 72 72 2d 36 20 2d 74 63 6c 62 6f 64  ed_err-6 -tclbod
2c80: 79 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20  y {.  catch {db 
2c90: 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33  close}.  sqlite3
2ca0: 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a  _thread_cleanup.
2cb0: 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
2cc0: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 30 0a  _shared_cache 0.
2cd0: 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20 20 73  } -cleanup {.  s
2ce0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
2cf0: 61 72 65 64 5f 63 61 63 68 65 20 31 0a 7d 0a 0a  ared_cache 1.}..
2d00: 23 20 41 73 20 6f 66 20 33 2e 35 2e 30 2c 20 73  # As of 3.5.0, s
2d10: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
2d20: 61 72 65 64 5f 63 61 63 68 65 20 63 61 6e 20 62  ared_cache can b
2d30: 65 20 63 61 6c 6c 65 64 20 61 74 0a 23 20 61 6e  e called at.# an
2d40: 79 20 74 69 6d 65 20 61 6e 64 20 66 72 6f 6d 20  y time and from 
2d50: 61 6e 79 20 74 68 72 65 61 64 0a 23 64 6f 5f 74  any thread.#do_t
2d60: 65 73 74 20 73 68 61 72 65 64 5f 65 72 72 2d 6d  est shared_err-m
2d70: 69 73 75 73 65 2d 37 2e 31 20 7b 0a 23 20 20 73  isuse-7.1 {.#  s
2d80: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
2d90: 62 0a 23 20 20 63 61 74 63 68 20 7b 0a 23 20 20  b.#  catch {.#  
2da0: 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
2db0: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 30 0a  _shared_cache 0.
2dc0: 23 20 20 7d 20 6d 73 67 0a 23 20 20 73 65 74 20  #  } msg.#  set 
2dd0: 6d 73 67 0a 23 7d 20 7b 6c 69 62 72 61 72 79 20  msg.#} {library 
2de0: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f  routine called o
2df0: 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 7d 0a  ut of sequence}.
2e00: 0a 23 20 41 67 61 69 6e 20 70 72 6f 76 6f 6b 65  .# Again provoke
2e10: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
2e20: 75 72 65 20 77 68 65 6e 20 61 20 63 75 72 73 6f  ure when a curso
2e30: 72 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 62 65  r position is be
2e40: 69 6e 67 20 73 61 76 65 64 2c 20 0a 23 20 74 68  ing saved, .# th
2e50: 69 73 20 74 69 6d 65 20 64 75 72 69 6e 67 20 61  is time during a
2e60: 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
2e70: 69 6f 6e 20 62 79 20 73 6f 6d 65 20 6f 74 68 65  ion by some othe
2e80: 72 20 68 61 6e 64 6c 65 2e 20 0a 23 0a 23 20 54  r handle. .#.# T
2e90: 68 65 20 6c 69 62 72 61 72 79 20 73 68 6f 75 6c  he library shoul
2ea0: 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  d return an SQLI
2eb0: 54 45 5f 4e 4f 4d 45 4d 20 74 6f 20 74 68 65 20  TE_NOMEM to the 
2ec0: 63 61 6c 6c 65 72 2e 20 54 68 65 20 71 75 65 72  caller. The quer
2ed0: 79 20 74 68 61 74 0a 23 20 6f 77 6e 73 20 74 68  y that.# owns th
2ee0: 65 20 63 75 72 73 6f 72 20 28 74 68 65 20 6f 6e  e cursor (the on
2ef0: 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
2f00: 70 6f 73 69 74 69 6f 6e 20 69 73 20 6e 6f 74 20  position is not 
2f10: 73 61 76 65 64 29 20 73 68 6f 75 6c 64 0a 23 20  saved) should.# 
2f20: 62 65 20 61 62 6f 72 74 65 64 2e 0a 23 20 0a 73  be aborted..# .s
2f30: 65 74 20 3a 3a 61 62 6f 72 74 65 64 20 30 0a 64  et ::aborted 0.d
2f40: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 73 68  o_malloc_test sh
2f50: 61 72 65 64 5f 65 72 72 2d 38 20 2d 74 63 6c 70  ared_err-8 -tclp
2f60: 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  rep {.  sqlite3 
2f70: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
2f80: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
2f90: 4d 41 20 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74  MA read_uncommit
2fa0: 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 42 45 47  ted = 1;.    BEG
2fb0: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
2fc0: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 55 4e  ABLE t1(a, b, UN
2fd0: 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 7d  IQUE(a, b));.  }
2fe0: 20 64 62 32 0a 20 20 66 6f 72 20 7b 73 65 74 20   db2.  for {set 
2ff0: 69 20 30 7d 20 7b 24 69 20 3c 20 32 7d 20 7b 69  i 0} {$i < 2} {i
3000: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74  ncr i} {.    set
3010: 20 61 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   a [string repea
3020: 74 20 24 69 20 31 30 5d 0a 20 20 20 20 73 65 74  t $i 10].    set
3030: 20 62 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   b [string repea
3040: 74 20 24 69 20 32 30 30 30 5d 0a 20 20 20 20 65  t $i 2000].    e
3050: 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49  xecsql {INSERT I
3060: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61  NTO t1 VALUES($a
3070: 2c 20 24 62 29 7d 20 64 62 32 0a 20 20 7d 0a 20  , $b)} db2.  }. 
3080: 20 65 78 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54   execsql {COMMIT
3090: 7d 20 64 62 32 0a 20 20 73 65 74 20 3a 3a 44 42  } db2.  set ::DB
30a0: 32 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  2 [sqlite3_conne
30b0: 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62  ction_pointer db
30c0: 32 5d 0a 20 20 73 65 74 20 3a 3a 53 54 4d 54 20  2].  set ::STMT 
30d0: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  [sqlite3_prepare
30e0: 20 24 3a 3a 44 42 32 20 22 53 45 4c 45 43 54 20   $::DB2 "SELECT 
30f0: 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  a FROM t1 ORDER 
3100: 42 59 20 61 22 20 2d 31 20 44 55 4d 4d 59 5d 0a  BY a" -1 DUMMY].
3110: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24    sqlite3_step $
3120: 3a 3a 53 54 4d 54 20 20 20 20 20 20 20 3b 23 20  ::STMT       ;# 
3130: 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74  Cursor points at
3140: 20 30 30 30 30 30 30 30 30 30 30 0a 20 20 73 71   0000000000.  sq
3150: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
3160: 4d 54 20 20 20 20 20 20 20 3b 23 20 43 75 72 73  MT       ;# Curs
3170: 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 31 31 31  or points at 111
3180: 31 31 31 31 31 31 31 0a 7d 20 2d 74 63 6c 62 6f  1111111.} -tclbo
3190: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
31a0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
31b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
31c0: 41 4c 55 45 53 28 36 2c 20 4e 55 4c 4c 29 3b 0a  ALUES(6, NULL);.
31d0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
31e0: 7d 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20  }.} -cleanup {. 
31f0: 20 23 20 55 50 44 41 54 45 3a 20 41 73 20 6f 66   # UPDATE: As of
3200: 20 5b 35 36 36 38 5d 2c 20 69 66 20 74 68 65 20   [5668], if the 
3210: 72 6f 6c 6c 62 61 63 6b 20 66 61 69 6c 73 20 53  rollback fails S
3220: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
3230: 20 72 65 74 75 72 6e 65 64 2e 20 0a 20 20 23 20   returned. .  # 
3240: 53 6f 20 74 68 65 73 65 20 74 65 73 74 73 20 68  So these tests h
3250: 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
3260: 20 74 6f 20 65 78 70 65 63 74 20 53 51 4c 49 54   to expect SQLIT
3270: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 69 74  E_CORRUPT and it
3280: 73 0a 20 20 23 20 61 73 73 6f 63 69 61 74 65 64  s.  # associated
3290: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
32a0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
32b0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 73  .  #.  do_test s
32c0: 68 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 38 2e 24  hared_malloc-8.$
32d0: 3a 3a 6e 2e 63 6c 65 61 6e 75 70 2e 31 20 7b 0a  ::n.cleanup.1 {.
32e0: 20 20 20 20 73 65 74 20 72 65 73 20 5b 63 61 74      set res [cat
32f0: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 20  chsql {SELECT a 
3300: 46 52 4f 4d 20 74 31 7d 20 64 62 32 5d 0a 20 20  FROM t1} db2].  
3310: 20 20 73 65 74 20 61 6e 73 20 5b 6c 69 6e 64 65    set ans [linde
3320: 78 20 24 72 65 73 20 31 5d 0a 20 20 20 20 69 66  x $res 1].    if
3330: 20 7b 5b 6c 69 6e 64 65 78 20 24 72 65 73 20 30   {[lindex $res 0
3340: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 73 65 74 20  ]} {.       set 
3350: 72 20 5b 65 78 70 72 20 7b 0a 20 20 20 20 20 20  r [expr {.      
3360: 20 20 20 24 61 6e 73 3d 3d 22 64 69 73 6b 20 49     $ans=="disk I
3370: 2f 4f 20 65 72 72 6f 72 22 20 7c 7c 0a 20 20 20  /O error" ||.   
3380: 20 20 20 20 20 20 24 61 6e 73 3d 3d 22 6f 75 74        $ans=="out
3390: 20 6f 66 20 6d 65 6d 6f 72 79 22 20 7c 7c 0a 20   of memory" ||. 
33a0: 20 20 20 20 20 20 20 20 24 61 6e 73 3d 3d 22 64          $ans=="d
33b0: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
33c0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22  ge is malformed"
33d0: 0a 20 20 20 20 20 20 20 7d 5d 0a 20 20 20 20 7d  .       }].    }
33e0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 73   else {.       s
33f0: 65 74 20 72 20 5b 65 78 70 72 20 7b 5b 6c 72 61  et r [expr {[lra
3400: 6e 67 65 20 24 61 6e 73 20 30 20 31 5d 3d 3d 22  nge $ans 0 1]=="
3410: 30 30 30 30 30 30 30 30 30 30 20 31 31 31 31 31  0000000000 11111
3420: 31 31 31 31 31 22 7d 5d 0a 20 20 20 20 7d 0a 20  11111"}].    }. 
3430: 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74 65 73 74   } {1}.  do_test
3440: 20 73 68 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 38   shared_malloc-8
3450: 2e 24 3a 3a 6e 2e 63 6c 65 61 6e 75 70 2e 32 20  .$::n.cleanup.2 
3460: 7b 0a 20 20 20 20 73 65 74 20 72 63 31 20 5b 73  {.    set rc1 [s
3470: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53  qlite3_step $::S
3480: 54 4d 54 5d 0a 20 20 20 20 73 65 74 20 72 63 32  TMT].    set rc2
3490: 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   [sqlite3_finali
34a0: 7a 65 20 24 3a 3a 53 54 4d 54 5d 0a 20 20 20 20  ze $::STMT].    
34b0: 69 66 20 7b 24 72 63 32 3d 3d 22 53 51 4c 49 54  if {$rc2=="SQLIT
34c0: 45 5f 41 42 4f 52 54 22 7d 20 7b 0a 20 20 20 20  E_ABORT"} {.    
34d0: 20 20 69 6e 63 72 20 3a 3a 61 62 6f 72 74 65 64    incr ::aborted
34e0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 20  .    }.    expr 
34f0: 7b 0a 20 20 20 20 20 20 28 24 72 63 31 3d 3d 22  {.      ($rc1=="
3500: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 20 26 26 20  SQLITE_DONE" && 
3510: 24 72 63 32 3d 3d 22 53 51 4c 49 54 45 5f 4f 4b  $rc2=="SQLITE_OK
3520: 22 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 24 72  ") || .      ($r
3530: 63 31 3d 3d 22 53 51 4c 49 54 45 5f 45 52 52 4f  c1=="SQLITE_ERRO
3540: 52 22 20 26 26 20 24 72 63 32 3d 3d 22 53 51 4c  R" && $rc2=="SQL
3550: 49 54 45 5f 41 42 4f 52 54 22 29 20 7c 7c 0a 20  ITE_ABORT") ||. 
3560: 20 20 20 20 20 28 24 72 63 31 3d 3d 22 53 51 4c       ($rc1=="SQL
3570: 49 54 45 5f 45 52 52 4f 52 22 20 26 26 20 24 72  ITE_ERROR" && $r
3580: 63 32 3d 3d 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  c2=="SQLITE_NOME
3590: 4d 22 29 20 7c 7c 0a 20 20 20 20 20 20 28 24 72  M") ||.      ($r
35a0: 63 31 3d 3d 22 53 51 4c 49 54 45 5f 45 52 52 4f  c1=="SQLITE_ERRO
35b0: 52 22 20 26 26 20 24 72 63 32 3d 3d 22 53 51 4c  R" && $rc2=="SQL
35c0: 49 54 45 5f 49 4f 45 52 52 22 29 20 7c 7c 0a 20  ITE_IOERR") ||. 
35d0: 20 20 20 20 20 28 24 72 63 31 3d 3d 22 53 51 4c       ($rc1=="SQL
35e0: 49 54 45 5f 45 52 52 4f 52 22 20 26 26 20 24 72  ITE_ERROR" && $r
35f0: 63 32 3d 3d 22 53 51 4c 49 54 45 5f 43 4f 52 52  c2=="SQLITE_CORR
3600: 55 50 54 22 29 0a 20 20 20 20 7d 0a 20 20 7d 20  UPT").    }.  } 
3610: 7b 31 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  {1}.  db2 close.
3620: 7d 0a 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64  }.do_test shared
3630: 5f 6d 61 6c 6c 6f 63 2d 38 2e 58 20 7b 0a 20 20  _malloc-8.X {.  
3640: 23 20 54 65 73 74 20 74 68 61 74 20 6f 6e 65 20  # Test that one 
3650: 6f 72 20 6d 6f 72 65 20 71 75 65 72 69 65 73 20  or more queries 
3660: 77 65 72 65 20 61 62 6f 72 74 65 64 20 64 75 65  were aborted due
3670: 20 74 6f 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29   to the malloc()
3680: 20 66 61 69 6c 75 72 65 2e 0a 20 20 65 78 70 72   failure..  expr
3690: 20 24 3a 3a 61 62 6f 72 74 65 64 3e 3d 31 0a 7d   $::aborted>=1.}
36a0: 20 7b 31 7d 0a 0a 23 20 54 68 69 73 20 74 65 73   {1}..# This tes
36b0: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
36c0: 20 63 61 74 63 68 20 61 20 73 70 65 63 69 66 69   catch a specifi
36d0: 63 20 62 75 67 20 74 68 61 74 20 77 61 73 20 70  c bug that was p
36e0: 72 65 73 65 6e 74 20 64 75 72 69 6e 67 0a 23 20  resent during.# 
36f0: 64 65 76 65 6c 6f 70 6d 65 6e 74 20 6f 66 20 33  development of 3
3700: 2e 35 2e 30 2e 20 49 66 20 61 20 6d 61 6c 6c 6f  .5.0. If a mallo
3710: 63 28 29 20 66 61 69 6c 65 64 20 77 68 69 6c 65  c() failed while
3720: 20 73 65 74 74 69 6e 67 20 74 68 65 20 70 61 67   setting the pag
3730: 65 2d 73 69 7a 65 2c 0a 23 20 61 20 62 75 66 66  e-size,.# a buff
3740: 65 72 20 28 50 61 67 65 72 2e 70 54 6d 70 53 70  er (Pager.pTmpSp
3750: 61 63 65 29 20 77 61 73 20 62 65 69 6e 67 20 66  ace) was being f
3760: 72 65 65 64 2e 20 54 68 69 73 20 63 6f 75 6c 64  reed. This could
3770: 20 63 61 75 73 65 20 61 20 73 65 67 2d 66 61 75   cause a seg-fau
3780: 6c 74 0a 23 20 6c 61 74 65 72 20 69 66 20 61 6e  lt.# later if an
3790: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
37a0: 20 74 72 69 65 64 20 74 6f 20 75 73 65 20 74 68   tried to use th
37b0: 65 20 70 61 67 65 72 2e 0a 23 0a 23 20 54 68 69  e pager..#.# Thi
37c0: 73 20 74 65 73 74 20 77 69 6c 6c 20 63 72 61 73  s test will cras
37d0: 68 20 33 2e 34 2e 32 2e 0a 23 0a 64 6f 5f 6d 61  h 3.4.2..#.do_ma
37e0: 6c 6c 6f 63 5f 74 65 73 74 20 73 68 61 72 65 64  lloc_test shared
37f0: 5f 65 72 72 2d 39 20 2d 74 63 6c 70 72 65 70 20  _err-9 -tclprep 
3800: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
3810: 74 65 73 74 2e 64 62 0a 7d 20 2d 73 71 6c 62 6f  test.db.} -sqlbo
3820: 64 79 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61  dy {.  PRAGMA pa
3830: 67 65 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a  ge_size = 4096;.
3840: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
3850: 7a 65 20 3d 20 31 30 32 34 3b 0a 7d 20 2d 63 6c  ze = 1024;.} -cl
3860: 65 61 6e 75 70 20 7b 0a 20 20 64 62 32 20 65 76  eanup {.  db2 ev
3870: 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  al {.    CREATE 
3880: 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20  TABLE abc(a, b, 
3890: 63 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  c);.    BEGIN;. 
38a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
38b0: 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  bc VALUES(1, 2, 
38c0: 33 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  3);.    ROLLBACK
38d0: 3b 0a 20 20 7d 20 20 20 20 20 0a 20 20 64 62 32  ;.  }     .  db2
38e0: 20 63 6c 6f 73 65 0a 7d 20 20 20 20 20 0a 0a 63   close.}     ..c
38f0: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
3900: 63 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65  catch {db2 close
3910: 7d 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74  }.do_malloc_test
3920: 20 73 68 61 72 65 64 5f 65 72 72 2d 31 30 20 2d   shared_err-10 -
3930: 74 63 6c 70 72 65 70 20 7b 0a 20 20 73 71 6c 69  tclprep {.  sqli
3940: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
3950: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
3960: 74 2e 64 62 0a 20 20 0a 20 20 64 62 20 65 76 61  t.db.  .  db eva
3970: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
3980: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
3990: 7d 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20 0a  }.  db2 eval { .
39a0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43      BEGIN;.    C
39b0: 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28  REATE TABLE abc(
39c0: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 7d 0a 7d 20  a, b, c);.  }.} 
39d0: 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20 63 61 74  -tclbody {.  cat
39e0: 63 68 20 7b 64 62 20 65 76 61 6c 20 7b 53 45 4c  ch {db eval {SEL
39f0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
3a00: 65 5f 6d 61 73 74 65 72 7d 7d 0a 20 20 65 72 72  e_master}}.  err
3a10: 6f 72 20 31 0a 7d 20 2d 63 6c 65 61 6e 75 70 20  or 1.} -cleanup 
3a20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
3a30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
3a40: 74 65 5f 6d 61 73 74 65 72 20 7d 0a 7d 0a 0a 64  te_master }.}..d
3a50: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 73 68  o_malloc_test sh
3a60: 61 72 65 64 5f 65 72 72 2d 31 31 20 2d 74 63 6c  ared_err-11 -tcl
3a70: 70 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65 33  prep {.  sqlite3
3a80: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71   db test.db.  sq
3a90: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
3aa0: 62 0a 20 20 0a 20 20 64 62 20 65 76 61 6c 20 7b  b.  .  db eval {
3ab0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
3ac0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a 20  qlite_master }. 
3ad0: 20 64 62 32 20 65 76 61 6c 20 7b 20 0a 20 20 20   db2 eval { .   
3ae0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
3af0: 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20  TE TABLE abc(a, 
3b00: 62 2c 20 63 29 3b 0a 20 20 7d 0a 7d 20 2d 74 63  b, c);.  }.} -tc
3b10: 6c 62 6f 64 79 20 7b 0a 20 20 63 61 74 63 68 20  lbody {.  catch 
3b20: 7b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  {db eval {SELECT
3b30: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
3b40: 61 73 74 65 72 7d 7d 0a 20 20 63 61 74 63 68 20  aster}}.  catch 
3b50: 7b 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  {sqlite3_errmsg1
3b60: 36 20 64 62 7d 0a 20 20 65 72 72 6f 72 20 31 0a  6 db}.  error 1.
3b70: 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20 20 65  } -cleanup {.  e
3b80: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
3b90: 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
3ba0: 73 74 65 72 20 7d 0a 7d 0a 0a 63 61 74 63 68 20  ster }.}..catch 
3bb0: 7b 64 62 20 63 6c 6f 73 65 7d 0a 63 61 74 63 68  {db close}.catch
3bc0: 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 0a 64 6f   {db2 close}..do
3bd0: 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 73 68 61  _malloc_test sha
3be0: 72 65 64 5f 65 72 72 2d 31 32 20 2d 73 71 6c 62  red_err-12 -sqlb
3bf0: 6f 64 79 20 7b 0a 20 20 43 52 45 41 54 45 20 54  ody {.  CREATE T
3c00: 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63  ABLE abc(a, b, c
3c10: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
3c20: 20 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32   abc VALUES(1, 2
3c30: 2c 20 33 29 3b 0a 7d 0a 0a 63 61 74 63 68 20 7b  , 3);.}..catch {
3c40: 64 62 20 63 6c 6f 73 65 7d 0a 63 61 74 63 68 20  db close}.catch 
3c50: 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 73 71 6c 69  {db2 close}.sqli
3c60: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
3c70: 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e 61 62 6c  d_cache $::enabl
3c80: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 0a 66  e_shared_cache.f
3c90: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.