/ Hex Artifact Content
Login

Artifact 202ce115a4bfab2b41da5d4c9431f68a474134a6:


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 31 38 20 32 30 30 38  test,v 1.18 2008
0260: 2f 30 31 2f 31 38 20 31 37 3a 30 33 3a 33 33 20  /01/18 17:03:33 
0270: 64 72 68 20 45 78 70 20 24 0a 0a 70 72 6f 63 20  drh Exp $..proc 
0280: 73 6b 69 70 20 7b 61 72 67 73 7d 20 7b 7d 0a 0a  skip {args} {}..
0290: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
02a0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
02b0: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
02c0: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f  ir/tester.tcl.so
02d0: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 6d 61  urce $testdir/ma
02e0: 6c 6c 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a  lloc_common.tcl.
02f0: 64 62 20 63 6c 6f 73 65 0a 0a 69 66 63 61 70 61  db close..ifcapa
0300: 62 6c 65 20 21 73 68 61 72 65 64 5f 63 61 63 68  ble !shared_cach
0310: 65 7c 7c 21 73 75 62 71 75 65 72 79 20 7b 0a 20  e||!subquery {. 
0320: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
0330: 65 74 75 72 6e 0a 7d 0a 0a 73 65 74 20 3a 3a 65  eturn.}..set ::e
0340: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
0350: 68 65 20 5b 73 71 6c 69 74 65 33 5f 65 6e 61 62  he [sqlite3_enab
0360: 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20  le_shared_cache 
0370: 31 5d 0a 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73  1]..do_ioerr_tes
0380: 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 31  t shared_ioerr-1
0390: 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 73 71   -tclprep {.  sq
03a0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
03b0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
03c0: 20 20 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e    PRAGMA read_un
03d0: 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20  committed = 1;. 
03e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
03f0: 74 31 28 61 2c 62 2c 63 29 3b 0a 20 20 20 20 42  t1(a,b,c);.    B
0400: 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54  EGIN;.    SELECT
0410: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
0420: 61 73 74 65 72 3b 0a 20 20 7d 20 64 62 32 0a 7d  aster;.  } db2.}
0430: 20 2d 73 71 6c 62 6f 64 79 20 7b 0a 20 20 53 45   -sqlbody {.  SE
0440: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
0450: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 49 4e 53  te_master;.  INS
0460: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0470: 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 42 45 47  ES(1,2,3);.  BEG
0480: 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 0a  IN TRANSACTION;.
0490: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
04a0: 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a   VALUES(1,2,3);.
04b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
04c0: 20 56 41 4c 55 45 53 28 34 2c 35 2c 36 29 3b 0a   VALUES(4,5,6);.
04d0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 53 45    ROLLBACK;.  SE
04e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
04f0: 20 20 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54    BEGIN TRANSACT
0500: 49 4f 4e 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  ION;.  INSERT IN
0510: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32  TO t1 VALUES(1,2
0520: 2c 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  ,3);.  INSERT IN
0530: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 35  TO t1 VALUES(4,5
0540: 2c 36 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20  ,6);.  COMMIT;. 
0550: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0560: 31 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  1;.  DELETE FROM
0570: 20 74 31 20 57 48 45 52 45 20 61 3c 31 30 30 3b   t1 WHERE a<100;
0580: 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20 20  .} -cleanup {.  
0590: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69  do_test shared_i
05a0: 6f 65 72 72 2d 31 2e 24 6e 2e 63 6c 65 61 6e 75  oerr-1.$n.cleanu
05b0: 70 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 72 65  p.1 {.    set re
05c0: 73 20 5b 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  s [catchsql {.  
05d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
05e0: 4d 20 74 31 3b 0a 20 20 20 20 7d 20 64 62 32 5d  M t1;.    } db2]
05f0: 0a 20 20 20 20 73 65 74 20 70 6f 73 73 69 62 6c  .    set possibl
0600: 65 5f 72 65 73 75 6c 74 73 20 5b 6c 69 73 74 20  e_results [list 
0610: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0620: 20 20 20 22 31 20 7b 64 69 73 6b 20 49 2f 4f 20     "1 {disk I/O 
0630: 65 72 72 6f 72 7d 22 20 20 20 20 20 20 20 20 20  error}"         
0640: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 22         \.      "
0650: 30 20 7b 31 20 32 20 33 7d 22 20 20 20 20 20 20  0 {1 2 3}"      
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0670: 20 20 20 5c 0a 20 20 20 20 20 20 22 30 20 7b 31     \.      "0 {1
0680: 20 32 20 33 20 31 20 32 20 33 20 34 20 35 20 36   2 3 1 2 3 4 5 6
0690: 7d 22 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  }"             \
06a0: 0a 20 20 20 20 20 20 22 30 20 7b 31 20 32 20 33  .      "0 {1 2 3
06b0: 20 31 20 32 20 33 20 34 20 35 20 36 20 31 20 32   1 2 3 4 5 6 1 2
06c0: 20 33 20 34 20 35 20 36 7d 22 20 5c 0a 20 20 20   3 4 5 6}" \.   
06d0: 20 20 20 22 30 20 7b 7d 22 20 20 20 20 20 20 20     "0 {}"       
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 5d 0a 20         \.    ]. 
0700: 20 20 20 73 65 74 20 72 63 20 5b 65 78 70 72 20     set rc [expr 
0710: 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
0720: 24 70 6f 73 73 69 62 6c 65 5f 72 65 73 75 6c 74  $possible_result
0730: 73 20 24 72 65 73 5d 20 3e 3d 20 30 5d 0a 20 20  s $res] >= 0].  
0740: 20 20 69 66 20 7b 24 72 63 20 21 3d 20 31 7d 20    if {$rc != 1} 
0750: 7b 0a 20 20 20 20 20 20 70 75 74 73 20 22 22 0a  {.      puts "".
0760: 20 20 20 20 20 20 70 75 74 73 20 22 52 65 73 75        puts "Resu
0770: 6c 74 3a 20 24 72 65 73 22 0a 20 20 20 20 7d 0a  lt: $res".    }.
0780: 20 20 20 20 73 65 74 20 72 63 0a 20 20 7d 20 7b      set rc.  } {
0790: 31 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d  1}.  db2 close.}
07a0: 0a 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20  ..do_ioerr_test 
07b0: 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 32 20 2d  shared_ioerr-2 -
07c0: 74 63 6c 70 72 65 70 20 7b 0a 20 20 73 71 6c 69  tclprep {.  sqli
07d0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
07e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
07f0: 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e 63 6f  PRAGMA read_unco
0800: 6d 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20 20 20  mmitted = 1;.   
0810: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
0820: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
0830: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0840: 54 4f 20 74 31 28 6f 69 64 29 20 56 41 4c 55 45  TO t1(oid) VALUE
0850: 53 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  S(NULL);.    INS
0860: 45 52 54 20 49 4e 54 4f 20 74 31 28 6f 69 64 29  ERT INTO t1(oid)
0870: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f   SELECT NULL FRO
0880: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
0890: 20 49 4e 54 4f 20 74 31 28 6f 69 64 29 20 53 45   INTO t1(oid) SE
08a0: 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74  LECT NULL FROM t
08b0: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
08c0: 54 4f 20 74 31 28 6f 69 64 29 20 53 45 4c 45 43  TO t1(oid) SELEC
08d0: 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a  T NULL FROM t1;.
08e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
08f0: 74 31 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e  t1(oid) SELECT N
0900: 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ULL FROM t1;.   
0910: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
0920: 6f 69 64 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c  oid) SELECT NULL
0930: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
0940: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 6f 69 64  SERT INTO t1(oid
0950: 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52  ) SELECT NULL FR
0960: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
0970: 54 20 49 4e 54 4f 20 74 31 28 6f 69 64 29 20 53  T INTO t1(oid) S
0980: 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20  ELECT NULL FROM 
0990: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
09a0: 4e 54 4f 20 74 31 28 6f 69 64 29 20 53 45 4c 45  NTO t1(oid) SELE
09b0: 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b  CT NULL FROM t1;
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 53 45 4c 45 43 54 20   t1(oid) SELECT 
09e0: 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20  NULL FROM t1;.  
09f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0a00: 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e 55 4c  (oid) SELECT NUL
0a10: 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 55  L FROM t1;.    U
0a20: 50 44 41 54 45 20 74 31 20 73 65 74 20 61 20 3d  PDATE t1 set a =
0a30: 20 6f 69 64 2c 20 62 20 3d 20 27 61 62 63 64 65   oid, b = 'abcde
0a40: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
0a50: 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39 27  vwxyz0123456789'
0a60: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
0a70: 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
0a80: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
0a90: 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43  BEGIN;.    SELEC
0aa0: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
0ab0: 6d 61 73 74 65 72 3b 0a 20 20 7d 20 64 62 32 0a  master;.  } db2.
0ac0: 7d 20 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20 73  } -tclbody {.  s
0ad0: 65 74 20 3a 3a 72 65 73 69 64 78 20 30 0a 20 20  et ::residx 0.  
0ae0: 65 78 65 63 73 71 6c 20 7b 44 45 4c 45 54 45 20  execsql {DELETE 
0af0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 30 20  FROM t1 WHERE 0 
0b00: 3d 20 28 61 20 25 20 32 29 3b 7d 0a 20 20 69 6e  = (a % 2);}.  in
0b10: 63 72 20 3a 3a 72 65 73 69 64 78 0a 0a 20 20 23  cr ::residx..  #
0b20: 20 57 68 65 6e 20 74 68 69 73 20 74 72 61 6e 73   When this trans
0b30: 61 63 74 69 6f 6e 20 62 65 67 69 6e 73 20 74 68  action begins th
0b40: 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  e table contains
0b50: 20 35 31 32 20 65 6e 74 72 69 65 73 2e 20 54 68   512 entries. Th
0b60: 65 0a 20 20 23 20 74 77 6f 20 73 74 61 74 65 6d  e.  # two statem
0b70: 65 6e 74 73 20 74 6f 67 65 74 68 65 72 20 61 64  ents together ad
0b80: 64 20 35 31 32 2b 31 34 36 20 6d 6f 72 65 20 69  d 512+146 more i
0b90: 66 20 69 74 20 73 75 63 63 65 65 64 73 2e 20 0a  f it succeeds. .
0ba0: 20 20 23 20 28 31 30 32 34 2f 37 3d 3d 31 34 36    # (1024/7==146
0bb0: 29 0a 20 20 65 78 65 63 73 71 6c 20 7b 42 45 47  ).  execsql {BEG
0bc0: 49 4e 3b 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  IN;}.  execsql {
0bd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
0be0: 45 4c 45 43 54 20 61 2b 31 2c 20 62 20 46 52 4f  ELECT a+1, b FRO
0bf0: 4d 20 74 31 3b 7d 0a 20 20 65 78 65 63 73 71 6c  M t1;}.  execsql
0c00: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   {INSERT INTO t1
0c10: 20 53 45 4c 45 43 54 20 27 73 74 72 69 6e 67 27   SELECT 'string'
0c20: 20 7c 7c 20 61 2c 20 62 20 46 52 4f 4d 20 74 31   || a, b FROM t1
0c30: 20 57 48 45 52 45 20 30 20 3d 20 28 61 25 37 29   WHERE 0 = (a%7)
0c40: 3b 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 4f  ;}.  execsql {CO
0c50: 4d 4d 49 54 3b 7d 0a 0a 20 20 69 6e 63 72 20 3a  MMIT;}..  incr :
0c60: 3a 72 65 73 69 64 78 0a 7d 20 2d 63 6c 65 61 6e  :residx.} -clean
0c70: 75 70 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  up {.  catchsql 
0c80: 52 4f 4c 4c 42 41 43 4b 0a 20 20 64 6f 5f 74 65  ROLLBACK.  do_te
0c90: 73 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d  st shared_ioerr-
0ca0: 32 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e 31 20 7b  2.$n.cleanup.1 {
0cb0: 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 63 61  .    set res [ca
0cc0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  tchsql {.      S
0cd0: 45 4c 45 43 54 20 6d 61 78 28 61 29 2c 20 6d 69  ELECT max(a), mi
0ce0: 6e 28 61 29 2c 20 63 6f 75 6e 74 28 2a 29 20 46  n(a), count(*) F
0cf0: 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 46 52  ROM (SELECT a FR
0d00: 4f 4d 20 74 31 20 6f 72 64 65 72 20 62 79 20 61  OM t1 order by a
0d10: 29 3b 0a 20 20 20 20 7d 20 64 62 32 5d 0a 20 20  );.    } db2].  
0d20: 20 20 73 65 74 20 70 6f 73 73 69 62 6c 65 5f 72    set possible_r
0d30: 65 73 75 6c 74 73 20 5b 6c 69 73 74 20 5c 0a 20  esults [list \. 
0d40: 20 20 20 20 20 7b 30 20 7b 31 30 32 34 20 31 20       {0 {1024 1 
0d50: 31 30 32 34 7d 7d 20 20 20 20 20 20 20 20 5c 0a  1024}}        \.
0d60: 20 20 20 20 20 20 7b 30 20 7b 31 30 32 33 20 31        {0 {1023 1
0d70: 20 35 31 32 7d 7d 20 20 20 20 20 20 20 20 20 5c   512}}         \
0d80: 0a 20 20 20 20 20 20 7b 30 20 7b 73 74 72 69 6e  .      {0 {strin
0d90: 67 39 39 34 20 31 20 31 31 37 30 7d 7d 20 20 20  g994 1 1170}}   
0da0: 5c 0a 20 20 20 20 5d 0a 20 20 20 20 73 65 74 20  \.    ].    set 
0db0: 69 64 78 20 5b 6c 73 65 61 72 63 68 20 2d 65 78  idx [lsearch -ex
0dc0: 61 63 74 20 24 70 6f 73 73 69 62 6c 65 5f 72 65  act $possible_re
0dd0: 73 75 6c 74 73 20 24 72 65 73 5d 0a 20 20 20 20  sults $res].    
0de0: 73 65 74 20 73 75 63 63 65 73 73 20 5b 65 78 70  set success [exp
0df0: 72 20 7b 24 69 64 78 3d 3d 24 3a 3a 72 65 73 69  r {$idx==$::resi
0e00: 64 78 20 7c 7c 20 24 72 65 73 3d 3d 22 31 20 7b  dx || $res=="1 {
0e10: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 22  disk I/O error}"
0e20: 7d 5d 0a 20 20 20 20 69 66 20 7b 21 24 73 75 63  }].    if {!$suc
0e30: 63 65 73 73 7d 20 7b 0a 20 20 20 20 20 20 70 75  cess} {.      pu
0e40: 74 73 20 22 22 0a 20 20 20 20 20 20 70 75 74 73  ts "".      puts
0e50: 20 22 52 65 73 75 6c 74 3a 20 5c 22 24 72 65 73   "Result: \"$res
0e60: 5c 22 20 28 24 3a 3a 72 65 73 69 64 78 29 22 0a  \" ($::residx)".
0e70: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 73 75      }.    set su
0e80: 63 63 65 73 73 0a 20 20 7d 20 7b 31 7d 0a 20 20  ccess.  } {1}.  
0e90: 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 54  db2 close.}..# T
0ea0: 68 69 73 20 74 65 73 74 20 69 73 20 64 65 73 69  his test is desi
0eb0: 67 6e 65 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20  gned to provoke 
0ec0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 68 65 6e  an IO error when
0ed0: 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   a cursor positi
0ee0: 6f 6e 20 69 73 0a 23 20 22 73 61 76 65 64 22 20  on is.# "saved" 
0ef0: 28 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72  (because another
0f00: 20 63 75 72 73 6f 72 20 69 73 20 67 6f 69 6e 67   cursor is going
0f10: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 75   to modify the u
0f20: 6e 64 65 72 6c 79 69 6e 67 20 74 61 62 6c 65 29  nderlying table)
0f30: 2e 20 0a 23 20 0a 64 6f 5f 69 6f 65 72 72 5f 74  . .# .do_ioerr_t
0f40: 65 73 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72  est shared_ioerr
0f50: 2d 33 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20  -3 -tclprep {.  
0f60: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
0f70: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
0f80: 20 20 20 20 50 52 41 47 4d 41 20 72 65 61 64 5f      PRAGMA read_
0f90: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b  uncommitted = 1;
0fa0: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
0fb0: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
0fc0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
0fd0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
0fe0: 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b  , UNIQUE(a, b));
0ff0: 0a 20 20 7d 20 64 62 32 0a 20 20 66 6f 72 20 7b  .  } db2.  for {
1000: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 32  set i 0} {$i < 2
1010: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
1020: 20 20 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67     set a [string
1030: 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 72   range [string r
1040: 65 70 65 61 74 20 22 5b 66 6f 72 6d 61 74 20 25  epeat "[format %
1050: 30 33 64 20 24 69 5d 2e 22 20 35 5d 20 30 20 65  03d $i]." 5] 0 e
1060: 6e 64 2d 31 5d 0a 0a 20 20 20 20 73 65 74 20 62  nd-1]..    set b
1070: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
1080: 24 69 20 32 30 30 30 5d 0a 20 20 20 20 65 78 65  $i 2000].    exe
1090: 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54  csql {INSERT INT
10a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61 2c 20  O t1 VALUES($a, 
10b0: 24 62 29 7d 20 64 62 32 0a 20 20 7d 0a 20 20 65  $b)} db2.  }.  e
10c0: 78 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 20  xecsql {COMMIT} 
10d0: 64 62 32 0a 20 20 73 65 74 20 3a 3a 44 42 32 20  db2.  set ::DB2 
10e0: 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  [sqlite3_connect
10f0: 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32 5d  ion_pointer db2]
1100: 0a 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73  .  set ::STMT [s
1110: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 24  qlite3_prepare $
1120: 3a 3a 44 42 32 20 22 53 45 4c 45 43 54 20 61 20  ::DB2 "SELECT a 
1130: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
1140: 20 61 22 20 2d 31 20 44 55 4d 4d 59 5d 0a 20 20   a" -1 DUMMY].  
1150: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a  sqlite3_step $::
1160: 53 54 4d 54 20 20 20 20 20 20 20 3b 23 20 43 75  STMT       ;# Cu
1170: 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 30  rsor points at 0
1180: 30 30 2e 30 30 30 2e 30 30 30 2e 30 30 30 0a 20  00.000.000.000. 
1190: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a   sqlite3_step $:
11a0: 3a 53 54 4d 54 20 20 20 20 20 20 20 3b 23 20 43  :STMT       ;# C
11b0: 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20  ursor points at 
11c0: 30 30 31 2e 30 30 31 2e 30 30 31 2e 30 30 31 0a  001.001.001.001.
11d0: 0a 7d 20 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20  .} -tclbody {.  
11e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
11f0: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
1200: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
1210: 32 30 31 2e 32 30 31 2e 32 30 31 2e 32 30 31 2e  201.201.201.201.
1220: 32 30 31 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  201', NULL);.   
1230: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
1240: 20 3d 20 27 32 30 32 2e 32 30 32 2e 32 30 32 2e   = '202.202.202.
1250: 32 30 32 2e 32 30 32 27 20 57 48 45 52 45 20 61  202.202' WHERE a
1260: 20 4c 49 4b 45 20 27 32 30 31 25 27 3b 0a 20 20   LIKE '201%';.  
1270: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
1280: 2d 63 6c 65 61 6e 75 70 20 7b 0a 20 20 73 65 74  -cleanup {.  set
1290: 20 3a 3a 73 74 65 70 72 63 20 20 5b 73 71 6c 69   ::steprc  [sqli
12a0: 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54  te3_step $::STMT
12b0: 5d 0a 20 20 73 65 74 20 3a 3a 63 6f 6c 75 6d 6e  ].  set ::column
12c0: 20 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d    [sqlite3_colum
12d0: 6e 5f 74 65 78 74 20 24 3a 3a 53 54 4d 54 20 30  n_text $::STMT 0
12e0: 5d 0a 20 20 73 65 74 20 3a 3a 66 69 6e 61 6c 72  ].  set ::finalr
12f0: 63 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  c [sqlite3_final
1300: 69 7a 65 20 24 3a 3a 53 54 4d 54 5d 0a 0a 20 20  ize $::STMT]..  
1310: 23 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  # There are thre
1320: 65 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 63 6f  e possible outco
1330: 6d 65 73 20 68 65 72 65 20 28 61 73 73 75 6d 69  mes here (assumi
1340: 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 49 4f  ng persistent IO
1350: 20 65 72 72 6f 72 73 29 3a 0a 20 20 23 0a 20 20   errors):.  #.  
1360: 23 20 31 2e 20 49 66 20 74 68 65 20 5b 73 71 6c  # 1. If the [sql
1370: 69 74 65 33 5f 73 74 65 70 5d 20 64 69 64 20 6e  ite3_step] did n
1380: 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 49  ot require any I
1390: 4f 20 28 72 65 71 75 69 72 65 64 20 70 61 67 65  O (required page
13a0: 73 20 69 6e 0a 20 20 23 20 20 20 20 74 68 65 20  s in.  #    the 
13b0: 63 61 63 68 65 29 2c 20 74 68 65 6e 20 74 68 65  cache), then the
13c0: 20 6e 65 78 74 20 72 6f 77 20 28 22 30 30 32 2e   next row ("002.
13d0: 2e 2e 22 29 20 6d 61 79 20 62 65 20 72 65 74 72  ..") may be retr
13e0: 69 65 76 65 64 20 0a 20 20 23 20 20 20 20 73 75  ieved .  #    su
13f0: 63 63 65 73 73 66 75 6c 6c 79 2e 0a 20 20 23 0a  ccessfully..  #.
1400: 20 20 23 20 32 2e 20 49 66 20 74 68 65 20 5b 73    # 2. If the [s
1410: 71 6c 69 74 65 33 5f 73 74 65 70 5d 20 64 6f 65  qlite3_step] doe
1420: 73 20 72 65 71 75 69 72 65 20 49 4f 2c 20 74 68  s require IO, th
1430: 65 6e 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70  en [sqlite3_step
1440: 5d 20 72 65 74 75 72 6e 73 0a 20 20 23 20 20 20  ] returns.  #   
1450: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
1460: 64 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  d [sqlite3_final
1470: 69 7a 65 5d 20 72 65 74 75 72 6e 73 20 49 4f 45  ize] returns IOE
1480: 52 52 2e 0a 20 20 23 0a 20 20 23 20 33 2e 20 49  RR..  #.  # 3. I
1490: 66 2c 20 61 66 74 65 72 20 74 68 65 20 69 6e 69  f, after the ini
14a0: 74 69 61 6c 20 49 4f 20 65 72 72 6f 72 2c 20 53  tial IO error, S
14b0: 51 4c 69 74 65 20 74 72 69 65 64 20 74 6f 20 72  QLite tried to r
14c0: 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 20 20 23 20  ollback the.  # 
14d0: 20 20 20 61 63 74 69 76 65 20 74 72 61 6e 73 61     active transa
14e0: 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 63 6f  ction and a seco
14f0: 6e 64 20 49 4f 20 65 72 72 6f 72 20 77 61 73 20  nd IO error was 
1500: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
1510: 6e 0a 20 20 23 20 20 20 20 73 74 61 74 65 6d 65  n.  #    stateme
1520: 6e 74 20 24 3a 3a 53 54 4d 54 20 77 69 6c 6c 20  nt $::STMT will 
1530: 68 61 76 65 20 62 65 65 6e 20 61 62 6f 72 74 65  have been aborte
1540: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 5b 73  d. This means [s
1550: 71 6c 69 74 65 33 5f 73 74 6d 74 5d 0a 20 20 23  qlite3_stmt].  #
1560: 20 20 20 20 72 65 74 75 72 6e 73 20 53 51 4c 49      returns SQLI
1570: 54 45 5f 41 42 4f 52 54 2c 20 61 6e 64 20 74 68  TE_ABORT, and th
1580: 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 73  e statement curs
1590: 6f 72 20 64 6f 65 73 20 6e 6f 74 20 6d 6f 76 65  or does not move
15a0: 2e 20 69 2e 65 2e 0a 20 20 23 20 20 20 20 5b 73  . i.e..  #    [s
15b0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5d 20 73  qlite3_column] s
15c0: 74 69 6c 6c 20 72 65 74 75 72 6e 73 20 74 68 65  till returns the
15d0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 28 22 30   current row ("0
15e0: 30 31 2e 2e 2e 22 29 20 61 6e 64 0a 20 20 23 20  01...") and.  # 
15f0: 20 20 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61     [sqlite3_fina
1600: 6c 69 7a 65 5d 20 72 65 74 75 72 6e 73 20 53 51  lize] returns SQ
1610: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 23 0a 0a 20 20  LITE_OK..  #..  
1620: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69  do_test shared_i
1630: 6f 65 72 72 2d 33 2e 24 6e 2e 63 6c 65 61 6e 75  oerr-3.$n.cleanu
1640: 70 2e 31 20 7b 0a 20 20 20 20 65 78 70 72 20 7b  p.1 {.    expr {
1650: 0a 20 20 20 20 20 20 24 3a 3a 73 74 65 70 72 63  .      $::steprc
1660: 20 65 71 20 22 53 51 4c 49 54 45 5f 52 4f 57 22   eq "SQLITE_ROW"
1670: 20 7c 7c 20 0a 20 20 20 20 20 20 24 3a 3a 73 74   || .      $::st
1680: 65 70 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f  eprc eq "SQLITE_
1690: 45 52 52 4f 52 22 20 7c 7c 0a 20 20 20 20 20 20  ERROR" ||.      
16a0: 24 3a 3a 73 74 65 70 72 63 20 65 71 20 22 53 51  $::steprc eq "SQ
16b0: 4c 49 54 45 5f 41 42 4f 52 54 22 20 0a 20 20 20  LITE_ABORT" .   
16c0: 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f   }.  } {1}.  do_
16d0: 74 65 73 74 20 73 68 61 72 65 64 5f 69 6f 65 72  test shared_ioer
16e0: 72 2d 33 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e 32  r-3.$n.cleanup.2
16f0: 20 7b 0a 20 20 20 20 65 78 70 72 20 7b 0a 20 20   {.    expr {.  
1700: 20 20 20 20 28 24 3a 3a 73 74 65 70 72 63 20 65      ($::steprc e
1710: 71 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 26  q "SQLITE_ROW" &
1720: 26 20 24 3a 3a 63 6f 6c 75 6d 6e 20 65 71 20 22  & $::column eq "
1730: 30 30 32 2e 30 30 32 2e 30 30 32 2e 30 30 32 2e  002.002.002.002.
1740: 30 30 32 22 29 20 7c 7c 0a 20 20 20 20 20 20 28  002") ||.      (
1750: 24 3a 3a 73 74 65 70 72 63 20 65 71 20 22 53 51  $::steprc eq "SQ
1760: 4c 49 54 45 5f 45 52 52 4f 52 22 20 26 26 20 24  LITE_ERROR" && $
1770: 3a 3a 63 6f 6c 75 6d 6e 20 65 71 20 22 22 29 20  ::column eq "") 
1780: 7c 7c 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65  ||.      ($::ste
1790: 70 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 41  prc eq "SQLITE_A
17a0: 42 4f 52 54 22 20 26 26 20 24 3a 3a 63 6f 6c 75  BORT" && $::colu
17b0: 6d 6e 20 65 71 20 22 30 30 31 2e 30 30 31 2e 30  mn eq "001.001.0
17c0: 30 31 2e 30 30 31 2e 30 30 31 22 29 20 0a 20 20  01.001.001") .  
17d0: 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f    }.  } {1}.  do
17e0: 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69 6f 65  _test shared_ioe
17f0: 72 72 2d 33 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e  rr-3.$n.cleanup.
1800: 33 20 7b 0a 20 20 20 20 65 78 70 72 20 7b 0a 20  3 {.    expr {. 
1810: 20 20 20 20 20 28 24 3a 3a 73 74 65 70 72 63 20       ($::steprc 
1820: 65 71 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20  eq "SQLITE_ROW" 
1830: 26 26 20 24 3a 3a 66 69 6e 61 6c 72 63 20 65 71  && $::finalrc eq
1840: 20 22 53 51 4c 49 54 45 5f 4f 4b 22 29 20 7c 7c   "SQLITE_OK") ||
1850: 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65 70 72  .      ($::stepr
1860: 63 20 65 71 20 22 53 51 4c 49 54 45 5f 45 52 52  c eq "SQLITE_ERR
1870: 4f 52 22 20 26 26 20 24 3a 3a 66 69 6e 61 6c 72  OR" && $::finalr
1880: 63 20 65 71 20 22 53 51 4c 49 54 45 5f 49 4f 45  c eq "SQLITE_IOE
1890: 52 52 22 29 20 7c 7c 0a 20 20 20 20 20 20 28 24  RR") ||.      ($
18a0: 3a 3a 73 74 65 70 72 63 20 65 71 20 22 53 51 4c  ::steprc eq "SQL
18b0: 49 54 45 5f 45 52 52 4f 52 22 20 26 26 20 24 3a  ITE_ERROR" && $:
18c0: 3a 66 69 6e 61 6c 72 63 20 65 71 20 22 53 51 4c  :finalrc eq "SQL
18d0: 49 54 45 5f 41 42 4f 52 54 22 29 0a 20 20 20 20  ITE_ABORT").    
18e0: 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 23 20 64 62 32  }.  } {1}..# db2
18f0: 20 65 76 61 6c 20 7b 73 65 6c 65 63 74 20 2a 20   eval {select * 
1900: 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
1910: 65 72 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  er}.  db2 close.
1920: 7d 0a 0a 23 20 54 68 69 73 20 69 73 20 61 20 72  }..# This is a r
1930: 65 70 65 61 74 20 6f 66 20 74 68 65 20 70 72 65  epeat of the pre
1940: 76 69 6f 75 73 20 74 65 73 74 20 65 78 63 65 70  vious test excep
1950: 74 20 74 68 61 74 20 74 68 69 73 20 74 69 6d 65  t that this time
1960: 20 77 65 0a 23 20 61 72 65 20 64 6f 69 6e 67 20   we.# are doing 
1970: 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20  a reverse-order 
1980: 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  scan of the tabl
1990: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  e when the curso
19a0: 72 20 69 73 0a 23 20 22 73 61 76 65 64 22 2e 0a  r is.# "saved"..
19b0: 23 20 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74  # .do_ioerr_test
19c0: 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 33 72   shared_ioerr-3r
19d0: 65 76 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20  ev -tclprep {.  
19e0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
19f0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
1a00: 20 20 20 20 50 52 41 47 4d 41 20 72 65 61 64 5f      PRAGMA read_
1a10: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b  uncommitted = 1;
1a20: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
1a30: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
1a40: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
1a50: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
1a60: 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b  , UNIQUE(a, b));
1a70: 0a 20 20 7d 20 64 62 32 0a 20 20 66 6f 72 20 7b  .  } db2.  for {
1a80: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 32  set i 0} {$i < 2
1a90: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
1aa0: 20 20 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67     set a [string
1ab0: 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 72   range [string r
1ac0: 65 70 65 61 74 20 22 5b 66 6f 72 6d 61 74 20 25  epeat "[format %
1ad0: 30 33 64 20 24 69 5d 2e 22 20 35 5d 20 30 20 65  03d $i]." 5] 0 e
1ae0: 6e 64 2d 31 5d 0a 0a 20 20 20 20 73 65 74 20 62  nd-1]..    set b
1af0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
1b00: 24 69 20 32 30 30 30 5d 0a 20 20 20 20 65 78 65  $i 2000].    exe
1b10: 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54  csql {INSERT INT
1b20: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61 2c 20  O t1 VALUES($a, 
1b30: 24 62 29 7d 20 64 62 32 0a 20 20 7d 0a 20 20 65  $b)} db2.  }.  e
1b40: 78 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 20  xecsql {COMMIT} 
1b50: 64 62 32 0a 20 20 73 65 74 20 3a 3a 44 42 32 20  db2.  set ::DB2 
1b60: 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  [sqlite3_connect
1b70: 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32 5d  ion_pointer db2]
1b80: 0a 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73  .  set ::STMT [s
1b90: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 24  qlite3_prepare $
1ba0: 3a 3a 44 42 32 20 5c 0a 20 20 20 20 20 20 20 20  ::DB2 \.        
1bb0: 20 20 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f     "SELECT a FRO
1bc0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
1bd0: 44 45 53 43 22 20 2d 31 20 44 55 4d 4d 59 5d 0a  DESC" -1 DUMMY].
1be0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24    sqlite3_step $
1bf0: 3a 3a 53 54 4d 54 20 20 20 20 20 20 20 3b 23 20  ::STMT       ;# 
1c00: 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74  Cursor points at
1c10: 20 31 39 39 2e 31 39 39 2e 31 39 39 2e 31 39 39   199.199.199.199
1c20: 2e 31 39 39 0a 20 20 73 71 6c 69 74 65 33 5f 73  .199.  sqlite3_s
1c30: 74 65 70 20 24 3a 3a 53 54 4d 54 20 20 20 20 20  tep $::STMT     
1c40: 20 20 3b 23 20 43 75 72 73 6f 72 20 70 6f 69 6e    ;# Cursor poin
1c50: 74 73 20 61 74 20 31 39 38 2e 31 39 38 2e 31 39  ts at 198.198.19
1c60: 38 2e 31 39 38 2e 31 39 38 0a 0a 7d 20 2d 74 63  8.198.198..} -tc
1c70: 6c 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  lbody {.  execsq
1c80: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
1c90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1ca0: 31 20 56 41 4c 55 45 53 28 27 32 30 31 2e 32 30  1 VALUES('201.20
1cb0: 31 2e 32 30 31 2e 32 30 31 2e 32 30 31 27 2c 20  1.201.201.201', 
1cc0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 55 50 44 41 54  NULL);.    UPDAT
1cd0: 45 20 74 31 20 53 45 54 20 61 20 3d 20 27 32 30  E t1 SET a = '20
1ce0: 32 2e 32 30 32 2e 32 30 32 2e 32 30 32 2e 32 30  2.202.202.202.20
1cf0: 32 27 20 57 48 45 52 45 20 61 20 4c 49 4b 45 20  2' WHERE a LIKE 
1d00: 27 32 30 31 25 27 3b 0a 20 20 20 20 43 4f 4d 4d  '201%';.    COMM
1d10: 49 54 3b 0a 20 20 7d 0a 7d 20 2d 63 6c 65 61 6e  IT;.  }.} -clean
1d20: 75 70 20 7b 0a 20 20 73 65 74 20 3a 3a 73 74 65  up {.  set ::ste
1d30: 70 72 63 20 20 5b 73 71 6c 69 74 65 33 5f 73 74  prc  [sqlite3_st
1d40: 65 70 20 24 3a 3a 53 54 4d 54 5d 0a 20 20 73 65  ep $::STMT].  se
1d50: 74 20 3a 3a 63 6f 6c 75 6d 6e 20 20 5b 73 71 6c  t ::column  [sql
1d60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1d70: 20 24 3a 3a 53 54 4d 54 20 30 5d 0a 20 20 73 65   $::STMT 0].  se
1d80: 74 20 3a 3a 66 69 6e 61 6c 72 63 20 5b 73 71 6c  t ::finalrc [sql
1d90: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a  ite3_finalize $:
1da0: 3a 53 54 4d 54 5d 0a 0a 20 20 23 20 54 68 65 72  :STMT]..  # Ther
1db0: 65 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73  e are three poss
1dc0: 69 62 6c 65 20 6f 75 74 63 6f 6d 65 73 20 68 65  ible outcomes he
1dd0: 72 65 20 28 61 73 73 75 6d 69 6e 67 20 70 65 72  re (assuming per
1de0: 73 69 73 74 65 6e 74 20 49 4f 20 65 72 72 6f 72  sistent IO error
1df0: 73 29 3a 0a 20 20 23 0a 20 20 23 20 31 2e 20 49  s):.  #.  # 1. I
1e00: 66 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f 73  f the [sqlite3_s
1e10: 74 65 70 5d 20 64 69 64 20 6e 6f 74 20 72 65 71  tep] did not req
1e20: 75 69 72 65 20 61 6e 79 20 49 4f 20 28 72 65 71  uire any IO (req
1e30: 75 69 72 65 64 20 70 61 67 65 73 20 69 6e 0a 20  uired pages in. 
1e40: 20 23 20 20 20 20 74 68 65 20 63 61 63 68 65 29   #    the cache)
1e50: 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20  , then the next 
1e60: 72 6f 77 20 28 22 30 30 32 2e 2e 2e 22 29 20 6d  row ("002...") m
1e70: 61 79 20 62 65 20 72 65 74 72 69 65 76 65 64 20  ay be retrieved 
1e80: 0a 20 20 23 20 20 20 20 73 75 63 63 65 73 73 66  .  #    successf
1e90: 75 6c 6c 79 2e 0a 20 20 23 0a 20 20 23 20 32 2e  ully..  #.  # 2.
1ea0: 20 49 66 20 74 68 65 20 5b 73 71 6c 69 74 65 33   If the [sqlite3
1eb0: 5f 73 74 65 70 5d 20 64 6f 65 73 20 72 65 71 75  _step] does requ
1ec0: 69 72 65 20 49 4f 2c 20 74 68 65 6e 20 5b 73 71  ire IO, then [sq
1ed0: 6c 69 74 65 33 5f 73 74 65 70 5d 20 72 65 74 75  lite3_step] retu
1ee0: 72 6e 73 0a 20 20 23 20 20 20 20 53 51 4c 49 54  rns.  #    SQLIT
1ef0: 45 5f 45 52 52 4f 52 20 61 6e 64 20 5b 73 71 6c  E_ERROR and [sql
1f00: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 5d 20 72  ite3_finalize] r
1f10: 65 74 75 72 6e 73 20 49 4f 45 52 52 2e 0a 20 20  eturns IOERR..  
1f20: 23 0a 20 20 23 20 33 2e 20 49 66 2c 20 61 66 74  #.  # 3. If, aft
1f30: 65 72 20 74 68 65 20 69 6e 69 74 69 61 6c 20 49  er the initial I
1f40: 4f 20 65 72 72 6f 72 2c 20 53 51 4c 69 74 65 20  O error, SQLite 
1f50: 74 72 69 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  tried to rollbac
1f60: 6b 20 74 68 65 0a 20 20 23 20 20 20 20 61 63 74  k the.  #    act
1f70: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
1f80: 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 49 4f 20  and a second IO 
1f90: 65 72 72 6f 72 20 77 61 73 20 65 6e 63 6f 75 6e  error was encoun
1fa0: 74 65 72 65 64 2c 20 74 68 65 6e 0a 20 20 23 20  tered, then.  # 
1fb0: 20 20 20 73 74 61 74 65 6d 65 6e 74 20 24 3a 3a     statement $::
1fc0: 53 54 4d 54 20 77 69 6c 6c 20 68 61 76 65 20 62  STMT will have b
1fd0: 65 65 6e 20 61 62 6f 72 74 65 64 2e 20 54 68 69  een aborted. Thi
1fe0: 73 20 6d 65 61 6e 73 20 5b 73 71 6c 69 74 65 33  s means [sqlite3
1ff0: 5f 73 74 6d 74 5d 0a 20 20 23 20 20 20 20 72 65  _stmt].  #    re
2000: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 41 42 4f  turns SQLITE_ABO
2010: 52 54 2c 20 61 6e 64 20 74 68 65 20 73 74 61 74  RT, and the stat
2020: 65 6d 65 6e 74 20 63 75 72 73 6f 72 20 64 6f 65  ement cursor doe
2030: 73 20 6e 6f 74 20 6d 6f 76 65 2e 20 69 2e 65 2e  s not move. i.e.
2040: 0a 20 20 23 20 20 20 20 5b 73 71 6c 69 74 65 33  .  #    [sqlite3
2050: 5f 63 6f 6c 75 6d 6e 5d 20 73 74 69 6c 6c 20 72  _column] still r
2060: 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72 65  eturns the curre
2070: 6e 74 20 72 6f 77 20 28 22 30 30 31 2e 2e 2e 22  nt row ("001..."
2080: 29 20 61 6e 64 0a 20 20 23 20 20 20 20 5b 73 71  ) and.  #    [sq
2090: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 5d 20  lite3_finalize] 
20a0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
20b0: 4b 2e 0a 20 20 23 0a 0a 20 20 64 6f 5f 74 65 73  K..  #..  do_tes
20c0: 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 33  t shared_ioerr-3
20d0: 72 65 76 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e 31  rev.$n.cleanup.1
20e0: 20 7b 0a 20 20 20 20 65 78 70 72 20 7b 0a 20 20   {.    expr {.  
20f0: 20 20 20 20 24 3a 3a 73 74 65 70 72 63 20 65 71      $::steprc eq
2100: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 7c 7c   "SQLITE_ROW" ||
2110: 20 0a 20 20 20 20 20 20 24 3a 3a 73 74 65 70 72   .      $::stepr
2120: 63 20 65 71 20 22 53 51 4c 49 54 45 5f 45 52 52  c eq "SQLITE_ERR
2130: 4f 52 22 20 7c 7c 0a 20 20 20 20 20 20 24 3a 3a  OR" ||.      $::
2140: 73 74 65 70 72 63 20 65 71 20 22 53 51 4c 49 54  steprc eq "SQLIT
2150: 45 5f 41 42 4f 52 54 22 20 0a 20 20 20 20 7d 0a  E_ABORT" .    }.
2160: 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74 65 73    } {1}.  do_tes
2170: 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 33  t shared_ioerr-3
2180: 72 65 76 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e 32  rev.$n.cleanup.2
2190: 20 7b 0a 20 20 20 20 65 78 70 72 20 7b 0a 20 20   {.    expr {.  
21a0: 20 20 20 20 28 24 3a 3a 73 74 65 70 72 63 20 65      ($::steprc e
21b0: 71 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 26  q "SQLITE_ROW" &
21c0: 26 20 24 3a 3a 63 6f 6c 75 6d 6e 20 65 71 20 22  & $::column eq "
21d0: 31 39 37 2e 31 39 37 2e 31 39 37 2e 31 39 37 2e  197.197.197.197.
21e0: 31 39 37 22 29 20 7c 7c 0a 20 20 20 20 20 20 28  197") ||.      (
21f0: 24 3a 3a 73 74 65 70 72 63 20 65 71 20 22 53 51  $::steprc eq "SQ
2200: 4c 49 54 45 5f 45 52 52 4f 52 22 20 26 26 20 24  LITE_ERROR" && $
2210: 3a 3a 63 6f 6c 75 6d 6e 20 65 71 20 22 22 29 20  ::column eq "") 
2220: 7c 7c 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65  ||.      ($::ste
2230: 70 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 41  prc eq "SQLITE_A
2240: 42 4f 52 54 22 20 26 26 20 24 3a 3a 63 6f 6c 75  BORT" && $::colu
2250: 6d 6e 20 65 71 20 22 31 39 38 2e 31 39 38 2e 31  mn eq "198.198.1
2260: 39 38 2e 31 39 38 2e 31 39 38 22 29 20 0a 20 20  98.198.198") .  
2270: 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f    }.  } {1}.  do
2280: 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69 6f 65  _test shared_ioe
2290: 72 72 2d 33 72 65 76 2e 24 6e 2e 63 6c 65 61 6e  rr-3rev.$n.clean
22a0: 75 70 2e 33 20 7b 0a 20 20 20 20 65 78 70 72 20  up.3 {.    expr 
22b0: 7b 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65 70  {.      ($::step
22c0: 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 52 4f  rc eq "SQLITE_RO
22d0: 57 22 20 26 26 20 24 3a 3a 66 69 6e 61 6c 72 63  W" && $::finalrc
22e0: 20 65 71 20 22 53 51 4c 49 54 45 5f 4f 4b 22 29   eq "SQLITE_OK")
22f0: 20 7c 7c 0a 20 20 20 20 20 20 28 24 3a 3a 73 74   ||.      ($::st
2300: 65 70 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f  eprc eq "SQLITE_
2310: 45 52 52 4f 52 22 20 26 26 20 24 3a 3a 66 69 6e  ERROR" && $::fin
2320: 61 6c 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f  alrc eq "SQLITE_
2330: 49 4f 45 52 52 22 29 20 7c 7c 0a 20 20 20 20 20  IOERR") ||.     
2340: 20 28 24 3a 3a 73 74 65 70 72 63 20 65 71 20 22   ($::steprc eq "
2350: 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 20 26 26  SQLITE_ERROR" &&
2360: 20 24 3a 3a 66 69 6e 61 6c 72 63 20 65 71 20 22   $::finalrc eq "
2370: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 29 0a 20  SQLITE_ABORT"). 
2380: 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 23 20     }.  } {1}..# 
2390: 64 62 32 20 65 76 61 6c 20 7b 73 65 6c 65 63 74  db2 eval {select
23a0: 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d   * from sqlite_m
23b0: 61 73 74 65 72 7d 0a 20 20 64 62 32 20 63 6c 6f  aster}.  db2 clo
23c0: 73 65 0a 7d 0a 0a 23 20 4f 6e 6c 79 20 72 75 6e  se.}..# Only run
23d0: 20 74 68 65 73 65 20 74 65 73 74 73 20 69 66 20   these tests if 
23e0: 6d 65 6d 6f 72 79 20 64 65 62 75 67 67 69 6e 67  memory debugging
23f0: 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2e 0a 23   is turned on..#
2400: 0a 69 66 63 61 70 61 62 6c 65 20 21 6d 65 6d 64  .ifcapable !memd
2410: 65 62 75 67 20 7b 0a 20 20 20 70 75 74 73 20 22  ebug {.   puts "
2420: 53 6b 69 70 70 69 6e 67 20 74 65 73 74 73 20 73  Skipping tests s
2430: 68 61 72 65 64 5f 65 72 72 2d 34 20 74 68 72 6f  hared_err-4 thro
2440: 75 67 68 20 2d 39 3a 5c 0a 20 20 20 20 20 20 20  ugh -9:\.       
2450: 20 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 64 20 77    not compiled w
2460: 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 4d 45 4d  ith -DSQLITE_MEM
2470: 44 45 42 55 47 2e 2e 2e 22 0a 20 20 20 64 62 20  DEBUG...".   db 
2480: 63 6c 6f 73 65 0a 20 20 20 73 71 6c 69 74 65 33  close.   sqlite3
2490: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
24a0: 61 63 68 65 20 24 3a 3a 65 6e 61 62 6c 65 5f 73  ache $::enable_s
24b0: 68 61 72 65 64 5f 63 61 63 68 65 0a 20 20 20 66  hared_cache.   f
24c0: 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 20 72 65  inish_test.   re
24d0: 74 75 72 6e 0a 7d 0a 0a 23 20 50 72 6f 76 6f 6b  turn.}..# Provok
24e0: 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  e a malloc() fai
24f0: 6c 75 72 65 20 77 68 65 6e 20 61 20 63 75 72 73  lure when a curs
2500: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 62  or position is b
2510: 65 69 6e 67 20 73 61 76 65 64 2e 20 54 68 69 73  eing saved. This
2520: 0a 23 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  .# only happens 
2530: 77 69 74 68 20 69 6e 64 65 78 20 63 75 72 73 6f  with index curso
2540: 72 73 20 28 62 65 63 61 75 73 65 20 74 68 65 79  rs (because they
2550: 20 6d 61 6c 6c 6f 63 28 29 20 73 70 61 63 65 20   malloc() space 
2560: 74 6f 20 73 61 76 65 20 74 68 65 0a 23 20 63 75  to save the.# cu
2570: 72 72 65 6e 74 20 6b 65 79 20 76 61 6c 75 65 29  rrent key value)
2580: 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 68 61  . It does not ha
2590: 70 70 65 6e 20 77 69 74 68 20 74 61 62 6c 65 73  ppen with tables
25a0: 2c 20 62 65 63 61 75 73 65 20 61 6e 20 69 6e 74  , because an int
25b0: 65 67 65 72 0a 23 20 6b 65 79 20 64 6f 65 73 20  eger.# key does 
25c0: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 6d 61  not require a ma
25d0: 6c 6c 6f 63 28 29 20 74 6f 20 73 74 6f 72 65 2e  lloc() to store.
25e0: 20 0a 23 0a 23 20 54 68 65 20 6c 69 62 72 61 72   .#.# The librar
25f0: 79 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  y should return 
2600: 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  an SQLITE_NOMEM 
2610: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  to the caller. T
2620: 68 65 20 71 75 65 72 79 20 74 68 61 74 0a 23 20  he query that.# 
2630: 6f 77 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  owns the cursor 
2640: 28 74 68 65 20 6f 6e 65 20 66 6f 72 20 77 68 69  (the one for whi
2650: 63 68 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ch the position 
2660: 69 73 20 6e 6f 74 20 73 61 76 65 64 29 20 73 68  is not saved) sh
2670: 6f 75 6c 64 0a 23 20 63 6f 6e 74 69 6e 75 65 20  ould.# continue 
2680: 75 6e 61 66 66 65 63 74 65 64 2e 0a 23 20 0a 64  unaffected..# .d
2690: 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20 73 68  o_malloc_test sh
26a0: 61 72 65 64 5f 65 72 72 2d 34 20 2d 74 63 6c 70  ared_err-4 -tclp
26b0: 72 65 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  rep {.  sqlite3 
26c0: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
26d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
26e0: 4d 41 20 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74  MA read_uncommit
26f0: 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 42 45 47  ted = 1;.    BEG
2700: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
2710: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 55 4e  ABLE t1(a, b, UN
2720: 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 7d  IQUE(a, b));.  }
2730: 20 64 62 32 0a 20 20 66 6f 72 20 7b 73 65 74 20   db2.  for {set 
2740: 69 20 30 7d 20 7b 24 69 20 3c 20 35 7d 20 7b 69  i 0} {$i < 5} {i
2750: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74  ncr i} {.    set
2760: 20 61 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   a [string repea
2770: 74 20 24 69 20 31 30 5d 0a 20 20 20 20 73 65 74  t $i 10].    set
2780: 20 62 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61   b [string repea
2790: 74 20 24 69 20 32 30 30 30 5d 0a 20 20 20 20 65  t $i 2000].    e
27a0: 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49  xecsql {INSERT I
27b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61  NTO t1 VALUES($a
27c0: 2c 20 24 62 29 7d 20 64 62 32 0a 20 20 7d 0a 20  , $b)} db2.  }. 
27d0: 20 65 78 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54   execsql {COMMIT
27e0: 7d 20 64 62 32 0a 20 20 73 65 74 20 3a 3a 44 42  } db2.  set ::DB
27f0: 32 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  2 [sqlite3_conne
2800: 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62  ction_pointer db
2810: 32 5d 0a 20 20 73 65 74 20 3a 3a 53 54 4d 54 20  2].  set ::STMT 
2820: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  [sqlite3_prepare
2830: 20 24 3a 3a 44 42 32 20 22 53 45 4c 45 43 54 20   $::DB2 "SELECT 
2840: 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  a FROM t1 ORDER 
2850: 42 59 20 61 22 20 2d 31 20 44 55 4d 4d 59 5d 0a  BY a" -1 DUMMY].
2860: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24    sqlite3_step $
2870: 3a 3a 53 54 4d 54 20 20 20 20 20 20 20 3b 23 20  ::STMT       ;# 
2880: 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74  Cursor points at
2890: 20 30 30 30 30 30 30 30 30 30 30 0a 20 20 73 71   0000000000.  sq
28a0: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
28b0: 4d 54 20 20 20 20 20 20 20 3b 23 20 43 75 72 73  MT       ;# Curs
28c0: 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 31 31 31  or points at 111
28d0: 31 31 31 31 31 31 31 0a 7d 20 2d 74 63 6c 62 6f  1111111.} -tclbo
28e0: 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  dy {.  execsql {
28f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2900: 20 74 31 20 56 41 4c 55 45 53 28 36 2c 20 4e 55   t1 VALUES(6, NU
2910: 4c 4c 29 3b 0a 20 20 7d 0a 7d 20 2d 63 6c 65 61  LL);.  }.} -clea
2920: 6e 75 70 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  nup {.  do_test 
2930: 73 68 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 34 2e  shared_malloc-4.
2940: 24 3a 3a 6e 2e 63 6c 65 61 6e 75 70 2e 31 20 7b  $::n.cleanup.1 {
2950: 0a 20 20 20 20 73 65 74 20 3a 3a 72 63 20 5b 73  .    set ::rc [s
2960: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53  qlite3_step $::S
2970: 54 4d 54 5d 0a 20 20 20 20 65 78 70 72 20 7b 24  TMT].    expr {$
2980: 3a 3a 72 63 3d 3d 22 53 51 4c 49 54 45 5f 52 4f  ::rc=="SQLITE_RO
2990: 57 22 20 7c 7c 20 24 3a 3a 72 63 3d 3d 22 53 51  W" || $::rc=="SQ
29a0: 4c 49 54 45 5f 45 52 52 4f 52 22 7d 0a 20 20 7d  LITE_ERROR"}.  }
29b0: 20 7b 31 7d 0a 20 20 69 66 20 7b 24 3a 3a 72 63   {1}.  if {$::rc
29c0: 3d 3d 22 53 51 4c 49 54 45 5f 52 4f 57 22 7d 20  =="SQLITE_ROW"} 
29d0: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 73 68  {.    do_test sh
29e0: 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 34 2e 24 3a  ared_malloc-4.$:
29f0: 3a 6e 2e 63 6c 65 61 6e 75 70 2e 32 20 7b 0a 20  :n.cleanup.2 {. 
2a00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
2a10: 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 53 54 4d 54  umn_text $::STMT
2a20: 20 30 0a 20 20 20 20 7d 20 7b 32 32 32 32 32 32   0.    } {222222
2a30: 32 32 32 32 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74  2222}.  }.  do_t
2a40: 65 73 74 20 73 68 61 72 65 64 5f 6d 61 6c 6c 6f  est shared_mallo
2a50: 63 2d 34 2e 24 3a 3a 6e 2e 63 6c 65 61 6e 75 70  c-4.$::n.cleanup
2a60: 2e 33 20 7b 0a 20 20 20 73 65 74 20 72 63 20 5b  .3 {.   set rc [
2a70: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2a80: 20 24 3a 3a 53 54 4d 54 5d 0a 20 20 20 65 78 70   $::STMT].   exp
2a90: 72 20 7b 24 72 63 3d 3d 22 53 51 4c 49 54 45 5f  r {$rc=="SQLITE_
2aa0: 4f 4b 22 20 7c 7c 20 24 72 63 3d 3d 22 53 51 4c  OK" || $rc=="SQL
2ab0: 49 54 45 5f 41 42 4f 52 54 22 20 7c 7c 0a 20 20  ITE_ABORT" ||.  
2ac0: 20 20 20 20 20 20 20 24 72 63 3d 3d 22 53 51 4c         $rc=="SQL
2ad0: 49 54 45 5f 4e 4f 4d 45 4d 22 20 7c 7c 20 24 72  ITE_NOMEM" || $r
2ae0: 63 3d 3d 22 53 51 4c 49 54 45 5f 49 4f 45 52 52  c=="SQLITE_IOERR
2af0: 22 7d 0a 20 20 7d 20 7b 31 7d 0a 23 20 64 62 32  "}.  } {1}.# db2
2b00: 20 65 76 61 6c 20 7b 73 65 6c 65 63 74 20 2a 20   eval {select * 
2b10: 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
2b20: 65 72 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  er}.  db2 close.
2b30: 7d 0a 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73  }..do_malloc_tes
2b40: 74 20 73 68 61 72 65 64 5f 65 72 72 2d 35 20 2d  t shared_err-5 -
2b50: 74 63 6c 62 6f 64 79 20 7b 0a 20 20 64 62 20 63  tclbody {.  db c
2b60: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64  lose.  sqlite3 d
2b70: 62 58 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  bX test.db.  sql
2b80: 69 74 65 33 20 64 62 59 20 74 65 73 74 2e 64 62  ite3 dbY test.db
2b90: 0a 20 20 64 62 58 20 63 6c 6f 73 65 0a 20 20 64  .  dbX close.  d
2ba0: 62 59 20 63 6c 6f 73 65 0a 7d 20 2d 63 6c 65 61  bY close.} -clea
2bb0: 6e 75 70 20 7b 0a 20 20 63 61 74 63 68 20 7b 64  nup {.  catch {d
2bc0: 62 58 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63  bX close}.  catc
2bd0: 68 20 7b 64 62 59 20 63 6c 6f 73 65 7d 0a 7d 0a  h {dbY close}.}.
2be0: 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20  .do_malloc_test 
2bf0: 73 68 61 72 65 64 5f 65 72 72 2d 36 20 2d 74 63  shared_err-6 -tc
2c00: 6c 62 6f 64 79 20 7b 0a 20 20 63 61 74 63 68 20  lbody {.  catch 
2c10: 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 73 71 6c  {db close}.  sql
2c20: 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
2c30: 6e 75 70 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  nup.  sqlite3_en
2c40: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
2c50: 65 20 30 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b  e 0.} -cleanup {
2c60: 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  .  sqlite3_enabl
2c70: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 31  e_shared_cache 1
2c80: 0a 7d 0a 0a 23 20 41 73 20 6f 66 20 33 2e 35 2e  .}..# As of 3.5.
2c90: 30 2c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  0, sqlite3_enabl
2ca0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 63  e_shared_cache c
2cb0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 74 0a  an be called at.
2cc0: 23 20 61 6e 79 20 74 69 6d 65 20 61 6e 64 20 66  # any time and f
2cd0: 72 6f 6d 20 61 6e 79 20 74 68 72 65 61 64 0a 23  rom any thread.#
2ce0: 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 5f 65  do_test shared_e
2cf0: 72 72 2d 6d 69 73 75 73 65 2d 37 2e 31 20 7b 0a  rr-misuse-7.1 {.
2d00: 23 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  #  sqlite3 db te
2d10: 73 74 2e 64 62 0a 23 20 20 63 61 74 63 68 20 7b  st.db.#  catch {
2d20: 0a 23 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e  .#    sqlite3_en
2d30: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
2d40: 65 20 30 0a 23 20 20 7d 20 6d 73 67 0a 23 20 20  e 0.#  } msg.#  
2d50: 73 65 74 20 6d 73 67 0a 23 7d 20 7b 6c 69 62 72  set msg.#} {libr
2d60: 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  ary routine call
2d70: 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e  ed out of sequen
2d80: 63 65 7d 0a 0a 23 20 41 67 61 69 6e 20 70 72 6f  ce}..# Again pro
2d90: 76 6f 6b 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  voke a malloc() 
2da0: 66 61 69 6c 75 72 65 20 77 68 65 6e 20 61 20 63  failure when a c
2db0: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69  ursor position i
2dc0: 73 20 62 65 69 6e 67 20 73 61 76 65 64 2c 20 0a  s being saved, .
2dd0: 23 20 74 68 69 73 20 74 69 6d 65 20 64 75 72 69  # this time duri
2de0: 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  ng a ROLLBACK op
2df0: 65 72 61 74 69 6f 6e 20 62 79 20 73 6f 6d 65 20  eration by some 
2e00: 6f 74 68 65 72 20 68 61 6e 64 6c 65 2e 20 0a 23  other handle. .#
2e10: 0a 23 20 54 68 65 20 6c 69 62 72 61 72 79 20 73  .# The library s
2e20: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 6e 20  hould return an 
2e30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 74 6f 20  SQLITE_NOMEM to 
2e40: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20  the caller. The 
2e50: 71 75 65 72 79 20 74 68 61 74 0a 23 20 6f 77 6e  query that.# own
2e60: 73 20 74 68 65 20 63 75 72 73 6f 72 20 28 74 68  s the cursor (th
2e70: 65 20 6f 6e 65 20 66 6f 72 20 77 68 69 63 68 20  e one for which 
2e80: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 73 20  the position is 
2e90: 6e 6f 74 20 73 61 76 65 64 29 20 73 68 6f 75 6c  not saved) shoul
2ea0: 64 0a 23 20 62 65 20 61 62 6f 72 74 65 64 2e 0a  d.# be aborted..
2eb0: 23 20 0a 73 65 74 20 3a 3a 61 62 6f 72 74 65 64  # .set ::aborted
2ec0: 20 30 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73   0.do_malloc_tes
2ed0: 74 20 73 68 61 72 65 64 5f 65 72 72 2d 38 20 2d  t shared_err-8 -
2ee0: 74 63 6c 70 72 65 70 20 7b 0a 20 20 73 71 6c 69  tclprep {.  sqli
2ef0: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
2f00: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2f10: 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e 63 6f  PRAGMA read_unco
2f20: 6d 6d 69 74 74 65 64 20 3d 20 31 3b 0a 20 20 20  mmitted = 1;.   
2f30: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
2f40: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
2f50: 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b  , UNIQUE(a, b));
2f60: 0a 20 20 7d 20 64 62 32 0a 20 20 66 6f 72 20 7b  .  } db2.  for {
2f70: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 32  set i 0} {$i < 2
2f80: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
2f90: 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67 20 72   set a [string r
2fa0: 65 70 65 61 74 20 24 69 20 31 30 5d 0a 20 20 20  epeat $i 10].   
2fb0: 20 73 65 74 20 62 20 5b 73 74 72 69 6e 67 20 72   set b [string r
2fc0: 65 70 65 61 74 20 24 69 20 32 30 30 30 5d 0a 20  epeat $i 2000]. 
2fd0: 20 20 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45     execsql {INSE
2fe0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2ff0: 53 28 24 61 2c 20 24 62 29 7d 20 64 62 32 0a 20  S($a, $b)} db2. 
3000: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 4f   }.  execsql {CO
3010: 4d 4d 49 54 7d 20 64 62 32 0a 20 20 73 65 74 20  MMIT} db2.  set 
3020: 3a 3a 44 42 32 20 5b 73 71 6c 69 74 65 33 5f 63  ::DB2 [sqlite3_c
3030: 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65  onnection_pointe
3040: 72 20 64 62 32 5d 0a 20 20 73 65 74 20 3a 3a 53  r db2].  set ::S
3050: 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65  TMT [sqlite3_pre
3060: 70 61 72 65 20 24 3a 3a 44 42 32 20 22 53 45 4c  pare $::DB2 "SEL
3070: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 4f 52  ECT a FROM t1 OR
3080: 44 45 52 20 42 59 20 61 22 20 2d 31 20 44 55 4d  DER BY a" -1 DUM
3090: 4d 59 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  MY].  sqlite3_st
30a0: 65 70 20 24 3a 3a 53 54 4d 54 20 20 20 20 20 20  ep $::STMT      
30b0: 20 3b 23 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   ;# Cursor point
30c0: 73 20 61 74 20 30 30 30 30 30 30 30 30 30 30 0a  s at 0000000000.
30d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24    sqlite3_step $
30e0: 3a 3a 53 54 4d 54 20 20 20 20 20 20 20 3b 23 20  ::STMT       ;# 
30f0: 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74  Cursor points at
3100: 20 31 31 31 31 31 31 31 31 31 31 0a 7d 20 2d 74   1111111111.} -t
3110: 63 6c 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73  clbody {.  execs
3120: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
3130: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3140: 74 31 20 56 41 4c 55 45 53 28 36 2c 20 4e 55 4c  t1 VALUES(6, NUL
3150: 4c 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  L);.    ROLLBACK
3160: 3b 0a 20 20 7d 0a 7d 20 2d 63 6c 65 61 6e 75 70  ;.  }.} -cleanup
3170: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61   {.  do_test sha
3180: 72 65 64 5f 6d 61 6c 6c 6f 63 2d 38 2e 24 3a 3a  red_malloc-8.$::
3190: 6e 2e 63 6c 65 61 6e 75 70 2e 31 20 7b 0a 20 20  n.cleanup.1 {.  
31a0: 20 20 73 65 74 20 72 65 73 20 5b 63 61 74 63 68    set res [catch
31b0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 20 46 52  sql {SELECT a FR
31c0: 4f 4d 20 74 31 7d 20 64 62 32 5d 0a 20 20 20 20  OM t1} db2].    
31d0: 73 65 74 20 61 6e 73 20 5b 6c 69 6e 64 65 78 20  set ans [lindex 
31e0: 24 72 65 73 20 31 5d 0a 20 20 20 20 69 66 20 7b  $res 1].    if {
31f0: 5b 6c 69 6e 64 65 78 20 24 72 65 73 20 30 5d 7d  [lindex $res 0]}
3200: 20 7b 0a 20 20 20 20 20 20 20 73 65 74 20 72 20   {.       set r 
3210: 5b 65 78 70 72 20 7b 24 61 6e 73 3d 3d 22 64 69  [expr {$ans=="di
3220: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 7d 5d 0a  sk I/O error"}].
3230: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
3240: 20 20 20 20 73 65 74 20 72 20 5b 65 78 70 72 20      set r [expr 
3250: 7b 5b 6c 72 61 6e 67 65 20 24 61 6e 73 20 30 20  {[lrange $ans 0 
3260: 31 5d 3d 3d 22 30 30 30 30 30 30 30 30 30 30 20  1]=="0000000000 
3270: 31 31 31 31 31 31 31 31 31 31 22 7d 5d 0a 20 20  1111111111"}].  
3280: 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f    }.  } {1}.  do
3290: 5f 74 65 73 74 20 73 68 61 72 65 64 5f 6d 61 6c  _test shared_mal
32a0: 6c 6f 63 2d 38 2e 24 3a 3a 6e 2e 63 6c 65 61 6e  loc-8.$::n.clean
32b0: 75 70 2e 32 20 7b 0a 20 20 20 20 73 65 74 20 72  up.2 {.    set r
32c0: 63 31 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70  c1 [sqlite3_step
32d0: 20 24 3a 3a 53 54 4d 54 5d 0a 20 20 20 20 73 65   $::STMT].    se
32e0: 74 20 72 63 32 20 5b 73 71 6c 69 74 65 33 5f 66  t rc2 [sqlite3_f
32f0: 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54 5d  inalize $::STMT]
3300: 0a 20 20 20 20 69 66 20 7b 24 72 63 32 3d 3d 22  .    if {$rc2=="
3310: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 7d 20 7b  SQLITE_ABORT"} {
3320: 0a 20 20 20 20 20 20 69 6e 63 72 20 3a 3a 61 62  .      incr ::ab
3330: 6f 72 74 65 64 0a 20 20 20 20 7d 0a 20 20 20 20  orted.    }.    
3340: 65 78 70 72 20 7b 0a 20 20 20 20 20 20 28 24 72  expr {.      ($r
3350: 63 31 3d 3d 22 53 51 4c 49 54 45 5f 44 4f 4e 45  c1=="SQLITE_DONE
3360: 22 20 26 26 20 24 72 63 32 3d 3d 22 53 51 4c 49  " && $rc2=="SQLI
3370: 54 45 5f 4f 4b 22 29 20 7c 7c 20 0a 20 20 20 20  TE_OK") || .    
3380: 20 20 28 24 72 63 31 3d 3d 22 53 51 4c 49 54 45    ($rc1=="SQLITE
3390: 5f 45 52 52 4f 52 22 20 26 26 20 24 72 63 32 3d  _ERROR" && $rc2=
33a0: 3d 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 29  ="SQLITE_ABORT")
33b0: 20 7c 7c 0a 20 20 20 20 20 20 28 24 72 63 31 3d   ||.      ($rc1=
33c0: 3d 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 20  ="SQLITE_ERROR" 
33d0: 26 26 20 24 72 63 32 3d 3d 22 53 51 4c 49 54 45  && $rc2=="SQLITE
33e0: 5f 4e 4f 4d 45 4d 22 29 20 7c 7c 0a 20 20 20 20  _NOMEM") ||.    
33f0: 20 20 28 24 72 63 31 3d 3d 22 53 51 4c 49 54 45    ($rc1=="SQLITE
3400: 5f 45 52 52 4f 52 22 20 26 26 20 24 72 63 32 3d  _ERROR" && $rc2=
3410: 3d 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 29  ="SQLITE_IOERR")
3420: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20  .    }.  } {1}. 
3430: 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a 64 6f 5f   db2 close.}.do_
3440: 74 65 73 74 20 73 68 61 72 65 64 5f 6d 61 6c 6c  test shared_mall
3450: 6f 63 2d 38 2e 58 20 7b 0a 20 20 23 20 54 65 73  oc-8.X {.  # Tes
3460: 74 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 6d 6f  t that one or mo
3470: 72 65 20 71 75 65 72 69 65 73 20 77 65 72 65 20  re queries were 
3480: 61 62 6f 72 74 65 64 20 64 75 65 20 74 6f 20 74  aborted due to t
3490: 68 65 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  he malloc() fail
34a0: 75 72 65 2e 0a 20 20 65 78 70 72 20 24 3a 3a 61  ure..  expr $::a
34b0: 62 6f 72 74 65 64 3e 3d 31 0a 7d 20 7b 31 7d 0a  borted>=1.} {1}.
34c0: 0a 23 20 54 68 69 73 20 74 65 73 74 20 69 73 20  .# This test is 
34d0: 64 65 73 69 67 6e 65 64 20 74 6f 20 63 61 74 63  designed to catc
34e0: 68 20 61 20 73 70 65 63 69 66 69 63 20 62 75 67  h a specific bug
34f0: 20 74 68 61 74 20 77 61 73 20 70 72 65 73 65 6e   that was presen
3500: 74 20 64 75 72 69 6e 67 0a 23 20 64 65 76 65 6c  t during.# devel
3510: 6f 70 6d 65 6e 74 20 6f 66 20 33 2e 35 2e 30 2e  opment of 3.5.0.
3520: 20 49 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   If a malloc() f
3530: 61 69 6c 65 64 20 77 68 69 6c 65 20 73 65 74 74  ailed while sett
3540: 69 6e 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ing the page-siz
3550: 65 2c 0a 23 20 61 20 62 75 66 66 65 72 20 28 50  e,.# a buffer (P
3560: 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 29 20  ager.pTmpSpace) 
3570: 77 61 73 20 62 65 69 6e 67 20 66 72 65 65 64 2e  was being freed.
3580: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 61 75 73   This could caus
3590: 65 20 61 20 73 65 67 2d 66 61 75 6c 74 0a 23 20  e a seg-fault.# 
35a0: 6c 61 74 65 72 20 69 66 20 61 6e 6f 74 68 65 72  later if another
35b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 72 69 65   connection trie
35c0: 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 61 67  d to use the pag
35d0: 65 72 2e 0a 23 0a 23 20 54 68 69 73 20 74 65 73  er..#.# This tes
35e0: 74 20 77 69 6c 6c 20 63 72 61 73 68 20 33 2e 34  t will crash 3.4
35f0: 2e 32 2e 0a 23 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f  .2..#.do_malloc_
3600: 74 65 73 74 20 73 68 61 72 65 64 5f 65 72 72 2d  test shared_err-
3610: 39 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20 73  9 -tclprep {.  s
3620: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
3630: 64 62 0a 7d 20 2d 73 71 6c 62 6f 64 79 20 7b 0a  db.} -sqlbody {.
3640: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
3650: 7a 65 20 3d 20 34 30 39 36 3b 0a 20 20 50 52 41  ze = 4096;.  PRA
3660: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
3670: 31 30 32 34 3b 0a 7d 20 2d 63 6c 65 61 6e 75 70  1024;.} -cleanup
3680: 20 7b 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 0a   {.  db2 eval {.
3690: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
36a0: 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20   abc(a, b, c);. 
36b0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
36c0: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
36d0: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
36e0: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
36f0: 20 20 20 20 20 0a 20 20 64 62 32 20 63 6c 6f 73       .  db2 clos
3700: 65 0a 7d 20 20 20 20 20 0a 0a 0a 63 61 74 63 68  e.}     ...catch
3710: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 63 61 74 63   {db close}.catc
3720: 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 73 71  h {db2 close}.sq
3730: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
3740: 72 65 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e 61  red_cache $::ena
3750: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
3760: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.