/ Hex Artifact Content
Login

Artifact 0ed13e09690f6204d7455fac3b0e8ece490f6eef:


0000: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
0010: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 72 75 6e  in this file run
0020: 73 20 61 20 66 65 77 20 6d 75 6c 74 69 2d 74 68  s a few multi-th
0030: 72 65 61 64 65 64 20 74 65 73 74 20 63 61 73 65  readed test case
0040: 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 53  s using the.** S
0050: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 49  QLite library. I
0060: 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 69 6c 65  t can be compile
0070: 64 20 74 6f 20 61 6e 20 65 78 65 63 75 74 61 62  d to an executab
0080: 6c 65 20 6f 6e 20 75 6e 69 78 20 75 73 69 6e 67  le on unix using
0090: 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
00a0: 67 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  g command:.**.**
00b0: 20 20 20 67 63 63 20 2d 4f 32 20 74 68 72 65 61     gcc -O2 threa
00c0: 64 74 65 73 74 33 2e 63 20 73 71 6c 69 74 65 33  dtest3.c sqlite3
00d0: 2e 63 20 2d 6c 64 6c 20 2d 6c 70 74 68 72 65 61  .c -ldl -lpthrea
00e0: 64 20 2d 6c 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  d -lm.**.** Then
00f0: 20 72 75 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65   run the compile
0100: 64 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20 65  d program. The e
0110: 78 69 74 20 73 74 61 74 75 73 20 69 73 20 6e 6f  xit status is no
0120: 6e 2d 7a 65 72 6f 20 69 66 20 61 6e 79 20 74 65  n-zero if any te
0130: 73 74 73 0a 2a 2a 20 66 61 69 6c 65 64 20 28 68  sts.** failed (h
0140: 6f 70 65 66 75 6c 6c 79 20 74 68 65 72 65 20 69  opefully there i
0150: 73 20 61 6c 73 6f 20 73 6f 6d 65 20 6f 75 74 70  s also some outp
0160: 75 74 20 74 6f 20 73 74 64 6f 75 74 20 74 6f 20  ut to stdout to 
0170: 63 6c 61 72 69 66 79 20 77 68 61 74 20 77 65 6e  clarify what wen
0180: 74 0a 2a 2a 20 77 72 6f 6e 67 29 2e 0a 2a 2a 0a  t.** wrong)..**.
0190: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72  ** There are thr
01a0: 65 65 20 70 61 72 74 73 20 74 6f 20 74 68 65 20  ee parts to the 
01b0: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
01c0: 65 2c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  e, in the follow
01d0: 69 6e 67 20 6f 72 64 65 72 3a 0a 2a 2a 0a 2a 2a  ing order:.**.**
01e0: 20 20 20 31 2e 20 43 6f 64 65 20 66 6f 72 20 74     1. Code for t
01f0: 68 65 20 53 51 4c 20 61 67 67 72 65 67 61 74 65  he SQL aggregate
0200: 20 66 75 6e 63 74 69 6f 6e 20 6d 64 35 73 75 6d   function md5sum
0210: 28 29 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 0a  () copied from .
0220: 2a 2a 20 20 20 20 20 20 74 63 6c 73 71 6c 69 74  **      tclsqlit
0230: 65 2e 63 20 69 6e 20 74 68 65 20 53 51 4c 69 74  e.c in the SQLit
0240: 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 2e 20  e distribution. 
0250: 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  The names of all
0260: 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 74 79   the .**      ty
0270: 70 65 73 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  pes and function
0280: 73 20 69 6e 20 74 68 69 73 20 73 65 63 74 69 6f  s in this sectio
0290: 6e 20 62 65 67 69 6e 20 77 69 74 68 20 22 4d 44  n begin with "MD
02a0: 35 22 20 6f 72 20 22 6d 64 35 22 2e 0a 2a 2a 0a  5" or "md5"..**.
02b0: 2a 2a 20 20 20 32 2e 20 41 20 73 65 74 20 6f 66  **   2. A set of
02c0: 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
02d0: 6e 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  ns that may be u
02e0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
02f0: 0a 2a 2a 20 20 20 20 20 20 6d 75 6c 74 69 2d 74  .**      multi-t
0300: 68 72 65 61 64 65 64 20 74 65 73 74 20 63 61 73  hreaded test cas
0310: 65 73 2e 20 54 68 65 73 65 20 61 72 65 20 61 6c  es. These are al
0320: 6c 20 63 61 6c 6c 65 64 20 62 79 20 74 65 73 74  l called by test
0330: 20 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20 76 69   code.**      vi
0340: 61 20 6d 61 63 72 6f 73 20 74 68 61 74 20 68 65  a macros that he
0350: 6c 70 20 77 69 74 68 20 65 72 72 6f 72 20 72 65  lp with error re
0360: 70 6f 72 74 69 6e 67 2e 20 54 68 65 20 6d 61 63  porting. The mac
0370: 72 6f 73 20 61 72 65 20 64 65 66 69 6e 65 64 0a  ros are defined.
0380: 2a 2a 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74  **      immediat
0390: 65 6c 79 20 62 65 6c 6f 77 20 74 68 69 73 20 63  ely below this c
03a0: 6f 6d 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  omment..**.**   
03b0: 33 2e 20 54 68 65 20 74 65 73 74 20 63 6f 64 65  3. The test code
03c0: 20 69 74 73 65 6c 66 2e 20 41 6e 64 20 61 20 6d   itself. And a m
03d0: 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ain() routine to
03e0: 20 64 72 69 76 65 20 74 68 65 20 74 65 73 74 20   drive the test 
03f0: 0a 2a 2a 20 20 20 20 20 20 63 6f 64 65 2e 0a 2a  .**      code..*
0400: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
0410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
0450: 20 53 74 61 72 74 20 6f 66 20 74 65 73 74 20 63   Start of test c
0460: 6f 64 65 2f 69 6e 66 72 61 73 74 72 75 63 74 75  ode/infrastructu
0470: 72 65 20 69 6e 74 65 72 66 61 63 65 20 6d 61 63  re interface mac
0480: 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ros..**.** The f
0490: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20  ollowing macros 
04a0: 63 6f 6e 73 74 69 74 75 74 65 20 74 68 65 20 69  constitute the i
04b0: 6e 74 65 72 66 61 63 65 20 62 65 74 77 65 65 6e  nterface between
04c0: 20 74 68 65 20 74 65 73 74 0a 2a 2a 20 70 72 6f   the test.** pro
04d0: 67 72 61 6d 73 20 61 6e 64 20 74 68 65 20 74 65  grams and the te
04e0: 73 74 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  st infrastructur
04f0: 65 2e 20 54 65 73 74 20 69 6e 66 72 61 73 74 72  e. Test infrastr
0500: 75 63 74 75 72 65 20 63 6f 64 65 20 0a 2a 2a 20  ucture code .** 
0510: 64 6f 65 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  does not itself 
0520: 75 73 65 20 61 6e 79 20 6f 66 20 74 68 65 73 65  use any of these
0530: 20 6d 61 63 72 6f 73 2e 20 54 65 73 74 20 63 6f   macros. Test co
0540: 64 65 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a  de should not.**
0550: 20 63 61 6c 6c 20 61 6e 79 20 6f 66 20 74 68 65   call any of the
0560: 20 6d 61 63 72 6f 6e 61 6d 65 5f 78 28 29 20 66   macroname_x() f
0570: 75 6e 63 74 69 6f 6e 73 20 64 69 72 65 63 74 6c  unctions directl
0580: 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65  y..**.** See the
0590: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 73   header comments
05a0: 20 61 62 6f 76 65 20 74 68 65 20 63 6f 72 72 65   above the corre
05b0: 73 70 6f 6e 64 69 6e 67 20 6d 61 63 72 6f 6e 61  sponding macrona
05c0: 6d 65 5f 78 28 29 0a 2a 2a 20 66 75 6e 63 74 69  me_x().** functi
05d0: 6f 6e 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  on for a descrip
05e0: 74 69 6f 6e 20 6f 66 20 65 61 63 68 20 69 6e 74  tion of each int
05f0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 0a 2f 2a 20 44  erface..*/../* D
0600: 61 74 61 62 61 73 65 20 66 75 6e 63 74 69 6f 6e  atabase function
0610: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6f 70 65  s */.#define ope
0620: 6e 64 62 28 77 2c 78 2c 79 2c 7a 29 20 20 20 20  ndb(w,x,y,z)    
0630: 20 20 20 20 20 28 53 45 4c 28 77 29 2c 20 6f 70       (SEL(w), op
0640: 65 6e 64 62 5f 78 28 77 2c 78 2c 79 2c 7a 29 29  endb_x(w,x,y,z))
0650: 0a 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 64 62  .#define closedb
0660: 28 79 2c 7a 29 20 20 20 20 20 20 20 20 20 20 20  (y,z)           
0670: 20 28 53 45 4c 28 79 29 2c 20 63 6c 6f 73 65 64   (SEL(y), closed
0680: 62 5f 78 28 79 2c 7a 29 29 0a 0a 2f 2a 20 46 75  b_x(y,z))../* Fu
0690: 6e 63 74 69 6f 6e 73 20 74 6f 20 65 78 65 63 75  nctions to execu
06a0: 74 65 20 53 51 4c 20 2a 2f 0a 23 64 65 66 69 6e  te SQL */.#defin
06b0: 65 20 73 71 6c 5f 73 63 72 69 70 74 28 78 2c 79  e sql_script(x,y
06c0: 2c 7a 29 20 20 20 20 20 20 20 28 53 45 4c 28 78  ,z)       (SEL(x
06d0: 29 2c 20 73 71 6c 5f 73 63 72 69 70 74 5f 78 28  ), sql_script_x(
06e0: 78 2c 79 2c 7a 29 29 0a 23 64 65 66 69 6e 65 20  x,y,z)).#define 
06f0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28  integrity_check(
0700: 78 2c 79 29 20 20 20 20 28 53 45 4c 28 78 29 2c  x,y)    (SEL(x),
0710: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
0720: 5f 78 28 78 2c 79 29 29 0a 23 64 65 66 69 6e 65  _x(x,y)).#define
0730: 20 65 78 65 63 73 71 6c 5f 69 36 34 28 78 2c 79   execsql_i64(x,y
0740: 2c 2e 2e 2e 29 20 20 20 20 28 53 45 4c 28 78 29  ,...)    (SEL(x)
0750: 2c 20 65 78 65 63 73 71 6c 5f 69 36 34 5f 78 28  , execsql_i64_x(
0760: 78 2c 79 2c 5f 5f 56 41 5f 41 52 47 53 5f 5f 29  x,y,__VA_ARGS__)
0770: 29 0a 23 64 65 66 69 6e 65 20 65 78 65 63 73 71  ).#define execsq
0780: 6c 5f 74 65 78 74 28 78 2c 79 2c 7a 2c 2e 2e 2e  l_text(x,y,z,...
0790: 29 20 28 53 45 4c 28 78 29 2c 20 65 78 65 63 73  ) (SEL(x), execs
07a0: 71 6c 5f 74 65 78 74 5f 78 28 78 2c 79 2c 7a 2c  ql_text_x(x,y,z,
07b0: 5f 5f 56 41 5f 41 52 47 53 5f 5f 29 29 0a 23 64  __VA_ARGS__)).#d
07c0: 65 66 69 6e 65 20 65 78 65 63 73 71 6c 28 78 2c  efine execsql(x,
07d0: 79 2c 2e 2e 2e 29 20 20 20 20 20 20 20 20 28 53  y,...)        (S
07e0: 45 4c 28 78 29 2c 20 28 76 6f 69 64 29 65 78 65  EL(x), (void)exe
07f0: 63 73 71 6c 5f 69 36 34 5f 78 28 78 2c 79 2c 5f  csql_i64_x(x,y,_
0800: 5f 56 41 5f 41 52 47 53 5f 5f 29 29 0a 0a 2f 2a  _VA_ARGS__))../*
0810: 20 54 68 72 65 61 64 20 66 75 6e 63 74 69 6f 6e   Thread function
0820: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6c 61 75  s */.#define lau
0830: 6e 63 68 5f 74 68 72 65 61 64 28 77 2c 78 2c 79  nch_thread(w,x,y
0840: 2c 7a 29 20 20 28 53 45 4c 28 77 29 2c 20 6c 61  ,z)  (SEL(w), la
0850: 75 6e 63 68 5f 74 68 72 65 61 64 5f 78 28 77 2c  unch_thread_x(w,
0860: 78 2c 79 2c 7a 29 29 0a 23 64 65 66 69 6e 65 20  x,y,z)).#define 
0870: 6a 6f 69 6e 5f 61 6c 6c 5f 74 68 72 65 61 64 73  join_all_threads
0880: 28 79 2c 7a 29 20 20 20 28 53 45 4c 28 79 29 2c  (y,z)   (SEL(y),
0890: 20 6a 6f 69 6e 5f 61 6c 6c 5f 74 68 72 65 61 64   join_all_thread
08a0: 73 5f 78 28 79 2c 7a 29 29 0a 0a 2f 2a 20 54 69  s_x(y,z))../* Ti
08b0: 6d 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  mer functions */
08c0: 0a 23 64 65 66 69 6e 65 20 73 65 74 73 74 6f 70  .#define setstop
08d0: 74 69 6d 65 28 79 2c 7a 29 20 20 20 20 20 20 20  time(y,z)       
08e0: 20 28 53 45 4c 28 79 29 2c 20 73 65 74 73 74 6f   (SEL(y), setsto
08f0: 70 74 69 6d 65 5f 78 28 79 2c 7a 29 29 0a 23 64  ptime_x(y,z)).#d
0900: 65 66 69 6e 65 20 74 69 6d 65 74 6f 73 74 6f 70  efine timetostop
0910: 28 7a 29 20 20 20 20 20 20 20 20 20 20 20 28 53  (z)           (S
0920: 45 4c 28 7a 29 2c 20 74 69 6d 65 74 6f 73 74 6f  EL(z), timetosto
0930: 70 5f 78 28 7a 29 29 0a 0a 2f 2a 20 52 65 70 6f  p_x(z))../* Repo
0940: 72 74 2f 63 6c 65 61 72 20 65 72 72 6f 72 73 2e  rt/clear errors.
0950: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 74 65 73 74   */.#define test
0960: 5f 65 72 72 6f 72 28 7a 2c 20 2e 2e 2e 29 20 20  _error(z, ...)  
0970: 20 20 20 20 74 65 73 74 5f 65 72 72 6f 72 5f 78      test_error_x
0980: 28 7a 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  (z, sqlite3_mpri
0990: 6e 74 66 28 5f 5f 56 41 5f 41 52 47 53 5f 5f 29  ntf(__VA_ARGS__)
09a0: 29 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 5f  ).#define clear_
09b0: 65 72 72 6f 72 28 79 2c 7a 29 20 20 20 20 20 20  error(y,z)      
09c0: 20 20 63 6c 65 61 72 5f 65 72 72 6f 72 5f 78 28    clear_error_x(
09d0: 79 2c 20 7a 29 0a 0a 2f 2a 20 46 69 6c 65 2d 73  y, z)../* File-s
09e0: 79 73 74 65 6d 20 6f 70 65 72 61 74 69 6f 6e 73  ystem operations
09f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6c 65   */.#define file
0a00: 73 69 7a 65 28 79 2c 7a 29 20 20 20 20 20 20 20  size(y,z)       
0a10: 20 20 20 20 28 53 45 4c 28 79 29 2c 20 66 69 6c      (SEL(y), fil
0a20: 65 73 69 7a 65 5f 78 28 79 2c 7a 29 29 0a 23 64  esize_x(y,z)).#d
0a30: 65 66 69 6e 65 20 66 69 6c 65 63 6f 70 79 28 78  efine filecopy(x
0a40: 2c 79 2c 7a 29 20 20 20 20 20 20 20 20 20 28 53  ,y,z)         (S
0a50: 45 4c 28 78 29 2c 20 66 69 6c 65 63 6f 70 79 5f  EL(x), filecopy_
0a60: 78 28 78 2c 79 2c 7a 29 29 0a 0a 2f 2a 0a 2a 2a  x(x,y,z))../*.**
0a70: 20 45 6e 64 20 6f 66 20 74 65 73 74 20 63 6f 64   End of test cod
0a80: 65 2f 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  e/infrastructure
0a90: 20 69 6e 74 65 72 66 61 63 65 20 6d 61 63 72 6f   interface macro
0aa0: 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..*************
0ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
0af0: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c 69  ..#include <sqli
0b00: 74 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  te3.h>.#include 
0b10: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
0b20: 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69  ude <stdio.h>.#i
0b30: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
0b40: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
0b50: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
0b60: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 20 0a 23  <sys/types.h> .#
0b70: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
0b80: 74 2e 68 3e 20 0a 23 69 6e 63 6c 75 64 65 20 3c  t.h> .#include <
0b90: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0ba0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
0bb0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
0bc0: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 63 6f 64 65  ./*. * This code
0bd0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
0be0: 4d 44 35 20 6d 65 73 73 61 67 65 2d 64 69 67 65  MD5 message-dige
0bf0: 73 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a  st algorithm.. *
0c00: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 69   The algorithm i
0c10: 73 20 64 75 65 20 74 6f 20 52 6f 6e 20 52 69 76  s due to Ron Riv
0c20: 65 73 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20  est.  This code 
0c30: 77 61 73 0a 20 2a 20 77 72 69 74 74 65 6e 20 62  was. * written b
0c40: 79 20 43 6f 6c 69 6e 20 50 6c 75 6d 62 20 69 6e  y Colin Plumb in
0c50: 20 31 39 39 33 2c 20 6e 6f 20 63 6f 70 79 72 69   1993, no copyri
0c60: 67 68 74 20 69 73 20 63 6c 61 69 6d 65 64 2e 0a  ght is claimed..
0c70: 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20   * This code is 
0c80: 69 6e 20 74 68 65 20 70 75 62 6c 69 63 20 64 6f  in the public do
0c90: 6d 61 69 6e 3b 20 64 6f 20 77 69 74 68 20 69 74  main; do with it
0ca0: 20 77 68 61 74 20 79 6f 75 20 77 69 73 68 2e 0a   what you wish..
0cb0: 20 2a 0a 20 2a 20 45 71 75 69 76 61 6c 65 6e 74   *. * Equivalent
0cc0: 20 63 6f 64 65 20 69 73 20 61 76 61 69 6c 61 62   code is availab
0cd0: 6c 65 20 66 72 6f 6d 20 52 53 41 20 44 61 74 61  le from RSA Data
0ce0: 20 53 65 63 75 72 69 74 79 2c 20 49 6e 63 2e 0a   Security, Inc..
0cf0: 20 2a 20 54 68 69 73 20 63 6f 64 65 20 68 61 73   * This code has
0d00: 20 62 65 65 6e 20 74 65 73 74 65 64 20 61 67 61   been tested aga
0d10: 69 6e 73 74 20 74 68 61 74 2c 20 61 6e 64 20 69  inst that, and i
0d20: 73 20 65 71 75 69 76 61 6c 65 6e 74 2c 0a 20 2a  s equivalent,. *
0d30: 20 65 78 63 65 70 74 20 74 68 61 74 20 79 6f 75   except that you
0d40: 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 69   don't need to i
0d50: 6e 63 6c 75 64 65 20 74 77 6f 20 70 61 67 65 73  nclude two pages
0d60: 20 6f 66 20 6c 65 67 61 6c 65 73 65 0a 20 2a 20   of legalese. * 
0d70: 77 69 74 68 20 65 76 65 72 79 20 63 6f 70 79 2e  with every copy.
0d80: 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f 6d 70 75 74  . *. * To comput
0d90: 65 20 74 68 65 20 6d 65 73 73 61 67 65 20 64 69  e the message di
0da0: 67 65 73 74 20 6f 66 20 61 20 63 68 75 6e 6b 20  gest of a chunk 
0db0: 6f 66 20 62 79 74 65 73 2c 20 64 65 63 6c 61 72  of bytes, declar
0dc0: 65 20 61 6e 0a 20 2a 20 4d 44 35 43 6f 6e 74 65  e an. * MD5Conte
0dd0: 78 74 20 73 74 72 75 63 74 75 72 65 2c 20 70 61  xt structure, pa
0de0: 73 73 20 69 74 20 74 6f 20 4d 44 35 49 6e 69 74  ss it to MD5Init
0df0: 2c 20 63 61 6c 6c 20 4d 44 35 55 70 64 61 74 65  , call MD5Update
0e00: 20 61 73 0a 20 2a 20 6e 65 65 64 65 64 20 6f 6e   as. * needed on
0e10: 20 62 75 66 66 65 72 73 20 66 75 6c 6c 20 6f 66   buffers full of
0e20: 20 62 79 74 65 73 2c 20 61 6e 64 20 74 68 65 6e   bytes, and then
0e30: 20 63 61 6c 6c 20 4d 44 35 46 69 6e 61 6c 2c 20   call MD5Final, 
0e40: 77 68 69 63 68 0a 20 2a 20 77 69 6c 6c 20 66 69  which. * will fi
0e50: 6c 6c 20 61 20 73 75 70 70 6c 69 65 64 20 31 36  ll a supplied 16
0e60: 2d 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68  -byte array with
0e70: 20 74 68 65 20 64 69 67 65 73 74 2e 0a 20 2a 2f   the digest.. */
0e80: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69  ../*. * If compi
0e90: 6c 65 64 20 6f 6e 20 61 20 6d 61 63 68 69 6e 65  led on a machine
0ea0: 20 74 68 61 74 20 64 6f 65 73 6e 27 74 20 68 61   that doesn't ha
0eb0: 76 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ve a 32-bit inte
0ec0: 67 65 72 2c 0a 20 2a 20 79 6f 75 20 6a 75 73 74  ger,. * you just
0ed0: 20 73 65 74 20 22 75 69 6e 74 33 32 22 20 74 6f   set "uint32" to
0ee0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
0ef0: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 6e   datatype for an
0f00: 0a 20 2a 20 75 6e 73 69 67 6e 65 64 20 33 32 2d  . * unsigned 32-
0f10: 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 46 6f  bit integer.  Fo
0f20: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 2a 0a 20 2a  r example:. *. *
0f30: 20 20 20 20 20 20 20 63 63 20 2d 44 75 69 6e 74         cc -Duint
0f40: 33 32 3d 27 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  32='unsigned lon
0f50: 67 27 20 6d 64 35 2e 63 0a 20 2a 0a 20 2a 2f 0a  g' md5.c. *. */.
0f60: 23 69 66 6e 64 65 66 20 75 69 6e 74 33 32 0a 23  #ifndef uint32.#
0f70: 20 20 64 65 66 69 6e 65 20 75 69 6e 74 33 32 20    define uint32 
0f80: 75 6e 73 69 67 6e 65 64 20 69 6e 74 0a 23 65 6e  unsigned int.#en
0f90: 64 69 66 0a 0a 73 74 72 75 63 74 20 4d 44 35 43  dif..struct MD5C
0fa0: 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 69  ontext {.  int i
0fb0: 73 49 6e 69 74 3b 0a 20 20 75 69 6e 74 33 32 20  sInit;.  uint32 
0fc0: 62 75 66 5b 34 5d 3b 0a 20 20 75 69 6e 74 33 32  buf[4];.  uint32
0fd0: 20 62 69 74 73 5b 32 5d 3b 0a 20 20 75 6e 73 69   bits[2];.  unsi
0fe0: 67 6e 65 64 20 63 68 61 72 20 69 6e 5b 36 34 5d  gned char in[64]
0ff0: 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ;.};.typedef str
1000: 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 4d  uct MD5Context M
1010: 44 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 0a 20  D5Context;../*. 
1020: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 6f 64  * Note: this cod
1030: 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 6f 6e  e is harmless on
1040: 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6d   little-endian m
1050: 61 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a 73 74 61  achines.. */.sta
1060: 74 69 63 20 76 6f 69 64 20 62 79 74 65 52 65 76  tic void byteRev
1070: 65 72 73 65 20 28 75 6e 73 69 67 6e 65 64 20 63  erse (unsigned c
1080: 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e  har *buf, unsign
1090: 65 64 20 6c 6f 6e 67 73 29 7b 0a 20 20 75 69 6e  ed longs){.  uin
10a0: 74 33 32 20 74 3b 0a 20 20 64 6f 20 7b 0a 20 20  t32 t;.  do {.  
10b0: 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28    t = (uint32)((
10c0: 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c  unsigned)buf[3]<
10d0: 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20  <8 | buf[2]) << 
10e0: 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20 20 28  16 |.          (
10f0: 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d  (unsigned)buf[1]
1100: 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20  <<8 | buf[0]);. 
1110: 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29 62 75     *(uint32 *)bu
1120: 66 20 3d 20 74 3b 0a 20 20 20 20 62 75 66 20 2b  f = t;.    buf +
1130: 3d 20 34 3b 0a 20 20 7d 20 77 68 69 6c 65 20 28  = 4;.  } while (
1140: 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54  --longs);.}./* T
1150: 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e  he four core fun
1160: 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f  ctions - F1 is o
1170: 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61  ptimized somewha
1180: 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65  t */../* #define
1190: 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F1(x, y, z) (x 
11a0: 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f  & y | ~x & z) */
11b0: 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79  .#define F1(x, y
11c0: 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28  , z) (z ^ (x & (
11d0: 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65  y ^ z))).#define
11e0: 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28   F2(x, y, z) F1(
11f0: 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65  z, x, y).#define
1200: 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F3(x, y, z) (x 
1210: 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65  ^ y ^ z).#define
1220: 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20   F4(x, y, z) (y 
1230: 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20  ^ (x | ~z))../* 
1240: 54 68 69 73 20 69 73 20 74 68 65 20 63 65 6e 74  This is the cent
1250: 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20  ral step in the 
1260: 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a  MD5 algorithm. *
1270: 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45  /.#define MD5STE
1280: 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c  P(f, w, x, y, z,
1290: 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20 28 20   data, s) \.  ( 
12a0: 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a 29 20  w += f(x, y, z) 
12b0: 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77 3c 3c  + data,  w = w<<
12c0: 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c 20 20  s | w>>(32-s),  
12d0: 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a 20  w += x )../*. * 
12e0: 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65 20  The core of the 
12f0: 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c 20 74  MD5 algorithm, t
1300: 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20 65 78  his alters an ex
1310: 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73 68 20  isting MD5 hash 
1320: 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20 74 68  to. * reflect th
1330: 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 31 36  e addition of 16
1340: 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20 6e 65   longwords of ne
1350: 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70 64 61  w data.  MD5Upda
1360: 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74 68 65  te blocks. * the
1370: 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76 65 72   data and conver
1380: 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20 6c 6f  ts bytes into lo
1390: 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68 69 73  ngwords for this
13a0: 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73 74   routine.. */.st
13b0: 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54 72 61  atic void MD5Tra
13c0: 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20 62 75  nsform(uint32 bu
13d0: 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69 6e 74  f[4], const uint
13e0: 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20 72 65  32 in[16]){.  re
13f0: 67 69 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c  gister uint32 a,
1400: 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 61 20 3d   b, c, d;..  a =
1410: 20 62 75 66 5b 30 5d 3b 0a 20 20 62 20 3d 20 62   buf[0];.  b = b
1420: 75 66 5b 31 5d 3b 0a 20 20 63 20 3d 20 62 75 66  uf[1];.  c = buf
1430: 5b 32 5d 3b 0a 20 20 64 20 3d 20 62 75 66 5b 33  [2];.  d = buf[3
1440: 5d 3b 0a 0a 20 20 4d 44 35 53 54 45 50 28 46 31  ];..  MD5STEP(F1
1450: 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1460: 5b 20 30 5d 2b 30 78 64 37 36 61 61 34 37 38 2c  [ 0]+0xd76aa478,
1470: 20 20 37 29 3b 0a 20 20 4d 44 35 53 54 45 50 28    7);.  MD5STEP(
1480: 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1490: 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35  in[ 1]+0xe8c7b75
14a0: 36 2c 20 31 32 29 3b 0a 20 20 4d 44 35 53 54 45  6, 12);.  MD5STE
14b0: 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
14c0: 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32 30 37  , in[ 2]+0x24207
14d0: 30 64 62 2c 20 31 37 29 3b 0a 20 20 4d 44 35 53  0db, 17);.  MD5S
14e0: 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
14f0: 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62   a, in[ 3]+0xc1b
1500: 64 63 65 65 65 2c 20 32 32 29 3b 0a 20 20 4d 44  dceee, 22);.  MD
1510: 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1520: 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66  c, d, in[ 4]+0xf
1530: 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20  57c0faf,  7);.  
1540: 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61  MD5STEP(F1, d, a
1550: 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 35 5d 2b 30  , b, c, in[ 5]+0
1560: 78 34 37 38 37 63 36 32 61 2c 20 31 32 29 3b 0a  x4787c62a, 12);.
1570: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
1580: 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d   d, a, b, in[ 6]
1590: 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31 37 29  +0xa8304613, 17)
15a0: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20  ;.  MD5STEP(F1, 
15b0: 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
15c0: 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32  7]+0xfd469501, 2
15d0: 32 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31  2);.  MD5STEP(F1
15e0: 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
15f0: 5b 20 38 5d 2b 30 78 36 39 38 30 39 38 64 38 2c  [ 8]+0x698098d8,
1600: 20 20 37 29 3b 0a 20 20 4d 44 35 53 54 45 50 28    7);.  MD5STEP(
1610: 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1620: 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61  in[ 9]+0x8b44f7a
1630: 66 2c 20 31 32 29 3b 0a 20 20 4d 44 35 53 54 45  f, 12);.  MD5STE
1640: 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
1650: 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66 66 35  , in[10]+0xffff5
1660: 62 62 31 2c 20 31 37 29 3b 0a 20 20 4d 44 35 53  bb1, 17);.  MD5S
1670: 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1680: 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35   a, in[11]+0x895
1690: 63 64 37 62 65 2c 20 32 32 29 3b 0a 20 20 4d 44  cd7be, 22);.  MD
16a0: 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
16b0: 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36  c, d, in[12]+0x6
16c0: 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20  b901122,  7);.  
16d0: 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61  MD5STEP(F1, d, a
16e0: 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33 5d 2b 30  , b, c, in[13]+0
16f0: 78 66 64 39 38 37 31 39 33 2c 20 31 32 29 3b 0a  xfd987193, 12);.
1700: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
1710: 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d   d, a, b, in[14]
1720: 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31 37 29  +0xa679438e, 17)
1730: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20  ;.  MD5STEP(F1, 
1740: 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
1750: 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32  5]+0x49b40821, 2
1760: 32 29 3b 0a 0a 20 20 4d 44 35 53 54 45 50 28 46  2);..  MD5STEP(F
1770: 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  2, a, b, c, d, i
1780: 6e 5b 20 31 5d 2b 30 78 66 36 31 65 32 35 36 32  n[ 1]+0xf61e2562
1790: 2c 20 20 35 29 3b 0a 20 20 4d 44 35 53 54 45 50  ,  5);.  MD5STEP
17a0: 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
17b0: 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33   in[ 6]+0xc040b3
17c0: 34 30 2c 20 20 39 29 3b 0a 20 20 4d 44 35 53 54  40,  9);.  MD5ST
17d0: 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
17e0: 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36 35 65  b, in[11]+0x265e
17f0: 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 4d 44 35  5a51, 14);.  MD5
1800: 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1810: 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39  , a, in[ 0]+0xe9
1820: 62 36 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 4d  b6c7aa, 20);.  M
1830: 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1840: 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
1850: 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20  d62f105d,  5);. 
1860: 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20   MD5STEP(F2, d, 
1870: 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 30 5d 2b  a, b, c, in[10]+
1880: 30 78 30 32 34 34 31 34 35 33 2c 20 20 39 29 3b  0x02441453,  9);
1890: 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63  .  MD5STEP(F2, c
18a0: 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35  , d, a, b, in[15
18b0: 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20 31 34  ]+0xd8a1e681, 14
18c0: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c  );.  MD5STEP(F2,
18d0: 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18e0: 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20   4]+0xe7d3fbc8, 
18f0: 32 30 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  20);.  MD5STEP(F
1900: 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  2, a, b, c, d, i
1910: 6e 5b 20 39 5d 2b 30 78 32 31 65 31 63 64 65 36  n[ 9]+0x21e1cde6
1920: 2c 20 20 35 29 3b 0a 20 20 4d 44 35 53 54 45 50  ,  5);.  MD5STEP
1930: 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1940: 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37   in[14]+0xc33707
1950: 64 36 2c 20 20 39 29 3b 0a 20 20 4d 44 35 53 54  d6,  9);.  MD5ST
1960: 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
1970: 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34 64 35  b, in[ 3]+0xf4d5
1980: 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 4d 44 35  0d87, 14);.  MD5
1990: 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
19a0: 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35  , a, in[ 8]+0x45
19b0: 35 61 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 4d  5a14ed, 20);.  M
19c0: 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
19d0: 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
19e0: 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20  a9e3e905,  5);. 
19f0: 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20   MD5STEP(F2, d, 
1a00: 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 32 5d 2b  a, b, c, in[ 2]+
1a10: 30 78 66 63 65 66 61 33 66 38 2c 20 20 39 29 3b  0xfcefa3f8,  9);
1a20: 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63  .  MD5STEP(F2, c
1a30: 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37  , d, a, b, in[ 7
1a40: 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20 31 34  ]+0x676f02d9, 14
1a50: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c  );.  MD5STEP(F2,
1a60: 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
1a70: 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20  12]+0x8d2a4c8a, 
1a80: 32 30 29 3b 0a 0a 20 20 4d 44 35 53 54 45 50 28  20);..  MD5STEP(
1a90: 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F3, a, b, c, d, 
1aa0: 69 6e 5b 20 35 5d 2b 30 78 66 66 66 61 33 39 34  in[ 5]+0xfffa394
1ab0: 32 2c 20 20 34 29 3b 0a 20 20 4d 44 35 53 54 45  2,  4);.  MD5STE
1ac0: 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1ad0: 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66  , in[ 8]+0x8771f
1ae0: 36 38 31 2c 20 31 31 29 3b 0a 20 20 4d 44 35 53  681, 11);.  MD5S
1af0: 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
1b00: 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36 64 39   b, in[11]+0x6d9
1b10: 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20 4d 44  d6122, 16);.  MD
1b20: 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1b30: 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66  d, a, in[14]+0xf
1b40: 64 65 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20  de5380c, 23);.  
1b50: 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1b60: 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30  , c, d, in[ 1]+0
1b70: 78 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a  xa4beea44,  4);.
1b80: 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c    MD5STEP(F3, d,
1b90: 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 34 5d   a, b, c, in[ 4]
1ba0: 2b 30 78 34 62 64 65 63 66 61 39 2c 20 31 31 29  +0x4bdecfa9, 11)
1bb0: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20  ;.  MD5STEP(F3, 
1bc0: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1bd0: 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c 20 31  7]+0xf6bb4b60, 1
1be0: 36 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33  6);.  MD5STEP(F3
1bf0: 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1c00: 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c  [10]+0xbebfbc70,
1c10: 20 32 33 29 3b 0a 20 20 4d 44 35 53 54 45 50 28   23);.  MD5STEP(
1c20: 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F3, a, b, c, d, 
1c30: 69 6e 5b 31 33 5d 2b 30 78 32 38 39 62 37 65 63  in[13]+0x289b7ec
1c40: 36 2c 20 20 34 29 3b 0a 20 20 4d 44 35 53 54 45  6,  4);.  MD5STE
1c50: 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1c60: 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32  , in[ 0]+0xeaa12
1c70: 37 66 61 2c 20 31 31 29 3b 0a 20 20 4d 44 35 53  7fa, 11);.  MD5S
1c80: 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
1c90: 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64 34 65   b, in[ 3]+0xd4e
1ca0: 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20 4d 44  f3085, 16);.  MD
1cb0: 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1cc0: 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30  d, a, in[ 6]+0x0
1cd0: 34 38 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20  4881d05, 23);.  
1ce0: 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1cf0: 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30  , c, d, in[ 9]+0
1d00: 78 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a  xd9d4d039,  4);.
1d10: 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c    MD5STEP(F3, d,
1d20: 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 32 5d   a, b, c, in[12]
1d30: 2b 30 78 65 36 64 62 39 39 65 35 2c 20 31 31 29  +0xe6db99e5, 11)
1d40: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20  ;.  MD5STEP(F3, 
1d50: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
1d60: 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c 20 31  5]+0x1fa27cf8, 1
1d70: 36 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33  6);.  MD5STEP(F3
1d80: 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1d90: 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c  [ 2]+0xc4ac5665,
1da0: 20 32 33 29 3b 0a 0a 20 20 4d 44 35 53 54 45 50   23);..  MD5STEP
1db0: 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F4, a, b, c, d,
1dc0: 20 69 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32 32   in[ 0]+0xf42922
1dd0: 34 34 2c 20 20 36 29 3b 0a 20 20 4d 44 35 53 54  44,  6);.  MD5ST
1de0: 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1df0: 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61  c, in[ 7]+0x432a
1e00: 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 4d 44 35  ff97, 10);.  MD5
1e10: 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
1e20: 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 62  , b, in[14]+0xab
1e30: 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20 20 4d  9423a7, 15);.  M
1e40: 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1e50: 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78   d, a, in[ 5]+0x
1e60: 66 63 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20  fc93a039, 21);. 
1e70: 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1e80: 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b  b, c, d, in[12]+
1e90: 30 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b  0x655b59c3,  6);
1ea0: 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64  .  MD5STEP(F4, d
1eb0: 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 33  , a, b, c, in[ 3
1ec0: 5d 2b 30 78 38 66 30 63 63 63 39 32 2c 20 31 30  ]+0x8f0ccc92, 10
1ed0: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c  );.  MD5STEP(F4,
1ee0: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1ef0: 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64 2c 20  10]+0xffeff47d, 
1f00: 31 35 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  15);.  MD5STEP(F
1f10: 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
1f20: 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31  n[ 1]+0x85845dd1
1f30: 2c 20 32 31 29 3b 0a 20 20 4d 44 35 53 54 45 50  , 21);.  MD5STEP
1f40: 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F4, a, b, c, d,
1f50: 20 69 6e 5b 20 38 5d 2b 30 78 36 66 61 38 37 65   in[ 8]+0x6fa87e
1f60: 34 66 2c 20 20 36 29 3b 0a 20 20 4d 44 35 53 54  4f,  6);.  MD5ST
1f70: 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1f80: 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63  c, in[15]+0xfe2c
1f90: 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 4d 44 35  e6e0, 10);.  MD5
1fa0: 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
1fb0: 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 33  , b, in[ 6]+0xa3
1fc0: 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20 20 4d  014314, 15);.  M
1fd0: 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1fe0: 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78   d, a, in[13]+0x
1ff0: 34 65 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20  4e0811a1, 21);. 
2000: 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
2010: 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b  b, c, d, in[ 4]+
2020: 30 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b  0xf7537e82,  6);
2030: 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64  .  MD5STEP(F4, d
2040: 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 31  , a, b, c, in[11
2050: 5d 2b 30 78 62 64 33 61 66 32 33 35 2c 20 31 30  ]+0xbd3af235, 10
2060: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c  );.  MD5STEP(F4,
2070: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
2080: 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62 2c 20   2]+0x2ad7d2bb, 
2090: 31 35 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  15);.  MD5STEP(F
20a0: 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
20b0: 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31  n[ 9]+0xeb86d391
20c0: 2c 20 32 31 29 3b 0a 0a 20 20 62 75 66 5b 30 5d  , 21);..  buf[0]
20d0: 20 2b 3d 20 61 3b 0a 20 20 62 75 66 5b 31 5d 20   += a;.  buf[1] 
20e0: 2b 3d 20 62 3b 0a 20 20 62 75 66 5b 32 5d 20 2b  += b;.  buf[2] +
20f0: 3d 20 63 3b 0a 20 20 62 75 66 5b 33 5d 20 2b 3d  = c;.  buf[3] +=
2100: 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61   d;.}../*. * Sta
2110: 72 74 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74  rt MD5 accumulat
2120: 69 6f 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f  ion.  Set bit co
2130: 75 6e 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66  unt to 0 and buf
2140: 66 65 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75  fer to mysteriou
2150: 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  s. * initializat
2160: 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20  ion constants.. 
2170: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
2180: 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78  D5Init(MD5Contex
2190: 74 20 2a 63 74 78 29 7b 0a 20 20 63 74 78 2d 3e  t *ctx){.  ctx->
21a0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 63 74  isInit = 1;.  ct
21b0: 78 2d 3e 62 75 66 5b 30 5d 20 3d 20 30 78 36 37  x->buf[0] = 0x67
21c0: 34 35 32 33 30 31 3b 0a 20 20 63 74 78 2d 3e 62  452301;.  ctx->b
21d0: 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62  uf[1] = 0xefcdab
21e0: 38 39 3b 0a 20 20 63 74 78 2d 3e 62 75 66 5b 32  89;.  ctx->buf[2
21f0: 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a  ] = 0x98badcfe;.
2200: 20 20 63 74 78 2d 3e 62 75 66 5b 33 5d 20 3d 20    ctx->buf[3] = 
2210: 30 78 31 30 33 32 35 34 37 36 3b 0a 20 20 63 74  0x10325476;.  ct
2220: 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a  x->bits[0] = 0;.
2230: 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 3d    ctx->bits[1] =
2240: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64   0;.}../*. * Upd
2250: 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f 20 72  ate context to r
2260: 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e 63 61  eflect the conca
2270: 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 6f 74  tenation of anot
2280: 68 65 72 20 62 75 66 66 65 72 20 66 75 6c 6c 0a  her buffer full.
2290: 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20 2a 2f   * of bytes.. */
22a0: 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20 4d 44  .static .void MD
22b0: 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e 74 65  5Update(MD5Conte
22c0: 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74 20 75  xt *ctx, const u
22d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
22e0: 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  f, unsigned int 
22f0: 6c 65 6e 29 7b 0a 20 20 75 69 6e 74 33 32 20 74  len){.  uint32 t
2300: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 62  ;..  /* Update b
2310: 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 74 20  itcount */..  t 
2320: 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a  = ctx->bits[0];.
2330: 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69 74 73    if ((ctx->bits
2340: 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e 74  [0] = t + ((uint
2350: 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20  32)len << 3)) < 
2360: 74 29 0a 20 20 20 20 63 74 78 2d 3e 62 69 74 73  t).    ctx->bits
2370: 5b 31 5d 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20  [1]++; /* Carry 
2380: 66 72 6f 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68  from low to high
2390: 20 2a 2f 0a 20 20 63 74 78 2d 3e 62 69 74 73 5b   */.  ctx->bits[
23a0: 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b  1] += len >> 29;
23b0: 0a 0a 20 20 74 20 3d 20 28 74 20 3e 3e 20 33 29  ..  t = (t >> 3)
23c0: 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a 20 42   & 0x3f;    /* B
23d0: 79 74 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ytes already in 
23e0: 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20 2a 2f  shsInfo->data */
23f0: 0a 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e  ..  /* Handle an
2400: 79 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73 69  y leading odd-si
2410: 7a 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20  zed chunks */.. 
2420: 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20   if ( t ) {.    
2430: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2440: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
2450: 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b  r *)ctx->in + t;
2460: 0a 0a 20 20 20 20 74 20 3d 20 36 34 2d 74 3b 0a  ..    t = 64-t;.
2470: 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 74 29      if (len < t)
2480: 20 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28   {.      memcpy(
2490: 70 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  p, buf, len);.  
24a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
24b0: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  }.    memcpy(p, 
24c0: 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 62 79 74  buf, t);.    byt
24d0: 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
24e0: 2c 20 31 36 29 3b 0a 20 20 20 20 4d 44 35 54 72  , 16);.    MD5Tr
24f0: 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
2500: 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
2510: 3e 69 6e 29 3b 0a 20 20 20 20 62 75 66 20 2b 3d  >in);.    buf +=
2520: 20 74 3b 0a 20 20 20 20 6c 65 6e 20 2d 3d 20 74   t;.    len -= t
2530: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  ;.  }..  /* Proc
2540: 65 73 73 20 64 61 74 61 20 69 6e 20 36 34 2d 62  ess data in 64-b
2550: 79 74 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20  yte chunks */.. 
2560: 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36   while (len >= 6
2570: 34 29 20 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  4) {.    memcpy(
2580: 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34  ctx->in, buf, 64
2590: 29 3b 0a 20 20 20 20 62 79 74 65 52 65 76 65 72  );.    byteRever
25a0: 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b  se(ctx->in, 16);
25b0: 0a 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72  .    MD5Transfor
25c0: 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
25d0: 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
25e0: 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20      buf += 64;. 
25f0: 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20     len -= 64;.  
2600: 7d 0a 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61  }..  /* Handle a
2610: 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 62 79 74  ny remaining byt
2620: 65 73 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a  es of data. */..
2630: 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e    memcpy(ctx->in
2640: 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a  , buf, len);.}..
2650: 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70  /*. * Final wrap
2660: 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62  up - pad to 64-b
2670: 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74  yte boundary wit
2680: 68 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72  h the bit patter
2690: 6e 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62  n . * 1 0* (64-b
26a0: 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73  it count of bits
26b0: 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d   processed, MSB-
26c0: 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69  first). */.stati
26d0: 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28  c void MD5Final(
26e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
26f0: 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e  gest[16], MD5Con
2700: 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 75 6e  text *ctx){.  un
2710: 73 69 67 6e 65 64 20 63 6f 75 6e 74 3b 0a 20 20  signed count;.  
2720: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2730: 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
2740: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2750: 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 63 6f 75 6e  mod 64 */.  coun
2760: 74 20 3d 20 28 63 74 78 2d 3e 62 69 74 73 5b 30  t = (ctx->bits[0
2770: 5d 20 3e 3e 20 33 29 20 26 20 30 78 33 46 3b 0a  ] >> 3) & 0x3F;.
2780: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69  .  /* Set the fi
2790: 72 73 74 20 63 68 61 72 20 6f 66 20 70 61 64 64  rst char of padd
27a0: 69 6e 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68  ing to 0x80.  Th
27b0: 69 73 20 69 73 20 73 61 66 65 20 73 69 6e 63 65  is is safe since
27c0: 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 61   there is.     a
27d0: 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74 20 6f  lways at least o
27e0: 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a 2f 0a  ne byte free */.
27f0: 20 20 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b 20    p = ctx->in + 
2800: 63 6f 75 6e 74 3b 0a 20 20 2a 70 2b 2b 20 3d 20  count;.  *p++ = 
2810: 30 78 38 30 3b 0a 0a 20 20 2f 2a 20 42 79 74 65  0x80;..  /* Byte
2820: 73 20 6f 66 20 70 61 64 64 69 6e 67 20 6e 65 65  s of padding nee
2830: 64 65 64 20 74 6f 20 6d 61 6b 65 20 36 34 20 62  ded to make 64 b
2840: 79 74 65 73 20 2a 2f 0a 20 20 63 6f 75 6e 74 20  ytes */.  count 
2850: 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74  = 64 - 1 - count
2860: 3b 0a 0a 20 20 2f 2a 20 50 61 64 20 6f 75 74 20  ;..  /* Pad out 
2870: 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a  to 56 mod 64 */.
2880: 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 20 38 29    if (count < 8)
2890: 20 7b 0a 20 20 20 20 2f 2a 20 54 77 6f 20 6c 6f   {.    /* Two lo
28a0: 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a 20 20  ts of padding:  
28b0: 50 61 64 20 74 68 65 20 66 69 72 73 74 20 62 6c  Pad the first bl
28c0: 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65 73 20  ock to 64 bytes 
28d0: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c  */.    memset(p,
28e0: 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20   0, count);.    
28f0: 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
2900: 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 4d 44  >in, 16);.    MD
2910: 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e  5Transform(ctx->
2920: 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63  buf, (uint32 *)c
2930: 74 78 2d 3e 69 6e 29 3b 0a 0a 20 20 20 20 2f 2a  tx->in);..    /*
2940: 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20 6e 65   Now fill the ne
2950: 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20 35 36  xt block with 56
2960: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6d 65   bytes */.    me
2970: 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c  mset(ctx->in, 0,
2980: 20 35 36 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b   56);.  } else {
2990: 0a 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63  .    /* Pad bloc
29a0: 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f  k to 56 bytes */
29b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  .    memset(p, 0
29c0: 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 7d 0a  , count-8);.  }.
29d0: 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74    byteReverse(ct
29e0: 78 2d 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20 2f  x->in, 14);..  /
29f0: 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20  * Append length 
2a00: 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e  in bits and tran
2a10: 73 66 6f 72 6d 20 2a 2f 0a 20 20 28 28 75 69 6e  sform */.  ((uin
2a20: 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 5b 20  t32 *)ctx->in)[ 
2a30: 31 34 20 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73  14 ] = ctx->bits
2a40: 5b 30 5d 3b 0a 20 20 28 28 75 69 6e 74 33 32 20  [0];.  ((uint32 
2a50: 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31 35 20 5d  *)ctx->in)[ 15 ]
2a60: 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 3b   = ctx->bits[1];
2a70: 0a 0a 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d  ..  MD5Transform
2a80: 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
2a90: 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
2aa0: 20 62 79 74 65 52 65 76 65 72 73 65 28 28 75 6e   byteReverse((un
2ab0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74  signed char *)ct
2ac0: 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20 6d 65  x->buf, 4);.  me
2ad0: 6d 63 70 79 28 64 69 67 65 73 74 2c 20 63 74 78  mcpy(digest, ctx
2ae0: 2d 3e 62 75 66 2c 20 31 36 29 3b 0a 20 20 6d 65  ->buf, 16);.  me
2af0: 6d 73 65 74 28 63 74 78 2c 20 30 2c 20 73 69 7a  mset(ctx, 0, siz
2b00: 65 6f 66 28 63 74 78 29 29 3b 20 20 20 20 2f 2a  eof(ctx));    /*
2b10: 20 49 6e 20 63 61 73 65 20 69 74 20 69 73 20 73   In case it is s
2b20: 65 6e 73 69 74 69 76 65 20 2a 2f 0a 7d 0a 0a 2f  ensitive */.}../
2b30: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31  *.** Convert a 1
2b40: 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73  28-bit MD5 diges
2b50: 74 20 69 6e 74 6f 20 61 20 33 32 2d 64 69 67 69  t into a 32-digi
2b60: 74 20 62 61 73 65 2d 31 36 20 6e 75 6d 62 65 72  t base-16 number
2b70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b80: 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
2b90: 31 36 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  16(unsigned char
2ba0: 20 2a 64 69 67 65 73 74 2c 20 63 68 61 72 20 2a   *digest, char *
2bb0: 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
2bc0: 63 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f  char const zEnco
2bd0: 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  de[] = "01234567
2be0: 38 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74  89abcdef";.  int
2bf0: 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d   i, j;..  for(j=
2c00: 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b 29 7b  i=0; i<16; i++){
2c10: 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 64 69 67  .    int a = dig
2c20: 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66  est[i];.    zBuf
2c30: 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b  [j++] = zEncode[
2c40: 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20  (a>>4)&0xf];.   
2c50: 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e   zBuf[j++] = zEn
2c60: 63 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20  code[a & 0xf];. 
2c70: 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
2c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  ;.}../*.** Durin
2c90: 67 20 74 65 73 74 69 6e 67 2c 20 74 68 65 20 73  g testing, the s
2ca0: 70 65 63 69 61 6c 20 6d 64 35 73 75 6d 28 29 20  pecial md5sum() 
2cb0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2cc0: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
2cd0: 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51 4c 69 74  .** inside SQLit
2ce0: 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e.  The followin
2cf0: 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  g routines imple
2d00: 6d 65 6e 74 20 74 68 61 74 20 66 75 6e 63 74 69  ment that functi
2d10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2d20: 69 64 20 6d 64 35 73 74 65 70 28 73 71 6c 69 74  id md5step(sqlit
2d30: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
2d40: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
2d50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2d60: 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65  rgv){.  MD5Conte
2d70: 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  xt *p;.  int i;.
2d80: 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
2d90: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73 71 6c  eturn;.  p = sql
2da0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2db0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
2dc0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2dd0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2de0: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69 73 49 6e  ;.  if( !p->isIn
2df0: 69 74 20 29 7b 0a 20 20 20 20 4d 44 35 49 6e 69  it ){.    MD5Ini
2e00: 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  t(p);.  }.  for(
2e10: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
2e20: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2e30: 72 20 2a 7a 44 61 74 61 20 3d 20 28 63 68 61 72  r *zData = (char
2e40: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2e50: 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20  text(argv[i]);. 
2e60: 20 20 20 69 66 28 20 7a 44 61 74 61 20 29 7b 0a     if( zData ){.
2e70: 20 20 20 20 20 20 4d 44 35 55 70 64 61 74 65 28        MD5Update(
2e80: 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  p, (unsigned cha
2e90: 72 2a 29 7a 44 61 74 61 2c 20 73 74 72 6c 65 6e  r*)zData, strlen
2ea0: 28 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a  (zData));.    }.
2eb0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2ec0: 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73 71  d md5finalize(sq
2ed0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
2ee0: 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f  ontext){.  MD5Co
2ef0: 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69  ntext *p;.  unsi
2f00: 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
2f10: 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75  [16];.  char zBu
2f20: 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  f[33];.  p = sql
2f30: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2f40: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
2f50: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d  sizeof(*p));.  M
2f60: 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70  D5Final(digest,p
2f70: 29 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54 6f  );.  MD5DigestTo
2f80: 42 61 73 65 31 36 28 64 69 67 65 73 74 2c 20 7a  Base16(digest, z
2f90: 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
2fa0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
2fb0: 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53  ext, zBuf, -1, S
2fc0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
2fd0: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
2fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
3020: 2a 2a 20 45 6e 64 20 6f 66 20 63 6f 70 69 65 64  ** End of copied
3030: 20 6d 64 35 73 75 6d 28 29 20 63 6f 64 65 2e 0a   md5sum() code..
3040: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 71 6c 69  */..typedef sqli
3050: 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b 0a 0a  te3_int64 i64;..
3060: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
3070: 72 72 6f 72 20 45 72 72 6f 72 3b 0a 74 79 70 65  rror Error;.type
3080: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 69 74  def struct Sqlit
3090: 65 20 53 71 6c 69 74 65 3b 0a 74 79 70 65 64 65  e Sqlite;.typede
30a0: 66 20 73 74 72 75 63 74 20 53 74 61 74 65 6d 65  f struct Stateme
30b0: 6e 74 20 53 74 61 74 65 6d 65 6e 74 3b 0a 0a 74  nt Statement;..t
30c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 68  ypedef struct Th
30d0: 72 65 61 64 73 65 74 20 54 68 72 65 61 64 73 65  readset Threadse
30e0: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
30f0: 74 20 54 68 72 65 61 64 20 54 68 72 65 61 64 3b  t Thread Thread;
3100: 0a 0a 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65  ../* Total numbe
3110: 72 20 6f 66 20 65 72 72 6f 72 73 20 69 6e 20 74  r of errors in t
3120: 68 69 73 20 70 72 6f 63 65 73 73 20 73 6f 20 66  his process so f
3130: 61 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ar. */.static in
3140: 74 20 6e 47 6c 6f 62 61 6c 45 72 72 20 3d 20 30  t nGlobalErr = 0
3150: 3b 0a 0a 2f 2a 20 53 65 74 20 74 6f 20 74 72 75  ;../* Set to tru
3160: 65 20 74 6f 20 72 75 6e 20 69 6e 20 22 70 72 6f  e to run in "pro
3170: 63 65 73 73 22 20 69 6e 73 74 65 61 64 20 6f 66  cess" instead of
3180: 20 22 74 68 72 65 61 64 22 20 6d 6f 64 65 2e 20   "thread" mode. 
3190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 50  */.static int bP
31a0: 72 6f 63 65 73 73 4d 6f 64 65 20 3d 20 30 3b 0a  rocessMode = 0;.
31b0: 0a 73 74 72 75 63 74 20 45 72 72 6f 72 20 7b 0a  .struct Error {.
31c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
31d0: 69 4c 69 6e 65 3b 0a 20 20 63 68 61 72 20 2a 7a  iLine;.  char *z
31e0: 45 72 72 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  Err;.};..struct 
31f0: 53 71 6c 69 74 65 20 7b 0a 20 20 73 71 6c 69 74  Sqlite {.  sqlit
3200: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
3210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
3220: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
3230: 0a 20 20 53 74 61 74 65 6d 65 6e 74 20 2a 70 43  .  Statement *pC
3240: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
3250: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
3260: 74 20 6f 66 20 63 61 63 68 65 64 20 73 74 61 74  t of cached stat
3270: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
3280: 6e 54 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  nText;          
3290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
32a0: 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 74 20  ize of array at 
32b0: 61 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 63 68 61  aText[] */.  cha
32c0: 72 20 2a 2a 61 54 65 78 74 3b 20 20 20 20 20 20  r **aText;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32e0: 53 74 6f 72 65 64 20 74 65 78 74 20 72 65 73 75  Stored text resu
32f0: 6c 74 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  lts */.};..struc
3300: 74 20 53 74 61 74 65 6d 65 6e 74 20 7b 0a 20 20  t Statement {.  
3310: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
3320: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
3330: 2f 2a 20 50 72 65 2d 63 6f 6d 70 69 6c 65 64 20  /* Pre-compiled 
3340: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
3350: 20 2a 2f 0a 20 20 53 74 61 74 65 6d 65 6e 74 20   */.  Statement 
3360: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
3370: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 74        /* Next st
3380: 61 74 65 6d 65 6e 74 20 69 6e 20 6c 69 6e 6b 65  atement in linke
3390: 64 2d 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 73 74  d-list */.};..st
33a0: 72 75 63 74 20 54 68 72 65 61 64 20 7b 0a 20 20  ruct Thread {.  
33b0: 69 6e 74 20 69 54 69 64 3b 20 20 20 20 20 20 20  int iTid;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 54 68 72 65 61 64 20 6e 75 6d 62 65 72  /* Thread number
33e0: 20 77 69 74 68 69 6e 20 74 65 73 74 20 2a 2f 0a   within test */.
33f0: 20 20 69 6e 74 20 69 41 72 67 3b 20 20 20 20 20    int iArg;     
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 72 67    /* Integer arg
3420: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 62 79 20  ument passed by 
3430: 63 61 6c 6c 65 72 20 2a 2f 0a 0a 20 20 70 74 68  caller */..  pth
3440: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20  read_t tid;     
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3460: 54 68 72 65 61 64 20 69 64 20 2a 2f 0a 20 20 63  Thread id */.  c
3470: 68 61 72 20 2a 28 2a 78 50 72 6f 63 29 28 69 6e  har *(*xProc)(in
3480: 74 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  t, int);       /
3490: 2a 20 54 68 72 65 61 64 20 6d 61 69 6e 20 70 72  * Thread main pr
34a0: 6f 63 20 2a 2f 0a 20 20 54 68 72 65 61 64 20 2a  oc */.  Thread *
34b0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
34c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
34d0: 69 6e 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20  in this list of 
34e0: 74 68 72 65 61 64 73 20 2a 2f 0a 7d 3b 0a 0a 73  threads */.};..s
34f0: 74 72 75 63 74 20 54 68 72 65 61 64 73 65 74 20  truct Threadset 
3500: 7b 0a 20 20 69 6e 74 20 69 4d 61 78 54 69 64 3b  {.  int iMaxTid;
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69      /* Largest i
3530: 54 69 64 20 76 61 6c 75 65 20 61 6c 6c 6f 63 61  Tid value alloca
3540: 74 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ted so far */.  
3550: 54 68 72 65 61 64 20 2a 70 54 68 72 65 61 64 3b  Thread *pThread;
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
3580: 66 20 74 68 72 65 61 64 73 20 2a 2f 0a 7d 3b 0a  f threads */.};.
3590: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
35a0: 65 5f 65 72 72 28 45 72 72 6f 72 20 2a 70 29 7b  e_err(Error *p){
35b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
35c0: 70 2d 3e 7a 45 72 72 29 3b 0a 20 20 70 2d 3e 7a  p->zErr);.  p->z
35d0: 45 72 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 63  Err = 0;.  p->rc
35e0: 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 0;.}..static 
35f0: 76 6f 69 64 20 70 72 69 6e 74 5f 65 72 72 28 45  void print_err(E
3600: 72 72 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rror *p){.  if( 
3610: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
3620: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
3630: 45 72 72 6f 72 3a 20 28 25 64 29 20 5c 22 25 73  Error: (%d) \"%s
3640: 5c 22 20 61 74 20 6c 69 6e 65 20 25 64 5c 6e 22  \" at line %d\n"
3650: 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72  , p->rc, p->zErr
3660: 2c 20 70 2d 3e 69 4c 69 6e 65 29 3b 0a 20 20 20  , p->iLine);.   
3670: 20 6e 47 6c 6f 62 61 6c 45 72 72 2b 2b 3b 0a 20   nGlobalErr++;. 
3680: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
3690: 64 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65  d print_and_free
36a0: 5f 65 72 72 28 45 72 72 6f 72 20 2a 70 29 7b 0a  _err(Error *p){.
36b0: 20 20 70 72 69 6e 74 5f 65 72 72 28 70 29 3b 0a    print_err(p);.
36c0: 20 20 66 72 65 65 5f 65 72 72 28 70 29 3b 0a 7d    free_err(p);.}
36d0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 79  ..static void sy
36e0: 73 74 65 6d 5f 65 72 72 6f 72 28 45 72 72 6f 72  stem_error(Error
36f0: 20 2a 70 45 72 72 2c 20 69 6e 74 20 69 53 79 73   *pErr, int iSys
3700: 29 7b 0a 20 20 70 45 72 72 2d 3e 72 63 20 3d 20  ){.  pErr->rc = 
3710: 69 53 79 73 3b 0a 20 20 70 45 72 72 2d 3e 7a 45  iSys;.  pErr->zE
3720: 72 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  rr = (char *)sql
3730: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 35 31 32 29  ite3_malloc(512)
3740: 3b 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69  ;.  strerror_r(i
3750: 53 79 73 2c 20 70 45 72 72 2d 3e 7a 45 72 72 2c  Sys, pErr->zErr,
3760: 20 35 31 32 29 3b 0a 20 20 70 45 72 72 2d 3e 7a   512);.  pErr->z
3770: 45 72 72 5b 35 31 31 5d 20 3d 20 27 5c 30 27 3b  Err[511] = '\0';
3780: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
3790: 73 71 6c 69 74 65 5f 65 72 72 6f 72 28 0a 20 20  sqlite_error(.  
37a0: 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 0a 20 20  Error *pErr, .  
37b0: 53 71 6c 69 74 65 20 2a 70 44 62 2c 20 0a 20 20  Sqlite *pDb, .  
37c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
37d0: 63 0a 29 7b 0a 20 20 70 45 72 72 2d 3e 72 63 20  c.){.  pErr->rc 
37e0: 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
37f0: 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 70 45  e(pDb->db);.  pE
3800: 72 72 2d 3e 7a 45 72 72 20 3d 20 73 71 6c 69 74  rr->zErr = sqlit
3810: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
3820: 20 20 22 73 71 6c 69 74 65 33 5f 25 73 28 29 20    "sqlite3_%s() 
3830: 2d 20 25 73 20 28 25 64 29 22 2c 20 7a 46 75 6e  - %s (%d)", zFun
3840: 63 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  c, sqlite3_errms
3850: 67 28 70 44 62 2d 3e 64 62 29 2c 0a 20 20 20 20  g(pDb->db),.    
3860: 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
3870: 65 64 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e  ed_errcode(pDb->
3880: 64 62 29 0a 20 20 29 3b 0a 7d 0a 0a 73 74 61 74  db).  );.}..stat
3890: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 65 72 72  ic void test_err
38a0: 6f 72 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70  or_x(.  Error *p
38b0: 45 72 72 2c 0a 20 20 63 68 61 72 20 2a 7a 45 72  Err,.  char *zEr
38c0: 72 0a 29 7b 0a 20 20 69 66 28 20 70 45 72 72 2d  r.){.  if( pErr-
38d0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
38e0: 7b 0a 20 20 20 20 70 45 72 72 2d 3e 72 63 20 3d  {.    pErr->rc =
38f0: 20 31 3b 0a 20 20 20 20 70 45 72 72 2d 3e 7a 45   1;.    pErr->zE
3900: 72 72 20 3d 20 7a 45 72 72 3b 0a 20 20 7d 65 6c  rr = zErr;.  }el
3910: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
3920: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 7d 0a  free(zErr);.  }.
3930: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  }..static void c
3940: 6c 65 61 72 5f 65 72 72 6f 72 5f 78 28 0a 20 20  lear_error_x(.  
3950: 45 72 72 6f 72 20 2a 70 45 72 72 2c 0a 20 20 69  Error *pErr,.  i
3960: 6e 74 20 72 63 0a 29 7b 0a 20 20 69 66 28 20 70  nt rc.){.  if( p
3970: 45 72 72 2d 3e 72 63 3d 3d 72 63 20 29 7b 0a 20  Err->rc==rc ){. 
3980: 20 20 20 70 45 72 72 2d 3e 72 63 20 3d 20 53 51     pErr->rc = SQ
3990: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 71 6c  LITE_OK;.    sql
39a0: 69 74 65 33 5f 66 72 65 65 28 70 45 72 72 2d 3e  ite3_free(pErr->
39b0: 7a 45 72 72 29 3b 0a 20 20 20 20 70 45 72 72 2d  zErr);.    pErr-
39c0: 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d  >zErr = 0;.  }.}
39d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 62 75 73  ..static int bus
39e0: 79 68 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yhandler(void *p
39f0: 41 72 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 75  Arg, int n){.  u
3a00: 73 6c 65 65 70 28 31 30 2a 31 30 30 30 29 3b 0a  sleep(10*1000);.
3a10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73    return 1;.}..s
3a20: 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 64  tatic void opend
3a30: 62 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70 45  b_x(.  Error *pE
3a40: 72 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rr,             
3a50: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
3a60: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
3a70: 20 20 53 71 6c 69 74 65 20 2a 70 44 62 2c 20 20    Sqlite *pDb,  
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 2f 2a 20 4f 55 54 3a 20 44 61 74 61 62 61    /* OUT: Databa
3aa0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
3ab0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
3ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3ad0: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
3ae0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44  name */.  int bD
3af0: 65 6c 65 74 65 20 20 20 20 20 20 20 20 20 20 20  elete           
3b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3b10: 65 20 74 6f 20 64 65 6c 65 74 65 20 64 62 20 66  e to delete db f
3b20: 69 6c 65 20 62 65 66 6f 72 65 20 6f 70 65 6e 69  ile before openi
3b30: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ng */.){.  if( p
3b40: 45 72 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  Err->rc==SQLITE_
3b50: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
3b60: 3b 0a 20 20 20 20 69 66 28 20 62 44 65 6c 65 74  ;.    if( bDelet
3b70: 65 20 29 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65  e ) unlink(zFile
3b80: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
3b90: 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  te3_open(zFile, 
3ba0: 26 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 69  &pDb->db);.    i
3bb0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73  f( rc ){.      s
3bc0: 71 6c 69 74 65 5f 65 72 72 6f 72 28 70 45 72 72  qlite_error(pErr
3bd0: 2c 20 70 44 62 2c 20 22 6f 70 65 6e 22 29 3b 0a  , pDb, "open");.
3be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
3bf0: 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  ose(pDb->db);.  
3c00: 20 20 20 20 70 44 62 2d 3e 64 62 20 3d 20 30 3b      pDb->db = 0;
3c10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3c20: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
3c30: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
3c40: 20 20 20 20 20 70 44 62 2d 3e 64 62 2c 20 22 6d       pDb->db, "m
3c50: 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49  d5sum", -1, SQLI
3c60: 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 6d  TE_UTF8, 0, 0, m
3c70: 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c  d5step, md5final
3c80: 69 7a 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ize.      );.   
3c90: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
3ca0: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
3cb0: 20 62 75 73 79 68 61 6e 64 6c 65 72 2c 20 30 29   busyhandler, 0)
3cc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3cd0: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 50  exec(pDb->db, "P
3ce0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
3cf0: 73 3d 4f 46 46 22 2c 20 30 2c 20 30 2c 20 30 29  s=OFF", 0, 0, 0)
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
3d10: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
3d20: 64 62 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70  db_x(.  Error *p
3d30: 45 72 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Err,            
3d40: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
3d50: 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
3d60: 0a 20 20 53 71 6c 69 74 65 20 2a 70 44 62 20 20  .  Sqlite *pDb  
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 2f 2a 20 4f 55 54 3a 20 44 61 74 61 62     /* OUT: Datab
3d90: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b  ase handle */.){
3da0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
3db0: 20 69 3b 0a 20 20 53 74 61 74 65 6d 65 6e 74 20   i;.  Statement 
3dc0: 2a 70 49 74 65 72 3b 0a 20 20 53 74 61 74 65 6d  *pIter;.  Statem
3dd0: 65 6e 74 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  ent *pNext;.  fo
3de0: 72 28 70 49 74 65 72 3d 70 44 62 2d 3e 70 43 61  r(pIter=pDb->pCa
3df0: 63 68 65 3b 20 70 49 74 65 72 3b 20 70 49 74 65  che; pIter; pIte
3e00: 72 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  r=pNext){.    pN
3e10: 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  ext = pIter->pNe
3e20: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
3e30: 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e  finalize(pIter->
3e40: 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
3e50: 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
3e60: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
3e70: 69 3c 70 44 62 2d 3e 6e 54 65 78 74 3b 20 69 2b  i<pDb->nText; i+
3e80: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
3e90: 66 72 65 65 28 70 44 62 2d 3e 61 54 65 78 74 5b  free(pDb->aText[
3ea0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
3eb0: 65 33 5f 66 72 65 65 28 70 44 62 2d 3e 61 54 65  e3_free(pDb->aTe
3ec0: 78 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  xt);.  rc = sqli
3ed0: 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64  te3_close(pDb->d
3ee0: 62 29 3b 0a 20 20 69 66 28 20 72 63 20 26 26 20  b);.  if( rc && 
3ef0: 70 45 72 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  pErr->rc==SQLITE
3f00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 45 72 72 2d  _OK ){.    pErr-
3f10: 3e 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  >zErr = sqlite3_
3f20: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
3f30: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
3f40: 2d 3e 64 62 29 29 3b 0a 20 20 7d 0a 20 20 6d 65  ->db));.  }.  me
3f50: 6d 73 65 74 28 70 44 62 2c 20 30 2c 20 73 69 7a  mset(pDb, 0, siz
3f60: 65 6f 66 28 53 71 6c 69 74 65 29 29 3b 0a 7d 0a  eof(Sqlite));.}.
3f70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
3f80: 5f 73 63 72 69 70 74 5f 78 28 0a 20 20 45 72 72  _script_x(.  Err
3f90: 6f 72 20 2a 70 45 72 72 2c 20 20 20 20 20 20 20  or *pErr,       
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fb0: 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
3fc0: 64 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20 2a  de */.  Sqlite *
3fd0: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
3fe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
3ff0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
4000: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 2f 2a 20 53 51 4c 20 73 63 72 69 70 74 20 74 6f  /* SQL script to
4030: 20 65 78 65 63 75 74 65 20 2a 2f 0a 29 7b 0a 20   execute */.){. 
4040: 20 69 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d 53   if( pErr->rc==S
4050: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4060: 70 45 72 72 2d 3e 72 63 20 3d 20 73 71 6c 69 74  pErr->rc = sqlit
4070: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
4080: 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70 45   zSql, 0, 0, &pE
4090: 72 72 2d 3e 7a 45 72 72 29 3b 0a 20 20 7d 0a 7d  rr->zErr);.  }.}
40a0: 0a 0a 73 74 61 74 69 63 20 53 74 61 74 65 6d 65  ..static Stateme
40b0: 6e 74 20 2a 67 65 74 53 71 6c 53 74 61 74 65 6d  nt *getSqlStatem
40c0: 65 6e 74 28 0a 20 20 45 72 72 6f 72 20 2a 70 45  ent(.  Error *pE
40d0: 72 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rr,             
40e0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
40f0: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
4100: 20 20 53 71 6c 69 74 65 20 2a 70 44 62 2c 20 20    Sqlite *pDb,  
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4120: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
4130: 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
4140: 63 68 61 72 20 2a 7a 53 71 6c 20 20 20 20 20 20  char *zSql      
4150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
4160: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
4170: 0a 20 20 53 74 61 74 65 6d 65 6e 74 20 2a 70 52  .  Statement *pR
4180: 65 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  et;.  int rc;.. 
4190: 20 66 6f 72 28 70 52 65 74 3d 70 44 62 2d 3e 70   for(pRet=pDb->p
41a0: 43 61 63 68 65 3b 20 70 52 65 74 3b 20 70 52 65  Cache; pRet; pRe
41b0: 74 3d 70 52 65 74 2d 3e 70 4e 65 78 74 29 7b 0a  t=pRet->pNext){.
41c0: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
41d0: 70 28 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 52  p(sqlite3_sql(pR
41e0: 65 74 2d 3e 70 53 74 6d 74 29 2c 20 7a 53 71 6c  et->pStmt), zSql
41f0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
4200: 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20  n pRet;.    }.  
4210: 7d 0a 0a 20 20 70 52 65 74 20 3d 20 73 71 6c 69  }..  pRet = sqli
4220: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
4230: 66 28 53 74 61 74 65 6d 65 6e 74 29 29 3b 0a 20  f(Statement));. 
4240: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
4250: 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62  epare_v2(pDb->db
4260: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 52 65  , zSql, -1, &pRe
4270: 74 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  t->pStmt, 0);.  
4280: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4290: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f  K ){.    sqlite_
42a0: 65 72 72 6f 72 28 70 45 72 72 2c 20 70 44 62 2c  error(pErr, pDb,
42b0: 20 22 70 72 65 70 61 72 65 5f 76 32 22 29 3b 0a   "prepare_v2");.
42c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
42d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  }.  assert( 0==s
42e0: 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 73 71  trcmp(sqlite3_sq
42f0: 6c 28 70 52 65 74 2d 3e 70 53 74 6d 74 29 2c 20  l(pRet->pStmt), 
4300: 7a 53 71 6c 29 20 29 3b 0a 0a 20 20 70 52 65 74  zSql) );..  pRet
4310: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
4320: 43 61 63 68 65 3b 0a 20 20 70 44 62 2d 3e 70 43  Cache;.  pDb->pC
4330: 61 63 68 65 20 3d 20 70 52 65 74 3b 0a 20 20 72  ache = pRet;.  r
4340: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73  eturn pRet;.}..s
4350: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74  tatic sqlite3_st
4360: 6d 74 20 2a 67 65 74 41 6e 64 42 69 6e 64 53 71  mt *getAndBindSq
4370: 6c 53 74 61 74 65 6d 65 6e 74 28 0a 20 20 45 72  lStatement(.  Er
4380: 72 6f 72 20 2a 70 45 72 72 2c 20 20 20 20 20 20  ror *pErr,      
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43a0: 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
43b0: 6f 64 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20  ode */.  Sqlite 
43c0: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
43d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
43e0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
43f0: 20 76 61 5f 6c 69 73 74 20 61 70 20 20 20 20 20   va_list ap     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 2f 2a 20 53 51 4c 20 66 6f 6c 6c 6f 77 65 64   /* SQL followed
4420: 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a   by parameters *
4430: 2f 0a 29 7b 0a 20 20 53 74 61 74 65 6d 65 6e 74  /.){.  Statement
4440: 20 2a 70 53 74 61 74 65 6d 65 6e 74 3b 20 20 20   *pStatement;   
4450: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 51         /* The SQ
4460: 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 20 77  Lite statement w
4470: 72 61 70 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69  rapper */.  sqli
4480: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
44a0: 68 65 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  he SQLite statem
44b0: 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ent to return */
44c0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
44f0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 61  erate through pa
4500: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 0a 20 20 70  rameters */..  p
4510: 53 74 61 74 65 6d 65 6e 74 20 3d 20 67 65 74 53  Statement = getS
4520: 71 6c 53 74 61 74 65 6d 65 6e 74 28 70 45 72 72  qlStatement(pErr
4530: 2c 20 70 44 62 2c 20 76 61 5f 61 72 67 28 61 70  , pDb, va_arg(ap
4540: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 29  , const char *))
4550: 3b 0a 20 20 69 66 28 20 21 70 53 74 61 74 65 6d  ;.  if( !pStatem
4560: 65 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ent ) return 0;.
4570: 20 20 70 53 74 6d 74 20 3d 20 70 53 74 61 74 65    pStmt = pState
4580: 6d 65 6e 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 66  ment->pStmt;.  f
4590: 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 71 6c 69 74  or(i=1; i<=sqlit
45a0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
45b0: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 20  r_count(pStmt); 
45c0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
45d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
45e0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
45f0: 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
4600: 20 69 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20   i);.    void * 
4610: 70 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  pArg = va_arg(ap
4620: 2c 20 76 6f 69 64 2a 29 3b 0a 0a 20 20 20 20 73  , void*);..    s
4630: 77 69 74 63 68 28 20 7a 4e 61 6d 65 5b 31 5d 20  witch( zName[1] 
4640: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 69  ){.      case 'i
4650: 27 3a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ':.        sqlit
4660: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
4670: 74 6d 74 2c 20 69 2c 20 2a 28 69 36 34 20 2a 29  tmt, i, *(i64 *)
4680: 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 62  pArg);.        b
4690: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66  reak;..      def
46a0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 70 45  ault:.        pE
46b0: 72 72 2d 3e 72 63 20 3d 20 31 3b 0a 20 20 20 20  rr->rc = 1;.    
46c0: 20 20 20 20 70 45 72 72 2d 3e 7a 45 72 72 20 3d      pErr->zErr =
46d0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
46e0: 28 22 43 61 6e 6e 6f 74 20 64 69 73 63 65 72 6e  ("Cannot discern
46f0: 20 74 79 70 65 3a 20 5c 22 25 73 5c 22 22 2c 20   type: \"%s\"", 
4700: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
4710: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
4720: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4730: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 53    }..  return pS
4740: 74 6d 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  tmt;.}..static i
4750: 36 34 20 65 78 65 63 73 71 6c 5f 69 36 34 5f 78  64 execsql_i64_x
4760: 28 0a 20 20 45 72 72 6f 72 20 2a 70 45 72 72 2c  (.  Error *pErr,
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
4790: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 53  rror code */.  S
47a0: 71 6c 69 74 65 20 2a 70 44 62 2c 20 20 20 20 20  qlite *pDb,     
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47c0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
47d0: 65 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20  e */.  ...      
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 61 6e         /* SQL an
4800: 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 70 61  d pointers to pa
4810: 72 61 6d 65 74 65 72 20 76 61 6c 75 65 73 20 2a  rameter values *
4820: 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 65 74 20  /.){.  i64 iRet 
4830: 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 72 72 2d  = 0;.  if( pErr-
4840: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
4850: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
4860: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
4870: 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
4880: 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20  ment to execute 
4890: 2a 2f 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61  */.    va_list a
48a0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
48b0: 20 20 20 20 20 2f 2a 20 2e 2e 2e 20 61 72 67 75       /* ... argu
48c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
48d0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
48e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
48f0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
4900: 72 6f 75 67 68 20 70 61 72 61 6d 65 74 65 72 73  rough parameters
4910: 20 2a 2f 0a 20 20 20 20 76 61 5f 73 74 61 72 74   */.    va_start
4920: 28 61 70 2c 20 70 44 62 29 3b 0a 20 20 20 20 70  (ap, pDb);.    p
4930: 53 74 6d 74 20 3d 20 67 65 74 41 6e 64 42 69 6e  Stmt = getAndBin
4940: 64 53 71 6c 53 74 61 74 65 6d 65 6e 74 28 70 45  dSqlStatement(pE
4950: 72 72 2c 20 70 44 62 2c 20 61 70 29 3b 0a 20 20  rr, pDb, ap);.  
4960: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
4970: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
4980: 20 20 20 69 6e 74 20 66 69 72 73 74 20 3d 20 31     int first = 1
4990: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53  ;.      while( S
49a0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
49b0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
49c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  {.        if( fi
49d0: 72 73 74 20 26 26 20 73 71 6c 69 74 65 33 5f 63  rst && sqlite3_c
49e0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
49f0: 74 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t)>0 ){.        
4a00: 20 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33    iRet = sqlite3
4a10: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
4a20: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  tmt, 0);.       
4a30: 20 7d 0a 20 20 20 20 20 20 20 20 66 69 72 73 74   }.        first
4a40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4a50: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
4a60: 4b 21 3d 73 71 6c 69 74 65 33 5f 72 65 73 65 74  K!=sqlite3_reset
4a70: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
4a80: 20 20 20 73 71 6c 69 74 65 5f 65 72 72 6f 72 28     sqlite_error(
4a90: 70 45 72 72 2c 20 70 44 62 2c 20 22 72 65 73 65  pErr, pDb, "rese
4aa0: 74 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t");.      }.   
4ab0: 20 7d 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70   }.    va_end(ap
4ac0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4ad0: 69 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  iRet;.}..static 
4ae0: 63 68 61 72 20 2a 20 65 78 65 63 73 71 6c 5f 74  char * execsql_t
4af0: 65 78 74 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a  ext_x(.  Error *
4b00: 70 45 72 72 2c 20 20 20 20 20 20 20 20 20 20 20  pErr,           
4b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
4b20: 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
4b30: 2f 0a 20 20 53 71 6c 69 74 65 20 2a 70 44 62 2c  /.  Sqlite *pDb,
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4b60: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
4b70: 69 53 6c 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iSlot,          
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4b90: 62 20 68 61 6e 64 6c 65 20 73 6c 6f 74 20 74 6f  b handle slot to
4ba0: 20 73 74 6f 72 65 20 74 65 78 74 20 69 6e 20 2a   store text in *
4bb0: 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  /.  ...         
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 20 2f 2a 20 53 51 4c 20 61 6e 64 20 70      /* SQL and p
4be0: 6f 69 6e 74 65 72 73 20 74 6f 20 70 61 72 61 6d  ointers to param
4bf0: 65 74 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 29  eter values */.)
4c00: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  {.  char *zRet =
4c10: 20 30 3b 0a 0a 20 20 69 66 28 20 69 53 6c 6f 74   0;..  if( iSlot
4c20: 3e 3d 70 44 62 2d 3e 6e 54 65 78 74 20 29 7b 0a  >=pDb->nText ){.
4c30: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
4c40: 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 28  sizeof(char *)*(
4c50: 69 53 6c 6f 74 2b 31 29 3b 0a 20 20 20 20 70 44  iSlot+1);.    pD
4c60: 62 2d 3e 61 54 65 78 74 20 3d 20 28 63 68 61 72  b->aText = (char
4c70: 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
4c80: 6c 6f 63 28 70 44 62 2d 3e 61 54 65 78 74 2c 20  loc(pDb->aText, 
4c90: 6e 42 79 74 65 29 3b 0a 20 20 20 20 6d 65 6d 73  nByte);.    mems
4ca0: 65 74 28 26 70 44 62 2d 3e 61 54 65 78 74 5b 70  et(&pDb->aText[p
4cb0: 44 62 2d 3e 6e 54 65 78 74 5d 2c 20 30 2c 20 73  Db->nText], 0, s
4cc0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 28 69 53  izeof(char*)*(iS
4cd0: 6c 6f 74 2b 31 2d 70 44 62 2d 3e 6e 54 65 78 74  lot+1-pDb->nText
4ce0: 29 29 3b 0a 20 20 20 20 70 44 62 2d 3e 6e 54 65  ));.    pDb->nTe
4cf0: 78 74 20 3d 20 69 53 6c 6f 74 2b 31 3b 0a 20 20  xt = iSlot+1;.  
4d00: 7d 0a 0a 20 20 69 66 28 20 70 45 72 72 2d 3e 72  }..  if( pErr->r
4d10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4d20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
4d30: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
4d40: 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    /* SQL stateme
4d50: 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f  nt to execute */
4d60: 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  .    va_list ap;
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 2f 2a 20 2e 2e 2e 20 61 72 67 75 6d 65     /* ... argume
4d90: 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nts */.    int i
4da0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
4dc0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
4dd0: 75 67 68 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ugh parameters *
4de0: 2f 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  /.    va_start(a
4df0: 70 2c 20 69 53 6c 6f 74 29 3b 0a 20 20 20 20 70  p, iSlot);.    p
4e00: 53 74 6d 74 20 3d 20 67 65 74 41 6e 64 42 69 6e  Stmt = getAndBin
4e10: 64 53 71 6c 53 74 61 74 65 6d 65 6e 74 28 70 45  dSqlStatement(pE
4e20: 72 72 2c 20 70 44 62 2c 20 61 70 29 3b 0a 20 20  rr, pDb, ap);.  
4e30: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
4e40: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
4e50: 20 20 20 69 6e 74 20 66 69 72 73 74 20 3d 20 31     int first = 1
4e60: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53  ;.      while( S
4e70: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
4e80: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
4e90: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  {.        if( fi
4ea0: 72 73 74 20 26 26 20 73 71 6c 69 74 65 33 5f 63  rst && sqlite3_c
4eb0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
4ec0: 74 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t)>0 ){.        
4ed0: 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33    zRet = sqlite3
4ee0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
4ef0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4f00: 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  xt(pStmt, 0));. 
4f10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4f20: 5f 66 72 65 65 28 70 44 62 2d 3e 61 54 65 78 74  _free(pDb->aText
4f30: 5b 69 53 6c 6f 74 5d 29 3b 0a 20 20 20 20 20 20  [iSlot]);.      
4f40: 20 20 20 20 70 44 62 2d 3e 61 54 65 78 74 5b 69      pDb->aText[i
4f50: 53 6c 6f 74 5d 20 3d 20 7a 52 65 74 3b 0a 20 20  Slot] = zRet;.  
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4f70: 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
4f80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c   }.      if( SQL
4f90: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
4fa0: 72 65 73 65 74 28 70 53 74 6d 74 29 20 29 7b 0a  reset(pStmt) ){.
4fb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 65          sqlite_e
4fc0: 72 72 6f 72 28 70 45 72 72 2c 20 70 44 62 2c 20  rror(pErr, pDb, 
4fd0: 22 72 65 73 65 74 22 29 3b 0a 20 20 20 20 20 20  "reset");.      
4fe0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 76 61 5f 65  }.    }.    va_e
4ff0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72  nd(ap);.  }..  r
5000: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73  eturn zRet;.}..s
5010: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 67  tatic void integ
5020: 72 69 74 79 5f 63 68 65 63 6b 5f 78 28 0a 20 20  rity_check_x(.  
5030: 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 20 20 20  Error *pErr,    
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
5060: 20 63 6f 64 65 20 2a 2f 0a 20 20 53 71 6c 69 74   code */.  Sqlit
5070: 65 20 2a 70 44 62 20 20 20 20 20 20 20 20 20 20  e *pDb          
5080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5090: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
50a0: 0a 29 7b 0a 20 20 69 66 28 20 70 45 72 72 2d 3e  .){.  if( pErr->
50b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
50c0: 0a 20 20 20 20 53 74 61 74 65 6d 65 6e 74 20 2a  .    Statement *
50d0: 70 53 74 61 74 65 6d 65 6e 74 3b 20 20 20 20 20  pStatement;     
50e0: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
50f0: 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20  to execute */.  
5100: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
5130: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  /.    char *zErr
5140: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5150: 20 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79      /* Integrity
5160: 20 63 68 65 63 6b 20 65 72 72 6f 72 20 2a 2f 0a   check error */.
5170: 0a 20 20 20 20 70 53 74 61 74 65 6d 65 6e 74 20  .    pStatement 
5180: 3d 20 67 65 74 53 71 6c 53 74 61 74 65 6d 65 6e  = getSqlStatemen
5190: 74 28 70 45 72 72 2c 20 70 44 62 2c 20 22 50 52  t(pErr, pDb, "PR
51a0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
51b0: 68 65 63 6b 22 29 3b 0a 20 20 20 20 69 66 28 20  heck");.    if( 
51c0: 70 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  pStatement ){.  
51d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
51e0: 20 2a 70 53 74 6d 74 20 3d 20 70 53 74 61 74 65   *pStmt = pState
51f0: 6d 65 6e 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  ment->pStmt;.   
5200: 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
5210: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
5220: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
5230: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5240: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  *z = sqlite3_col
5250: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
5260: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
5270: 73 74 72 63 6d 70 28 7a 2c 20 22 6f 6b 22 29 20  strcmp(z, "ok") 
5280: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
5290: 20 7a 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20   zErr==0 ){.    
52a0: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73          zErr = s
52b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
52c0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
52d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
52e0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c        zErr = sql
52f0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
5300: 5c 6e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 29 3b  \n%s", zErr, z);
5310: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5340: 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20  et(pStmt);..    
5350: 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
5360: 20 20 20 20 20 20 70 45 72 72 2d 3e 7a 45 72 72        pErr->zErr
5370: 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20 20 20 20   = zErr;.       
5380: 20 70 45 72 72 2d 3e 72 63 20 3d 20 31 3b 0a 20   pErr->rc = 1;. 
5390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
53a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
53b0: 2a 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 5f 6d  *launch_thread_m
53c0: 61 69 6e 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ain(void *pArg){
53d0: 0a 20 20 54 68 72 65 61 64 20 2a 70 20 3d 20 28  .  Thread *p = (
53e0: 54 68 72 65 61 64 20 2a 29 70 41 72 67 3b 0a 20  Thread *)pArg;. 
53f0: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
5400: 70 2d 3e 78 50 72 6f 63 28 70 2d 3e 69 54 69 64  p->xProc(p->iTid
5410: 2c 20 70 2d 3e 69 41 72 67 29 3b 0a 7d 0a 0a 73  , p->iArg);.}..s
5420: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 75 6e 63  tatic void launc
5430: 68 5f 74 68 72 65 61 64 5f 78 28 0a 20 20 45 72  h_thread_x(.  Er
5440: 72 6f 72 20 2a 70 45 72 72 2c 20 20 20 20 20 20  ror *pErr,      
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5460: 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
5470: 6f 64 65 20 2a 2f 0a 20 20 54 68 72 65 61 64 73  ode */.  Threads
5480: 65 74 20 2a 70 54 68 72 65 61 64 73 2c 20 20 20  et *pThreads,   
5490: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72 65           /* Thre
54a0: 61 64 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72  ad set */.  char
54b0: 20 2a 28 2a 78 50 72 6f 63 29 28 69 6e 74 2c 20   *(*xProc)(int, 
54c0: 69 6e 74 29 2c 20 20 20 20 20 20 20 2f 2a 20 50  int),       /* P
54d0: 72 6f 63 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20  roc to run */.  
54e0: 69 6e 74 20 69 41 72 67 20 20 20 20 20 20 20 20  int iArg        
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 61 73 73  /* Argument pass
5510: 65 64 20 74 6f 20 74 68 72 65 61 64 20 70 72 6f  ed to thread pro
5520: 63 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  c */.){.  if( pE
5530: 72 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rr->rc==SQLITE_O
5540: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 69  K ){.    int iTi
5550: 64 20 3d 20 2b 2b 70 54 68 72 65 61 64 73 2d 3e  d = ++pThreads->
5560: 69 4d 61 78 54 69 64 3b 0a 20 20 20 20 54 68 72  iMaxTid;.    Thr
5570: 65 61 64 20 2a 70 3b 0a 20 20 20 20 69 6e 74 20  ead *p;.    int 
5580: 72 63 3b 0a 0a 20 20 20 20 70 20 3d 20 28 54 68  rc;..    p = (Th
5590: 72 65 61 64 20 2a 29 73 71 6c 69 74 65 33 5f 6d  read *)sqlite3_m
55a0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 68 72  alloc(sizeof(Thr
55b0: 65 61 64 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ead));.    memse
55c0: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 54  t(p, 0, sizeof(T
55d0: 68 72 65 61 64 29 29 3b 0a 20 20 20 20 70 2d 3e  hread));.    p->
55e0: 69 54 69 64 20 3d 20 69 54 69 64 3b 0a 20 20 20  iTid = iTid;.   
55f0: 20 70 2d 3e 69 41 72 67 20 3d 20 69 41 72 67 3b   p->iArg = iArg;
5600: 0a 20 20 20 20 70 2d 3e 78 50 72 6f 63 20 3d 20  .    p->xProc = 
5610: 78 50 72 6f 63 3b 0a 0a 20 20 20 20 72 63 20 3d  xProc;..    rc =
5620: 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28   pthread_create(
5630: 26 70 2d 3e 74 69 64 2c 20 4e 55 4c 4c 2c 20 6c  &p->tid, NULL, l
5640: 61 75 6e 63 68 5f 74 68 72 65 61 64 5f 6d 61 69  aunch_thread_mai
5650: 6e 2c 20 28 76 6f 69 64 20 2a 29 70 29 3b 0a 20  n, (void *)p);. 
5660: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
5670: 20 20 20 20 20 20 73 79 73 74 65 6d 5f 65 72 72        system_err
5680: 6f 72 28 70 45 72 72 2c 20 72 63 29 3b 0a 20 20  or(pErr, rc);.  
5690: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
56a0: 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
56b0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
56c0: 20 70 54 68 72 65 61 64 73 2d 3e 70 54 68 72 65   pThreads->pThre
56d0: 61 64 3b 0a 20 20 20 20 20 20 70 54 68 72 65 61  ad;.      pThrea
56e0: 64 73 2d 3e 70 54 68 72 65 61 64 20 3d 20 70 3b  ds->pThread = p;
56f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
5700: 61 74 69 63 20 76 6f 69 64 20 6a 6f 69 6e 5f 61  atic void join_a
5710: 6c 6c 5f 74 68 72 65 61 64 73 5f 78 28 0a 20 20  ll_threads_x(.  
5720: 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 20 20 20  Error *pErr,    
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
5750: 20 63 6f 64 65 20 2a 2f 0a 20 20 54 68 72 65 61   code */.  Threa
5760: 64 73 65 74 20 2a 70 54 68 72 65 61 64 73 20 20  dset *pThreads  
5770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5780: 72 65 61 64 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  read set */.){. 
5790: 20 54 68 72 65 61 64 20 2a 70 3b 0a 20 20 54 68   Thread *p;.  Th
57a0: 72 65 61 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66  read *pNext;.  f
57b0: 6f 72 28 70 3d 70 54 68 72 65 61 64 73 2d 3e 70  or(p=pThreads->p
57c0: 54 68 72 65 61 64 3b 20 70 3b 20 70 3d 70 4e 65  Thread; p; p=pNe
57d0: 78 74 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 72  xt){.    void *r
57e0: 65 74 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  et;.    pNext = 
57f0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e  p->pNext;.    in
5800: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 70  t rc;.    rc = p
5810: 74 68 72 65 61 64 5f 6a 6f 69 6e 28 70 2d 3e 74  thread_join(p->t
5820: 69 64 2c 20 26 72 65 74 29 3b 0a 20 20 20 20 69  id, &ret);.    i
5830: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
5840: 20 20 69 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d    if( pErr->rc==
5850: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73 79 73 74  SQLITE_OK ) syst
5860: 65 6d 5f 65 72 72 6f 72 28 70 45 72 72 2c 20 72  em_error(pErr, r
5870: 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c);.    }else{. 
5880: 20 20 20 20 20 70 72 69 6e 74 66 28 22 54 68 72       printf("Thr
5890: 65 61 64 20 25 64 20 73 61 79 73 3a 20 25 73 5c  ead %d says: %s\
58a0: 6e 22 2c 20 70 2d 3e 69 54 69 64 2c 20 28 72 65  n", p->iTid, (re
58b0: 74 3d 3d 30 20 3f 20 22 2e 2e 2e 22 20 3a 20 28  t==0 ? "..." : (
58c0: 63 68 61 72 20 2a 29 72 65 74 29 29 3b 0a 20 20  char *)ret));.  
58d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
58e0: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70  free(p);.  }.  p
58f0: 54 68 72 65 61 64 73 2d 3e 70 54 68 72 65 61 64  Threads->pThread
5900: 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 0;.}..static 
5910: 69 36 34 20 66 69 6c 65 73 69 7a 65 5f 78 28 0a  i64 filesize_x(.
5920: 20 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 0a 20    Error *pErr,. 
5930: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
5940: 6c 65 0a 29 7b 0a 20 20 69 36 34 20 69 52 65 74  le.){.  i64 iRet
5950: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 72 72   = 0;.  if( pErr
5960: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
5970: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
5980: 61 74 20 73 53 74 61 74 3b 0a 20 20 20 20 69 66  at sStat;.    if
5990: 28 20 73 74 61 74 28 7a 46 69 6c 65 2c 20 26 73  ( stat(zFile, &s
59a0: 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Stat) ){.      i
59b0: 52 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  Ret = -1;.    }e
59c0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 74 20  lse{.      iRet 
59d0: 3d 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3b  = sStat.st_size;
59e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
59f0: 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn iRet;.}..sta
5a00: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 63 6f 70  tic void filecop
5a10: 79 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70 45  y_x(.  Error *pE
5a20: 72 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rr,.  const char
5a30: 20 2a 7a 46 72 6f 6d 2c 0a 20 20 63 6f 6e 73 74   *zFrom,.  const
5a40: 20 63 68 61 72 20 2a 7a 54 6f 0a 29 7b 0a 20 20   char *zTo.){.  
5a50: 69 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d 53 51  if( pErr->rc==SQ
5a60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
5a70: 36 34 20 6e 42 79 74 65 20 3d 20 66 69 6c 65 73  64 nByte = files
5a80: 69 7a 65 5f 78 28 70 45 72 72 2c 20 7a 46 72 6f  ize_x(pErr, zFro
5a90: 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  m);.    if( nByt
5aa0: 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  e<0 ){.      tes
5ab0: 74 5f 65 72 72 6f 72 5f 78 28 70 45 72 72 2c 20  t_error_x(pErr, 
5ac0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5ad0: 22 6e 6f 20 73 75 63 68 20 66 69 6c 65 3a 20 25  "no such file: %
5ae0: 73 22 2c 20 7a 46 72 6f 6d 29 29 3b 0a 20 20 20  s", zFrom));.   
5af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
5b00: 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 63 68  4 iOff;.      ch
5b10: 61 72 20 61 42 75 66 5b 31 30 32 34 5d 3b 0a 20  ar aBuf[1024];. 
5b20: 20 20 20 20 20 69 6e 74 20 66 64 31 3b 0a 20 20       int fd1;.  
5b30: 20 20 20 20 69 6e 74 20 66 64 32 3b 0a 20 20 20      int fd2;.   
5b40: 20 20 20 75 6e 6c 69 6e 6b 28 7a 54 6f 29 3b 0a     unlink(zTo);.
5b50: 0a 20 20 20 20 20 20 66 64 31 20 3d 20 6f 70 65  .      fd1 = ope
5b60: 6e 28 7a 46 72 6f 6d 2c 20 4f 5f 52 44 4f 4e 4c  n(zFrom, O_RDONL
5b70: 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 64  Y);.      if( fd
5b80: 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  1<0 ){.        s
5b90: 79 73 74 65 6d 5f 65 72 72 6f 72 28 70 45 72 72  ystem_error(pErr
5ba0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
5bb0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
5bc0: 7d 0a 20 20 20 20 20 20 66 64 32 20 3d 20 6f 70  }.      fd2 = op
5bd0: 65 6e 28 7a 54 6f 2c 20 4f 5f 52 44 57 52 7c 4f  en(zTo, O_RDWR|O
5be0: 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 20 30  _CREAT|O_EXCL, 0
5bf0: 36 34 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  644);.      if( 
5c00: 66 64 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  fd2<0 ){.       
5c10: 20 73 79 73 74 65 6d 5f 65 72 72 6f 72 28 70 45   system_error(pE
5c20: 72 72 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  rr, errno);.    
5c30: 20 20 20 20 63 6c 6f 73 65 28 66 64 31 29 3b 0a      close(fd1);.
5c40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
5c50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
5c60: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  Off = 0;.      w
5c70: 68 69 6c 65 28 20 69 4f 66 66 3c 6e 42 79 74 65  hile( iOff<nByte
5c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
5c90: 6e 43 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 61  nCopy = sizeof(a
5ca0: 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Buf);.        if
5cb0: 28 20 6e 43 6f 70 79 2b 69 4f 66 66 3e 6e 42 79  ( nCopy+iOff>nBy
5cc0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
5cd0: 6e 43 6f 70 79 20 3d 20 6e 42 79 74 65 20 2d 20  nCopy = nByte - 
5ce0: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iOff;.        }.
5cf0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 6f 70          if( nCop
5d00: 79 21 3d 72 65 61 64 28 66 64 31 2c 20 61 42 75  y!=read(fd1, aBu
5d10: 66 2c 20 6e 43 6f 70 79 29 20 29 7b 0a 20 20 20  f, nCopy) ){.   
5d20: 20 20 20 20 20 20 20 73 79 73 74 65 6d 5f 65 72         system_er
5d30: 72 6f 72 28 70 45 72 72 2c 20 65 72 72 6e 6f 29  ror(pErr, errno)
5d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5d50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
5d60: 20 20 20 20 20 69 66 28 20 6e 43 6f 70 79 21 3d       if( nCopy!=
5d70: 77 72 69 74 65 28 66 64 32 2c 20 61 42 75 66 2c  write(fd2, aBuf,
5d80: 20 6e 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20   nCopy) ){.     
5d90: 20 20 20 20 20 73 79 73 74 65 6d 5f 65 72 72 6f       system_erro
5da0: 72 28 70 45 72 72 2c 20 65 72 72 6e 6f 29 3b 0a  r(pErr, errno);.
5db0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5dc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5dd0: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79     iOff += nCopy
5de0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
5df0: 20 63 6c 6f 73 65 28 66 64 31 29 3b 0a 20 20 20   close(fd1);.   
5e00: 20 20 20 63 6c 6f 73 65 28 66 64 32 29 3b 0a 20     close(fd2);. 
5e10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a     }.  }.}../* .
5e20: 2a 2a 20 55 73 65 64 20 62 79 20 73 65 74 73 74  ** Used by setst
5e30: 6f 70 74 69 6d 65 28 29 20 61 6e 64 20 74 69 6d  optime() and tim
5e40: 65 74 6f 73 74 6f 70 28 29 2e 0a 2a 2f 0a 73 74  etostop()..*/.st
5e50: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
5e60: 6c 69 6d 69 74 20 3d 20 30 2e 30 3b 0a 73 74 61  limit = 0.0;.sta
5e70: 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
5e80: 2a 70 54 69 6d 65 6c 69 6d 69 74 56 66 73 20 3d  *pTimelimitVfs =
5e90: 20 30 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   0;..static void
5ea0: 20 73 65 74 73 74 6f 70 74 69 6d 65 5f 78 28 0a   setstoptime_x(.
5eb0: 20 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 20    Error *pErr,  
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
5ee0: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
5ef0: 20 6e 4d 73 20 20 20 20 20 20 20 20 20 20 20 20   nMs            
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f10: 4d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 75 6e 74  Milliseconds unt
5f20: 69 6c 20 22 73 74 6f 70 20 74 69 6d 65 22 20 2a  il "stop time" *
5f30: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 72 72 2d  /.){.  if( pErr-
5f40: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
5f50: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 74 3b 0a  {.    double t;.
5f60: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
5f70: 70 54 69 6d 65 6c 69 6d 69 74 56 66 73 20 3d 20  pTimelimitVfs = 
5f80: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
5f90: 28 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 54  (0);.    rc = pT
5fa0: 69 6d 65 6c 69 6d 69 74 56 66 73 2d 3e 78 43 75  imelimitVfs->xCu
5fb0: 72 72 65 6e 74 54 69 6d 65 28 70 54 69 6d 65 6c  rrentTime(pTimel
5fc0: 69 6d 69 74 56 66 73 2c 20 26 74 29 3b 0a 20 20  imitVfs, &t);.  
5fd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5fe0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 45 72  _OK ){.      pEr
5ff0: 72 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  r->rc = rc;.    
6000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 69 6d  }else{.      tim
6010: 65 6c 69 6d 69 74 20 3d 20 74 20 2b 20 28 28 64  elimit = t + ((d
6020: 6f 75 62 6c 65 29 6e 4d 73 29 2f 28 31 30 30 30  ouble)nMs)/(1000
6030: 2e 30 2a 36 30 2e 30 2a 36 30 2e 30 2a 32 34 2e  .0*60.0*60.0*24.
6040: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  0);.    }.  }.}.
6050: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 69 6d 65  .static int time
6060: 74 6f 73 74 6f 70 5f 78 28 0a 20 20 45 72 72 6f  tostop_x(.  Erro
6070: 72 20 2a 70 45 72 72 20 20 20 20 20 20 20 20 20  r *pErr         
6080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6090: 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
60a0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  e */.){.  int re
60b0: 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 45 72  t = 1;.  if( pEr
60c0: 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  r->rc==SQLITE_OK
60d0: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 74   ){.    double t
60e0: 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
60f0: 20 20 72 63 20 3d 20 70 54 69 6d 65 6c 69 6d 69    rc = pTimelimi
6100: 74 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  tVfs->xCurrentTi
6110: 6d 65 28 70 54 69 6d 65 6c 69 6d 69 74 56 66 73  me(pTimelimitVfs
6120: 2c 20 26 74 29 3b 0a 20 20 20 20 69 66 28 20 72  , &t);.    if( r
6130: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6140: 20 20 20 20 20 20 70 45 72 72 2d 3e 72 63 20 3d        pErr->rc =
6150: 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   rc;.    }else{.
6160: 20 20 20 20 20 20 72 65 74 20 3d 20 28 74 20 3e        ret = (t >
6170: 3d 20 74 69 6d 65 6c 69 6d 69 74 29 3b 0a 20 20  = timelimit);.  
6180: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6190: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   ret;.}../* .** 
61a0: 54 68 65 20 22 53 65 74 20 45 72 72 6f 72 20 4c  The "Set Error L
61b0: 69 6e 65 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  ine" macro..*/.#
61c0: 64 65 66 69 6e 65 20 53 45 4c 28 65 29 20 28 28  define SEL(e) ((
61d0: 65 29 2d 3e 69 4c 69 6e 65 20 3d 20 28 28 65 29  e)->iLine = ((e)
61e0: 2d 3e 72 63 20 3f 20 28 65 29 2d 3e 69 4c 69 6e  ->rc ? (e)->iLin
61f0: 65 20 3a 20 5f 5f 4c 49 4e 45 5f 5f 29 29 0a 0a  e : __LINE__))..
6200: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
6250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6290: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
62a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62e0: 2a 0a 2a 2a 20 45 6e 64 20 69 6e 66 72 61 73 74  *.** End infrast
62f0: 72 75 63 74 75 72 65 2e 20 42 65 67 69 6e 20 74  ructure. Begin t
6300: 65 73 74 73 2e 0a 2a 2f 0a 0a 23 64 65 66 69 6e  ests..*/..#defin
6310: 65 20 57 41 4c 54 48 52 45 41 44 31 5f 4e 54 48  e WALTHREAD1_NTH
6320: 52 45 41 44 20 20 31 30 0a 23 64 65 66 69 6e 65  READ  10.#define
6330: 20 57 41 4c 54 48 52 45 41 44 33 5f 4e 54 48 52   WALTHREAD3_NTHR
6340: 45 41 44 20 20 36 0a 0a 73 74 61 74 69 63 20 63  EAD  6..static c
6350: 68 61 72 20 2a 77 61 6c 74 68 72 65 61 64 31 5f  har *walthread1_
6360: 74 68 72 65 61 64 28 69 6e 74 20 69 54 69 64 2c  thread(int iTid,
6370: 20 69 6e 74 20 69 41 72 67 29 7b 0a 20 20 45 72   int iArg){.  Er
6380: 72 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 20 20  ror err = {0};  
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63a0: 20 45 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   Error code and 
63b0: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 53 71 6c  message */.  Sql
63c0: 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 20 20 20  ite db = {0};   
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63e0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
63f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
6400: 69 6e 74 20 6e 49 74 65 72 20 3d 20 30 3b 20 20  int nIter = 0;  
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 2f 2a 20 49 74 65 72 61 74 69 6f 6e 73 20 73 6f  /* Iterations so
6430: 20 66 61 72 20 2a 2f 0a 0a 20 20 6f 70 65 6e 64   far */..  opend
6440: 62 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74 65  b(&err, &db, "te
6450: 73 74 2e 64 62 22 2c 20 30 29 3b 0a 20 20 77 68  st.db", 0);.  wh
6460: 69 6c 65 28 20 21 74 69 6d 65 74 6f 73 74 6f 70  ile( !timetostop
6470: 28 26 65 72 72 29 20 29 7b 0a 20 20 20 20 63 6f  (&err) ){.    co
6480: 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 71 6c 5b  nst char *azSql[
6490: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 53 45 4c  ] = {.      "SEL
64a0: 45 43 54 20 6d 64 35 73 75 6d 28 78 29 20 46 52  ECT md5sum(x) FR
64b0: 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69  OM t1 WHERE rowi
64c0: 64 20 21 3d 20 28 53 45 4c 45 43 54 20 6d 61 78  d != (SELECT max
64d0: 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 74 31 29  (rowid) FROM t1)
64e0: 22 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  ",.      "SELECT
64f0: 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   x FROM t1 WHERE
6500: 20 72 6f 77 69 64 20 3d 20 28 53 45 4c 45 43 54   rowid = (SELECT
6510: 20 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d   max(rowid) FROM
6520: 20 74 31 29 22 2c 0a 20 20 20 20 7d 3b 0a 20 20   t1)",.    };.  
6530: 20 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 2c    char *z1, *z2,
6540: 20 2a 7a 33 3b 0a 0a 20 20 20 20 65 78 65 63 73   *z3;..    execs
6550: 71 6c 28 26 65 72 72 2c 20 26 64 62 2c 20 22 42  ql(&err, &db, "B
6560: 45 47 49 4e 22 29 3b 0a 20 20 20 20 69 6e 74 65  EGIN");.    inte
6570: 67 72 69 74 79 5f 63 68 65 63 6b 28 26 65 72 72  grity_check(&err
6580: 2c 20 26 64 62 29 3b 0a 20 20 20 20 7a 31 20 3d  , &db);.    z1 =
6590: 20 65 78 65 63 73 71 6c 5f 74 65 78 74 28 26 65   execsql_text(&e
65a0: 72 72 2c 20 26 64 62 2c 20 31 2c 20 61 7a 53 71  rr, &db, 1, azSq
65b0: 6c 5b 30 5d 29 3b 0a 20 20 20 20 7a 32 20 3d 20  l[0]);.    z2 = 
65c0: 65 78 65 63 73 71 6c 5f 74 65 78 74 28 26 65 72  execsql_text(&er
65d0: 72 2c 20 26 64 62 2c 20 32 2c 20 61 7a 53 71 6c  r, &db, 2, azSql
65e0: 5b 31 5d 29 3b 0a 20 20 20 20 7a 33 20 3d 20 65  [1]);.    z3 = e
65f0: 78 65 63 73 71 6c 5f 74 65 78 74 28 26 65 72 72  xecsql_text(&err
6600: 2c 20 26 64 62 2c 20 33 2c 20 61 7a 53 71 6c 5b  , &db, 3, azSql[
6610: 30 5d 29 3b 0a 20 20 20 20 65 78 65 63 73 71 6c  0]);.    execsql
6620: 28 26 65 72 72 2c 20 26 64 62 2c 20 22 43 4f 4d  (&err, &db, "COM
6630: 4d 49 54 22 29 3b 0a 0a 20 20 20 20 69 66 28 20  MIT");..    if( 
6640: 73 74 72 63 6d 70 28 7a 31 2c 20 7a 32 29 20 7c  strcmp(z1, z2) |
6650: 7c 20 73 74 72 63 6d 70 28 7a 31 2c 20 7a 33 29  | strcmp(z1, z3)
6660: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 5f 65   ){.      test_e
6670: 72 72 6f 72 28 26 65 72 72 2c 20 22 46 61 69 6c  rror(&err, "Fail
6680: 65 64 20 72 65 61 64 3a 20 25 73 20 25 73 20 25  ed read: %s %s %
6690: 73 22 2c 20 7a 31 2c 20 7a 32 2c 20 7a 33 29 3b  s", z1, z2, z3);
66a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 5f  .    }..    sql_
66b0: 73 63 72 69 70 74 28 26 65 72 72 2c 20 26 64 62  script(&err, &db
66c0: 2c 0a 20 20 20 20 20 20 20 20 22 42 45 47 49 4e  ,.        "BEGIN
66d0: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  ;".          "IN
66e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
66f0: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  UES(randomblob(1
6700: 30 30 29 29 3b 22 0a 20 20 20 20 20 20 20 20 20  00));".         
6710: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   "INSERT INTO t1
6720: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
6730: 6f 62 28 31 30 30 29 29 3b 22 0a 20 20 20 20 20  ob(100));".     
6740: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
6750: 4f 20 74 31 20 53 45 4c 45 43 54 20 6d 64 35 73  O t1 SELECT md5s
6760: 75 6d 28 78 29 20 46 52 4f 4d 20 74 31 3b 22 0a  um(x) FROM t1;".
6770: 20 20 20 20 20 20 20 20 22 43 4f 4d 4d 49 54 3b          "COMMIT;
6780: 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 6e 49 74  ".    );.    nIt
6790: 65 72 2b 2b 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  er++;.  }.  clos
67a0: 65 64 62 28 26 65 72 72 2c 20 26 64 62 29 3b 0a  edb(&err, &db);.
67b0: 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65  .  print_and_fre
67c0: 65 5f 65 72 72 28 26 65 72 72 29 3b 0a 20 20 72  e_err(&err);.  r
67d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70  eturn sqlite3_mp
67e0: 72 69 6e 74 66 28 22 25 64 20 69 74 65 72 61 74  rintf("%d iterat
67f0: 69 6f 6e 73 22 2c 20 6e 49 74 65 72 29 3b 0a 7d  ions", nIter);.}
6800: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  ..static char *w
6810: 61 6c 74 68 72 65 61 64 31 5f 63 6b 70 74 5f 74  althread1_ckpt_t
6820: 68 72 65 61 64 28 69 6e 74 20 69 54 69 64 2c 20  hread(int iTid, 
6830: 69 6e 74 20 69 41 72 67 29 7b 0a 20 20 45 72 72  int iArg){.  Err
6840: 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 20 20 20  or err = {0};   
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6860: 45 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d  Error code and m
6870: 65 73 73 61 67 65 20 2a 2f 0a 20 20 53 71 6c 69  essage */.  Sqli
6880: 74 65 20 64 62 20 3d 20 7b 30 7d 3b 20 20 20 20  te db = {0};    
6890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
68a0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63  QLite database c
68b0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
68c0: 6e 74 20 6e 43 6b 70 74 20 3d 20 30 3b 20 20 20  nt nCkpt = 0;   
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
68e0: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 73 20 73 6f  * Checkpoints so
68f0: 20 66 61 72 20 2a 2f 0a 0a 20 20 6f 70 65 6e 64   far */..  opend
6900: 62 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74 65  b(&err, &db, "te
6910: 73 74 2e 64 62 22 2c 20 30 29 3b 0a 20 20 77 68  st.db", 0);.  wh
6920: 69 6c 65 28 20 21 74 69 6d 65 74 6f 73 74 6f 70  ile( !timetostop
6930: 28 26 65 72 72 29 20 29 7b 0a 20 20 20 20 75 73  (&err) ){.    us
6940: 6c 65 65 70 28 35 30 30 2a 31 30 30 30 29 3b 0a  leep(500*1000);.
6950: 20 20 20 20 65 78 65 63 73 71 6c 28 26 65 72 72      execsql(&err
6960: 2c 20 26 64 62 2c 20 22 50 52 41 47 4d 41 20 77  , &db, "PRAGMA w
6970: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 29 3b  al_checkpoint");
6980: 0a 20 20 20 20 69 66 28 20 65 72 72 2e 72 63 3d  .    if( err.rc=
6990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 6e 43 6b  =SQLITE_OK ) nCk
69a0: 70 74 2b 2b 3b 0a 20 20 20 20 63 6c 65 61 72 5f  pt++;.    clear_
69b0: 65 72 72 6f 72 28 26 65 72 72 2c 20 53 51 4c 49  error(&err, SQLI
69c0: 54 45 5f 42 55 53 59 29 3b 0a 20 20 7d 0a 20 20  TE_BUSY);.  }.  
69d0: 63 6c 6f 73 65 64 62 28 26 65 72 72 2c 20 26 64  closedb(&err, &d
69e0: 62 29 3b 0a 0a 20 20 70 72 69 6e 74 5f 61 6e 64  b);..  print_and
69f0: 5f 66 72 65 65 5f 65 72 72 28 26 65 72 72 29 3b  _free_err(&err);
6a00: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6a10: 33 5f 6d 70 72 69 6e 74 66 28 22 25 64 20 63 68  3_mprintf("%d ch
6a20: 65 63 6b 70 6f 69 6e 74 73 22 2c 20 6e 43 6b 70  eckpoints", nCkp
6a30: 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
6a40: 69 64 20 77 61 6c 74 68 72 65 61 64 31 28 69 6e  id walthread1(in
6a50: 74 20 6e 4d 73 29 7b 0a 20 20 45 72 72 6f 72 20  t nMs){.  Error 
6a60: 65 72 72 20 3d 20 7b 30 7d 3b 20 20 20 20 20 20  err = {0};      
6a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
6a80: 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73  or code and mess
6a90: 61 67 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20  age */.  Sqlite 
6aa0: 64 62 20 3d 20 7b 30 7d 3b 20 20 20 20 20 20 20  db = {0};       
6ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
6ac0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
6ad0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 68 72 65  ection */.  Thre
6ae0: 61 64 73 65 74 20 74 68 72 65 61 64 73 20 3d 20  adset threads = 
6af0: 7b 30 7d 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  {0};        /* T
6b00: 65 73 74 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  est threads */. 
6b10: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
6b40: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 6f 70 65 6e  iable */..  open
6b50: 64 62 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74  db(&err, &db, "t
6b60: 65 73 74 2e 64 62 22 2c 20 31 29 3b 0a 20 20 73  est.db", 1);.  s
6b70: 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72 2c 20  ql_script(&err, 
6b80: 26 64 62 2c 0a 20 20 20 20 20 20 22 50 52 41 47  &db,.      "PRAG
6b90: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
6ba0: 3d 20 57 41 4c 3b 22 0a 20 20 20 20 20 20 22 43  = WAL;".      "C
6bb0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
6bc0: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 22 0a   PRIMARY KEY);".
6bd0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
6be0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
6bf0: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 3b 22 0a  domblob(100));".
6c00: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
6c10: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
6c20: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 3b 22 0a  domblob(100));".
6c30: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
6c40: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 6d 64 35  TO t1 SELECT md5
6c50: 73 75 6d 28 78 29 20 46 52 4f 4d 20 74 31 3b 22  sum(x) FROM t1;"
6c60: 0a 20 20 29 3b 0a 0a 20 20 73 65 74 73 74 6f 70  .  );..  setstop
6c70: 74 69 6d 65 28 26 65 72 72 2c 20 6e 4d 73 29 3b  time(&err, nMs);
6c80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 57 41  .  for(i=0; i<WA
6c90: 4c 54 48 52 45 41 44 31 5f 4e 54 48 52 45 41 44  LTHREAD1_NTHREAD
6ca0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 61 75 6e  ; i++){.    laun
6cb0: 63 68 5f 74 68 72 65 61 64 28 26 65 72 72 2c 20  ch_thread(&err, 
6cc0: 26 74 68 72 65 61 64 73 2c 20 77 61 6c 74 68 72  &threads, walthr
6cd0: 65 61 64 31 5f 74 68 72 65 61 64 2c 20 30 29 3b  ead1_thread, 0);
6ce0: 0a 20 20 7d 0a 20 20 6c 61 75 6e 63 68 5f 74 68  .  }.  launch_th
6cf0: 72 65 61 64 28 26 65 72 72 2c 20 26 74 68 72 65  read(&err, &thre
6d00: 61 64 73 2c 20 77 61 6c 74 68 72 65 61 64 31 5f  ads, walthread1_
6d10: 63 6b 70 74 5f 74 68 72 65 61 64 2c 20 30 29 3b  ckpt_thread, 0);
6d20: 0a 20 20 6a 6f 69 6e 5f 61 6c 6c 5f 74 68 72 65  .  join_all_thre
6d30: 61 64 73 28 26 65 72 72 2c 20 26 74 68 72 65 61  ads(&err, &threa
6d40: 64 73 29 3b 0a 0a 20 20 70 72 69 6e 74 5f 61 6e  ds);..  print_an
6d50: 64 5f 66 72 65 65 5f 65 72 72 28 26 65 72 72 29  d_free_err(&err)
6d60: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
6d70: 20 2a 77 61 6c 74 68 72 65 61 64 32 5f 74 68 72   *walthread2_thr
6d80: 65 61 64 28 69 6e 74 20 69 54 69 64 2c 20 69 6e  ead(int iTid, in
6d90: 74 20 69 41 72 67 29 7b 0a 20 20 45 72 72 6f 72  t iArg){.  Error
6da0: 20 65 72 72 20 3d 20 7b 30 7d 3b 20 20 20 20 20   err = {0};     
6db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
6dc0: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73  ror code and mes
6dd0: 73 61 67 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65  sage */.  Sqlite
6de0: 20 64 62 20 3d 20 7b 30 7d 3b 20 20 20 20 20 20   db = {0};      
6df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
6e00: 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ite database con
6e10: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
6e20: 20 61 6e 54 72 61 6e 73 5b 32 5d 20 3d 20 7b 30   anTrans[2] = {0
6e30: 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 2f 2a 20  , 0};        /* 
6e40: 4e 75 6d 62 65 72 20 6f 66 20 57 41 4c 20 61 6e  Number of WAL an
6e50: 64 20 52 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  d Rollback trans
6e60: 61 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 63 6f  actions */..  co
6e70: 6e 73 74 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  nst char *zJourn
6e80: 61 6c 20 3d 20 22 50 52 41 47 4d 41 20 6a 6f 75  al = "PRAGMA jou
6e90: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 22  rnal_mode = WAL"
6ea0: 3b 0a 20 20 69 66 28 20 69 41 72 67 20 29 7b 20  ;.  if( iArg ){ 
6eb0: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 22 50 52 41 47  zJournal = "PRAG
6ec0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
6ed0: 3d 20 44 45 4c 45 54 45 22 3b 20 7d 0a 0a 20 20  = DELETE"; }..  
6ee0: 77 68 69 6c 65 28 20 21 74 69 6d 65 74 6f 73 74  while( !timetost
6ef0: 6f 70 28 26 65 72 72 29 20 29 7b 0a 20 20 20 20  op(&err) ){.    
6f00: 69 6e 74 20 6a 6f 75 72 6e 61 6c 5f 65 78 69 73  int journal_exis
6f10: 74 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ts = 0;.    int 
6f20: 77 61 6c 5f 65 78 69 73 74 73 20 3d 20 30 3b 0a  wal_exists = 0;.
6f30: 0a 20 20 20 20 6f 70 65 6e 64 62 28 26 65 72 72  .    opendb(&err
6f40: 2c 20 26 64 62 2c 20 22 74 65 73 74 2e 64 62 22  , &db, "test.db"
6f50: 2c 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c 5f 73  , 0);..    sql_s
6f60: 63 72 69 70 74 28 26 65 72 72 2c 20 26 64 62 2c  cript(&err, &db,
6f70: 20 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20   zJournal);.    
6f80: 63 6c 65 61 72 5f 65 72 72 6f 72 28 26 65 72 72  clear_error(&err
6f90: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 29 3b 0a  , SQLITE_BUSY);.
6fa0: 20 20 20 20 73 71 6c 5f 73 63 72 69 70 74 28 26      sql_script(&
6fb0: 65 72 72 2c 20 26 64 62 2c 20 22 42 45 47 49 4e  err, &db, "BEGIN
6fc0: 22 29 3b 0a 20 20 20 20 73 71 6c 5f 73 63 72 69  ");.    sql_scri
6fd0: 70 74 28 26 65 72 72 2c 20 26 64 62 2c 20 22 49  pt(&err, &db, "I
6fe0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6ff0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 72 61 6e 64 6f  LUES(NULL, rando
7000: 6d 62 6c 6f 62 28 31 30 30 29 29 22 29 3b 0a 0a  mblob(100))");..
7010: 20 20 20 20 6a 6f 75 72 6e 61 6c 5f 65 78 69 73      journal_exis
7020: 74 73 20 3d 20 28 66 69 6c 65 73 69 7a 65 28 26  ts = (filesize(&
7030: 65 72 72 2c 20 22 74 65 73 74 2e 64 62 2d 6a 6f  err, "test.db-jo
7040: 75 72 6e 61 6c 22 29 20 3e 3d 20 30 29 3b 0a 20  urnal") >= 0);. 
7050: 20 20 20 77 61 6c 5f 65 78 69 73 74 73 20 3d 20     wal_exists = 
7060: 28 66 69 6c 65 73 69 7a 65 28 26 65 72 72 2c 20  (filesize(&err, 
7070: 22 74 65 73 74 2e 64 62 2d 77 61 6c 22 29 20 3e  "test.db-wal") >
7080: 3d 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 6a  = 0);.    if( (j
7090: 6f 75 72 6e 61 6c 5f 65 78 69 73 74 73 2b 77 61  ournal_exists+wa
70a0: 6c 5f 65 78 69 73 74 73 29 21 3d 31 20 29 7b 0a  l_exists)!=1 ){.
70b0: 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6f 72        test_error
70c0: 28 26 65 72 72 2c 20 22 46 69 6c 65 20 73 79 73  (&err, "File sys
70d0: 74 65 6d 20 6c 6f 6f 6b 73 20 69 6e 63 6f 72 72  tem looks incorr
70e0: 65 63 74 20 28 25 64 2c 20 25 64 29 22 2c 20 0a  ect (%d, %d)", .
70f0: 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
7100: 6c 5f 65 78 69 73 74 73 2c 20 77 61 6c 5f 65 78  l_exists, wal_ex
7110: 69 73 74 73 0a 20 20 20 20 20 20 29 3b 0a 20 20  ists.      );.  
7120: 20 20 7d 0a 20 20 20 20 61 6e 54 72 61 6e 73 5b    }.    anTrans[
7130: 6a 6f 75 72 6e 61 6c 5f 65 78 69 73 74 73 5d 2b  journal_exists]+
7140: 2b 3b 0a 0a 20 20 20 20 73 71 6c 5f 73 63 72 69  +;..    sql_scri
7150: 70 74 28 26 65 72 72 2c 20 26 64 62 2c 20 22 43  pt(&err, &db, "C
7160: 4f 4d 4d 49 54 22 29 3b 0a 20 20 20 20 69 6e 74  OMMIT");.    int
7170: 65 67 72 69 74 79 5f 63 68 65 63 6b 28 26 65 72  egrity_check(&er
7180: 72 2c 20 26 64 62 29 3b 0a 20 20 20 20 63 6c 6f  r, &db);.    clo
7190: 73 65 64 62 28 26 65 72 72 2c 20 26 64 62 29 3b  sedb(&err, &db);
71a0: 0a 20 20 7d 0a 0a 20 20 70 72 69 6e 74 5f 61 6e  .  }..  print_an
71b0: 64 5f 66 72 65 65 5f 65 72 72 28 26 65 72 72 29  d_free_err(&err)
71c0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
71d0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 57 20 25 64  e3_mprintf("W %d
71e0: 20 52 20 25 64 22 2c 20 61 6e 54 72 61 6e 73 5b   R %d", anTrans[
71f0: 30 5d 2c 20 61 6e 54 72 61 6e 73 5b 31 5d 29 3b  0], anTrans[1]);
7200: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7210: 77 61 6c 74 68 72 65 61 64 32 28 69 6e 74 20 6e  walthread2(int n
7220: 4d 73 29 7b 0a 20 20 45 72 72 6f 72 20 65 72 72  Ms){.  Error err
7230: 20 3d 20 7b 30 7d 3b 0a 20 20 53 71 6c 69 74 65   = {0};.  Sqlite
7240: 20 64 62 20 3d 20 7b 30 7d 3b 0a 20 20 54 68 72   db = {0};.  Thr
7250: 65 61 64 73 65 74 20 74 68 72 65 61 64 73 20 3d  eadset threads =
7260: 20 7b 30 7d 3b 0a 0a 20 20 6f 70 65 6e 64 62 28   {0};..  opendb(
7270: 26 65 72 72 2c 20 26 64 62 2c 20 22 74 65 73 74  &err, &db, "test
7280: 2e 64 62 22 2c 20 31 29 3b 0a 20 20 73 71 6c 5f  .db", 1);.  sql_
7290: 73 63 72 69 70 74 28 26 65 72 72 2c 20 26 64 62  script(&err, &db
72a0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
72b0: 74 31 28 78 20 49 4e 54 45 47 45 52 20 50 52 49  t1(x INTEGER PRI
72c0: 4d 41 52 59 20 4b 45 59 2c 20 79 20 55 4e 49 51  MARY KEY, y UNIQ
72d0: 55 45 29 22 29 3b 0a 20 20 63 6c 6f 73 65 64 62  UE)");.  closedb
72e0: 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20 20  (&err, &db);..  
72f0: 73 65 74 73 74 6f 70 74 69 6d 65 28 26 65 72 72  setstoptime(&err
7300: 2c 20 6e 4d 73 29 3b 0a 20 20 6c 61 75 6e 63 68  , nMs);.  launch
7310: 5f 74 68 72 65 61 64 28 26 65 72 72 2c 20 26 74  _thread(&err, &t
7320: 68 72 65 61 64 73 2c 20 77 61 6c 74 68 72 65 61  hreads, walthrea
7330: 64 32 5f 74 68 72 65 61 64 2c 20 30 29 3b 0a 20  d2_thread, 0);. 
7340: 20 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 28 26   launch_thread(&
7350: 65 72 72 2c 20 26 74 68 72 65 61 64 73 2c 20 77  err, &threads, w
7360: 61 6c 74 68 72 65 61 64 32 5f 74 68 72 65 61 64  althread2_thread
7370: 2c 20 30 29 3b 0a 20 20 6c 61 75 6e 63 68 5f 74  , 0);.  launch_t
7380: 68 72 65 61 64 28 26 65 72 72 2c 20 26 74 68 72  hread(&err, &thr
7390: 65 61 64 73 2c 20 77 61 6c 74 68 72 65 61 64 32  eads, walthread2
73a0: 5f 74 68 72 65 61 64 2c 20 31 29 3b 0a 20 20 6c  _thread, 1);.  l
73b0: 61 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72  aunch_thread(&er
73c0: 72 2c 20 26 74 68 72 65 61 64 73 2c 20 77 61 6c  r, &threads, wal
73d0: 74 68 72 65 61 64 32 5f 74 68 72 65 61 64 2c 20  thread2_thread, 
73e0: 31 29 3b 0a 20 20 6a 6f 69 6e 5f 61 6c 6c 5f 74  1);.  join_all_t
73f0: 68 72 65 61 64 73 28 26 65 72 72 2c 20 26 74 68  hreads(&err, &th
7400: 72 65 61 64 73 29 3b 0a 0a 20 20 70 72 69 6e 74  reads);..  print
7410: 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72 28 26 65  _and_free_err(&e
7420: 72 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  rr);.}..static c
7430: 68 61 72 20 2a 77 61 6c 74 68 72 65 61 64 33 5f  har *walthread3_
7440: 74 68 72 65 61 64 28 69 6e 74 20 69 54 69 64 2c  thread(int iTid,
7450: 20 69 6e 74 20 69 41 72 67 29 7b 0a 20 20 45 72   int iArg){.  Er
7460: 72 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 20 20  ror err = {0};  
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7480: 20 45 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   Error code and 
7490: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 53 71 6c  message */.  Sql
74a0: 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 20 20 20  ite db = {0};   
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
74c0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
74d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
74e0: 69 36 34 20 69 4e 65 78 74 57 72 69 74 65 3b 20  i64 iNextWrite; 
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 2f 2a 20 4e 65 78 74 20 76 61 6c 75 65 20 74 68  /* Next value th
7510: 69 73 20 74 68 72 65 61 64 20 77 69 6c 6c 20 77  is thread will w
7520: 72 69 74 65 20 2a 2f 0a 0a 20 20 6f 70 65 6e 64  rite */..  opend
7530: 62 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74 65  b(&err, &db, "te
7540: 73 74 2e 64 62 22 2c 20 30 29 3b 0a 20 20 73 71  st.db", 0);.  sq
7550: 6c 5f 73 63 72 69 70 74 28 26 65 72 72 2c 20 26  l_script(&err, &
7560: 64 62 2c 20 22 50 52 41 47 4d 41 20 77 61 6c 5f  db, "PRAGMA wal_
7570: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d  autocheckpoint =
7580: 20 31 30 22 29 3b 0a 0a 20 20 69 4e 65 78 74 57   10");..  iNextW
7590: 72 69 74 65 20 3d 20 69 41 72 67 2b 31 3b 0a 20  rite = iArg+1;. 
75a0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
75b0: 20 69 36 34 20 73 75 6d 31 3b 0a 20 20 20 20 69   i64 sum1;.    i
75c0: 36 34 20 73 75 6d 32 3b 0a 20 20 20 20 69 6e 74  64 sum2;.    int
75d0: 20 73 74 6f 70 20 3d 20 30 3b 20 20 20 20 20 20   stop = 0;      
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
75f0: 75 65 20 74 6f 20 73 74 6f 70 20 65 78 65 63 75  ue to stop execu
7600: 74 69 6e 67 20 28 74 65 73 74 20 74 69 6d 65 64  ting (test timed
7610: 20 6f 75 74 29 20 2a 2f 0a 0a 20 20 20 20 77 68   out) */..    wh
7620: 69 6c 65 28 20 30 3d 3d 28 73 74 6f 70 20 3d 20  ile( 0==(stop = 
7630: 74 69 6d 65 74 6f 73 74 6f 70 28 26 65 72 72 29  timetostop(&err)
7640: 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  ) ){.      i64 i
7650: 4d 61 78 20 3d 20 65 78 65 63 73 71 6c 5f 69 36  Max = execsql_i6
7660: 34 28 26 65 72 72 2c 20 26 64 62 2c 20 22 53 45  4(&err, &db, "SE
7670: 4c 45 43 54 20 6d 61 78 28 63 6e 74 29 20 46 52  LECT max(cnt) FR
7680: 4f 4d 20 74 31 22 29 3b 0a 20 20 20 20 20 20 69  OM t1");.      i
7690: 66 28 20 69 4d 61 78 2b 31 3d 3d 69 4e 65 78 74  f( iMax+1==iNext
76a0: 57 72 69 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  Write ) break;. 
76b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 6f     }.    if( sto
76c0: 70 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  p ) break;..    
76d0: 73 75 6d 31 20 3d 20 65 78 65 63 73 71 6c 5f 69  sum1 = execsql_i
76e0: 36 34 28 26 65 72 72 2c 20 26 64 62 2c 20 22 53  64(&err, &db, "S
76f0: 45 4c 45 43 54 20 73 75 6d 28 63 6e 74 29 20 46  ELECT sum(cnt) F
7700: 52 4f 4d 20 74 31 22 29 3b 0a 20 20 20 20 73 75  ROM t1");.    su
7710: 6d 32 20 3d 20 65 78 65 63 73 71 6c 5f 69 36 34  m2 = execsql_i64
7720: 28 26 65 72 72 2c 20 26 64 62 2c 20 22 53 45 4c  (&err, &db, "SEL
7730: 45 43 54 20 73 75 6d 28 73 75 6d 31 29 20 46 52  ECT sum(sum1) FR
7740: 4f 4d 20 74 31 22 29 3b 0a 20 20 20 20 65 78 65  OM t1");.    exe
7750: 63 73 71 6c 5f 69 36 34 28 26 65 72 72 2c 20 26  csql_i64(&err, &
7760: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e  db, .        "IN
7770: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
7780: 55 45 53 28 3a 69 4e 65 78 74 57 72 69 74 65 2c  UES(:iNextWrite,
7790: 20 3a 69 53 75 6d 31 2c 20 3a 69 53 75 6d 32 29   :iSum1, :iSum2)
77a0: 22 2c 0a 20 20 20 20 20 20 20 20 26 69 4e 65 78  ",.        &iNex
77b0: 74 57 72 69 74 65 2c 20 26 73 75 6d 31 2c 20 26  tWrite, &sum1, &
77c0: 73 75 6d 32 0a 20 20 20 20 29 3b 0a 20 20 20 20  sum2.    );.    
77d0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28  integrity_check(
77e0: 26 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20 20 20  &err, &db);..   
77f0: 20 69 4e 65 78 74 57 72 69 74 65 20 2b 3d 20 57   iNextWrite += W
7800: 41 4c 54 48 52 45 41 44 33 5f 4e 54 48 52 45 41  ALTHREAD3_NTHREA
7810: 44 3b 0a 20 20 7d 0a 0a 20 20 63 6c 6f 73 65 64  D;.  }..  closed
7820: 62 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 20 20  b(&err, &db);.  
7830: 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65  print_and_free_e
7840: 72 72 28 26 65 72 72 29 3b 0a 20 20 72 65 74 75  rr(&err);.  retu
7850: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
7860: 76 6f 69 64 20 77 61 6c 74 68 72 65 61 64 33 28  void walthread3(
7870: 69 6e 74 20 6e 4d 73 29 7b 0a 20 20 45 72 72 6f  int nMs){.  Erro
7880: 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20 53  r err = {0};.  S
7890: 71 6c 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 0a  qlite db = {0};.
78a0: 20 20 54 68 72 65 61 64 73 65 74 20 74 68 72 65    Threadset thre
78b0: 61 64 73 20 3d 20 7b 30 7d 3b 0a 20 20 69 6e 74  ads = {0};.  int
78c0: 20 69 3b 0a 0a 20 20 6f 70 65 6e 64 62 28 26 65   i;..  opendb(&e
78d0: 72 72 2c 20 26 64 62 2c 20 22 74 65 73 74 2e 64  rr, &db, "test.d
78e0: 62 22 2c 20 31 29 3b 0a 20 20 73 71 6c 5f 73 63  b", 1);.  sql_sc
78f0: 72 69 70 74 28 26 65 72 72 2c 20 26 64 62 2c 20  ript(&err, &db, 
7900: 0a 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 6a  .      "PRAGMA j
7910: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
7920: 4c 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41 54  L;".      "CREAT
7930: 45 20 54 41 42 4c 45 20 74 31 28 63 6e 74 20 50  E TABLE t1(cnt P
7940: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 75 6d 31  RIMARY KEY, sum1
7950: 2c 20 73 75 6d 32 29 3b 22 0a 20 20 20 20 20 20  , sum2);".      
7960: 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31  "CREATE INDEX i1
7970: 20 4f 4e 20 74 31 28 73 75 6d 31 29 3b 22 0a 20   ON t1(sum1);". 
7980: 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44       "CREATE IND
7990: 45 58 20 69 32 20 4f 4e 20 74 31 28 73 75 6d 32  EX i2 ON t1(sum2
79a0: 29 3b 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  );".      "INSER
79b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
79c0: 28 30 2c 20 30 2c 20 30 29 3b 22 0a 20 20 29 3b  (0, 0, 0);".  );
79d0: 0a 20 20 63 6c 6f 73 65 64 62 28 26 65 72 72 2c  .  closedb(&err,
79e0: 20 26 64 62 29 3b 0a 0a 20 20 73 65 74 73 74 6f   &db);..  setsto
79f0: 70 74 69 6d 65 28 26 65 72 72 2c 20 6e 4d 73 29  ptime(&err, nMs)
7a00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 57  ;.  for(i=0; i<W
7a10: 41 4c 54 48 52 45 41 44 33 5f 4e 54 48 52 45 41  ALTHREAD3_NTHREA
7a20: 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 61 75  D; i++){.    lau
7a30: 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72 72 2c  nch_thread(&err,
7a40: 20 26 74 68 72 65 61 64 73 2c 20 77 61 6c 74 68   &threads, walth
7a50: 72 65 61 64 33 5f 74 68 72 65 61 64 2c 20 69 29  read3_thread, i)
7a60: 3b 0a 20 20 7d 0a 20 20 6a 6f 69 6e 5f 61 6c 6c  ;.  }.  join_all
7a70: 5f 74 68 72 65 61 64 73 28 26 65 72 72 2c 20 26  _threads(&err, &
7a80: 74 68 72 65 61 64 73 29 3b 0a 0a 20 20 70 72 69  threads);..  pri
7a90: 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72 28  nt_and_free_err(
7aa0: 26 65 72 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  &err);.}..static
7ab0: 20 63 68 61 72 20 2a 77 61 6c 74 68 72 65 61 64   char *walthread
7ac0: 34 5f 72 65 61 64 65 72 5f 74 68 72 65 61 64 28  4_reader_thread(
7ad0: 69 6e 74 20 69 54 69 64 2c 20 69 6e 74 20 69 41  int iTid, int iA
7ae0: 72 67 29 7b 0a 20 20 45 72 72 6f 72 20 65 72 72  rg){.  Error err
7af0: 20 3d 20 7b 30 7d 3b 20 20 20 20 20 20 20 20 20   = {0};         
7b00: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
7b10: 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65  code and message
7b20: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20 64 62 20   */.  Sqlite db 
7b30: 3d 20 7b 30 7d 3b 20 20 20 20 20 20 20 20 20 20  = {0};          
7b40: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
7b50: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
7b60: 69 6f 6e 20 2a 2f 0a 0a 20 20 6f 70 65 6e 64 62  ion */..  opendb
7b70: 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74 65 73  (&err, &db, "tes
7b80: 74 2e 64 62 22 2c 20 30 29 3b 0a 20 20 77 68 69  t.db", 0);.  whi
7b90: 6c 65 28 20 21 74 69 6d 65 74 6f 73 74 6f 70 28  le( !timetostop(
7ba0: 26 65 72 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  &err) ){.    int
7bb0: 65 67 72 69 74 79 5f 63 68 65 63 6b 28 26 65 72  egrity_check(&er
7bc0: 72 2c 20 26 64 62 29 3b 0a 20 20 7d 0a 20 20 63  r, &db);.  }.  c
7bd0: 6c 6f 73 65 64 62 28 26 65 72 72 2c 20 26 64 62  losedb(&err, &db
7be0: 29 3b 0a 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f  );..  print_and_
7bf0: 66 72 65 65 5f 65 72 72 28 26 65 72 72 29 3b 0a  free_err(&err);.
7c00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
7c10: 74 61 74 69 63 20 63 68 61 72 20 2a 77 61 6c 74  tatic char *walt
7c20: 68 72 65 61 64 34 5f 77 72 69 74 65 72 5f 74 68  hread4_writer_th
7c30: 72 65 61 64 28 69 6e 74 20 69 54 69 64 2c 20 69  read(int iTid, i
7c40: 6e 74 20 69 41 72 67 29 7b 0a 20 20 45 72 72 6f  nt iArg){.  Erro
7c50: 72 20 65 72 72 20 3d 20 7b 30 7d 3b 20 20 20 20  r err = {0};    
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7c70: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65  rror code and me
7c80: 73 73 61 67 65 20 2a 2f 0a 20 20 53 71 6c 69 74  ssage */.  Sqlit
7c90: 65 20 64 62 20 3d 20 7b 30 7d 3b 20 20 20 20 20  e db = {0};     
7ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
7cb0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
7cc0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 36  nnection */.  i6
7cd0: 34 20 69 52 6f 77 20 3d 20 31 3b 0a 0a 20 20 6f  4 iRow = 1;..  o
7ce0: 70 65 6e 64 62 28 26 65 72 72 2c 20 26 64 62 2c  pendb(&err, &db,
7cf0: 20 22 74 65 73 74 2e 64 62 22 2c 20 30 29 3b 0a   "test.db", 0);.
7d00: 20 20 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72    sql_script(&er
7d10: 72 2c 20 26 64 62 2c 20 22 50 52 41 47 4d 41 20  r, &db, "PRAGMA 
7d20: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
7d30: 6e 74 20 3d 20 31 35 3b 22 29 3b 0a 20 20 77 68  nt = 15;");.  wh
7d40: 69 6c 65 28 20 21 74 69 6d 65 74 6f 73 74 6f 70  ile( !timetostop
7d50: 28 26 65 72 72 29 20 29 7b 0a 20 20 20 20 65 78  (&err) ){.    ex
7d60: 65 63 73 71 6c 5f 69 36 34 28 0a 20 20 20 20 20  ecsql_i64(.     
7d70: 20 20 20 26 65 72 72 2c 20 26 64 62 2c 20 22 52     &err, &db, "R
7d80: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 31 20 56  EPLACE INTO t1 V
7d90: 41 4c 55 45 53 28 3a 69 52 6f 77 2c 20 72 61 6e  ALUES(:iRow, ran
7da0: 64 6f 6d 62 6c 6f 62 28 33 30 30 29 29 22 2c 20  domblob(300))", 
7db0: 26 69 52 6f 77 0a 20 20 20 20 29 3b 0a 20 20 20  &iRow.    );.   
7dc0: 20 69 52 6f 77 2b 2b 3b 0a 20 20 20 20 69 66 28   iRow++;.    if(
7dd0: 20 69 52 6f 77 3d 3d 31 30 20 29 20 69 52 6f 77   iRow==10 ) iRow
7de0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73   = 0;.  }.  clos
7df0: 65 64 62 28 26 65 72 72 2c 20 26 64 62 29 3b 0a  edb(&err, &db);.
7e00: 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65  .  print_and_fre
7e10: 65 5f 65 72 72 28 26 65 72 72 29 3b 0a 20 20 72  e_err(&err);.  r
7e20: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
7e30: 69 63 20 76 6f 69 64 20 77 61 6c 74 68 72 65 61  ic void walthrea
7e40: 64 34 28 69 6e 74 20 6e 4d 73 29 7b 0a 20 20 45  d4(int nMs){.  E
7e50: 72 72 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a  rror err = {0};.
7e60: 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20 7b 30    Sqlite db = {0
7e70: 7d 3b 0a 20 20 54 68 72 65 61 64 73 65 74 20 74  };.  Threadset t
7e80: 68 72 65 61 64 73 20 3d 20 7b 30 7d 3b 0a 0a 20  hreads = {0};.. 
7e90: 20 6f 70 65 6e 64 62 28 26 65 72 72 2c 20 26 64   opendb(&err, &d
7ea0: 62 2c 20 22 74 65 73 74 2e 64 62 22 2c 20 31 29  b, "test.db", 1)
7eb0: 3b 0a 20 20 73 71 6c 5f 73 63 72 69 70 74 28 26  ;.  sql_script(&
7ec0: 65 72 72 2c 20 26 64 62 2c 20 0a 20 20 20 20 20  err, &db, .     
7ed0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
7ee0: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 22 0a 20 20  _mode = WAL;".  
7ef0: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
7f00: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
7f10: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e  RIMARY KEY, b UN
7f20: 49 51 55 45 29 3b 22 0a 20 20 29 3b 0a 20 20 63  IQUE);".  );.  c
7f30: 6c 6f 73 65 64 62 28 26 65 72 72 2c 20 26 64 62  losedb(&err, &db
7f40: 29 3b 0a 0a 20 20 73 65 74 73 74 6f 70 74 69 6d  );..  setstoptim
7f50: 65 28 26 65 72 72 2c 20 6e 4d 73 29 3b 0a 20 20  e(&err, nMs);.  
7f60: 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65  launch_thread(&e
7f70: 72 72 2c 20 26 74 68 72 65 61 64 73 2c 20 77 61  rr, &threads, wa
7f80: 6c 74 68 72 65 61 64 34 5f 72 65 61 64 65 72 5f  lthread4_reader_
7f90: 74 68 72 65 61 64 2c 20 30 29 3b 0a 20 20 6c 61  thread, 0);.  la
7fa0: 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72 72  unch_thread(&err
7fb0: 2c 20 26 74 68 72 65 61 64 73 2c 20 77 61 6c 74  , &threads, walt
7fc0: 68 72 65 61 64 34 5f 77 72 69 74 65 72 5f 74 68  hread4_writer_th
7fd0: 72 65 61 64 2c 20 30 29 3b 0a 20 20 6a 6f 69 6e  read, 0);.  join
7fe0: 5f 61 6c 6c 5f 74 68 72 65 61 64 73 28 26 65 72  _all_threads(&er
7ff0: 72 2c 20 26 74 68 72 65 61 64 73 29 3b 0a 0a 20  r, &threads);.. 
8000: 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f   print_and_free_
8010: 65 72 72 28 26 65 72 72 29 3b 0a 7d 0a 0a 73 74  err(&err);.}..st
8020: 61 74 69 63 20 63 68 61 72 20 2a 77 61 6c 74 68  atic char *walth
8030: 72 65 61 64 35 5f 74 68 72 65 61 64 28 69 6e 74  read5_thread(int
8040: 20 69 54 69 64 2c 20 69 6e 74 20 69 41 72 67 29   iTid, int iArg)
8050: 7b 0a 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20  {.  Error err = 
8060: 7b 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  {0};            
8070: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
8080: 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 2a 2f  e and message */
8090: 0a 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20 7b  .  Sqlite db = {
80a0: 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0};             
80b0: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 64 61 74     /* SQLite dat
80c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
80d0: 20 2a 2f 0a 20 20 69 36 34 20 6e 52 6f 77 3b 0a   */.  i64 nRow;.
80e0: 0a 20 20 6f 70 65 6e 64 62 28 26 65 72 72 2c 20  .  opendb(&err, 
80f0: 26 64 62 2c 20 22 74 65 73 74 2e 64 62 22 2c 20  &db, "test.db", 
8100: 30 29 3b 0a 20 20 6e 52 6f 77 20 3d 20 65 78 65  0);.  nRow = exe
8110: 63 73 71 6c 5f 69 36 34 28 26 65 72 72 2c 20 26  csql_i64(&err, &
8120: 64 62 2c 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  db, "SELECT coun
8130: 74 28 2a 29 20 46 52 4f 4d 20 74 31 22 29 3b 0a  t(*) FROM t1");.
8140: 20 20 63 6c 6f 73 65 64 62 28 26 65 72 72 2c 20    closedb(&err, 
8150: 26 64 62 29 3b 0a 0a 20 20 69 66 28 20 6e 52 6f  &db);..  if( nRo
8160: 77 21 3d 36 35 35 33 36 20 29 20 74 65 73 74 5f  w!=65536 ) test_
8170: 65 72 72 6f 72 28 26 65 72 72 2c 20 22 42 61 64  error(&err, "Bad
8180: 20 72 6f 77 20 63 6f 75 6e 74 3a 20 25 64 22 2c   row count: %d",
8190: 20 28 69 6e 74 29 6e 52 6f 77 29 3b 0a 20 20 70   (int)nRow);.  p
81a0: 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72  rint_and_free_er
81b0: 72 28 26 65 72 72 29 3b 0a 20 20 72 65 74 75 72  r(&err);.  retur
81c0: 6e 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  n 0;.}.static vo
81d0: 69 64 20 77 61 6c 74 68 72 65 61 64 35 28 69 6e  id walthread5(in
81e0: 74 20 6e 4d 73 29 7b 0a 20 20 45 72 72 6f 72 20  t nMs){.  Error 
81f0: 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20 53 71 6c  err = {0};.  Sql
8200: 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 0a 20 20  ite db = {0};.  
8210: 54 68 72 65 61 64 73 65 74 20 74 68 72 65 61 64  Threadset thread
8220: 73 20 3d 20 7b 30 7d 3b 0a 0a 20 20 6f 70 65 6e  s = {0};..  open
8230: 64 62 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74  db(&err, &db, "t
8240: 65 73 74 2e 64 62 22 2c 20 31 29 3b 0a 20 20 73  est.db", 1);.  s
8250: 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72 2c 20  ql_script(&err, 
8260: 26 64 62 2c 20 0a 20 20 20 20 20 20 22 50 52 41  &db, .      "PRA
8270: 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  GMA wal_autochec
8280: 6b 70 6f 69 6e 74 20 3d 20 30 3b 22 0a 20 20 20  kpoint = 0;".   
8290: 20 20 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f     "PRAGMA page_
82a0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 22 0a 20 20  size = 1024;".  
82b0: 20 20 20 20 22 50 52 41 47 4d 41 20 6a 6f 75 72      "PRAGMA jour
82c0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 22  nal_mode = WAL;"
82d0: 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54  .      "CREATE T
82e0: 41 42 4c 45 20 74 31 28 78 29 3b 22 0a 20 20 20  ABLE t1(x);".   
82f0: 20 20 20 22 42 45 47 49 4e 3b 22 0a 20 20 20 20     "BEGIN;".    
8300: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8310: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
8320: 6c 6f 62 28 39 30 30 29 29 3b 22 0a 20 20 20 20  lob(900));".    
8330: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8340: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8350: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8360: 3b 20 20 20 20 20 20 2f 2a 20 20 20 20 20 32 20  ;      /*     2 
8370: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8380: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8390: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
83a0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
83b0: 2a 20 20 20 20 20 34 20 2a 2f 22 0a 20 20 20 20  *     4 */".    
83c0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
83d0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
83e0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
83f0: 3b 20 20 20 20 20 20 2f 2a 20 20 20 20 20 38 20  ;      /*     8 
8400: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8410: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8420: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
8430: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
8440: 2a 20 20 20 20 31 36 20 2a 2f 22 0a 20 20 20 20  *    16 */".    
8450: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8460: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8470: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8480: 3b 20 20 20 20 20 20 2f 2a 20 20 20 20 33 32 20  ;      /*    32 
8490: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
84a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
84b0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
84c0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
84d0: 2a 20 20 20 20 36 34 20 2a 2f 22 0a 20 20 20 20  *    64 */".    
84e0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
84f0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8500: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8510: 3b 20 20 20 20 20 20 2f 2a 20 20 20 31 32 38 20  ;      /*   128 
8520: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8530: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8540: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
8550: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
8560: 2a 20 20 20 32 35 36 20 2a 2f 22 0a 20 20 20 20  *   256 */".    
8570: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8580: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8590: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
85a0: 3b 20 20 20 20 20 20 2f 2a 20 20 20 35 31 32 20  ;      /*   512 
85b0: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
85c0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
85d0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
85e0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
85f0: 2a 20 20 31 30 32 34 20 2a 2f 22 0a 20 20 20 20  *  1024 */".    
8600: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8610: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8620: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8630: 3b 20 20 20 20 20 20 2f 2a 20 20 32 30 34 38 20  ;      /*  2048 
8640: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8650: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8660: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
8670: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
8680: 2a 20 20 34 30 39 36 20 2a 2f 22 0a 20 20 20 20  *  4096 */".    
8690: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
86a0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
86b0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
86c0: 3b 20 20 20 20 20 20 2f 2a 20 20 38 31 39 32 20  ;      /*  8192 
86d0: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
86e0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
86f0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
8700: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
8710: 2a 20 31 36 33 38 34 20 2a 2f 22 0a 20 20 20 20  * 16384 */".    
8720: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8730: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8740: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8750: 3b 20 20 20 20 20 20 2f 2a 20 33 32 37 36 38 20  ;      /* 32768 
8760: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8770: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8780: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
8790: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
87a0: 2a 20 36 35 35 33 36 20 2a 2f 22 0a 20 20 20 20  * 65536 */".    
87b0: 20 20 22 43 4f 4d 4d 49 54 3b 22 0a 20 20 29 3b    "COMMIT;".  );
87c0: 0a 20 20 66 69 6c 65 63 6f 70 79 28 26 65 72 72  .  filecopy(&err
87d0: 2c 20 22 74 65 73 74 2e 64 62 22 2c 20 22 74 65  , "test.db", "te
87e0: 73 74 5f 73 76 2e 64 62 22 29 3b 0a 20 20 66 69  st_sv.db");.  fi
87f0: 6c 65 63 6f 70 79 28 26 65 72 72 2c 20 22 74 65  lecopy(&err, "te
8800: 73 74 2e 64 62 2d 77 61 6c 22 2c 20 22 74 65 73  st.db-wal", "tes
8810: 74 5f 73 76 2e 64 62 2d 77 61 6c 22 29 3b 0a 20  t_sv.db-wal");. 
8820: 20 63 6c 6f 73 65 64 62 28 26 65 72 72 2c 20 26   closedb(&err, &
8830: 64 62 29 3b 0a 0a 20 20 66 69 6c 65 63 6f 70 79  db);..  filecopy
8840: 28 26 65 72 72 2c 20 22 74 65 73 74 5f 73 76 2e  (&err, "test_sv.
8850: 64 62 22 2c 20 22 74 65 73 74 2e 64 62 22 29 3b  db", "test.db");
8860: 0a 20 20 66 69 6c 65 63 6f 70 79 28 26 65 72 72  .  filecopy(&err
8870: 2c 20 22 74 65 73 74 5f 73 76 2e 64 62 2d 77 61  , "test_sv.db-wa
8880: 6c 22 2c 20 22 74 65 73 74 2e 64 62 2d 77 61 6c  l", "test.db-wal
8890: 22 29 3b 0a 0a 20 20 69 66 28 20 65 72 72 2e 72  ");..  if( err.r
88a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
88b0: 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 57 41      printf("  WA
88c0: 4c 20 66 69 6c 65 20 69 73 20 25 64 20 62 79 74  L file is %d byt
88d0: 65 73 2c 22 2c 20 28 69 6e 74 29 66 69 6c 65 73  es,", (int)files
88e0: 69 7a 65 28 26 65 72 72 2c 22 74 65 73 74 2e 64  ize(&err,"test.d
88f0: 62 2d 77 61 6c 22 29 29 3b 0a 20 20 20 20 70 72  b-wal"));.    pr
8900: 69 6e 74 66 28 22 20 44 42 20 66 69 6c 65 20 69  intf(" DB file i
8910: 73 20 25 64 2e 5c 6e 22 2c 20 28 69 6e 74 29 66  s %d.\n", (int)f
8920: 69 6c 65 73 69 7a 65 28 26 65 72 72 2c 22 74 65  ilesize(&err,"te
8930: 73 74 2e 64 62 22 29 29 3b 0a 20 20 7d 0a 0a 20  st.db"));.  }.. 
8940: 20 73 65 74 73 74 6f 70 74 69 6d 65 28 26 65 72   setstoptime(&er
8950: 72 2c 20 6e 4d 73 29 3b 0a 20 20 6c 61 75 6e 63  r, nMs);.  launc
8960: 68 5f 74 68 72 65 61 64 28 26 65 72 72 2c 20 26  h_thread(&err, &
8970: 74 68 72 65 61 64 73 2c 20 77 61 6c 74 68 72 65  threads, walthre
8980: 61 64 35 5f 74 68 72 65 61 64 2c 20 30 29 3b 0a  ad5_thread, 0);.
8990: 20 20 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 28    launch_thread(
89a0: 26 65 72 72 2c 20 26 74 68 72 65 61 64 73 2c 20  &err, &threads, 
89b0: 77 61 6c 74 68 72 65 61 64 35 5f 74 68 72 65 61  walthread5_threa
89c0: 64 2c 20 30 29 3b 0a 20 20 6c 61 75 6e 63 68 5f  d, 0);.  launch_
89d0: 74 68 72 65 61 64 28 26 65 72 72 2c 20 26 74 68  thread(&err, &th
89e0: 72 65 61 64 73 2c 20 77 61 6c 74 68 72 65 61 64  reads, walthread
89f0: 35 5f 74 68 72 65 61 64 2c 20 30 29 3b 0a 20 20  5_thread, 0);.  
8a00: 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65  launch_thread(&e
8a10: 72 72 2c 20 26 74 68 72 65 61 64 73 2c 20 77 61  rr, &threads, wa
8a20: 6c 74 68 72 65 61 64 35 5f 74 68 72 65 61 64 2c  lthread5_thread,
8a30: 20 30 29 3b 0a 20 20 6c 61 75 6e 63 68 5f 74 68   0);.  launch_th
8a40: 72 65 61 64 28 26 65 72 72 2c 20 26 74 68 72 65  read(&err, &thre
8a50: 61 64 73 2c 20 77 61 6c 74 68 72 65 61 64 35 5f  ads, walthread5_
8a60: 74 68 72 65 61 64 2c 20 30 29 3b 0a 20 20 6a 6f  thread, 0);.  jo
8a70: 69 6e 5f 61 6c 6c 5f 74 68 72 65 61 64 73 28 26  in_all_threads(&
8a80: 65 72 72 2c 20 26 74 68 72 65 61 64 73 29 3b 0a  err, &threads);.
8a90: 0a 20 20 69 66 28 20 65 72 72 2e 72 63 3d 3d 53  .  if( err.rc==S
8aa0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8ab0: 70 72 69 6e 74 66 28 22 20 20 57 41 4c 20 66 69  printf("  WAL fi
8ac0: 6c 65 20 69 73 20 25 64 20 62 79 74 65 73 2c 22  le is %d bytes,"
8ad0: 2c 20 28 69 6e 74 29 66 69 6c 65 73 69 7a 65 28  , (int)filesize(
8ae0: 26 65 72 72 2c 22 74 65 73 74 2e 64 62 2d 77 61  &err,"test.db-wa
8af0: 6c 22 29 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  l"));.    printf
8b00: 28 22 20 44 42 20 66 69 6c 65 20 69 73 20 25 64  (" DB file is %d
8b10: 2e 5c 6e 22 2c 20 28 69 6e 74 29 66 69 6c 65 73  .\n", (int)files
8b20: 69 7a 65 28 26 65 72 72 2c 22 74 65 73 74 2e 64  ize(&err,"test.d
8b30: 62 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 70 72 69  b"));.  }..  pri
8b40: 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72 28  nt_and_free_err(
8b50: 26 65 72 72 29 3b 0a 7d 0a 0a 2f 2a 2d 2d 2d 2d  &err);.}../*----
8b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ba0: 2d 2d 2d 2d 0a 2a 2a 20 54 65 73 74 20 63 61 73  ----.** Test cas
8bb0: 65 20 22 63 67 74 5f 70 61 67 65 72 5f 31 22 0a  e "cgt_pager_1".
8bc0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 4c 4c 47  */.#define CALLG
8bd0: 52 49 4e 44 54 45 53 54 31 5f 4e 52 4f 57 20 31  RINDTEST1_NROW 1
8be0: 30 30 30 30 0a 73 74 61 74 69 63 20 76 6f 69 64  0000.static void
8bf0: 20 63 67 74 5f 70 61 67 65 72 5f 31 5f 70 6f 70   cgt_pager_1_pop
8c00: 75 6c 61 74 65 28 45 72 72 6f 72 20 2a 70 45 72  ulate(Error *pEr
8c10: 72 2c 20 53 71 6c 69 74 65 20 2a 70 44 62 29 7b  r, Sqlite *pDb){
8c20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8c30: 49 6e 73 65 72 74 20 3d 20 22 49 4e 53 45 52 54  Insert = "INSERT
8c40: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8c50: 3a 69 52 6f 77 2c 20 7a 65 72 6f 62 6c 6f 62 28  :iRow, zeroblob(
8c60: 3a 69 42 6c 6f 62 29 29 22 3b 0a 20 20 69 36 34  :iBlob))";.  i64
8c70: 20 69 52 6f 77 3b 0a 20 20 73 71 6c 5f 73 63 72   iRow;.  sql_scr
8c80: 69 70 74 28 70 45 72 72 2c 20 70 44 62 2c 20 22  ipt(pErr, pDb, "
8c90: 42 45 47 49 4e 22 29 3b 0a 20 20 66 6f 72 28 69  BEGIN");.  for(i
8ca0: 52 6f 77 3d 31 3b 20 69 52 6f 77 3c 3d 43 41 4c  Row=1; iRow<=CAL
8cb0: 4c 47 52 49 4e 44 54 45 53 54 31 5f 4e 52 4f 57  LGRINDTEST1_NROW
8cc0: 3b 20 69 52 6f 77 2b 2b 29 7b 0a 20 20 20 20 69  ; iRow++){.    i
8cd0: 36 34 20 69 42 6c 6f 62 20 3d 20 36 30 30 20 2b  64 iBlob = 600 +
8ce0: 20 28 69 52 6f 77 25 33 30 30 29 3b 0a 20 20 20   (iRow%300);.   
8cf0: 20 65 78 65 63 73 71 6c 28 70 45 72 72 2c 20 70   execsql(pErr, p
8d00: 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 26 69 52  Db, zInsert, &iR
8d10: 6f 77 2c 20 26 69 42 6c 6f 62 29 3b 0a 20 20 7d  ow, &iBlob);.  }
8d20: 0a 20 20 73 71 6c 5f 73 63 72 69 70 74 28 70 45  .  sql_script(pE
8d30: 72 72 2c 20 70 44 62 2c 20 22 43 4f 4d 4d 49 54  rr, pDb, "COMMIT
8d40: 22 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ");.}.static voi
8d50: 64 20 63 67 74 5f 70 61 67 65 72 5f 31 5f 75 70  d cgt_pager_1_up
8d60: 64 61 74 65 28 45 72 72 6f 72 20 2a 70 45 72 72  date(Error *pErr
8d70: 2c 20 53 71 6c 69 74 65 20 2a 70 44 62 29 7b 0a  , Sqlite *pDb){.
8d80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
8d90: 70 64 61 74 65 20 3d 20 22 55 50 44 41 54 45 20  pdate = "UPDATE 
8da0: 74 31 20 53 45 54 20 62 20 3d 20 7a 65 72 6f 62  t1 SET b = zerob
8db0: 6c 6f 62 28 3a 69 42 6c 6f 62 29 20 57 48 45 52  lob(:iBlob) WHER
8dc0: 45 20 61 20 3d 20 3a 69 52 6f 77 22 3b 0a 20 20  E a = :iRow";.  
8dd0: 69 36 34 20 69 52 6f 77 3b 0a 20 20 73 71 6c 5f  i64 iRow;.  sql_
8de0: 73 63 72 69 70 74 28 70 45 72 72 2c 20 70 44 62  script(pErr, pDb
8df0: 2c 20 22 42 45 47 49 4e 22 29 3b 0a 20 20 66 6f  , "BEGIN");.  fo
8e00: 72 28 69 52 6f 77 3d 31 3b 20 69 52 6f 77 3c 3d  r(iRow=1; iRow<=
8e10: 43 41 4c 4c 47 52 49 4e 44 54 45 53 54 31 5f 4e  CALLGRINDTEST1_N
8e20: 52 4f 57 3b 20 69 52 6f 77 2b 2b 29 7b 0a 20 20  ROW; iRow++){.  
8e30: 20 20 69 36 34 20 69 42 6c 6f 62 20 3d 20 36 30    i64 iBlob = 60
8e40: 30 20 2b 20 28 28 69 52 6f 77 2b 31 30 30 29 25  0 + ((iRow+100)%
8e50: 33 30 30 29 3b 0a 20 20 20 20 65 78 65 63 73 71  300);.    execsq
8e60: 6c 28 70 45 72 72 2c 20 70 44 62 2c 20 7a 55 70  l(pErr, pDb, zUp
8e70: 64 61 74 65 2c 20 26 69 42 6c 6f 62 2c 20 26 69  date, &iBlob, &i
8e80: 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 5f  Row);.  }.  sql_
8e90: 73 63 72 69 70 74 28 70 45 72 72 2c 20 70 44 62  script(pErr, pDb
8ea0: 2c 20 22 43 4f 4d 4d 49 54 22 29 3b 0a 7d 0a 73  , "COMMIT");.}.s
8eb0: 74 61 74 69 63 20 76 6f 69 64 20 63 67 74 5f 70  tatic void cgt_p
8ec0: 61 67 65 72 5f 31 5f 72 65 61 64 28 45 72 72 6f  ager_1_read(Erro
8ed0: 72 20 2a 70 45 72 72 2c 20 53 71 6c 69 74 65 20  r *pErr, Sqlite 
8ee0: 2a 70 44 62 29 7b 0a 20 20 69 36 34 20 69 52 6f  *pDb){.  i64 iRo
8ef0: 77 3b 0a 20 20 73 71 6c 5f 73 63 72 69 70 74 28  w;.  sql_script(
8f00: 70 45 72 72 2c 20 70 44 62 2c 20 22 42 45 47 49  pErr, pDb, "BEGI
8f10: 4e 22 29 3b 0a 20 20 66 6f 72 28 69 52 6f 77 3d  N");.  for(iRow=
8f20: 31 3b 20 69 52 6f 77 3c 3d 43 41 4c 4c 47 52 49  1; iRow<=CALLGRI
8f30: 4e 44 54 45 53 54 31 5f 4e 52 4f 57 3b 20 69 52  NDTEST1_NROW; iR
8f40: 6f 77 2b 2b 29 7b 0a 20 20 20 20 65 78 65 63 73  ow++){.    execs
8f50: 71 6c 28 70 45 72 72 2c 20 70 44 62 2c 20 22 53  ql(pErr, pDb, "S
8f60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
8f70: 57 48 45 52 45 20 61 20 3d 20 3a 69 52 6f 77 22  WHERE a = :iRow"
8f80: 2c 20 26 69 52 6f 77 29 3b 0a 20 20 7d 0a 20 20  , &iRow);.  }.  
8f90: 73 71 6c 5f 73 63 72 69 70 74 28 70 45 72 72 2c  sql_script(pErr,
8fa0: 20 70 44 62 2c 20 22 43 4f 4d 4d 49 54 22 29 3b   pDb, "COMMIT");
8fb0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
8fc0: 67 74 5f 70 61 67 65 72 5f 31 28 69 6e 74 20 6e  gt_pager_1(int n
8fd0: 4d 73 29 7b 0a 20 20 76 6f 69 64 20 28 2a 78 53  Ms){.  void (*xS
8fe0: 75 62 29 28 45 72 72 6f 72 20 2a 2c 20 53 71 6c  ub)(Error *, Sql
8ff0: 69 74 65 20 2a 29 3b 0a 20 20 45 72 72 6f 72 20  ite *);.  Error 
9000: 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20 53 71 6c  err = {0};.  Sql
9010: 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 0a 0a 20  ite db = {0};.. 
9020: 20 6f 70 65 6e 64 62 28 26 65 72 72 2c 20 26 64   opendb(&err, &d
9030: 62 2c 20 22 74 65 73 74 2e 64 62 22 2c 20 31 29  b, "test.db", 1)
9040: 3b 0a 20 20 73 71 6c 5f 73 63 72 69 70 74 28 26  ;.  sql_script(&
9050: 65 72 72 2c 20 26 64 62 2c 0a 20 20 20 20 20 20  err, &db,.      
9060: 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
9070: 7a 65 20 3d 20 32 30 30 30 3b 22 0a 20 20 20 20  ze = 2000;".    
9080: 20 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73    "PRAGMA page_s
9090: 69 7a 65 20 3d 20 31 30 32 34 3b 22 0a 20 20 20  ize = 1024;".   
90a0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
90b0: 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52   t1(a INTEGER PR
90c0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 42 4c 4f  IMARY KEY, b BLO
90d0: 42 29 3b 22 0a 20 20 29 3b 0a 0a 20 20 78 53 75  B);".  );..  xSu
90e0: 62 20 3d 20 63 67 74 5f 70 61 67 65 72 5f 31 5f  b = cgt_pager_1_
90f0: 70 6f 70 75 6c 61 74 65 3b 20 78 53 75 62 28 26  populate; xSub(&
9100: 65 72 72 2c 20 26 64 62 29 3b 0a 20 20 78 53 75  err, &db);.  xSu
9110: 62 20 3d 20 63 67 74 5f 70 61 67 65 72 5f 31 5f  b = cgt_pager_1_
9120: 75 70 64 61 74 65 3b 20 20 20 78 53 75 62 28 26  update;   xSub(&
9130: 65 72 72 2c 20 26 64 62 29 3b 0a 20 20 78 53 75  err, &db);.  xSu
9140: 62 20 3d 20 63 67 74 5f 70 61 67 65 72 5f 31 5f  b = cgt_pager_1_
9150: 72 65 61 64 3b 20 20 20 20 20 78 53 75 62 28 26  read;     xSub(&
9160: 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20 20 63 6c  err, &db);..  cl
9170: 6f 73 65 64 62 28 26 65 72 72 2c 20 26 64 62 29  osedb(&err, &db)
9180: 3b 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72  ;.  print_and_fr
9190: 65 65 5f 65 72 72 28 26 65 72 72 29 3b 0a 7d 0a  ee_err(&err);.}.
91a0: 0a 2f 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*-------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 54  -----------.** T
91f0: 65 73 74 20 63 61 73 65 20 22 64 79 6e 61 6d 69  est case "dynami
9200: 63 5f 74 72 69 67 67 65 72 73 22 0a 2a 2a 0a 2a  c_triggers".**.*
9210: 2a 20 20 20 54 77 6f 20 74 68 72 65 61 64 73 20  *   Two threads 
9220: 65 78 65 63 75 74 69 6e 67 20 73 74 61 74 65 6d  executing statem
9230: 65 6e 74 73 20 74 68 61 74 20 63 61 75 73 65 20  ents that cause 
9240: 64 65 65 70 6c 79 20 6e 65 73 74 65 64 20 74 72  deeply nested tr
9250: 69 67 67 65 72 73 0a 2a 2a 20 20 20 74 6f 20 66  iggers.**   to f
9260: 69 72 65 2e 20 41 6e 64 20 6f 6e 65 20 74 68 72  ire. And one thr
9270: 65 61 64 20 62 75 73 69 6c 79 20 63 72 65 61 74  ead busily creat
9280: 69 6e 67 20 61 6e 64 20 64 65 6c 65 74 69 6e 67  ing and deleting
9290: 20 74 72 69 67 67 65 72 73 2e 20 54 68 69 73 0a   triggers. This.
92a0: 2a 2a 20 20 20 69 73 20 61 6e 20 61 74 74 65 6d  **   is an attem
92b0: 70 74 20 74 6f 20 66 69 6e 64 20 61 20 62 75 67  pt to find a bug
92c0: 20 72 65 70 6f 72 74 65 64 20 74 6f 20 75 73 2e   reported to us.
92d0: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 63 68 61 72  .*/..static char
92e0: 20 2a 64 79 6e 61 6d 69 63 5f 74 72 69 67 67 65   *dynamic_trigge
92f0: 72 73 5f 31 28 69 6e 74 20 69 54 69 64 2c 20 69  rs_1(int iTid, i
9300: 6e 74 20 69 41 72 67 29 7b 0a 20 20 45 72 72 6f  nt iArg){.  Erro
9310: 72 20 65 72 72 20 3d 20 7b 30 7d 3b 20 20 20 20  r err = {0};    
9320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9330: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65  rror code and me
9340: 73 73 61 67 65 20 2a 2f 0a 20 20 53 71 6c 69 74  ssage */.  Sqlit
9350: 65 20 64 62 20 3d 20 7b 30 7d 3b 20 20 20 20 20  e db = {0};     
9360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
9370: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
9380: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
9390: 74 20 6e 44 72 6f 70 20 3d 20 30 3b 0a 20 20 69  t nDrop = 0;.  i
93a0: 6e 74 20 6e 43 72 65 61 74 65 20 3d 20 30 3b 0a  nt nCreate = 0;.
93b0: 0a 20 20 6f 70 65 6e 64 62 28 26 65 72 72 2c 20  .  opendb(&err, 
93c0: 26 64 62 2c 20 22 74 65 73 74 2e 64 62 22 2c 20  &db, "test.db", 
93d0: 30 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 74 69  0);.  while( !ti
93e0: 6d 65 74 6f 73 74 6f 70 28 26 65 72 72 29 20 29  metostop(&err) )
93f0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  {.    int i;..  
9400: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 39 3b 20    for(i=1; i<9; 
9410: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
9420: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
9430: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
9440: 20 20 22 43 52 45 41 54 45 20 54 52 49 47 47 45    "CREATE TRIGGE
9450: 52 20 69 74 72 25 64 20 42 45 46 4f 52 45 20 49  R itr%d BEFORE I
9460: 4e 53 45 52 54 20 4f 4e 20 74 25 64 20 42 45 47  NSERT ON t%d BEG
9470: 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  IN ".          "
9480: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 25 64 20  INSERT INTO t%d 
9490: 56 41 4c 55 45 53 28 6e 65 77 2e 78 2c 20 6e 65  VALUES(new.x, ne
94a0: 77 2e 79 29 3b 22 0a 20 20 20 20 20 20 20 20 22  w.y);".        "
94b0: 45 4e 44 3b 22 2c 20 69 2c 20 69 2c 20 69 2b 31  END;", i, i, i+1
94c0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
94d0: 65 78 65 63 73 71 6c 28 26 65 72 72 2c 20 26 64  execsql(&err, &d
94e0: 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  b, zSql);.      
94f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
9500: 6c 29 3b 0a 20 20 20 20 20 20 6e 43 72 65 61 74  l);.      nCreat
9510: 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e++;.    }..    
9520: 66 6f 72 28 69 3d 31 3b 20 69 3c 39 3b 20 69 2b  for(i=1; i<9; i+
9530: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
9540: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
9550: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
9560: 22 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  "CREATE TRIGGER 
9570: 64 74 72 25 64 20 42 45 46 4f 52 45 20 44 45 4c  dtr%d BEFORE DEL
9580: 45 54 45 20 4f 4e 20 74 25 64 20 42 45 47 49 4e  ETE ON t%d BEGIN
9590: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 45   ".          "DE
95a0: 4c 45 54 45 20 46 52 4f 4d 20 74 25 64 20 57 48  LETE FROM t%d WH
95b0: 45 52 45 20 78 20 3d 20 6f 6c 64 2e 78 3b 20 22  ERE x = old.x; "
95c0: 0a 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c  .        "END;",
95d0: 20 69 2c 20 69 2c 20 69 2b 31 0a 20 20 20 20 20   i, i, i+1.     
95e0: 20 29 3b 0a 20 20 20 20 20 20 65 78 65 63 73 71   );.      execsq
95f0: 6c 28 26 65 72 72 2c 20 26 64 62 2c 20 7a 53 71  l(&err, &db, zSq
9600: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
9610: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
9620: 20 20 20 20 6e 43 72 65 61 74 65 2b 2b 3b 0a 20      nCreate++;. 
9630: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
9640: 31 3b 20 69 3c 39 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<9; i++){.  
9650: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
9660: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9670: 28 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 69  ("DROP TRIGGER i
9680: 74 72 25 64 22 2c 20 69 29 3b 0a 20 20 20 20 20  tr%d", i);.     
9690: 20 65 78 65 63 73 71 6c 28 26 65 72 72 2c 20 26   execsql(&err, &
96a0: 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  db, zSql);.     
96b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
96c0: 71 6c 29 3b 0a 20 20 20 20 20 20 6e 44 72 6f 70  ql);.      nDrop
96d0: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  ++;.    }..    f
96e0: 6f 72 28 69 3d 31 3b 20 69 3c 39 3b 20 69 2b 2b  or(i=1; i<9; i++
96f0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
9700: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
9710: 72 69 6e 74 66 28 22 44 52 4f 50 20 54 52 49 47  rintf("DROP TRIG
9720: 47 45 52 20 64 74 72 25 64 22 2c 20 69 29 3b 0a  GER dtr%d", i);.
9730: 20 20 20 20 20 20 65 78 65 63 73 71 6c 28 26 65        execsql(&e
9740: 72 72 2c 20 26 64 62 2c 20 7a 53 71 6c 29 3b 0a  rr, &db, zSql);.
9750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9760: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ee(zSql);.      
9770: 6e 44 72 6f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nDrop++;.    }. 
9780: 20 7d 0a 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f   }..  print_and_
9790: 66 72 65 65 5f 65 72 72 28 26 65 72 72 29 3b 0a  free_err(&err);.
97a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
97b0: 5f 6d 70 72 69 6e 74 66 28 22 25 64 20 63 72 65  _mprintf("%d cre
97c0: 61 74 65 64 2c 20 25 64 20 64 72 6f 70 70 65 64  ated, %d dropped
97d0: 22 2c 20 6e 43 72 65 61 74 65 2c 20 6e 44 72 6f  ", nCreate, nDro
97e0: 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  p);.}..static ch
97f0: 61 72 20 2a 64 79 6e 61 6d 69 63 5f 74 72 69 67  ar *dynamic_trig
9800: 67 65 72 73 5f 32 28 69 6e 74 20 69 54 69 64 2c  gers_2(int iTid,
9810: 20 69 6e 74 20 69 41 72 67 29 7b 0a 20 20 45 72   int iArg){.  Er
9820: 72 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 20 20  ror err = {0};  
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9840: 20 45 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   Error code and 
9850: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 53 71 6c  message */.  Sql
9860: 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 20 20 20  ite db = {0};   
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9880: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
9890: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
98a0: 69 36 34 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20  i64 iVal = 0;.  
98b0: 69 6e 74 20 6e 49 6e 73 65 72 74 20 3d 20 30 3b  int nInsert = 0;
98c0: 0a 20 20 69 6e 74 20 6e 44 65 6c 65 74 65 20 3d  .  int nDelete =
98d0: 20 30 3b 0a 0a 20 20 6f 70 65 6e 64 62 28 26 65   0;..  opendb(&e
98e0: 72 72 2c 20 26 64 62 2c 20 22 74 65 73 74 2e 64  rr, &db, "test.d
98f0: 62 22 2c 20 30 29 3b 0a 20 20 77 68 69 6c 65 28  b", 0);.  while(
9900: 20 21 74 69 6d 65 74 6f 73 74 6f 70 28 26 65 72   !timetostop(&er
9910: 72 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  r) ){.    do {. 
9920: 20 20 20 20 20 69 56 61 6c 20 3d 20 28 69 56 61       iVal = (iVa
9930: 6c 2b 31 29 25 31 30 30 3b 0a 20 20 20 20 20 20  l+1)%100;.      
9940: 65 78 65 63 73 71 6c 28 26 65 72 72 2c 20 26 64  execsql(&err, &d
9950: 62 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  b, "INSERT INTO 
9960: 74 31 20 56 41 4c 55 45 53 28 3a 69 58 2c 20 3a  t1 VALUES(:iX, :
9970: 69 59 2b 31 29 22 2c 20 26 69 56 61 6c 2c 20 26  iY+1)", &iVal, &
9980: 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 6e 49 6e  iVal);.      nIn
9990: 73 65 72 74 2b 2b 3b 0a 20 20 20 20 7d 20 77 68  sert++;.    } wh
99a0: 69 6c 65 28 20 69 56 61 6c 20 29 3b 0a 0a 20 20  ile( iVal );..  
99b0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 56 61    do {.      iVa
99c0: 6c 20 3d 20 28 69 56 61 6c 2b 31 29 25 31 30 30  l = (iVal+1)%100
99d0: 3b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 28  ;.      execsql(
99e0: 26 65 72 72 2c 20 26 64 62 2c 20 22 44 45 4c 45  &err, &db, "DELE
99f0: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
9a00: 20 78 20 3d 20 3a 69 58 22 2c 20 26 69 56 61 6c   x = :iX", &iVal
9a10: 29 3b 0a 20 20 20 20 20 20 6e 44 65 6c 65 74 65  );.      nDelete
9a20: 2b 2b 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 28  ++;.    } while(
9a30: 20 69 56 61 6c 20 29 3b 0a 20 20 7d 0a 0a 20 20   iVal );.  }..  
9a40: 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65  print_and_free_e
9a50: 72 72 28 26 65 72 72 29 3b 0a 20 20 72 65 74 75  rr(&err);.  retu
9a60: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  rn sqlite3_mprin
9a70: 74 66 28 22 25 64 20 69 6e 73 65 72 74 73 2c 20  tf("%d inserts, 
9a80: 25 64 20 64 65 6c 65 74 65 73 22 2c 20 6e 49 6e  %d deletes", nIn
9a90: 73 65 72 74 2c 20 6e 44 65 6c 65 74 65 29 3b 0a  sert, nDelete);.
9aa0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  }..static void d
9ab0: 79 6e 61 6d 69 63 5f 74 72 69 67 67 65 72 73 28  ynamic_triggers(
9ac0: 69 6e 74 20 6e 4d 73 29 7b 0a 20 20 45 72 72 6f  int nMs){.  Erro
9ad0: 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20 53  r err = {0};.  S
9ae0: 71 6c 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 0a  qlite db = {0};.
9af0: 20 20 54 68 72 65 61 64 73 65 74 20 74 68 72 65    Threadset thre
9b00: 61 64 73 20 3d 20 7b 30 7d 3b 0a 0a 20 20 6f 70  ads = {0};..  op
9b10: 65 6e 64 62 28 26 65 72 72 2c 20 26 64 62 2c 20  endb(&err, &db, 
9b20: 22 74 65 73 74 2e 64 62 22 2c 20 31 29 3b 0a 20  "test.db", 1);. 
9b30: 20 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72   sql_script(&err
9b40: 2c 20 26 64 62 2c 20 0a 20 20 20 20 20 20 22 50  , &db, .      "P
9b50: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
9b60: 3d 20 31 30 32 34 3b 22 0a 20 20 20 20 20 20 22  = 1024;".      "
9b70: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
9b80: 6f 64 65 20 3d 20 57 41 4c 3b 22 0a 20 20 20 20  ode = WAL;".    
9b90: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
9ba0: 74 31 28 78 2c 20 79 29 3b 22 0a 20 20 20 20 20  t1(x, y);".     
9bb0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
9bc0: 32 28 78 2c 20 79 29 3b 22 0a 20 20 20 20 20 20  2(x, y);".      
9bd0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33  "CREATE TABLE t3
9be0: 28 78 2c 20 79 29 3b 22 0a 20 20 20 20 20 20 22  (x, y);".      "
9bf0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
9c00: 78 2c 20 79 29 3b 22 0a 20 20 20 20 20 20 22 43  x, y);".      "C
9c10: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 78  REATE TABLE t5(x
9c20: 2c 20 79 29 3b 22 0a 20 20 20 20 20 20 22 43 52  , y);".      "CR
9c30: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 78 2c  EATE TABLE t6(x,
9c40: 20 79 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45   y);".      "CRE
9c50: 41 54 45 20 54 41 42 4c 45 20 74 37 28 78 2c 20  ATE TABLE t7(x, 
9c60: 79 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41  y);".      "CREA
9c70: 54 45 20 54 41 42 4c 45 20 74 38 28 78 2c 20 79  TE TABLE t8(x, y
9c80: 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41 54  );".      "CREAT
9c90: 45 20 54 41 42 4c 45 20 74 39 28 78 2c 20 79 29  E TABLE t9(x, y)
9ca0: 3b 22 0a 20 20 29 3b 0a 0a 20 20 73 65 74 73 74  ;".  );..  setst
9cb0: 6f 70 74 69 6d 65 28 26 65 72 72 2c 20 6e 4d 73  optime(&err, nMs
9cc0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  );..  sqlite3_en
9cd0: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
9ce0: 65 28 31 29 3b 0a 20 20 6c 61 75 6e 63 68 5f 74  e(1);.  launch_t
9cf0: 68 72 65 61 64 28 26 65 72 72 2c 20 26 74 68 72  hread(&err, &thr
9d00: 65 61 64 73 2c 20 64 79 6e 61 6d 69 63 5f 74 72  eads, dynamic_tr
9d10: 69 67 67 65 72 73 5f 32 2c 20 30 29 3b 0a 20 20  iggers_2, 0);.  
9d20: 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65  launch_thread(&e
9d30: 72 72 2c 20 26 74 68 72 65 61 64 73 2c 20 64 79  rr, &threads, dy
9d40: 6e 61 6d 69 63 5f 74 72 69 67 67 65 72 73 5f 32  namic_triggers_2
9d50: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
9d60: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
9d70: 63 68 65 28 30 29 3b 0a 0a 20 20 73 6c 65 65 70  che(0);..  sleep
9d80: 28 32 29 3b 0a 0a 20 20 6c 61 75 6e 63 68 5f 74  (2);..  launch_t
9d90: 68 72 65 61 64 28 26 65 72 72 2c 20 26 74 68 72  hread(&err, &thr
9da0: 65 61 64 73 2c 20 64 79 6e 61 6d 69 63 5f 74 72  eads, dynamic_tr
9db0: 69 67 67 65 72 73 5f 32 2c 20 30 29 3b 0a 20 20  iggers_2, 0);.  
9dc0: 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65  launch_thread(&e
9dd0: 72 72 2c 20 26 74 68 72 65 61 64 73 2c 20 64 79  rr, &threads, dy
9de0: 6e 61 6d 69 63 5f 74 72 69 67 67 65 72 73 5f 31  namic_triggers_1
9df0: 2c 20 30 29 3b 0a 0a 20 20 6a 6f 69 6e 5f 61 6c  , 0);..  join_al
9e00: 6c 5f 74 68 72 65 61 64 73 28 26 65 72 72 2c 20  l_threads(&err, 
9e10: 26 74 68 72 65 61 64 73 29 3b 0a 0a 20 20 70 72  &threads);..  pr
9e20: 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72  int_and_free_err
9e30: 28 26 65 72 72 29 3b 0a 7d 0a 0a 23 69 6e 63 6c  (&err);.}..#incl
9e40: 75 64 65 20 22 74 74 33 5f 63 68 65 63 6b 70 6f  ude "tt3_checkpo
9e50: 69 6e 74 2e 63 22 0a 0a 69 6e 74 20 6d 61 69 6e  int.c"..int main
9e60: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
9e70: 2a 2a 61 72 67 76 29 7b 0a 20 20 73 74 72 75 63  **argv){.  struc
9e80: 74 20 54 68 72 65 61 64 54 65 73 74 20 7b 0a 20  t ThreadTest {. 
9e90: 20 20 20 76 6f 69 64 20 28 2a 78 54 65 73 74 29     void (*xTest)
9ea0: 28 69 6e 74 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (int);.    const
9eb0: 20 63 68 61 72 20 2a 7a 54 65 73 74 3b 0a 20 20   char *zTest;.  
9ec0: 20 20 69 6e 74 20 6e 4d 73 3b 0a 20 20 7d 20 61    int nMs;.  } a
9ed0: 54 65 73 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  Test[] = {.    {
9ee0: 20 77 61 6c 74 68 72 65 61 64 31 2c 20 22 77 61   walthread1, "wa
9ef0: 6c 74 68 72 65 61 64 31 22 2c 20 32 30 30 30 30  lthread1", 20000
9f00: 20 7d 2c 0a 20 20 20 20 7b 20 77 61 6c 74 68 72   },.    { walthr
9f10: 65 61 64 32 2c 20 22 77 61 6c 74 68 72 65 61 64  ead2, "walthread
9f20: 32 22 2c 20 32 30 30 30 30 20 7d 2c 0a 20 20 20  2", 20000 },.   
9f30: 20 7b 20 77 61 6c 74 68 72 65 61 64 33 2c 20 22   { walthread3, "
9f40: 77 61 6c 74 68 72 65 61 64 33 22 2c 20 32 30 30  walthread3", 200
9f50: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 77 61 6c 74  00 },.    { walt
9f60: 68 72 65 61 64 34 2c 20 22 77 61 6c 74 68 72 65  hread4, "walthre
9f70: 61 64 34 22 2c 20 32 30 30 30 30 20 7d 2c 0a 20  ad4", 20000 },. 
9f80: 20 20 20 7b 20 77 61 6c 74 68 72 65 61 64 35 2c     { walthread5,
9f90: 20 22 77 61 6c 74 68 72 65 61 64 35 22 2c 20 20   "walthread5",  
9fa0: 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 77 61  1000 },.    { wa
9fb0: 6c 74 68 72 65 61 64 35 2c 20 22 77 61 6c 74 68  lthread5, "walth
9fc0: 72 65 61 64 35 22 2c 20 20 31 30 30 30 20 7d 2c  read5",  1000 },
9fd0: 0a 20 20 20 20 0a 20 20 20 20 7b 20 63 67 74 5f  .    .    { cgt_
9fe0: 70 61 67 65 72 5f 31 2c 20 20 20 20 20 20 22 63  pager_1,      "c
9ff0: 67 74 5f 70 61 67 65 72 5f 31 22 2c 20 30 20 7d  gt_pager_1", 0 }
a000: 2c 0a 20 20 20 20 7b 20 64 79 6e 61 6d 69 63 5f  ,.    { dynamic_
a010: 74 72 69 67 67 65 72 73 2c 20 22 64 79 6e 61 6d  triggers, "dynam
a020: 69 63 5f 74 72 69 67 67 65 72 73 22 2c 20 32 30  ic_triggers", 20
a030: 30 30 30 20 7d 2c 0a 0a 20 20 20 20 7b 20 63 68  000 },..    { ch
a040: 65 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76 61 74  eckpoint_starvat
a050: 69 6f 6e 5f 31 2c 20 22 63 68 65 63 6b 70 6f 69  ion_1, "checkpoi
a060: 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e 5f 31 22  nt_starvation_1"
a070: 2c 20 31 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  , 10000 },.    {
a080: 20 63 68 65 63 6b 70 6f 69 6e 74 5f 73 74 61 72   checkpoint_star
a090: 76 61 74 69 6f 6e 5f 32 2c 20 22 63 68 65 63 6b  vation_2, "check
a0a0: 70 6f 69 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e  point_starvation
a0b0: 5f 32 22 2c 20 31 30 30 30 30 20 7d 2c 0a 20 20  _2", 10000 },.  
a0c0: 7d 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  };..  int i;.  c
a0d0: 68 61 72 20 2a 7a 54 65 73 74 20 3d 20 30 3b 0a  har *zTest = 0;.
a0e0: 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30 3b    int nTest = 0;
a0f0: 0a 20 20 69 6e 74 20 62 54 65 73 74 66 6f 75 6e  .  int bTestfoun
a100: 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 50 72  d = 0;.  int bPr
a110: 65 66 69 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28  efix = 0;..  if(
a120: 20 61 72 67 63 3e 32 20 29 20 67 6f 74 6f 20 75   argc>2 ) goto u
a130: 73 61 67 65 3b 0a 20 20 69 66 28 20 61 72 67 63  sage;.  if( argc
a140: 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 54 65 73 74  ==2 ){.    zTest
a150: 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20 20 20   = argv[1];.    
a160: 6e 54 65 73 74 20 3d 20 73 74 72 6c 65 6e 28 7a  nTest = strlen(z
a170: 54 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 7a  Test);.    if( z
a180: 54 65 73 74 5b 6e 54 65 73 74 2d 31 5d 3d 3d 27  Test[nTest-1]=='
a190: 2a 27 20 29 7b 0a 20 20 20 20 20 20 6e 54 65 73  *' ){.      nTes
a1a0: 74 2d 2d 3b 0a 20 20 20 20 20 20 62 50 72 65 66  t--;.      bPref
a1b0: 69 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ix = 1;.    }.  
a1c0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  }..  sqlite3_con
a1d0: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
a1e0: 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 29 3b 0a  G_MULTITHREAD);.
a1f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
a200: 7a 65 6f 66 28 61 54 65 73 74 29 2f 73 69 7a 65  zeof(aTest)/size
a210: 6f 66 28 61 54 65 73 74 5b 30 5d 29 3b 20 69 2b  of(aTest[0]); i+
a220: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e  +){.    char con
a230: 73 74 20 2a 7a 20 3d 20 61 54 65 73 74 5b 69 5d  st *z = aTest[i]
a240: 2e 7a 54 65 73 74 3b 0a 20 20 20 20 69 6e 74 20  .zTest;.    int 
a250: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
a260: 20 20 20 69 66 28 20 21 7a 54 65 73 74 20 7c 7c     if( !zTest ||
a270: 20 28 28 62 50 72 65 66 69 78 20 7c 7c 20 6e 3d   ((bPrefix || n=
a280: 3d 6e 54 65 73 74 29 20 26 26 20 30 3d 3d 73 74  =nTest) && 0==st
a290: 72 6e 63 6d 70 28 7a 54 65 73 74 2c 20 7a 2c 20  rncmp(zTest, z, 
a2a0: 6e 54 65 73 74 29 29 20 29 7b 0a 20 20 20 20 20  nTest)) ){.     
a2b0: 20 70 72 69 6e 74 66 28 22 52 75 6e 6e 69 6e 67   printf("Running
a2c0: 20 25 73 20 66 6f 72 20 25 64 20 73 65 63 6f 6e   %s for %d secon
a2d0: 64 73 2e 2e 2e 5c 6e 22 2c 20 7a 2c 20 61 54 65  ds...\n", z, aTe
a2e0: 73 74 5b 69 5d 2e 6e 4d 73 2f 31 30 30 30 29 3b  st[i].nMs/1000);
a2f0: 0a 20 20 20 20 20 20 61 54 65 73 74 5b 69 5d 2e  .      aTest[i].
a300: 78 54 65 73 74 28 61 54 65 73 74 5b 69 5d 2e 6e  xTest(aTest[i].n
a310: 4d 73 29 3b 0a 20 20 20 20 20 20 62 54 65 73 74  Ms);.      bTest
a320: 66 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20  found++;.    }. 
a330: 20 7d 0a 20 20 69 66 28 20 62 54 65 73 74 66 6f   }.  if( bTestfo
a340: 75 6e 64 3d 3d 30 20 29 20 67 6f 74 6f 20 75 73  und==0 ) goto us
a350: 61 67 65 3b 0a 0a 20 20 70 72 69 6e 74 66 28 22  age;..  printf("
a360: 54 6f 74 61 6c 20 6f 66 20 25 64 20 65 72 72 6f  Total of %d erro
a370: 72 73 20 61 63 72 6f 73 73 20 61 6c 6c 20 74 65  rs across all te
a380: 73 74 73 5c 6e 22 2c 20 6e 47 6c 6f 62 61 6c 45  sts\n", nGlobalE
a390: 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6e  rr);.  return (n
a3a0: 47 6c 6f 62 61 6c 45 72 72 3e 30 20 3f 20 32 35  GlobalErr>0 ? 25
a3b0: 35 20 3a 20 30 29 3b 0a 0a 20 75 73 61 67 65 3a  5 : 0);.. usage:
a3c0: 0a 20 20 70 72 69 6e 74 66 28 22 55 73 61 67 65  .  printf("Usage
a3d0: 3a 20 25 73 20 5b 74 65 73 74 6e 61 6d 65 7c 74  : %s [testname|t
a3e0: 65 73 74 70 72 65 66 69 78 2a 5d 5c 6e 22 2c 20  estprefix*]\n", 
a3f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 70 72 69 6e  argv[0]);.  prin
a400: 74 66 28 22 41 76 61 69 6c 61 62 6c 65 20 74 65  tf("Available te
a410: 73 74 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20  sts are:\n");.  
a420: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
a430: 66 28 61 54 65 73 74 29 2f 73 69 7a 65 6f 66 28  f(aTest)/sizeof(
a440: 61 54 65 73 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b  aTest[0]); i++){
a450: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20  .    printf("   
a460: 25 73 5c 6e 22 2c 20 61 54 65 73 74 5b 69 5d 2e  %s\n", aTest[i].
a470: 7a 54 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 72  zTest);.  }..  r
a480: 65 74 75 72 6e 20 32 35 34 3b 0a 7d 0a 0a 0a     eturn 254;.}...