/ Hex Artifact Content
Login

Artifact 9fa070e3e7d63022a81b6156ac71f114c0678e3d:


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 32 20 32 30 30 37  test,v 1.12 2007
0260: 2f 30 38 2f 32 35 20 31 33 3a 33 37 3a 34 39 20  /08/25 13:37:49 
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 5c 0a 20 20 20 20 20 20 22 31 20 7b 64     \.      "1 {d
0630: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 7d 22 20  isk I/O error}" 
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0650: 0a 20 20 20 20 20 20 22 30 20 7b 31 20 32 20 33  .      "0 {1 2 3
0660: 7d 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }"              
0670: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0680: 20 20 20 22 30 20 7b 31 20 32 20 33 20 31 20 32     "0 {1 2 3 1 2
0690: 20 33 20 34 20 35 20 36 7d 22 20 20 20 20 20 20   3 4 5 6}"      
06a0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 22         \.      "
06b0: 30 20 7b 31 20 32 20 33 20 31 20 32 20 33 20 34  0 {1 2 3 1 2 3 4
06c0: 20 35 20 36 20 31 20 32 20 33 20 34 20 35 20 36   5 6 1 2 3 4 5 6
06d0: 7d 22 20 5c 0a 20 20 20 20 20 20 22 30 20 7b 7d  }" \.      "0 {}
06e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0700: 0a 20 20 20 20 5d 0a 20 20 20 20 73 65 74 20 72  .    ].    set r
0710: 63 20 5b 65 78 70 72 20 5b 6c 73 65 61 72 63 68  c [expr [lsearch
0720: 20 2d 65 78 61 63 74 20 24 70 6f 73 73 69 62 6c   -exact $possibl
0730: 65 5f 72 65 73 75 6c 74 73 20 24 72 65 73 5d 20  e_results $res] 
0740: 3e 3d 20 30 5d 0a 20 20 20 20 69 66 20 7b 24 72  >= 0].    if {$r
0750: 63 20 21 3d 20 31 7d 20 7b 0a 20 20 20 20 20 20  c != 1} {.      
0760: 70 75 74 73 20 22 22 0a 20 20 20 20 20 20 70 75  puts "".      pu
0770: 74 73 20 22 52 65 73 75 6c 74 3a 20 24 72 65 73  ts "Result: $res
0780: 22 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20  ".    }.    set 
0790: 72 63 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 62 32  rc.  } {1}.  db2
07a0: 20 63 6c 6f 73 65 0a 7d 0a 0a 64 6f 5f 69 6f 65   close.}..do_ioe
07b0: 72 72 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69  rr_test shared_i
07c0: 6f 65 72 72 2d 32 20 2d 74 63 6c 70 72 65 70 20  oerr-2 -tclprep 
07d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
07e0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
07f0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 72  l {.    PRAGMA r
0800: 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead_uncommitted 
0810: 3d 20 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  = 1;.    BEGIN;.
0820: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0830: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
0840: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 6f 69  NSERT INTO t1(oi
0850: 64 29 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29 3b  d) VALUES(NULL);
0860: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0870: 20 74 31 28 6f 69 64 29 20 53 45 4c 45 43 54 20   t1(oid) SELECT 
0880: 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20  NULL FROM t1;.  
0890: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
08a0: 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e 55 4c  (oid) SELECT NUL
08b0: 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  L FROM t1;.    I
08c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 6f 69  NSERT INTO t1(oi
08d0: 64 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46  d) SELECT NULL F
08e0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
08f0: 52 54 20 49 4e 54 4f 20 74 31 28 6f 69 64 29 20  RT INTO t1(oid) 
0900: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d  SELECT NULL FROM
0910: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
0920: 49 4e 54 4f 20 74 31 28 6f 69 64 29 20 53 45 4c  INTO t1(oid) SEL
0930: 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31  ECT NULL FROM t1
0940: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0950: 4f 20 74 31 28 6f 69 64 29 20 53 45 4c 45 43 54  O t1(oid) SELECT
0960: 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20   NULL FROM t1;. 
0970: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0980: 31 28 6f 69 64 29 20 53 45 4c 45 43 54 20 4e 55  1(oid) SELECT NU
0990: 4c 4c 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  LL FROM t1;.    
09a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 6f  INSERT INTO t1(o
09b0: 69 64 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20  id) SELECT NULL 
09c0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
09d0: 45 52 54 20 49 4e 54 4f 20 74 31 28 6f 69 64 29  ERT INTO t1(oid)
09e0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f   SELECT NULL FRO
09f0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
0a00: 20 49 4e 54 4f 20 74 31 28 6f 69 64 29 20 53 45   INTO t1(oid) SE
0a10: 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74  LECT NULL FROM t
0a20: 31 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  1;.    UPDATE t1
0a30: 20 73 65 74 20 61 20 3d 20 6f 69 64 2c 20 62 20   set a = oid, b 
0a40: 3d 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  = 'abcdefghijklm
0a50: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31 32  nopqrstuvwxyz012
0a60: 33 34 35 36 37 38 39 27 3b 0a 20 20 20 20 43 52  3456789';.    CR
0a70: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
0a80: 20 74 31 28 61 29 3b 0a 20 20 20 20 43 4f 4d 4d   t1(a);.    COMM
0a90: 49 54 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  IT;.    BEGIN;. 
0aa0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0ab0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
0ac0: 20 20 7d 20 64 62 32 0a 7d 20 2d 74 63 6c 62 6f    } db2.} -tclbo
0ad0: 64 79 20 7b 0a 20 20 73 65 74 20 3a 3a 72 65 73  dy {.  set ::res
0ae0: 69 64 78 20 30 0a 20 20 65 78 65 63 73 71 6c 20  idx 0.  execsql 
0af0: 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20  {DELETE FROM t1 
0b00: 57 48 45 52 45 20 30 20 3d 20 28 61 20 25 20 32  WHERE 0 = (a % 2
0b10: 29 3b 7d 0a 20 20 69 6e 63 72 20 3a 3a 72 65 73  );}.  incr ::res
0b20: 69 64 78 0a 0a 20 20 23 20 57 68 65 6e 20 74 68  idx..  # When th
0b30: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  is transaction b
0b40: 65 67 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  egins the table 
0b50: 63 6f 6e 74 61 69 6e 73 20 35 31 32 20 65 6e 74  contains 512 ent
0b60: 72 69 65 73 2e 20 54 68 65 0a 20 20 23 20 74 77  ries. The.  # tw
0b70: 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 67  o statements tog
0b80: 65 74 68 65 72 20 61 64 64 20 35 31 32 2b 31 34  ether add 512+14
0b90: 36 20 6d 6f 72 65 20 69 66 20 69 74 20 73 75 63  6 more if it suc
0ba0: 63 65 65 64 73 2e 20 0a 20 20 23 20 28 31 30 32  ceeds. .  # (102
0bb0: 34 2f 37 3d 3d 31 34 36 29 0a 20 20 65 78 65 63  4/7==146).  exec
0bc0: 73 71 6c 20 7b 42 45 47 49 4e 3b 7d 0a 20 20 65  sql {BEGIN;}.  e
0bd0: 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49  xecsql {INSERT I
0be0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 61 2b  NTO t1 SELECT a+
0bf0: 31 2c 20 62 20 46 52 4f 4d 20 74 31 3b 7d 0a 20  1, b FROM t1;}. 
0c00: 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54   execsql {INSERT
0c10: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
0c20: 27 73 74 72 69 6e 67 27 20 7c 7c 20 61 2c 20 62  'string' || a, b
0c30: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 30   FROM t1 WHERE 0
0c40: 20 3d 20 28 61 25 37 29 3b 7d 0a 20 20 65 78 65   = (a%7);}.  exe
0c50: 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 3b 7d 0a 0a  csql {COMMIT;}..
0c60: 20 20 69 6e 63 72 20 3a 3a 72 65 73 69 64 78 0a    incr ::residx.
0c70: 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20 20 64  } -cleanup {.  d
0c80: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69 6f  o_test shared_io
0c90: 65 72 72 2d 32 2e 24 6e 2e 63 6c 65 61 6e 75 70  err-2.$n.cleanup
0ca0: 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73  .1 {.    set res
0cb0: 20 5b 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20   [catchsql {.   
0cc0: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
0cd0: 2c 20 6d 69 6e 28 61 29 2c 20 63 6f 75 6e 74 28  , min(a), count(
0ce0: 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
0cf0: 61 20 46 52 4f 4d 20 74 31 20 6f 72 64 65 72 20  a FROM t1 order 
0d00: 62 79 20 61 29 3b 0a 20 20 20 20 7d 20 64 62 32  by a);.    } db2
0d10: 5d 0a 20 20 20 20 73 65 74 20 70 6f 73 73 69 62  ].    set possib
0d20: 6c 65 5f 72 65 73 75 6c 74 73 20 5b 6c 69 73 74  le_results [list
0d30: 20 5c 0a 20 20 20 20 20 20 7b 30 20 7b 31 30 32   \.      {0 {102
0d40: 34 20 31 20 31 30 32 34 7d 7d 20 20 20 20 20 20  4 1 1024}}      
0d50: 20 20 5c 0a 20 20 20 20 20 20 7b 30 20 7b 31 30    \.      {0 {10
0d60: 32 33 20 31 20 35 31 32 7d 7d 20 20 20 20 20 20  23 1 512}}      
0d70: 20 20 20 5c 0a 20 20 20 20 20 20 7b 30 20 7b 73     \.      {0 {s
0d80: 74 72 69 6e 67 39 39 34 20 31 20 31 31 37 30 7d  tring994 1 1170}
0d90: 7d 20 20 20 5c 0a 20 20 20 20 5d 0a 20 20 20 20  }   \.    ].    
0da0: 73 65 74 20 69 64 78 20 5b 6c 73 65 61 72 63 68  set idx [lsearch
0db0: 20 2d 65 78 61 63 74 20 24 70 6f 73 73 69 62 6c   -exact $possibl
0dc0: 65 5f 72 65 73 75 6c 74 73 20 24 72 65 73 5d 0a  e_results $res].
0dd0: 20 20 20 20 73 65 74 20 73 75 63 63 65 73 73 20      set success 
0de0: 5b 65 78 70 72 20 7b 24 69 64 78 3d 3d 24 3a 3a  [expr {$idx==$::
0df0: 72 65 73 69 64 78 20 7c 7c 20 24 72 65 73 3d 3d  residx || $res==
0e00: 22 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72  "1 {disk I/O err
0e10: 6f 72 7d 22 7d 5d 0a 20 20 20 20 69 66 20 7b 21  or}"}].    if {!
0e20: 24 73 75 63 63 65 73 73 7d 20 7b 0a 20 20 20 20  $success} {.    
0e30: 20 20 70 75 74 73 20 22 22 0a 20 20 20 20 20 20    puts "".      
0e40: 70 75 74 73 20 22 52 65 73 75 6c 74 3a 20 5c 22  puts "Result: \"
0e50: 24 72 65 73 5c 22 20 28 24 3a 3a 72 65 73 69 64  $res\" ($::resid
0e60: 78 29 22 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  x)".    }.    se
0e70: 74 20 73 75 63 63 65 73 73 0a 20 20 7d 20 7b 31  t success.  } {1
0e80: 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a  }.  db2 close.}.
0e90: 0a 23 20 54 68 69 73 20 74 65 73 74 20 69 73 20  .# This test is 
0ea0: 64 65 73 69 67 6e 65 64 20 74 6f 20 70 72 6f 76  designed to prov
0eb0: 6f 6b 65 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  oke an IO error 
0ec0: 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 70 6f  when a cursor po
0ed0: 73 69 74 69 6f 6e 20 69 73 0a 23 20 22 73 61 76  sition is.# "sav
0ee0: 65 64 22 20 28 62 65 63 61 75 73 65 20 61 6e 6f  ed" (because ano
0ef0: 74 68 65 72 20 63 75 72 73 6f 72 20 69 73 20 67  ther cursor is g
0f00: 6f 69 6e 67 20 74 6f 20 6d 6f 64 69 66 79 20 74  oing to modify t
0f10: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 74 61  he underlying ta
0f20: 62 6c 65 29 2e 20 0a 23 20 0a 64 6f 5f 69 6f 65  ble). .# .do_ioe
0f30: 72 72 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69  rr_test shared_i
0f40: 6f 65 72 72 2d 33 20 2d 74 63 6c 70 72 65 70 20  oerr-3 -tclprep 
0f50: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
0f60: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
0f70: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 72  l {.    PRAGMA r
0f80: 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead_uncommitted 
0f90: 3d 20 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  = 1;.    PRAGMA 
0fa0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
0fb0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
0fc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0fd0: 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20  a, b, UNIQUE(a, 
0fe0: 62 29 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20 66  b));.  } db2.  f
0ff0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
1000: 20 3c 20 32 30 30 7d 20 7b 69 6e 63 72 20 69 7d   < 200} {incr i}
1010: 20 7b 0a 20 20 20 20 73 65 74 20 61 20 5b 73 74   {.    set a [st
1020: 72 69 6e 67 20 72 61 6e 67 65 20 5b 73 74 72 69  ring range [stri
1030: 6e 67 20 72 65 70 65 61 74 20 22 5b 66 6f 72 6d  ng repeat "[form
1040: 61 74 20 25 30 33 64 20 24 69 5d 2e 22 20 35 5d  at %03d $i]." 5]
1050: 20 30 20 65 6e 64 2d 31 5d 0a 0a 20 20 20 20 73   0 end-1]..    s
1060: 65 74 20 62 20 5b 73 74 72 69 6e 67 20 72 65 70  et b [string rep
1070: 65 61 74 20 24 69 20 32 30 30 30 5d 0a 20 20 20  eat $i 2000].   
1080: 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54   execsql {INSERT
1090: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
10a0: 24 61 2c 20 24 62 29 7d 20 64 62 32 0a 20 20 7d  $a, $b)} db2.  }
10b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 4f 4d 4d  .  execsql {COMM
10c0: 49 54 7d 20 64 62 32 0a 20 20 73 65 74 20 3a 3a  IT} db2.  set ::
10d0: 44 42 32 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e  DB2 [sqlite3_con
10e0: 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20  nection_pointer 
10f0: 64 62 32 5d 0a 20 20 73 65 74 20 3a 3a 53 54 4d  db2].  set ::STM
1100: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
1110: 72 65 20 24 3a 3a 44 42 32 20 22 53 45 4c 45 43  re $::DB2 "SELEC
1120: 54 20 61 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  T a FROM t1 ORDE
1130: 52 20 42 59 20 61 22 20 2d 31 20 44 55 4d 4d 59  R BY a" -1 DUMMY
1140: 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ].  sqlite3_step
1150: 20 24 3a 3a 53 54 4d 54 20 20 20 20 20 20 20 3b   $::STMT       ;
1160: 23 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  # Cursor points 
1170: 61 74 20 30 30 30 2e 30 30 30 2e 30 30 30 2e 30  at 000.000.000.0
1180: 30 30 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  00.  sqlite3_ste
1190: 70 20 24 3a 3a 53 54 4d 54 20 20 20 20 20 20 20  p $::STMT       
11a0: 3b 23 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 73  ;# Cursor points
11b0: 20 61 74 20 30 30 31 2e 30 30 31 2e 30 30 31 2e   at 001.001.001.
11c0: 30 30 31 0a 0a 7d 20 2d 74 63 6c 62 6f 64 79 20  001..} -tclbody 
11d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11e0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
11f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1200: 45 53 28 27 32 30 31 2e 32 30 31 2e 32 30 31 2e  ES('201.201.201.
1210: 32 30 31 2e 32 30 31 27 2c 20 4e 55 4c 4c 29 3b  201.201', NULL);
1220: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
1230: 45 54 20 61 20 3d 20 27 32 30 32 2e 32 30 32 2e  ET a = '202.202.
1240: 32 30 32 2e 32 30 32 2e 32 30 32 27 20 57 48 45  202.202.202' WHE
1250: 52 45 20 61 20 4c 49 4b 45 20 27 32 30 31 25 27  RE a LIKE '201%'
1260: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
1270: 7d 0a 7d 20 2d 63 6c 65 61 6e 75 70 20 7b 0a 20  }.} -cleanup {. 
1280: 20 73 65 74 20 3a 3a 73 74 65 70 72 63 20 20 5b   set ::steprc  [
1290: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a  sqlite3_step $::
12a0: 53 54 4d 54 5d 0a 20 20 73 65 74 20 3a 3a 63 6f  STMT].  set ::co
12b0: 6c 75 6d 6e 20 20 5b 73 71 6c 69 74 65 33 5f 63  lumn  [sqlite3_c
12c0: 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 53 54  olumn_text $::ST
12d0: 4d 54 20 30 5d 0a 20 20 73 65 74 20 3a 3a 66 69  MT 0].  set ::fi
12e0: 6e 61 6c 72 63 20 5b 73 71 6c 69 74 65 33 5f 66  nalrc [sqlite3_f
12f0: 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54 5d  inalize $::STMT]
1300: 0a 0a 20 20 23 20 54 68 65 72 65 20 61 72 65 20  ..  # There are 
1310: 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65 20 6f  three possible o
1320: 75 74 63 6f 6d 65 73 20 68 65 72 65 20 28 61 73  utcomes here (as
1330: 73 75 6d 69 6e 67 20 70 65 72 73 69 73 74 65 6e  suming persisten
1340: 74 20 49 4f 20 65 72 72 6f 72 73 29 3a 0a 20 20  t IO errors):.  
1350: 23 0a 20 20 23 20 31 2e 20 49 66 20 74 68 65 20  #.  # 1. If the 
1360: 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 5d 20 64  [sqlite3_step] d
1370: 69 64 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  id not require a
1380: 6e 79 20 49 4f 20 28 72 65 71 75 69 72 65 64 20  ny IO (required 
1390: 70 61 67 65 73 20 69 6e 0a 20 20 23 20 20 20 20  pages in.  #    
13a0: 74 68 65 20 63 61 63 68 65 29 2c 20 74 68 65 6e  the cache), then
13b0: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 28 22   the next row ("
13c0: 30 30 32 2e 2e 2e 22 29 20 6d 61 79 20 62 65 20  002...") may be 
13d0: 72 65 74 72 69 65 76 65 64 20 0a 20 20 23 20 20  retrieved .  #  
13e0: 20 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a    successfully..
13f0: 20 20 23 0a 20 20 23 20 32 2e 20 49 66 20 74 68    #.  # 2. If th
1400: 65 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 5d  e [sqlite3_step]
1410: 20 64 6f 65 73 20 72 65 71 75 69 72 65 20 49 4f   does require IO
1420: 2c 20 74 68 65 6e 20 5b 73 71 6c 69 74 65 33 5f  , then [sqlite3_
1430: 73 74 65 70 5d 20 72 65 74 75 72 6e 73 0a 20 20  step] returns.  
1440: 23 20 20 20 20 53 51 4c 49 54 45 5f 45 52 52 4f  #    SQLITE_ERRO
1450: 52 20 61 6e 64 20 5b 73 71 6c 69 74 65 33 5f 66  R and [sqlite3_f
1460: 69 6e 61 6c 69 7a 65 5d 20 72 65 74 75 72 6e 73  inalize] returns
1470: 20 49 4f 45 52 52 2e 0a 20 20 23 0a 20 20 23 20   IOERR..  #.  # 
1480: 33 2e 20 49 66 2c 20 61 66 74 65 72 20 74 68 65  3. If, after the
1490: 20 69 6e 69 74 69 61 6c 20 49 4f 20 65 72 72 6f   initial IO erro
14a0: 72 2c 20 53 51 4c 69 74 65 20 74 72 69 65 64 20  r, SQLite tried 
14b0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  to rollback the.
14c0: 20 20 23 20 20 20 20 61 63 74 69 76 65 20 74 72    #    active tr
14d0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
14e0: 73 65 63 6f 6e 64 20 49 4f 20 65 72 72 6f 72 20  second IO error 
14f0: 77 61 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  was encountered,
1500: 20 74 68 65 6e 0a 20 20 23 20 20 20 20 73 74 61   then.  #    sta
1510: 74 65 6d 65 6e 74 20 24 3a 3a 53 54 4d 54 20 77  tement $::STMT w
1520: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 61 62  ill have been ab
1530: 6f 72 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  orted. This mean
1540: 73 20 5b 73 71 6c 69 74 65 33 5f 73 74 6d 74 5d  s [sqlite3_stmt]
1550: 0a 20 20 23 20 20 20 20 72 65 74 75 72 6e 73 20  .  #    returns 
1560: 53 51 4c 49 54 45 5f 41 42 4f 52 54 2c 20 61 6e  SQLITE_ABORT, an
1570: 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  d the statement 
1580: 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20  cursor does not 
1590: 6d 6f 76 65 2e 20 69 2e 65 2e 0a 20 20 23 20 20  move. i.e..  #  
15a0: 20 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d    [sqlite3_colum
15b0: 6e 5d 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 73  n] still returns
15c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
15d0: 20 28 22 30 30 31 2e 2e 2e 22 29 20 61 6e 64 0a   ("001...") and.
15e0: 20 20 23 20 20 20 20 5b 73 71 6c 69 74 65 33 5f    #    [sqlite3_
15f0: 66 69 6e 61 6c 69 7a 65 5d 20 72 65 74 75 72 6e  finalize] return
1600: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 23  s SQLITE_OK..  #
1610: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72  ..  do_test shar
1620: 65 64 5f 69 6f 65 72 72 2d 33 2e 24 6e 2e 63 6c  ed_ioerr-3.$n.cl
1630: 65 61 6e 75 70 2e 31 20 7b 0a 20 20 20 20 65 78  eanup.1 {.    ex
1640: 70 72 20 7b 0a 20 20 20 20 20 20 24 3a 3a 73 74  pr {.      $::st
1650: 65 70 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f  eprc eq "SQLITE_
1660: 52 4f 57 22 20 7c 7c 20 0a 20 20 20 20 20 20 24  ROW" || .      $
1670: 3a 3a 73 74 65 70 72 63 20 65 71 20 22 53 51 4c  ::steprc eq "SQL
1680: 49 54 45 5f 45 52 52 4f 52 22 20 7c 7c 0a 20 20  ITE_ERROR" ||.  
1690: 20 20 20 20 24 3a 3a 73 74 65 70 72 63 20 65 71      $::steprc eq
16a0: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 20   "SQLITE_ABORT" 
16b0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20  .    }.  } {1}. 
16c0: 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64 5f   do_test shared_
16d0: 69 6f 65 72 72 2d 33 2e 24 6e 2e 63 6c 65 61 6e  ioerr-3.$n.clean
16e0: 75 70 2e 32 20 7b 0a 20 20 20 20 65 78 70 72 20  up.2 {.    expr 
16f0: 7b 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65 70  {.      ($::step
1700: 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 52 4f  rc eq "SQLITE_RO
1710: 57 22 20 26 26 20 24 3a 3a 63 6f 6c 75 6d 6e 20  W" && $::column 
1720: 65 71 20 22 30 30 32 2e 30 30 32 2e 30 30 32 2e  eq "002.002.002.
1730: 30 30 32 2e 30 30 32 22 29 20 7c 7c 0a 20 20 20  002.002") ||.   
1740: 20 20 20 28 24 3a 3a 73 74 65 70 72 63 20 65 71     ($::steprc eq
1750: 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 20   "SQLITE_ERROR" 
1760: 26 26 20 24 3a 3a 63 6f 6c 75 6d 6e 20 65 71 20  && $::column eq 
1770: 22 22 29 20 7c 7c 0a 20 20 20 20 20 20 28 24 3a  "") ||.      ($:
1780: 3a 73 74 65 70 72 63 20 65 71 20 22 53 51 4c 49  :steprc eq "SQLI
1790: 54 45 5f 41 42 4f 52 54 22 20 26 26 20 24 3a 3a  TE_ABORT" && $::
17a0: 63 6f 6c 75 6d 6e 20 65 71 20 22 30 30 31 2e 30  column eq "001.0
17b0: 30 31 2e 30 30 31 2e 30 30 31 2e 30 30 31 22 29  01.001.001.001")
17c0: 20 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a   .    }.  } {1}.
17d0: 20 20 64 6f 5f 74 65 73 74 20 73 68 61 72 65 64    do_test shared
17e0: 5f 69 6f 65 72 72 2d 33 2e 24 6e 2e 63 6c 65 61  _ioerr-3.$n.clea
17f0: 6e 75 70 2e 33 20 7b 0a 20 20 20 20 65 78 70 72  nup.3 {.    expr
1800: 20 7b 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65   {.      ($::ste
1810: 70 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 52  prc eq "SQLITE_R
1820: 4f 57 22 20 26 26 20 24 3a 3a 66 69 6e 61 6c 72  OW" && $::finalr
1830: 63 20 65 71 20 22 53 51 4c 49 54 45 5f 4f 4b 22  c eq "SQLITE_OK"
1840: 29 20 7c 7c 0a 20 20 20 20 20 20 28 24 3a 3a 73  ) ||.      ($::s
1850: 74 65 70 72 63 20 65 71 20 22 53 51 4c 49 54 45  teprc eq "SQLITE
1860: 5f 45 52 52 4f 52 22 20 26 26 20 24 3a 3a 66 69  _ERROR" && $::fi
1870: 6e 61 6c 72 63 20 65 71 20 22 53 51 4c 49 54 45  nalrc eq "SQLITE
1880: 5f 49 4f 45 52 52 22 29 20 7c 7c 0a 20 20 20 20  _IOERR") ||.    
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 41 42 4f 52 54 22 20 26  "SQLITE_ABORT" &
18b0: 26 20 24 3a 3a 66 69 6e 61 6c 72 63 20 65 71 20  & $::finalrc eq 
18c0: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 0a 20 20 20  "SQLITE_OK").   
18d0: 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 23 20 64 62   }.  } {1}..# db
18e0: 32 20 65 76 61 6c 20 7b 73 65 6c 65 63 74 20 2a  2 eval {select *
18f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
1900: 74 65 72 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  ter}.  db2 close
1910: 0a 7d 0a 0a 23 20 54 68 69 73 20 69 73 20 61 20  .}..# This is a 
1920: 72 65 70 65 61 74 20 6f 66 20 74 68 65 20 70 72  repeat of the pr
1930: 65 76 69 6f 75 73 20 74 65 73 74 20 65 78 63 65  evious test exce
1940: 70 74 20 74 68 61 74 20 74 68 69 73 20 74 69 6d  pt that this tim
1950: 65 20 77 65 0a 23 20 61 72 65 20 64 6f 69 6e 67  e we.# are doing
1960: 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72   a reverse-order
1970: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62   scan of the tab
1980: 6c 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 73  le when the curs
1990: 6f 72 20 69 73 0a 23 20 22 73 61 76 65 64 22 2e  or is.# "saved".
19a0: 0a 23 20 0a 64 6f 5f 69 6f 65 72 72 5f 74 65 73  .# .do_ioerr_tes
19b0: 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d 33  t shared_ioerr-3
19c0: 72 65 76 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20  rev -tclprep {. 
19d0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
19e0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
19f0: 0a 20 20 20 20 50 52 41 47 4d 41 20 72 65 61 64  .    PRAGMA read
1a00: 5f 75 6e 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31  _uncommitted = 1
1a10: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  ;.    PRAGMA cac
1a20: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
1a30: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
1a40: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
1a50: 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29  b, UNIQUE(a, b))
1a60: 3b 0a 20 20 7d 20 64 62 32 0a 20 20 66 6f 72 20  ;.  } db2.  for 
1a70: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
1a80: 32 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  200} {incr i} {.
1a90: 20 20 20 20 73 65 74 20 61 20 5b 73 74 72 69 6e      set a [strin
1aa0: 67 20 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20  g range [string 
1ab0: 72 65 70 65 61 74 20 22 5b 66 6f 72 6d 61 74 20  repeat "[format 
1ac0: 25 30 33 64 20 24 69 5d 2e 22 20 35 5d 20 30 20  %03d $i]." 5] 0 
1ad0: 65 6e 64 2d 31 5d 0a 0a 20 20 20 20 73 65 74 20  end-1]..    set 
1ae0: 62 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74  b [string repeat
1af0: 20 24 69 20 32 30 30 30 5d 0a 20 20 20 20 65 78   $i 2000].    ex
1b00: 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e  ecsql {INSERT IN
1b10: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61 2c  TO t1 VALUES($a,
1b20: 20 24 62 29 7d 20 64 62 32 0a 20 20 7d 0a 20 20   $b)} db2.  }.  
1b30: 65 78 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d  execsql {COMMIT}
1b40: 20 64 62 32 0a 20 20 73 65 74 20 3a 3a 44 42 32   db2.  set ::DB2
1b50: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   [sqlite3_connec
1b60: 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32  tion_pointer db2
1b70: 5d 0a 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b  ].  set ::STMT [
1b80: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
1b90: 24 3a 3a 44 42 32 20 5c 0a 20 20 20 20 20 20 20  $::DB2 \.       
1ba0: 20 20 20 20 22 53 45 4c 45 43 54 20 61 20 46 52      "SELECT a FR
1bb0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
1bc0: 20 44 45 53 43 22 20 2d 31 20 44 55 4d 4d 59 5d   DESC" -1 DUMMY]
1bd0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  .  sqlite3_step 
1be0: 24 3a 3a 53 54 4d 54 20 20 20 20 20 20 20 3b 23  $::STMT       ;#
1bf0: 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61   Cursor points a
1c00: 74 20 31 39 39 2e 31 39 39 2e 31 39 39 2e 31 39  t 199.199.199.19
1c10: 39 2e 31 39 39 0a 20 20 73 71 6c 69 74 65 33 5f  9.199.  sqlite3_
1c20: 73 74 65 70 20 24 3a 3a 53 54 4d 54 20 20 20 20  step $::STMT    
1c30: 20 20 20 3b 23 20 43 75 72 73 6f 72 20 70 6f 69     ;# Cursor poi
1c40: 6e 74 73 20 61 74 20 31 39 38 2e 31 39 38 2e 31  nts at 198.198.1
1c50: 39 38 2e 31 39 38 2e 31 39 38 0a 0a 7d 20 2d 74  98.198.198..} -t
1c60: 63 6c 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73  clbody {.  execs
1c70: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
1c80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1c90: 74 31 20 56 41 4c 55 45 53 28 27 32 30 31 2e 32  t1 VALUES('201.2
1ca0: 30 31 2e 32 30 31 2e 32 30 31 2e 32 30 31 27 2c  01.201.201.201',
1cb0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 55 50 44 41   NULL);.    UPDA
1cc0: 54 45 20 74 31 20 53 45 54 20 61 20 3d 20 27 32  TE t1 SET a = '2
1cd0: 30 32 2e 32 30 32 2e 32 30 32 2e 32 30 32 2e 32  02.202.202.202.2
1ce0: 30 32 27 20 57 48 45 52 45 20 61 20 4c 49 4b 45  02' WHERE a LIKE
1cf0: 20 27 32 30 31 25 27 3b 0a 20 20 20 20 43 4f 4d   '201%';.    COM
1d00: 4d 49 54 3b 0a 20 20 7d 0a 7d 20 2d 63 6c 65 61  MIT;.  }.} -clea
1d10: 6e 75 70 20 7b 0a 20 20 73 65 74 20 3a 3a 73 74  nup {.  set ::st
1d20: 65 70 72 63 20 20 5b 73 71 6c 69 74 65 33 5f 73  eprc  [sqlite3_s
1d30: 74 65 70 20 24 3a 3a 53 54 4d 54 5d 0a 20 20 73  tep $::STMT].  s
1d40: 65 74 20 3a 3a 63 6f 6c 75 6d 6e 20 20 5b 73 71  et ::column  [sq
1d50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1d60: 74 20 24 3a 3a 53 54 4d 54 20 30 5d 0a 20 20 73  t $::STMT 0].  s
1d70: 65 74 20 3a 3a 66 69 6e 61 6c 72 63 20 5b 73 71  et ::finalrc [sq
1d80: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
1d90: 3a 3a 53 54 4d 54 5d 0a 0a 20 20 23 20 54 68 65  ::STMT]..  # The
1da0: 72 65 20 61 72 65 20 74 68 72 65 65 20 70 6f 73  re are three pos
1db0: 73 69 62 6c 65 20 6f 75 74 63 6f 6d 65 73 20 68  sible outcomes h
1dc0: 65 72 65 20 28 61 73 73 75 6d 69 6e 67 20 70 65  ere (assuming pe
1dd0: 72 73 69 73 74 65 6e 74 20 49 4f 20 65 72 72 6f  rsistent IO erro
1de0: 72 73 29 3a 0a 20 20 23 0a 20 20 23 20 31 2e 20  rs):.  #.  # 1. 
1df0: 49 66 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5f  If the [sqlite3_
1e00: 73 74 65 70 5d 20 64 69 64 20 6e 6f 74 20 72 65  step] did not re
1e10: 71 75 69 72 65 20 61 6e 79 20 49 4f 20 28 72 65  quire any IO (re
1e20: 71 75 69 72 65 64 20 70 61 67 65 73 20 69 6e 0a  quired pages in.
1e30: 20 20 23 20 20 20 20 74 68 65 20 63 61 63 68 65    #    the cache
1e40: 29 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  ), then the next
1e50: 20 72 6f 77 20 28 22 30 30 32 2e 2e 2e 22 29 20   row ("002...") 
1e60: 6d 61 79 20 62 65 20 72 65 74 72 69 65 76 65 64  may be retrieved
1e70: 20 0a 20 20 23 20 20 20 20 73 75 63 63 65 73 73   .  #    success
1e80: 66 75 6c 6c 79 2e 0a 20 20 23 0a 20 20 23 20 32  fully..  #.  # 2
1e90: 2e 20 49 66 20 74 68 65 20 5b 73 71 6c 69 74 65  . If the [sqlite
1ea0: 33 5f 73 74 65 70 5d 20 64 6f 65 73 20 72 65 71  3_step] does req
1eb0: 75 69 72 65 20 49 4f 2c 20 74 68 65 6e 20 5b 73  uire IO, then [s
1ec0: 71 6c 69 74 65 33 5f 73 74 65 70 5d 20 72 65 74  qlite3_step] ret
1ed0: 75 72 6e 73 0a 20 20 23 20 20 20 20 53 51 4c 49  urns.  #    SQLI
1ee0: 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 5b 73 71  TE_ERROR and [sq
1ef0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 5d 20  lite3_finalize] 
1f00: 72 65 74 75 72 6e 73 20 49 4f 45 52 52 2e 0a 20  returns IOERR.. 
1f10: 20 23 0a 20 20 23 20 33 2e 20 49 66 2c 20 61 66   #.  # 3. If, af
1f20: 74 65 72 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ter the initial 
1f30: 49 4f 20 65 72 72 6f 72 2c 20 53 51 4c 69 74 65  IO error, SQLite
1f40: 20 74 72 69 65 64 20 74 6f 20 72 6f 6c 6c 62 61   tried to rollba
1f50: 63 6b 20 74 68 65 0a 20 20 23 20 20 20 20 61 63  ck the.  #    ac
1f60: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
1f70: 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 49 4f   and a second IO
1f80: 20 65 72 72 6f 72 20 77 61 73 20 65 6e 63 6f 75   error was encou
1f90: 6e 74 65 72 65 64 2c 20 74 68 65 6e 0a 20 20 23  ntered, then.  #
1fa0: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 24 3a      statement $:
1fb0: 3a 53 54 4d 54 20 77 69 6c 6c 20 68 61 76 65 20  :STMT will have 
1fc0: 62 65 65 6e 20 61 62 6f 72 74 65 64 2e 20 54 68  been aborted. Th
1fd0: 69 73 20 6d 65 61 6e 73 20 5b 73 71 6c 69 74 65  is means [sqlite
1fe0: 33 5f 73 74 6d 74 5d 0a 20 20 23 20 20 20 20 72  3_stmt].  #    r
1ff0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 41 42  eturns SQLITE_AB
2000: 4f 52 54 2c 20 61 6e 64 20 74 68 65 20 73 74 61  ORT, and the sta
2010: 74 65 6d 65 6e 74 20 63 75 72 73 6f 72 20 64 6f  tement cursor do
2020: 65 73 20 6e 6f 74 20 6d 6f 76 65 2e 20 69 2e 65  es not move. i.e
2030: 2e 0a 20 20 23 20 20 20 20 5b 73 71 6c 69 74 65  ..  #    [sqlite
2040: 33 5f 63 6f 6c 75 6d 6e 5d 20 73 74 69 6c 6c 20  3_column] still 
2050: 72 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72  returns the curr
2060: 65 6e 74 20 72 6f 77 20 28 22 30 30 31 2e 2e 2e  ent row ("001...
2070: 22 29 20 61 6e 64 0a 20 20 23 20 20 20 20 5b 73  ") and.  #    [s
2080: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 5d  qlite3_finalize]
2090: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
20a0: 4f 4b 2e 0a 20 20 23 0a 0a 20 20 64 6f 5f 74 65  OK..  #..  do_te
20b0: 73 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d  st shared_ioerr-
20c0: 33 72 65 76 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e  3rev.$n.cleanup.
20d0: 31 20 7b 0a 20 20 20 20 65 78 70 72 20 7b 0a 20  1 {.    expr {. 
20e0: 20 20 20 20 20 24 3a 3a 73 74 65 70 72 63 20 65       $::steprc e
20f0: 71 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20 7c  q "SQLITE_ROW" |
2100: 7c 20 0a 20 20 20 20 20 20 24 3a 3a 73 74 65 70  | .      $::step
2110: 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 45 52  rc eq "SQLITE_ER
2120: 52 4f 52 22 20 7c 7c 0a 20 20 20 20 20 20 24 3a  ROR" ||.      $:
2130: 3a 73 74 65 70 72 63 20 65 71 20 22 53 51 4c 49  :steprc eq "SQLI
2140: 54 45 5f 41 42 4f 52 54 22 20 0a 20 20 20 20 7d  TE_ABORT" .    }
2150: 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74 65  .  } {1}.  do_te
2160: 73 74 20 73 68 61 72 65 64 5f 69 6f 65 72 72 2d  st shared_ioerr-
2170: 33 72 65 76 2e 24 6e 2e 63 6c 65 61 6e 75 70 2e  3rev.$n.cleanup.
2180: 32 20 7b 0a 20 20 20 20 65 78 70 72 20 7b 0a 20  2 {.    expr {. 
2190: 20 20 20 20 20 28 24 3a 3a 73 74 65 70 72 63 20       ($::steprc 
21a0: 65 71 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 20  eq "SQLITE_ROW" 
21b0: 26 26 20 24 3a 3a 63 6f 6c 75 6d 6e 20 65 71 20  && $::column eq 
21c0: 22 31 39 37 2e 31 39 37 2e 31 39 37 2e 31 39 37  "197.197.197.197
21d0: 2e 31 39 37 22 29 20 7c 7c 0a 20 20 20 20 20 20  .197") ||.      
21e0: 28 24 3a 3a 73 74 65 70 72 63 20 65 71 20 22 53  ($::steprc eq "S
21f0: 51 4c 49 54 45 5f 45 52 52 4f 52 22 20 26 26 20  QLITE_ERROR" && 
2200: 24 3a 3a 63 6f 6c 75 6d 6e 20 65 71 20 22 22 29  $::column eq "")
2210: 20 7c 7c 0a 20 20 20 20 20 20 28 24 3a 3a 73 74   ||.      ($::st
2220: 65 70 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f  eprc eq "SQLITE_
2230: 41 42 4f 52 54 22 20 26 26 20 24 3a 3a 63 6f 6c  ABORT" && $::col
2240: 75 6d 6e 20 65 71 20 22 31 39 38 2e 31 39 38 2e  umn eq "198.198.
2250: 31 39 38 2e 31 39 38 2e 31 39 38 22 29 20 0a 20  198.198.198") . 
2260: 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64     }.  } {1}.  d
2270: 6f 5f 74 65 73 74 20 73 68 61 72 65 64 5f 69 6f  o_test shared_io
2280: 65 72 72 2d 33 72 65 76 2e 24 6e 2e 63 6c 65 61  err-3rev.$n.clea
2290: 6e 75 70 2e 33 20 7b 0a 20 20 20 20 65 78 70 72  nup.3 {.    expr
22a0: 20 7b 0a 20 20 20 20 20 20 28 24 3a 3a 73 74 65   {.      ($::ste
22b0: 70 72 63 20 65 71 20 22 53 51 4c 49 54 45 5f 52  prc eq "SQLITE_R
22c0: 4f 57 22 20 26 26 20 24 3a 3a 66 69 6e 61 6c 72  OW" && $::finalr
22d0: 63 20 65 71 20 22 53 51 4c 49 54 45 5f 4f 4b 22  c eq "SQLITE_OK"
22e0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 24 3a 3a 73  ) ||.      ($::s
22f0: 74 65 70 72 63 20 65 71 20 22 53 51 4c 49 54 45  teprc eq "SQLITE
2300: 5f 45 52 52 4f 52 22 20 26 26 20 24 3a 3a 66 69  _ERROR" && $::fi
2310: 6e 61 6c 72 63 20 65 71 20 22 53 51 4c 49 54 45  nalrc eq "SQLITE
2320: 5f 49 4f 45 52 52 22 29 20 7c 7c 0a 20 20 20 20  _IOERR") ||.    
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 41 42 4f 52 54 22 20 26  "SQLITE_ABORT" &
2350: 26 20 24 3a 3a 66 69 6e 61 6c 72 63 20 65 71 20  & $::finalrc eq 
2360: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 0a 20 20 20  "SQLITE_OK").   
2370: 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 23 20 64 62   }.  } {1}..# db
2380: 32 20 65 76 61 6c 20 7b 73 65 6c 65 63 74 20 2a  2 eval {select *
2390: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
23a0: 74 65 72 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65  ter}.  db2 close
23b0: 0a 7d 0a 0a 23 20 4f 6e 6c 79 20 72 75 6e 20 74  .}..# Only run t
23c0: 68 65 73 65 20 74 65 73 74 73 20 69 66 20 6d 65  hese tests if me
23d0: 6d 6f 72 79 20 64 65 62 75 67 67 69 6e 67 20 69  mory debugging i
23e0: 73 20 74 75 72 6e 65 64 20 6f 6e 2e 0a 23 0a 69  s turned on..#.i
23f0: 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  f {[info command
2400: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73   sqlite_malloc_s
2410: 74 61 74 5d 3d 3d 22 22 7d 20 7b 0a 20 20 20 70  tat]==""} {.   p
2420: 75 74 73 20 22 53 6b 69 70 70 69 6e 67 20 6d 61  uts "Skipping ma
2430: 6c 6c 6f 63 20 74 65 73 74 73 3a 20 6e 6f 74 20  lloc tests: not 
2440: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44  compiled with -D
2450: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 2e  SQLITE_MEMDEBUG.
2460: 2e 2e 22 0a 20 20 20 64 62 20 63 6c 6f 73 65 0a  ..".   db close.
2470: 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
2480: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 24  e_shared_cache $
2490: 3a 3a 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  ::enable_shared_
24a0: 63 61 63 68 65 0a 20 20 20 66 69 6e 69 73 68 5f  cache.   finish_
24b0: 74 65 73 74 0a 20 20 20 72 65 74 75 72 6e 0a 7d  test.   return.}
24c0: 0a 0a 23 20 50 72 6f 76 6f 6b 65 20 61 20 6d 61  ..# Provoke a ma
24d0: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 77  lloc() failure w
24e0: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 70 6f 73  hen a cursor pos
24f0: 69 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 73  ition is being s
2500: 61 76 65 64 2e 20 54 68 69 73 0a 23 20 6f 6e 6c  aved. This.# onl
2510: 79 20 68 61 70 70 65 6e 73 20 77 69 74 68 20 69  y happens with i
2520: 6e 64 65 78 20 63 75 72 73 6f 72 73 20 28 62 65  ndex cursors (be
2530: 63 61 75 73 65 20 74 68 65 79 20 6d 61 6c 6c 6f  cause they mallo
2540: 63 28 29 20 73 70 61 63 65 20 74 6f 20 73 61 76  c() space to sav
2550: 65 20 74 68 65 0a 23 20 63 75 72 72 65 6e 74 20  e the.# current 
2560: 6b 65 79 20 76 61 6c 75 65 29 2e 20 49 74 20 64  key value). It d
2570: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 20 77  oes not happen w
2580: 69 74 68 20 74 61 62 6c 65 73 2c 20 62 65 63 61  ith tables, beca
2590: 75 73 65 20 61 6e 20 69 6e 74 65 67 65 72 0a 23  use an integer.#
25a0: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 72 65   key does not re
25b0: 71 75 69 72 65 20 61 20 6d 61 6c 6c 6f 63 28 29  quire a malloc()
25c0: 20 74 6f 20 73 74 6f 72 65 2e 20 0a 23 0a 23 20   to store. .#.# 
25d0: 54 68 65 20 6c 69 62 72 61 72 79 20 73 68 6f 75  The library shou
25e0: 6c 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ld return an SQL
25f0: 49 54 45 5f 4e 4f 4d 45 4d 20 74 6f 20 74 68 65  ITE_NOMEM to the
2600: 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 71 75 65   caller. The que
2610: 72 79 20 74 68 61 74 0a 23 20 6f 77 6e 73 20 74  ry that.# owns t
2620: 68 65 20 63 75 72 73 6f 72 20 28 74 68 65 20 6f  he cursor (the o
2630: 6e 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ne for which the
2640: 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 6e 6f 74   position is not
2650: 20 73 61 76 65 64 29 20 73 68 6f 75 6c 64 0a 23   saved) should.#
2660: 20 63 6f 6e 74 69 6e 75 65 20 75 6e 61 66 66 65   continue unaffe
2670: 63 74 65 64 2e 0a 23 20 0a 64 6f 5f 6d 61 6c 6c  cted..# .do_mall
2680: 6f 63 5f 74 65 73 74 20 34 20 2d 74 63 6c 70 72  oc_test 4 -tclpr
2690: 65 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  ep {.  sqlite3 d
26a0: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
26b0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
26c0: 41 20 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74  A read_uncommitt
26d0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 42 45 47 49  ed = 1;.    BEGI
26e0: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
26f0: 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 55 4e 49  BLE t1(a, b, UNI
2700: 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 7d 20  QUE(a, b));.  } 
2710: 64 62 32 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  db2.  for {set i
2720: 20 30 7d 20 7b 24 69 20 3c 20 35 7d 20 7b 69 6e   0} {$i < 5} {in
2730: 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20  cr i} {.    set 
2740: 61 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74  a [string repeat
2750: 20 24 69 20 31 30 5d 0a 20 20 20 20 73 65 74 20   $i 10].    set 
2760: 62 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74  b [string repeat
2770: 20 24 69 20 32 30 30 30 5d 0a 20 20 20 20 65 78   $i 2000].    ex
2780: 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e  ecsql {INSERT IN
2790: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61 2c  TO t1 VALUES($a,
27a0: 20 24 62 29 7d 20 64 62 32 0a 20 20 7d 0a 20 20   $b)} db2.  }.  
27b0: 65 78 65 63 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d  execsql {COMMIT}
27c0: 20 64 62 32 0a 20 20 73 65 74 20 3a 3a 44 42 32   db2.  set ::DB2
27d0: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   [sqlite3_connec
27e0: 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32  tion_pointer db2
27f0: 5d 0a 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b  ].  set ::STMT [
2800: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
2810: 24 3a 3a 44 42 32 20 22 53 45 4c 45 43 54 20 61  $::DB2 "SELECT a
2820: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
2830: 59 20 61 22 20 2d 31 20 44 55 4d 4d 59 5d 0a 20  Y a" -1 DUMMY]. 
2840: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a   sqlite3_step $:
2850: 3a 53 54 4d 54 20 20 20 20 20 20 20 3b 23 20 43  :STMT       ;# C
2860: 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20  ursor points at 
2870: 30 30 30 30 30 30 30 30 30 30 0a 20 20 73 71 6c  0000000000.  sql
2880: 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d  ite3_step $::STM
2890: 54 20 20 20 20 20 20 20 3b 23 20 43 75 72 73 6f  T       ;# Curso
28a0: 72 20 70 6f 69 6e 74 73 20 61 74 20 31 31 31 31  r points at 1111
28b0: 31 31 31 31 31 31 0a 7d 20 2d 74 63 6c 62 6f 64  111111.} -tclbod
28c0: 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  y {.  execsql {.
28d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
28e0: 74 31 20 56 41 4c 55 45 53 28 36 2c 20 4e 55 4c  t1 VALUES(6, NUL
28f0: 4c 29 3b 0a 20 20 7d 0a 7d 20 2d 63 6c 65 61 6e  L);.  }.} -clean
2900: 75 70 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 73  up {.  do_test s
2910: 68 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 34 2e 24  hared_malloc-4.$
2920: 3a 3a 6e 2e 63 6c 65 61 6e 75 70 2e 31 20 7b 0a  ::n.cleanup.1 {.
2930: 20 20 20 20 73 65 74 20 3a 3a 72 63 20 5b 73 71      set ::rc [sq
2940: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
2950: 4d 54 5d 0a 20 20 20 20 65 78 70 72 20 7b 24 3a  MT].    expr {$:
2960: 3a 72 63 3d 3d 22 53 51 4c 49 54 45 5f 52 4f 57  :rc=="SQLITE_ROW
2970: 22 20 7c 7c 20 24 3a 3a 72 63 3d 3d 22 53 51 4c  " || $::rc=="SQL
2980: 49 54 45 5f 41 42 4f 52 54 22 7d 0a 20 20 7d 20  ITE_ABORT"}.  } 
2990: 7b 31 7d 0a 20 20 69 66 20 7b 24 3a 3a 72 63 3d  {1}.  if {$::rc=
29a0: 3d 22 53 51 4c 49 54 45 5f 52 4f 57 22 7d 20 7b  ="SQLITE_ROW"} {
29b0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 73 68 61  .    do_test sha
29c0: 72 65 64 5f 6d 61 6c 6c 6f 63 2d 34 2e 24 3a 3a  red_malloc-4.$::
29d0: 6e 2e 63 6c 65 61 6e 75 70 2e 32 20 7b 0a 20 20  n.cleanup.2 {.  
29e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
29f0: 6d 6e 5f 74 65 78 74 20 24 3a 3a 53 54 4d 54 20  mn_text $::STMT 
2a00: 30 0a 20 20 20 20 7d 20 7b 32 32 32 32 32 32 32  0.    } {2222222
2a10: 32 32 32 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65  222}.  }.  do_te
2a20: 73 74 20 73 68 61 72 65 64 5f 6d 61 6c 6c 6f 63  st shared_malloc
2a30: 2d 34 2e 24 3a 3a 6e 2e 63 6c 65 61 6e 75 70 2e  -4.$::n.cleanup.
2a40: 33 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  3 {.    sqlite3_
2a50: 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54  finalize $::STMT
2a60: 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  .  } {SQLITE_OK}
2a70: 0a 23 20 64 62 32 20 65 76 61 6c 20 7b 73 65 6c  .# db2 eval {sel
2a80: 65 63 74 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ect * from sqlit
2a90: 65 5f 6d 61 73 74 65 72 7d 0a 20 20 64 62 32 20  e_master}.  db2 
2aa0: 63 6c 6f 73 65 0a 7d 0a 0a 64 6f 5f 6d 61 6c 6c  close.}..do_mall
2ab0: 6f 63 5f 74 65 73 74 20 35 20 2d 74 63 6c 62 6f  oc_test 5 -tclbo
2ac0: 64 79 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  dy {.  sqlite3 d
2ad0: 62 58 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  bX test.db.  sql
2ae0: 69 74 65 33 20 64 62 59 20 74 65 73 74 2e 64 62  ite3 dbY test.db
2af0: 0a 20 20 64 62 58 20 63 6c 6f 73 65 0a 20 20 64  .  dbX close.  d
2b00: 62 59 20 63 6c 6f 73 65 0a 7d 20 2d 63 6c 65 61  bY close.} -clea
2b10: 6e 75 70 20 7b 0a 20 20 63 61 74 63 68 20 7b 64  nup {.  catch {d
2b20: 62 58 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63  bX close}.  catc
2b30: 68 20 7b 64 62 59 20 63 6c 6f 73 65 7d 0a 7d 0a  h {dbY close}.}.
2b40: 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74 20  .do_malloc_test 
2b50: 36 20 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20 63  6 -tclbody {.  c
2b60: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
2b70: 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64    sqlite3_thread
2b80: 5f 63 6c 65 61 6e 75 70 0a 20 20 73 71 6c 69 74  _cleanup.  sqlit
2b90: 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
2ba0: 5f 63 61 63 68 65 20 30 0a 7d 20 2d 63 6c 65 61  _cache 0.} -clea
2bb0: 6e 75 70 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  nup {.  sqlite3_
2bc0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
2bd0: 63 68 65 20 31 0a 7d 0a 0a 64 6f 5f 74 65 73 74  che 1.}..do_test
2be0: 20 73 68 61 72 65 64 5f 6d 69 73 75 73 65 2d 37   shared_misuse-7
2bf0: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64  .1 {.  sqlite3 d
2c00: 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74 63  b test.db.  catc
2c10: 68 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h {.    sqlite3_
2c20: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
2c30: 63 68 65 20 30 0a 20 20 7d 20 6d 73 67 0a 20 20  che 0.  } msg.  
2c40: 73 65 74 20 6d 73 67 0a 7d 20 7b 6c 69 62 72 61  set msg.} {libra
2c50: 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65  ry routine calle
2c60: 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63  d out of sequenc
2c70: 65 7d 0a 0a 23 20 41 67 61 69 6e 20 70 72 6f 76  e}..# Again prov
2c80: 6f 6b 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  oke a malloc() f
2c90: 61 69 6c 75 72 65 20 77 68 65 6e 20 61 20 63 75  ailure when a cu
2ca0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 73  rsor position is
2cb0: 20 62 65 69 6e 67 20 73 61 76 65 64 2c 20 0a 23   being saved, .#
2cc0: 20 74 68 69 73 20 74 69 6d 65 20 64 75 72 69 6e   this time durin
2cd0: 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  g a ROLLBACK ope
2ce0: 72 61 74 69 6f 6e 20 62 79 20 73 6f 6d 65 20 6f  ration by some o
2cf0: 74 68 65 72 20 68 61 6e 64 6c 65 2e 20 0a 23 0a  ther handle. .#.
2d00: 23 20 54 68 65 20 6c 69 62 72 61 72 79 20 73 68  # The library sh
2d10: 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 6e 20 53  ould return an S
2d20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 74 6f 20 74  QLITE_NOMEM to t
2d30: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 71  he caller. The q
2d40: 75 65 72 79 20 74 68 61 74 0a 23 20 6f 77 6e 73  uery that.# owns
2d50: 20 74 68 65 20 63 75 72 73 6f 72 20 28 74 68 65   the cursor (the
2d60: 20 6f 6e 65 20 66 6f 72 20 77 68 69 63 68 20 74   one for which t
2d70: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 6e  he position is n
2d80: 6f 74 20 73 61 76 65 64 29 20 73 68 6f 75 6c 64  ot saved) should
2d90: 0a 23 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 23  .# be aborted..#
2da0: 20 0a 73 65 74 20 3a 3a 61 62 6f 72 74 65 64 20   .set ::aborted 
2db0: 30 0a 64 6f 5f 6d 61 6c 6c 6f 63 5f 74 65 73 74  0.do_malloc_test
2dc0: 20 38 20 2d 74 63 6c 70 72 65 70 20 7b 0a 20 20   8 -tclprep {.  
2dd0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
2de0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
2df0: 20 20 20 20 50 52 41 47 4d 41 20 72 65 61 64 5f      PRAGMA read_
2e00: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 3d 20 31 3b  uncommitted = 1;
2e10: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
2e20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2e30: 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20  a, b, UNIQUE(a, 
2e40: 62 29 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20 66  b));.  } db2.  f
2e50: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
2e60: 20 3c 20 32 7d 20 7b 69 6e 63 72 20 69 7d 20 7b   < 2} {incr i} {
2e70: 0a 20 20 20 20 73 65 74 20 61 20 5b 73 74 72 69  .    set a [stri
2e80: 6e 67 20 72 65 70 65 61 74 20 24 69 20 31 30 5d  ng repeat $i 10]
2e90: 0a 20 20 20 20 73 65 74 20 62 20 5b 73 74 72 69  .    set b [stri
2ea0: 6e 67 20 72 65 70 65 61 74 20 24 69 20 32 30 30  ng repeat $i 200
2eb0: 30 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  0].    execsql {
2ec0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2ed0: 41 4c 55 45 53 28 24 61 2c 20 24 62 29 7d 20 64  ALUES($a, $b)} d
2ee0: 62 32 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  b2.  }.  execsql
2ef0: 20 7b 43 4f 4d 4d 49 54 7d 20 64 62 32 0a 20 20   {COMMIT} db2.  
2f00: 73 65 74 20 3a 3a 44 42 32 20 5b 73 71 6c 69 74  set ::DB2 [sqlit
2f10: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
2f20: 69 6e 74 65 72 20 64 62 32 5d 0a 20 20 73 65 74  inter db2].  set
2f30: 20 3a 3a 53 54 4d 54 20 5b 73 71 6c 69 74 65 33   ::STMT [sqlite3
2f40: 5f 70 72 65 70 61 72 65 20 24 3a 3a 44 42 32 20  _prepare $::DB2 
2f50: 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74  "SELECT a FROM t
2f60: 31 20 4f 52 44 45 52 20 42 59 20 61 22 20 2d 31  1 ORDER BY a" -1
2f70: 20 44 55 4d 4d 59 5d 0a 20 20 73 71 6c 69 74 65   DUMMY].  sqlite
2f80: 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 20 20  3_step $::STMT  
2f90: 20 20 20 20 20 3b 23 20 43 75 72 73 6f 72 20 70       ;# Cursor p
2fa0: 6f 69 6e 74 73 20 61 74 20 30 30 30 30 30 30 30  oints at 0000000
2fb0: 30 30 30 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  000.  sqlite3_st
2fc0: 65 70 20 24 3a 3a 53 54 4d 54 20 20 20 20 20 20  ep $::STMT      
2fd0: 20 3b 23 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   ;# Cursor point
2fe0: 73 20 61 74 20 31 31 31 31 31 31 31 31 31 31 0a  s at 1111111111.
2ff0: 7d 20 2d 74 63 6c 62 6f 64 79 20 7b 0a 20 20 65  } -tclbody {.  e
3000: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
3010: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
3020: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c  NTO t1 VALUES(6,
3030: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 52 4f 4c 4c   NULL);.    ROLL
3040: 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 2d 63 6c 65  BACK;.  }.} -cle
3050: 61 6e 75 70 20 7b 0a 20 20 64 6f 5f 74 65 73 74  anup {.  do_test
3060: 20 73 68 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 38   shared_malloc-8
3070: 2e 24 3a 3a 6e 2e 63 6c 65 61 6e 75 70 2e 31 20  .$::n.cleanup.1 
3080: 7b 0a 20 20 20 20 6c 72 61 6e 67 65 20 5b 65 78  {.    lrange [ex
3090: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
30a0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 3b 0a  LECT a FROM t1;.
30b0: 20 20 20 20 7d 20 64 62 32 5d 20 30 20 31 0a 20      } db2] 0 1. 
30c0: 20 7d 20 7b 30 30 30 30 30 30 30 30 30 30 20 31   } {0000000000 1
30d0: 31 31 31 31 31 31 31 31 31 7d 0a 20 20 64 6f 5f  111111111}.  do_
30e0: 74 65 73 74 20 73 68 61 72 65 64 5f 6d 61 6c 6c  test shared_mall
30f0: 6f 63 2d 38 2e 24 3a 3a 6e 2e 63 6c 65 61 6e 75  oc-8.$::n.cleanu
3100: 70 2e 32 20 7b 0a 20 20 20 20 73 65 74 20 72 63  p.2 {.    set rc
3110: 31 20 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 20  1 [sqlite3_step 
3120: 24 3a 3a 53 54 4d 54 5d 0a 20 20 20 20 73 65 74  $::STMT].    set
3130: 20 72 63 32 20 5b 73 71 6c 69 74 65 33 5f 66 69   rc2 [sqlite3_fi
3140: 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54 5d 0a  nalize $::STMT].
3150: 20 20 20 20 69 66 20 7b 24 72 63 31 3d 3d 22 53      if {$rc1=="S
3160: 51 4c 49 54 45 5f 41 42 4f 52 54 22 7d 20 7b 0a  QLITE_ABORT"} {.
3170: 20 20 20 20 20 20 69 6e 63 72 20 3a 3a 61 62 6f        incr ::abo
3180: 72 74 65 64 0a 20 20 20 20 7d 0a 20 20 20 20 65  rted.    }.    e
3190: 78 70 72 20 7b 0a 20 20 20 20 20 20 28 24 72 63  xpr {.      ($rc
31a0: 31 3d 3d 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22  1=="SQLITE_DONE"
31b0: 20 26 26 20 24 72 63 32 3d 3d 22 53 51 4c 49 54   && $rc2=="SQLIT
31c0: 45 5f 4f 4b 22 29 20 7c 7c 20 0a 20 20 20 20 20  E_OK") || .     
31d0: 20 28 24 72 63 31 3d 3d 22 53 51 4c 49 54 45 5f   ($rc1=="SQLITE_
31e0: 41 42 4f 52 54 22 20 26 26 20 24 72 63 32 3d 3d  ABORT" && $rc2==
31f0: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 0a 20 20 20  "SQLITE_OK").   
3200: 20 7d 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 62 32   }.  } {1}.  db2
3210: 20 63 6c 6f 73 65 0a 7d 0a 64 6f 5f 74 65 73 74   close.}.do_test
3220: 20 73 68 61 72 65 64 5f 6d 61 6c 6c 6f 63 2d 38   shared_malloc-8
3230: 2e 58 20 7b 0a 20 20 23 20 54 65 73 74 20 74 68  .X {.  # Test th
3240: 61 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 71  at one or more q
3250: 75 65 72 69 65 73 20 77 65 72 65 20 61 62 6f 72  ueries were abor
3260: 74 65 64 20 64 75 65 20 74 6f 20 74 68 65 20 6d  ted due to the m
3270: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
3280: 0a 20 20 65 78 70 72 20 24 3a 3a 61 62 6f 72 74  .  expr $::abort
3290: 65 64 3e 3d 31 0a 7d 20 7b 31 7d 0a 0a 63 61 74  ed>=1.} {1}..cat
32a0: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 73 71  ch {db close}.sq
32b0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
32c0: 72 65 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e 61  red_cache $::ena
32d0: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
32e0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.