/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact fe59ee3e3d45a121bcdb8f462b718076e66b4ca7:


0000: 23 20 32 30 30 38 20 4d 61 79 20 31 32 0a 23 0a  # 2008 May 12.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou give..#.#****
0120: 2a 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 0a 23 0a 23 20 54 68 69 73 20 66 69 6c  ***.#.# This fil
0170: 65 20 74 65 73 74 73 20 74 68 61 74 20 69 66 20  e tests that if 
0180: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
0190: 6d 65 6d 6f 72 79 28 29 20 69 73 20 63 61 6c 6c  memory() is call
01a0: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 0a 23 20  ed to reclaim.# 
01b0: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 61 20 70 61  memory from a pa
01c0: 67 65 72 20 74 68 61 74 20 69 73 20 69 6e 20 74  ger that is in t
01d0: 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20  he error-state, 
01e0: 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
01f0: 0a 23 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 77  .# incorrectly w
0200: 72 69 74 65 20 64 69 72 74 79 20 70 61 67 65 73  rite dirty pages
0210: 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
0220: 62 61 73 65 20 28 6e 6f 74 20 73 61 66 65 20 74  base (not safe t
0230: 6f 20 64 6f 0a 23 20 6f 6e 63 65 20 74 68 65 20  o do.# once the 
0240: 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f  pager is in erro
0250: 72 20 73 74 61 74 65 29 2e 0a 23 0a 23 20 24 49  r state)..#.# $I
0260: 64 3a 20 69 6f 65 72 72 35 2e 74 65 73 74 2c 76  d: ioerr5.test,v
0270: 20 31 2e 34 20 32 30 30 38 2f 30 37 2f 31 32 20   1.4 2008/07/12 
0280: 31 34 3a 35 32 3a 32 30 20 64 72 68 20 45 78 70  14:52:20 drh Exp
0290: 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20   $..set testdir 
02a0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
02b0: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
02c0: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
02d0: 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 6d 65 6d  ..ifcapable !mem
02e0: 6f 72 79 6d 61 6e 61 67 65 7c 7c 21 73 68 61 72  orymanage||!shar
02f0: 65 64 5f 63 61 63 68 65 20 7b 0a 20 20 66 69 6e  ed_cache {.  fin
0300: 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72  ish_test.  retur
0310: 6e 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a 0a 73  n.}..db close..s
0320: 65 74 20 3a 3a 65 6e 61 62 6c 65 5f 73 68 61 72  et ::enable_shar
0330: 65 64 5f 63 61 63 68 65 20 5b 73 71 6c 69 74 65  ed_cache [sqlite
0340: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0350: 63 61 63 68 65 20 31 5d 0a 73 65 74 20 3a 3a 73  cache 1].set ::s
0360: 6f 66 74 5f 6c 69 6d 69 74 20 5b 73 71 6c 69 74  oft_limit [sqlit
0370: 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
0380: 69 74 20 31 30 34 38 35 37 36 5d 0a 0a 23 20 54  it 1048576]..# T
0390: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 70 72  his procedure pr
03a0: 65 70 61 72 65 73 2c 20 73 74 65 70 73 20 61 6e  epares, steps an
03b0: 64 20 66 69 6e 61 6c 69 7a 65 73 20 61 6e 20 53  d finalizes an S
03c0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 76 69 61  QL statement via
03d0: 20 74 68 65 0a 23 20 55 54 46 2d 31 36 20 41 50   the.# UTF-16 AP
03e0: 49 73 2e 20 54 68 65 20 74 65 78 74 20 72 65 70  Is. The text rep
03f0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
0400: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
0410: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
0420: 23 20 28 22 53 51 4c 49 54 45 5f 4f 4b 22 2c 20  # ("SQLITE_OK", 
0430: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 20 65  "SQLITE_IOERR" e
0440: 74 63 2e 29 2e 20 54 68 65 20 61 63 74 75 61 6c  tc.). The actual
0450: 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
0460: 64 20 62 79 20 74 68 65 0a 23 20 53 51 4c 20 73  d by the.# SQL s
0470: 74 61 74 65 6d 65 6e 74 2c 20 69 66 20 69 74 20  tatement, if it 
0480: 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 72 65  is a SELECT, are
0490: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a   not available..
04a0: 23 0a 23 20 54 68 69 73 20 63 61 6e 20 62 65 20  #.# This can be 
04b0: 75 73 65 66 75 6c 20 66 6f 72 20 74 65 73 74 69  useful for testi
04c0: 6e 67 20 62 65 63 61 75 73 65 20 69 74 20 66 6f  ng because it fo
04d0: 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 6d  rces SQLite to m
04e0: 61 6b 65 20 61 6e 20 65 78 74 72 61 20 0a 23 20  ake an extra .# 
04f0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
0500: 6d 61 6c 6c 6f 63 28 29 20 77 68 65 6e 20 74 72  malloc() when tr
0510: 61 6e 73 6c 61 74 69 6e 67 20 66 72 6f 6d 20 74  anslating from t
0520: 68 65 20 73 75 70 70 6c 69 65 64 20 55 54 46 2d  he supplied UTF-
0530: 31 36 20 74 6f 0a 23 20 74 68 65 20 55 54 46 2d  16 to.# the UTF-
0540: 38 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  8 encoding used 
0550: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 23 0a 70 72  internally..#.pr
0560: 6f 63 20 64 6f 73 71 6c 31 36 20 7b 7a 53 71 6c  oc dosql16 {zSql
0570: 20 7b 64 62 20 64 62 7d 7d 20 7b 0a 20 20 73 65   {db db}} {.  se
0580: 74 20 73 71 6c 20 5b 65 6e 63 6f 64 69 6e 67 20  t sql [encoding 
0590: 63 6f 6e 76 65 72 74 74 6f 20 75 6e 69 63 6f 64  convertto unicod
05a0: 65 20 24 7a 53 71 6c 5d 0a 20 20 61 70 70 65 6e  e $zSql].  appen
05b0: 64 20 73 71 6c 20 22 5c 30 30 5c 30 30 22 0a 20  d sql "\00\00". 
05c0: 20 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74   set stmt [sqlit
05d0: 65 33 5f 70 72 65 70 61 72 65 31 36 20 24 64 62  e3_prepare16 $db
05e0: 20 24 73 71 6c 20 2d 31 20 7b 7d 5d 0a 20 20 73   $sql -1 {}].  s
05f0: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 73 74 6d  qlite3_step $stm
0600: 74 0a 20 20 73 65 74 20 72 63 20 5b 73 71 6c 69  t.  set rc [sqli
0610: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74  te3_finalize $st
0620: 6d 74 5d 0a 7d 0a 0a 70 72 6f 63 20 63 6f 6d 70  mt].}..proc comp
0630: 69 6c 65 73 71 6c 31 36 20 7b 7a 53 71 6c 20 7b  ilesql16 {zSql {
0640: 64 62 20 64 62 7d 7d 20 7b 0a 20 20 73 65 74 20  db db}} {.  set 
0650: 73 71 6c 20 5b 65 6e 63 6f 64 69 6e 67 20 63 6f  sql [encoding co
0660: 6e 76 65 72 74 74 6f 20 75 6e 69 63 6f 64 65 20  nvertto unicode 
0670: 24 7a 53 71 6c 5d 0a 20 20 61 70 70 65 6e 64 20  $zSql].  append 
0680: 73 71 6c 20 22 5c 30 30 5c 30 30 22 0a 20 20 73  sql "\00\00".  s
0690: 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65 33  et stmt [sqlite3
06a0: 5f 70 72 65 70 61 72 65 31 36 20 24 64 62 20 24  _prepare16 $db $
06b0: 73 71 6c 20 2d 31 20 7b 7d 5d 0a 20 20 73 65 74  sql -1 {}].  set
06c0: 20 72 63 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e   rc [sqlite3_fin
06d0: 61 6c 69 7a 65 20 24 73 74 6d 74 5d 0a 7d 0a 0a  alize $stmt].}..
06e0: 23 20 4f 70 65 6e 20 74 77 6f 20 64 61 74 61 62  # Open two datab
06f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
0700: 28 68 61 6e 64 6c 65 20 64 62 20 61 6e 64 20 64  (handle db and d
0710: 62 32 29 20 74 6f 20 64 61 74 61 62 61 73 65 20  b2) to database 
0720: 22 74 65 73 74 2e 64 62 22 2e 0a 23 0a 70 72 6f  "test.db"..#.pro
0730: 63 20 6f 70 65 6e 64 61 74 61 62 61 73 65 73 20  c opendatabases 
0740: 7b 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62  {} {.  catch {db
0750: 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20   close}.  catch 
0760: 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 20 20 73 71  {db2 close}.  sq
0770: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
0780: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
0790: 65 73 74 2e 64 62 0a 20 20 64 62 32 20 63 61 63  est.db.  db2 cac
07a0: 68 65 20 73 69 7a 65 20 30 0a 20 20 64 62 20 63  he size 0.  db c
07b0: 61 63 68 65 20 73 69 7a 65 20 30 0a 20 20 65 78  ache size 0.  ex
07c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 70 72 61 67  ecsql {.    prag
07d0: 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32  ma page_size=512
07e0: 3b 0a 20 20 20 20 70 72 61 67 6d 61 20 61 75 74  ;.    pragma aut
07f0: 6f 5f 76 61 63 75 75 6d 3d 32 3b 0a 20 20 20 20  o_vacuum=2;.    
0800: 70 72 61 67 6d 61 20 63 61 63 68 65 5f 73 69 7a  pragma cache_siz
0810: 65 3d 31 36 3b 0a 20 20 7d 0a 7d 0a 0a 23 20 4f  e=16;.  }.}..# O
0820: 70 65 6e 20 74 77 6f 20 64 61 74 61 62 61 73 65  pen two database
0830: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 6e 64   connections and
0840: 20 63 72 65 61 74 65 20 61 20 73 69 6e 67 6c 65   create a single
0850: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 62   table in the db
0860: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6f 65 72  ..#.do_test ioer
0870: 72 35 2d 31 2e 30 20 7b 0a 20 20 6f 70 65 6e 64  r5-1.0 {.  opend
0880: 61 74 61 62 61 73 65 73 0a 20 20 65 78 65 63 73  atabases.  execs
0890: 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  ql { CREATE TABL
08a0: 45 20 41 28 49 64 20 49 4e 54 45 47 45 52 2c 20  E A(Id INTEGER, 
08b0: 4e 61 6d 65 20 54 45 58 54 29 20 7d 0a 7d 20 7b  Name TEXT) }.} {
08c0: 7d 0a 0a 66 6f 72 65 61 63 68 20 6c 6f 63 6b 69  }..foreach locki
08d0: 6e 67 5f 6d 6f 64 65 20 7b 6e 6f 72 6d 61 6c 20  ng_mode {normal 
08e0: 65 78 63 6c 75 73 69 76 65 7d 20 7b 0a 20 20 66  exclusive} {.  f
08f0: 6f 72 20 7b 73 65 74 20 69 46 61 69 6c 20 31 7d  or {set iFail 1}
0900: 20 7b 24 69 46 61 69 6c 3c 32 30 30 7d 20 7b 69   {$iFail<200} {i
0910: 6e 63 72 20 69 46 61 69 6c 7d 20 7b 0a 20 20 20  ncr iFail} {.   
0920: 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
0930: 61 70 5f 6c 69 6d 69 74 20 31 30 34 38 35 37 36  ap_limit 1048576
0940: 0a 20 20 20 20 6f 70 65 6e 64 61 74 61 62 61 73  .    opendatabas
0950: 65 73 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  es.    execsql {
0960: 20 70 72 61 67 6d 61 20 6c 6f 63 6b 69 6e 67 5f   pragma locking_
0970: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 7d  mode=exclusive }
0980: 0a 20 20 20 20 73 65 74 20 6e 52 6f 77 20 5b 64  .    set nRow [d
0990: 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 63 6f  b one {SELECT co
09a0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 61 7d 5d 0a  unt(*) FROM a}].
09b0: 20 20 0a 20 20 20 20 23 20 44 69 72 74 79 20 28    .    # Dirty (
09c0: 61 74 20 6c 65 61 73 74 29 20 6f 6e 65 20 6f 66  at least) one of
09d0: 20 74 68 65 20 70 61 67 65 73 20 69 6e 20 74 68   the pages in th
09e0: 65 20 63 61 63 68 65 2e 0a 20 20 20 20 64 6f 5f  e cache..    do_
09f0: 74 65 73 74 20 69 6f 65 72 72 35 2d 31 2e 24 6c  test ioerr5-1.$l
0a00: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2d 24 69 46 61  ocking_mode-$iFa
0a10: 69 6c 2e 31 20 7b 0a 20 20 20 20 20 20 65 78 65  il.1 {.      exe
0a20: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42  csql {.        B
0a30: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 0a  EGIN EXCLUSIVE;.
0a40: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
0a50: 4e 54 4f 20 61 20 56 41 4c 55 45 53 28 31 2c 20  NTO a VALUES(1, 
0a60: 27 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  'ABCDEFGHIJKLMNO
0a70: 50 27 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  P');.      }.   
0a80: 20 7d 20 7b 7d 0a 20 20 0a 20 20 20 20 23 20 4e   } {}.  .    # N
0a90: 6f 77 20 74 72 79 20 74 6f 20 63 6f 6d 6d 69 74  ow try to commit
0aa0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0ab0: 2e 20 43 61 75 73 65 20 61 6e 20 49 4f 20 65 72  . Cause an IO er
0ac0: 72 6f 72 20 74 6f 20 6f 63 63 75 72 0a 20 20 20  ror to occur.   
0ad0: 20 23 20 77 69 74 68 69 6e 20 74 68 69 73 20 6f   # within this o
0ae0: 70 65 72 61 74 69 6f 6e 2c 20 77 68 69 63 68 20  peration, which 
0af0: 6d 6f 76 65 73 20 74 68 65 20 70 61 67 65 72 20  moves the pager 
0b00: 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  into the error s
0b10: 74 61 74 65 2e 0a 20 20 20 20 23 0a 20 20 20 20  tate..    #.    
0b20: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f  set ::sqlite_io_
0b30: 65 72 72 6f 72 5f 70 65 72 73 69 73 74 20 31 0a  error_persist 1.
0b40: 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65      set ::sqlite
0b50: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
0b60: 67 20 24 69 46 61 69 6c 0a 20 20 20 20 64 6f 5f  g $iFail.    do_
0b70: 74 65 73 74 20 69 6f 65 72 72 35 2d 31 2e 24 6c  test ioerr5-1.$l
0b80: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2d 24 69 46 61  ocking_mode-$iFa
0b90: 69 6c 2e 32 20 7b 0a 20 20 20 20 20 20 73 65 74  il.2 {.      set
0ba0: 20 72 63 20 5b 63 61 74 63 68 73 71 6c 20 7b 43   rc [catchsql {C
0bb0: 4f 4d 4d 49 54 7d 5d 0a 20 20 20 20 20 20 6c 69  OMMIT}].      li
0bc0: 73 74 0a 20 20 20 20 7d 20 7b 7d 0a 20 20 20 20  st.    } {}.    
0bd0: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f  set ::sqlite_io_
0be0: 65 72 72 6f 72 5f 68 69 74 20 30 0a 20 20 20 20  error_hit 0.    
0bf0: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f  set ::sqlite_io_
0c00: 65 72 72 6f 72 5f 70 65 72 73 69 73 74 20 30 0a  error_persist 0.
0c10: 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65      set ::sqlite
0c20: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
0c30: 67 20 30 0a 20 20 0a 20 20 20 20 23 20 52 65 61  g 0.  .    # Rea
0c40: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
0c50: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0c60: 69 6c 65 20 69 6e 74 6f 20 61 20 54 63 6c 20 76  ile into a Tcl v
0c70: 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 23 0a 20  ariable..    #. 
0c80: 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20     set fd [open 
0c90: 74 65 73 74 2e 64 62 5d 0a 20 20 20 20 66 63 6f  test.db].    fco
0ca0: 6e 66 69 67 75 72 65 20 24 66 64 20 2d 74 72 61  nfigure $fd -tra
0cb0: 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 20  nslation binary 
0cc0: 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79  -encoding binary
0cd0: 0a 20 20 20 20 73 65 74 20 7a 44 61 74 61 62 61  .    set zDataba
0ce0: 73 65 20 5b 72 65 61 64 20 24 66 64 5d 0a 20 20  se [read $fd].  
0cf0: 20 20 63 6c 6f 73 65 20 24 66 64 0a 0a 20 20 20    close $fd..   
0d00: 20 23 20 53 65 74 20 61 20 76 65 72 79 20 6c 6f   # Set a very lo
0d10: 77 20 73 6f 66 74 2d 6c 69 6d 69 74 20 61 6e 64  w soft-limit and
0d20: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 63 6f 6d   then try to com
0d30: 70 69 6c 65 20 61 6e 20 53 51 4c 20 73 74 61 74  pile an SQL stat
0d40: 65 6d 65 6e 74 20 0a 20 20 20 20 23 20 66 72 6f  ement .    # fro
0d50: 6d 20 55 54 46 2d 31 36 20 74 65 78 74 2e 20 54  m UTF-16 text. T
0d60: 6f 20 64 6f 20 74 68 69 73 2c 20 53 51 4c 69 74  o do this, SQLit
0d70: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72  e will need to r
0d80: 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 20 20  eclaim memory.  
0d90: 20 20 23 20 66 72 6f 6d 20 74 68 65 20 70 61 67    # from the pag
0da0: 65 72 20 74 68 61 74 20 69 73 20 69 6e 20 65 72  er that is in er
0db0: 72 6f 72 20 73 74 61 74 65 2e 20 49 6e 63 6c 75  ror state. Inclu
0dc0: 64 69 6e 67 20 74 68 61 74 20 61 73 73 6f 63 69  ding that associ
0dd0: 61 74 65 64 0a 20 20 20 20 23 20 77 69 74 68 20  ated.    # with 
0de0: 74 68 65 20 64 69 72 74 79 20 70 61 67 65 2e 0a  the dirty page..
0df0: 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73      #.    do_tes
0e00: 74 20 69 6f 65 72 72 35 2d 31 2e 24 6c 6f 63 6b  t ioerr5-1.$lock
0e10: 69 6e 67 5f 6d 6f 64 65 2d 24 69 46 61 69 6c 2e  ing_mode-$iFail.
0e20: 33 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3 {.      sqlite
0e30: 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
0e40: 74 20 31 30 32 34 0a 20 20 20 20 20 20 63 6f 6d  t 1024.      com
0e50: 70 69 6c 65 73 71 6c 31 36 20 22 53 45 4c 45 43  pilesql16 "SELEC
0e60: 54 20 31 30 22 0a 20 20 20 20 20 20 73 65 74 20  T 10".      set 
0e70: 62 74 20 5b 62 74 72 65 65 5f 66 72 6f 6d 5f 64  bt [btree_from_d
0e80: 62 20 64 62 5d 0a 20 20 20 20 20 20 61 72 72 61  b db].      arra
0e90: 79 20 73 65 74 20 73 74 61 74 73 20 5b 62 74 72  y set stats [btr
0ea0: 65 65 5f 70 61 67 65 72 5f 73 74 61 74 73 20 24  ee_pager_stats $
0eb0: 62 74 5d 0a 20 20 20 20 20 20 73 65 74 20 73 74  bt].      set st
0ec0: 61 74 73 28 70 61 67 65 29 0a 20 20 20 20 7d 20  ats(page).    } 
0ed0: 7b 30 7d 0a 0a 20 20 20 20 23 20 45 6e 73 75 72  {0}..    # Ensur
0ee0: 65 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 20 77  e that nothing w
0ef0: 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  as written to th
0f00: 65 20 64 61 74 61 62 61 73 65 20 77 68 69 6c 65  e database while
0f10: 20 72 65 63 6c 61 69 6d 69 6e 67 0a 20 20 20 20   reclaiming.    
0f20: 23 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  # memory from th
0f30: 65 20 70 61 67 65 72 20 69 6e 20 65 72 72 6f 72  e pager in error
0f40: 20 73 74 61 74 65 2e 0a 20 20 20 20 23 0a 20 20   state..    #.  
0f50: 20 20 64 6f 5f 74 65 73 74 20 69 6f 65 72 72 35    do_test ioerr5
0f60: 2d 31 2e 24 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  -1.$locking_mode
0f70: 2d 24 69 46 61 69 6c 2e 34 20 7b 0a 20 20 20 20  -$iFail.4 {.    
0f80: 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74    set fd [open t
0f90: 65 73 74 2e 64 62 5d 0a 20 20 20 20 20 20 66 63  est.db].      fc
0fa0: 6f 6e 66 69 67 75 72 65 20 24 66 64 20 2d 74 72  onfigure $fd -tr
0fb0: 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79  anslation binary
0fc0: 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72   -encoding binar
0fd0: 79 0a 20 20 20 20 20 20 73 65 74 20 7a 44 61 74  y.      set zDat
0fe0: 61 62 61 73 65 32 20 5b 72 65 61 64 20 24 66 64  abase2 [read $fd
0ff0: 5d 0a 20 20 20 20 20 20 63 6c 6f 73 65 20 24 66  ].      close $f
1000: 64 0a 20 20 20 20 20 20 65 78 70 72 20 7b 24 7a  d.      expr {$z
1010: 44 61 74 61 62 61 73 65 20 65 71 20 24 7a 44 61  Database eq $zDa
1020: 74 61 62 61 73 65 32 7d 0a 20 20 20 20 7d 20 7b  tabase2}.    } {
1030: 31 7d 0a 20 20 0a 20 20 20 20 69 66 20 7b 24 72  1}.  .    if {$r
1040: 63 20 65 71 20 5b 6c 69 73 74 20 30 20 7b 7d 5d  c eq [list 0 {}]
1050: 7d 20 7b 0a 20 20 20 20 20 20 64 6f 5f 74 65 73  } {.      do_tes
1060: 74 20 69 6f 65 72 72 35 2e 31 2d 24 6c 6f 63 6b  t ioerr5.1-$lock
1070: 69 6e 67 5f 6d 6f 64 65 2d 24 69 46 61 69 6c 2e  ing_mode-$iFail.
1080: 33 20 7b 0a 20 20 20 20 20 20 20 20 65 78 65 63  3 {.        exec
1090: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
10a0: 6e 74 28 2a 29 20 46 52 4f 4d 20 61 20 7d 0a 20  nt(*) FROM a }. 
10b0: 20 20 20 20 20 7d 20 5b 65 78 70 72 20 24 6e 52       } [expr $nR
10c0: 6f 77 2b 31 5d 0a 20 20 20 20 20 20 62 72 65 61  ow+1].      brea
10d0: 6b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  k.    }.  }.}..#
10e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
10f0: 74 65 73 74 20 73 63 72 69 70 74 20 64 6f 65 73  test script does
1100: 6e 27 74 20 6c 65 61 76 65 20 61 6e 79 20 66 69  n't leave any fi
1110: 6c 65 73 20 6f 70 65 6e 2e 0a 23 0a 64 6f 5f 74  les open..#.do_t
1120: 65 73 74 20 69 6f 65 72 72 35 2d 31 2e 58 20 7b  est ioerr5-1.X {
1130: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c  .  catch { db cl
1140: 6f 73 65 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  ose }.  catch { 
1150: 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 73 65  db2 close }.  se
1160: 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69  t sqlite_open_fi
1170: 6c 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 0a 64 6f  le_count.} 0..do
1180: 5f 74 65 73 74 20 69 6f 65 72 72 35 2d 32 2e 30  _test ioerr5-2.0
1190: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
11a0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
11b0: 6c 20 7b 20 43 52 45 41 54 45 20 49 4e 44 45 58  l { CREATE INDEX
11c0: 20 69 31 20 4f 4e 20 61 28 69 64 2c 20 6e 61 6d   i1 ON a(id, nam
11d0: 65 29 3b 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65  e); }.} {}..fore
11e0: 61 63 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ach locking_mode
11f0: 20 7b 65 78 63 6c 75 73 69 76 65 20 6e 6f 72 6d   {exclusive norm
1200: 61 6c 7d 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74  al} {.  for {set
1210: 20 69 46 61 69 6c 20 31 7d 20 7b 24 69 46 61 69   iFail 1} {$iFai
1220: 6c 3c 32 30 30 7d 20 7b 69 6e 63 72 20 69 46 61  l<200} {incr iFa
1230: 69 6c 7d 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  il} {.    sqlite
1240: 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
1250: 74 20 31 30 34 38 35 37 36 0a 20 20 20 20 6f 70  t 1048576.    op
1260: 65 6e 64 61 74 61 62 61 73 65 73 0a 20 20 20 20  endatabases.    
1270: 65 78 65 63 73 71 6c 20 7b 20 70 72 61 67 6d 61  execsql { pragma
1280: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
1290: 63 6c 75 73 69 76 65 20 7d 0a 20 20 20 20 73 65  clusive }.    se
12a0: 74 20 6e 52 6f 77 20 5b 64 62 20 6f 6e 65 20 7b  t nRow [db one {
12b0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
12c0: 46 52 4f 4d 20 61 7d 5d 0a 20 20 0a 20 20 20 20  FROM a}].  .    
12d0: 64 6f 5f 74 65 73 74 20 69 6f 65 72 72 35 2d 32  do_test ioerr5-2
12e0: 2e 24 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2d 24  .$locking_mode-$
12f0: 69 46 61 69 6c 2e 31 20 7b 0a 20 20 20 20 20 20  iFail.1 {.      
1300: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1310: 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56    BEGIN EXCLUSIV
1320: 45 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  E;.        INSER
1330: 54 20 49 4e 54 4f 20 61 20 56 41 4c 55 45 53 28  T INTO a VALUES(
1340: 31 2c 20 27 41 42 43 44 45 46 47 48 49 4a 4b 4c  1, 'ABCDEFGHIJKL
1350: 4d 4e 4f 50 27 29 3b 0a 20 20 20 20 20 20 7d 0a  MNOP');.      }.
1360: 20 20 20 20 7d 20 7b 7d 0a 0a 20 20 20 20 73 65      } {}..    se
1370: 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72  t ::sqlite_io_er
1380: 72 6f 72 5f 70 65 72 73 69 73 74 20 31 0a 20 20  ror_persist 1.  
1390: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69    set ::sqlite_i
13a0: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
13b0: 24 69 46 61 69 6c 0a 0a 20 20 20 20 73 71 6c 69  $iFail..    sqli
13c0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
13d0: 72 79 20 31 30 30 30 30 0a 0a 20 20 20 20 73 65  ry 10000..    se
13e0: 74 20 65 72 72 6f 72 5f 68 69 74 20 24 3a 3a 73  t error_hit $::s
13f0: 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68  qlite_io_error_h
1400: 69 74 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c  it.    set ::sql
1410: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  ite_io_error_hit
1420: 20 30 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c   0.    set ::sql
1430: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72  ite_io_error_per
1440: 73 69 73 74 20 30 0a 20 20 20 20 73 65 74 20 3a  sist 0.    set :
1450: 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72  :sqlite_io_error
1460: 5f 70 65 6e 64 69 6e 67 20 30 0a 20 20 20 20 69  _pending 0.    i
1470: 66 20 7b 24 65 72 72 6f 72 5f 68 69 74 7d 20 7b  f {$error_hit} {
1480: 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 69  .      do_test i
1490: 6f 65 72 72 35 2d 32 2e 24 6c 6f 63 6b 69 6e 67  oerr5-2.$locking
14a0: 5f 6d 6f 64 65 2d 24 69 46 61 69 6c 2e 33 61 20  _mode-$iFail.3a 
14b0: 7b 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 73  {.        catchs
14c0: 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 20 20 20 20  ql COMMIT.      
14d0: 7d 20 7b 31 20 7b 64 69 73 6b 20 49 2f 4f 20 65  } {1 {disk I/O e
14e0: 72 72 6f 72 7d 7d 0a 20 20 20 20 7d 20 65 6c 73  rror}}.    } els
14f0: 65 20 7b 0a 20 20 20 20 20 20 64 6f 5f 74 65 73  e {.      do_tes
1500: 74 20 69 6f 65 72 72 35 2d 32 2e 24 6c 6f 63 6b  t ioerr5-2.$lock
1510: 69 6e 67 5f 6d 6f 64 65 2d 24 69 46 61 69 6c 2e  ing_mode-$iFail.
1520: 33 62 20 7b 0a 20 20 20 20 20 20 20 20 65 78 65  3b {.        exe
1530: 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 20 20  csql COMMIT.    
1540: 20 20 7d 20 7b 7d 0a 20 20 20 20 20 20 62 72 65    } {}.      bre
1550: 61 6b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  ak.    }.  }.}..
1560: 23 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73  # Make sure this
1570: 20 74 65 73 74 20 73 63 72 69 70 74 20 64 6f 65   test script doe
1580: 73 6e 27 74 20 6c 65 61 76 65 20 61 6e 79 20 66  sn't leave any f
1590: 69 6c 65 73 20 6f 70 65 6e 2e 0a 23 0a 64 6f 5f  iles open..#.do_
15a0: 74 65 73 74 20 69 6f 65 72 72 35 2d 32 2e 58 20  test ioerr5-2.X 
15b0: 7b 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63  {.  catch { db c
15c0: 6c 6f 73 65 20 7d 0a 20 20 63 61 74 63 68 20 7b  lose }.  catch {
15d0: 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 73   db2 close }.  s
15e0: 65 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66  et sqlite_open_f
15f0: 69 6c 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 0a 73  ile_count.} 0..s
1600: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
1610: 61 72 65 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e  ared_cache $::en
1620: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
1630: 65 0a 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68  e.sqlite3_soft_h
1640: 65 61 70 5f 6c 69 6d 69 74 20 24 3a 3a 73 6f 66  eap_limit $::sof
1650: 74 5f 6c 69 6d 69 74 0a 0a 66 69 6e 69 73 68 5f  t_limit..finish_
1660: 74 65 73 74 0a                                   test.