/ Hex Artifact Content
Login

Artifact b8e35177f97438b930ee87c9419ca2599e8073e1:


0000: 23 20 32 30 31 34 20 4d 61 72 63 68 20 32 35 2e  # 2014 March 25.
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69  ******.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65  le implements re
0180: 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66  gression tests f
0190: 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  or SQLite librar
01a0: 79 2e 20 0a 23 0a 23 20 53 70 65 63 69 66 69 63  y. .#.# Specific
01b0: 61 6c 6c 79 2c 20 69 74 20 74 65 73 74 73 20 74  ally, it tests t
01c0: 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 66 61  he effects of fa
01d0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 6f 6e  ult injection on
01e0: 20 74 68 65 20 73 6f 72 74 65 72 0a 23 20 6d 6f   the sorter.# mo
01f0: 64 75 6c 65 20 28 63 6f 64 65 20 69 6e 20 76 64  dule (code in vd
0200: 62 65 73 6f 72 74 2e 63 29 2e 0a 23 0a 0a 73 65  besort.c)..#..se
0210: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
0220: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
0230: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
0240: 74 65 73 74 65 72 2e 74 63 6c 0a 73 65 74 20 74  tester.tcl.set t
0250: 65 73 74 70 72 65 66 69 78 20 73 6f 72 74 66 61  estprefix sortfa
0260: 75 6c 74 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ult..do_execsql_
0270: 74 65 73 74 20 31 2e 30 20 7b 0a 20 20 50 52 41  test 1.0 {.  PRA
0280: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
0290: 20 35 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b   5;.}..foreach {
02a0: 74 6e 20 6d 6d 61 70 5f 6c 69 6d 69 74 20 6e 57  tn mmap_limit nW
02b0: 6f 72 6b 65 72 20 74 6d 70 73 74 6f 72 65 20 74  orker tmpstore t
02c0: 68 72 65 61 64 73 6d 6f 64 65 20 66 61 6b 65 68  hreadsmode fakeh
02d0: 65 61 70 20 6c 6f 6f 6b 61 73 69 64 65 7d 20 7b  eap lookaside} {
02e0: 0a 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20  .          1    
02f0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 30 20        0       0 
0300: 20 20 20 20 66 69 6c 65 20 6d 75 6c 74 69 74 68      file multith
0310: 72 65 61 64 20 20 20 20 66 61 6c 73 65 20 20 20  read    false   
0320: 20 20 66 61 6c 73 65 0a 20 20 20 20 20 20 20 20    false.        
0330: 20 20 32 20 20 20 20 20 31 30 30 30 30 30 20 20    2     100000  
0340: 20 20 20 20 20 30 20 20 20 20 20 66 69 6c 65 20       0     file 
0350: 6d 75 6c 74 69 74 68 72 65 61 64 20 20 20 20 66  multithread    f
0360: 61 6c 73 65 20 20 20 20 20 66 61 6c 73 65 0a 20  alse     false. 
0370: 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 31           3     1
0380: 30 30 30 30 30 20 20 20 20 20 20 20 31 20 20 20  00000       1   
0390: 20 20 66 69 6c 65 20 6d 75 6c 74 69 74 68 72 65    file multithre
03a0: 61 64 20 20 20 20 66 61 6c 73 65 20 20 20 20 20  ad    false     
03b0: 66 61 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  false.          
03c0: 34 20 20 20 20 32 30 30 30 30 30 30 20 20 20 20  4    2000000    
03d0: 20 20 20 30 20 20 20 20 20 66 69 6c 65 20 73 69     0     file si
03e0: 6e 67 6c 65 74 68 72 65 61 64 20 20 20 66 61 6c  nglethread   fal
03f0: 73 65 20 20 20 20 20 20 74 72 75 65 0a 7d 20 7b  se      true.} {
0400: 0a 20 20 69 66 20 7b 24 73 71 6c 69 74 65 5f 6f  .  if {$sqlite_o
0410: 70 74 69 6f 6e 73 28 74 68 72 65 61 64 73 61 66  ptions(threadsaf
0420: 65 29 7d 20 7b 20 73 65 74 20 74 68 72 65 61 64  e)} { set thread
0430: 73 6d 6f 64 65 20 73 69 6e 67 6c 65 74 68 72 65  smode singlethre
0440: 61 64 20 7d 0a 0a 20 20 64 62 20 65 76 61 6c 20  ad }..  db eval 
0450: 22 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 3d  "PRAGMA threads=
0460: 24 6e 57 6f 72 6b 65 72 22 0a 20 20 73 71 6c 69  $nWorker".  sqli
0470: 74 65 33 5f 63 6f 6e 66 69 67 20 24 74 68 72 65  te3_config $thre
0480: 61 64 73 6d 6f 64 65 0a 20 20 69 66 20 7b 20 24  adsmode.  if { $
0490: 6c 6f 6f 6b 61 73 69 64 65 20 7d 20 7b 0a 20 20  lookaside } {.  
04a0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
04b0: 5f 6c 6f 6f 6b 61 73 69 64 65 20 31 30 30 20 35  _lookaside 100 5
04c0: 30 30 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  00.  } else {.  
04d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
04e0: 5f 6c 6f 6f 6b 61 73 69 64 65 20 30 20 30 0a 20  _lookaside 0 0. 
04f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 69   }.  sqlite3_ini
0500: 74 69 61 6c 69 7a 65 0a 20 20 73 6f 72 74 65 72  tialize.  sorter
0510: 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20 24  _test_fakeheap $
0520: 66 61 6b 65 68 65 61 70 0a 0a 20 20 73 65 74 20  fakeheap..  set 
0530: 73 74 72 20 5b 73 74 72 69 6e 67 20 72 65 70 65  str [string repe
0540: 61 74 20 61 20 31 30 30 30 5d 0a 20 20 70 75 74  at a 1000].  put
0550: 73 20 24 74 68 72 65 61 64 73 6d 6f 64 65 0a 0a  s $threadsmode..
0560: 20 20 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65    do_faultsim_te
0570: 73 74 20 31 2e 24 74 6e 20 2d 70 72 65 70 20 7b  st 1.$tn -prep {
0580: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
0590: 74 65 73 74 2e 64 62 0a 20 20 20 20 73 71 6c 69  test.db.    sqli
05a0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
05b0: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05c0: 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 20 64 62 20  _SORTER_MMAP db 
05d0: 24 3a 3a 6d 6d 61 70 5f 6c 69 6d 69 74 0a 20 20  $::mmap_limit.  
05e0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
05f0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
0600: 35 20 7d 0a 20 20 7d 20 2d 62 6f 64 79 20 7b 0a  5 }.  } -body {.
0610: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
0620: 20 20 20 20 20 57 49 54 48 20 72 28 78 2c 79 29       WITH r(x,y)
0630: 20 41 53 20 28 0a 20 20 20 20 20 20 20 20 20 20   AS (.          
0640: 53 45 4c 45 43 54 20 31 2c 20 24 3a 3a 73 74 72  SELECT 1, $::str
0650: 0a 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  .          UNION
0660: 20 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 53   ALL.          S
0670: 45 4c 45 43 54 20 78 2b 31 2c 20 24 3a 3a 73 74  ELECT x+1, $::st
0680: 72 20 46 52 4f 4d 20 72 0a 20 20 20 20 20 20 20  r FROM r.       
0690: 20 20 20 4c 49 4d 49 54 20 32 30 30 0a 20 20 20     LIMIT 200.   
06a0: 20 20 20 29 0a 20 20 20 20 20 20 53 45 4c 45 43     ).      SELEC
06b0: 54 20 63 6f 75 6e 74 28 78 29 2c 20 6c 65 6e 67  T count(x), leng
06c0: 74 68 28 79 29 20 46 52 4f 4d 20 72 20 47 52 4f  th(y) FROM r GRO
06d0: 55 50 20 42 59 20 28 78 25 35 29 0a 20 20 20 20  UP BY (x%5).    
06e0: 7d 0a 20 20 7d 20 2d 74 65 73 74 20 7b 0a 20 20  }.  } -test {.  
06f0: 20 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f    faultsim_test_
0700: 72 65 73 75 6c 74 20 7b 30 20 7b 34 30 20 31 30  result {0 {40 10
0710: 30 30 20 34 30 20 31 30 30 30 20 34 30 20 31 30  00 40 1000 40 10
0720: 30 30 20 34 30 20 31 30 30 30 20 34 30 20 31 30  00 40 1000 40 10
0730: 30 30 7d 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 66  00}}.  }..  do_f
0740: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 32 2e 24  aultsim_test 2.$
0750: 74 6e 20 2d 66 61 75 6c 74 73 20 6f 6f 6d 2a 20  tn -faults oom* 
0760: 2d 70 72 65 70 20 7b 0a 20 20 20 20 73 71 6c 69  -prep {.    sqli
0770: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
0780: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
0790: 63 6f 6e 74 72 6f 6c 20 53 51 4c 49 54 45 5f 54  control SQLITE_T
07a0: 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
07b0: 4d 41 50 20 64 62 20 24 3a 3a 6d 6d 61 70 5f 6c  MAP db $::mmap_l
07c0: 69 6d 69 74 0a 20 20 20 20 61 64 64 5f 74 65 73  imit.    add_tes
07d0: 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61  t_utf16bin_colla
07e0: 74 65 20 64 62 0a 20 20 20 20 65 78 65 63 73 71  te db.    execsq
07f0: 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65  l { PRAGMA cache
0800: 5f 73 69 7a 65 20 3d 20 35 20 7d 0a 20 20 7d 20  _size = 5 }.  } 
0810: 2d 62 6f 64 79 20 7b 0a 20 20 20 20 65 78 65 63  -body {.    exec
0820: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 57 49 54  sql { .      WIT
0830: 48 20 72 28 78 2c 79 29 20 41 53 20 28 0a 20 20  H r(x,y) AS (.  
0840: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 31          SELECT 1
0850: 30 30 2c 20 24 3a 3a 73 74 72 0a 20 20 20 20 20  00, $::str.     
0860: 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
0870: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
0880: 78 2d 31 2c 20 24 3a 3a 73 74 72 20 46 52 4f 4d  x-1, $::str FROM
0890: 20 72 0a 20 20 20 20 20 20 20 20 20 20 4c 49 4d   r.          LIM
08a0: 49 54 20 31 30 30 0a 20 20 20 20 20 20 29 0a 20  IT 100.      ). 
08b0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
08c0: 74 28 78 29 2c 20 6c 65 6e 67 74 68 28 79 29 20  t(x), length(y) 
08d0: 46 52 4f 4d 20 72 20 47 52 4f 55 50 20 42 59 20  FROM r GROUP BY 
08e0: 79 20 43 4f 4c 4c 41 54 45 20 75 74 66 31 36 62  y COLLATE utf16b
08f0: 69 6e 2c 20 28 78 25 35 29 0a 20 20 20 20 7d 0a  in, (x%5).    }.
0900: 20 20 7d 20 2d 74 65 73 74 20 7b 0a 20 20 20 20    } -test {.    
0910: 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72 65  faultsim_test_re
0920: 73 75 6c 74 20 7b 30 20 7b 32 30 20 31 30 30 30  sult {0 {20 1000
0930: 20 32 30 20 31 30 30 30 20 32 30 20 31 30 30 30   20 1000 20 1000
0940: 20 32 30 20 31 30 30 30 20 32 30 20 31 30 30 30   20 1000 20 1000
0950: 7d 7d 0a 20 20 7d 0a 0a 20 20 69 66 20 7b 24 6d  }}.  }..  if {$m
0960: 6d 61 70 5f 6c 69 6d 69 74 20 3e 20 31 30 30 30  map_limit > 1000
0970: 30 30 30 7d 20 7b 0a 20 20 20 20 73 65 74 20 73  000} {.    set s
0980: 74 72 32 20 5b 73 74 72 69 6e 67 20 72 65 70 65  tr2 [string repe
0990: 61 74 20 24 73 74 72 20 31 30 5d 0a 0a 20 20 20  at $str 10]..   
09a0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75   sqlite3_memdebu
09b0: 67 5f 76 66 73 5f 6f 6f 6d 5f 74 65 73 74 20 30  g_vfs_oom_test 0
09c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
09d0: 74 65 73 74 2e 64 62 0a 20 20 20 20 73 71 6c 69  test.db.    sqli
09e0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
09f0: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
0a00: 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 20 64 62 20  _SORTER_MMAP db 
0a10: 24 3a 3a 6d 6d 61 70 5f 6c 69 6d 69 74 0a 20 20  $::mmap_limit.  
0a20: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
0a30: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
0a40: 35 20 7d 0a 0a 20 20 20 20 64 6f 5f 66 61 75 6c  5 }..    do_faul
0a50: 74 73 69 6d 5f 74 65 73 74 20 33 2e 24 74 6e 20  tsim_test 3.$tn 
0a60: 2d 66 61 75 6c 74 73 20 6f 6f 6d 2d 74 72 61 6e  -faults oom-tran
0a70: 73 2a 20 2d 62 6f 64 79 20 7b 0a 20 20 20 20 20  s* -body {.     
0a80: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
0a90: 20 20 20 20 57 49 54 48 20 72 28 78 2c 79 29 20      WITH r(x,y) 
0aa0: 41 53 20 28 0a 20 20 20 20 20 20 20 20 20 20 20  AS (.           
0ab0: 20 53 45 4c 45 43 54 20 33 30 30 2c 20 24 3a 3a   SELECT 300, $::
0ac0: 73 74 72 32 0a 20 20 20 20 20 20 20 20 20 20 20  str2.           
0ad0: 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20   UNION ALL.     
0ae0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 2d         SELECT x-
0af0: 31 2c 20 24 3a 3a 73 74 72 32 20 46 52 4f 4d 20  1, $::str2 FROM 
0b00: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 49  r.            LI
0b10: 4d 49 54 20 33 30 30 0a 20 20 20 20 20 20 20 20  MIT 300.        
0b20: 29 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ).        SELECT
0b30: 20 63 6f 75 6e 74 28 78 29 2c 20 6c 65 6e 67 74   count(x), lengt
0b40: 68 28 79 29 20 46 52 4f 4d 20 72 20 47 52 4f 55  h(y) FROM r GROU
0b50: 50 20 42 59 20 79 2c 20 28 78 25 35 29 0a 20 20  P BY y, (x%5).  
0b60: 20 20 20 20 7d 0a 20 20 20 20 7d 20 2d 74 65 73      }.    } -tes
0b70: 74 20 7b 0a 20 20 20 20 20 20 66 61 75 6c 74 73  t {.      faults
0b80: 69 6d 5f 74 65 73 74 5f 72 65 73 75 6c 74 20 7b  im_test_result {
0b90: 30 20 7b 36 30 20 31 30 30 30 30 20 36 30 20 31  0 {60 10000 60 1
0ba0: 30 30 30 30 20 36 30 20 31 30 30 30 30 20 36 30  0000 60 10000 60
0bb0: 20 31 30 30 30 30 20 36 30 20 31 30 30 30 30 7d   10000 60 10000}
0bc0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
0bd0: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 76 66  ite3_memdebug_vf
0be0: 73 5f 6f 6f 6d 5f 74 65 73 74 20 31 0a 20 20 7d  s_oom_test 1.  }
0bf0: 0a 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63  .}..catch { db c
0c00: 6c 6f 73 65 20 7d 0a 73 71 6c 69 74 65 33 5f 73  lose }.sqlite3_s
0c10: 68 75 74 64 6f 77 6e 0a 73 65 74 20 74 28 30 29  hutdown.set t(0)
0c20: 20 73 69 6e 67 6c 65 74 68 72 65 61 64 0a 73 65   singlethread.se
0c30: 74 20 74 28 31 29 20 6d 75 6c 74 69 74 68 72 65  t t(1) multithre
0c40: 61 64 0a 73 65 74 20 74 28 32 29 20 73 65 72 69  ad.set t(2) seri
0c50: 61 6c 69 7a 65 64 0a 73 71 6c 69 74 65 33 5f 63  alized.sqlite3_c
0c60: 6f 6e 66 69 67 20 24 74 28 24 73 71 6c 69 74 65  onfig $t($sqlite
0c70: 5f 6f 70 74 69 6f 6e 73 28 74 68 72 65 61 64 73  _options(threads
0c80: 61 66 65 29 29 0a 73 71 6c 69 74 65 33 5f 63 6f  afe)).sqlite3_co
0c90: 6e 66 69 67 5f 6c 6f 6f 6b 61 73 69 64 65 20 31  nfig_lookaside 1
0ca0: 30 30 20 35 30 30 0a 73 71 6c 69 74 65 33 5f 69  00 500.sqlite3_i
0cb0: 6e 69 74 69 61 6c 69 7a 65 0a 0a 23 2d 2d 2d 2d  nitialize..#----
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62  -----.#.reset_db
0d10: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0d20: 20 34 2e 30 20 7b 20 0a 20 20 43 52 45 41 54 45   4.0 { .  CREATE
0d30: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
0d40: 63 29 3b 20 0a 20 20 49 4e 53 45 52 54 20 49 4e  c); .  INSERT IN
0d50: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
0d60: 32 2c 20 33 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74  2, 3);.}.do_test
0d70: 20 34 2e 31 20 7b 20 0a 20 20 66 6f 72 20 7b 73   4.1 { .  for {s
0d80: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 32 35  et i 0} {$i < 25
0d90: 36 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  6} {incr i} {.  
0da0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
0db0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0dc0: 31 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20  1 SELECT.       
0dd0: 20 28 28 61 3c 3c 33 29 20 2b 20 62 29 20 26 20   ((a<<3) + b) & 
0de0: 32 31 34 37 34 38 33 36 34 37 2c 0a 20 20 20 20  2147483647,.    
0df0: 20 20 20 20 28 28 62 3c 3c 33 29 20 2b 20 63 29      ((b<<3) + c)
0e00: 20 26 20 32 31 34 37 34 38 33 36 34 37 2c 0a 20   & 2147483647,. 
0e10: 20 20 20 20 20 20 20 28 28 63 3c 3c 33 29 20 2b         ((c<<3) +
0e20: 20 61 29 20 26 20 32 31 34 37 34 38 33 36 34 37   a) & 2147483647
0e30: 0a 20 20 20 20 20 20 46 52 4f 4d 20 74 31 20 4f  .      FROM t1 O
0e40: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
0e50: 53 43 20 4c 49 4d 49 54 20 31 3b 0a 20 20 20 20  SC LIMIT 1;.    
0e60: 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 61 75 6c  }.  }.} {}..faul
0e70: 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c  tsim_save_and_cl
0e80: 6f 73 65 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d  ose..do_faultsim
0e90: 5f 74 65 73 74 20 34 2e 32 20 2d 66 61 75 6c 74  _test 4.2 -fault
0ea0: 73 20 6f 6f 6d 2a 20 2d 70 72 65 70 20 7b 0a 20  s oom* -prep {. 
0eb0: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
0ec0: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d  e_and_reopen.} -
0ed0: 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71 6c  body {.  execsql
0ee0: 20 7b 20 43 52 45 41 54 45 20 55 4e 49 51 55 45   { CREATE UNIQUE
0ef0: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
0f00: 61 2c 62 2c 63 29 20 7d 0a 7d 20 2d 74 65 73 74  a,b,c) }.} -test
0f10: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 74 65   {.  faultsim_te
0f20: 73 74 5f 72 65 73 75 6c 74 20 7b 30 20 7b 7d 7d  st_result {0 {}}
0f30: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0f80: 0a 72 65 73 65 74 5f 64 62 0a 73 65 74 20 61 20  .reset_db.set a 
0f90: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 61  [string repeat a
0fa0: 20 35 30 30 5d 0a 73 65 74 20 62 20 5b 73 74 72   500].set b [str
0fb0: 69 6e 67 20 72 65 70 65 61 74 20 62 20 35 30 30  ing repeat b 500
0fc0: 5d 0a 73 65 74 20 63 20 5b 73 74 72 69 6e 67 20  ].set c [string 
0fd0: 72 65 70 65 61 74 20 63 20 35 30 30 5d 0a 64 6f  repeat c 500].do
0fe0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e  _execsql_test 5.
0ff0: 30 20 7b 20 0a 20 20 43 52 45 41 54 45 20 54 41  0 { .  CREATE TA
1000: 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b  BLE t1(a, b, c);
1010: 20 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20   .  INSERT INTO 
1020: 74 31 20 56 41 4c 55 45 53 28 24 61 2c 20 24 62  t1 VALUES($a, $b
1030: 2c 20 24 63 29 3b 20 0a 20 20 49 4e 53 45 52 54  , $c); .  INSERT
1040: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1050: 24 63 2c 20 24 62 2c 20 24 61 29 3b 20 0a 7d 0a  $c, $b, $a); .}.
1060: 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73  .do_faultsim_tes
1070: 74 20 35 2e 31 20 2d 66 61 75 6c 74 73 20 6f 6f  t 5.1 -faults oo
1080: 6d 2a 20 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65  m* -body {.  exe
1090: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
10a0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
10b0: 20 61 20 7d 0a 7d 20 2d 74 65 73 74 20 7b 0a 20   a }.} -test {. 
10c0: 20 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 5f 72   faultsim_test_r
10d0: 65 73 75 6c 74 20 5b 6c 69 73 74 20 30 20 5b 6c  esult [list 0 [l
10e0: 69 73 74 20 24 3a 3a 61 20 24 3a 3a 62 20 24 3a  ist $::a $::b $:
10f0: 3a 63 20 24 3a 3a 63 20 24 3a 3a 62 20 24 3a 3a  :c $::c $::b $::
1100: 61 5d 5d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  a]].}..finish_te
1110: 73 74 0a                                         st.