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

Artifact 7912c3c8768320fd7bcb217637c2f0a607fbbc24:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 73 6f 6d 65 20 63 6f 6d 6d 6f 6e 20 54 43 4c   some common TCL
0190: 20 72 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66   routines used f
01a0: 6f 72 20 72 65 67 72 65 73 73 69 6f 6e 0a 23 20  or regression.# 
01b0: 74 65 73 74 69 6e 67 20 74 68 65 20 53 51 4c 69  testing the SQLi
01c0: 74 65 20 6c 69 62 72 61 72 79 0a 23 0a 23 20 24  te library.#.# $
01d0: 49 64 3a 20 74 65 73 74 65 72 2e 74 63 6c 2c 76  Id: tester.tcl,v
01e0: 20 31 2e 31 34 33 20 32 30 30 39 2f 30 34 2f 30   1.143 2009/04/0
01f0: 39 20 30 31 3a 32 33 3a 34 39 20 64 72 68 20 45  9 01:23:49 drh E
0200: 78 70 20 24 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  xp $..#---------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0250: 0a 23 20 54 68 65 20 63 6f 6d 6d 61 6e 64 73 20  .# The commands 
0260: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
0270: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
0280: 65 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 63  e to help with c
0290: 72 65 61 74 69 6e 67 20 0a 23 20 74 65 73 74 20  reating .# test 
02a0: 63 61 73 65 73 20 61 72 65 20 61 73 20 66 6f 6c  cases are as fol
02b0: 6c 6f 77 73 3a 0a 23 0a 23 20 43 6f 6d 6d 61 6e  lows:.#.# Comman
02c0: 64 73 20 74 6f 20 6d 61 6e 69 70 75 6c 61 74 65  ds to manipulate
02d0: 20 74 68 65 20 64 62 20 61 6e 64 20 74 68 65 20   the db and the 
02e0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 74 20 61  file-system at a
02f0: 20 68 69 67 68 20 6c 65 76 65 6c 3a 0a 23 0a 23   high level:.#.#
0300: 20 20 20 20 20 20 63 6f 70 79 5f 66 69 6c 65 20        copy_file 
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f               FRO
0320: 4d 20 54 4f 0a 23 20 20 20 20 20 20 64 72 6f 70  M TO.#      drop
0330: 5f 61 6c 6c 5f 74 61 62 6c 65 20 20 20 20 20 20  _all_table      
0340: 20 20 20 3f 44 42 3f 0a 23 20 20 20 20 20 20 66     ?DB?.#      f
0350: 6f 72 63 65 64 65 6c 65 74 65 20 20 20 20 20 20  orcedelete      
0360: 20 20 20 20 20 20 46 49 4c 45 4e 41 4d 45 0a 23        FILENAME.#
0370: 0a 23 20 54 65 73 74 20 74 68 65 20 63 61 70 61  .# Test the capa
0380: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 53 51  bility of the SQ
0390: 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 62 75 69  Lite version bui
03a0: 6c 74 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65  lt into the inte
03b0: 72 70 72 65 74 65 72 20 74 6f 0a 23 20 64 65 74  rpreter to.# det
03c0: 65 72 6d 69 6e 65 20 69 66 20 61 20 73 70 65 63  ermine if a spec
03d0: 69 66 69 63 20 74 65 73 74 20 63 61 6e 20 62 65  ific test can be
03e0: 20 72 75 6e 3a 0a 23 0a 23 20 20 20 20 20 20 69   run:.#.#      i
03f0: 66 63 61 70 61 62 6c 65 20 20 20 20 20 20 20 20  fcapable        
0400: 20 20 20 20 20 20 45 58 50 52 0a 23 0a 23 20 43        EXPR.#.# C
0410: 61 6c 75 6c 61 74 65 20 63 68 65 63 6b 73 75 6d  alulate checksum
0420: 73 20 62 61 73 65 64 20 6f 6e 20 64 61 74 61 62  s based on datab
0430: 61 73 65 20 63 6f 6e 74 65 6e 74 73 3a 0a 23 0a  ase contents:.#.
0440: 23 20 20 20 20 20 20 64 62 63 6b 73 75 6d 20 20  #      dbcksum  
0450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42                DB
0460: 20 44 42 4e 41 4d 45 0a 23 20 20 20 20 20 20 61   DBNAME.#      a
0470: 6c 6c 63 6b 73 75 6d 20 20 20 20 20 20 20 20 20  llcksum         
0480: 20 20 20 20 20 20 3f 44 42 3f 0a 23 20 20 20 20        ?DB?.#    
0490: 20 20 63 6b 73 75 6d 20 20 20 20 20 20 20 20 20    cksum         
04a0: 20 20 20 20 20 20 20 20 20 3f 44 42 3f 0a 23 0a           ?DB?.#.
04b0: 23 20 43 6f 6d 6d 61 6e 64 73 20 74 6f 20 65 78  # Commands to ex
04c0: 65 63 75 74 65 2f 65 78 70 6c 61 69 6e 20 53 51  ecute/explain SQ
04d0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 23 0a  L statements:.#.
04e0: 23 20 20 20 20 20 20 73 74 65 70 73 71 6c 20 20  #      stepsql  
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42                DB
0500: 20 53 51 4c 0a 23 20 20 20 20 20 20 65 78 65 63   SQL.#      exec
0510: 73 71 6c 32 20 20 20 20 20 20 20 20 20 20 20 20  sql2            
0520: 20 20 20 53 51 4c 0a 23 20 20 20 20 20 20 65 78     SQL.#      ex
0530: 70 6c 61 69 6e 5f 6e 6f 5f 74 72 61 63 65 20 20  plain_no_trace  
0540: 20 20 20 20 20 53 51 4c 0a 23 20 20 20 20 20 20       SQL.#      
0550: 65 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20  explain         
0560: 20 20 20 20 20 20 20 53 51 4c 20 3f 44 42 3f 0a         SQL ?DB?.
0570: 23 20 20 20 20 20 20 63 61 74 63 68 73 71 6c 20  #      catchsql 
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
0590: 4c 20 3f 44 42 3f 0a 23 20 20 20 20 20 20 65 78  L ?DB?.#      ex
05a0: 65 63 73 71 6c 20 20 20 20 20 20 20 20 20 20 20  ecsql           
05b0: 20 20 20 20 20 53 51 4c 20 3f 44 42 3f 0a 23 0a       SQL ?DB?.#.
05c0: 23 20 43 6f 6d 6d 61 6e 64 73 20 74 6f 20 72 75  # Commands to ru
05d0: 6e 20 74 65 73 74 20 63 61 73 65 73 3a 0a 23 0a  n test cases:.#.
05e0: 23 20 20 20 20 20 20 64 6f 5f 69 6f 65 72 72 5f  #      do_ioerr_
05f0: 74 65 73 74 20 20 20 20 20 20 20 20 20 20 54 45  test          TE
0600: 53 54 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a 23  STNAME ARGS....#
0610: 20 20 20 20 20 20 63 72 61 73 68 73 71 6c 20 20        crashsql  
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 52 47               ARG
0630: 53 2e 2e 2e 0a 23 20 20 20 20 20 20 69 6e 74 65  S....#      inte
0640: 67 72 69 74 79 5f 63 68 65 63 6b 20 20 20 20 20  grity_check     
0650: 20 20 20 54 45 53 54 4e 41 4d 45 20 3f 44 42 3f     TESTNAME ?DB?
0660: 0a 23 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20  .#      do_test 
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
0680: 45 53 54 4e 41 4d 45 20 53 43 52 49 50 54 20 45  ESTNAME SCRIPT E
0690: 58 50 45 43 54 45 44 0a 23 0a 23 20 43 6f 6d 6d  XPECTED.#.# Comm
06a0: 61 6e 64 73 20 70 72 6f 76 69 64 69 6e 67 20 61  ands providing a
06b0: 20 6c 6f 77 65 72 20 6c 65 76 65 6c 20 69 6e 74   lower level int
06c0: 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 67 6c  erface to the gl
06d0: 6f 62 61 6c 20 74 65 73 74 20 63 6f 75 6e 74 65  obal test counte
06e0: 72 73 3a 0a 23 0a 23 20 20 20 20 20 20 73 65 74  rs:.#.#      set
06f0: 5f 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 20 20  _test_counter   
0700: 20 20 20 20 43 4f 55 4e 54 45 52 20 3f 56 41 4c      COUNTER ?VAL
0710: 55 45 3f 0a 23 20 20 20 20 20 20 6f 6d 69 74 5f  UE?.#      omit_
0720: 74 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20  test            
0730: 20 20 54 45 53 54 4e 41 4d 45 20 52 45 41 53 4f    TESTNAME REASO
0740: 4e 0a 23 20 20 20 20 20 20 66 61 69 6c 5f 74 65  N.#      fail_te
0750: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
0760: 54 45 53 54 4e 41 4d 45 0a 23 20 20 20 20 20 20  TESTNAME.#      
0770: 69 6e 63 72 5f 6e 74 65 73 74 0a 23 0a 23 20 43  incr_ntest.#.# C
0780: 6f 6d 6d 61 6e 64 20 72 75 6e 20 61 74 20 74 68  ommand run at th
0790: 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 74 65  e end of each te
07a0: 73 74 20 66 69 6c 65 3a 0a 23 0a 23 20 20 20 20  st file:.#.#    
07b0: 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 23 0a    finish_test.#.
07c0: 23 20 43 6f 6d 6d 61 6e 64 73 20 74 6f 20 68 65  # Commands to he
07d0: 6c 70 20 63 72 65 61 74 65 20 74 65 73 74 20 66  lp create test f
07e0: 69 6c 65 73 20 74 68 61 74 20 72 75 6e 20 77 69  iles that run wi
07f0: 74 68 20 74 68 65 20 22 57 41 4c 22 20 61 6e 64  th the "WAL" and
0800: 20 6f 74 68 65 72 0a 23 20 70 65 72 6d 75 74 61   other.# permuta
0810: 74 69 6f 6e 73 20 28 73 65 65 20 66 69 6c 65 20  tions (see file 
0820: 70 65 72 6d 75 74 61 74 69 6f 6e 73 2e 74 65 73  permutations.tes
0830: 74 29 3a 0a 23 0a 23 20 20 20 20 20 20 77 61 6c  t):.#.#      wal
0840: 5f 69 73 5f 77 61 6c 5f 6d 6f 64 65 0a 23 20 20  _is_wal_mode.#  
0850: 20 20 20 20 77 61 6c 5f 73 65 74 5f 6a 6f 75 72      wal_set_jour
0860: 6e 61 6c 5f 6d 6f 64 65 20 20 20 3f 44 42 3f 0a  nal_mode   ?DB?.
0870: 23 20 20 20 20 20 20 77 61 6c 5f 63 68 65 63 6b  #      wal_check
0880: 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 54 45  _journal_mode TE
0890: 53 54 4e 41 4d 45 3f 44 42 3f 0a 23 20 20 20 20  STNAME?DB?.#    
08a0: 20 20 70 65 72 6d 75 74 61 74 69 6f 6e 0a 23 0a    permutation.#.
08b0: 0a 23 20 53 65 74 20 74 68 65 20 70 72 65 63 69  .# Set the preci
08c0: 73 69 6f 6e 20 6f 66 20 46 50 20 61 72 69 74 68  sion of FP arith
08d0: 6d 61 74 69 63 20 75 73 65 64 20 62 79 20 74 68  matic used by th
08e0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 41  e interpreter. A
08f0: 6e 64 20 0a 23 20 63 6f 6e 66 69 67 75 72 65 20  nd .# configure 
0900: 53 51 4c 69 74 65 20 74 6f 20 74 61 6b 65 20 64  SQLite to take d
0910: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c 6f 63  atabase file loc
0920: 6b 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ks on the page t
0930: 68 61 74 20 62 65 67 69 6e 73 0a 23 20 36 34 4b  hat begins.# 64K
0940: 42 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  B into the datab
0950: 61 73 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  ase file instead
0960: 20 6f 66 20 74 68 65 20 6f 6e 65 20 31 47 42 20   of the one 1GB 
0970: 69 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 23  in. This means.#
0980: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
0990: 61 6e 64 6c 65 73 20 74 68 61 74 20 73 70 65 63  andles that spec
09a0: 69 61 6c 20 63 61 73 65 20 63 61 6e 20 62 65 20  ial case can be 
09b0: 74 65 73 74 65 64 20 77 69 74 68 6f 75 74 20 63  tested without c
09c0: 72 65 61 74 69 6e 67 0a 23 20 76 65 72 79 20 6c  reating.# very l
09d0: 61 72 67 65 20 64 61 74 61 62 61 73 65 20 66 69  arge database fi
09e0: 6c 65 73 2e 0a 23 0a 73 65 74 20 74 63 6c 5f 70  les..#.set tcl_p
09f0: 72 65 63 69 73 69 6f 6e 20 31 35 0a 73 71 6c 69  recision 15.sqli
0a00: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
0a10: 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 30 78  _pending_byte 0x
0a20: 30 30 31 30 30 30 30 0a 0a 0a 23 20 49 66 20 74  0010000...# If t
0a30: 68 65 20 70 61 67 65 72 20 63 6f 64 65 63 20 69  he pager codec i
0a40: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 63 72 65  s available, cre
0a50: 61 74 65 20 61 20 77 72 61 70 70 65 72 20 66 6f  ate a wrapper fo
0a60: 72 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5d 20  r the [sqlite3] 
0a70: 0a 23 20 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20  .# command that 
0a80: 61 70 70 65 6e 64 73 20 22 2d 6b 65 79 20 7b 78  appends "-key {x
0a90: 79 7a 7a 79 7d 22 20 74 6f 20 74 68 65 20 63 6f  yzzy}" to the co
0aa0: 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 69 2e 65 2e  mmand line. i.e.
0ab0: 20 74 68 69 73 3a 0a 23 0a 23 20 20 20 20 20 73   this:.#.#     s
0ac0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
0ad0: 62 0a 23 0a 23 20 62 65 63 6f 6d 65 73 0a 23 0a  b.#.# becomes.#.
0ae0: 23 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  #     sqlite3 db
0af0: 20 74 65 73 74 2e 64 62 20 2d 6b 65 79 20 7b 78   test.db -key {x
0b00: 79 7a 7a 79 7d 0a 23 0a 69 66 20 7b 5b 69 6e 66  yzzy}.#.if {[inf
0b10: 6f 20 63 6f 6d 6d 61 6e 64 20 73 71 6c 69 74 65  o command sqlite
0b20: 5f 6f 72 69 67 5d 3d 3d 22 22 7d 20 7b 0a 20 20  _orig]==""} {.  
0b30: 72 65 6e 61 6d 65 20 73 71 6c 69 74 65 33 20 73  rename sqlite3 s
0b40: 71 6c 69 74 65 5f 6f 72 69 67 0a 20 20 70 72 6f  qlite_orig.  pro
0b50: 63 20 73 71 6c 69 74 65 33 20 7b 61 72 67 73 7d  c sqlite3 {args}
0b60: 20 7b 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e   {.    if {[llen
0b70: 67 74 68 20 24 61 72 67 73 5d 3d 3d 32 20 26 26  gth $args]==2 &&
0b80: 20 5b 73 74 72 69 6e 67 20 69 6e 64 65 78 20 5b   [string index [
0b90: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20  lindex $args 0] 
0ba0: 30 5d 21 3d 22 2d 22 7d 20 7b 0a 20 20 20 20 20  0]!="-"} {.     
0bb0: 20 23 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20   # This command 
0bc0: 69 73 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  is opening a new
0bd0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
0be0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 23 0a 20 20  tion..      #.  
0bf0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0c00: 69 73 74 73 20 3a 3a 47 28 70 65 72 6d 3a 73 71  ists ::G(perm:sq
0c10: 6c 69 74 65 33 5f 61 72 67 73 29 5d 7d 20 7b 0a  lite3_args)]} {.
0c20: 20 20 20 20 20 20 20 20 73 65 74 20 61 72 67 73          set args
0c30: 20 5b 63 6f 6e 63 61 74 20 24 61 72 67 73 20 24   [concat $args $
0c40: 3a 3a 47 28 70 65 72 6d 3a 73 71 6c 69 74 65 33  ::G(perm:sqlite3
0c50: 5f 61 72 67 73 29 5d 0a 20 20 20 20 20 20 7d 0a  _args)].      }.
0c60: 20 20 20 20 20 20 69 66 20 7b 5b 73 71 6c 69 74        if {[sqlit
0c70: 65 5f 6f 72 69 67 20 2d 68 61 73 2d 63 6f 64 65  e_orig -has-code
0c80: 63 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c 61  c]} {.        la
0c90: 70 70 65 6e 64 20 61 72 67 73 20 2d 6b 65 79 20  ppend args -key 
0ca0: 7b 78 79 7a 7a 79 7d 0a 20 20 20 20 20 20 7d 0a  {xyzzy}.      }.
0cb0: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 20 5b  .      set res [
0cc0: 75 70 6c 65 76 65 6c 20 31 20 73 71 6c 69 74 65  uplevel 1 sqlite
0cd0: 5f 6f 72 69 67 20 24 61 72 67 73 5d 0a 0a 20 20  _orig $args]..  
0ce0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0cf0: 69 73 74 73 20 3a 3a 47 28 70 65 72 6d 3a 70 72  ists ::G(perm:pr
0d00: 65 73 71 6c 29 5d 7d 20 7b 0a 20 20 20 20 20 20  esql)]} {.      
0d10: 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20    [lindex $args 
0d20: 30 5d 20 65 76 61 6c 20 24 3a 3a 47 28 70 65 72  0] eval $::G(per
0d30: 6d 3a 70 72 65 73 71 6c 29 0a 20 20 20 20 20 20  m:presql).      
0d40: 7d 0a 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  }..      set res
0d50: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
0d60: 20 20 20 20 23 20 54 68 69 73 20 63 6f 6d 6d 61      # This comma
0d70: 6e 64 20 69 73 20 6e 6f 74 20 6f 70 65 6e 69 6e  nd is not openin
0d80: 67 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  g a new database
0d90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 50 61 73   connection. Pas
0da0: 73 20 74 68 65 20 0a 20 20 20 20 20 20 23 20 61  s the .      # a
0db0: 72 67 75 6d 65 6e 74 73 20 74 68 72 6f 75 67 68  rguments through
0dc0: 20 74 6f 20 74 68 65 20 43 20 69 6d 70 6c 65 6d   to the C implem
0dd0: 65 6e 61 74 69 6f 6e 20 61 73 20 74 68 65 20 61  enation as the a
0de0: 72 65 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20  re..      #.    
0df0: 20 20 75 70 6c 65 76 65 6c 20 31 20 73 71 6c 69    uplevel 1 sqli
0e00: 74 65 5f 6f 72 69 67 20 24 61 72 67 73 0a 20 20  te_orig $args.  
0e10: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 54 68 65    }.  }.}..# The
0e20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
0e30: 20 6f 6e 6c 79 20 72 75 6e 73 20 74 68 65 20 66   only runs the f
0e40: 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 66  irst time this f
0e50: 69 6c 65 20 69 73 20 73 6f 75 72 63 65 64 2e 20  ile is sourced. 
0e60: 49 74 0a 23 20 64 6f 65 73 20 6e 6f 74 20 72 75  It.# does not ru
0e70: 6e 20 69 6e 20 73 6c 61 76 65 20 69 6e 74 65 72  n in slave inter
0e80: 70 72 65 74 65 72 73 20 28 73 69 6e 63 65 20 74  preters (since t
0e90: 68 65 20 3a 3a 63 6d 64 6c 69 6e 65 61 72 67 20  he ::cmdlinearg 
0ea0: 61 72 72 61 79 20 69 73 0a 23 20 70 6f 70 75 6c  array is.# popul
0eb0: 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  ated before the 
0ec0: 74 65 73 74 20 73 63 72 69 70 74 20 69 73 20 72  test script is r
0ed0: 75 6e 20 69 6e 20 73 6c 61 76 65 20 69 6e 74 65  un in slave inte
0ee0: 72 70 72 65 74 65 72 73 29 2e 0a 23 0a 69 66 20  rpreters)..#.if 
0ef0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6d  {[info exists cm
0f00: 64 6c 69 6e 65 61 72 67 5d 3d 3d 30 7d 20 7b 0a  dlinearg]==0} {.
0f10: 0a 20 20 23 20 50 61 72 73 65 20 61 6e 79 20 6f  .  # Parse any o
0f20: 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64  ptions specified
0f30: 20 69 6e 20 74 68 65 20 24 61 72 67 76 20 61 72   in the $argv ar
0f40: 72 61 79 2e 20 54 68 69 73 20 73 63 72 69 70 74  ray. This script
0f50: 20 61 63 63 65 70 74 73 20 74 68 65 20 0a 20 20   accepts the .  
0f60: 23 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69  # following opti
0f70: 6f 6e 73 3a 20 0a 20 20 23 0a 20 20 23 20 20 20  ons: .  #.  #   
0f80: 2d 2d 70 61 75 73 65 0a 20 20 23 20 20 20 2d 2d  --pause.  #   --
0f90: 73 6f 66 74 2d 68 65 61 70 2d 6c 69 6d 69 74 3d  soft-heap-limit=
0fa0: 4e 4e 0a 20 20 23 20 20 20 2d 2d 6d 61 78 65 72  NN.  #   --maxer
0fb0: 72 6f 72 3d 4e 4e 0a 20 20 23 20 20 20 2d 2d 6d  ror=NN.  #   --m
0fc0: 61 6c 6c 6f 63 74 72 61 63 65 3d 4e 0a 20 20 23  alloctrace=N.  #
0fd0: 20 20 20 2d 2d 62 61 63 6b 74 72 61 63 65 3d 4e     --backtrace=N
0fe0: 0a 20 20 23 20 20 20 2d 2d 62 69 6e 61 72 79 6c  .  #   --binaryl
0ff0: 6f 67 3d 4e 0a 20 20 23 20 20 20 2d 2d 73 6f 61  og=N.  #   --soa
1000: 6b 3d 4e 0a 20 20 23 0a 20 20 73 65 74 20 63 6d  k=N.  #.  set cm
1010: 64 6c 69 6e 65 61 72 67 28 73 6f 66 74 2d 68 65  dlinearg(soft-he
1020: 61 70 2d 6c 69 6d 69 74 29 20 20 20 20 30 0a 20  ap-limit)    0. 
1030: 20 73 65 74 20 63 6d 64 6c 69 6e 65 61 72 67 28   set cmdlinearg(
1040: 6d 61 78 65 72 72 6f 72 29 20 20 20 20 20 20 20  maxerror)       
1050: 20 31 30 30 30 0a 20 20 73 65 74 20 63 6d 64 6c   1000.  set cmdl
1060: 69 6e 65 61 72 67 28 6d 61 6c 6c 6f 63 74 72 61  inearg(malloctra
1070: 63 65 29 20 20 20 20 20 20 20 20 30 0a 20 20 73  ce)        0.  s
1080: 65 74 20 63 6d 64 6c 69 6e 65 61 72 67 28 62 61  et cmdlinearg(ba
1090: 63 6b 74 72 61 63 65 29 20 20 20 20 20 20 20 20  cktrace)        
10a0: 20 31 30 0a 20 20 73 65 74 20 63 6d 64 6c 69 6e   10.  set cmdlin
10b0: 65 61 72 67 28 62 69 6e 61 72 79 6c 6f 67 29 20  earg(binarylog) 
10c0: 20 20 20 20 20 20 20 20 20 30 0a 20 20 73 65 74           0.  set
10d0: 20 63 6d 64 6c 69 6e 65 61 72 67 28 73 6f 61 6b   cmdlinearg(soak
10e0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
10f0: 30 0a 0a 20 20 73 65 74 20 6c 65 66 74 6f 76 65  0..  set leftove
1100: 72 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61  r [list].  forea
1110: 63 68 20 61 20 24 61 72 67 76 20 7b 0a 20 20 20  ch a $argv {.   
1120: 20 73 77 69 74 63 68 20 2d 72 65 67 65 78 70 20   switch -regexp 
1130: 2d 2d 20 24 61 20 7b 0a 20 20 20 20 20 20 7b 5e  -- $a {.      {^
1140: 2d 2b 70 61 75 73 65 24 7d 20 7b 0a 20 20 20 20  -+pause$} {.    
1150: 20 20 20 20 23 20 57 61 69 74 20 66 6f 72 20 75      # Wait for u
1160: 73 65 72 20 69 6e 70 75 74 20 62 65 66 6f 72 65  ser input before
1170: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 54 68 69   continuing. Thi
1180: 73 20 69 73 20 74 6f 20 67 69 76 65 20 74 68 65  s is to give the
1190: 20 75 73 65 72 20 61 6e 20 0a 20 20 20 20 20 20   user an .      
11a0: 20 20 23 20 6f 70 70 6f 72 74 75 6e 69 74 79 20    # opportunity 
11b0: 74 6f 20 63 6f 6e 6e 65 63 74 20 70 72 6f 66 69  to connect profi
11c0: 6c 69 6e 67 20 74 6f 6f 6c 73 20 74 6f 20 74 68  ling tools to th
11d0: 65 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 20  e process..     
11e0: 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
11f0: 6e 65 20 22 50 72 65 73 73 20 52 45 54 55 52 4e  ne "Press RETURN
1200: 20 74 6f 20 62 65 67 69 6e 2e 2e 2e 22 0a 20 20   to begin...".  
1210: 20 20 20 20 20 20 66 6c 75 73 68 20 73 74 64 6f        flush stdo
1220: 75 74 0a 20 20 20 20 20 20 20 20 67 65 74 73 20  ut.        gets 
1230: 73 74 64 69 6e 0a 20 20 20 20 20 20 7d 0a 20 20  stdin.      }.  
1240: 20 20 20 20 7b 5e 2d 2b 73 6f 66 74 2d 68 65 61      {^-+soft-hea
1250: 70 2d 6c 69 6d 69 74 3d 2e 2b 24 7d 20 7b 0a 20  p-limit=.+$} {. 
1260: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b         foreach {
1270: 64 75 6d 6d 79 20 63 6d 64 6c 69 6e 65 61 72 67  dummy cmdlinearg
1280: 28 73 6f 66 74 2d 68 65 61 70 2d 6c 69 6d 69 74  (soft-heap-limit
1290: 29 7d 20 5b 73 70 6c 69 74 20 24 61 20 3d 5d 20  )} [split $a =] 
12a0: 62 72 65 61 6b 0a 20 20 20 20 20 20 7d 0a 20 20  break.      }.  
12b0: 20 20 20 20 7b 5e 2d 2b 6d 61 78 65 72 72 6f 72      {^-+maxerror
12c0: 3d 2e 2b 24 7d 20 7b 0a 20 20 20 20 20 20 20 20  =.+$} {.        
12d0: 66 6f 72 65 61 63 68 20 7b 64 75 6d 6d 79 20 63  foreach {dummy c
12e0: 6d 64 6c 69 6e 65 61 72 67 28 6d 61 78 65 72 72  mdlinearg(maxerr
12f0: 6f 72 29 7d 20 5b 73 70 6c 69 74 20 24 61 20 3d  or)} [split $a =
1300: 5d 20 62 72 65 61 6b 0a 20 20 20 20 20 20 7d 0a  ] break.      }.
1310: 20 20 20 20 20 20 7b 5e 2d 2b 6d 61 6c 6c 6f 63        {^-+malloc
1320: 74 72 61 63 65 3d 2e 2b 24 7d 20 7b 0a 20 20 20  trace=.+$} {.   
1330: 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b 64 75       foreach {du
1340: 6d 6d 79 20 63 6d 64 6c 69 6e 65 61 72 67 28 6d  mmy cmdlinearg(m
1350: 61 6c 6c 6f 63 74 72 61 63 65 29 7d 20 5b 73 70  alloctrace)} [sp
1360: 6c 69 74 20 24 61 20 3d 5d 20 62 72 65 61 6b 0a  lit $a =] break.
1370: 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 6d 64          if {$cmd
1380: 6c 69 6e 65 61 72 67 28 6d 61 6c 6c 6f 63 74 72  linearg(malloctr
1390: 61 63 65 29 7d 20 7b 0a 20 20 20 20 20 20 20 20  ace)} {.        
13a0: 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62    sqlite3_memdeb
13b0: 75 67 5f 6c 6f 67 20 73 74 61 72 74 0a 20 20 20  ug_log start.   
13c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13d0: 20 20 20 20 20 7b 5e 2d 2b 62 61 63 6b 74 72 61       {^-+backtra
13e0: 63 65 3d 2e 2b 24 7d 20 7b 0a 20 20 20 20 20 20  ce=.+$} {.      
13f0: 20 20 66 6f 72 65 61 63 68 20 7b 64 75 6d 6d 79    foreach {dummy
1400: 20 63 6d 64 6c 69 6e 65 61 72 67 28 62 61 63 6b   cmdlinearg(back
1410: 74 72 61 63 65 29 7d 20 5b 73 70 6c 69 74 20 24  trace)} [split $
1420: 61 20 3d 5d 20 62 72 65 61 6b 0a 20 20 20 20 20  a =] break.     
1430: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
1440: 62 75 67 5f 62 61 63 6b 74 72 61 63 65 20 24 76  bug_backtrace $v
1450: 61 6c 75 65 0a 20 20 20 20 20 20 7d 0a 20 20 20  alue.      }.   
1460: 20 20 20 7b 5e 2d 2b 62 69 6e 61 72 79 6c 6f 67     {^-+binarylog
1470: 3d 2e 2b 24 7d 20 7b 0a 20 20 20 20 20 20 20 20  =.+$} {.        
1480: 66 6f 72 65 61 63 68 20 7b 64 75 6d 6d 79 20 63  foreach {dummy c
1490: 6d 64 6c 69 6e 65 61 72 67 28 62 69 6e 61 72 79  mdlinearg(binary
14a0: 6c 6f 67 29 7d 20 5b 73 70 6c 69 74 20 24 61 20  log)} [split $a 
14b0: 3d 5d 20 62 72 65 61 6b 0a 20 20 20 20 20 20 7d  =] break.      }
14c0: 0a 20 20 20 20 20 20 7b 5e 2d 2b 73 6f 61 6b 3d  .      {^-+soak=
14d0: 2e 2b 24 7d 20 7b 0a 20 20 20 20 20 20 20 20 66  .+$} {.        f
14e0: 6f 72 65 61 63 68 20 7b 64 75 6d 6d 79 20 63 6d  oreach {dummy cm
14f0: 64 6c 69 6e 65 61 72 67 28 73 6f 61 6b 29 7d 20  dlinearg(soak)} 
1500: 5b 73 70 6c 69 74 20 24 61 20 3d 5d 20 62 72 65  [split $a =] bre
1510: 61 6b 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a  ak.        set :
1520: 3a 47 28 69 73 73 6f 61 6b 29 20 24 63 6d 64 6c  :G(issoak) $cmdl
1530: 69 6e 65 61 72 67 28 73 6f 61 6b 29 0a 20 20 20  inearg(soak).   
1540: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
1550: 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70  lt {.        lap
1560: 70 65 6e 64 20 6c 65 66 74 6f 76 65 72 20 24 61  pend leftover $a
1570: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1580: 20 7d 0a 20 20 73 65 74 20 61 72 67 76 20 24 6c   }.  set argv $l
1590: 65 66 74 6f 76 65 72 0a 0a 20 20 23 20 49 6e 73  eftover..  # Ins
15a0: 74 61 6c 6c 20 74 68 65 20 6d 61 6c 6c 6f 63 20  tall the malloc 
15b0: 6c 61 79 65 72 20 75 73 65 64 20 74 6f 20 69 6e  layer used to in
15c0: 6a 65 63 74 20 4f 4f 4d 20 65 72 72 6f 72 73 2e  ject OOM errors.
15d0: 20 41 6e 64 20 74 68 65 20 27 61 75 74 6f 6d 61   And the 'automa
15e0: 74 69 63 27 0a 20 20 23 20 65 78 74 65 6e 73 69  tic'.  # extensi
15f0: 6f 6e 73 2e 20 54 68 69 73 20 6f 6e 6c 79 20 6e  ons. This only n
1600: 65 65 64 73 20 74 6f 20 62 65 20 64 6f 6e 65 20  eeds to be done 
1610: 6f 6e 63 65 20 66 6f 72 20 74 68 65 20 70 72 6f  once for the pro
1620: 63 65 73 73 2e 0a 20 20 23 0a 20 20 73 71 6c 69  cess..  #.  sqli
1630: 74 65 33 5f 73 68 75 74 64 6f 77 6e 20 0a 20 20  te3_shutdown .  
1640: 69 6e 73 74 61 6c 6c 5f 6d 61 6c 6c 6f 63 5f 66  install_malloc_f
1650: 61 75 6c 74 73 69 6d 20 31 20 0a 20 20 73 71 6c  aultsim 1 .  sql
1660: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a  ite3_initialize.
1670: 20 20 61 75 74 6f 69 6e 73 74 61 6c 6c 5f 74 65    autoinstall_te
1680: 73 74 5f 66 75 6e 63 74 69 6f 6e 73 0a 0a 20 20  st_functions..  
1690: 23 20 49 66 20 74 68 65 20 2d 2d 62 69 6e 61 72  # If the --binar
16a0: 79 6c 6f 67 20 6f 70 74 69 6f 6e 20 77 61 73 20  ylog option was 
16b0: 73 70 65 63 69 66 69 65 64 2c 20 63 72 65 61 74  specified, creat
16c0: 65 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 56 46  e the logging VF
16d0: 53 2e 20 54 68 69 73 0a 20 20 23 20 63 61 6c 6c  S. This.  # call
16e0: 20 69 6e 73 74 61 6c 6c 73 20 74 68 65 20 6e 65   installs the ne
16f0: 77 20 56 46 53 20 61 73 20 74 68 65 20 64 65 66  w VFS as the def
1700: 61 75 6c 74 20 66 6f 72 20 61 6c 6c 20 53 51 4c  ault for all SQL
1710: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ite connections.
1720: 0a 20 20 23 0a 20 20 69 66 20 7b 24 63 6d 64 6c  .  #.  if {$cmdl
1730: 69 6e 65 61 72 67 28 62 69 6e 61 72 79 6c 6f 67  inearg(binarylog
1740: 29 7d 20 7b 0a 20 20 20 20 76 66 73 6c 6f 67 20  )} {.    vfslog 
1750: 6e 65 77 20 62 69 6e 61 72 79 6c 6f 67 20 7b 7d  new binarylog {}
1760: 20 76 66 73 6c 6f 67 2e 62 69 6e 0a 20 20 7d 0a   vfslog.bin.  }.
1770: 0a 20 20 23 20 53 65 74 20 74 68 65 20 62 61 63  .  # Set the bac
1780: 6b 74 72 61 63 65 20 64 65 70 74 68 2c 20 69 66  ktrace depth, if
1790: 20 6d 61 6c 6c 6f 63 20 74 72 61 63 69 6e 67 20   malloc tracing 
17a0: 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 23 0a  is enabled..  #.
17b0: 20 20 69 66 20 7b 24 63 6d 64 6c 69 6e 65 61 72    if {$cmdlinear
17c0: 67 28 6d 61 6c 6c 6f 63 74 72 61 63 65 29 7d 20  g(malloctrace)} 
17d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65  {.    sqlite3_me
17e0: 6d 64 65 62 75 67 5f 62 61 63 6b 74 72 61 63 65  mdebug_backtrace
17f0: 20 24 63 6d 64 6c 69 6e 65 61 72 67 28 62 61 63   $cmdlinearg(bac
1800: 6b 74 72 61 63 65 29 0a 20 20 7d 0a 7d 0a 0a 23  ktrace).  }.}..#
1810: 20 55 70 64 61 74 65 20 74 68 65 20 73 6f 66 74   Update the soft
1820: 2d 68 65 61 70 2d 6c 69 6d 69 74 20 65 61 63 68  -heap-limit each
1830: 20 74 69 6d 65 20 74 68 69 73 20 73 63 72 69 70   time this scrip
1840: 74 20 69 73 20 72 75 6e 2e 20 49 6e 20 74 68 61  t is run. In tha
1850: 74 0a 23 20 77 61 79 20 69 66 20 61 6e 20 69 6e  t.# way if an in
1860: 64 69 76 69 64 75 61 6c 20 74 65 73 74 20 66 69  dividual test fi
1870: 6c 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 73  le changes the s
1880: 6f 66 74 2d 68 65 61 70 2d 6c 69 6d 69 74 2c 20  oft-heap-limit, 
1890: 69 74 0a 23 20 77 69 6c 6c 20 62 65 20 72 65 73  it.# will be res
18a0: 65 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  et at the start 
18b0: 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65 73 74  of the next test
18c0: 20 66 69 6c 65 2e 0a 23 0a 73 71 6c 69 74 65 33   file..#.sqlite3
18d0: 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
18e0: 20 24 63 6d 64 6c 69 6e 65 61 72 67 28 73 6f 66   $cmdlinearg(sof
18f0: 74 2d 68 65 61 70 2d 6c 69 6d 69 74 29 0a 0a 23  t-heap-limit)..#
1900: 20 43 72 65 61 74 65 20 61 20 74 65 73 74 20 64   Create a test d
1910: 61 74 61 62 61 73 65 0a 23 0a 70 72 6f 63 20 72  atabase.#.proc r
1920: 65 73 65 74 5f 64 62 20 7b 7d 20 7b 0a 20 20 63  eset_db {} {.  c
1930: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
1940: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
1950: 6f 72 63 65 20 74 65 73 74 2e 64 62 0a 20 20 66  orce test.db.  f
1960: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
1970: 65 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  e test.db-journa
1980: 6c 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20  l.  file delete 
1990: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77  -force test.db-w
19a0: 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  al.  sqlite3 db 
19b0: 2e 2f 74 65 73 74 2e 64 62 0a 20 20 73 65 74 20  ./test.db.  set 
19c0: 3a 3a 44 42 20 5b 73 71 6c 69 74 65 33 5f 63 6f  ::DB [sqlite3_co
19d0: 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
19e0: 20 64 62 5d 0a 20 20 69 66 20 7b 5b 69 6e 66 6f   db].  if {[info
19f0: 20 65 78 69 73 74 73 20 3a 3a 53 45 54 55 50 5f   exists ::SETUP_
1a00: 53 51 4c 5d 7d 20 7b 0a 20 20 20 20 64 62 20 65  SQL]} {.    db e
1a10: 76 61 6c 20 24 3a 3a 53 45 54 55 50 5f 53 51 4c  val $::SETUP_SQL
1a20: 0a 20 20 7d 0a 7d 0a 72 65 73 65 74 5f 64 62 0a  .  }.}.reset_db.
1a30: 0a 23 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .# Abort early i
1a40: 66 20 74 68 69 73 20 73 63 72 69 70 74 20 68 61  f this script ha
1a50: 73 20 62 65 65 6e 20 72 75 6e 20 62 65 66 6f 72  s been run befor
1a60: 65 2e 0a 23 0a 69 66 20 7b 5b 69 6e 66 6f 20 65  e..#.if {[info e
1a70: 78 69 73 74 73 20 54 43 28 63 6f 75 6e 74 29 5d  xists TC(count)]
1a80: 7d 20 72 65 74 75 72 6e 0a 0a 23 20 49 6e 69 74  } return..# Init
1a90: 69 61 6c 69 7a 65 20 74 68 65 20 74 65 73 74 20  ialize the test 
1aa0: 63 6f 75 6e 74 65 72 73 20 61 6e 64 20 73 65 74  counters and set
1ab0: 20 75 70 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 20   up commands to 
1ac0: 61 63 63 65 73 73 20 74 68 65 6d 2e 0a 23 20 4f  access them..# O
1ad0: 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
1ae0: 73 6c 61 76 65 20 69 6e 74 65 72 70 72 65 74 65  slave interprete
1af0: 72 2c 20 73 65 74 20 75 70 20 61 6c 69 61 73 65  r, set up aliase
1b00: 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 0a 23  s to write the.#
1b10: 20 63 6f 75 6e 74 65 72 73 20 69 6e 20 74 68 65   counters in the
1b20: 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65   parent interpre
1b30: 74 65 72 2e 0a 23 0a 69 66 20 7b 30 3d 3d 5b 69  ter..#.if {0==[i
1b40: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 53 4c 41  nfo exists ::SLA
1b50: 56 45 5d 7d 20 7b 0a 20 20 73 65 74 20 54 43 28  VE]} {.  set TC(
1b60: 65 72 72 6f 72 73 29 20 20 20 20 30 0a 20 20 73  errors)    0.  s
1b70: 65 74 20 54 43 28 63 6f 75 6e 74 29 20 20 20 20  et TC(count)    
1b80: 20 30 0a 20 20 73 65 74 20 54 43 28 66 61 69 6c   0.  set TC(fail
1b90: 5f 6c 69 73 74 29 20 5b 6c 69 73 74 5d 0a 20 20  _list) [list].  
1ba0: 73 65 74 20 54 43 28 6f 6d 69 74 5f 6c 69 73 74  set TC(omit_list
1bb0: 29 20 5b 6c 69 73 74 5d 0a 0a 20 20 70 72 6f 63  ) [list]..  proc
1bc0: 20 73 65 74 5f 74 65 73 74 5f 63 6f 75 6e 74 65   set_test_counte
1bd0: 72 20 7b 63 6f 75 6e 74 65 72 20 61 72 67 73 7d  r {counter args}
1be0: 20 7b 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e   {.    if {[llen
1bf0: 67 74 68 20 24 61 72 67 73 5d 7d 20 7b 0a 20 20  gth $args]} {.  
1c00: 20 20 20 20 73 65 74 20 3a 3a 54 43 28 24 63 6f      set ::TC($co
1c10: 75 6e 74 65 72 29 20 5b 6c 69 6e 64 65 78 20 24  unter) [lindex $
1c20: 61 72 67 73 20 30 5d 0a 20 20 20 20 7d 0a 20 20  args 0].    }.  
1c30: 20 20 73 65 74 20 3a 3a 54 43 28 24 63 6f 75 6e    set ::TC($coun
1c40: 74 65 72 29 0a 20 20 7d 0a 7d 0a 0a 23 20 52 65  ter).  }.}..# Re
1c50: 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
1c60: 61 74 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  at a sequence of
1c70: 20 74 65 73 74 73 20 77 65 72 65 20 6f 6d 69 74   tests were omit
1c80: 74 65 64 2e 0a 23 0a 70 72 6f 63 20 6f 6d 69 74  ted..#.proc omit
1c90: 5f 74 65 73 74 20 7b 6e 61 6d 65 20 72 65 61 73  _test {name reas
1ca0: 6f 6e 7d 20 7b 0a 20 20 73 65 74 20 6f 6d 69 74  on} {.  set omit
1cb0: 4c 69 73 74 20 5b 73 65 74 5f 74 65 73 74 5f 63  List [set_test_c
1cc0: 6f 75 6e 74 65 72 20 6f 6d 69 74 5f 6c 69 73 74  ounter omit_list
1cd0: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 6f 6d 69 74  ].  lappend omit
1ce0: 4c 69 73 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65  List [list $name
1cf0: 20 24 72 65 61 73 6f 6e 5d 0a 20 20 73 65 74 5f   $reason].  set_
1d00: 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 6f 6d 69  test_counter omi
1d10: 74 5f 6c 69 73 74 20 24 6f 6d 69 74 4c 69 73 74  t_list $omitList
1d20: 0a 7d 0a 0a 23 20 52 65 63 6f 72 64 20 74 68 65  .}..# Record the
1d30: 20 66 61 63 74 20 74 68 61 74 20 61 20 74 65 73   fact that a tes
1d40: 74 20 66 61 69 6c 65 64 2e 0a 23 0a 70 72 6f 63  t failed..#.proc
1d50: 20 66 61 69 6c 5f 74 65 73 74 20 7b 6e 61 6d 65   fail_test {name
1d60: 7d 20 7b 0a 20 20 73 65 74 20 66 20 5b 73 65 74  } {.  set f [set
1d70: 5f 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 66 61  _test_counter fa
1d80: 69 6c 5f 6c 69 73 74 5d 0a 20 20 6c 61 70 70 65  il_list].  lappe
1d90: 6e 64 20 66 20 24 6e 61 6d 65 0a 20 20 73 65 74  nd f $name.  set
1da0: 5f 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 66 61  _test_counter fa
1db0: 69 6c 5f 6c 69 73 74 20 24 66 0a 20 20 73 65 74  il_list $f.  set
1dc0: 5f 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 65 72  _test_counter er
1dd0: 72 6f 72 73 20 5b 65 78 70 72 20 5b 73 65 74 5f  rors [expr [set_
1de0: 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 65 72 72  test_counter err
1df0: 6f 72 73 5d 20 2b 20 31 5d 0a 0a 20 20 73 65 74  ors] + 1]..  set
1e00: 20 6e 46 61 69 6c 20 5b 73 65 74 5f 74 65 73 74   nFail [set_test
1e10: 5f 63 6f 75 6e 74 65 72 20 65 72 72 6f 72 73 5d  _counter errors]
1e20: 0a 20 20 69 66 20 7b 24 6e 46 61 69 6c 3e 3d 24  .  if {$nFail>=$
1e30: 3a 3a 63 6d 64 6c 69 6e 65 61 72 67 28 6d 61 78  ::cmdlinearg(max
1e40: 65 72 72 6f 72 29 7d 20 7b 0a 20 20 20 20 70 75  error)} {.    pu
1e50: 74 73 20 22 2a 2a 2a 20 47 69 76 69 6e 67 20 75  ts "*** Giving u
1e60: 70 2e 2e 2e 22 0a 20 20 20 20 66 69 6e 61 6c 69  p...".    finali
1e70: 7a 65 5f 74 65 73 74 69 6e 67 0a 20 20 7d 0a 7d  ze_testing.  }.}
1e80: 0a 0a 23 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  ..# Increment th
1e90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74  e number of test
1ea0: 73 20 72 75 6e 0a 23 0a 70 72 6f 63 20 69 6e 63  s run.#.proc inc
1eb0: 72 5f 6e 74 65 73 74 20 7b 7d 20 7b 0a 20 20 73  r_ntest {} {.  s
1ec0: 65 74 5f 74 65 73 74 5f 63 6f 75 6e 74 65 72 20  et_test_counter 
1ed0: 63 6f 75 6e 74 20 5b 65 78 70 72 20 5b 73 65 74  count [expr [set
1ee0: 5f 74 65 73 74 5f 63 6f 75 6e 74 65 72 20 63 6f  _test_counter co
1ef0: 75 6e 74 5d 20 2b 20 31 5d 0a 7d 0a 0a 0a 23 20  unt] + 1].}...# 
1f00: 49 6e 76 6f 6b 65 20 74 68 65 20 64 6f 5f 74 65  Invoke the do_te
1f10: 73 74 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  st procedure to 
1f20: 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 74 65 73  run a single tes
1f30: 74 20 0a 23 0a 70 72 6f 63 20 64 6f 5f 74 65 73  t .#.proc do_tes
1f40: 74 20 7b 6e 61 6d 65 20 63 6d 64 20 65 78 70 65  t {name cmd expe
1f50: 63 74 65 64 7d 20 7b 0a 0a 20 20 67 6c 6f 62 61  cted} {..  globa
1f60: 6c 20 61 72 67 76 20 63 6d 64 6c 69 6e 65 61 72  l argv cmdlinear
1f70: 67 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d  g..  sqlite3_mem
1f80: 64 65 62 75 67 5f 73 65 74 74 69 74 6c 65 20 24  debug_settitle $
1f90: 6e 61 6d 65 0a 0a 20 20 69 66 20 7b 5b 6c 6c 65  name..  if {[lle
1fa0: 6e 67 74 68 20 24 61 72 67 76 5d 3d 3d 30 7d 20  ngth $argv]==0} 
1fb0: 7b 20 0a 20 20 20 20 73 65 74 20 67 6f 20 31 0a  { .    set go 1.
1fc0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
1fd0: 65 74 20 67 6f 20 30 0a 20 20 20 20 66 6f 72 65  et go 0.    fore
1fe0: 61 63 68 20 70 61 74 74 65 72 6e 20 24 61 72 67  ach pattern $arg
1ff0: 76 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  v {.      if {[s
2000: 74 72 69 6e 67 20 6d 61 74 63 68 20 24 70 61 74  tring match $pat
2010: 74 65 72 6e 20 24 6e 61 6d 65 5d 7d 20 7b 0a 20  tern $name]} {. 
2020: 20 20 20 20 20 20 20 73 65 74 20 67 6f 20 31 0a         set go 1.
2030: 20 20 20 20 20 20 20 20 62 72 65 61 6b 0a 20 20          break.  
2040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2050: 20 20 69 66 20 7b 21 24 67 6f 7d 20 72 65 74 75    if {!$go} retu
2060: 72 6e 0a 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20  rn..  if {[info 
2070: 65 78 69 73 74 73 20 3a 3a 47 28 70 65 72 6d 3a  exists ::G(perm:
2080: 6e 61 6d 65 29 5d 7d 20 7b 0a 20 20 20 20 73 65  name)]} {.    se
2090: 74 20 6e 61 6d 65 20 22 24 3a 3a 47 28 70 65 72  t name "$::G(per
20a0: 6d 3a 6e 61 6d 65 29 24 6e 61 6d 65 22 0a 20 20  m:name)$name".  
20b0: 7d 0a 0a 20 20 69 6e 63 72 5f 6e 74 65 73 74 0a  }..  incr_ntest.
20c0: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
20d0: 65 20 24 6e 61 6d 65 2e 2e 2e 0a 20 20 66 6c 75  e $name....  flu
20e0: 73 68 20 73 74 64 6f 75 74 0a 20 20 69 66 20 7b  sh stdout.  if {
20f0: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
2100: 23 30 20 22 24 63 6d 64 3b 5c 6e 22 7d 20 72 65  #0 "$cmd;\n"} re
2110: 73 75 6c 74 5d 7d 20 7b 0a 20 20 20 20 70 75 74  sult]} {.    put
2120: 73 20 22 5c 6e 45 72 72 6f 72 3a 20 24 72 65 73  s "\nError: $res
2130: 75 6c 74 22 0a 20 20 20 20 66 61 69 6c 5f 74 65  ult".    fail_te
2140: 73 74 20 24 6e 61 6d 65 0a 20 20 7d 20 65 6c 73  st $name.  } els
2150: 65 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f 6d  eif {[string com
2160: 70 61 72 65 20 24 72 65 73 75 6c 74 20 24 65 78  pare $result $ex
2170: 70 65 63 74 65 64 5d 7d 20 7b 0a 20 20 20 20 70  pected]} {.    p
2180: 75 74 73 20 22 5c 6e 45 78 70 65 63 74 65 64 3a  uts "\nExpected:
2190: 20 5c 5b 24 65 78 70 65 63 74 65 64 5c 5d 5c 6e   \[$expected\]\n
21a0: 20 20 20 20 20 47 6f 74 3a 20 5c 5b 24 72 65 73       Got: \[$res
21b0: 75 6c 74 5c 5d 22 0a 20 20 20 20 66 61 69 6c 5f  ult\]".    fail_
21c0: 74 65 73 74 20 24 6e 61 6d 65 0a 20 20 7d 20 65  test $name.  } e
21d0: 6c 73 65 20 7b 0a 20 20 20 20 70 75 74 73 20 22  lse {.    puts "
21e0: 20 4f 6b 22 0a 20 20 7d 0a 20 20 66 6c 75 73 68   Ok".  }.  flush
21f0: 20 73 74 64 6f 75 74 0a 7d 0a 0a 23 20 52 75 6e   stdout.}..# Run
2200: 20 61 6e 20 53 51 4c 20 73 63 72 69 70 74 2e 20   an SQL script. 
2210: 20 0a 23 20 52 65 74 75 72 6e 20 74 68 65 20 6e   .# Return the n
2220: 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
2230: 63 6f 6e 64 73 20 70 65 72 20 73 74 61 74 65 6d  conds per statem
2240: 65 6e 74 2e 0a 23 0a 70 72 6f 63 20 73 70 65 65  ent..#.proc spee
2250: 64 5f 74 72 69 61 6c 20 7b 6e 61 6d 65 20 6e 75  d_trial {name nu
2260: 6d 73 74 6d 74 20 75 6e 69 74 73 20 73 71 6c 7d  mstmt units sql}
2270: 20 7b 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77   {.  puts -nonew
2280: 6c 69 6e 65 20 5b 66 6f 72 6d 61 74 20 7b 25 2d  line [format {%-
2290: 32 31 2e 32 31 73 20 7d 20 24 6e 61 6d 65 2e 2e  21.21s } $name..
22a0: 2e 5d 0a 20 20 66 6c 75 73 68 20 73 74 64 6f 75  .].  flush stdou
22b0: 74 0a 20 20 73 65 74 20 73 70 65 65 64 20 5b 74  t.  set speed [t
22c0: 69 6d 65 20 7b 73 71 6c 69 74 65 33 5f 65 78 65  ime {sqlite3_exe
22d0: 63 5f 6e 72 20 64 62 20 24 73 71 6c 7d 5d 0a 20  c_nr db $sql}]. 
22e0: 20 73 65 74 20 74 6d 20 5b 6c 69 6e 64 65 78 20   set tm [lindex 
22f0: 24 73 70 65 65 64 20 30 5d 0a 20 20 69 66 20 7b  $speed 0].  if {
2300: 24 74 6d 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20  $tm == 0} {.    
2310: 73 65 74 20 72 61 74 65 20 5b 66 6f 72 6d 61 74  set rate [format
2320: 20 25 32 30 73 20 22 6d 61 6e 79 22 5d 0a 20 20   %20s "many"].  
2330: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74  } else {.    set
2340: 20 72 61 74 65 20 5b 66 6f 72 6d 61 74 20 25 32   rate [format %2
2350: 30 2e 35 66 20 5b 65 78 70 72 20 7b 31 30 30 30  0.5f [expr {1000
2360: 30 30 30 2e 30 2a 24 6e 75 6d 73 74 6d 74 2f 24  000.0*$numstmt/$
2370: 74 6d 7d 5d 5d 0a 20 20 7d 0a 20 20 73 65 74 20  tm}]].  }.  set 
2380: 75 32 20 24 75 6e 69 74 73 2f 73 0a 20 20 70 75  u2 $units/s.  pu
2390: 74 73 20 5b 66 6f 72 6d 61 74 20 7b 25 31 32 64  ts [format {%12d
23a0: 20 75 53 20 25 73 20 25 73 7d 20 24 74 6d 20 24   uS %s %s} $tm $
23b0: 72 61 74 65 20 24 75 32 5d 0a 20 20 67 6c 6f 62  rate $u2].  glob
23c0: 61 6c 20 74 6f 74 61 6c 5f 74 69 6d 65 0a 20 20  al total_time.  
23d0: 73 65 74 20 74 6f 74 61 6c 5f 74 69 6d 65 20 5b  set total_time [
23e0: 65 78 70 72 20 7b 24 74 6f 74 61 6c 5f 74 69 6d  expr {$total_tim
23f0: 65 2b 24 74 6d 7d 5d 0a 7d 0a 70 72 6f 63 20 73  e+$tm}].}.proc s
2400: 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20 7b  peed_trial_tcl {
2410: 6e 61 6d 65 20 6e 75 6d 73 74 6d 74 20 75 6e 69  name numstmt uni
2420: 74 73 20 73 63 72 69 70 74 7d 20 7b 0a 20 20 70  ts script} {.  p
2430: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5b  uts -nonewline [
2440: 66 6f 72 6d 61 74 20 7b 25 2d 32 31 2e 32 31 73  format {%-21.21s
2450: 20 7d 20 24 6e 61 6d 65 2e 2e 2e 5d 0a 20 20 66   } $name...].  f
2460: 6c 75 73 68 20 73 74 64 6f 75 74 0a 20 20 73 65  lush stdout.  se
2470: 74 20 73 70 65 65 64 20 5b 74 69 6d 65 20 7b 65  t speed [time {e
2480: 76 61 6c 20 24 73 63 72 69 70 74 7d 5d 0a 20 20  val $script}].  
2490: 73 65 74 20 74 6d 20 5b 6c 69 6e 64 65 78 20 24  set tm [lindex $
24a0: 73 70 65 65 64 20 30 5d 0a 20 20 69 66 20 7b 24  speed 0].  if {$
24b0: 74 6d 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20 73  tm == 0} {.    s
24c0: 65 74 20 72 61 74 65 20 5b 66 6f 72 6d 61 74 20  et rate [format 
24d0: 25 32 30 73 20 22 6d 61 6e 79 22 5d 0a 20 20 7d  %20s "many"].  }
24e0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20   else {.    set 
24f0: 72 61 74 65 20 5b 66 6f 72 6d 61 74 20 25 32 30  rate [format %20
2500: 2e 35 66 20 5b 65 78 70 72 20 7b 31 30 30 30 30  .5f [expr {10000
2510: 30 30 2e 30 2a 24 6e 75 6d 73 74 6d 74 2f 24 74  00.0*$numstmt/$t
2520: 6d 7d 5d 5d 0a 20 20 7d 0a 20 20 73 65 74 20 75  m}]].  }.  set u
2530: 32 20 24 75 6e 69 74 73 2f 73 0a 20 20 70 75 74  2 $units/s.  put
2540: 73 20 5b 66 6f 72 6d 61 74 20 7b 25 31 32 64 20  s [format {%12d 
2550: 75 53 20 25 73 20 25 73 7d 20 24 74 6d 20 24 72  uS %s %s} $tm $r
2560: 61 74 65 20 24 75 32 5d 0a 20 20 67 6c 6f 62 61  ate $u2].  globa
2570: 6c 20 74 6f 74 61 6c 5f 74 69 6d 65 0a 20 20 73  l total_time.  s
2580: 65 74 20 74 6f 74 61 6c 5f 74 69 6d 65 20 5b 65  et total_time [e
2590: 78 70 72 20 7b 24 74 6f 74 61 6c 5f 74 69 6d 65  xpr {$total_time
25a0: 2b 24 74 6d 7d 5d 0a 7d 0a 70 72 6f 63 20 73 70  +$tm}].}.proc sp
25b0: 65 65 64 5f 74 72 69 61 6c 5f 69 6e 69 74 20 7b  eed_trial_init {
25c0: 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  name} {.  global
25d0: 20 74 6f 74 61 6c 5f 74 69 6d 65 0a 20 20 73 65   total_time.  se
25e0: 74 20 74 6f 74 61 6c 5f 74 69 6d 65 20 30 0a 7d  t total_time 0.}
25f0: 0a 70 72 6f 63 20 73 70 65 65 64 5f 74 72 69 61  .proc speed_tria
2600: 6c 5f 73 75 6d 6d 61 72 79 20 7b 6e 61 6d 65 7d  l_summary {name}
2610: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 74 6f 74 61   {.  global tota
2620: 6c 5f 74 69 6d 65 0a 20 20 70 75 74 73 20 5b 66  l_time.  puts [f
2630: 6f 72 6d 61 74 20 7b 25 2d 32 31 2e 32 31 73 20  ormat {%-21.21s 
2640: 25 31 32 64 20 75 53 20 54 4f 54 41 4c 7d 20 24  %12d uS TOTAL} $
2650: 6e 61 6d 65 20 24 74 6f 74 61 6c 5f 74 69 6d 65  name $total_time
2660: 5d 0a 7d 0a 0a 23 20 52 75 6e 20 74 68 69 73 20  ].}..# Run this 
2670: 72 6f 75 74 69 6e 65 20 6c 61 73 74 0a 23 0a 70  routine last.#.p
2680: 72 6f 63 20 66 69 6e 69 73 68 5f 74 65 73 74 20  roc finish_test 
2690: 7b 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62  {} {.  catch {db
26a0: 20 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20   close}.  catch 
26b0: 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 20 20 63 61  {db2 close}.  ca
26c0: 74 63 68 20 7b 64 62 33 20 63 6c 6f 73 65 7d 0a  tch {db3 close}.
26d0: 20 20 69 66 20 7b 30 3d 3d 5b 69 6e 66 6f 20 65    if {0==[info e
26e0: 78 69 73 74 73 20 3a 3a 53 4c 41 56 45 5d 7d 20  xists ::SLAVE]} 
26f0: 7b 20 66 69 6e 61 6c 69 7a 65 5f 74 65 73 74 69  { finalize_testi
2700: 6e 67 20 7d 0a 7d 0a 70 72 6f 63 20 66 69 6e 61  ng }.}.proc fina
2710: 6c 69 7a 65 5f 74 65 73 74 69 6e 67 20 7b 7d 20  lize_testing {} 
2720: 7b 0a 20 20 67 6c 6f 62 61 6c 20 73 71 6c 69 74  {.  global sqlit
2730: 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
2740: 74 0a 0a 20 20 73 65 74 20 6f 6d 69 74 4c 69 73  t..  set omitLis
2750: 74 20 5b 73 65 74 5f 74 65 73 74 5f 63 6f 75 6e  t [set_test_coun
2760: 74 65 72 20 6f 6d 69 74 5f 6c 69 73 74 5d 0a 0a  ter omit_list]..
2770: 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73    catch {db clos
2780: 65 7d 0a 20 20 63 61 74 63 68 20 7b 64 62 32 20  e}.  catch {db2 
2790: 63 6c 6f 73 65 7d 0a 20 20 63 61 74 63 68 20 7b  close}.  catch {
27a0: 64 62 33 20 63 6c 6f 73 65 7d 0a 0a 20 20 76 66  db3 close}..  vf
27b0: 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 20 20  s_unlink_test.  
27c0: 73 71 6c 69 74 65 33 20 64 62 20 7b 7d 0a 20 20  sqlite3 db {}.  
27d0: 23 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f  # sqlite3_clear_
27e0: 74 73 64 5f 6d 65 6d 64 65 62 75 67 0a 20 20 64  tsd_memdebug.  d
27f0: 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  b close.  sqlite
2800: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2810: 65 6e 73 69 6f 6e 0a 0a 20 20 73 71 6c 69 74 65  ension..  sqlite
2820: 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
2830: 74 20 30 0a 20 20 73 65 74 20 6e 54 65 73 74 20  t 0.  set nTest 
2840: 5b 69 6e 63 72 5f 6e 74 65 73 74 5d 0a 20 20 73  [incr_ntest].  s
2850: 65 74 20 6e 45 72 72 20 5b 73 65 74 5f 74 65 73  et nErr [set_tes
2860: 74 5f 63 6f 75 6e 74 65 72 20 65 72 72 6f 72 73  t_counter errors
2870: 5d 0a 0a 20 20 70 75 74 73 20 22 24 6e 45 72 72  ]..  puts "$nErr
2880: 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 24   errors out of $
2890: 6e 54 65 73 74 20 74 65 73 74 73 22 0a 20 20 69  nTest tests".  i
28a0: 66 20 7b 24 6e 45 72 72 3e 30 7d 20 7b 0a 20 20  f {$nErr>0} {.  
28b0: 20 20 70 75 74 73 20 22 46 61 69 6c 75 72 65 73    puts "Failures
28c0: 20 6f 6e 20 74 68 65 73 65 20 74 65 73 74 73 3a   on these tests:
28d0: 20 5b 73 65 74 5f 74 65 73 74 5f 63 6f 75 6e 74   [set_test_count
28e0: 65 72 20 66 61 69 6c 5f 6c 69 73 74 5d 22 0a 20  er fail_list]". 
28f0: 20 7d 0a 20 20 72 75 6e 5f 74 68 72 65 61 64 5f   }.  run_thread_
2900: 74 65 73 74 73 20 31 0a 20 20 69 66 20 7b 5b 6c  tests 1.  if {[l
2910: 6c 65 6e 67 74 68 20 24 6f 6d 69 74 4c 69 73 74  length $omitList
2920: 5d 3e 30 7d 20 7b 0a 20 20 20 20 70 75 74 73 20  ]>0} {.    puts 
2930: 22 4f 6d 69 74 74 65 64 20 74 65 73 74 20 63 61  "Omitted test ca
2940: 73 65 73 3a 22 0a 20 20 20 20 73 65 74 20 70 72  ses:".    set pr
2950: 65 63 20 7b 7d 0a 20 20 20 20 66 6f 72 65 61 63  ec {}.    foreac
2960: 68 20 7b 72 65 63 7d 20 5b 6c 73 6f 72 74 20 24  h {rec} [lsort $
2970: 6f 6d 69 74 4c 69 73 74 5d 20 7b 0a 20 20 20 20  omitList] {.    
2980: 20 20 69 66 20 7b 24 72 65 63 3d 3d 24 70 72 65    if {$rec==$pre
2990: 63 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20  c} continue.    
29a0: 20 20 73 65 74 20 70 72 65 63 20 24 72 65 63 0a    set prec $rec.
29b0: 20 20 20 20 20 20 70 75 74 73 20 5b 66 6f 72 6d        puts [form
29c0: 61 74 20 7b 20 20 25 2d 31 32 73 20 25 73 7d 20  at {  %-12s %s} 
29d0: 5b 6c 69 6e 64 65 78 20 24 72 65 63 20 30 5d 20  [lindex $rec 0] 
29e0: 5b 6c 69 6e 64 65 78 20 24 72 65 63 20 31 5d 5d  [lindex $rec 1]]
29f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20  .    }.  }.  if 
2a00: 7b 24 6e 45 72 72 3e 30 20 26 26 20 21 5b 77 6f  {$nErr>0 && ![wo
2a10: 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 5d  rking_64bit_int]
2a20: 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 22 2a 2a  } {.    puts "**
2a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a70: 22 0a 20 20 20 20 70 75 74 73 20 22 4e 2e 42 2e  ".    puts "N.B.
2a80: 3a 20 20 54 68 65 20 76 65 72 73 69 6f 6e 20 6f  :  The version o
2a90: 66 20 54 43 4c 20 74 68 61 74 20 79 6f 75 20 75  f TCL that you u
2aa0: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 69  sed to build thi
2ab0: 73 20 74 65 73 74 20 68 61 72 6e 65 73 73 22 0a  s test harness".
2ac0: 20 20 20 20 70 75 74 73 20 22 69 73 20 64 65 66      puts "is def
2ad0: 65 63 74 69 76 65 20 69 6e 20 74 68 61 74 20 69  ective in that i
2ae0: 74 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  t does not suppo
2af0: 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  rt 64-bit intege
2b00: 72 73 2e 20 20 53 6f 6d 65 20 6f 72 22 0a 20 20  rs.  Some or".  
2b10: 20 20 70 75 74 73 20 22 61 6c 6c 20 6f 66 20 74    puts "all of t
2b20: 68 65 20 74 65 73 74 20 66 61 69 6c 75 72 65 73  he test failures
2b30: 20 61 62 6f 76 65 20 6d 69 67 68 74 20 62 65 20   above might be 
2b40: 61 20 72 65 73 75 6c 74 20 66 72 6f 6d 20 74 68  a result from th
2b50: 69 73 20 64 65 66 65 63 74 22 0a 20 20 20 20 70  is defect".    p
2b60: 75 74 73 20 22 69 6e 20 79 6f 75 72 20 54 43 4c  uts "in your TCL
2b70: 20 62 75 69 6c 64 2e 22 0a 20 20 20 20 70 75 74   build.".    put
2b80: 73 20 22 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s "*************
2b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc0: 2a 2a 2a 2a 2a 22 0a 20 20 7d 0a 20 20 69 66 20  *****".  }.  if 
2bd0: 7b 24 3a 3a 63 6d 64 6c 69 6e 65 61 72 67 28 62  {$::cmdlinearg(b
2be0: 69 6e 61 72 79 6c 6f 67 29 7d 20 7b 0a 20 20 20  inarylog)} {.   
2bf0: 20 76 66 73 6c 6f 67 20 66 69 6e 61 6c 69 7a 65   vfslog finalize
2c00: 20 62 69 6e 61 72 79 6c 6f 67 0a 20 20 7d 0a 20   binarylog.  }. 
2c10: 20 69 66 20 7b 24 73 71 6c 69 74 65 5f 6f 70 65   if {$sqlite_ope
2c20: 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 7d 20 7b 0a  n_file_count} {.
2c30: 20 20 20 20 70 75 74 73 20 22 24 73 71 6c 69 74      puts "$sqlit
2c40: 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  e_open_file_coun
2c50: 74 20 66 69 6c 65 73 20 77 65 72 65 20 6c 65 66  t files were lef
2c60: 74 20 6f 70 65 6e 22 0a 20 20 20 20 69 6e 63 72  t open".    incr
2c70: 20 6e 45 72 72 0a 20 20 7d 0a 20 20 69 66 20 7b   nErr.  }.  if {
2c80: 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f  [sqlite3_memory_
2c90: 75 73 65 64 5d 3e 30 7d 20 7b 0a 20 20 20 20 70  used]>0} {.    p
2ca0: 75 74 73 20 22 55 6e 66 72 65 65 64 20 6d 65 6d  uts "Unfreed mem
2cb0: 6f 72 79 3a 20 5b 73 71 6c 69 74 65 33 5f 6d 65  ory: [sqlite3_me
2cc0: 6d 6f 72 79 5f 75 73 65 64 5d 20 62 79 74 65 73  mory_used] bytes
2cd0: 22 0a 20 20 20 20 69 6e 63 72 20 6e 45 72 72 0a  ".    incr nErr.
2ce0: 20 20 20 20 69 66 63 61 70 61 62 6c 65 20 6d 65      ifcapable me
2cf0: 6d 64 65 62 75 67 7c 7c 6d 65 6d 35 7c 7c 28 6d  mdebug||mem5||(m
2d00: 65 6d 33 26 26 64 65 62 75 67 29 20 7b 0a 20 20  em3&&debug) {.  
2d10: 20 20 20 20 70 75 74 73 20 22 57 72 69 74 69 6e      puts "Writin
2d20: 67 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79  g unfreed memory
2d30: 20 6c 6f 67 20 74 6f 20 5c 22 2e 2f 6d 65 6d 6c   log to \"./meml
2d40: 65 61 6b 2e 74 78 74 5c 22 22 0a 20 20 20 20 20  eak.txt\"".     
2d50: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75   sqlite3_memdebu
2d60: 67 5f 64 75 6d 70 20 2e 2f 6d 65 6d 6c 65 61 6b  g_dump ./memleak
2d70: 2e 74 78 74 0a 20 20 20 20 7d 0a 20 20 7d 20 65  .txt.    }.  } e
2d80: 6c 73 65 20 7b 0a 20 20 20 20 70 75 74 73 20 22  lse {.    puts "
2d90: 41 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  All memory alloc
2da0: 61 74 69 6f 6e 73 20 66 72 65 65 64 20 2d 20 6e  ations freed - n
2db0: 6f 20 6c 65 61 6b 73 22 0a 20 20 20 20 69 66 63  o leaks".    ifc
2dc0: 61 70 61 62 6c 65 20 6d 65 6d 64 65 62 75 67 7c  apable memdebug|
2dd0: 7c 6d 65 6d 35 20 7b 0a 20 20 20 20 20 20 73 71  |mem5 {.      sq
2de0: 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 64  lite3_memdebug_d
2df0: 75 6d 70 20 2e 2f 6d 65 6d 75 73 61 67 65 2e 74  ump ./memusage.t
2e00: 78 74 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  xt.    }.  }.  s
2e10: 68 6f 77 5f 6d 65 6d 73 74 61 74 73 0a 20 20 70  how_memstats.  p
2e20: 75 74 73 20 22 4d 61 78 69 6d 75 6d 20 6d 65 6d  uts "Maximum mem
2e30: 6f 72 79 20 75 73 61 67 65 3a 20 5b 73 71 6c 69  ory usage: [sqli
2e40: 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77  te3_memory_highw
2e50: 61 74 65 72 20 31 5d 20 62 79 74 65 73 22 0a 20  ater 1] bytes". 
2e60: 20 70 75 74 73 20 22 43 75 72 72 65 6e 74 20 6d   puts "Current m
2e70: 65 6d 6f 72 79 20 75 73 61 67 65 3a 20 5b 73 71  emory usage: [sq
2e80: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67  lite3_memory_hig
2e90: 68 77 61 74 65 72 5d 20 62 79 74 65 73 22 0a 20  hwater] bytes". 
2ea0: 20 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 6d 61   if {[info comma
2eb0: 6e 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64  nds sqlite3_memd
2ec0: 65 62 75 67 5f 6d 61 6c 6c 6f 63 5f 63 6f 75 6e  ebug_malloc_coun
2ed0: 74 5d 20 6e 65 20 22 22 7d 20 7b 0a 20 20 20 20  t] ne ""} {.    
2ee0: 70 75 74 73 20 22 4e 75 6d 62 65 72 20 6f 66 20  puts "Number of 
2ef0: 6d 61 6c 6c 6f 63 28 29 20 20 3a 20 5b 73 71 6c  malloc()  : [sql
2f00: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 6d 61  ite3_memdebug_ma
2f10: 6c 6c 6f 63 5f 63 6f 75 6e 74 5d 20 63 61 6c 6c  lloc_count] call
2f20: 73 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24 3a 3a  s".  }.  if {$::
2f30: 63 6d 64 6c 69 6e 65 61 72 67 28 6d 61 6c 6c 6f  cmdlinearg(mallo
2f40: 63 74 72 61 63 65 29 7d 20 7b 0a 20 20 20 20 70  ctrace)} {.    p
2f50: 75 74 73 20 22 57 72 69 74 69 6e 67 20 6d 61 6c  uts "Writing mal
2f60: 6c 6f 63 73 2e 73 71 6c 2e 2e 2e 22 0a 20 20 20  locs.sql...".   
2f70: 20 6d 65 6d 64 65 62 75 67 5f 6c 6f 67 5f 73 71   memdebug_log_sq
2f80: 6c 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65  l.    sqlite3_me
2f90: 6d 64 65 62 75 67 5f 6c 6f 67 20 73 74 6f 70 0a  mdebug_log stop.
2fa0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64      sqlite3_memd
2fb0: 65 62 75 67 5f 6c 6f 67 20 63 6c 65 61 72 0a 0a  ebug_log clear..
2fc0: 20 20 20 20 69 66 20 7b 5b 73 71 6c 69 74 65 33      if {[sqlite3
2fd0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 5d 3e 30 7d  _memory_used]>0}
2fe0: 20 7b 0a 20 20 20 20 20 20 70 75 74 73 20 22 57   {.      puts "W
2ff0: 72 69 74 69 6e 67 20 6c 65 61 6b 73 2e 73 71 6c  riting leaks.sql
3000: 2e 2e 2e 22 0a 20 20 20 20 20 20 73 71 6c 69 74  ...".      sqlit
3010: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 6c 6f 67 20  e3_memdebug_log 
3020: 73 79 6e 63 0a 20 20 20 20 20 20 6d 65 6d 64 65  sync.      memde
3030: 62 75 67 5f 6c 6f 67 5f 73 71 6c 20 6c 65 61 6b  bug_log_sql leak
3040: 73 2e 73 71 6c 0a 20 20 20 20 7d 0a 20 20 7d 0a  s.sql.    }.  }.
3050: 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c 6f    foreach f [glo
3060: 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  b -nocomplain te
3070: 73 74 2e 64 62 2d 2a 2d 6a 6f 75 72 6e 61 6c 5d  st.db-*-journal]
3080: 20 7b 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65   {.    file dele
3090: 74 65 20 2d 66 6f 72 63 65 20 24 66 0a 20 20 7d  te -force $f.  }
30a0: 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67 6c  .  foreach f [gl
30b0: 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74  ob -nocomplain t
30c0: 65 73 74 2e 64 62 2d 6d 6a 2a 5d 20 7b 0a 20 20  est.db-mj*] {.  
30d0: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
30e0: 6f 72 63 65 20 24 66 0a 20 20 7d 0a 20 20 65 78  orce $f.  }.  ex
30f0: 69 74 20 5b 65 78 70 72 20 7b 24 6e 45 72 72 3e  it [expr {$nErr>
3100: 30 7d 5d 0a 7d 0a 0a 23 20 44 69 73 70 6c 61 79  0}].}..# Display
3110: 20 6d 65 6d 6f 72 79 20 73 74 61 74 69 73 74 69   memory statisti
3120: 63 73 20 66 6f 72 20 61 6e 61 6c 79 73 69 73 20  cs for analysis 
3130: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 70 75  and debugging pu
3140: 72 70 6f 73 65 73 2e 0a 23 0a 70 72 6f 63 20 73  rposes..#.proc s
3150: 68 6f 77 5f 6d 65 6d 73 74 61 74 73 20 7b 7d 20  how_memstats {} 
3160: 7b 0a 20 20 73 65 74 20 78 20 5b 73 71 6c 69 74  {.  set x [sqlit
3170: 65 33 5f 73 74 61 74 75 73 20 53 51 4c 49 54 45  e3_status SQLITE
3180: 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
3190: 53 45 44 20 30 5d 0a 20 20 73 65 74 20 79 20 5b  SED 0].  set y [
31a0: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 20 53  sqlite3_status S
31b0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
31c0: 4c 4f 43 5f 53 49 5a 45 20 30 5d 0a 20 20 73 65  LOC_SIZE 0].  se
31d0: 74 20 76 61 6c 20 5b 66 6f 72 6d 61 74 20 7b 6e  t val [format {n
31e0: 6f 77 20 25 31 30 64 20 20 6d 61 78 20 25 31 30  ow %10d  max %10
31f0: 64 20 20 6d 61 78 2d 73 69 7a 65 20 25 31 30 64  d  max-size %10d
3200: 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  } \.            
3210: 20 20 5b 6c 69 6e 64 65 78 20 24 78 20 31 5d 20    [lindex $x 1] 
3220: 5b 6c 69 6e 64 65 78 20 24 78 20 32 5d 20 5b 6c  [lindex $x 2] [l
3230: 69 6e 64 65 78 20 24 79 20 32 5d 5d 0a 20 20 70  index $y 2]].  p
3240: 75 74 73 20 22 4d 65 6d 6f 72 79 20 75 73 65 64  uts "Memory used
3250: 3a 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 22  :          $val"
3260: 0a 20 20 73 65 74 20 78 20 5b 73 71 6c 69 74 65  .  set x [sqlite
3270: 33 5f 73 74 61 74 75 73 20 53 51 4c 49 54 45 5f  3_status SQLITE_
3280: 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
3290: 5f 55 53 45 44 20 30 5d 0a 20 20 73 65 74 20 79  _USED 0].  set y
32a0: 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73   [sqlite3_status
32b0: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
32c0: 41 47 45 43 41 43 48 45 5f 53 49 5a 45 20 30 5d  AGECACHE_SIZE 0]
32d0: 0a 20 20 73 65 74 20 76 61 6c 20 5b 66 6f 72 6d  .  set val [form
32e0: 61 74 20 7b 6e 6f 77 20 25 31 30 64 20 20 6d 61  at {now %10d  ma
32f0: 78 20 25 31 30 64 20 20 6d 61 78 2d 73 69 7a 65  x %10d  max-size
3300: 20 25 31 30 64 7d 20 5c 0a 20 20 20 20 20 20 20   %10d} \.       
3310: 20 20 20 20 20 20 20 5b 6c 69 6e 64 65 78 20 24         [lindex $
3320: 78 20 31 5d 20 5b 6c 69 6e 64 65 78 20 24 78 20  x 1] [lindex $x 
3330: 32 5d 20 5b 6c 69 6e 64 65 78 20 24 79 20 32 5d  2] [lindex $y 2]
3340: 5d 0a 20 20 70 75 74 73 20 22 50 61 67 65 2d 63  ].  puts "Page-c
3350: 61 63 68 65 20 75 73 65 64 3a 20 20 20 20 20 20  ache used:      
3360: 24 76 61 6c 22 0a 20 20 73 65 74 20 78 20 5b 73  $val".  set x [s
3370: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 20 53 51  qlite3_status SQ
3380: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
3390: 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 20 30  CACHE_OVERFLOW 0
33a0: 5d 0a 20 20 73 65 74 20 76 61 6c 20 5b 66 6f 72  ].  set val [for
33b0: 6d 61 74 20 7b 6e 6f 77 20 25 31 30 64 20 20 6d  mat {now %10d  m
33c0: 61 78 20 25 31 30 64 7d 20 5b 6c 69 6e 64 65 78  ax %10d} [lindex
33d0: 20 24 78 20 31 5d 20 5b 6c 69 6e 64 65 78 20 24   $x 1] [lindex $
33e0: 78 20 32 5d 5d 0a 20 20 70 75 74 73 20 22 50 61  x 2]].  puts "Pa
33f0: 67 65 2d 63 61 63 68 65 20 6f 76 65 72 66 6c 6f  ge-cache overflo
3400: 77 3a 20 20 24 76 61 6c 22 0a 20 20 73 65 74 20  w:  $val".  set 
3410: 78 20 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75  x [sqlite3_statu
3420: 73 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s SQLITE_STATUS_
3430: 53 43 52 41 54 43 48 5f 55 53 45 44 20 30 5d 0a  SCRATCH_USED 0].
3440: 20 20 73 65 74 20 76 61 6c 20 5b 66 6f 72 6d 61    set val [forma
3450: 74 20 7b 6e 6f 77 20 25 31 30 64 20 20 6d 61 78  t {now %10d  max
3460: 20 25 31 30 64 7d 20 5b 6c 69 6e 64 65 78 20 24   %10d} [lindex $
3470: 78 20 31 5d 20 5b 6c 69 6e 64 65 78 20 24 78 20  x 1] [lindex $x 
3480: 32 5d 5d 0a 20 20 70 75 74 73 20 22 53 63 72 61  2]].  puts "Scra
3490: 74 63 68 20 6d 65 6d 6f 72 79 20 75 73 65 64 3a  tch memory used:
34a0: 20 20 24 76 61 6c 22 0a 20 20 73 65 74 20 78 20    $val".  set x 
34b0: 5b 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 20  [sqlite3_status 
34c0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 53 43  SQLITE_STATUS_SC
34d0: 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f 57 20 30  RATCH_OVERFLOW 0
34e0: 5d 0a 20 20 73 65 74 20 79 20 5b 73 71 6c 69 74  ].  set y [sqlit
34f0: 65 33 5f 73 74 61 74 75 73 20 53 51 4c 49 54 45  e3_status SQLITE
3500: 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f  _STATUS_SCRATCH_
3510: 53 49 5a 45 20 30 5d 0a 20 20 73 65 74 20 76 61  SIZE 0].  set va
3520: 6c 20 5b 66 6f 72 6d 61 74 20 7b 6e 6f 77 20 25  l [format {now %
3530: 31 30 64 20 20 6d 61 78 20 25 31 30 64 20 20 6d  10d  max %10d  m
3540: 61 78 2d 73 69 7a 65 20 25 31 30 64 7d 20 5c 0a  ax-size %10d} \.
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
3560: 6c 69 6e 64 65 78 20 24 78 20 31 5d 20 5b 6c 69  lindex $x 1] [li
3570: 6e 64 65 78 20 24 78 20 32 5d 20 5b 6c 69 6e 64  ndex $x 2] [lind
3580: 65 78 20 24 79 20 32 5d 5d 0a 20 20 70 75 74 73  ex $y 2]].  puts
3590: 20 22 53 63 72 61 74 63 68 20 6f 76 65 72 66 6c   "Scratch overfl
35a0: 6f 77 3a 20 20 20 20 20 24 76 61 6c 22 0a 20 20  ow:     $val".  
35b0: 69 66 63 61 70 61 62 6c 65 20 79 79 74 72 61 63  ifcapable yytrac
35c0: 6b 6d 61 78 73 74 61 63 6b 64 65 70 74 68 20 7b  kmaxstackdepth {
35d0: 0a 20 20 20 20 73 65 74 20 78 20 5b 73 71 6c 69  .    set x [sqli
35e0: 74 65 33 5f 73 74 61 74 75 73 20 53 51 4c 49 54  te3_status SQLIT
35f0: 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52 5f  E_STATUS_PARSER_
3600: 53 54 41 43 4b 20 30 5d 0a 20 20 20 20 73 65 74  STACK 0].    set
3610: 20 76 61 6c 20 5b 66 6f 72 6d 61 74 20 7b 20 20   val [format {  
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 78               max
3630: 20 25 31 30 64 7d 20 5b 6c 69 6e 64 65 78 20 24   %10d} [lindex $
3640: 78 20 32 5d 5d 0a 20 20 20 20 70 75 74 73 20 22  x 2]].    puts "
3650: 50 61 72 73 65 72 20 73 74 61 63 6b 20 64 65 70  Parser stack dep
3660: 74 68 3a 20 20 20 20 24 76 61 6c 22 0a 20 20 7d  th:    $val".  }
3670: 0a 7d 0a 0a 23 20 41 20 70 72 6f 63 65 64 75 72  .}..# A procedur
3680: 65 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c  e to execute SQL
3690: 0a 23 0a 70 72 6f 63 20 65 78 65 63 73 71 6c 20  .#.proc execsql 
36a0: 7b 73 71 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 0a  {sql {db db}} {.
36b0: 20 20 23 20 70 75 74 73 20 22 53 51 4c 20 3d 20    # puts "SQL = 
36c0: 24 73 71 6c 22 0a 20 20 75 70 6c 65 76 65 6c 20  $sql".  uplevel 
36d0: 5b 6c 69 73 74 20 24 64 62 20 65 76 61 6c 20 24  [list $db eval $
36e0: 73 71 6c 5d 0a 7d 0a 0a 23 20 45 78 65 63 75 74  sql].}..# Execut
36f0: 65 20 53 51 4c 20 61 6e 64 20 63 61 74 63 68 20  e SQL and catch 
3700: 65 78 63 65 70 74 69 6f 6e 73 2e 0a 23 0a 70 72  exceptions..#.pr
3710: 6f 63 20 63 61 74 63 68 73 71 6c 20 7b 73 71 6c  oc catchsql {sql
3720: 20 7b 64 62 20 64 62 7d 7d 20 7b 0a 20 20 23 20   {db db}} {.  # 
3730: 70 75 74 73 20 22 53 51 4c 20 3d 20 24 73 71 6c  puts "SQL = $sql
3740: 22 0a 20 20 73 65 74 20 72 20 5b 63 61 74 63 68  ".  set r [catch
3750: 20 5b 6c 69 73 74 20 75 70 6c 65 76 65 6c 20 5b   [list uplevel [
3760: 6c 69 73 74 20 24 64 62 20 65 76 61 6c 20 24 73  list $db eval $s
3770: 71 6c 5d 5d 20 6d 73 67 5d 0a 20 20 6c 61 70 70  ql]] msg].  lapp
3780: 65 6e 64 20 72 20 24 6d 73 67 0a 20 20 72 65 74  end r $msg.  ret
3790: 75 72 6e 20 24 72 0a 7d 0a 0a 23 20 44 6f 20 61  urn $r.}..# Do a
37a0: 6e 20 56 44 42 45 20 63 6f 64 65 20 64 75 6d 70  n VDBE code dump
37b0: 20 6f 6e 20 74 68 65 20 53 51 4c 20 67 69 76 65   on the SQL give
37c0: 6e 0a 23 0a 70 72 6f 63 20 65 78 70 6c 61 69 6e  n.#.proc explain
37d0: 20 7b 73 71 6c 20 7b 64 62 20 64 62 7d 7d 20 7b   {sql {db db}} {
37e0: 0a 20 20 70 75 74 73 20 22 22 0a 20 20 70 75 74  .  puts "".  put
37f0: 73 20 22 61 64 64 72 20 20 6f 70 63 6f 64 65 20  s "addr  opcode 
3800: 20 20 20 20 20 20 20 70 31 20 20 20 20 20 20 70         p1      p
3810: 32 20 20 20 20 20 20 70 33 20 20 20 20 20 20 70  2      p3      p
3820: 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
3830: 70 35 20 20 23 22 0a 20 20 70 75 74 73 20 22 2d  p5  #".  puts "-
3840: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
3850: 2d 20 20 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  -  ------  -----
3860: 2d 20 20 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  -  ------  -----
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 20 20  ----------  --  
3880: 2d 22 0a 20 20 24 64 62 20 65 76 61 6c 20 22 65  -".  $db eval "e
3890: 78 70 6c 61 69 6e 20 24 73 71 6c 22 20 7b 7d 20  xplain $sql" {} 
38a0: 7b 0a 20 20 20 20 70 75 74 73 20 5b 66 6f 72 6d  {.    puts [form
38b0: 61 74 20 7b 25 2d 34 64 20 20 25 2d 31 32 2e 31  at {%-4d  %-12.1
38c0: 32 73 20 20 25 2d 36 64 20 20 25 2d 36 64 20 20  2s  %-6d  %-6d  
38d0: 25 2d 36 64 20 20 25 20 2d 31 37 73 20 25 73 20  %-6d  % -17s %s 
38e0: 20 25 73 7d 20 5c 0a 20 20 20 20 20 20 24 61 64   %s} \.      $ad
38f0: 64 72 20 24 6f 70 63 6f 64 65 20 24 70 31 20 24  dr $opcode $p1 $
3900: 70 32 20 24 70 33 20 24 70 34 20 24 70 35 20 24  p2 $p3 $p4 $p5 $
3910: 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 5d 0a 20 20  comment.    ].  
3920: 7d 0a 7d 0a 0a 23 20 53 68 6f 77 20 74 68 65 20  }.}..# Show the 
3930: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 66 6f 72  VDBE program for
3940: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
3950: 74 20 62 75 74 20 6f 6d 69 74 20 74 68 65 20 54  t but omit the T
3960: 72 61 63 65 0a 23 20 6f 70 63 6f 64 65 20 61 74  race.# opcode at
3970: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20   the beginning. 
3980: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
3990: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
39a0: 72 6f 76 65 0a 23 20 74 68 61 74 20 64 69 66 66  rove.# that diff
39b0: 65 72 65 6e 74 20 53 51 4c 20 73 74 61 74 65 6d  erent SQL statem
39c0: 65 6e 74 73 20 67 65 6e 65 72 61 74 65 20 65 78  ents generate ex
39d0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 56  actly the same V
39e0: 44 42 45 20 63 6f 64 65 2e 0a 23 0a 70 72 6f 63  DBE code..#.proc
39f0: 20 65 78 70 6c 61 69 6e 5f 6e 6f 5f 74 72 61 63   explain_no_trac
3a00: 65 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65 74 20  e {sql} {.  set 
3a10: 74 72 20 5b 64 62 20 65 76 61 6c 20 22 45 58 50  tr [db eval "EXP
3a20: 4c 41 49 4e 20 24 73 71 6c 22 5d 0a 20 20 72 65  LAIN $sql"].  re
3a30: 74 75 72 6e 20 5b 6c 72 61 6e 67 65 20 24 74 72  turn [lrange $tr
3a40: 20 37 20 65 6e 64 5d 0a 7d 0a 0a 23 20 41 6e 6f   7 end].}..# Ano
3a50: 74 68 65 72 20 70 72 6f 63 65 64 75 72 65 20 74  ther procedure t
3a60: 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 20 20  o execute SQL.  
3a70: 54 68 69 73 20 6f 6e 65 20 69 6e 63 6c 75 64 65  This one include
3a80: 73 20 74 68 65 20 66 69 65 6c 64 0a 23 20 6e 61  s the field.# na
3a90: 6d 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  mes in the retur
3aa0: 6e 65 64 20 6c 69 73 74 2e 0a 23 0a 70 72 6f 63  ned list..#.proc
3ab0: 20 65 78 65 63 73 71 6c 32 20 7b 73 71 6c 7d 20   execsql2 {sql} 
3ac0: 7b 0a 20 20 73 65 74 20 72 65 73 75 6c 74 20 7b  {.  set result {
3ad0: 7d 0a 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c  }.  db eval $sql
3ae0: 20 64 61 74 61 20 7b 0a 20 20 20 20 66 6f 72 65   data {.    fore
3af0: 61 63 68 20 66 20 24 64 61 74 61 28 2a 29 20 7b  ach f $data(*) {
3b00: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72  .      lappend r
3b10: 65 73 75 6c 74 20 24 66 20 24 64 61 74 61 28 24  esult $f $data($
3b20: 66 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  f).    }.  }.  r
3b30: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a 7d 0a  eturn $result.}.
3b40: 0a 23 20 55 73 65 20 74 68 65 20 6e 6f 6e 2d 63  .# Use the non-c
3b50: 61 6c 6c 62 61 63 6b 20 41 50 49 20 74 6f 20 65  allback API to e
3b60: 78 65 63 75 74 65 20 6d 75 6c 74 69 70 6c 65 20  xecute multiple 
3b70: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 23  SQL statements.#
3b80: 0a 70 72 6f 63 20 73 74 65 70 73 71 6c 20 7b 64  .proc stepsql {d
3b90: 62 70 74 72 20 73 71 6c 7d 20 7b 0a 20 20 73 65  bptr sql} {.  se
3ba0: 74 20 73 71 6c 20 5b 73 74 72 69 6e 67 20 74 72  t sql [string tr
3bb0: 69 6d 20 24 73 71 6c 5d 0a 20 20 73 65 74 20 72  im $sql].  set r
3bc0: 20 30 0a 20 20 77 68 69 6c 65 20 7b 5b 73 74 72   0.  while {[str
3bd0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 71 6c 5d  ing length $sql]
3be0: 3e 30 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 63  >0} {.    if {[c
3bf0: 61 74 63 68 20 7b 73 71 6c 69 74 65 33 5f 70 72  atch {sqlite3_pr
3c00: 65 70 61 72 65 20 24 64 62 70 74 72 20 24 73 71  epare $dbptr $sq
3c10: 6c 20 2d 31 20 73 71 6c 74 61 69 6c 7d 20 76 6d  l -1 sqltail} vm
3c20: 5d 7d 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ]} {.      retur
3c30: 6e 20 5b 6c 69 73 74 20 31 20 24 76 6d 5d 0a 20  n [list 1 $vm]. 
3c40: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 73 71 6c     }.    set sql
3c50: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73   [string trim $s
3c60: 71 6c 74 61 69 6c 5d 0a 23 20 20 20 20 77 68 69  qltail].#    whi
3c70: 6c 65 20 7b 5b 73 71 6c 69 74 65 5f 73 74 65 70  le {[sqlite_step
3c80: 20 24 76 6d 20 4e 20 56 41 4c 20 43 4f 4c 5d 3d   $vm N VAL COL]=
3c90: 3d 22 53 51 4c 49 54 45 5f 52 4f 57 22 7d 20 7b  ="SQLITE_ROW"} {
3ca0: 0a 23 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  .#      foreach 
3cb0: 76 20 24 56 41 4c 20 7b 6c 61 70 70 65 6e 64 20  v $VAL {lappend 
3cc0: 72 20 24 76 7d 0a 23 20 20 20 20 7d 0a 20 20 20  r $v}.#    }.   
3cd0: 20 77 68 69 6c 65 20 7b 5b 73 71 6c 69 74 65 33   while {[sqlite3
3ce0: 5f 73 74 65 70 20 24 76 6d 5d 3d 3d 22 53 51 4c  _step $vm]=="SQL
3cf0: 49 54 45 5f 52 4f 57 22 7d 20 7b 0a 20 20 20 20  ITE_ROW"} {.    
3d00: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
3d10: 7b 24 69 3c 5b 73 71 6c 69 74 65 33 5f 64 61 74  {$i<[sqlite3_dat
3d20: 61 5f 63 6f 75 6e 74 20 24 76 6d 5d 7d 20 7b 69  a_count $vm]} {i
3d30: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 20  ncr i} {.       
3d40: 20 6c 61 70 70 65 6e 64 20 72 20 5b 73 71 6c 69   lappend r [sqli
3d50: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
3d60: 24 76 6d 20 24 69 5d 0a 20 20 20 20 20 20 7d 0a  $vm $i].      }.
3d70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 5b 63      }.    if {[c
3d80: 61 74 63 68 20 7b 73 71 6c 69 74 65 33 5f 66 69  atch {sqlite3_fi
3d90: 6e 61 6c 69 7a 65 20 24 76 6d 7d 20 65 72 72 6d  nalize $vm} errm
3da0: 73 67 5d 7d 20 7b 0a 20 20 20 20 20 20 72 65 74  sg]} {.      ret
3db0: 75 72 6e 20 5b 6c 69 73 74 20 31 20 24 65 72 72  urn [list 1 $err
3dc0: 6d 73 67 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  msg].    }.  }. 
3dd0: 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 0a 23 20   return $r.}..# 
3de0: 44 65 6c 65 74 65 20 61 20 66 69 6c 65 20 6f 72  Delete a file or
3df0: 20 64 69 72 65 63 74 6f 72 79 0a 23 0a 70 72 6f   directory.#.pro
3e00: 63 20 66 6f 72 63 65 64 65 6c 65 74 65 20 7b 66  c forcedelete {f
3e10: 69 6c 65 6e 61 6d 65 7d 20 7b 0a 20 20 69 66 20  ilename} {.  if 
3e20: 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65  {[catch {file de
3e30: 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 69 6c  lete -force $fil
3e40: 65 6e 61 6d 65 7d 5d 7d 20 7b 0a 20 20 20 20 65  ename}]} {.    e
3e50: 78 65 63 20 72 6d 20 2d 72 66 20 24 66 69 6c 65  xec rm -rf $file
3e60: 6e 61 6d 65 0a 20 20 7d 0a 7d 0a 0a 23 20 44 6f  name.  }.}..# Do
3e70: 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68   an integrity ch
3e80: 65 63 6b 20 6f 66 20 74 68 65 20 65 6e 74 69 72  eck of the entir
3e90: 65 20 64 61 74 61 62 61 73 65 0a 23 0a 70 72 6f  e database.#.pro
3ea0: 63 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  c integrity_chec
3eb0: 6b 20 7b 6e 61 6d 65 20 7b 64 62 20 64 62 7d 7d  k {name {db db}}
3ec0: 20 7b 0a 20 20 69 66 63 61 70 61 62 6c 65 20 69   {.  ifcapable i
3ed0: 6e 74 65 67 72 69 74 79 63 6b 20 7b 0a 20 20 20  ntegrityck {.   
3ee0: 20 64 6f 5f 74 65 73 74 20 24 6e 61 6d 65 20 5b   do_test $name [
3ef0: 6c 69 73 74 20 65 78 65 63 73 71 6c 20 7b 50 52  list execsql {PR
3f00: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
3f10: 68 65 63 6b 7d 20 24 64 62 5d 20 7b 6f 6b 7d 0a  heck} $db] {ok}.
3f20: 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 66 69 78 5f    }.}..proc fix_
3f30: 69 66 63 61 70 61 62 6c 65 5f 65 78 70 72 20 7b  ifcapable_expr {
3f40: 65 78 70 72 7d 20 7b 0a 20 20 73 65 74 20 72 65  expr} {.  set re
3f50: 74 20 22 22 0a 20 20 73 65 74 20 73 74 61 74 65  t "".  set state
3f60: 20 30 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20   0.  for {set i 
3f70: 30 7d 20 7b 24 69 20 3c 20 5b 73 74 72 69 6e 67  0} {$i < [string
3f80: 20 6c 65 6e 67 74 68 20 24 65 78 70 72 5d 7d 20   length $expr]} 
3f90: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73  {incr i} {.    s
3fa0: 65 74 20 63 68 61 72 20 5b 73 74 72 69 6e 67 20  et char [string 
3fb0: 72 61 6e 67 65 20 24 65 78 70 72 20 24 69 20 24  range $expr $i $
3fc0: 69 5d 0a 20 20 20 20 73 65 74 20 6e 65 77 73 74  i].    set newst
3fd0: 61 74 65 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  ate [expr {[stri
3fe0: 6e 67 20 69 73 20 61 6c 6e 75 6d 20 24 63 68 61  ng is alnum $cha
3ff0: 72 5d 20 7c 7c 20 24 63 68 61 72 20 65 71 20 22  r] || $char eq "
4000: 5f 22 7d 5d 0a 20 20 20 20 69 66 20 7b 24 6e 65  _"}].    if {$ne
4010: 77 73 74 61 74 65 20 26 26 20 21 24 73 74 61 74  wstate && !$stat
4020: 65 7d 20 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  e} {.      appen
4030: 64 20 72 65 74 20 7b 24 3a 3a 73 71 6c 69 74 65  d ret {$::sqlite
4040: 5f 6f 70 74 69 6f 6e 73 28 7d 0a 20 20 20 20 7d  _options(}.    }
4050: 0a 20 20 20 20 69 66 20 7b 21 24 6e 65 77 73 74  .    if {!$newst
4060: 61 74 65 20 26 26 20 24 73 74 61 74 65 7d 20 7b  ate && $state} {
4070: 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65  .      append re
4080: 74 20 29 0a 20 20 20 20 7d 0a 20 20 20 20 61 70  t ).    }.    ap
4090: 70 65 6e 64 20 72 65 74 20 24 63 68 61 72 0a 20  pend ret $char. 
40a0: 20 20 20 73 65 74 20 73 74 61 74 65 20 24 6e 65     set state $ne
40b0: 77 73 74 61 74 65 0a 20 20 7d 0a 20 20 69 66 20  wstate.  }.  if 
40c0: 7b 24 73 74 61 74 65 7d 20 7b 61 70 70 65 6e 64  {$state} {append
40d0: 20 72 65 74 20 29 7d 0a 20 20 72 65 74 75 72 6e   ret )}.  return
40e0: 20 24 72 65 74 0a 7d 0a 0a 23 20 45 76 61 6c 75   $ret.}..# Evalu
40f0: 61 74 65 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  ate a boolean ex
4100: 70 72 65 73 73 69 6f 6e 20 6f 66 20 63 61 70 61  pression of capa
4110: 62 69 6c 69 74 69 65 73 2e 20 20 49 66 20 74 72  bilities.  If tr
4120: 75 65 2c 20 65 78 65 63 75 74 65 20 74 68 65 0a  ue, execute the.
4130: 23 20 63 6f 64 65 2e 20 20 4f 6d 69 74 20 74 68  # code.  Omit th
4140: 65 20 63 6f 64 65 20 69 66 20 66 61 6c 73 65 2e  e code if false.
4150: 0a 23 0a 70 72 6f 63 20 69 66 63 61 70 61 62 6c  .#.proc ifcapabl
4160: 65 20 7b 65 78 70 72 20 63 6f 64 65 20 7b 65 6c  e {expr code {el
4170: 73 65 20 22 22 7d 20 7b 65 6c 73 65 63 6f 64 65  se ""} {elsecode
4180: 20 22 22 7d 7d 20 7b 0a 20 20 23 72 65 67 73 75   ""}} {.  #regsu
4190: 62 20 2d 61 6c 6c 20 7b 5b 61 2d 7a 5f 30 2d 39  b -all {[a-z_0-9
41a0: 5d 2b 7d 20 24 65 78 70 72 20 7b 24 3a 3a 73 71  ]+} $expr {$::sq
41b0: 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28 26 29 7d  lite_options(&)}
41c0: 20 65 32 0a 20 20 73 65 74 20 65 32 20 5b 66 69   e2.  set e2 [fi
41d0: 78 5f 69 66 63 61 70 61 62 6c 65 5f 65 78 70 72  x_ifcapable_expr
41e0: 20 24 65 78 70 72 5d 0a 20 20 69 66 20 28 24 65   $expr].  if ($e
41f0: 32 29 20 7b 0a 20 20 20 20 73 65 74 20 63 20 5b  2) {.    set c [
4200: 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31  catch {uplevel 1
4210: 20 24 63 6f 64 65 7d 20 72 5d 0a 20 20 7d 20 65   $code} r].  } e
4220: 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 63 20  lse {.    set c 
4230: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
4240: 31 20 24 65 6c 73 65 63 6f 64 65 7d 20 72 5d 0a  1 $elsecode} r].
4250: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 63 6f    }.  return -co
4260: 64 65 20 24 63 20 24 72 0a 7d 0a 0a 23 20 54 68  de $c $r.}..# Th
4270: 69 73 20 70 72 6f 63 20 65 78 65 63 73 20 61 20  is proc execs a 
4280: 73 65 70 65 72 61 74 65 20 70 72 6f 63 65 73 73  seperate process
4290: 20 74 68 61 74 20 63 72 61 73 68 65 73 20 6d 69   that crashes mi
42a0: 64 77 61 79 20 74 68 72 6f 75 67 68 20 65 78 65  dway through exe
42b0: 63 75 74 69 6e 67 0a 23 20 74 68 65 20 53 51 4c  cuting.# the SQL
42c0: 20 73 63 72 69 70 74 20 24 73 71 6c 20 6f 6e 20   script $sql on 
42d0: 64 61 74 61 62 61 73 65 20 74 65 73 74 2e 64 62  database test.db
42e0: 2e 0a 23 0a 23 20 54 68 65 20 63 72 61 73 68 20  ..#.# The crash 
42f0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
4300: 73 79 6e 63 28 29 20 6f 66 20 66 69 6c 65 20 24  sync() of file $
4310: 63 72 61 73 68 66 69 6c 65 2e 20 57 68 65 6e 20  crashfile. When 
4320: 74 68 65 20 63 72 61 73 68 0a 23 20 6f 63 63 75  the crash.# occu
4330: 72 73 20 61 20 72 61 6e 64 6f 6d 20 73 75 62 73  rs a random subs
4340: 65 74 20 6f 66 20 61 6c 6c 20 75 6e 73 79 6e 63  et of all unsync
4350: 65 64 20 77 72 69 74 65 73 20 6d 61 64 65 20 62  ed writes made b
4360: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 61 72  y the process ar
4370: 65 0a 23 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  e.# written into
4380: 20 74 68 65 20 66 69 6c 65 73 20 6f 6e 20 64 69   the files on di
4390: 73 6b 2e 20 41 72 67 75 6d 65 6e 74 20 24 63 72  sk. Argument $cr
43a0: 61 73 68 64 65 6c 61 79 20 69 6e 64 69 63 61 74  ashdelay indicat
43b0: 65 73 20 74 68 65 0a 23 20 6e 75 6d 62 65 72 20  es the.# number 
43c0: 6f 66 20 66 69 6c 65 20 73 79 6e 63 73 20 74 6f  of file syncs to
43d0: 20 77 61 69 74 20 62 65 66 6f 72 65 20 63 72 61   wait before cra
43e0: 73 68 69 6e 67 2e 0a 23 0a 23 20 54 68 65 20 72  shing..#.# The r
43f0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
4400: 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65   list of two ele
4410: 6d 65 6e 74 73 2e 20 54 68 65 20 66 69 72 73 74  ments. The first
4420: 20 65 6c 65 6d 65 6e 74 20 69 73 20 61 0a 23 20   element is a.# 
4430: 62 6f 6f 6c 65 61 6e 2c 20 69 6e 64 69 63 61 74  boolean, indicat
4440: 69 6e 67 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ing whether or n
4450: 6f 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 61  ot the process a
4460: 63 74 75 61 6c 6c 79 20 63 72 61 73 68 65 64 20  ctually crashed 
4470: 6f 72 0a 23 20 72 65 70 6f 72 74 65 64 20 73 6f  or.# reported so
4480: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 2e 20  me other error. 
4490: 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  The second eleme
44a0: 6e 74 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  nt in the return
44b0: 65 64 20 6c 69 73 74 20 69 73 20 74 68 65 0a 23  ed list is the.#
44c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
44d0: 54 68 69 73 20 69 73 20 22 63 68 69 6c 64 20 70  This is "child p
44e0: 72 6f 63 65 73 73 20 65 78 69 74 65 64 20 61 62  rocess exited ab
44f0: 6e 6f 72 6d 61 6c 6c 79 22 20 69 66 20 74 68 65  normally" if the
4500: 20 63 72 61 73 68 0a 23 20 6f 63 63 75 72 65 64   crash.# occured
4510: 2e 0a 23 0a 23 20 20 20 63 72 61 73 68 73 71 6c  ..#.#   crashsql
4520: 20 2d 64 65 6c 61 79 20 43 52 41 53 48 44 45 4c   -delay CRASHDEL
4530: 41 59 20 2d 66 69 6c 65 20 43 52 41 53 48 46 49  AY -file CRASHFI
4540: 4c 45 20 3f 2d 62 6c 6f 63 6b 73 69 7a 65 20 42  LE ?-blocksize B
4550: 4c 4f 43 4b 53 49 5a 45 3f 20 24 73 71 6c 0a 23  LOCKSIZE? $sql.#
4560: 0a 70 72 6f 63 20 63 72 61 73 68 73 71 6c 20 7b  .proc crashsql {
4570: 61 72 67 73 7d 20 7b 0a 20 20 69 66 20 7b 24 3a  args} {.  if {$:
4580: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c  :tcl_platform(pl
4590: 61 74 66 6f 72 6d 29 21 3d 22 75 6e 69 78 22 7d  atform)!="unix"}
45a0: 20 7b 0a 20 20 20 20 65 72 72 6f 72 20 22 63 72   {.    error "cr
45b0: 61 73 68 73 71 6c 20 73 68 6f 75 6c 64 20 6f 6e  ashsql should on
45c0: 6c 79 20 62 65 20 75 73 65 64 20 6f 6e 20 75 6e  ly be used on un
45d0: 69 78 22 0a 20 20 7d 0a 0a 20 20 73 65 74 20 62  ix".  }..  set b
45e0: 6c 6f 63 6b 73 69 7a 65 20 22 22 0a 20 20 73 65  locksize "".  se
45f0: 74 20 63 72 61 73 68 64 65 6c 61 79 20 31 0a 20  t crashdelay 1. 
4600: 20 73 65 74 20 70 72 6e 67 73 65 65 64 20 30 0a   set prngseed 0.
4610: 20 20 73 65 74 20 74 63 6c 62 6f 64 79 20 7b 7d    set tclbody {}
4620: 0a 20 20 73 65 74 20 63 72 61 73 68 66 69 6c 65  .  set crashfile
4630: 20 22 22 0a 20 20 73 65 74 20 64 63 20 22 22 0a   "".  set dc "".
4640: 20 20 73 65 74 20 73 71 6c 20 5b 6c 69 6e 64 65    set sql [linde
4650: 78 20 24 61 72 67 73 20 65 6e 64 5d 0a 20 20 0a  x $args end].  .
4660: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d    for {set ii 0}
4670: 20 7b 24 69 69 20 3c 20 5b 6c 6c 65 6e 67 74 68   {$ii < [llength
4680: 20 24 61 72 67 73 5d 2d 31 7d 20 7b 69 6e 63 72   $args]-1} {incr
4690: 20 69 69 20 32 7d 20 7b 0a 20 20 20 20 73 65 74   ii 2} {.    set
46a0: 20 7a 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73   z [lindex $args
46b0: 20 24 69 69 5d 0a 20 20 20 20 73 65 74 20 6e 20   $ii].    set n 
46c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
46d0: 7a 5d 0a 20 20 20 20 73 65 74 20 7a 32 20 5b 6c  z].    set z2 [l
46e0: 69 6e 64 65 78 20 24 61 72 67 73 20 5b 65 78 70  index $args [exp
46f0: 72 20 24 69 69 2b 31 5d 5d 0a 0a 20 20 20 20 69  r $ii+1]]..    i
4700: 66 20 20 20 20 20 7b 24 6e 3e 31 20 26 26 20 5b  f     {$n>1 && [
4710: 73 74 72 69 6e 67 20 66 69 72 73 74 20 24 7a 20  string first $z 
4720: 2d 64 65 6c 61 79 5d 3d 3d 30 7d 20 20 20 20 20  -delay]==0}     
4730: 7b 73 65 74 20 63 72 61 73 68 64 65 6c 61 79 20  {set crashdelay 
4740: 24 7a 32 7d 20 5c 0a 20 20 20 20 65 6c 73 65 69  $z2} \.    elsei
4750: 66 20 7b 24 6e 3e 31 20 26 26 20 5b 73 74 72 69  f {$n>1 && [stri
4760: 6e 67 20 66 69 72 73 74 20 24 7a 20 2d 73 65 65  ng first $z -see
4770: 64 5d 3d 3d 30 7d 20 20 20 20 20 20 7b 73 65 74  d]==0}      {set
4780: 20 70 72 6e 67 73 65 65 64 20 24 7a 32 7d 20 5c   prngseed $z2} \
4790: 0a 20 20 20 20 65 6c 73 65 69 66 20 7b 24 6e 3e  .    elseif {$n>
47a0: 31 20 26 26 20 5b 73 74 72 69 6e 67 20 66 69 72  1 && [string fir
47b0: 73 74 20 24 7a 20 2d 66 69 6c 65 5d 3d 3d 30 7d  st $z -file]==0}
47c0: 20 20 20 20 20 20 7b 73 65 74 20 63 72 61 73 68        {set crash
47d0: 66 69 6c 65 20 24 7a 32 7d 20 20 5c 0a 20 20 20  file $z2}  \.   
47e0: 20 65 6c 73 65 69 66 20 7b 24 6e 3e 31 20 26 26   elseif {$n>1 &&
47f0: 20 5b 73 74 72 69 6e 67 20 66 69 72 73 74 20 24   [string first $
4800: 7a 20 2d 74 63 6c 62 6f 64 79 5d 3d 3d 30 7d 20  z -tclbody]==0} 
4810: 20 20 7b 73 65 74 20 74 63 6c 62 6f 64 79 20 24    {set tclbody $
4820: 7a 32 7d 20 20 5c 0a 20 20 20 20 65 6c 73 65 69  z2}  \.    elsei
4830: 66 20 7b 24 6e 3e 31 20 26 26 20 5b 73 74 72 69  f {$n>1 && [stri
4840: 6e 67 20 66 69 72 73 74 20 24 7a 20 2d 62 6c 6f  ng first $z -blo
4850: 63 6b 73 69 7a 65 5d 3d 3d 30 7d 20 7b 73 65 74  cksize]==0} {set
4860: 20 62 6c 6f 63 6b 73 69 7a 65 20 22 2d 73 20 24   blocksize "-s $
4870: 7a 32 22 20 7d 20 5c 0a 20 20 20 20 65 6c 73 65  z2" } \.    else
4880: 69 66 20 7b 24 6e 3e 31 20 26 26 20 5b 73 74 72  if {$n>1 && [str
4890: 69 6e 67 20 66 69 72 73 74 20 24 7a 20 2d 63 68  ing first $z -ch
48a0: 61 72 61 63 74 65 72 69 73 74 69 63 73 5d 3d 3d  aracteristics]==
48b0: 30 7d 20 7b 73 65 74 20 64 63 20 22 2d 63 20 7b  0} {set dc "-c {
48c0: 24 7a 32 7d 22 20 7d 20 5c 0a 20 20 20 20 65 6c  $z2}" } \.    el
48d0: 73 65 20 20 20 7b 20 65 72 72 6f 72 20 22 55 6e  se   { error "Un
48e0: 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
48f0: 6e 3a 20 24 7a 22 20 7d 0a 20 20 7d 0a 0a 20 20  n: $z" }.  }..  
4900: 69 66 20 7b 24 63 72 61 73 68 66 69 6c 65 20 65  if {$crashfile e
4910: 71 20 22 22 7d 20 7b 0a 20 20 20 20 65 72 72 6f  q ""} {.    erro
4920: 72 20 22 43 6f 6d 70 75 6c 73 6f 72 79 20 6f 70  r "Compulsory op
4930: 74 69 6f 6e 20 2d 66 69 6c 65 20 6d 69 73 73 69  tion -file missi
4940: 6e 67 22 0a 20 20 7d 0a 0a 20 20 73 65 74 20 63  ng".  }..  set c
4950: 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  file [file join 
4960: 5b 70 77 64 5d 20 24 63 72 61 73 68 66 69 6c 65  [pwd] $crashfile
4970: 5d 0a 0a 20 20 73 65 74 20 66 20 5b 6f 70 65 6e  ]..  set f [open
4980: 20 63 72 61 73 68 2e 74 63 6c 20 77 5d 0a 20 20   crash.tcl w].  
4990: 70 75 74 73 20 24 66 20 22 73 71 6c 69 74 65 33  puts $f "sqlite3
49a0: 5f 63 72 61 73 68 5f 65 6e 61 62 6c 65 20 31 22  _crash_enable 1"
49b0: 0a 20 20 70 75 74 73 20 24 66 20 22 73 71 6c 69  .  puts $f "sqli
49c0: 74 65 33 5f 63 72 61 73 68 70 61 72 61 6d 73 20  te3_crashparams 
49d0: 24 62 6c 6f 63 6b 73 69 7a 65 20 24 64 63 20 24  $blocksize $dc $
49e0: 63 72 61 73 68 64 65 6c 61 79 20 24 63 66 69 6c  crashdelay $cfil
49f0: 65 22 0a 20 20 70 75 74 73 20 24 66 20 22 73 71  e".  puts $f "sq
4a00: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
4a10: 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20  ol_pending_byte 
4a20: 24 3a 3a 73 71 6c 69 74 65 5f 70 65 6e 64 69 6e  $::sqlite_pendin
4a30: 67 5f 62 79 74 65 22 0a 20 20 70 75 74 73 20 24  g_byte".  puts $
4a40: 66 20 22 73 71 6c 69 74 65 33 20 64 62 20 74 65  f "sqlite3 db te
4a50: 73 74 2e 64 62 20 2d 76 66 73 20 63 72 61 73 68  st.db -vfs crash
4a60: 22 0a 0a 20 20 23 20 54 68 69 73 20 62 6c 6f 63  "..  # This bloc
4a70: 6b 20 73 65 74 73 20 74 68 65 20 63 61 63 68 65  k sets the cache
4a80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
4a90: 6e 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 30  n database to 10
4aa0: 0a 20 20 23 20 70 61 67 65 73 2e 20 54 68 69 73  .  # pages. This
4ab0: 20 69 73 20 64 6f 6e 65 20 69 6e 20 63 61 73 65   is done in case
4ac0: 20 74 68 65 20 62 75 69 6c 64 20 69 73 20 63 6f   the build is co
4ad0: 6e 66 69 67 75 72 65 64 20 74 6f 20 6f 6d 69 74  nfigured to omit
4ae0: 0a 20 20 23 20 22 50 52 41 47 4d 41 20 63 61 63  .  # "PRAGMA cac
4af0: 68 65 5f 73 69 7a 65 22 2e 0a 20 20 70 75 74 73  he_size"..  puts
4b00: 20 24 66 20 7b 64 62 20 65 76 61 6c 20 7b 53 45   $f {db eval {SE
4b10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
4b20: 74 65 5f 6d 61 73 74 65 72 3b 7d 7d 0a 20 20 70  te_master;}}.  p
4b30: 75 74 73 20 24 66 20 7b 73 65 74 20 62 74 20 5b  uts $f {set bt [
4b40: 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62 20 64 62  btree_from_db db
4b50: 5d 7d 0a 20 20 70 75 74 73 20 24 66 20 7b 62 74  ]}.  puts $f {bt
4b60: 72 65 65 5f 73 65 74 5f 63 61 63 68 65 5f 73 69  ree_set_cache_si
4b70: 7a 65 20 24 62 74 20 31 30 7d 0a 20 20 69 66 20  ze $bt 10}.  if 
4b80: 7b 24 70 72 6e 67 73 65 65 64 7d 20 7b 0a 20 20  {$prngseed} {.  
4b90: 20 20 73 65 74 20 73 65 65 64 20 5b 65 78 70 72    set seed [expr
4ba0: 20 7b 24 70 72 6e 67 73 65 65 64 25 31 30 30 30   {$prngseed%1000
4bb0: 37 2b 31 7d 5d 0a 20 20 20 20 23 20 70 75 74 73  7+1}].    # puts
4bc0: 20 73 65 65 64 3d 24 73 65 65 64 0a 20 20 20 20   seed=$seed.    
4bd0: 70 75 74 73 20 24 66 20 22 64 62 20 65 76 61 6c  puts $f "db eval
4be0: 20 7b 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62   {SELECT randomb
4bf0: 6c 6f 62 28 24 73 65 65 64 29 7d 22 0a 20 20 7d  lob($seed)}".  }
4c00: 0a 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  ..  if {[string 
4c10: 6c 65 6e 67 74 68 20 24 74 63 6c 62 6f 64 79 5d  length $tclbody]
4c20: 3e 30 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 24  >0} {.    puts $
4c30: 66 20 24 74 63 6c 62 6f 64 79 0a 20 20 7d 0a 20  f $tclbody.  }. 
4c40: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
4c50: 67 74 68 20 24 73 71 6c 5d 3e 30 7d 20 7b 0a 20  gth $sql]>0} {. 
4c60: 20 20 20 70 75 74 73 20 24 66 20 22 64 62 20 65     puts $f "db e
4c70: 76 61 6c 20 7b 22 0a 20 20 20 20 70 75 74 73 20  val {".    puts 
4c80: 24 66 20 20 20 22 24 73 71 6c 22 0a 20 20 20 20  $f   "$sql".    
4c90: 70 75 74 73 20 24 66 20 22 7d 22 0a 20 20 7d 0a  puts $f "}".  }.
4ca0: 20 20 63 6c 6f 73 65 20 24 66 0a 0a 20 20 73 65    close $f..  se
4cb0: 74 20 72 20 5b 63 61 74 63 68 20 7b 0a 20 20 20  t r [catch {.   
4cc0: 20 65 78 65 63 20 5b 69 6e 66 6f 20 6e 61 6d 65   exec [info name
4cd0: 6f 66 65 78 65 63 5d 20 63 72 61 73 68 2e 74 63  ofexec] crash.tc
4ce0: 6c 20 3e 40 73 74 64 6f 75 74 0a 20 20 7d 20 6d  l >@stdout.  } m
4cf0: 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 20  sg].  lappend r 
4d00: 24 6d 73 67 0a 7d 0a 0a 23 20 55 73 61 67 65 3a  $msg.}..# Usage:
4d10: 20 64 6f 5f 69 6f 65 72 72 5f 74 65 73 74 20 3c   do_ioerr_test <
4d20: 74 65 73 74 20 6e 75 6d 62 65 72 3e 20 3c 6f 70  test number> <op
4d30: 74 69 6f 6e 73 2e 2e 2e 3e 0a 23 0a 23 20 54 68  tions...>.#.# Th
4d40: 69 73 20 70 72 6f 63 20 69 73 20 75 73 65 64 20  is proc is used 
4d50: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 65 73  to implement tes
4d60: 74 20 63 61 73 65 73 20 74 68 61 74 20 63 68 65  t cases that che
4d70: 63 6b 20 74 68 61 74 20 49 4f 20 65 72 72 6f 72  ck that IO error
4d80: 73 0a 23 20 61 72 65 20 63 6f 72 72 65 63 74 6c  s.# are correctl
4d90: 79 20 68 61 6e 64 6c 65 64 2e 20 54 68 65 20 66  y handled. The f
4da0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 3c  irst argument, <
4db0: 74 65 73 74 20 6e 75 6d 62 65 72 3e 2c 20 69 73  test number>, is
4dc0: 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 23 20 75   an integer .# u
4dd0: 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 20  sed to name the 
4de0: 74 65 73 74 73 20 65 78 65 63 75 74 65 64 20 62  tests executed b
4df0: 79 20 74 68 69 73 20 70 72 6f 63 2e 20 4f 70 74  y this proc. Opt
4e00: 69 6f 6e 73 20 61 72 65 20 61 73 20 66 6f 6c 6c  ions are as foll
4e10: 6f 77 73 3a 0a 23 0a 23 20 20 20 20 20 2d 74 63  ows:.#.#     -tc
4e20: 6c 70 72 65 70 20 20 20 20 20 20 20 20 20 20 54  lprep          T
4e30: 43 4c 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e  CL script to run
4e40: 20 74 6f 20 70 72 65 70 61 72 65 20 74 65 73 74   to prepare test
4e50: 2e 0a 23 20 20 20 20 20 2d 73 71 6c 70 72 65 70  ..#     -sqlprep
4e60: 20 20 20 20 20 20 20 20 20 20 53 51 4c 20 73 63            SQL sc
4e70: 72 69 70 74 20 74 6f 20 72 75 6e 20 74 6f 20 70  ript to run to p
4e80: 72 65 70 61 72 65 20 74 65 73 74 2e 0a 23 20 20  repare test..#  
4e90: 20 20 20 2d 74 63 6c 62 6f 64 79 20 20 20 20 20     -tclbody     
4ea0: 20 20 20 20 20 54 43 4c 20 73 63 72 69 70 74 20       TCL script 
4eb0: 74 6f 20 72 75 6e 20 77 69 74 68 20 49 4f 20 65  to run with IO e
4ec0: 72 72 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 2e  rror simulation.
4ed0: 0a 23 20 20 20 20 20 2d 73 71 6c 62 6f 64 79 20  .#     -sqlbody 
4ee0: 20 20 20 20 20 20 20 20 20 54 43 4c 20 73 63 72           TCL scr
4ef0: 69 70 74 20 74 6f 20 72 75 6e 20 77 69 74 68 20  ipt to run with 
4f00: 49 4f 20 65 72 72 6f 72 20 73 69 6d 75 6c 61 74  IO error simulat
4f10: 69 6f 6e 2e 0a 23 20 20 20 20 20 2d 65 78 63 6c  ion..#     -excl
4f20: 75 64 65 20 20 20 20 20 20 20 20 20 20 4c 69 73  ude          Lis
4f30: 74 20 6f 66 20 27 4e 27 20 76 61 6c 75 65 73 20  t of 'N' values 
4f40: 6e 6f 74 20 74 6f 20 74 65 73 74 2e 0a 23 20 20  not to test..#  
4f50: 20 20 20 2d 65 72 63 20 20 20 20 20 20 20 20 20     -erc         
4f60: 20 20 20 20 20 55 73 65 20 65 78 74 65 6e 64 65       Use extende
4f70: 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 0a 23  d result codes.#
4f80: 20 20 20 20 20 2d 70 65 72 73 69 73 74 20 20 20       -persist   
4f90: 20 20 20 20 20 20 20 4d 61 6b 65 20 73 69 6d 75         Make simu
4fa0: 6c 61 74 65 64 20 49 2f 4f 20 65 72 72 6f 72 73  lated I/O errors
4fb0: 20 70 65 72 73 69 73 74 65 6e 74 0a 23 20 20 20   persistent.#   
4fc0: 20 20 2d 73 74 61 72 74 20 20 20 20 20 20 20 20    -start        
4fd0: 20 20 20 20 56 61 6c 75 65 20 6f 66 20 27 4e 27      Value of 'N'
4fe0: 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 20 28   to begin with (
4ff0: 64 65 66 61 75 6c 74 20 31 29 0a 23 0a 23 20 20  default 1).#.#  
5000: 20 20 20 2d 63 6b 73 75 6d 20 20 20 20 20 20 20     -cksum       
5010: 20 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 49 66       Boolean. If
5020: 20 74 72 75 65 2c 20 74 65 73 74 20 74 68 61 74   true, test that
5030: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 6f   the database do
5040: 65 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  es.#            
5050: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 63             not c
5060: 68 61 6e 67 65 20 64 75 72 69 6e 67 20 74 68 65  hange during the
5070: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
5080: 65 20 74 65 73 74 20 63 61 73 65 2e 0a 23 0a 70  e test case..#.p
5090: 72 6f 63 20 64 6f 5f 69 6f 65 72 72 5f 74 65 73  roc do_ioerr_tes
50a0: 74 20 7b 74 65 73 74 6e 61 6d 65 20 61 72 67 73  t {testname args
50b0: 7d 20 7b 0a 0a 20 20 73 65 74 20 3a 3a 69 6f 65  } {..  set ::ioe
50c0: 72 72 6f 70 74 73 28 2d 73 74 61 72 74 29 20 31  rropts(-start) 1
50d0: 0a 20 20 73 65 74 20 3a 3a 69 6f 65 72 72 6f 70  .  set ::ioerrop
50e0: 74 73 28 2d 63 6b 73 75 6d 29 20 30 0a 20 20 73  ts(-cksum) 0.  s
50f0: 65 74 20 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d  et ::ioerropts(-
5100: 65 72 63 29 20 30 0a 20 20 73 65 74 20 3a 3a 69  erc) 0.  set ::i
5110: 6f 65 72 72 6f 70 74 73 28 2d 63 6f 75 6e 74 29  oerropts(-count)
5120: 20 31 30 30 30 30 30 30 30 30 0a 20 20 73 65 74   100000000.  set
5130: 20 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 70 65   ::ioerropts(-pe
5140: 72 73 69 73 74 29 20 31 0a 20 20 73 65 74 20 3a  rsist) 1.  set :
5150: 3a 69 6f 65 72 72 6f 70 74 73 28 2d 63 6b 72 65  :ioerropts(-ckre
5160: 66 63 6f 75 6e 74 29 20 30 0a 20 20 73 65 74 20  fcount) 0.  set 
5170: 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 72 65 73  ::ioerropts(-res
5180: 74 6f 72 65 70 72 6e 67 29 20 31 0a 20 20 61 72  toreprng) 1.  ar
5190: 72 61 79 20 73 65 74 20 3a 3a 69 6f 65 72 72 6f  ray set ::ioerro
51a0: 70 74 73 20 24 61 72 67 73 0a 0a 20 20 23 20 54  pts $args..  # T
51b0: 45 4d 50 4f 52 41 52 59 3a 20 46 6f 72 20 33 2e  EMPORARY: For 3.
51c0: 35 2e 39 2c 20 64 69 73 61 62 6c 65 20 74 65 73  5.9, disable tes
51d0: 74 69 6e 67 20 6f 66 20 65 78 74 65 6e 64 65 64  ting of extended
51e0: 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 20 54   result codes. T
51f0: 68 65 72 65 20 61 72 65 0a 20 20 23 20 61 20 63  here are.  # a c
5200: 6f 75 70 6c 65 20 6f 66 20 6f 62 73 63 75 72 65  ouple of obscure
5210: 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74 20   IO errors that 
5220: 64 6f 20 6e 6f 74 20 72 65 74 75 72 6e 20 74 68  do not return th
5230: 65 6d 2e 0a 20 20 73 65 74 20 3a 3a 69 6f 65 72  em..  set ::ioer
5240: 72 6f 70 74 73 28 2d 65 72 63 29 20 30 0a 0a 20  ropts(-erc) 0.. 
5250: 20 73 65 74 20 3a 3a 67 6f 20 31 0a 20 20 23 72   set ::go 1.  #r
5260: 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a  eset_prng_state.
5270: 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74    save_prng_stat
5280: 65 0a 20 20 66 6f 72 20 7b 73 65 74 20 6e 20 24  e.  for {set n $
5290: 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 73 74 61  ::ioerropts(-sta
52a0: 72 74 29 7d 20 7b 24 3a 3a 67 6f 7d 20 7b 69 6e  rt)} {$::go} {in
52b0: 63 72 20 6e 7d 20 7b 0a 20 20 20 20 73 65 74 20  cr n} {.    set 
52c0: 3a 3a 54 4e 20 24 6e 0a 20 20 20 20 69 6e 63 72  ::TN $n.    incr
52d0: 20 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 63 6f   ::ioerropts(-co
52e0: 75 6e 74 29 20 2d 31 0a 20 20 20 20 69 66 20 7b  unt) -1.    if {
52f0: 24 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 63 6f  $::ioerropts(-co
5300: 75 6e 74 29 3c 30 7d 20 62 72 65 61 6b 0a 20 0a  unt)<0} break. .
5310: 20 20 20 20 23 20 53 6b 69 70 20 74 68 69 73 20      # Skip this 
5320: 49 4f 20 65 72 72 6f 72 20 69 66 20 69 74 20 77  IO error if it w
5330: 61 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  as specified wit
5340: 68 20 74 68 65 20 22 2d 65 78 63 6c 75 64 65 22  h the "-exclude"
5350: 20 6f 70 74 69 6f 6e 2e 0a 20 20 20 20 69 66 20   option..    if 
5360: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
5370: 69 6f 65 72 72 6f 70 74 73 28 2d 65 78 63 6c 75  ioerropts(-exclu
5380: 64 65 29 5d 7d 20 7b 0a 20 20 20 20 20 20 69 66  de)]} {.      if
5390: 20 7b 5b 6c 73 65 61 72 63 68 20 24 3a 3a 69 6f   {[lsearch $::io
53a0: 65 72 72 6f 70 74 73 28 2d 65 78 63 6c 75 64 65  erropts(-exclude
53b0: 29 20 24 6e 5d 21 3d 2d 31 7d 20 63 6f 6e 74 69  ) $n]!=-1} conti
53c0: 6e 75 65 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nue.    }.    if
53d0: 20 7b 24 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d   {$::ioerropts(-
53e0: 72 65 73 74 6f 72 65 70 72 6e 67 29 7d 20 7b 0a  restoreprng)} {.
53f0: 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 70 72        restore_pr
5400: 6e 67 5f 73 74 61 74 65 0a 20 20 20 20 7d 0a 0a  ng_state.    }..
5410: 20 20 20 20 23 20 44 65 6c 65 74 65 20 74 68 65      # Delete the
5420: 20 66 69 6c 65 73 20 74 65 73 74 2e 64 62 20 61   files test.db a
5430: 6e 64 20 74 65 73 74 32 2e 64 62 2c 20 74 68 65  nd test2.db, the
5440: 6e 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43  n execute the TC
5450: 4c 20 61 6e 64 20 0a 20 20 20 20 23 20 53 51 4c  L and .    # SQL
5460: 20 28 69 6e 20 74 68 61 74 20 6f 72 64 65 72 29   (in that order)
5470: 20 74 6f 20 70 72 65 70 61 72 65 20 66 6f 72 20   to prepare for 
5480: 74 68 65 20 74 65 73 74 20 63 61 73 65 2e 0a 20  the test case.. 
5490: 20 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74     do_test $test
54a0: 6e 61 6d 65 2e 24 6e 2e 31 20 7b 0a 20 20 20 20  name.$n.1 {.    
54b0: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69    set ::sqlite_i
54c0: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
54d0: 30 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 64  0.      catch {d
54e0: 62 20 63 6c 6f 73 65 7d 0a 20 20 20 20 20 20 63  b close}.      c
54f0: 61 74 63 68 20 7b 64 62 32 20 63 6c 6f 73 65 7d  atch {db2 close}
5500: 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 66 69  .      catch {fi
5510: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
5520: 20 74 65 73 74 2e 64 62 7d 0a 20 20 20 20 20 20   test.db}.      
5530: 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
5540: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  te -force test.d
5550: 62 2d 6a 6f 75 72 6e 61 6c 7d 0a 20 20 20 20 20  b-journal}.     
5560: 20 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c   catch {file del
5570: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32  ete -force test2
5580: 2e 64 62 7d 0a 20 20 20 20 20 20 63 61 74 63 68  .db}.      catch
5590: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66   {file delete -f
55a0: 6f 72 63 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f  orce test2.db-jo
55b0: 75 72 6e 61 6c 7d 0a 20 20 20 20 20 20 73 65 74  urnal}.      set
55c0: 20 3a 3a 44 42 20 5b 73 71 6c 69 74 65 33 20 64   ::DB [sqlite3 d
55d0: 62 20 74 65 73 74 2e 64 62 3b 20 73 71 6c 69 74  b test.db; sqlit
55e0: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
55f0: 69 6e 74 65 72 20 64 62 5d 0a 20 20 20 20 20 20  inter db].      
5600: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
5610: 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 24 3a  _result_codes $:
5620: 3a 44 42 20 24 3a 3a 69 6f 65 72 72 6f 70 74 73  :DB $::ioerropts
5630: 28 2d 65 72 63 29 0a 20 20 20 20 20 20 69 66 20  (-erc).      if 
5640: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
5650: 69 6f 65 72 72 6f 70 74 73 28 2d 74 63 6c 70 72  ioerropts(-tclpr
5660: 65 70 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  ep)]} {.        
5670: 65 76 61 6c 20 24 3a 3a 69 6f 65 72 72 6f 70 74  eval $::ioerropt
5680: 73 28 2d 74 63 6c 70 72 65 70 29 0a 20 20 20 20  s(-tclprep).    
5690: 20 20 7d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69    }.      if {[i
56a0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 69 6f 65  nfo exists ::ioe
56b0: 72 72 6f 70 74 73 28 2d 73 71 6c 70 72 65 70 29  rropts(-sqlprep)
56c0: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 65 78 65  ]} {.        exe
56d0: 63 73 71 6c 20 24 3a 3a 69 6f 65 72 72 6f 70 74  csql $::ioerropt
56e0: 73 28 2d 73 71 6c 70 72 65 70 29 0a 20 20 20 20  s(-sqlprep).    
56f0: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 20 30    }.      expr 0
5700: 0a 20 20 20 20 7d 20 7b 30 7d 0a 0a 20 20 20 20  .    } {0}..    
5710: 23 20 52 65 61 64 20 74 68 65 20 27 63 68 65 63  # Read the 'chec
5720: 6b 73 75 6d 27 20 6f 66 20 74 68 65 20 64 61 74  ksum' of the dat
5730: 61 62 61 73 65 2e 0a 20 20 20 20 69 66 20 7b 24  abase..    if {$
5740: 3a 3a 69 6f 65 72 72 6f 70 74 73 28 2d 63 6b 73  ::ioerropts(-cks
5750: 75 6d 29 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  um)} {.      set
5760: 20 63 68 65 63 6b 73 75 6d 20 5b 63 6b 73 75 6d   checksum [cksum
5770: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 53  ].    }..    # S
5780: 65 74 20 74 68 65 20 4e 74 68 20 49 4f 20 65 72  et the Nth IO er
5790: 72 6f 72 20 74 6f 20 66 61 69 6c 2e 0a 20 20 20  ror to fail..   
57a0: 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 6e 61   do_test $testna
57b0: 6d 65 2e 24 6e 2e 32 20 5b 73 75 62 73 74 20 7b  me.$n.2 [subst {
57c0: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 73 71 6c  .      set ::sql
57d0: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72  ite_io_error_per
57e0: 73 69 73 74 20 24 3a 3a 69 6f 65 72 72 6f 70 74  sist $::ioerropt
57f0: 73 28 2d 70 65 72 73 69 73 74 29 0a 20 20 20 20  s(-persist).    
5800: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69    set ::sqlite_i
5810: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
5820: 24 6e 0a 20 20 20 20 7d 5d 20 24 6e 0a 20 20 0a  $n.    }] $n.  .
5830: 20 20 20 20 23 20 43 72 65 61 74 65 20 61 20 73      # Create a s
5840: 69 6e 67 6c 65 20 54 43 4c 20 73 63 72 69 70 74  ingle TCL script
5850: 20 66 72 6f 6d 20 74 68 65 20 54 43 4c 20 61 6e   from the TCL an
5860: 64 20 53 51 4c 20 73 70 65 63 69 66 69 65 64 0a  d SQL specified.
5870: 20 20 20 20 23 20 61 73 20 74 68 65 20 62 6f 64      # as the bod
5880: 79 20 6f 66 20 74 68 65 20 74 65 73 74 2e 0a 20  y of the test.. 
5890: 20 20 20 73 65 74 20 3a 3a 69 6f 65 72 72 6f 72     set ::ioerror
58a0: 62 6f 64 79 20 7b 7d 0a 20 20 20 20 69 66 20 7b  body {}.    if {
58b0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 69  [info exists ::i
58c0: 6f 65 72 72 6f 70 74 73 28 2d 74 63 6c 62 6f 64  oerropts(-tclbod
58d0: 79 29 5d 7d 20 7b 0a 20 20 20 20 20 20 61 70 70  y)]} {.      app
58e0: 65 6e 64 20 3a 3a 69 6f 65 72 72 6f 72 62 6f 64  end ::ioerrorbod
58f0: 79 20 22 24 3a 3a 69 6f 65 72 72 6f 70 74 73 28  y "$::ioerropts(
5900: 2d 74 63 6c 62 6f 64 79 29 5c 6e 22 0a 20 20 20  -tclbody)\n".   
5910: 20 7d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f   }.    if {[info
5920: 20 65 78 69 73 74 73 20 3a 3a 69 6f 65 72 72 6f   exists ::ioerro
5930: 70 74 73 28 2d 73 71 6c 62 6f 64 79 29 5d 7d 20  pts(-sqlbody)]} 
5940: 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 3a  {.      append :
5950: 3a 69 6f 65 72 72 6f 72 62 6f 64 79 20 22 64 62  :ioerrorbody "db
5960: 20 65 76 61 6c 20 7b 24 3a 3a 69 6f 65 72 72 6f   eval {$::ioerro
5970: 70 74 73 28 2d 73 71 6c 62 6f 64 79 29 7d 22 0a  pts(-sqlbody)}".
5980: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 45 78 65      }..    # Exe
5990: 63 75 74 65 20 74 68 65 20 54 43 4c 20 53 63 72  cute the TCL Scr
59a0: 69 70 74 20 63 72 65 61 74 65 64 20 69 6e 20 74  ipt created in t
59b0: 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20  he above block. 
59c0: 49 66 0a 20 20 20 20 23 20 74 68 65 72 65 20 61  If.    # there a
59d0: 72 65 20 61 74 20 6c 65 61 73 74 20 4e 20 49 4f  re at least N IO
59e0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 70 65 72 66   operations perf
59f0: 6f 72 6d 65 64 20 62 79 20 53 51 4c 69 74 65 20  ormed by SQLite 
5a00: 61 73 0a 20 20 20 20 23 20 61 20 72 65 73 75 6c  as.    # a resul
5a10: 74 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 2c  t of the script,
5a20: 20 74 68 65 20 4e 74 68 20 77 69 6c 6c 20 66 61   the Nth will fa
5a30: 69 6c 2e 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  il..    do_test 
5a40: 24 74 65 73 74 6e 61 6d 65 2e 24 6e 2e 33 20 7b  $testname.$n.3 {
5a50: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 73 71 6c  .      set ::sql
5a60: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  ite_io_error_hit
5a70: 20 30 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 73   0.      set ::s
5a80: 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68  qlite_io_error_h
5a90: 61 72 64 68 69 74 20 30 0a 20 20 20 20 20 20 73  ardhit 0.      s
5aa0: 65 74 20 72 20 5b 63 61 74 63 68 20 24 3a 3a 69  et r [catch $::i
5ab0: 6f 65 72 72 6f 72 62 6f 64 79 20 6d 73 67 5d 0a  oerrorbody msg].
5ac0: 20 20 20 20 20 20 73 65 74 20 3a 3a 65 72 72 73        set ::errs
5ad0: 65 65 6e 20 24 72 0a 20 20 20 20 20 20 73 65 74  een $r.      set
5ae0: 20 72 63 20 5b 73 71 6c 69 74 65 33 5f 65 72 72   rc [sqlite3_err
5af0: 63 6f 64 65 20 24 3a 3a 44 42 5d 0a 20 20 20 20  code $::DB].    
5b00: 20 20 69 66 20 7b 24 3a 3a 69 6f 65 72 72 6f 70    if {$::ioerrop
5b10: 74 73 28 2d 65 72 63 29 7d 20 7b 0a 20 20 20 20  ts(-erc)} {.    
5b20: 20 20 20 20 23 20 49 66 20 77 65 20 61 72 65 20      # If we are 
5b30: 69 6e 20 65 78 74 65 6e 64 65 64 20 72 65 73 75  in extended resu
5b40: 6c 74 20 63 6f 64 65 20 6d 6f 64 65 2c 20 6d 61  lt code mode, ma
5b50: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6f 66 20 74  ke sure all of t
5b60: 68 65 0a 20 20 20 20 20 20 20 20 23 20 49 4f 45  he.        # IOE
5b70: 52 52 73 20 77 65 20 67 65 74 20 62 61 63 6b 20  RRs we get back 
5b80: 72 65 61 6c 6c 79 20 64 6f 20 68 61 76 65 20 74  really do have t
5b90: 68 65 69 72 20 65 78 74 65 6e 64 65 64 20 63 6f  heir extended co
5ba0: 64 65 20 76 61 6c 75 65 73 2e 0a 20 20 20 20 20  de values..     
5bb0: 20 20 20 23 20 49 66 20 61 6e 20 65 78 74 65 6e     # If an exten
5bc0: 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ded result code 
5bd0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
5be0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
5bf0: 0a 20 20 20 20 20 20 20 20 23 20 54 43 4c 63 6f  .        # TCLco
5c00: 6d 6d 61 6e 64 20 77 69 6c 6c 20 72 65 74 75 72  mmand will retur
5c10: 6e 20 61 20 73 74 72 69 6e 67 20 6f 66 20 74 68  n a string of th
5c20: 65 20 66 6f 72 6d 3a 20 20 53 51 4c 49 54 45 5f  e form:  SQLITE_
5c30: 49 4f 45 52 52 2b 6e 6e 6e 6e 0a 20 20 20 20 20  IOERR+nnnn.     
5c40: 20 20 20 23 20 77 68 65 72 65 20 6e 6e 6e 6e 20     # where nnnn 
5c50: 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 20 20  is a number.    
5c60: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
5c70: 7b 5e 53 51 4c 49 54 45 5f 49 4f 45 52 52 7d 20  {^SQLITE_IOERR} 
5c80: 24 72 63 5d 20 26 26 20 21 5b 72 65 67 65 78 70  $rc] && ![regexp
5c90: 20 7b 49 4f 45 52 52 5c 2b 5c 64 7d 20 24 72 63   {IOERR\+\d} $rc
5ca0: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ]} {.          r
5cb0: 65 74 75 72 6e 20 24 72 63 0a 20 20 20 20 20 20  eturn $rc.      
5cc0: 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65    }.      } else
5cd0: 20 7b 0a 20 20 20 20 20 20 20 20 23 20 49 66 20   {.        # If 
5ce0: 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 65 78  we are not in ex
5cf0: 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f  tended result co
5d00: 64 65 20 6d 6f 64 65 2c 20 6d 61 6b 65 20 73 75  de mode, make su
5d10: 72 65 20 6e 6f 0a 20 20 20 20 20 20 20 20 23 20  re no.        # 
5d20: 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63  extended error c
5d30: 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
5d40: 64 2e 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  d..        if {[
5d50: 72 65 67 65 78 70 20 7b 5c 2b 5c 64 7d 20 24 72  regexp {\+\d} $r
5d60: 63 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  c]} {.          
5d70: 72 65 74 75 72 6e 20 24 72 63 0a 20 20 20 20 20  return $rc.     
5d80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5d90: 20 20 20 23 20 54 68 65 20 74 65 73 74 20 72 65     # The test re
5da0: 70 65 61 74 73 20 61 73 20 6c 6f 6e 67 20 61 73  peats as long as
5db0: 20 24 3a 3a 67 6f 20 69 73 20 6e 6f 6e 2d 7a 65   $::go is non-ze
5dc0: 72 6f 2e 20 20 24 3a 3a 67 6f 20 73 74 61 72 74  ro.  $::go start
5dd0: 73 20 6f 75 74 0a 20 20 20 20 20 20 23 20 61 73  s out.      # as
5de0: 20 31 2e 20 20 57 68 65 6e 20 61 20 74 65 73 74   1.  When a test
5df0: 20 72 75 6e 73 20 74 6f 20 63 6f 6d 70 6c 65 74   runs to complet
5e00: 69 6f 6e 20 77 69 74 68 6f 75 74 20 68 69 74 74  ion without hitt
5e10: 69 6e 67 20 61 6e 20 49 2f 4f 0a 20 20 20 20 20  ing an I/O.     
5e20: 20 23 20 65 72 72 6f 72 2c 20 74 68 61 74 20 6d   # error, that m
5e30: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f  eans there is no
5e40: 20 70 6f 69 6e 74 20 69 6e 20 63 6f 6e 74 69 6e   point in contin
5e50: 75 69 6e 67 20 77 69 74 68 20 74 68 69 73 20 74  uing with this t
5e60: 65 73 74 0a 20 20 20 20 20 20 23 20 63 61 73 65  est.      # case
5e70: 20 73 6f 20 73 65 74 20 24 3a 3a 67 6f 20 74 6f   so set $::go to
5e80: 20 7a 65 72 6f 2e 0a 20 20 20 20 20 20 23 0a 20   zero..      #. 
5e90: 20 20 20 20 20 69 66 20 7b 24 3a 3a 73 71 6c 69       if {$::sqli
5ea0: 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  te_io_error_pend
5eb0: 69 6e 67 3e 30 7d 20 7b 0a 20 20 20 20 20 20 20  ing>0} {.       
5ec0: 20 73 65 74 20 3a 3a 67 6f 20 30 0a 20 20 20 20   set ::go 0.    
5ed0: 20 20 20 20 73 65 74 20 71 20 30 0a 20 20 20 20      set q 0.    
5ee0: 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65      set ::sqlite
5ef0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
5f00: 67 20 30 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  g 0.      } else
5f10: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 71   {.        set q
5f20: 20 31 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   1.      }..    
5f30: 20 20 73 65 74 20 73 20 5b 65 78 70 72 20 24 3a    set s [expr $:
5f40: 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72  :sqlite_io_error
5f50: 5f 68 69 74 3d 3d 30 5d 0a 20 20 20 20 20 20 69  _hit==0].      i
5f60: 66 20 7b 24 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f  f {$::sqlite_io_
5f70: 65 72 72 6f 72 5f 68 69 74 3e 24 3a 3a 73 71 6c  error_hit>$::sql
5f80: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 72  ite_io_error_har
5f90: 64 68 69 74 20 26 26 20 24 72 3d 3d 30 7d 20 7b  dhit && $r==0} {
5fa0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 20 31  .        set r 1
5fb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
5fc0: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65  et ::sqlite_io_e
5fd0: 72 72 6f 72 5f 68 69 74 20 30 0a 0a 20 20 20 20  rror_hit 0..    
5fe0: 20 20 23 20 4f 6e 65 20 6f 66 20 74 77 6f 20 74    # One of two t
5ff0: 68 69 6e 67 73 20 6d 75 73 74 20 68 61 76 65 20  hings must have 
6000: 68 61 70 70 65 6e 65 64 2e 20 65 69 74 68 65 72  happened. either
6010: 0a 20 20 20 20 20 20 23 20 20 20 31 2e 20 20 57  .      #   1.  W
6020: 65 20 6e 65 76 65 72 20 68 69 74 20 74 68 65 20  e never hit the 
6030: 49 4f 20 65 72 72 6f 72 20 61 6e 64 20 74 68 65  IO error and the
6040: 20 53 51 4c 20 72 65 74 75 72 6e 65 64 20 4f 4b   SQL returned OK
6050: 0a 20 20 20 20 20 20 23 20 20 20 32 2e 20 20 41  .      #   2.  A
6060: 6e 20 49 4f 20 65 72 72 6f 72 20 77 61 73 20 68  n IO error was h
6070: 69 74 20 61 6e 64 20 74 68 65 20 53 51 4c 20 66  it and the SQL f
6080: 61 69 6c 65 64 0a 20 20 20 20 20 20 23 0a 20 20  ailed.      #.  
6090: 20 20 20 20 23 70 75 74 73 20 22 73 3d 24 73 20      #puts "s=$s 
60a0: 72 3d 24 72 20 71 3d 24 71 22 0a 20 20 20 20 20  r=$r q=$q".     
60b0: 20 65 78 70 72 20 7b 20 28 24 73 20 26 26 20 21   expr { ($s && !
60c0: 24 72 20 26 26 20 21 24 71 29 20 7c 7c 20 28 21  $r && !$q) || (!
60d0: 24 73 20 26 26 20 24 72 20 26 26 20 24 71 29 20  $s && $r && $q) 
60e0: 7d 0a 20 20 20 20 7d 20 7b 31 7d 0a 0a 20 20 20  }.    } {1}..   
60f0: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f   set ::sqlite_io
6100: 5f 65 72 72 6f 72 5f 68 69 74 20 30 0a 20 20 20  _error_hit 0.   
6110: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f   set ::sqlite_io
6120: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 30  _error_pending 0
6130: 0a 0a 20 20 20 20 23 20 43 68 65 63 6b 20 74 68  ..    # Check th
6140: 61 74 20 6e 6f 20 70 61 67 65 20 72 65 66 65 72  at no page refer
6150: 65 6e 63 65 73 20 77 65 72 65 20 6c 65 61 6b 65  ences were leake
6160: 64 2e 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  d. There should 
6170: 62 65 20 0a 20 20 20 20 23 20 61 20 73 69 6e 67  be .    # a sing
6180: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 69 66 20  le reference if 
6190: 74 68 65 72 65 20 69 73 20 73 74 69 6c 6c 20 61  there is still a
61a0: 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
61b0: 74 69 6f 6e 2c 20 0a 20 20 20 20 23 20 6f 72 20  tion, .    # or 
61c0: 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a  zero otherwise..
61d0: 20 20 20 20 23 0a 20 20 20 20 23 20 55 50 44 41      #.    # UPDA
61e0: 54 45 3a 20 49 66 20 74 68 65 20 49 4f 20 65 72  TE: If the IO er
61f0: 72 6f 72 20 6f 63 63 75 72 73 20 61 66 74 65 72  ror occurs after
6200: 20 61 20 27 42 45 47 49 4e 27 20 62 75 74 20 62   a 'BEGIN' but b
6210: 65 66 6f 72 65 20 61 6e 79 0a 20 20 20 20 23 20  efore any.    # 
6220: 6c 6f 63 6b 73 20 61 72 65 20 65 73 74 61 62 6c  locks are establ
6230: 69 73 68 65 64 20 6f 6e 20 64 61 74 61 62 61 73  ished on databas
6240: 65 20 66 69 6c 65 73 20 28 69 2e 65 2e 20 69 66  e files (i.e. if
6250: 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
6260: 23 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61  # occurs while a
6270: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 64 65 74  ttempting to det
6280: 65 63 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ect a hot-journa
6290: 6c 20 66 69 6c 65 29 2c 20 74 68 65 6e 0a 20 20  l file), then.  
62a0: 20 20 23 20 74 68 65 72 65 20 6d 61 79 20 30 20    # there may 0 
62b0: 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  page references 
62c0: 61 6e 64 20 61 6e 20 61 63 74 69 76 65 20 74 72  and an active tr
62d0: 61 6e 73 61 63 74 69 6f 6e 20 61 63 63 6f 72 64  ansaction accord
62e0: 69 6e 67 0a 20 20 20 20 23 20 74 6f 20 5b 73 71  ing.    # to [sq
62f0: 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
6300: 6d 6d 69 74 5d 2e 0a 20 20 20 20 23 0a 20 20 20  mmit]..    #.   
6310: 20 69 66 20 7b 24 3a 3a 67 6f 20 26 26 20 24 3a   if {$::go && $:
6320: 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72  :sqlite_io_error
6330: 5f 68 61 72 64 68 69 74 20 26 26 20 24 3a 3a 69  _hardhit && $::i
6340: 6f 65 72 72 6f 70 74 73 28 2d 63 6b 72 65 66 63  oerropts(-ckrefc
6350: 6f 75 6e 74 29 7d 20 7b 0a 20 20 20 20 20 20 64  ount)} {.      d
6360: 6f 5f 74 65 73 74 20 24 74 65 73 74 6e 61 6d 65  o_test $testname
6370: 2e 24 6e 2e 34 20 7b 0a 20 20 20 20 20 20 20 20  .$n.4 {.        
6380: 73 65 74 20 62 74 20 5b 62 74 72 65 65 5f 66 72  set bt [btree_fr
6390: 6f 6d 5f 64 62 20 64 62 5d 0a 20 20 20 20 20 20  om_db db].      
63a0: 20 20 64 62 5f 65 6e 74 65 72 20 64 62 0a 20 20    db_enter db.  
63b0: 20 20 20 20 20 20 61 72 72 61 79 20 73 65 74 20        array set 
63c0: 73 74 61 74 73 20 5b 62 74 72 65 65 5f 70 61 67  stats [btree_pag
63d0: 65 72 5f 73 74 61 74 73 20 24 62 74 5d 0a 20 20  er_stats $bt].  
63e0: 20 20 20 20 20 20 64 62 5f 6c 65 61 76 65 20 64        db_leave d
63f0: 62 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 52  b.        set nR
6400: 65 66 20 24 73 74 61 74 73 28 72 65 66 29 0a 20  ef $stats(ref). 
6410: 20 20 20 20 20 20 20 65 78 70 72 20 7b 24 6e 52         expr {$nR
6420: 65 66 20 3d 3d 20 30 20 7c 7c 20 28 5b 73 71 6c  ef == 0 || ([sql
6430: 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
6440: 6d 69 74 20 64 62 5d 3d 3d 30 20 26 26 20 24 6e  mit db]==0 && $n
6450: 52 65 66 20 3d 3d 20 31 29 7d 0a 20 20 20 20 20  Ref == 1)}.     
6460: 20 7d 20 7b 31 7d 0a 20 20 20 20 7d 0a 0a 20 20   } {1}.    }..  
6470: 20 20 23 20 49 66 20 74 68 65 72 65 20 69 73 20    # If there is 
6480: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
6490: 20 68 61 6e 64 6c 65 20 61 6e 64 20 6e 6f 20 6f   handle and no o
64a0: 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
64b0: 20 0a 20 20 20 20 23 20 61 6e 64 20 74 68 65 20   .    # and the 
64c0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 72 75 6e  pager is not run
64d0: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
64e0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 0a  e-locking mode,.
64f0: 20 20 20 20 23 20 63 68 65 63 6b 20 74 68 61 74      # check that
6500: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
6510: 20 22 75 6e 6c 6f 63 6b 65 64 22 20 73 74 61 74   "unlocked" stat
6520: 65 2e 20 54 68 65 6f 72 65 74 69 63 61 6c 6c 79  e. Theoretically
6530: 2c 0a 20 20 20 20 23 20 69 66 20 61 20 63 61 6c  ,.    # if a cal
6540: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
6550: 61 69 6c 65 64 20 64 75 65 20 74 6f 20 61 6e 20  ailed due to an 
6560: 49 4f 20 65 72 72 6f 72 20 74 68 65 20 75 6e 64  IO error the und
6570: 65 72 6c 79 69 6e 67 0a 20 20 20 20 23 20 66 69  erlying.    # fi
6580: 6c 65 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  le may still be 
6590: 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 23 0a 20 20  locked..    #.  
65a0: 20 20 69 66 63 61 70 61 62 6c 65 20 70 72 61 67    ifcapable prag
65b0: 6d 61 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 20  ma {.      if { 
65c0: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64  [info commands d
65d0: 62 5d 20 6e 65 20 22 22 0a 20 20 20 20 20 20 20  b] ne "".       
65e0: 20 26 26 20 24 3a 3a 69 6f 65 72 72 6f 70 74 73   && $::ioerropts
65f0: 28 2d 63 6b 72 65 66 63 6f 75 6e 74 29 0a 20 20  (-ckrefcount).  
6600: 20 20 20 20 20 20 26 26 20 5b 64 62 20 6f 6e 65        && [db one
6610: 20 7b 70 72 61 67 6d 61 20 6c 6f 63 6b 69 6e 67   {pragma locking
6620: 5f 6d 6f 64 65 7d 5d 20 65 71 20 22 6e 6f 72 6d  _mode}] eq "norm
6630: 61 6c 22 0a 20 20 20 20 20 20 20 20 26 26 20 5b  al".        && [
6640: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
6650: 63 6f 6d 6d 69 74 20 64 62 5d 0a 20 20 20 20 20  commit db].     
6660: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 5f   } {.        do_
6670: 74 65 73 74 20 24 74 65 73 74 6e 61 6d 65 2e 24  test $testname.$
6680: 6e 2e 35 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n.5 {.          
6690: 73 65 74 20 62 74 20 5b 62 74 72 65 65 5f 66 72  set bt [btree_fr
66a0: 6f 6d 5f 64 62 20 64 62 5d 0a 20 20 20 20 20 20  om_db db].      
66b0: 20 20 20 20 64 62 5f 65 6e 74 65 72 20 64 62 0a      db_enter db.
66c0: 20 20 20 20 20 20 20 20 20 20 61 72 72 61 79 20            array 
66d0: 73 65 74 20 73 74 61 74 73 20 5b 62 74 72 65 65  set stats [btree
66e0: 5f 70 61 67 65 72 5f 73 74 61 74 73 20 24 62 74  _pager_stats $bt
66f0: 5d 0a 20 20 20 20 20 20 20 20 20 20 64 62 5f 6c  ].          db_l
6700: 65 61 76 65 20 64 62 0a 20 20 20 20 20 20 20 20  eave db.        
6710: 20 20 73 65 74 20 73 74 61 74 73 28 73 74 61 74    set stats(stat
6720: 65 29 0a 20 20 20 20 20 20 20 20 7d 20 30 0a 20  e).        } 0. 
6730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
6740: 20 20 23 20 49 66 20 61 6e 20 49 4f 20 65 72 72    # If an IO err
6750: 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e  or occured, then
6760: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
6770: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
6780: 6f 75 6c 64 0a 20 20 20 20 23 20 62 65 20 74 68  ould.    # be th
6790: 65 20 73 61 6d 65 20 61 73 20 62 65 66 6f 72 65  e same as before
67a0: 20 74 68 65 20 73 63 72 69 70 74 20 74 68 61 74   the script that
67b0: 20 63 61 75 73 65 64 20 74 68 65 20 49 4f 20 65   caused the IO e
67c0: 72 72 6f 72 20 77 61 73 20 72 75 6e 2e 0a 20 20  rror was run..  
67d0: 20 20 23 0a 20 20 20 20 69 66 20 7b 24 3a 3a 67    #.    if {$::g
67e0: 6f 20 26 26 20 24 3a 3a 73 71 6c 69 74 65 5f 69  o && $::sqlite_i
67f0: 6f 5f 65 72 72 6f 72 5f 68 61 72 64 68 69 74 20  o_error_hardhit 
6800: 26 26 20 24 3a 3a 69 6f 65 72 72 6f 70 74 73 28  && $::ioerropts(
6810: 2d 63 6b 73 75 6d 29 7d 20 7b 0a 20 20 20 20 20  -cksum)} {.     
6820: 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 6e 61   do_test $testna
6830: 6d 65 2e 24 6e 2e 36 20 7b 0a 20 20 20 20 20 20  me.$n.6 {.      
6840: 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73    catch {db clos
6850: 65 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  e}.        catch
6860: 20 7b 64 62 32 20 63 6c 6f 73 65 7d 0a 20 20 20   {db2 close}.   
6870: 20 20 20 20 20 73 65 74 20 3a 3a 44 42 20 5b 73       set ::DB [s
6880: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
6890: 62 3b 20 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  b; sqlite3_conne
68a0: 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62  ction_pointer db
68b0: 5d 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 0a  ].        cksum.
68c0: 20 20 20 20 20 20 7d 20 24 63 68 65 63 6b 73 75        } $checksu
68d0: 6d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74  m.    }..    set
68e0: 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72   ::sqlite_io_err
68f0: 6f 72 5f 68 61 72 64 68 69 74 20 30 0a 20 20 20  or_hardhit 0.   
6900: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f   set ::sqlite_io
6910: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 30  _error_pending 0
6920: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
6930: 78 69 73 74 73 20 3a 3a 69 6f 65 72 72 6f 70 74  xists ::ioerropt
6940: 73 28 2d 63 6c 65 61 6e 75 70 29 5d 7d 20 7b 0a  s(-cleanup)]} {.
6950: 20 20 20 20 20 20 63 61 74 63 68 20 24 3a 3a 69        catch $::i
6960: 6f 65 72 72 6f 70 74 73 28 2d 63 6c 65 61 6e 75  oerropts(-cleanu
6970: 70 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  p).    }.  }.  s
6980: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f 5f 65  et ::sqlite_io_e
6990: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 30 0a 20  rror_pending 0. 
69a0: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 69 6f   set ::sqlite_io
69b0: 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74 20 30  _error_persist 0
69c0: 0a 20 20 75 6e 73 65 74 20 3a 3a 69 6f 65 72 72  .  unset ::ioerr
69d0: 6f 70 74 73 0a 7d 0a 0a 23 20 52 65 74 75 72 6e  opts.}..# Return
69e0: 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
69f0: 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
6a00: 73 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61  s of the main da
6a10: 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
6a20: 64 0a 23 20 77 69 74 68 20 63 6f 6e 6e 65 63 74  d.# with connect
6a30: 69 6f 6e 20 24 64 62 0a 23 0a 70 72 6f 63 20 63  ion $db.#.proc c
6a40: 6b 73 75 6d 20 7b 7b 64 62 20 64 62 7d 7d 20 7b  ksum {{db db}} {
6a50: 0a 20 20 73 65 74 20 74 78 74 20 5b 24 64 62 20  .  set txt [$db 
6a60: 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  eval {.      SEL
6a70: 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20  ECT name, type, 
6a80: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
6a90: 6d 61 73 74 65 72 20 6f 72 64 65 72 20 62 79 20  master order by 
6aa0: 6e 61 6d 65 0a 20 20 7d 5d 5c 6e 0a 20 20 66 6f  name.  }]\n.  fo
6ab0: 72 65 61 63 68 20 74 62 6c 20 5b 24 64 62 20 65  reach tbl [$db e
6ac0: 76 61 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  val {.      SELE
6ad0: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
6ae0: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
6af0: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 6f 72   type='table' or
6b00: 64 65 72 20 62 79 20 6e 61 6d 65 0a 20 20 7d 5d  der by name.  }]
6b10: 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 74 78   {.    append tx
6b20: 74 20 5b 24 64 62 20 65 76 61 6c 20 22 53 45 4c  t [$db eval "SEL
6b30: 45 43 54 20 2a 20 46 52 4f 4d 20 24 74 62 6c 22  ECT * FROM $tbl"
6b40: 5d 5c 6e 0a 20 20 7d 0a 20 20 66 6f 72 65 61 63  ]\n.  }.  foreac
6b50: 68 20 70 72 61 67 20 7b 64 65 66 61 75 6c 74 5f  h prag {default_
6b60: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 64 65 66 61  synchronous defa
6b70: 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 7d 20  ult_cache_size} 
6b80: 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 74 78 74  {.    append txt
6b90: 20 24 70 72 61 67 2d 5b 24 64 62 20 65 76 61 6c   $prag-[$db eval
6ba0: 20 22 50 52 41 47 4d 41 20 24 70 72 61 67 22 5d   "PRAGMA $prag"]
6bb0: 5c 6e 0a 20 20 7d 0a 20 20 73 65 74 20 63 6b 73  \n.  }.  set cks
6bc0: 75 6d 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  um [string lengt
6bd0: 68 20 24 74 78 74 5d 2d 5b 6d 64 35 20 24 74 78  h $txt]-[md5 $tx
6be0: 74 5d 0a 20 20 23 20 70 75 74 73 20 24 63 6b 73  t].  # puts $cks
6bf0: 75 6d 2d 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  um-[file size te
6c00: 73 74 2e 64 62 5d 0a 20 20 72 65 74 75 72 6e 20  st.db].  return 
6c10: 24 63 6b 73 75 6d 0a 7d 0a 0a 23 20 47 65 6e 65  $cksum.}..# Gene
6c20: 72 61 74 65 20 61 20 63 68 65 63 6b 73 75 6d 20  rate a checksum 
6c30: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
6c40: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 69  tents of the mai
6c50: 6e 20 61 6e 64 20 74 65 6d 70 20 74 61 62 6c 65  n and temp table
6c60: 73 0a 23 20 64 61 74 61 62 61 73 65 20 24 64 62  s.# database $db
6c70: 2e 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  . If the checksu
6c80: 6d 20 6f 66 20 74 77 6f 20 64 61 74 61 62 61 73  m of two databas
6c90: 65 73 20 69 73 20 74 68 65 20 73 61 6d 65 2c 20  es is the same, 
6ca0: 61 6e 64 20 74 68 65 0a 23 20 69 6e 74 65 67 72  and the.# integr
6cb0: 69 74 79 2d 63 68 65 63 6b 20 70 61 73 73 65 73  ity-check passes
6cc0: 20 66 6f 72 20 62 6f 74 68 2c 20 74 68 65 20 74   for both, the t
6cd0: 77 6f 20 64 61 74 61 62 61 73 65 73 20 61 72 65  wo databases are
6ce0: 20 69 64 65 6e 74 69 63 61 6c 2e 0a 23 0a 70 72   identical..#.pr
6cf0: 6f 63 20 61 6c 6c 63 6b 73 75 6d 20 7b 7b 64 62  oc allcksum {{db
6d00: 20 64 62 7d 7d 20 7b 0a 20 20 73 65 74 20 72 65   db}} {.  set re
6d10: 74 20 5b 6c 69 73 74 5d 0a 20 20 69 66 63 61 70  t [list].  ifcap
6d20: 61 62 6c 65 20 74 65 6d 70 64 62 20 7b 0a 20 20  able tempdb {.  
6d30: 20 20 73 65 74 20 73 71 6c 20 7b 0a 20 20 20 20    set sql {.    
6d40: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
6d50: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
6d60: 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 74   WHERE type = 't
6d70: 61 62 6c 65 27 20 55 4e 49 4f 4e 0a 20 20 20 20  able' UNION.    
6d80: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
6d90: 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
6da0: 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
6db0: 20 3d 20 27 74 61 62 6c 65 27 20 55 4e 49 4f 4e   = 'table' UNION
6dc0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 73  .      SELECT 's
6dd0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 20 55 4e  qlite_master' UN
6de0: 49 4f 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ION.      SELECT
6df0: 20 27 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   'sqlite_temp_ma
6e00: 73 74 65 72 27 20 4f 52 44 45 52 20 42 59 20 31  ster' ORDER BY 1
6e10: 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
6e20: 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20 7b 0a  {.    set sql {.
6e30: 20 20 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d        SELECT nam
6e40: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
6e50: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20  ster WHERE type 
6e60: 3d 20 27 74 61 62 6c 65 27 20 55 4e 49 4f 4e 0a  = 'table' UNION.
6e70: 20 20 20 20 20 20 53 45 4c 45 43 54 20 27 73 71        SELECT 'sq
6e80: 6c 69 74 65 5f 6d 61 73 74 65 72 27 20 4f 52 44  lite_master' ORD
6e90: 45 52 20 42 59 20 31 0a 20 20 20 20 7d 0a 20 20  ER BY 1.    }.  
6ea0: 7d 0a 20 20 73 65 74 20 74 62 6c 6c 69 73 74 20  }.  set tbllist 
6eb0: 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 0a  [$db eval $sql].
6ec0: 20 20 73 65 74 20 74 78 74 20 7b 7d 0a 20 20 66    set txt {}.  f
6ed0: 6f 72 65 61 63 68 20 74 62 6c 20 24 74 62 6c 6c  oreach tbl $tbll
6ee0: 69 73 74 20 7b 0a 20 20 20 20 61 70 70 65 6e 64  ist {.    append
6ef0: 20 74 78 74 20 5b 24 64 62 20 65 76 61 6c 20 22   txt [$db eval "
6f00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 24 74  SELECT * FROM $t
6f10: 62 6c 22 5d 0a 20 20 7d 0a 20 20 66 6f 72 65 61  bl"].  }.  forea
6f20: 63 68 20 70 72 61 67 20 7b 64 65 66 61 75 6c 74  ch prag {default
6f30: 5f 63 61 63 68 65 5f 73 69 7a 65 7d 20 7b 0a 20  _cache_size} {. 
6f40: 20 20 20 61 70 70 65 6e 64 20 74 78 74 20 24 70     append txt $p
6f50: 72 61 67 2d 5b 24 64 62 20 65 76 61 6c 20 22 50  rag-[$db eval "P
6f60: 52 41 47 4d 41 20 24 70 72 61 67 22 5d 5c 6e 0a  RAGMA $prag"]\n.
6f70: 20 20 7d 0a 20 20 23 20 70 75 74 73 20 74 78 74    }.  # puts txt
6f80: 3d 24 74 78 74 0a 20 20 72 65 74 75 72 6e 20 5b  =$txt.  return [
6f90: 6d 64 35 20 24 74 78 74 5d 0a 7d 0a 0a 23 20 47  md5 $txt].}..# G
6fa0: 65 6e 65 72 61 74 65 20 61 20 63 68 65 63 6b 73  enerate a checks
6fb0: 75 6d 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  um based on the 
6fc0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 73 69  contents of a si
6fd0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 77 69  ngle database wi
6fe0: 74 68 0a 23 20 61 20 64 61 74 61 62 61 73 65 20  th.# a database 
6ff0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65  connection.  The
7000: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
7010: 61 62 61 73 65 20 69 73 20 24 64 62 6e 61 6d 65  abase is $dbname
7020: 2e 20 20 0a 23 20 45 78 61 6d 70 6c 65 73 20 6f  .  .# Examples o
7030: 66 20 24 64 62 6e 61 6d 65 20 61 72 65 20 22 74  f $dbname are "t
7040: 65 6d 70 22 20 6f 72 20 22 6d 61 69 6e 22 2e 0a  emp" or "main"..
7050: 23 0a 70 72 6f 63 20 64 62 63 6b 73 75 6d 20 7b  #.proc dbcksum {
7060: 64 62 20 64 62 6e 61 6d 65 7d 20 7b 0a 20 20 69  db dbname} {.  i
7070: 66 20 7b 24 64 62 6e 61 6d 65 3d 3d 22 74 65 6d  f {$dbname=="tem
7080: 70 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 6d 61  p"} {.    set ma
7090: 73 74 65 72 20 73 71 6c 69 74 65 5f 74 65 6d 70  ster sqlite_temp
70a0: 5f 6d 61 73 74 65 72 0a 20 20 7d 20 65 6c 73 65  _master.  } else
70b0: 20 7b 0a 20 20 20 20 73 65 74 20 6d 61 73 74 65   {.    set maste
70c0: 72 20 24 64 62 6e 61 6d 65 2e 73 71 6c 69 74 65  r $dbname.sqlite
70d0: 5f 6d 61 73 74 65 72 0a 20 20 7d 0a 20 20 73 65  _master.  }.  se
70e0: 74 20 61 6c 6c 74 61 62 20 5b 24 64 62 20 65 76  t alltab [$db ev
70f0: 61 6c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20  al "SELECT name 
7100: 46 52 4f 4d 20 24 6d 61 73 74 65 72 20 57 48 45  FROM $master WHE
7110: 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22  RE type='table'"
7120: 5d 0a 20 20 73 65 74 20 74 78 74 20 5b 24 64 62  ].  set txt [$db
7130: 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 2a 20   eval "SELECT * 
7140: 46 52 4f 4d 20 24 6d 61 73 74 65 72 22 5d 5c 6e  FROM $master"]\n
7150: 0a 20 20 66 6f 72 65 61 63 68 20 74 61 62 20 24  .  foreach tab $
7160: 61 6c 6c 74 61 62 20 7b 0a 20 20 20 20 61 70 70  alltab {.    app
7170: 65 6e 64 20 74 78 74 20 5b 24 64 62 20 65 76 61  end txt [$db eva
7180: 6c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l "SELECT * FROM
7190: 20 24 64 62 6e 61 6d 65 2e 24 74 61 62 22 5d 5c   $dbname.$tab"]\
71a0: 6e 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 5b  n.  }.  return [
71b0: 6d 64 35 20 24 74 78 74 5d 0a 7d 0a 0a 70 72 6f  md5 $txt].}..pro
71c0: 63 20 6d 65 6d 64 65 62 75 67 5f 6c 6f 67 5f 73  c memdebug_log_s
71d0: 71 6c 20 7b 7b 66 69 6c 65 6e 61 6d 65 20 6d 61  ql {{filename ma
71e0: 6c 6c 6f 63 73 2e 73 71 6c 7d 7d 20 7b 0a 0a 20  llocs.sql}} {.. 
71f0: 20 73 65 74 20 64 61 74 61 20 5b 73 71 6c 69 74   set data [sqlit
7200: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 6c 6f 67 20  e3_memdebug_log 
7210: 64 75 6d 70 5d 0a 20 20 73 65 74 20 6e 46 72 61  dump].  set nFra
7220: 6d 65 20 5b 65 78 70 72 20 5b 6c 6c 65 6e 67 74  me [expr [llengt
7230: 68 20 5b 6c 69 6e 64 65 78 20 24 64 61 74 61 20  h [lindex $data 
7240: 30 5d 5d 2d 32 5d 0a 20 20 69 66 20 7b 24 6e 46  0]]-2].  if {$nF
7250: 72 61 6d 65 20 3c 20 30 7d 20 7b 20 72 65 74 75  rame < 0} { retu
7260: 72 6e 20 22 22 20 7d 0a 0a 20 20 73 65 74 20 64  rn "" }..  set d
7270: 61 74 61 62 61 73 65 20 74 65 6d 70 0a 0a 20 20  atabase temp..  
7280: 73 65 74 20 74 62 6c 20 22 43 52 45 41 54 45 20  set tbl "CREATE 
7290: 54 41 42 4c 45 20 24 7b 64 61 74 61 62 61 73 65  TABLE ${database
72a0: 7d 2e 6d 61 6c 6c 6f 63 28 7a 54 65 73 74 2c 20  }.malloc(zTest, 
72b0: 6e 43 61 6c 6c 2c 20 6e 42 79 74 65 2c 20 6c 53  nCall, nByte, lS
72c0: 74 61 63 6b 29 3b 22 0a 0a 20 20 73 65 74 20 73  tack);"..  set s
72d0: 71 6c 20 22 22 0a 20 20 66 6f 72 65 61 63 68 20  ql "".  foreach 
72e0: 65 20 24 64 61 74 61 20 7b 0a 20 20 20 20 73 65  e $data {.    se
72f0: 74 20 6e 43 61 6c 6c 20 5b 6c 69 6e 64 65 78 20  t nCall [lindex 
7300: 24 65 20 30 5d 0a 20 20 20 20 73 65 74 20 6e 42  $e 0].    set nB
7310: 79 74 65 20 5b 6c 69 6e 64 65 78 20 24 65 20 31  yte [lindex $e 1
7320: 5d 0a 20 20 20 20 73 65 74 20 6c 53 74 61 63 6b  ].    set lStack
7330: 20 5b 6c 72 61 6e 67 65 20 24 65 20 32 20 65 6e   [lrange $e 2 en
7340: 64 5d 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71  d].    append sq
7350: 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 24  l "INSERT INTO $
7360: 7b 64 61 74 61 62 61 73 65 7d 2e 6d 61 6c 6c 6f  {database}.mallo
7370: 63 20 56 41 4c 55 45 53 22 0a 20 20 20 20 61 70  c VALUES".    ap
7380: 70 65 6e 64 20 73 71 6c 20 22 28 27 74 65 73 74  pend sql "('test
7390: 27 2c 20 24 6e 43 61 6c 6c 2c 20 24 6e 42 79 74  ', $nCall, $nByt
73a0: 65 2c 20 27 24 6c 53 74 61 63 6b 27 29 3b 5c 6e  e, '$lStack');\n
73b0: 22 0a 20 20 20 20 66 6f 72 65 61 63 68 20 66 20  ".    foreach f 
73c0: 24 6c 53 74 61 63 6b 20 7b 0a 20 20 20 20 20 20  $lStack {.      
73d0: 73 65 74 20 66 72 61 6d 65 73 28 24 66 29 20 31  set frames($f) 1
73e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 65  .    }.  }..  se
73f0: 74 20 74 62 6c 32 20 22 43 52 45 41 54 45 20 54  t tbl2 "CREATE T
7400: 41 42 4c 45 20 24 7b 64 61 74 61 62 61 73 65 7d  ABLE ${database}
7410: 2e 66 72 61 6d 65 28 66 72 61 6d 65 20 49 4e 54  .frame(frame INT
7420: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7430: 2c 20 6c 69 6e 65 29 3b 5c 6e 22 0a 20 20 73 65  , line);\n".  se
7440: 74 20 74 62 6c 33 20 22 43 52 45 41 54 45 20 54  t tbl3 "CREATE T
7450: 41 42 4c 45 20 24 7b 64 61 74 61 62 61 73 65 7d  ABLE ${database}
7460: 2e 66 69 6c 65 28 6e 61 6d 65 20 50 52 49 4d 41  .file(name PRIMA
7470: 52 59 20 4b 45 59 2c 20 63 6f 6e 74 65 6e 74 29  RY KEY, content)
7480: 3b 5c 6e 22 0a 0a 20 20 66 6f 72 65 61 63 68 20  ;\n"..  foreach 
7490: 66 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 66  f [array names f
74a0: 72 61 6d 65 73 5d 20 7b 0a 20 20 20 20 73 65 74  rames] {.    set
74b0: 20 61 64 64 72 20 5b 66 6f 72 6d 61 74 20 25 78   addr [format %x
74c0: 20 24 66 5d 0a 20 20 20 20 73 65 74 20 63 6d 64   $f].    set cmd
74d0: 20 22 61 64 64 72 32 6c 69 6e 65 20 2d 65 20 5b   "addr2line -e [
74e0: 69 6e 66 6f 20 6e 61 6d 65 6f 66 65 78 65 63 5d  info nameofexec]
74f0: 20 24 61 64 64 72 22 0a 20 20 20 20 73 65 74 20   $addr".    set 
7500: 6c 69 6e 65 20 5b 65 76 61 6c 20 65 78 65 63 20  line [eval exec 
7510: 24 63 6d 64 5d 0a 20 20 20 20 61 70 70 65 6e 64  $cmd].    append
7520: 20 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54   sql "INSERT INT
7530: 4f 20 24 7b 64 61 74 61 62 61 73 65 7d 2e 66 72  O ${database}.fr
7540: 61 6d 65 20 56 41 4c 55 45 53 28 24 66 2c 20 27  ame VALUES($f, '
7550: 24 6c 69 6e 65 27 29 3b 5c 6e 22 0a 0a 20 20 20  $line');\n"..   
7560: 20 73 65 74 20 66 69 6c 65 20 5b 6c 69 6e 64 65   set file [linde
7570: 78 20 5b 73 70 6c 69 74 20 24 6c 69 6e 65 20 3a  x [split $line :
7580: 5d 20 30 5d 0a 20 20 20 20 73 65 74 20 66 69 6c  ] 0].    set fil
7590: 65 73 28 24 66 69 6c 65 29 20 31 0a 20 20 7d 0a  es($file) 1.  }.
75a0: 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b 61 72  .  foreach f [ar
75b0: 72 61 79 20 6e 61 6d 65 73 20 66 69 6c 65 73 5d  ray names files]
75c0: 20 7b 0a 20 20 20 20 73 65 74 20 63 6f 6e 74 65   {.    set conte
75d0: 6e 74 73 20 22 22 0a 20 20 20 20 63 61 74 63 68  nts "".    catch
75e0: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 66 64 20   {.      set fd 
75f0: 5b 6f 70 65 6e 20 24 66 5d 0a 20 20 20 20 20 20  [open $f].      
7600: 73 65 74 20 63 6f 6e 74 65 6e 74 73 20 5b 72 65  set contents [re
7610: 61 64 20 24 66 64 5d 0a 20 20 20 20 20 20 63 6c  ad $fd].      cl
7620: 6f 73 65 20 24 66 64 0a 20 20 20 20 7d 0a 20 20  ose $fd.    }.  
7630: 20 20 73 65 74 20 63 6f 6e 74 65 6e 74 73 20 5b    set contents [
7640: 73 74 72 69 6e 67 20 6d 61 70 20 7b 27 20 27 27  string map {' ''
7650: 7d 20 24 63 6f 6e 74 65 6e 74 73 5d 0a 20 20 20  } $contents].   
7660: 20 61 70 70 65 6e 64 20 73 71 6c 20 22 49 4e 53   append sql "INS
7670: 45 52 54 20 49 4e 54 4f 20 24 7b 64 61 74 61 62  ERT INTO ${datab
7680: 61 73 65 7d 2e 66 69 6c 65 20 56 41 4c 55 45 53  ase}.file VALUES
7690: 28 27 24 66 27 2c 20 27 24 63 6f 6e 74 65 6e 74  ('$f', '$content
76a0: 73 27 29 3b 5c 6e 22 0a 20 20 7d 0a 0a 20 20 73  s');\n".  }..  s
76b0: 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 66 69 6c  et fd [open $fil
76c0: 65 6e 61 6d 65 20 77 5d 0a 20 20 70 75 74 73 20  ename w].  puts 
76d0: 24 66 64 20 22 42 45 47 49 4e 3b 20 24 7b 74 62  $fd "BEGIN; ${tb
76e0: 6c 7d 24 7b 74 62 6c 32 7d 24 7b 74 62 6c 33 7d  l}${tbl2}${tbl3}
76f0: 24 7b 73 71 6c 7d 20 3b 20 43 4f 4d 4d 49 54 3b  ${sql} ; COMMIT;
7700: 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 7d 0a  ".  close $fd.}.
7710: 0a 23 20 43 6f 70 79 20 66 69 6c 65 20 24 66 72  .# Copy file $fr
7720: 6f 6d 20 69 6e 74 6f 20 24 74 6f 2e 20 54 68 69  om into $to. Thi
7730: 73 20 69 73 20 75 73 65 64 20 62 65 63 61 75 73  s is used becaus
7740: 65 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  e some versions 
7750: 6f 66 0a 23 20 54 43 4c 20 66 6f 72 20 77 69 6e  of.# TCL for win
7760: 64 6f 77 73 20 28 6e 6f 74 61 62 6c 79 20 74 68  dows (notably th
7770: 65 20 38 2e 34 2e 31 20 62 69 6e 61 72 79 20 70  e 8.4.1 binary p
7780: 61 63 6b 61 67 65 20 73 68 69 70 70 65 64 20 77  ackage shipped w
7790: 69 74 68 20 74 68 65 0a 23 20 63 75 72 72 65 6e  ith the.# curren
77a0: 74 20 6d 69 6e 67 77 20 72 65 6c 65 61 73 65 29  t mingw release)
77b0: 20 68 61 76 65 20 61 20 62 72 6f 6b 65 6e 20 22   have a broken "
77c0: 66 69 6c 65 20 63 6f 70 79 22 20 63 6f 6d 6d 61  file copy" comma
77d0: 6e 64 2e 0a 23 0a 70 72 6f 63 20 63 6f 70 79 5f  nd..#.proc copy_
77e0: 66 69 6c 65 20 7b 66 72 6f 6d 20 74 6f 7d 20 7b  file {from to} {
77f0: 0a 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c  .  if {$::tcl_pl
7800: 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29  atform(platform)
7810: 3d 3d 22 75 6e 69 78 22 7d 20 7b 0a 20 20 20 20  =="unix"} {.    
7820: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
7830: 20 24 66 72 6f 6d 20 24 74 6f 0a 20 20 7d 20 65   $from $to.  } e
7840: 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 66 20  lse {.    set f 
7850: 5b 6f 70 65 6e 20 24 66 72 6f 6d 5d 0a 20 20 20  [open $from].   
7860: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 20 2d   fconfigure $f -
7870: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61  translation bina
7880: 72 79 0a 20 20 20 20 73 65 74 20 74 20 5b 6f 70  ry.    set t [op
7890: 65 6e 20 24 74 6f 20 77 5d 0a 20 20 20 20 66 63  en $to w].    fc
78a0: 6f 6e 66 69 67 75 72 65 20 24 74 20 2d 74 72 61  onfigure $t -tra
78b0: 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a  nslation binary.
78c0: 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c      puts -nonewl
78d0: 69 6e 65 20 24 74 20 5b 72 65 61 64 20 24 66 20  ine $t [read $f 
78e0: 5b 66 69 6c 65 20 73 69 7a 65 20 24 66 72 6f 6d  [file size $from
78f0: 5d 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 74 0a  ]].    close $t.
7900: 20 20 20 20 63 6c 6f 73 65 20 24 66 0a 20 20 7d      close $f.  }
7910: 0a 7d 0a 0a 23 20 44 72 6f 70 20 61 6c 6c 20 74  .}..# Drop all t
7920: 61 62 6c 65 73 20 69 6e 20 64 61 74 61 62 61 73  ables in databas
7930: 65 20 5b 64 62 5d 0a 70 72 6f 63 20 64 72 6f 70  e [db].proc drop
7940: 5f 61 6c 6c 5f 74 61 62 6c 65 73 20 7b 7b 64 62  _all_tables {{db
7950: 20 64 62 7d 7d 20 7b 0a 20 20 69 66 63 61 70 61   db}} {.  ifcapa
7960: 62 6c 65 20 74 72 69 67 67 65 72 26 26 66 6f 72  ble trigger&&for
7970: 65 69 67 6e 6b 65 79 20 7b 0a 20 20 20 20 73 65  eignkey {.    se
7980: 74 20 70 6b 20 5b 24 64 62 20 6f 6e 65 20 22 50  t pk [$db one "P
7990: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
79a0: 79 73 22 5d 0a 20 20 20 20 24 64 62 20 65 76 61  ys"].    $db eva
79b0: 6c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67  l "PRAGMA foreig
79c0: 6e 5f 6b 65 79 73 20 3d 20 4f 46 46 22 0a 20 20  n_keys = OFF".  
79d0: 7d 0a 20 20 66 6f 72 65 61 63 68 20 7b 69 64 78  }.  foreach {idx
79e0: 20 6e 61 6d 65 20 66 69 6c 65 7d 20 5b 64 62 20   name file} [db 
79f0: 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 64 61 74  eval {PRAGMA dat
7a00: 61 62 61 73 65 5f 6c 69 73 74 7d 5d 20 7b 0a 20  abase_list}] {. 
7a10: 20 20 20 69 66 20 7b 24 69 64 78 3d 3d 31 7d 20     if {$idx==1} 
7a20: 7b 0a 20 20 20 20 20 20 73 65 74 20 6d 61 73 74  {.      set mast
7a30: 65 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  er sqlite_temp_m
7a40: 61 73 74 65 72 0a 20 20 20 20 7d 20 65 6c 73 65  aster.    } else
7a50: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6d 61 73   {.      set mas
7a60: 74 65 72 20 24 6e 61 6d 65 2e 73 71 6c 69 74 65  ter $name.sqlite
7a70: 5f 6d 61 73 74 65 72 0a 20 20 20 20 7d 0a 20 20  _master.    }.  
7a80: 20 20 66 6f 72 65 61 63 68 20 7b 74 20 74 79 70    foreach {t typ
7a90: 65 7d 20 5b 24 64 62 20 65 76 61 6c 20 22 0a 20  e} [$db eval ". 
7aa0: 20 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65       SELECT name
7ab0: 2c 20 74 79 70 65 20 46 52 4f 4d 20 24 6d 61 73  , type FROM $mas
7ac0: 74 65 72 0a 20 20 20 20 20 20 57 48 45 52 45 20  ter.      WHERE 
7ad0: 74 79 70 65 20 49 4e 28 27 74 61 62 6c 65 27 2c  type IN('table',
7ae0: 20 27 76 69 65 77 27 29 20 41 4e 44 20 6e 61 6d   'view') AND nam
7af0: 65 20 4e 4f 54 20 6c 69 6b 65 20 27 73 71 6c 69  e NOT like 'sqli
7b00: 74 65 5f 25 27 0a 20 20 20 20 22 5d 20 7b 0a 20  te_%'.    "] {. 
7b10: 20 20 20 20 20 24 64 62 20 65 76 61 6c 20 22 44       $db eval "D
7b20: 52 4f 50 20 24 74 79 70 65 20 24 74 22 0a 20 20  ROP $type $t".  
7b30: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 63 61 70 61    }.  }.  ifcapa
7b40: 62 6c 65 20 74 72 69 67 67 65 72 26 26 66 6f 72  ble trigger&&for
7b50: 65 69 67 6e 6b 65 79 20 7b 0a 20 20 20 20 24 64  eignkey {.    $d
7b60: 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 66  b eval "PRAGMA f
7b70: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 24 70  oreign_keys = $p
7b80: 6b 22 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  k".  }.}..#-----
7b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bd0: 2d 2d 2d 2d 0a 23 20 49 66 20 61 20 74 65 73 74  ----.# If a test
7be0: 20 73 63 72 69 70 74 20 69 73 20 65 78 65 63 75   script is execu
7bf0: 74 65 64 20 77 69 74 68 20 67 6c 6f 62 61 6c 20  ted with global 
7c00: 76 61 72 69 61 62 6c 65 20 24 3a 3a 47 28 70 65  variable $::G(pe
7c10: 72 6d 3a 6e 61 6d 65 29 20 73 65 74 20 74 6f 0a  rm:name) set to.
7c20: 23 20 22 77 61 6c 22 2c 20 74 68 65 6e 20 74 68  # "wal", then th
7c30: 65 20 74 65 73 74 73 20 61 72 65 20 72 75 6e 20  e tests are run 
7c40: 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 4f 74 68  in WAL mode. Oth
7c50: 65 72 77 69 73 65 2c 20 74 68 65 79 20 73 68 6f  erwise, they sho
7c60: 75 6c 64 20 62 65 20 72 75 6e 20 0a 23 20 69 6e  uld be run .# in
7c70: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2e 20   rollback mode. 
7c80: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 63  The following Tc
7c90: 6c 20 70 72 6f 63 73 20 61 72 65 20 75 73 65 64  l procs are used
7ca0: 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 6c 65   to make this le
7cb0: 73 73 20 0a 23 20 69 6e 74 72 75 73 69 76 65 3a  ss .# intrusive:
7cc0: 0a 23 0a 23 20 20 20 77 61 6c 5f 73 65 74 5f 6a  .#.#   wal_set_j
7cd0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3f 44 42 3f  ournal_mode ?DB?
7ce0: 0a 23 0a 23 20 20 20 20 20 49 66 20 72 75 6e 6e  .#.#     If runn
7cf0: 69 6e 67 20 61 20 57 41 4c 20 74 65 73 74 2c 20  ing a WAL test, 
7d00: 65 78 65 63 75 74 65 20 22 50 52 41 47 4d 41 20  execute "PRAGMA 
7d10: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
7d20: 61 6c 22 20 75 73 69 6e 67 0a 23 20 20 20 20 20  al" using.#     
7d30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
7d40: 65 20 44 42 2e 20 4f 74 68 65 72 77 69 73 65 2c  e DB. Otherwise,
7d50: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   this command is
7d60: 20 61 20 6e 6f 2d 6f 70 2e 0a 23 0a 23 20 20 20   a no-op..#.#   
7d70: 77 61 6c 5f 63 68 65 63 6b 5f 6a 6f 75 72 6e 61  wal_check_journa
7d80: 6c 5f 6d 6f 64 65 20 54 45 53 54 4e 41 4d 45 20  l_mode TESTNAME 
7d90: 3f 44 42 3f 0a 23 0a 23 20 20 20 20 20 49 66 20  ?DB?.#.#     If 
7da0: 72 75 6e 6e 69 6e 67 20 61 20 57 41 4c 20 74 65  running a WAL te
7db0: 73 74 2c 20 65 78 65 63 75 74 65 20 61 20 74 65  st, execute a te
7dc0: 73 74 73 20 63 61 73 65 20 74 68 61 74 20 66 61  sts case that fa
7dd0: 69 6c 73 20 69 66 20 74 68 65 20 6d 61 69 6e 0a  ils if the main.
7de0: 23 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66  #     database f
7df0: 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  or connection ha
7e00: 6e 64 6c 65 20 44 42 20 69 73 20 6e 6f 74 20 63  ndle DB is not c
7e10: 75 72 72 65 6e 74 6c 79 20 61 20 57 41 4c 20 64  urrently a WAL d
7e20: 61 74 61 62 61 73 65 2e 0a 23 20 20 20 20 20 4f  atabase..#     O
7e30: 74 68 65 72 77 69 73 65 20 28 69 66 20 6e 6f 74  therwise (if not
7e40: 20 72 75 6e 6e 69 6e 67 20 61 20 57 41 4c 20 70   running a WAL p
7e50: 65 72 6d 75 74 61 74 69 6f 6e 29 20 74 68 69 73  ermutation) this
7e60: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 23 0a 23   is a no-op..#.#
7e70: 20 20 20 77 61 6c 5f 69 73 5f 77 61 6c 5f 6d 6f     wal_is_wal_mo
7e80: 64 65 0a 23 20 20 20 0a 23 20 20 20 20 20 52 65  de.#   .#     Re
7e90: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
7ea0: 69 73 20 74 65 73 74 20 73 68 6f 75 6c 64 20 62  is test should b
7eb0: 65 20 72 75 6e 20 69 6e 20 57 41 4c 20 6d 6f 64  e run in WAL mod
7ec0: 65 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  e. False otherwi
7ed0: 73 65 2e 0a 23 20 0a 70 72 6f 63 20 77 61 6c 5f  se..# .proc wal_
7ee0: 69 73 5f 77 61 6c 5f 6d 6f 64 65 20 7b 7d 20 7b  is_wal_mode {} {
7ef0: 0a 20 20 65 78 70 72 20 7b 5b 70 65 72 6d 75 74  .  expr {[permut
7f00: 61 74 69 6f 6e 5d 20 65 71 20 22 77 61 6c 22 7d  ation] eq "wal"}
7f10: 0a 7d 0a 70 72 6f 63 20 77 61 6c 5f 73 65 74 5f  .}.proc wal_set_
7f20: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 7b 7b 64  journal_mode {{d
7f30: 62 20 64 62 7d 7d 20 7b 0a 20 20 69 66 20 7b 20  b db}} {.  if { 
7f40: 5b 77 61 6c 5f 69 73 5f 77 61 6c 5f 6d 6f 64 65  [wal_is_wal_mode
7f50: 5d 20 7d 20 7b 0a 20 20 20 20 24 64 62 20 65 76  ] } {.    $db ev
7f60: 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  al "PRAGMA journ
7f70: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 22 0a 20  al_mode = WAL". 
7f80: 20 7d 0a 7d 0a 70 72 6f 63 20 77 61 6c 5f 63 68   }.}.proc wal_ch
7f90: 65 63 6b 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  eck_journal_mode
7fa0: 20 7b 74 65 73 74 6e 61 6d 65 20 7b 64 62 20 64   {testname {db d
7fb0: 62 7d 7d 20 7b 0a 20 20 69 66 20 7b 20 5b 77 61  b}} {.  if { [wa
7fc0: 6c 5f 69 73 5f 77 61 6c 5f 6d 6f 64 65 5d 20 7d  l_is_wal_mode] }
7fd0: 20 7b 0a 20 20 20 20 24 64 62 20 65 76 61 6c 20   {.    $db eval 
7fe0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
7ff0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a  sqlite_master }.
8000: 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73      do_test $tes
8010: 74 6e 61 6d 65 20 5b 6c 69 73 74 20 24 64 62 20  tname [list $db 
8020: 65 76 61 6c 20 22 50 52 41 47 4d 41 20 6d 61 69  eval "PRAGMA mai
8030: 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22 5d  n.journal_mode"]
8040: 20 7b 77 61 6c 7d 0a 20 20 7d 0a 7d 0a 0a 70 72   {wal}.  }.}..pr
8050: 6f 63 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 7b  oc permutation {
8060: 7d 20 7b 0a 20 20 73 65 74 20 70 65 72 6d 20 22  } {.  set perm "
8070: 22 0a 20 20 63 61 74 63 68 20 7b 73 65 74 20 70  ".  catch {set p
8080: 65 72 6d 20 24 3a 3a 47 28 70 65 72 6d 3a 6e 61  erm $::G(perm:na
8090: 6d 65 29 7d 0a 20 20 73 65 74 20 70 65 72 6d 0a  me)}.  set perm.
80a0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
80b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a  -------------.#.
80f0: 70 72 6f 63 20 73 6c 61 76 65 5f 74 65 73 74 5f  proc slave_test_
8100: 73 63 72 69 70 74 20 7b 73 63 72 69 70 74 7d 20  script {script} 
8110: 7b 0a 0a 20 20 23 20 43 72 65 61 74 65 20 74 68  {..  # Create th
8120: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 75 73  e interpreter us
8130: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 74 65  ed to run the te
8140: 73 74 20 73 63 72 69 70 74 2e 0a 20 20 69 6e 74  st script..  int
8150: 65 72 70 20 63 72 65 61 74 65 20 74 69 6e 74 65  erp create tinte
8160: 72 70 0a 0a 20 20 23 20 50 6f 70 75 6c 61 74 65  rp..  # Populate
8170: 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 76 61 72   some global var
8180: 69 61 62 6c 65 73 20 74 68 61 74 20 74 65 73 74  iables that test
8190: 65 72 2e 74 63 6c 20 65 78 70 65 63 74 73 20 74  er.tcl expects t
81a0: 6f 20 73 65 65 2e 0a 20 20 66 6f 72 65 61 63 68  o see..  foreach
81b0: 20 7b 76 61 72 20 76 61 6c 75 65 7d 20 5b 6c 69   {var value} [li
81c0: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
81d0: 5c 0a 20 20 20 20 3a 3a 61 72 67 76 30 20 24 3a  \.    ::argv0 $:
81e0: 3a 61 72 67 76 30 20 20 20 20 20 20 20 20 20 20  :argv0          
81f0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
8200: 20 3a 3a 61 72 67 76 20 20 7b 7d 20 20 20 20 20   ::argv  {}     
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 20 5c 0a 20 20 20 20 3a 3a 53 4c        \.    ::SL
8230: 41 56 45 20 31 20 20 20 20 20 20 20 20 20 20 20  AVE 1           
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 5c 0a 20 20 5d 20 7b 0a 20 20 20 20 69 6e 74   \.  ] {.    int
8260: 65 72 70 20 65 76 61 6c 20 74 69 6e 74 65 72 70  erp eval tinterp
8270: 20 5b 6c 69 73 74 20 73 65 74 20 24 76 61 72 20   [list set $var 
8280: 24 76 61 6c 75 65 5d 0a 20 20 7d 0a 0a 20 20 23  $value].  }..  #
8290: 20 54 68 65 20 61 6c 69 61 73 20 75 73 65 64 20   The alias used 
82a0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 67 6c  to access the gl
82b0: 6f 62 61 6c 20 74 65 73 74 20 63 6f 75 6e 74 65  obal test counte
82c0: 72 73 2e 0a 20 20 74 69 6e 74 65 72 70 20 61 6c  rs..  tinterp al
82d0: 69 61 73 20 73 65 74 5f 74 65 73 74 5f 63 6f 75  ias set_test_cou
82e0: 6e 74 65 72 20 73 65 74 5f 74 65 73 74 5f 63 6f  nter set_test_co
82f0: 75 6e 74 65 72 0a 0a 20 20 23 20 53 65 74 20 75  unter..  # Set u
8300: 70 20 74 68 65 20 3a 3a 63 6d 64 6c 69 6e 65 61  p the ::cmdlinea
8310: 72 67 20 61 72 72 61 79 20 69 6e 20 74 68 65 20  rg array in the 
8320: 73 6c 61 76 65 2e 0a 20 20 69 6e 74 65 72 70 20  slave..  interp 
8330: 65 76 61 6c 20 74 69 6e 74 65 72 70 20 5b 6c 69  eval tinterp [li
8340: 73 74 20 61 72 72 61 79 20 73 65 74 20 3a 3a 63  st array set ::c
8350: 6d 64 6c 69 6e 65 61 72 67 20 5b 61 72 72 61 79  mdlinearg [array
8360: 20 67 65 74 20 3a 3a 63 6d 64 6c 69 6e 65 61 72   get ::cmdlinear
8370: 67 5d 5d 0a 0a 20 20 23 20 53 65 74 20 75 70 20  g]]..  # Set up 
8380: 74 68 65 20 3a 3a 47 20 61 72 72 61 79 20 69 6e  the ::G array in
8390: 20 74 68 65 20 73 6c 61 76 65 2e 0a 20 20 69 6e   the slave..  in
83a0: 74 65 72 70 20 65 76 61 6c 20 74 69 6e 74 65 72  terp eval tinter
83b0: 70 20 5b 6c 69 73 74 20 61 72 72 61 79 20 73 65  p [list array se
83c0: 74 20 3a 3a 47 20 5b 61 72 72 61 79 20 67 65 74  t ::G [array get
83d0: 20 3a 3a 47 5d 5d 0a 0a 20 20 23 20 4c 6f 61 64   ::G]]..  # Load
83e0: 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 65 73   the various tes
83f0: 74 20 69 6e 74 65 72 66 61 63 65 73 20 69 6d 70  t interfaces imp
8400: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 43 2e 0a 20  lemented in C.. 
8410: 20 6c 6f 61 64 5f 74 65 73 74 66 69 78 74 75 72   load_testfixtur
8420: 65 5f 65 78 74 65 6e 73 69 6f 6e 73 20 74 69 6e  e_extensions tin
8430: 74 65 72 70 0a 0a 20 20 23 20 52 75 6e 20 74 68  terp..  # Run th
8440: 65 20 74 65 73 74 20 73 63 72 69 70 74 2e 0a 20  e test script.. 
8450: 20 69 6e 74 65 72 70 20 65 76 61 6c 20 74 69 6e   interp eval tin
8460: 74 65 72 70 20 24 73 63 72 69 70 74 0a 0a 20 20  terp $script..  
8470: 23 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 74  # Delete the int
8480: 65 72 70 72 65 74 65 72 20 75 73 65 64 20 74 6f  erpreter used to
8490: 20 72 75 6e 20 74 68 65 20 74 65 73 74 20 73 63   run the test sc
84a0: 72 69 70 74 2e 0a 20 20 69 6e 74 65 72 70 20 64  ript..  interp d
84b0: 65 6c 65 74 65 20 74 69 6e 74 65 72 70 0a 7d 0a  elete tinterp.}.
84c0: 0a 70 72 6f 63 20 73 6c 61 76 65 5f 74 65 73 74  .proc slave_test
84d0: 5f 66 69 6c 65 20 7b 7a 46 69 6c 65 7d 20 7b 0a  _file {zFile} {.
84e0: 20 20 73 65 74 20 74 61 69 6c 20 5b 66 69 6c 65    set tail [file
84f0: 20 74 61 69 6c 20 24 7a 46 69 6c 65 5d 0a 0a 20   tail $zFile].. 
8500: 20 69 66 63 61 70 61 62 6c 65 20 73 68 61 72 65   ifcapable share
8510: 64 5f 63 61 63 68 65 20 7b 20 0a 20 20 20 20 73  d_cache { .    s
8520: 65 74 20 73 63 73 20 5b 73 71 6c 69 74 65 33 5f  et scs [sqlite3_
8530: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
8540: 63 68 65 5d 20 0a 20 20 7d 0a 0a 20 20 72 65 73  che] .  }..  res
8550: 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a 20 20  et_prng_state.  
8560: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70 65  set ::sqlite_ope
8570: 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 20 30 0a 20  n_file_count 0. 
8580: 20 73 65 74 20 74 69 6d 65 20 5b 74 69 6d 65 20   set time [time 
8590: 7b 20 73 6c 61 76 65 5f 74 65 73 74 5f 73 63 72  { slave_test_scr
85a0: 69 70 74 20 5b 6c 69 73 74 20 73 6f 75 72 63 65  ipt [list source
85b0: 20 24 7a 46 69 6c 65 5d 20 7d 5d 0a 20 20 73 65   $zFile] }].  se
85c0: 74 20 6d 73 20 5b 65 78 70 72 20 5b 6c 69 6e 64  t ms [expr [lind
85d0: 65 78 20 24 74 69 6d 65 20 30 5d 20 2f 20 31 30  ex $time 0] / 10
85e0: 30 30 5d 0a 0a 20 20 23 20 54 65 73 74 20 74 68  00]..  # Test th
85f0: 61 74 20 61 6c 6c 20 66 69 6c 65 73 20 6f 70 65  at all files ope
8600: 6e 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20  ned by the test 
8610: 73 63 72 69 70 74 20 77 65 72 65 20 63 6c 6f 73  script were clos
8620: 65 64 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  ed..  #.  do_tes
8630: 74 20 24 7b 74 61 69 6c 7d 2d 63 6c 6f 73 65 61  t ${tail}-closea
8640: 6c 6c 66 69 6c 65 73 20 7b 0a 20 20 20 20 65 78  llfiles {.    ex
8650: 70 72 20 7b 24 3a 3a 73 71 6c 69 74 65 5f 6f 70  pr {$::sqlite_op
8660: 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3e 30 7d  en_file_count>0}
8670: 0a 20 20 7d 20 7b 30 7d 0a 20 20 73 65 74 20 3a  .  } {0}.  set :
8680: 3a 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c  :sqlite_open_fil
8690: 65 5f 63 6f 75 6e 74 20 30 0a 0a 20 20 23 20 54  e_count 0..  # T
86a0: 65 73 74 20 74 68 61 74 20 74 68 65 20 67 6c 6f  est that the glo
86b0: 62 61 6c 20 22 73 68 61 72 65 64 2d 63 61 63 68  bal "shared-cach
86c0: 65 22 20 73 65 74 74 69 6e 67 20 77 61 73 20 6e  e" setting was n
86d0: 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 0a 20  ot altered by . 
86e0: 20 23 20 74 68 65 20 74 65 73 74 20 73 63 72 69   # the test scri
86f0: 70 74 2e 0a 20 20 23 0a 20 20 69 66 63 61 70 61  pt..  #.  ifcapa
8700: 62 6c 65 20 73 68 61 72 65 64 5f 63 61 63 68 65  ble shared_cache
8710: 20 7b 20 0a 20 20 20 20 73 65 74 20 72 65 73 20   { .    set res 
8720: 5b 65 78 70 72 20 7b 5b 73 71 6c 69 74 65 33 5f  [expr {[sqlite3_
8730: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
8740: 63 68 65 5d 20 3d 3d 20 24 73 63 73 7d 5d 0a 20  che] == $scs}]. 
8750: 20 20 20 64 6f 5f 74 65 73 74 20 24 7b 74 61 69     do_test ${tai
8760: 6c 7d 2d 73 68 61 72 65 64 63 61 63 68 65 73 65  l}-sharedcachese
8770: 74 74 69 6e 67 20 5b 6c 69 73 74 20 73 65 74 20  tting [list set 
8780: 7b 7d 20 24 72 65 73 5d 20 31 0a 20 20 7d 0a 0a  {} $res] 1.  }..
8790: 20 20 69 66 20 7b 24 3a 3a 73 71 6c 69 74 65 5f    if {$::sqlite_
87a0: 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3e  open_file_count>
87b0: 30 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 22 24  0} {.    puts "$
87c0: 74 61 69 6c 20 64 69 64 20 6e 6f 74 20 63 6c 6f  tail did not clo
87d0: 73 65 20 61 6c 6c 20 66 69 6c 65 73 3a 20 24 3a  se all files: $:
87e0: 3a 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c  :sqlite_open_fil
87f0: 65 5f 63 6f 75 6e 74 22 0a 20 20 20 20 66 61 69  e_count".    fai
8800: 6c 5f 74 65 73 74 20 22 24 74 61 69 6c 2d 63 6c  l_test "$tail-cl
8810: 6f 73 65 61 6c 6c 66 69 6c 65 73 22 0a 20 20 20  oseallfiles".   
8820: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 6f 70   set ::sqlite_op
8830: 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 20 30 0a  en_file_count 0.
8840: 20 20 7d 0a 20 20 70 75 74 73 20 22 54 69 6d 65    }.  puts "Time
8850: 3a 20 24 74 61 69 6c 20 24 6d 73 20 6d 73 22 0a  : $tail $ms ms".
8860: 0a 20 20 73 68 6f 77 5f 6d 65 6d 73 74 61 74 73  .  show_memstats
8870: 0a 7d 0a 0a 0a 23 20 49 66 20 74 68 65 20 6c 69  .}...# If the li
8880: 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65  brary is compile
8890: 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
88a0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
88b0: 43 55 55 4d 20 6d 61 63 72 6f 20 73 65 74 0a 23  CUUM macro set.#
88c0: 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   to non-zero, th
88d0: 65 6e 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  en set the globa
88e0: 6c 20 76 61 72 69 61 62 6c 65 20 24 41 55 54 4f  l variable $AUTO
88f0: 56 41 43 55 55 4d 20 74 6f 20 31 2e 0a 73 65 74  VACUUM to 1..set
8900: 20 41 55 54 4f 56 41 43 55 55 4d 20 24 73 71 6c   AUTOVACUUM $sql
8910: 69 74 65 5f 6f 70 74 69 6f 6e 73 28 64 65 66 61  ite_options(defa
8920: 75 6c 74 5f 61 75 74 6f 76 61 63 75 75 6d 29 0a  ult_autovacuum).
8930: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
8940: 2f 74 68 72 65 61 64 5f 63 6f 6d 6d 6f 6e 2e 74  /thread_common.t
8950: 63 6c 0a                                         cl.