/ Hex Artifact Content
Login

Artifact 66c2693d888f9ed256d54d70dd60f569d92c12cf:


0000: 2f 2a 0a 2a 2a 20 32 30 31 30 2d 30 37 2d 32 32  /*.** 2010-07-22
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  **.** The code i
0180: 6e 20 74 68 69 73 20 66 69 6c 65 20 72 75 6e 73  n this file runs
0190: 20 61 20 66 65 77 20 6d 75 6c 74 69 2d 74 68 72   a few multi-thr
01a0: 65 61 64 65 64 20 74 65 73 74 20 63 61 73 65 73  eaded test cases
01b0: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 53 51   using the.** SQ
01c0: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 49 74  Lite library. It
01d0: 20 63 61 6e 20 62 65 20 63 6f 6d 70 69 6c 65 64   can be compiled
01e0: 20 74 6f 20 61 6e 20 65 78 65 63 75 74 61 62 6c   to an executabl
01f0: 65 20 6f 6e 20 75 6e 69 78 20 75 73 69 6e 67 20  e on unix using 
0200: 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
0210: 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20   command:.**.** 
0220: 20 20 67 63 63 20 2d 4f 32 20 74 68 72 65 61 64    gcc -O2 thread
0230: 74 65 73 74 33 2e 63 20 73 71 6c 69 74 65 33 2e  test3.c sqlite3.
0240: 63 20 2d 6c 64 6c 20 2d 6c 70 74 68 72 65 61 64  c -ldl -lpthread
0250: 20 2d 6c 6d 0a 2a 2a 0a 2a 2a 20 45 76 65 6e 20   -lm.**.** Even 
0260: 74 68 6f 75 67 68 20 74 68 72 65 61 64 74 65 73  though threadtes
0270: 74 33 2e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79  t3.c is the only
0280: 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66   C source code f
0290: 69 6c 65 20 6d 65 6e 74 69 6f 6e 65 64 20 6f 6e  ile mentioned on
02a0: 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  .** the compiler
02b0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2c 20 23   command-line, #
02c0: 69 6e 63 6c 75 64 65 20 6d 61 63 72 6f 73 20 61  include macros a
02d0: 72 65 20 75 73 65 64 20 74 6f 20 70 75 6c 6c 20  re used to pull 
02e0: 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  in additional.**
02f0: 20 43 20 63 6f 64 65 20 66 69 6c 65 73 20 6e 61   C code files na
0300: 6d 65 64 20 22 74 74 33 5f 2a 2e 63 22 2e 0a 2a  med "tt3_*.c"..*
0310: 2a 0a 2a 2a 20 41 66 74 65 72 20 63 6f 6d 70 69  *.** After compi
0320: 6c 69 6e 67 2c 20 72 75 6e 20 74 68 69 73 20 70  ling, run this p
0330: 72 6f 67 72 61 6d 20 77 69 74 68 20 61 6e 20 6f  rogram with an o
0340: 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74  ptional argument
0350: 20 74 65 6c 6c 69 6e 67 0a 2a 2a 20 77 68 69 63   telling.** whic
0360: 68 20 74 65 73 74 20 74 6f 20 72 75 6e 2e 20 20  h test to run.  
0370: 41 6c 6c 20 74 65 73 74 73 20 61 72 65 20 72 75  All tests are ru
0380: 6e 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74  n if no argument
0390: 20 69 73 20 67 69 76 65 6e 2e 20 20 54 68 65 0a   is given.  The.
03a0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 63 61 6e 20  ** argument can 
03b0: 62 65 20 61 20 67 6c 6f 62 20 70 61 74 74 65 72  be a glob patter
03c0: 6e 20 74 6f 20 6d 61 74 63 68 20 6d 75 6c 74 69  n to match multi
03d0: 70 6c 65 20 74 65 73 74 73 2e 20 20 45 78 61 6d  ple tests.  Exam
03e0: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
03f0: 20 20 20 2e 2f 61 2e 6f 75 74 20 20 20 20 20 20     ./a.out      
0400: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 75             -- Ru
0410: 6e 20 61 6c 6c 20 74 65 73 74 73 0a 2a 2a 20 20  n all tests.**  
0420: 20 20 20 20 20 20 2e 2f 61 2e 6f 75 74 20 77 61        ./a.out wa
0430: 6c 74 68 72 65 61 64 33 20 20 20 20 20 20 2d 2d  lthread3      --
0440: 20 52 75 6e 20 74 68 65 20 22 77 61 6c 74 68 72   Run the "walthr
0450: 65 61 64 33 22 20 74 65 73 74 0a 2a 2a 20 20 20  ead3" test.**   
0460: 20 20 20 20 20 2e 2f 61 2e 6f 75 74 20 27 77 61       ./a.out 'wa
0470: 6c 2a 27 20 20 20 20 20 20 20 20 20 20 2d 2d 20  l*'          -- 
0480: 52 75 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 77  Run all of the w
0490: 61 6c 2a 20 74 65 73 74 73 0a 2a 2a 20 20 20 20  al* tests.**    
04a0: 20 20 20 20 2e 2f 61 2e 6f 75 74 20 2d 2d 68 65      ./a.out --he
04b0: 6c 70 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4c  lp          -- L
04c0: 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  ist all availabl
04d0: 65 20 74 65 73 74 73 0a 2a 2a 0a 2a 2a 20 54 68  e tests.**.** Th
04e0: 65 20 65 78 69 74 20 73 74 61 74 75 73 20 69 73  e exit status is
04f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 6e 79   non-zero if any
0500: 20 74 65 73 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a   test fails..*/.
0510: 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 22 53 65 74  ./* .** The "Set
0520: 20 45 72 72 6f 72 20 4c 69 6e 65 22 20 6d 61 63   Error Line" mac
0530: 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ro..*/.#define S
0540: 45 4c 28 65 29 20 28 28 65 29 2d 3e 69 4c 69 6e  EL(e) ((e)->iLin
0550: 65 20 3d 20 28 28 65 29 2d 3e 72 63 20 3f 20 28  e = ((e)->rc ? (
0560: 65 29 2d 3e 69 4c 69 6e 65 20 3a 20 5f 5f 4c 49  e)->iLine : __LI
0570: 4e 45 5f 5f 29 29 0a 0a 2f 2a 20 44 61 74 61 62  NE__))../* Datab
0580: 61 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ase functions */
0590: 0a 23 64 65 66 69 6e 65 20 6f 70 65 6e 64 62 28  .#define opendb(
05a0: 77 2c 78 2c 79 2c 7a 29 20 20 20 20 20 20 20 20  w,x,y,z)        
05b0: 20 28 53 45 4c 28 77 29 2c 20 6f 70 65 6e 64 62   (SEL(w), opendb
05c0: 5f 78 28 77 2c 78 2c 79 2c 7a 29 29 0a 23 64 65  _x(w,x,y,z)).#de
05d0: 66 69 6e 65 20 63 6c 6f 73 65 64 62 28 79 2c 7a  fine closedb(y,z
05e0: 29 20 20 20 20 20 20 20 20 20 20 20 20 28 53 45  )            (SE
05f0: 4c 28 79 29 2c 20 63 6c 6f 73 65 64 62 5f 78 28  L(y), closedb_x(
0600: 79 2c 7a 29 29 0a 0a 2f 2a 20 46 75 6e 63 74 69  y,z))../* Functi
0610: 6f 6e 73 20 74 6f 20 65 78 65 63 75 74 65 20 53  ons to execute S
0620: 51 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71  QL */.#define sq
0630: 6c 5f 73 63 72 69 70 74 28 78 2c 79 2c 7a 29 20  l_script(x,y,z) 
0640: 20 20 20 20 20 20 28 53 45 4c 28 78 29 2c 20 73        (SEL(x), s
0650: 71 6c 5f 73 63 72 69 70 74 5f 78 28 78 2c 79 2c  ql_script_x(x,y,
0660: 7a 29 29 0a 23 64 65 66 69 6e 65 20 69 6e 74 65  z)).#define inte
0670: 67 72 69 74 79 5f 63 68 65 63 6b 28 78 2c 79 29  grity_check(x,y)
0680: 20 20 20 20 28 53 45 4c 28 78 29 2c 20 69 6e 74      (SEL(x), int
0690: 65 67 72 69 74 79 5f 63 68 65 63 6b 5f 78 28 78  egrity_check_x(x
06a0: 2c 79 29 29 0a 23 64 65 66 69 6e 65 20 65 78 65  ,y)).#define exe
06b0: 63 73 71 6c 5f 69 36 34 28 78 2c 79 2c 2e 2e 2e  csql_i64(x,y,...
06c0: 29 20 20 20 20 28 53 45 4c 28 78 29 2c 20 65 78  )    (SEL(x), ex
06d0: 65 63 73 71 6c 5f 69 36 34 5f 78 28 78 2c 79 2c  ecsql_i64_x(x,y,
06e0: 5f 5f 56 41 5f 41 52 47 53 5f 5f 29 29 0a 23 64  __VA_ARGS__)).#d
06f0: 65 66 69 6e 65 20 65 78 65 63 73 71 6c 5f 74 65  efine execsql_te
0700: 78 74 28 78 2c 79 2c 7a 2c 2e 2e 2e 29 20 28 53  xt(x,y,z,...) (S
0710: 45 4c 28 78 29 2c 20 65 78 65 63 73 71 6c 5f 74  EL(x), execsql_t
0720: 65 78 74 5f 78 28 78 2c 79 2c 7a 2c 5f 5f 56 41  ext_x(x,y,z,__VA
0730: 5f 41 52 47 53 5f 5f 29 29 0a 23 64 65 66 69 6e  _ARGS__)).#defin
0740: 65 20 65 78 65 63 73 71 6c 28 78 2c 79 2c 2e 2e  e execsql(x,y,..
0750: 2e 29 20 20 20 20 20 20 20 20 28 53 45 4c 28 78  .)        (SEL(x
0760: 29 2c 20 28 76 6f 69 64 29 65 78 65 63 73 71 6c  ), (void)execsql
0770: 5f 69 36 34 5f 78 28 78 2c 79 2c 5f 5f 56 41 5f  _i64_x(x,y,__VA_
0780: 41 52 47 53 5f 5f 29 29 0a 23 64 65 66 69 6e 65  ARGS__)).#define
0790: 20 73 71 6c 5f 73 63 72 69 70 74 5f 70 72 69 6e   sql_script_prin
07a0: 74 66 28 78 2c 79 2c 7a 2c 2e 2e 2e 29 20 28 20  tf(x,y,z,...) ( 
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
07c0: 0a 20 20 20 20 53 45 4c 28 78 29 2c 20 73 71 6c  .    SEL(x), sql
07d0: 5f 73 63 72 69 70 74 5f 70 72 69 6e 74 66 5f 78  _script_printf_x
07e0: 28 78 2c 79 2c 7a 2c 5f 5f 56 41 5f 41 52 47 53  (x,y,z,__VA_ARGS
07f0: 5f 5f 29 20 20 20 20 5c 0a 29 20 0a 0a 2f 2a 20  __)    \.) ../* 
0800: 54 68 72 65 61 64 20 66 75 6e 63 74 69 6f 6e 73  Thread functions
0810: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6c 61 75 6e   */.#define laun
0820: 63 68 5f 74 68 72 65 61 64 28 77 2c 78 2c 79 2c  ch_thread(w,x,y,
0830: 7a 29 20 20 20 20 20 28 53 45 4c 28 77 29 2c 20  z)     (SEL(w), 
0840: 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 5f 78 28  launch_thread_x(
0850: 77 2c 78 2c 79 2c 7a 29 29 0a 23 64 65 66 69 6e  w,x,y,z)).#defin
0860: 65 20 6a 6f 69 6e 5f 61 6c 6c 5f 74 68 72 65 61  e join_all_threa
0870: 64 73 28 79 2c 7a 29 20 20 20 20 20 20 28 53 45  ds(y,z)      (SE
0880: 4c 28 79 29 2c 20 6a 6f 69 6e 5f 61 6c 6c 5f 74  L(y), join_all_t
0890: 68 72 65 61 64 73 5f 78 28 79 2c 7a 29 29 0a 0a  hreads_x(y,z))..
08a0: 2f 2a 20 54 69 6d 65 72 20 66 75 6e 63 74 69 6f  /* Timer functio
08b0: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 65  ns */.#define se
08c0: 74 73 74 6f 70 74 69 6d 65 28 79 2c 7a 29 20 20  tstoptime(y,z)  
08d0: 20 20 20 20 20 20 28 53 45 4c 28 79 29 2c 20 73        (SEL(y), s
08e0: 65 74 73 74 6f 70 74 69 6d 65 5f 78 28 79 2c 7a  etstoptime_x(y,z
08f0: 29 29 0a 23 64 65 66 69 6e 65 20 74 69 6d 65 74  )).#define timet
0900: 6f 73 74 6f 70 28 7a 29 20 20 20 20 20 20 20 20  ostop(z)        
0910: 20 20 20 28 53 45 4c 28 7a 29 2c 20 74 69 6d 65     (SEL(z), time
0920: 74 6f 73 74 6f 70 5f 78 28 7a 29 29 0a 0a 2f 2a  tostop_x(z))../*
0930: 20 52 65 70 6f 72 74 2f 63 6c 65 61 72 20 65 72   Report/clear er
0940: 72 6f 72 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  rors. */.#define
0950: 20 74 65 73 74 5f 65 72 72 6f 72 28 7a 2c 20 2e   test_error(z, .
0960: 2e 2e 29 20 20 20 20 20 20 74 65 73 74 5f 65 72  ..)      test_er
0970: 72 6f 72 5f 78 28 7a 2c 20 73 71 6c 69 74 65 33  ror_x(z, sqlite3
0980: 5f 6d 70 72 69 6e 74 66 28 5f 5f 56 41 5f 41 52  _mprintf(__VA_AR
0990: 47 53 5f 5f 29 29 0a 23 64 65 66 69 6e 65 20 63  GS__)).#define c
09a0: 6c 65 61 72 5f 65 72 72 6f 72 28 79 2c 7a 29 20  lear_error(y,z) 
09b0: 20 20 20 20 20 20 20 63 6c 65 61 72 5f 65 72 72         clear_err
09c0: 6f 72 5f 78 28 79 2c 20 7a 29 0a 0a 2f 2a 20 46  or_x(y, z)../* F
09d0: 69 6c 65 2d 73 79 73 74 65 6d 20 6f 70 65 72 61  ile-system opera
09e0: 74 69 6f 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65  tions */.#define
09f0: 20 66 69 6c 65 73 69 7a 65 28 79 2c 7a 29 20 20   filesize(y,z)  
0a00: 20 20 20 20 20 20 20 20 20 28 53 45 4c 28 79 29           (SEL(y)
0a10: 2c 20 66 69 6c 65 73 69 7a 65 5f 78 28 79 2c 7a  , filesize_x(y,z
0a20: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 63  )).#define filec
0a30: 6f 70 79 28 78 2c 79 2c 7a 29 20 20 20 20 20 20  opy(x,y,z)      
0a40: 20 20 20 28 53 45 4c 28 78 29 2c 20 66 69 6c 65     (SEL(x), file
0a50: 63 6f 70 79 5f 78 28 78 2c 79 2c 7a 29 29 0a 0a  copy_x(x,y,z))..
0a60: 23 64 65 66 69 6e 65 20 50 54 52 32 49 4e 54 28  #define PTR2INT(
0a70: 78 29 20 28 28 69 6e 74 29 28 28 69 6e 74 70 74  x) ((int)((intpt
0a80: 72 5f 74 29 78 29 29 0a 23 64 65 66 69 6e 65 20  r_t)x)).#define 
0a90: 49 4e 54 32 50 54 52 28 78 29 20 28 28 76 6f 69  INT2PTR(x) ((voi
0aa0: 64 2a 29 28 28 69 6e 74 70 74 72 5f 74 29 78 29  d*)((intptr_t)x)
0ab0: 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  )../*.** End of 
0ac0: 74 65 73 74 20 63 6f 64 65 2f 69 6e 66 72 61 73  test code/infras
0ad0: 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 66 61  tructure interfa
0ae0: 63 65 20 6d 61 63 72 6f 73 2e 0a 2a 2a 2a 2a 2a  ce macros..*****
0af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2a 2f 0a 0a 0a 0a 0a 23 69 6e 63 6c 75  ****/.....#inclu
0b40: 64 65 20 3c 73 71 6c 69 74 65 33 2e 68 3e 0a 23  de <sqlite3.h>.#
0b50: 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e  include <unistd.
0b60: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0b70: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
0b80: 70 74 68 72 65 61 64 2e 68 3e 0a 23 69 6e 63 6c  pthread.h>.#incl
0b90: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0ba0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70  include <sys/typ
0bb0: 65 73 2e 68 3e 20 0a 23 69 6e 63 6c 75 64 65 20  es.h> .#include 
0bc0: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 20 0a 23 69  <sys/stat.h> .#i
0bd0: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0be0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
0bf0: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65  l.h>.#include <e
0c00: 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54  rrno.h>../*. * T
0c10: 68 69 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65  his code impleme
0c20: 6e 74 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73  nts the MD5 mess
0c30: 61 67 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72  age-digest algor
0c40: 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67  ithm.. * The alg
0c50: 6f 72 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f  orithm is due to
0c60: 20 52 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68   Ron Rivest.  Th
0c70: 69 73 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77  is code was. * w
0c80: 72 69 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20  ritten by Colin 
0c90: 50 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e  Plumb in 1993, n
0ca0: 6f 20 63 6f 70 79 72 69 67 68 74 20 69 73 20 63  o copyright is c
0cb0: 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20  laimed.. * This 
0cc0: 63 6f 64 65 20 69 73 20 69 6e 20 74 68 65 20 70  code is in the p
0cd0: 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f  ublic domain; do
0ce0: 20 77 69 74 68 20 69 74 20 77 68 61 74 20 79 6f   with it what yo
0cf0: 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71  u wish.. *. * Eq
0d00: 75 69 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73  uivalent code is
0d10: 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
0d20: 52 53 41 20 44 61 74 61 20 53 65 63 75 72 69 74  RSA Data Securit
0d30: 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20  y, Inc.. * This 
0d40: 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 74 65  code has been te
0d50: 73 74 65 64 20 61 67 61 69 6e 73 74 20 74 68 61  sted against tha
0d60: 74 2c 20 61 6e 64 20 69 73 20 65 71 75 69 76 61  t, and is equiva
0d70: 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20  lent,. * except 
0d80: 74 68 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e  that you don't n
0d90: 65 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  eed to include t
0da0: 77 6f 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61  wo pages of lega
0db0: 6c 65 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65  lese. * with eve
0dc0: 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54  ry copy.. *. * T
0dd0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65  o compute the me
0de0: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 66 20  ssage digest of 
0df0: 61 20 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73  a chunk of bytes
0e00: 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20  , declare an. * 
0e10: 4d 44 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63  MD5Context struc
0e20: 74 75 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f  ture, pass it to
0e30: 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d   MD5Init, call M
0e40: 44 35 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e  D5Update as. * n
0e50: 65 65 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73  eeded on buffers
0e60: 20 66 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20   full of bytes, 
0e70: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44  and then call MD
0e80: 35 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a  5Final, which. *
0e90: 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70   will fill a sup
0ea0: 70 6c 69 65 64 20 31 36 2d 62 79 74 65 20 61 72  plied 16-byte ar
0eb0: 72 61 79 20 77 69 74 68 20 74 68 65 20 64 69 67  ray with the dig
0ec0: 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  est.. */../*. * 
0ed0: 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61  If compiled on a
0ee0: 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f   machine that do
0ef0: 65 73 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d  esn't have a 32-
0f00: 62 69 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20  bit integer,. * 
0f10: 79 6f 75 20 6a 75 73 74 20 73 65 74 20 22 75 69  you just set "ui
0f20: 6e 74 33 32 22 20 74 6f 20 74 68 65 20 61 70 70  nt32" to the app
0f30: 72 6f 70 72 69 61 74 65 20 64 61 74 61 74 79 70  ropriate datatyp
0f40: 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69  e for an. * unsi
0f50: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
0f60: 67 65 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ger.  For exampl
0f70: 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63  e:. *. *       c
0f80: 63 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69  c -Duint32='unsi
0f90: 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63  gned long' md5.c
0fa0: 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  . *. */.#ifndef 
0fb0: 75 69 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65  uint32.#  define
0fc0: 20 75 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64   uint32 unsigned
0fd0: 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72   int.#endif..str
0fe0: 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b  uct MD5Context {
0ff0: 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20  .  int isInit;. 
1000: 20 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a   uint32 buf[4];.
1010: 20 20 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d    uint32 bits[2]
1020: 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  ;.  union {.    
1030: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
1040: 5b 36 34 5d 3b 0a 20 20 20 20 75 69 6e 74 33 32  [64];.    uint32
1050: 20 69 6e 33 32 5b 31 36 5d 3b 0a 20 20 7d 20 75   in32[16];.  } u
1060: 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ;.};.typedef str
1070: 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 4d  uct MD5Context M
1080: 44 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 0a 20  D5Context;../*. 
1090: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 6f 64  * Note: this cod
10a0: 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 6f 6e  e is harmless on
10b0: 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6d   little-endian m
10c0: 61 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a 73 74 61  achines.. */.sta
10d0: 74 69 63 20 76 6f 69 64 20 62 79 74 65 52 65 76  tic void byteRev
10e0: 65 72 73 65 20 28 75 6e 73 69 67 6e 65 64 20 63  erse (unsigned c
10f0: 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e  har *buf, unsign
1100: 65 64 20 6c 6f 6e 67 73 29 7b 0a 20 20 75 69 6e  ed longs){.  uin
1110: 74 33 32 20 74 3b 0a 20 20 64 6f 20 7b 0a 20 20  t32 t;.  do {.  
1120: 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28    t = (uint32)((
1130: 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c  unsigned)buf[3]<
1140: 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20  <8 | buf[2]) << 
1150: 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20 20 28  16 |.          (
1160: 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d  (unsigned)buf[1]
1170: 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20  <<8 | buf[0]);. 
1180: 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29 62 75     *(uint32 *)bu
1190: 66 20 3d 20 74 3b 0a 20 20 20 20 62 75 66 20 2b  f = t;.    buf +
11a0: 3d 20 34 3b 0a 20 20 7d 20 77 68 69 6c 65 20 28  = 4;.  } while (
11b0: 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54  --longs);.}./* T
11c0: 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e  he four core fun
11d0: 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f  ctions - F1 is o
11e0: 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61  ptimized somewha
11f0: 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65  t */../* #define
1200: 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F1(x, y, z) (x 
1210: 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f  & y | ~x & z) */
1220: 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79  .#define F1(x, y
1230: 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28  , z) (z ^ (x & (
1240: 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65  y ^ z))).#define
1250: 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28   F2(x, y, z) F1(
1260: 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65  z, x, y).#define
1270: 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F3(x, y, z) (x 
1280: 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65  ^ y ^ z).#define
1290: 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20   F4(x, y, z) (y 
12a0: 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20  ^ (x | ~z))../* 
12b0: 54 68 69 73 20 69 73 20 74 68 65 20 63 65 6e 74  This is the cent
12c0: 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20  ral step in the 
12d0: 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a  MD5 algorithm. *
12e0: 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45  /.#define MD5STE
12f0: 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c  P(f, w, x, y, z,
1300: 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20 28 20   data, s) \.  ( 
1310: 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a 29 20  w += f(x, y, z) 
1320: 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77 3c 3c  + data,  w = w<<
1330: 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c 20 20  s | w>>(32-s),  
1340: 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a 20  w += x )../*. * 
1350: 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65 20  The core of the 
1360: 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c 20 74  MD5 algorithm, t
1370: 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20 65 78  his alters an ex
1380: 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73 68 20  isting MD5 hash 
1390: 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20 74 68  to. * reflect th
13a0: 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 31 36  e addition of 16
13b0: 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20 6e 65   longwords of ne
13c0: 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70 64 61  w data.  MD5Upda
13d0: 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74 68 65  te blocks. * the
13e0: 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76 65 72   data and conver
13f0: 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20 6c 6f  ts bytes into lo
1400: 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68 69 73  ngwords for this
1410: 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73 74   routine.. */.st
1420: 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54 72 61  atic void MD5Tra
1430: 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20 62 75  nsform(uint32 bu
1440: 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69 6e 74  f[4], const uint
1450: 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20 72 65  32 in[16]){.  re
1460: 67 69 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c  gister uint32 a,
1470: 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 61 20 3d   b, c, d;..  a =
1480: 20 62 75 66 5b 30 5d 3b 0a 20 20 62 20 3d 20 62   buf[0];.  b = b
1490: 75 66 5b 31 5d 3b 0a 20 20 63 20 3d 20 62 75 66  uf[1];.  c = buf
14a0: 5b 32 5d 3b 0a 20 20 64 20 3d 20 62 75 66 5b 33  [2];.  d = buf[3
14b0: 5d 3b 0a 0a 20 20 4d 44 35 53 54 45 50 28 46 31  ];..  MD5STEP(F1
14c0: 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
14d0: 5b 20 30 5d 2b 30 78 64 37 36 61 61 34 37 38 2c  [ 0]+0xd76aa478,
14e0: 20 20 37 29 3b 0a 20 20 4d 44 35 53 54 45 50 28    7);.  MD5STEP(
14f0: 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1500: 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35  in[ 1]+0xe8c7b75
1510: 36 2c 20 31 32 29 3b 0a 20 20 4d 44 35 53 54 45  6, 12);.  MD5STE
1520: 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
1530: 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32 30 37  , in[ 2]+0x24207
1540: 30 64 62 2c 20 31 37 29 3b 0a 20 20 4d 44 35 53  0db, 17);.  MD5S
1550: 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1560: 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62   a, in[ 3]+0xc1b
1570: 64 63 65 65 65 2c 20 32 32 29 3b 0a 20 20 4d 44  dceee, 22);.  MD
1580: 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1590: 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66  c, d, in[ 4]+0xf
15a0: 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20  57c0faf,  7);.  
15b0: 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61  MD5STEP(F1, d, a
15c0: 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 35 5d 2b 30  , b, c, in[ 5]+0
15d0: 78 34 37 38 37 63 36 32 61 2c 20 31 32 29 3b 0a  x4787c62a, 12);.
15e0: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
15f0: 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d   d, a, b, in[ 6]
1600: 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31 37 29  +0xa8304613, 17)
1610: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20  ;.  MD5STEP(F1, 
1620: 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
1630: 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32  7]+0xfd469501, 2
1640: 32 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31  2);.  MD5STEP(F1
1650: 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1660: 5b 20 38 5d 2b 30 78 36 39 38 30 39 38 64 38 2c  [ 8]+0x698098d8,
1670: 20 20 37 29 3b 0a 20 20 4d 44 35 53 54 45 50 28    7);.  MD5STEP(
1680: 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1690: 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61  in[ 9]+0x8b44f7a
16a0: 66 2c 20 31 32 29 3b 0a 20 20 4d 44 35 53 54 45  f, 12);.  MD5STE
16b0: 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
16c0: 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66 66 35  , in[10]+0xffff5
16d0: 62 62 31 2c 20 31 37 29 3b 0a 20 20 4d 44 35 53  bb1, 17);.  MD5S
16e0: 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
16f0: 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35   a, in[11]+0x895
1700: 63 64 37 62 65 2c 20 32 32 29 3b 0a 20 20 4d 44  cd7be, 22);.  MD
1710: 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1720: 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36  c, d, in[12]+0x6
1730: 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20  b901122,  7);.  
1740: 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61  MD5STEP(F1, d, a
1750: 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33 5d 2b 30  , b, c, in[13]+0
1760: 78 66 64 39 38 37 31 39 33 2c 20 31 32 29 3b 0a  xfd987193, 12);.
1770: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
1780: 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d   d, a, b, in[14]
1790: 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31 37 29  +0xa679438e, 17)
17a0: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20  ;.  MD5STEP(F1, 
17b0: 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
17c0: 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32  5]+0x49b40821, 2
17d0: 32 29 3b 0a 0a 20 20 4d 44 35 53 54 45 50 28 46  2);..  MD5STEP(F
17e0: 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  2, a, b, c, d, i
17f0: 6e 5b 20 31 5d 2b 30 78 66 36 31 65 32 35 36 32  n[ 1]+0xf61e2562
1800: 2c 20 20 35 29 3b 0a 20 20 4d 44 35 53 54 45 50  ,  5);.  MD5STEP
1810: 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1820: 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33   in[ 6]+0xc040b3
1830: 34 30 2c 20 20 39 29 3b 0a 20 20 4d 44 35 53 54  40,  9);.  MD5ST
1840: 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
1850: 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36 35 65  b, in[11]+0x265e
1860: 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 4d 44 35  5a51, 14);.  MD5
1870: 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1880: 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39  , a, in[ 0]+0xe9
1890: 62 36 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 4d  b6c7aa, 20);.  M
18a0: 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
18b0: 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
18c0: 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20  d62f105d,  5);. 
18d0: 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20   MD5STEP(F2, d, 
18e0: 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 30 5d 2b  a, b, c, in[10]+
18f0: 30 78 30 32 34 34 31 34 35 33 2c 20 20 39 29 3b  0x02441453,  9);
1900: 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63  .  MD5STEP(F2, c
1910: 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35  , d, a, b, in[15
1920: 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20 31 34  ]+0xd8a1e681, 14
1930: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c  );.  MD5STEP(F2,
1940: 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
1950: 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20   4]+0xe7d3fbc8, 
1960: 32 30 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  20);.  MD5STEP(F
1970: 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  2, a, b, c, d, i
1980: 6e 5b 20 39 5d 2b 30 78 32 31 65 31 63 64 65 36  n[ 9]+0x21e1cde6
1990: 2c 20 20 35 29 3b 0a 20 20 4d 44 35 53 54 45 50  ,  5);.  MD5STEP
19a0: 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
19b0: 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37   in[14]+0xc33707
19c0: 64 36 2c 20 20 39 29 3b 0a 20 20 4d 44 35 53 54  d6,  9);.  MD5ST
19d0: 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
19e0: 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34 64 35  b, in[ 3]+0xf4d5
19f0: 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 4d 44 35  0d87, 14);.  MD5
1a00: 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1a10: 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35  , a, in[ 8]+0x45
1a20: 35 61 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 4d  5a14ed, 20);.  M
1a30: 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1a40: 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
1a50: 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20  a9e3e905,  5);. 
1a60: 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20   MD5STEP(F2, d, 
1a70: 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 32 5d 2b  a, b, c, in[ 2]+
1a80: 30 78 66 63 65 66 61 33 66 38 2c 20 20 39 29 3b  0xfcefa3f8,  9);
1a90: 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63  .  MD5STEP(F2, c
1aa0: 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37  , d, a, b, in[ 7
1ab0: 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20 31 34  ]+0x676f02d9, 14
1ac0: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c  );.  MD5STEP(F2,
1ad0: 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
1ae0: 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20  12]+0x8d2a4c8a, 
1af0: 32 30 29 3b 0a 0a 20 20 4d 44 35 53 54 45 50 28  20);..  MD5STEP(
1b00: 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F3, a, b, c, d, 
1b10: 69 6e 5b 20 35 5d 2b 30 78 66 66 66 61 33 39 34  in[ 5]+0xfffa394
1b20: 32 2c 20 20 34 29 3b 0a 20 20 4d 44 35 53 54 45  2,  4);.  MD5STE
1b30: 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1b40: 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66  , in[ 8]+0x8771f
1b50: 36 38 31 2c 20 31 31 29 3b 0a 20 20 4d 44 35 53  681, 11);.  MD5S
1b60: 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
1b70: 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36 64 39   b, in[11]+0x6d9
1b80: 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20 4d 44  d6122, 16);.  MD
1b90: 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1ba0: 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66  d, a, in[14]+0xf
1bb0: 64 65 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20  de5380c, 23);.  
1bc0: 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1bd0: 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30  , c, d, in[ 1]+0
1be0: 78 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a  xa4beea44,  4);.
1bf0: 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c    MD5STEP(F3, d,
1c00: 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 34 5d   a, b, c, in[ 4]
1c10: 2b 30 78 34 62 64 65 63 66 61 39 2c 20 31 31 29  +0x4bdecfa9, 11)
1c20: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20  ;.  MD5STEP(F3, 
1c30: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1c40: 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c 20 31  7]+0xf6bb4b60, 1
1c50: 36 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33  6);.  MD5STEP(F3
1c60: 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1c70: 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c  [10]+0xbebfbc70,
1c80: 20 32 33 29 3b 0a 20 20 4d 44 35 53 54 45 50 28   23);.  MD5STEP(
1c90: 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F3, a, b, c, d, 
1ca0: 69 6e 5b 31 33 5d 2b 30 78 32 38 39 62 37 65 63  in[13]+0x289b7ec
1cb0: 36 2c 20 20 34 29 3b 0a 20 20 4d 44 35 53 54 45  6,  4);.  MD5STE
1cc0: 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1cd0: 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32  , in[ 0]+0xeaa12
1ce0: 37 66 61 2c 20 31 31 29 3b 0a 20 20 4d 44 35 53  7fa, 11);.  MD5S
1cf0: 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
1d00: 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64 34 65   b, in[ 3]+0xd4e
1d10: 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20 4d 44  f3085, 16);.  MD
1d20: 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1d30: 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30  d, a, in[ 6]+0x0
1d40: 34 38 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20  4881d05, 23);.  
1d50: 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1d60: 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30  , c, d, in[ 9]+0
1d70: 78 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a  xd9d4d039,  4);.
1d80: 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c    MD5STEP(F3, d,
1d90: 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 32 5d   a, b, c, in[12]
1da0: 2b 30 78 65 36 64 62 39 39 65 35 2c 20 31 31 29  +0xe6db99e5, 11)
1db0: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20  ;.  MD5STEP(F3, 
1dc0: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
1dd0: 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c 20 31  5]+0x1fa27cf8, 1
1de0: 36 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33  6);.  MD5STEP(F3
1df0: 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1e00: 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c  [ 2]+0xc4ac5665,
1e10: 20 32 33 29 3b 0a 0a 20 20 4d 44 35 53 54 45 50   23);..  MD5STEP
1e20: 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F4, a, b, c, d,
1e30: 20 69 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32 32   in[ 0]+0xf42922
1e40: 34 34 2c 20 20 36 29 3b 0a 20 20 4d 44 35 53 54  44,  6);.  MD5ST
1e50: 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1e60: 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61  c, in[ 7]+0x432a
1e70: 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 4d 44 35  ff97, 10);.  MD5
1e80: 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
1e90: 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 62  , b, in[14]+0xab
1ea0: 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20 20 4d  9423a7, 15);.  M
1eb0: 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1ec0: 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78   d, a, in[ 5]+0x
1ed0: 66 63 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20  fc93a039, 21);. 
1ee0: 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1ef0: 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b  b, c, d, in[12]+
1f00: 30 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b  0x655b59c3,  6);
1f10: 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64  .  MD5STEP(F4, d
1f20: 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 33  , a, b, c, in[ 3
1f30: 5d 2b 30 78 38 66 30 63 63 63 39 32 2c 20 31 30  ]+0x8f0ccc92, 10
1f40: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c  );.  MD5STEP(F4,
1f50: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1f60: 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64 2c 20  10]+0xffeff47d, 
1f70: 31 35 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  15);.  MD5STEP(F
1f80: 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
1f90: 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31  n[ 1]+0x85845dd1
1fa0: 2c 20 32 31 29 3b 0a 20 20 4d 44 35 53 54 45 50  , 21);.  MD5STEP
1fb0: 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F4, a, b, c, d,
1fc0: 20 69 6e 5b 20 38 5d 2b 30 78 36 66 61 38 37 65   in[ 8]+0x6fa87e
1fd0: 34 66 2c 20 20 36 29 3b 0a 20 20 4d 44 35 53 54  4f,  6);.  MD5ST
1fe0: 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1ff0: 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63  c, in[15]+0xfe2c
2000: 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 4d 44 35  e6e0, 10);.  MD5
2010: 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
2020: 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 33  , b, in[ 6]+0xa3
2030: 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20 20 4d  014314, 15);.  M
2040: 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
2050: 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78   d, a, in[13]+0x
2060: 34 65 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20  4e0811a1, 21);. 
2070: 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
2080: 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b  b, c, d, in[ 4]+
2090: 30 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b  0xf7537e82,  6);
20a0: 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64  .  MD5STEP(F4, d
20b0: 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 31  , a, b, c, in[11
20c0: 5d 2b 30 78 62 64 33 61 66 32 33 35 2c 20 31 30  ]+0xbd3af235, 10
20d0: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c  );.  MD5STEP(F4,
20e0: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
20f0: 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62 2c 20   2]+0x2ad7d2bb, 
2100: 31 35 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  15);.  MD5STEP(F
2110: 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
2120: 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31  n[ 9]+0xeb86d391
2130: 2c 20 32 31 29 3b 0a 0a 20 20 62 75 66 5b 30 5d  , 21);..  buf[0]
2140: 20 2b 3d 20 61 3b 0a 20 20 62 75 66 5b 31 5d 20   += a;.  buf[1] 
2150: 2b 3d 20 62 3b 0a 20 20 62 75 66 5b 32 5d 20 2b  += b;.  buf[2] +
2160: 3d 20 63 3b 0a 20 20 62 75 66 5b 33 5d 20 2b 3d  = c;.  buf[3] +=
2170: 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61   d;.}../*. * Sta
2180: 72 74 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74  rt MD5 accumulat
2190: 69 6f 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f  ion.  Set bit co
21a0: 75 6e 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66  unt to 0 and buf
21b0: 66 65 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75  fer to mysteriou
21c0: 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  s. * initializat
21d0: 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20  ion constants.. 
21e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
21f0: 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78  D5Init(MD5Contex
2200: 74 20 2a 63 74 78 29 7b 0a 20 20 63 74 78 2d 3e  t *ctx){.  ctx->
2210: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 63 74  isInit = 1;.  ct
2220: 78 2d 3e 62 75 66 5b 30 5d 20 3d 20 30 78 36 37  x->buf[0] = 0x67
2230: 34 35 32 33 30 31 3b 0a 20 20 63 74 78 2d 3e 62  452301;.  ctx->b
2240: 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62  uf[1] = 0xefcdab
2250: 38 39 3b 0a 20 20 63 74 78 2d 3e 62 75 66 5b 32  89;.  ctx->buf[2
2260: 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a  ] = 0x98badcfe;.
2270: 20 20 63 74 78 2d 3e 62 75 66 5b 33 5d 20 3d 20    ctx->buf[3] = 
2280: 30 78 31 30 33 32 35 34 37 36 3b 0a 20 20 63 74  0x10325476;.  ct
2290: 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a  x->bits[0] = 0;.
22a0: 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 3d    ctx->bits[1] =
22b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64   0;.}../*. * Upd
22c0: 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f 20 72  ate context to r
22d0: 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e 63 61  eflect the conca
22e0: 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 6f 74  tenation of anot
22f0: 68 65 72 20 62 75 66 66 65 72 20 66 75 6c 6c 0a  her buffer full.
2300: 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20 2a 2f   * of bytes.. */
2310: 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20 4d 44  .static .void MD
2320: 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e 74 65  5Update(MD5Conte
2330: 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74 20 75  xt *ctx, const u
2340: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
2350: 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  f, unsigned int 
2360: 6c 65 6e 29 7b 0a 20 20 75 69 6e 74 33 32 20 74  len){.  uint32 t
2370: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 62  ;..  /* Update b
2380: 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 74 20  itcount */..  t 
2390: 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a  = ctx->bits[0];.
23a0: 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69 74 73    if ((ctx->bits
23b0: 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e 74  [0] = t + ((uint
23c0: 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20  32)len << 3)) < 
23d0: 74 29 0a 20 20 20 20 63 74 78 2d 3e 62 69 74 73  t).    ctx->bits
23e0: 5b 31 5d 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20  [1]++; /* Carry 
23f0: 66 72 6f 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68  from low to high
2400: 20 2a 2f 0a 20 20 63 74 78 2d 3e 62 69 74 73 5b   */.  ctx->bits[
2410: 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b  1] += len >> 29;
2420: 0a 0a 20 20 74 20 3d 20 28 74 20 3e 3e 20 33 29  ..  t = (t >> 3)
2430: 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a 20 42   & 0x3f;    /* B
2440: 79 74 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ytes already in 
2450: 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20 2a 2f  shsInfo->data */
2460: 0a 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e  ..  /* Handle an
2470: 79 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73 69  y leading odd-si
2480: 7a 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20  zed chunks */.. 
2490: 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20   if ( t ) {.    
24a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
24b0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
24c0: 72 20 2a 29 63 74 78 2d 3e 75 2e 69 6e 20 2b 20  r *)ctx->u.in + 
24d0: 74 3b 0a 0a 20 20 20 20 74 20 3d 20 36 34 2d 74  t;..    t = 64-t
24e0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20  ;.    if (len < 
24f0: 74 29 20 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  t) {.      memcp
2500: 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a  y(p, buf, len);.
2510: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2520: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
2530: 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 62  , buf, t);.    b
2540: 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e  yteReverse(ctx->
2550: 75 2e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 4d  u.in, 16);.    M
2560: 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d  D5Transform(ctx-
2570: 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29  >buf, (uint32 *)
2580: 63 74 78 2d 3e 75 2e 69 6e 29 3b 0a 20 20 20 20  ctx->u.in);.    
2590: 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20 6c 65  buf += t;.    le
25a0: 6e 20 2d 3d 20 74 3b 0a 20 20 7d 0a 0a 20 20 2f  n -= t;.  }..  /
25b0: 2a 20 50 72 6f 63 65 73 73 20 64 61 74 61 20 69  * Process data i
25c0: 6e 20 36 34 2d 62 79 74 65 20 63 68 75 6e 6b 73  n 64-byte chunks
25d0: 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 20 28 6c 65   */..  while (le
25e0: 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20 6d  n >= 64) {.    m
25f0: 65 6d 63 70 79 28 63 74 78 2d 3e 75 2e 69 6e 2c  emcpy(ctx->u.in,
2600: 20 62 75 66 2c 20 36 34 29 3b 0a 20 20 20 20 62   buf, 64);.    b
2610: 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e  yteReverse(ctx->
2620: 75 2e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 4d  u.in, 16);.    M
2630: 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d  D5Transform(ctx-
2640: 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29  >buf, (uint32 *)
2650: 63 74 78 2d 3e 75 2e 69 6e 29 3b 0a 20 20 20 20  ctx->u.in);.    
2660: 62 75 66 20 2b 3d 20 36 34 3b 0a 20 20 20 20 6c  buf += 64;.    l
2670: 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 7d 0a 0a 20  en -= 64;.  }.. 
2680: 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72   /* Handle any r
2690: 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f  emaining bytes o
26a0: 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 6d 65  f data. */..  me
26b0: 6d 63 70 79 28 63 74 78 2d 3e 75 2e 69 6e 2c 20  mcpy(ctx->u.in, 
26c0: 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a  buf, len);.}../*
26d0: 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70  . * Final wrapup
26e0: 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74   - pad to 64-byt
26f0: 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20  e boundary with 
2700: 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e 20  the bit pattern 
2710: 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74  . * 1 0* (64-bit
2720: 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70   count of bits p
2730: 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69  rocessed, MSB-fi
2740: 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20  rst). */.static 
2750: 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e  void MD5Final(un
2760: 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
2770: 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65  st[16], MD5Conte
2780: 78 74 20 2a 63 74 78 29 7b 0a 20 20 75 6e 73 69  xt *ctx){.  unsi
2790: 67 6e 65 64 20 63 6f 75 6e 74 3b 0a 20 20 75 6e  gned count;.  un
27a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
27b0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6e 75  .  /* Compute nu
27c0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6d 6f  mber of bytes mo
27d0: 64 20 36 34 20 2a 2f 0a 20 20 63 6f 75 6e 74 20  d 64 */.  count 
27e0: 3d 20 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20  = (ctx->bits[0] 
27f0: 3e 3e 20 33 29 20 26 20 30 78 33 46 3b 0a 0a 20  >> 3) & 0x3F;.. 
2800: 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73   /* Set the firs
2810: 74 20 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e  t char of paddin
2820: 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73  g to 0x80.  This
2830: 20 69 73 20 73 61 66 65 20 73 69 6e 63 65 20 74   is safe since t
2840: 68 65 72 65 20 69 73 0a 20 20 20 20 20 61 6c 77  here is.     alw
2850: 61 79 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ays at least one
2860: 20 62 79 74 65 20 66 72 65 65 20 2a 2f 0a 20 20   byte free */.  
2870: 70 20 3d 20 63 74 78 2d 3e 75 2e 69 6e 20 2b 20  p = ctx->u.in + 
2880: 63 6f 75 6e 74 3b 0a 20 20 2a 70 2b 2b 20 3d 20  count;.  *p++ = 
2890: 30 78 38 30 3b 0a 0a 20 20 2f 2a 20 42 79 74 65  0x80;..  /* Byte
28a0: 73 20 6f 66 20 70 61 64 64 69 6e 67 20 6e 65 65  s of padding nee
28b0: 64 65 64 20 74 6f 20 6d 61 6b 65 20 36 34 20 62  ded to make 64 b
28c0: 79 74 65 73 20 2a 2f 0a 20 20 63 6f 75 6e 74 20  ytes */.  count 
28d0: 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74  = 64 - 1 - count
28e0: 3b 0a 0a 20 20 2f 2a 20 50 61 64 20 6f 75 74 20  ;..  /* Pad out 
28f0: 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a  to 56 mod 64 */.
2900: 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 20 38 29    if (count < 8)
2910: 20 7b 0a 20 20 20 20 2f 2a 20 54 77 6f 20 6c 6f   {.    /* Two lo
2920: 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a 20 20  ts of padding:  
2930: 50 61 64 20 74 68 65 20 66 69 72 73 74 20 62 6c  Pad the first bl
2940: 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65 73 20  ock to 64 bytes 
2950: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c  */.    memset(p,
2960: 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20   0, count);.    
2970: 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
2980: 3e 75 2e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20  >u.in, 16);.    
2990: 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
29a0: 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
29b0: 29 63 74 78 2d 3e 75 2e 69 6e 29 3b 0a 0a 20 20  )ctx->u.in);..  
29c0: 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68    /* Now fill th
29d0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74  e next block wit
29e0: 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20  h 56 bytes */.  
29f0: 20 20 6d 65 6d 73 65 74 28 63 74 78 2d 3e 75 2e    memset(ctx->u.
2a00: 69 6e 2c 20 30 2c 20 35 36 29 3b 0a 20 20 7d 20  in, 0, 56);.  } 
2a10: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 50 61  else {.    /* Pa
2a20: 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79  d block to 56 by
2a30: 74 65 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  tes */.    memse
2a40: 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 2d 38 29  t(p, 0, count-8)
2a50: 3b 0a 20 20 7d 0a 20 20 62 79 74 65 52 65 76 65  ;.  }.  byteReve
2a60: 72 73 65 28 63 74 78 2d 3e 75 2e 69 6e 2c 20 31  rse(ctx->u.in, 1
2a70: 34 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64  4);..  /* Append
2a80: 20 6c 65 6e 67 74 68 20 69 6e 20 62 69 74 73 20   length in bits 
2a90: 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20 2a 2f  and transform */
2aa0: 0a 20 20 63 74 78 2d 3e 75 2e 69 6e 33 32 5b 31  .  ctx->u.in32[1
2ab0: 34 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30  4] = ctx->bits[0
2ac0: 5d 3b 0a 20 20 63 74 78 2d 3e 75 2e 69 6e 33 32  ];.  ctx->u.in32
2ad0: 5b 31 35 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73  [15] = ctx->bits
2ae0: 5b 31 5d 3b 0a 0a 20 20 4d 44 35 54 72 61 6e 73  [1];..  MD5Trans
2af0: 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
2b00: 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 75 2e  uint32 *)ctx->u.
2b10: 69 6e 29 3b 0a 20 20 62 79 74 65 52 65 76 65 72  in);.  byteRever
2b20: 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  se((unsigned cha
2b30: 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29  r *)ctx->buf, 4)
2b40: 3b 0a 20 20 6d 65 6d 63 70 79 28 64 69 67 65 73  ;.  memcpy(diges
2b50: 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31 36 29  t, ctx->buf, 16)
2b60: 3b 0a 20 20 6d 65 6d 73 65 74 28 63 74 78 2c 20  ;.  memset(ctx, 
2b70: 30 2c 20 73 69 7a 65 6f 66 28 2a 63 74 78 29 29  0, sizeof(*ctx))
2b80: 3b 20 20 20 20 2f 2a 20 49 6e 20 63 61 73 65 20  ;    /* In case 
2b90: 69 74 20 69 73 20 73 65 6e 73 69 74 69 76 65 20  it is sensitive 
2ba0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  */.}../*.** Conv
2bb0: 65 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44  ert a 128-bit MD
2bc0: 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20 61 20  5 digest into a 
2bd0: 33 32 2d 64 69 67 69 74 20 62 61 73 65 2d 31 36  32-digit base-16
2be0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
2bf0: 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73  ic void MD5Diges
2c00: 74 54 6f 42 61 73 65 31 36 28 75 6e 73 69 67 6e  tToBase16(unsign
2c10: 65 64 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c  ed char *digest,
2c20: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2c30: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73  static char cons
2c40: 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30  t zEncode[] = "0
2c50: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22  123456789abcdef"
2c60: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  ;.  int i, j;.. 
2c70: 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36   for(j=i=0; i<16
2c80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2c90: 61 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20  a = digest[i];. 
2ca0: 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a     zBuf[j++] = z
2cb0: 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78  Encode[(a>>4)&0x
2cc0: 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b  f];.    zBuf[j++
2cd0: 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20  ] = zEncode[a & 
2ce0: 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  0xf];.  }.  zBuf
2cf0: 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [j] = 0;.}../*.*
2d00: 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69 6e 67  * During testing
2d10: 2c 20 74 68 65 20 73 70 65 63 69 61 6c 20 6d 64  , the special md
2d20: 35 73 75 6d 28 29 20 61 67 67 72 65 67 61 74 65  5sum() aggregate
2d30: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
2d40: 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64  ilable..** insid
2d50: 65 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 66  e SQLite.  The f
2d60: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
2d70: 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  s implement that
2d80: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2d90: 61 74 69 63 20 76 6f 69 64 20 6d 64 35 73 74 65  atic void md5ste
2da0: 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  p(sqlite3_contex
2db0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
2dc0: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
2dd0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d  lue **argv){.  M
2de0: 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20  D5Context *p;.  
2df0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
2e00: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
2e10: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
2e20: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
2e30: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
2e40: 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ));.  if( p==0 )
2e50: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
2e60: 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  p->isInit ){.   
2e70: 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20 20 7d   MD5Init(p);.  }
2e80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
2e90: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  gc; i++){.    co
2ea0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 20  nst char *zData 
2eb0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
2ec0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
2ed0: 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  [i]);.    if( zD
2ee0: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 4d 44 35  ata ){.      MD5
2ef0: 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73 69 67  Update(p, (unsig
2f00: 6e 65 64 20 63 68 61 72 2a 29 7a 44 61 74 61 2c  ned char*)zData,
2f10: 20 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 29 3b   strlen(zData));
2f20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
2f30: 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69 6e 61  tic void md5fina
2f40: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
2f50: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
2f60: 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b    MD5Context *p;
2f70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2f80: 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63   digest[16];.  c
2f90: 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20 20  har zBuf[33];.  
2fa0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
2fb0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
2fc0: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
2fd0: 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  ));.  MD5Final(d
2fe0: 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35 44  igest,p);.  MD5D
2ff0: 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 64 69  igestToBase16(di
3000: 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 73  gest, zBuf);.  s
3010: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
3020: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  xt(context, zBuf
3030: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
3040: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NSIENT);.}../*.*
3050: 2a 20 45 6e 64 20 6f 66 20 63 6f 70 69 65 64 20  * End of copied 
3060: 6d 64 35 73 75 6d 28 29 20 63 6f 64 65 2e 0a 2a  md5sum() code..*
3070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 74 79 70 65  *********/..type
30c0: 64 65 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  def sqlite3_int6
30d0: 34 20 69 36 34 3b 0a 0a 74 79 70 65 64 65 66 20  4 i64;..typedef 
30e0: 73 74 72 75 63 74 20 45 72 72 6f 72 20 45 72 72  struct Error Err
30f0: 6f 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  or;.typedef stru
3100: 63 74 20 53 71 6c 69 74 65 20 53 71 6c 69 74 65  ct Sqlite Sqlite
3110: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
3120: 20 53 74 61 74 65 6d 65 6e 74 20 53 74 61 74 65   Statement State
3130: 6d 65 6e 74 3b 0a 0a 74 79 70 65 64 65 66 20 73  ment;..typedef s
3140: 74 72 75 63 74 20 54 68 72 65 61 64 73 65 74 20  truct Threadset 
3150: 54 68 72 65 61 64 73 65 74 3b 0a 74 79 70 65 64  Threadset;.typed
3160: 65 66 20 73 74 72 75 63 74 20 54 68 72 65 61 64  ef struct Thread
3170: 20 54 68 72 65 61 64 3b 0a 0a 2f 2a 20 54 6f 74   Thread;../* Tot
3180: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  al number of err
3190: 6f 72 73 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ors in this proc
31a0: 65 73 73 20 73 6f 20 66 61 72 2e 20 2a 2f 0a 73  ess so far. */.s
31b0: 74 61 74 69 63 20 69 6e 74 20 6e 47 6c 6f 62 61  tatic int nGloba
31c0: 6c 45 72 72 20 3d 20 30 3b 0a 0a 73 74 72 75 63  lErr = 0;..struc
31d0: 74 20 45 72 72 6f 72 20 7b 0a 20 20 69 6e 74 20  t Error {.  int 
31e0: 72 63 3b 0a 20 20 69 6e 74 20 69 4c 69 6e 65 3b  rc;.  int iLine;
31f0: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 7d  .  char *zErr;.}
3200: 3b 0a 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65  ;..struct Sqlite
3210: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62   {.  sqlite3 *db
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3240: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 74 61   handle */.  Sta
3250: 74 65 6d 65 6e 74 20 2a 70 43 61 63 68 65 3b 20  tement *pCache; 
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3270: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 63  Linked list of c
3280: 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73  ached statements
3290: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b   */.  int nText;
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
32c0: 20 61 72 72 61 79 20 61 74 20 61 54 65 78 74 5b   array at aText[
32d0: 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 54  ] */.  char **aT
32e0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
32f0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 64         /* Stored
3300: 20 74 65 78 74 20 72 65 73 75 6c 74 73 20 2a 2f   text results */
3310: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 53 74 61 74  .};..struct Stat
3320: 65 6d 65 6e 74 20 7b 0a 20 20 73 71 6c 69 74 65  ement {.  sqlite
3330: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
3340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
3350: 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
3360: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ent handle */.  
3370: 53 74 61 74 65 6d 65 6e 74 20 2a 70 4e 65 78 74  Statement *pNext
3380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3390: 2f 2a 20 4e 65 78 74 20 73 74 61 74 65 6d 65 6e  /* Next statemen
33a0: 74 20 69 6e 20 6c 69 6e 6b 65 64 2d 6c 69 73 74  t in linked-list
33b0: 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 54   */.};..struct T
33c0: 68 72 65 61 64 20 7b 0a 20 20 69 6e 74 20 69 54  hread {.  int iT
33d0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
33e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72            /* Thr
33f0: 65 61 64 20 6e 75 6d 62 65 72 20 77 69 74 68 69  ead number withi
3400: 6e 20 74 65 73 74 20 2a 2f 0a 20 20 76 6f 69 64  n test */.  void
3410: 2a 20 70 41 72 67 3b 20 20 20 20 20 20 20 20 20  * pArg;         
3420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3430: 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20  ointer argument 
3440: 70 61 73 73 65 64 20 62 79 20 63 61 6c 6c 65 72  passed by caller
3450: 20 2a 2f 0a 0a 20 20 70 74 68 72 65 61 64 5f 74   */..  pthread_t
3460: 20 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   tid;           
3470: 20 20 20 20 20 20 20 2f 2a 20 54 68 72 65 61 64         /* Thread
3480: 20 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 28   id */.  char *(
3490: 2a 78 50 72 6f 63 29 28 69 6e 74 2c 20 76 6f 69  *xProc)(int, voi
34a0: 64 2a 29 3b 20 20 20 20 20 2f 2a 20 54 68 72 65  d*);     /* Thre
34b0: 61 64 20 6d 61 69 6e 20 70 72 6f 63 20 2a 2f 0a  ad main proc */.
34c0: 20 20 54 68 72 65 61 64 20 2a 70 4e 65 78 74 3b    Thread *pNext;
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 74 68 69    /* Next in thi
34f0: 73 20 6c 69 73 74 20 6f 66 20 74 68 72 65 61 64  s list of thread
3500: 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  s */.};..struct 
3510: 54 68 72 65 61 64 73 65 74 20 7b 0a 20 20 69 6e  Threadset {.  in
3520: 74 20 69 4d 61 78 54 69 64 3b 20 20 20 20 20 20  t iMaxTid;      
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3540: 20 4c 61 72 67 65 73 74 20 69 54 69 64 20 76 61   Largest iTid va
3550: 6c 75 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 6f  lue allocated so
3560: 20 66 61 72 20 2a 2f 0a 20 20 54 68 72 65 61 64   far */.  Thread
3570: 20 2a 70 54 68 72 65 61 64 3b 20 20 20 20 20 20   *pThread;      
3580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
3590: 6b 65 64 20 6c 69 73 74 20 6f 66 20 74 68 72 65  ked list of thre
35a0: 61 64 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69  ads */.};..stati
35b0: 63 20 76 6f 69 64 20 66 72 65 65 5f 65 72 72 28  c void free_err(
35c0: 45 72 72 6f 72 20 2a 70 29 7b 0a 20 20 73 71 6c  Error *p){.  sql
35d0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 45 72  ite3_free(p->zEr
35e0: 72 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 20 3d 20  r);.  p->zErr = 
35f0: 30 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 30 3b 0a  0;.  p->rc = 0;.
3600: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  }..static void p
3610: 72 69 6e 74 5f 65 72 72 28 45 72 72 6f 72 20 2a  rint_err(Error *
3620: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  p){.  if( p->rc!
3630: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3640: 20 20 70 72 69 6e 74 66 28 22 45 72 72 6f 72 3a    printf("Error:
3650: 20 28 25 64 29 20 5c 22 25 73 5c 22 20 61 74 20   (%d) \"%s\" at 
3660: 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 70 2d 3e 72  line %d\n", p->r
3670: 63 2c 20 70 2d 3e 7a 45 72 72 2c 20 70 2d 3e 69  c, p->zErr, p->i
3680: 4c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Line);.    if( s
3690: 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
36a0: 2a 20 2d 20 6e 6f 20 73 75 63 68 20 74 61 62 6c  * - no such tabl
36b0: 65 3a 20 2a 22 2c 70 2d 3e 7a 45 72 72 29 21 3d  e: *",p->zErr)!=
36c0: 30 20 29 20 6e 47 6c 6f 62 61 6c 45 72 72 2b 2b  0 ) nGlobalErr++
36d0: 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64  ;.    fflush(std
36e0: 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  out);.  }.}..sta
36f0: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 5f 61  tic void print_a
3700: 6e 64 5f 66 72 65 65 5f 65 72 72 28 45 72 72 6f  nd_free_err(Erro
3710: 72 20 2a 70 29 7b 0a 20 20 70 72 69 6e 74 5f 65  r *p){.  print_e
3720: 72 72 28 70 29 3b 0a 20 20 66 72 65 65 5f 65 72  rr(p);.  free_er
3730: 72 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  r(p);.}..static 
3740: 76 6f 69 64 20 73 79 73 74 65 6d 5f 65 72 72 6f  void system_erro
3750: 72 28 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 69  r(Error *pErr, i
3760: 6e 74 20 69 53 79 73 29 7b 0a 20 20 70 45 72 72  nt iSys){.  pErr
3770: 2d 3e 72 63 20 3d 20 69 53 79 73 3b 0a 20 20 70  ->rc = iSys;.  p
3780: 45 72 72 2d 3e 7a 45 72 72 20 3d 20 28 63 68 61  Err->zErr = (cha
3790: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
37a0: 6f 63 28 35 31 32 29 3b 0a 20 20 73 74 72 65 72  oc(512);.  strer
37b0: 72 6f 72 5f 72 28 69 53 79 73 2c 20 70 45 72 72  ror_r(iSys, pErr
37c0: 2d 3e 7a 45 72 72 2c 20 35 31 32 29 3b 0a 20 20  ->zErr, 512);.  
37d0: 70 45 72 72 2d 3e 7a 45 72 72 5b 35 31 31 5d 20  pErr->zErr[511] 
37e0: 3d 20 27 5c 30 27 3b 0a 7d 0a 0a 73 74 61 74 69  = '\0';.}..stati
37f0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 5f 65 72  c void sqlite_er
3800: 72 6f 72 28 0a 20 20 45 72 72 6f 72 20 2a 70 45  ror(.  Error *pE
3810: 72 72 2c 20 0a 20 20 53 71 6c 69 74 65 20 2a 70  rr, .  Sqlite *p
3820: 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Db, .  const cha
3830: 72 20 2a 7a 46 75 6e 63 0a 29 7b 0a 20 20 70 45  r *zFunc.){.  pE
3840: 72 72 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33  rr->rc = sqlite3
3850: 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
3860: 29 3b 0a 20 20 70 45 72 72 2d 3e 7a 45 72 72 20  );.  pErr->zErr 
3870: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3880: 66 28 0a 20 20 20 20 20 20 22 73 71 6c 69 74 65  f(.      "sqlite
3890: 33 5f 25 73 28 29 20 2d 20 25 73 20 28 25 64 29  3_%s() - %s (%d)
38a0: 22 2c 20 7a 46 75 6e 63 2c 20 73 71 6c 69 74 65  ", zFunc, sqlite
38b0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
38c0: 29 2c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ),.      sqlite3
38d0: 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
38e0: 65 28 70 44 62 2d 3e 64 62 29 0a 20 20 29 3b 0a  e(pDb->db).  );.
38f0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
3900: 65 73 74 5f 65 72 72 6f 72 5f 78 28 0a 20 20 45  est_error_x(.  E
3910: 72 72 6f 72 20 2a 70 45 72 72 2c 0a 20 20 63 68  rror *pErr,.  ch
3920: 61 72 20 2a 7a 45 72 72 0a 29 7b 0a 20 20 69 66  ar *zErr.){.  if
3930: 28 20 70 45 72 72 2d 3e 72 63 3d 3d 53 51 4c 49  ( pErr->rc==SQLI
3940: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 45 72  TE_OK ){.    pEr
3950: 72 2d 3e 72 63 20 3d 20 31 3b 0a 20 20 20 20 70  r->rc = 1;.    p
3960: 45 72 72 2d 3e 7a 45 72 72 20 3d 20 7a 45 72 72  Err->zErr = zErr
3970: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
3980: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
3990: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
39a0: 20 76 6f 69 64 20 63 6c 65 61 72 5f 65 72 72 6f   void clear_erro
39b0: 72 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70 45  r_x(.  Error *pE
39c0: 72 72 2c 0a 20 20 69 6e 74 20 72 63 0a 29 7b 0a  rr,.  int rc.){.
39d0: 20 20 69 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d    if( pErr->rc==
39e0: 72 63 20 29 7b 0a 20 20 20 20 70 45 72 72 2d 3e  rc ){.    pErr->
39f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
3a00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3a10: 28 70 45 72 72 2d 3e 7a 45 72 72 29 3b 0a 20 20  (pErr->zErr);.  
3a20: 20 20 70 45 72 72 2d 3e 7a 45 72 72 20 3d 20 30    pErr->zErr = 0
3a30: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
3a40: 69 6e 74 20 62 75 73 79 68 61 6e 64 6c 65 72 28  int busyhandler(
3a50: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
3a60: 6e 29 7b 0a 20 20 75 73 6c 65 65 70 28 31 30 2a  n){.  usleep(10*
3a70: 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
3a80: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  1;.}..static voi
3a90: 64 20 6f 70 65 6e 64 62 5f 78 28 0a 20 20 45 72  d opendb_x(.  Er
3aa0: 72 6f 72 20 2a 70 45 72 72 2c 20 20 20 20 20 20  ror *pErr,      
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ac0: 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
3ad0: 6f 64 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20  ode */.  Sqlite 
3ae0: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
3af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
3b00: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
3b10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3b20: 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *zFile,        
3b30: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3b40: 65 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  e file name */. 
3b50: 20 69 6e 74 20 62 44 65 6c 65 74 65 20 20 20 20   int bDelete    
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65   /* True to dele
3b80: 74 65 20 64 62 20 66 69 6c 65 20 62 65 66 6f 72  te db file befor
3b90: 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 29 7b 0a  e opening */.){.
3ba0: 20 20 69 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d    if( pErr->rc==
3bb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3bc0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
3bd0: 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
3be0: 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
3bf0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
3c00: 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
3c10: 4e 5f 55 52 49 3b 0a 20 20 20 20 69 66 28 20 62  N_URI;.    if( b
3c20: 44 65 6c 65 74 65 20 29 20 75 6e 6c 69 6e 6b 28  Delete ) unlink(
3c30: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
3c40: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
3c50: 28 7a 46 69 6c 65 2c 20 26 70 44 62 2d 3e 64 62  (zFile, &pDb->db
3c60: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
3c70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
3c80: 20 73 71 6c 69 74 65 5f 65 72 72 6f 72 28 70 45   sqlite_error(pE
3c90: 72 72 2c 20 70 44 62 2c 20 22 6f 70 65 6e 22 29  rr, pDb, "open")
3ca0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3cb0: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
3cc0: 20 20 20 20 20 20 70 44 62 2d 3e 64 62 20 3d 20        pDb->db = 
3cd0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
3ce0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
3cf0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
3d00: 20 20 20 20 20 20 20 70 44 62 2d 3e 64 62 2c 20         pDb->db, 
3d10: 22 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51  "md5sum", -1, SQ
3d20: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
3d30: 20 6d 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e   md5step, md5fin
3d40: 61 6c 69 7a 65 0a 20 20 20 20 20 20 29 3b 0a 20  alize.      );. 
3d50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
3d60: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
3d70: 62 2c 20 62 75 73 79 68 61 6e 64 6c 65 72 2c 20  b, busyhandler, 
3d80: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
3d90: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
3da0: 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e  "PRAGMA synchron
3db0: 6f 75 73 3d 4f 46 46 22 2c 20 30 2c 20 30 2c 20  ous=OFF", 0, 0, 
3dc0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  0);.    }.  }.}.
3dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
3de0: 73 65 64 62 5f 78 28 0a 20 20 45 72 72 6f 72 20  sedb_x(.  Error 
3df0: 2a 70 45 72 72 2c 20 20 20 20 20 20 20 20 20 20  *pErr,          
3e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
3e10: 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
3e20: 2a 2f 0a 20 20 53 71 6c 69 74 65 20 2a 70 44 62  */.  Sqlite *pDb
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 61 74       /* OUT: Dat
3e50: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
3e60: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
3e70: 6e 74 20 69 3b 0a 20 20 53 74 61 74 65 6d 65 6e  nt i;.  Statemen
3e80: 74 20 2a 70 49 74 65 72 3b 0a 20 20 53 74 61 74  t *pIter;.  Stat
3e90: 65 6d 65 6e 74 20 2a 70 4e 65 78 74 3b 0a 20 20  ement *pNext;.  
3ea0: 66 6f 72 28 70 49 74 65 72 3d 70 44 62 2d 3e 70  for(pIter=pDb->p
3eb0: 43 61 63 68 65 3b 20 70 49 74 65 72 3b 20 70 49  Cache; pIter; pI
3ec0: 74 65 72 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ter=pNext){.    
3ed0: 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70  pNext = pIter->p
3ee0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
3ef0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
3f00: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  ->pStmt);.    sq
3f10: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
3f20: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
3f30: 3b 20 69 3c 70 44 62 2d 3e 6e 54 65 78 74 3b 20  ; i<pDb->nText; 
3f40: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
3f50: 33 5f 66 72 65 65 28 70 44 62 2d 3e 61 54 65 78  3_free(pDb->aTex
3f60: 74 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  t[i]);.  }.  sql
3f70: 69 74 65 33 5f 66 72 65 65 28 70 44 62 2d 3e 61  ite3_free(pDb->a
3f80: 54 65 78 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  Text);.  rc = sq
3f90: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d  lite3_close(pDb-
3fa0: 3e 64 62 29 3b 0a 20 20 69 66 28 20 72 63 20 26  >db);.  if( rc &
3fb0: 26 20 70 45 72 72 2d 3e 72 63 3d 3d 53 51 4c 49  & pErr->rc==SQLI
3fc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 45 72  TE_OK ){.    pEr
3fd0: 72 2d 3e 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  r->zErr = sqlite
3fe0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
3ff0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
4000: 44 62 2d 3e 64 62 29 29 3b 0a 20 20 7d 0a 20 20  Db->db));.  }.  
4010: 6d 65 6d 73 65 74 28 70 44 62 2c 20 30 2c 20 73  memset(pDb, 0, s
4020: 69 7a 65 6f 66 28 53 71 6c 69 74 65 29 29 3b 0a  izeof(Sqlite));.
4030: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  }..static void s
4040: 71 6c 5f 73 63 72 69 70 74 5f 78 28 0a 20 20 45  ql_script_x(.  E
4050: 72 72 6f 72 20 2a 70 45 72 72 2c 20 20 20 20 20  rror *pErr,     
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4070: 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
4080: 63 6f 64 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65  code */.  Sqlite
4090: 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20   *pDb,          
40a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
40b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
40c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
40d0: 71 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ql              
40e0: 20 20 2f 2a 20 53 51 4c 20 73 63 72 69 70 74 20    /* SQL script 
40f0: 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 29 7b  to execute */.){
4100: 0a 20 20 69 66 28 20 70 45 72 72 2d 3e 72 63 3d  .  if( pErr->rc=
4110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4120: 20 20 70 45 72 72 2d 3e 72 63 20 3d 20 73 71 6c    pErr->rc = sql
4130: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
4140: 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26  b, zSql, 0, 0, &
4150: 70 45 72 72 2d 3e 7a 45 72 72 29 3b 0a 20 20 7d  pErr->zErr);.  }
4160: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4170: 73 71 6c 5f 73 63 72 69 70 74 5f 70 72 69 6e 74  sql_script_print
4180: 66 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70 45  f_x(.  Error *pE
4190: 72 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rr,             
41a0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
41b0: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
41c0: 20 20 53 71 6c 69 74 65 20 2a 70 44 62 2c 20 20    Sqlite *pDb,  
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41e0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
41f0: 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
4200: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20  char *zFormat,  
4210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
4220: 20 70 72 69 6e 74 66 20 66 6f 72 6d 61 74 20 73   printf format s
4230: 74 72 69 6e 67 20 2a 2f 0a 20 20 2e 2e 2e 20 20  tring */.  ...  
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
4260: 69 6e 74 66 20 61 72 67 73 20 2a 2f 0a 29 7b 0a  intf args */.){.
4270: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 20 20 20    va_list ap;   
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 2f 2a 20 2e 2e 2e 20 70 72 69 6e 74 66 20    /* ... printf 
42a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 76  arguments */.  v
42b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
42c0: 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 45 72 72  mat);.  if( pErr
42d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
42e0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
42f0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  l = sqlite3_vmpr
4300: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
4310: 29 3b 0a 20 20 20 20 70 45 72 72 2d 3e 72 63 20  );.    pErr->rc 
4320: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
4330: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  Db->db, zSql, 0,
4340: 20 30 2c 20 26 70 45 72 72 2d 3e 7a 45 72 72 29   0, &pErr->zErr)
4350: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4360: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20  ee(zSql);.  }.  
4370: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 73  va_end(ap);.}..s
4380: 74 61 74 69 63 20 53 74 61 74 65 6d 65 6e 74 20  tatic Statement 
4390: 2a 67 65 74 53 71 6c 53 74 61 74 65 6d 65 6e 74  *getSqlStatement
43a0: 28 0a 20 20 45 72 72 6f 72 20 2a 70 45 72 72 2c  (.  Error *pErr,
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
43d0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 53  rror code */.  S
43e0: 71 6c 69 74 65 20 2a 70 44 62 2c 20 20 20 20 20  qlite *pDb,     
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4400: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
4410: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
4420: 72 20 2a 7a 53 71 6c 20 20 20 20 20 20 20 20 20  r *zSql         
4430: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
4440: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
4450: 53 74 61 74 65 6d 65 6e 74 20 2a 70 52 65 74 3b  Statement *pRet;
4460: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 66 6f  .  int rc;..  fo
4470: 72 28 70 52 65 74 3d 70 44 62 2d 3e 70 43 61 63  r(pRet=pDb->pCac
4480: 68 65 3b 20 70 52 65 74 3b 20 70 52 65 74 3d 70  he; pRet; pRet=p
4490: 52 65 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Ret->pNext){.   
44a0: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 73   if( 0==strcmp(s
44b0: 71 6c 69 74 65 33 5f 73 71 6c 28 70 52 65 74 2d  qlite3_sql(pRet-
44c0: 3e 70 53 74 6d 74 29 2c 20 7a 53 71 6c 29 20 29  >pStmt), zSql) )
44d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
44e0: 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Ret;.    }.  }..
44f0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
4500: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53  _malloc(sizeof(S
4510: 74 61 74 65 6d 65 6e 74 29 29 3b 0a 20 20 72 63  tatement));.  rc
4520: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
4530: 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a  re_v2(pDb->db, z
4540: 53 71 6c 2c 20 2d 31 2c 20 26 70 52 65 74 2d 3e  Sql, -1, &pRet->
4550: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
4560: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4570: 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 65 72 72  {.    sqlite_err
4580: 6f 72 28 70 45 72 72 2c 20 70 44 62 2c 20 22 70  or(pErr, pDb, "p
4590: 72 65 70 61 72 65 5f 76 32 22 29 3b 0a 20 20 20  repare_v2");.   
45a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
45b0: 20 61 73 73 65 72 74 28 20 30 3d 3d 73 74 72 63   assert( 0==strc
45c0: 6d 70 28 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  mp(sqlite3_sql(p
45d0: 52 65 74 2d 3e 70 53 74 6d 74 29 2c 20 7a 53 71  Ret->pStmt), zSq
45e0: 6c 29 20 29 3b 0a 0a 20 20 70 52 65 74 2d 3e 70  l) );..  pRet->p
45f0: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 61 63  Next = pDb->pCac
4600: 68 65 3b 0a 20 20 70 44 62 2d 3e 70 43 61 63 68  he;.  pDb->pCach
4610: 65 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75  e = pRet;.  retu
4620: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61 74  rn pRet;.}..stat
4630: 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
4640: 2a 67 65 74 41 6e 64 42 69 6e 64 53 71 6c 53 74  *getAndBindSqlSt
4650: 61 74 65 6d 65 6e 74 28 0a 20 20 45 72 72 6f 72  atement(.  Error
4660: 20 2a 70 45 72 72 2c 20 20 20 20 20 20 20 20 20   *pErr,         
4670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
4680: 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
4690: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20 2a 70 44   */.  Sqlite *pD
46a0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
46b0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
46c0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 61  e handle */.  va
46d0: 5f 6c 69 73 74 20 61 70 20 20 20 20 20 20 20 20  _list ap        
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
46f0: 20 53 51 4c 20 66 6f 6c 6c 6f 77 65 64 20 62 79   SQL followed by
4700: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 29   parameters */.)
4710: 7b 0a 20 20 53 74 61 74 65 6d 65 6e 74 20 2a 70  {.  Statement *p
4720: 53 74 61 74 65 6d 65 6e 74 3b 20 20 20 20 20 20  Statement;      
4730: 20 20 20 20 2f 2a 20 54 68 65 20 53 51 4c 69 74      /* The SQLit
4740: 65 20 73 74 61 74 65 6d 65 6e 74 20 77 72 61 70  e statement wrap
4750: 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  per */.  sqlite3
4760: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
4770: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4780: 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
4790: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
47a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
47d0: 74 65 20 74 68 72 6f 75 67 68 20 70 61 72 61 6d  te through param
47e0: 65 74 65 72 73 20 2a 2f 0a 0a 20 20 70 53 74 61  eters */..  pSta
47f0: 74 65 6d 65 6e 74 20 3d 20 67 65 74 53 71 6c 53  tement = getSqlS
4800: 74 61 74 65 6d 65 6e 74 28 70 45 72 72 2c 20 70  tatement(pErr, p
4810: 44 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 63  Db, va_arg(ap, c
4820: 6f 6e 73 74 20 63 68 61 72 20 2a 29 29 3b 0a 20  onst char *));. 
4830: 20 69 66 28 20 21 70 53 74 61 74 65 6d 65 6e 74   if( !pStatement
4840: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4850: 53 74 6d 74 20 3d 20 70 53 74 61 74 65 6d 65 6e  Stmt = pStatemen
4860: 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 66 6f 72 28  t->pStmt;.  for(
4870: 69 3d 31 3b 20 69 3c 3d 73 71 6c 69 74 65 33 5f  i=1; i<=sqlite3_
4880: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
4890: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 20 69 2b 2b  ount(pStmt); i++
48a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
48b0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
48c0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
48d0: 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  r_name(pStmt, i)
48e0: 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20 70 41 72  ;.    void * pAr
48f0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
4900: 6f 69 64 2a 29 3b 0a 0a 20 20 20 20 73 77 69 74  oid*);..    swit
4910: 63 68 28 20 7a 4e 61 6d 65 5b 31 5d 20 29 7b 0a  ch( zName[1] ){.
4920: 20 20 20 20 20 20 63 61 73 65 20 27 69 27 3a 0a        case 'i':.
4930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4940: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
4950: 2c 20 69 2c 20 2a 28 69 36 34 20 2a 29 70 41 72  , i, *(i64 *)pAr
4960: 67 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  g);.        brea
4970: 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
4980: 74 3a 0a 20 20 20 20 20 20 20 20 70 45 72 72 2d  t:.        pErr-
4990: 3e 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  >rc = 1;.       
49a0: 20 70 45 72 72 2d 3e 7a 45 72 72 20 3d 20 73 71   pErr->zErr = sq
49b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43  lite3_mprintf("C
49c0: 61 6e 6e 6f 74 20 64 69 73 63 65 72 6e 20 74 79  annot discern ty
49d0: 70 65 3a 20 5c 22 25 73 5c 22 22 2c 20 7a 4e 61  pe: \"%s\"", zNa
49e0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74  me);.        pSt
49f0: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
4a00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4a10: 0a 0a 20 20 72 65 74 75 72 6e 20 70 53 74 6d 74  ..  return pStmt
4a20: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20  ;.}..static i64 
4a30: 65 78 65 63 73 71 6c 5f 69 36 34 5f 78 28 0a 20  execsql_i64_x(. 
4a40: 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 20 20   Error *pErr,   
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
4a70: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 53 71 6c 69  r code */.  Sqli
4a80: 74 65 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  te *pDb,        
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4aa0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
4ab0: 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  /.  ...         
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 20 20 20 20 2f 2a 20 53 51 4c 20 61 6e 64 20 70      /* SQL and p
4ae0: 6f 69 6e 74 65 72 73 20 74 6f 20 70 61 72 61 6d  ointers to param
4af0: 65 74 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 29  eter values */.)
4b00: 7b 0a 20 20 69 36 34 20 69 52 65 74 20 3d 20 30  {.  i64 iRet = 0
4b10: 3b 0a 20 20 69 66 28 20 70 45 72 72 2d 3e 72 63  ;.  if( pErr->rc
4b20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4b30: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
4b40: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
4b50: 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
4b60: 74 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  t to execute */.
4b70: 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 20      va_list ap; 
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 2f 2a 20 2e 2e 2e 20 61 72 67 75 6d 65 6e    /* ... argumen
4ba0: 74 73 20 2a 2f 0a 20 20 20 20 76 61 5f 73 74 61  ts */.    va_sta
4bb0: 72 74 28 61 70 2c 20 70 44 62 29 3b 0a 20 20 20  rt(ap, pDb);.   
4bc0: 20 70 53 74 6d 74 20 3d 20 67 65 74 41 6e 64 42   pStmt = getAndB
4bd0: 69 6e 64 53 71 6c 53 74 61 74 65 6d 65 6e 74 28  indSqlStatement(
4be0: 70 45 72 72 2c 20 70 44 62 2c 20 61 70 29 3b 0a  pErr, pDb, ap);.
4bf0: 20 20 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b      if( pStmt ){
4c00: 0a 20 20 20 20 20 20 69 6e 74 20 66 69 72 73 74  .      int first
4c10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 1;.      whil
4c20: 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
4c30: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
4c40: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  t) ){.        if
4c50: 28 20 66 69 72 73 74 20 26 26 20 73 71 6c 69 74  ( first && sqlit
4c60: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
4c70: 70 53 74 6d 74 29 3e 30 20 29 7b 0a 20 20 20 20  pStmt)>0 ){.    
4c80: 20 20 20 20 20 20 69 52 65 74 20 3d 20 73 71 6c        iRet = sql
4c90: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
4ca0: 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  4(pStmt, 0);.   
4cb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
4cc0: 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
4cd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  }.      if( SQLI
4ce0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 72  TE_OK!=sqlite3_r
4cf0: 65 73 65 74 28 70 53 74 6d 74 29 20 29 7b 0a 20  eset(pStmt) ){. 
4d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 65 72         sqlite_er
4d10: 72 6f 72 28 70 45 72 72 2c 20 70 44 62 2c 20 22  ror(pErr, pDb, "
4d20: 72 65 73 65 74 22 29 3b 0a 20 20 20 20 20 20 7d  reset");.      }
4d30: 0a 20 20 20 20 7d 0a 20 20 20 20 76 61 5f 65 6e  .    }.    va_en
4d40: 64 28 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  d(ap);.  }.  ret
4d50: 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn iRet;.}..sta
4d60: 74 69 63 20 63 68 61 72 20 2a 20 65 78 65 63 73  tic char * execs
4d70: 71 6c 5f 74 65 78 74 5f 78 28 0a 20 20 45 72 72  ql_text_x(.  Err
4d80: 6f 72 20 2a 70 45 72 72 2c 20 20 20 20 20 20 20  or *pErr,       
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4da0: 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
4db0: 64 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20 2a  de */.  Sqlite *
4dc0: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
4dd0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4de0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
4df0: 69 6e 74 20 69 53 6c 6f 74 2c 20 20 20 20 20 20  int iSlot,      
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 2f 2a 20 44 62 20 68 61 6e 64 6c 65 20 73 6c 6f  /* Db handle slo
4e20: 74 20 74 6f 20 73 74 6f 72 65 20 74 65 78 74 20  t to store text 
4e30: 69 6e 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20  in */.  ...     
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e50: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 61          /* SQL a
4e60: 6e 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 70  nd pointers to p
4e70: 61 72 61 6d 65 74 65 72 20 76 61 6c 75 65 73 20  arameter values 
4e80: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  */.){.  char *zR
4e90: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  et = 0;..  if( i
4ea0: 53 6c 6f 74 3e 3d 70 44 62 2d 3e 6e 54 65 78 74  Slot>=pDb->nText
4eb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
4ec0: 65 20 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20  e = sizeof(char 
4ed0: 2a 29 2a 28 69 53 6c 6f 74 2b 31 29 3b 0a 20 20  *)*(iSlot+1);.  
4ee0: 20 20 70 44 62 2d 3e 61 54 65 78 74 20 3d 20 28    pDb->aText = (
4ef0: 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
4f00: 72 65 61 6c 6c 6f 63 28 70 44 62 2d 3e 61 54 65  realloc(pDb->aTe
4f10: 78 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  xt, nByte);.    
4f20: 6d 65 6d 73 65 74 28 26 70 44 62 2d 3e 61 54 65  memset(&pDb->aTe
4f30: 78 74 5b 70 44 62 2d 3e 6e 54 65 78 74 5d 2c 20  xt[pDb->nText], 
4f40: 30 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  0, sizeof(char*)
4f50: 2a 28 69 53 6c 6f 74 2b 31 2d 70 44 62 2d 3e 6e  *(iSlot+1-pDb->n
4f60: 54 65 78 74 29 29 3b 0a 20 20 20 20 70 44 62 2d  Text));.    pDb-
4f70: 3e 6e 54 65 78 74 20 3d 20 69 53 6c 6f 74 2b 31  >nText = iSlot+1
4f80: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 72  ;.  }..  if( pEr
4f90: 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  r->rc==SQLITE_OK
4fa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4fb0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
4fc0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
4fd0: 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
4fe0: 65 20 2a 2f 0a 20 20 20 20 76 61 5f 6c 69 73 74  e */.    va_list
4ff0: 20 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   ap;            
5000: 20 20 20 20 20 20 20 2f 2a 20 2e 2e 2e 20 61 72         /* ... ar
5010: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 76  guments */.    v
5020: 61 5f 73 74 61 72 74 28 61 70 2c 20 69 53 6c 6f  a_start(ap, iSlo
5030: 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
5040: 67 65 74 41 6e 64 42 69 6e 64 53 71 6c 53 74 61  getAndBindSqlSta
5050: 74 65 6d 65 6e 74 28 70 45 72 72 2c 20 70 44 62  tement(pErr, pDb
5060: 2c 20 61 70 29 3b 0a 20 20 20 20 69 66 28 20 70  , ap);.    if( p
5070: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  Stmt ){.      in
5080: 74 20 66 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  t first = 1;.   
5090: 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
50a0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
50b0: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
50c0: 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20 26       if( first &
50d0: 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
50e0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3e 30 20  _count(pStmt)>0 
50f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  ){.          zRe
5100: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
5110: 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
5120: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
5130: 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  tmt, 0));.      
5140: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5150: 28 70 44 62 2d 3e 61 54 65 78 74 5b 69 53 6c 6f  (pDb->aText[iSlo
5160: 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t]);.          p
5170: 44 62 2d 3e 61 54 65 78 74 5b 69 53 6c 6f 74 5d  Db->aText[iSlot]
5180: 20 3d 20 7a 52 65 74 3b 0a 20 20 20 20 20 20 20   = zRet;.       
5190: 20 7d 0a 20 20 20 20 20 20 20 20 66 69 72 73 74   }.        first
51a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
51b0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
51c0: 4b 21 3d 73 71 6c 69 74 65 33 5f 72 65 73 65 74  K!=sqlite3_reset
51d0: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
51e0: 20 20 20 73 71 6c 69 74 65 5f 65 72 72 6f 72 28     sqlite_error(
51f0: 70 45 72 72 2c 20 70 44 62 2c 20 22 72 65 73 65  pErr, pDb, "rese
5200: 74 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t");.      }.   
5210: 20 7d 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70   }.    va_end(ap
5220: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
5230: 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63   zRet;.}..static
5240: 20 76 6f 69 64 20 69 6e 74 65 67 72 69 74 79 5f   void integrity_
5250: 63 68 65 63 6b 5f 78 28 0a 20 20 45 72 72 6f 72  check_x(.  Error
5260: 20 2a 70 45 72 72 2c 20 20 20 20 20 20 20 20 20   *pErr,         
5270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
5280: 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
5290: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20 2a 70 44   */.  Sqlite *pD
52a0: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
52b0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
52c0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20  e handle */.){. 
52d0: 20 69 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d 53   if( pErr->rc==S
52e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
52f0: 53 74 61 74 65 6d 65 6e 74 20 2a 70 53 74 61 74  Statement *pStat
5300: 65 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  ement;        /*
5310: 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   Statement to ex
5320: 65 63 75 74 65 20 2a 2f 0a 20 20 20 20 63 68 61  ecute */.    cha
5330: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 20 20 20 20  r *zErr = 0;    
5340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
5350: 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 65 72  tegrity check er
5360: 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 53 74 61  ror */..    pSta
5370: 74 65 6d 65 6e 74 20 3d 20 67 65 74 53 71 6c 53  tement = getSqlS
5380: 74 61 74 65 6d 65 6e 74 28 70 45 72 72 2c 20 70  tatement(pErr, p
5390: 44 62 2c 20 22 50 52 41 47 4d 41 20 69 6e 74 65  Db, "PRAGMA inte
53a0: 67 72 69 74 79 5f 63 68 65 63 6b 22 29 3b 0a 20  grity_check");. 
53b0: 20 20 20 69 66 28 20 70 53 74 61 74 65 6d 65 6e     if( pStatemen
53c0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
53d0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
53e0: 20 70 53 74 61 74 65 6d 65 6e 74 2d 3e 70 53 74   pStatement->pSt
53f0: 6d 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  mt;.      while(
5400: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
5410: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
5420: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
5430: 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
5440: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
5450: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
5460: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mt, 0);.        
5470: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 6f  if( strcmp(z, "o
5480: 6b 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k") ){.         
5490: 20 69 66 28 20 7a 45 72 72 3d 3d 30 20 29 7b 0a   if( zErr==0 ){.
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 72 72              zErr
54b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
54c0: 74 66 28 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  tf("%s", z);.   
54d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
54e0: 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d            zErr =
54f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5500: 28 22 25 7a 5c 6e 25 73 22 2c 20 7a 45 72 72 2c  ("%z\n%s", zErr,
5510: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   z);.          }
5520: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5530: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5540: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a  _reset(pStmt);..
5550: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29        if( zErr )
5560: 7b 0a 20 20 20 20 20 20 20 20 70 45 72 72 2d 3e  {.        pErr->
5570: 7a 45 72 72 20 3d 20 7a 45 72 72 3b 0a 20 20 20  zErr = zErr;.   
5580: 20 20 20 20 20 70 45 72 72 2d 3e 72 63 20 3d 20       pErr->rc = 
5590: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
55a0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
55b0: 6f 69 64 20 2a 6c 61 75 6e 63 68 5f 74 68 72 65  oid *launch_thre
55c0: 61 64 5f 6d 61 69 6e 28 76 6f 69 64 20 2a 70 41  ad_main(void *pA
55d0: 72 67 29 7b 0a 20 20 54 68 72 65 61 64 20 2a 70  rg){.  Thread *p
55e0: 20 3d 20 28 54 68 72 65 61 64 20 2a 29 70 41 72   = (Thread *)pAr
55f0: 67 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  g;.  return (voi
5600: 64 20 2a 29 70 2d 3e 78 50 72 6f 63 28 70 2d 3e  d *)p->xProc(p->
5610: 69 54 69 64 2c 20 70 2d 3e 70 41 72 67 29 3b 0a  iTid, p->pArg);.
5620: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  }..static void l
5630: 61 75 6e 63 68 5f 74 68 72 65 61 64 5f 78 28 0a  aunch_thread_x(.
5640: 20 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 20    Error *pErr,  
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
5670: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 54 68 72  or code */.  Thr
5680: 65 61 64 73 65 74 20 2a 70 54 68 72 65 61 64 73  eadset *pThreads
5690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
56a0: 54 68 72 65 61 64 20 73 65 74 20 2a 2f 0a 20 20  Thread set */.  
56b0: 63 68 61 72 20 2a 28 2a 78 50 72 6f 63 29 28 69  char *(*xProc)(i
56c0: 6e 74 2c 20 76 6f 69 64 2a 29 2c 20 20 20 20 20  nt, void*),     
56d0: 2f 2a 20 50 72 6f 63 20 74 6f 20 72 75 6e 20 2a  /* Proc to run *
56e0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
5710: 70 61 73 73 65 64 20 74 6f 20 74 68 72 65 61 64  passed to thread
5720: 20 70 72 6f 63 20 2a 2f 0a 29 7b 0a 20 20 69 66   proc */.){.  if
5730: 28 20 70 45 72 72 2d 3e 72 63 3d 3d 53 51 4c 49  ( pErr->rc==SQLI
5740: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
5750: 20 69 54 69 64 20 3d 20 2b 2b 70 54 68 72 65 61   iTid = ++pThrea
5760: 64 73 2d 3e 69 4d 61 78 54 69 64 3b 0a 20 20 20  ds->iMaxTid;.   
5770: 20 54 68 72 65 61 64 20 2a 70 3b 0a 20 20 20 20   Thread *p;.    
5780: 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 70 20 3d  int rc;..    p =
5790: 20 28 54 68 72 65 61 64 20 2a 29 73 71 6c 69 74   (Thread *)sqlit
57a0: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
57b0: 28 54 68 72 65 61 64 29 29 3b 0a 20 20 20 20 6d  (Thread));.    m
57c0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
57d0: 6f 66 28 54 68 72 65 61 64 29 29 3b 0a 20 20 20  of(Thread));.   
57e0: 20 70 2d 3e 69 54 69 64 20 3d 20 69 54 69 64 3b   p->iTid = iTid;
57f0: 0a 20 20 20 20 70 2d 3e 70 41 72 67 20 3d 20 70  .    p->pArg = p
5800: 41 72 67 3b 0a 20 20 20 20 70 2d 3e 78 50 72 6f  Arg;.    p->xPro
5810: 63 20 3d 20 78 50 72 6f 63 3b 0a 0a 20 20 20 20  c = xProc;..    
5820: 72 63 20 3d 20 70 74 68 72 65 61 64 5f 63 72 65  rc = pthread_cre
5830: 61 74 65 28 26 70 2d 3e 74 69 64 2c 20 4e 55 4c  ate(&p->tid, NUL
5840: 4c 2c 20 6c 61 75 6e 63 68 5f 74 68 72 65 61 64  L, launch_thread
5850: 5f 6d 61 69 6e 2c 20 28 76 6f 69 64 20 2a 29 70  _main, (void *)p
5860: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
5870: 20 29 7b 0a 20 20 20 20 20 20 73 79 73 74 65 6d   ){.      system
5880: 5f 65 72 72 6f 72 28 70 45 72 72 2c 20 72 63 29  _error(pErr, rc)
5890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
58a0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c  free(p);.    }el
58b0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  se{.      p->pNe
58c0: 78 74 20 3d 20 70 54 68 72 65 61 64 73 2d 3e 70  xt = pThreads->p
58d0: 54 68 72 65 61 64 3b 0a 20 20 20 20 20 20 70 54  Thread;.      pT
58e0: 68 72 65 61 64 73 2d 3e 70 54 68 72 65 61 64 20  hreads->pThread 
58f0: 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = p;.    }.  }.}
5900: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 6f  ..static void jo
5910: 69 6e 5f 61 6c 6c 5f 74 68 72 65 61 64 73 5f 78  in_all_threads_x
5920: 28 0a 20 20 45 72 72 6f 72 20 2a 70 45 72 72 2c  (.  Error *pErr,
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
5950: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 54  rror code */.  T
5960: 68 72 65 61 64 73 65 74 20 2a 70 54 68 72 65 61  hreadset *pThrea
5970: 64 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ds             /
5980: 2a 20 54 68 72 65 61 64 20 73 65 74 20 2a 2f 0a  * Thread set */.
5990: 29 7b 0a 20 20 54 68 72 65 61 64 20 2a 70 3b 0a  ){.  Thread *p;.
59a0: 20 20 54 68 72 65 61 64 20 2a 70 4e 65 78 74 3b    Thread *pNext;
59b0: 0a 20 20 66 6f 72 28 70 3d 70 54 68 72 65 61 64  .  for(p=pThread
59c0: 73 2d 3e 70 54 68 72 65 61 64 3b 20 70 3b 20 70  s->pThread; p; p
59d0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 76 6f 69  =pNext){.    voi
59e0: 64 20 2a 72 65 74 3b 0a 20 20 20 20 70 4e 65 78  d *ret;.    pNex
59f0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
5a00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
5a10: 20 3d 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28   = pthread_join(
5a20: 70 2d 3e 74 69 64 2c 20 26 72 65 74 29 3b 0a 20  p->tid, &ret);. 
5a30: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
5a40: 20 20 20 20 20 20 69 66 28 20 70 45 72 72 2d 3e        if( pErr->
5a50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
5a60: 73 79 73 74 65 6d 5f 65 72 72 6f 72 28 70 45 72  system_error(pEr
5a70: 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 65 6c 73  r, rc);.    }els
5a80: 65 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  e{.      printf(
5a90: 22 54 68 72 65 61 64 20 25 64 20 73 61 79 73 3a  "Thread %d says:
5aa0: 20 25 73 5c 6e 22 2c 20 70 2d 3e 69 54 69 64 2c   %s\n", p->iTid,
5ab0: 20 28 72 65 74 3d 3d 30 20 3f 20 22 2e 2e 2e 22   (ret==0 ? "..."
5ac0: 20 3a 20 28 63 68 61 72 20 2a 29 72 65 74 29 29   : (char *)ret))
5ad0: 3b 0a 20 20 20 20 20 20 66 66 6c 75 73 68 28 73  ;.      fflush(s
5ae0: 74 64 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  tdout);.    }.  
5af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5b00: 29 3b 0a 20 20 7d 0a 20 20 70 54 68 72 65 61 64  );.  }.  pThread
5b10: 73 2d 3e 70 54 68 72 65 61 64 20 3d 20 30 3b 0a  s->pThread = 0;.
5b20: 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 69  }..static i64 fi
5b30: 6c 65 73 69 7a 65 5f 78 28 0a 20 20 45 72 72 6f  lesize_x(.  Erro
5b40: 72 20 2a 70 45 72 72 2c 0a 20 20 63 6f 6e 73 74  r *pErr,.  const
5b50: 20 63 68 61 72 20 2a 7a 46 69 6c 65 0a 29 7b 0a   char *zFile.){.
5b60: 20 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a    i64 iRet = 0;.
5b70: 20 20 69 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d    if( pErr->rc==
5b80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5b90: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
5ba0: 61 74 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74  at;.    if( stat
5bb0: 28 7a 46 69 6c 65 2c 20 26 73 53 74 61 74 29 20  (zFile, &sStat) 
5bc0: 29 7b 0a 20 20 20 20 20 20 69 52 65 74 20 3d 20  ){.      iRet = 
5bd0: 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
5be0: 20 20 20 20 20 69 52 65 74 20 3d 20 73 53 74 61       iRet = sSta
5bf0: 74 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 20 20 7d  t.st_size;.    }
5c00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
5c10: 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  et;.}..static vo
5c20: 69 64 20 66 69 6c 65 63 6f 70 79 5f 78 28 0a 20  id filecopy_x(. 
5c30: 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 0a 20 20   Error *pErr,.  
5c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72 6f  const char *zFro
5c50: 6d 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  m,.  const char 
5c60: 2a 7a 54 6f 0a 29 7b 0a 20 20 69 66 28 20 70 45  *zTo.){.  if( pE
5c70: 72 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rr->rc==SQLITE_O
5c80: 4b 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 42 79  K ){.    i64 nBy
5c90: 74 65 20 3d 20 66 69 6c 65 73 69 7a 65 5f 78 28  te = filesize_x(
5ca0: 70 45 72 72 2c 20 7a 46 72 6f 6d 29 3b 0a 20 20  pErr, zFrom);.  
5cb0: 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b    if( nByte<0 ){
5cc0: 0a 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6f  .      test_erro
5cd0: 72 5f 78 28 70 45 72 72 2c 20 73 71 6c 69 74 65  r_x(pErr, sqlite
5ce0: 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
5cf0: 63 68 20 66 69 6c 65 3a 20 25 73 22 2c 20 7a 46  ch file: %s", zF
5d00: 72 6f 6d 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rom));.    }else
5d10: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 4f 66 66  {.      i64 iOff
5d20: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 42 75  ;.      char aBu
5d30: 66 5b 31 30 32 34 5d 3b 0a 20 20 20 20 20 20 69  f[1024];.      i
5d40: 6e 74 20 66 64 31 3b 0a 20 20 20 20 20 20 69 6e  nt fd1;.      in
5d50: 74 20 66 64 32 3b 0a 20 20 20 20 20 20 75 6e 6c  t fd2;.      unl
5d60: 69 6e 6b 28 7a 54 6f 29 3b 0a 0a 20 20 20 20 20  ink(zTo);..     
5d70: 20 66 64 31 20 3d 20 6f 70 65 6e 28 7a 46 72 6f   fd1 = open(zFro
5d80: 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  m, O_RDONLY);.  
5d90: 20 20 20 20 69 66 28 20 66 64 31 3c 30 20 29 7b      if( fd1<0 ){
5da0: 0a 20 20 20 20 20 20 20 20 73 79 73 74 65 6d 5f  .        system_
5db0: 65 72 72 6f 72 28 70 45 72 72 2c 20 65 72 72 6e  error(pErr, errn
5dc0: 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  o);.        retu
5dd0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5de0: 20 20 66 64 32 20 3d 20 6f 70 65 6e 28 7a 54 6f    fd2 = open(zTo
5df0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
5e00: 7c 4f 5f 45 58 43 4c 2c 20 30 36 34 34 29 3b 0a  |O_EXCL, 0644);.
5e10: 20 20 20 20 20 20 69 66 28 20 66 64 32 3c 30 20        if( fd2<0 
5e20: 29 7b 0a 20 20 20 20 20 20 20 20 73 79 73 74 65  ){.        syste
5e30: 6d 5f 65 72 72 6f 72 28 70 45 72 72 2c 20 65 72  m_error(pErr, er
5e40: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  rno);.        cl
5e50: 6f 73 65 28 66 64 31 29 3b 0a 20 20 20 20 20 20  ose(fd1);.      
5e60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
5e70: 7d 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  }..      iOff = 
5e80: 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
5e90: 69 4f 66 66 3c 6e 42 79 74 65 20 29 7b 0a 20 20  iOff<nByte ){.  
5ea0: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
5eb0: 3d 20 73 69 7a 65 6f 66 28 61 42 75 66 29 3b 0a  = sizeof(aBuf);.
5ec0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 6f 70          if( nCop
5ed0: 79 2b 69 4f 66 66 3e 6e 42 79 74 65 20 29 7b 0a  y+iOff>nByte ){.
5ee0: 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
5ef0: 3d 20 6e 42 79 74 65 20 2d 20 69 4f 66 66 3b 0a  = nByte - iOff;.
5f00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5f10: 20 20 69 66 28 20 6e 43 6f 70 79 21 3d 72 65 61    if( nCopy!=rea
5f20: 64 28 66 64 31 2c 20 61 42 75 66 2c 20 6e 43 6f  d(fd1, aBuf, nCo
5f30: 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  py) ){.         
5f40: 20 73 79 73 74 65 6d 5f 65 72 72 6f 72 28 70 45   system_error(pE
5f50: 72 72 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  rr, errno);.    
5f60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5f80: 66 28 20 6e 43 6f 70 79 21 3d 77 72 69 74 65 28  f( nCopy!=write(
5f90: 66 64 32 2c 20 61 42 75 66 2c 20 6e 43 6f 70 79  fd2, aBuf, nCopy
5fa0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
5fb0: 79 73 74 65 6d 5f 65 72 72 6f 72 28 70 45 72 72  ystem_error(pErr
5fc0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
5fd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5fe0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4f 66     }.        iOf
5ff0: 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  f += nCopy;.    
6000: 20 20 7d 0a 0a 20 20 20 20 20 20 63 6c 6f 73 65    }..      close
6010: 28 66 64 31 29 3b 0a 20 20 20 20 20 20 63 6c 6f  (fd1);.      clo
6020: 73 65 28 66 64 32 29 3b 0a 20 20 20 20 7d 0a 20  se(fd2);.    }. 
6030: 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 55 73 65   }.}../* .** Use
6040: 64 20 62 79 20 73 65 74 73 74 6f 70 74 69 6d 65  d by setstoptime
6050: 28 29 20 61 6e 64 20 74 69 6d 65 74 6f 73 74 6f  () and timetosto
6060: 70 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  p()..*/.static d
6070: 6f 75 62 6c 65 20 74 69 6d 65 6c 69 6d 69 74 20  ouble timelimit 
6080: 3d 20 30 2e 30 3b 0a 73 74 61 74 69 63 20 73 71  = 0.0;.static sq
6090: 6c 69 74 65 33 5f 76 66 73 20 2a 70 54 69 6d 65  lite3_vfs *pTime
60a0: 6c 69 6d 69 74 56 66 73 20 3d 20 30 3b 0a 0a 73  limitVfs = 0;..s
60b0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 73 74  tatic void setst
60c0: 6f 70 74 69 6d 65 5f 78 28 0a 20 20 45 72 72 6f  optime_x(.  Erro
60d0: 72 20 2a 70 45 72 72 2c 20 20 20 20 20 20 20 20  r *pErr,        
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
60f0: 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
6100: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 73 20 20  e */.  int nMs  
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6c 6c 69 73         /* Millis
6130: 65 63 6f 6e 64 73 20 75 6e 74 69 6c 20 22 73 74  econds until "st
6140: 6f 70 20 74 69 6d 65 22 20 2a 2f 0a 29 7b 0a 20  op time" */.){. 
6150: 20 69 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d 53   if( pErr->rc==S
6160: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6170: 64 6f 75 62 6c 65 20 74 3b 0a 20 20 20 20 69 6e  double t;.    in
6180: 74 20 72 63 3b 0a 20 20 20 20 70 54 69 6d 65 6c  t rc;.    pTimel
6190: 69 6d 69 74 56 66 73 20 3d 20 73 71 6c 69 74 65  imitVfs = sqlite
61a0: 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
61b0: 20 20 20 72 63 20 3d 20 70 54 69 6d 65 6c 69 6d     rc = pTimelim
61c0: 69 74 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54  itVfs->xCurrentT
61d0: 69 6d 65 28 70 54 69 6d 65 6c 69 6d 69 74 56 66  ime(pTimelimitVf
61e0: 73 2c 20 26 74 29 3b 0a 20 20 20 20 69 66 28 20  s, &t);.    if( 
61f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6200: 0a 20 20 20 20 20 20 70 45 72 72 2d 3e 72 63 20  .      pErr->rc 
6210: 3d 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = rc;.    }else{
6220: 0a 20 20 20 20 20 20 74 69 6d 65 6c 69 6d 69 74  .      timelimit
6230: 20 3d 20 74 20 2b 20 28 28 64 6f 75 62 6c 65 29   = t + ((double)
6240: 6e 4d 73 29 2f 28 31 30 30 30 2e 30 2a 36 30 2e  nMs)/(1000.0*60.
6250: 30 2a 36 30 2e 30 2a 32 34 2e 30 29 3b 0a 20 20  0*60.0*24.0);.  
6260: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
6270: 63 20 69 6e 74 20 74 69 6d 65 74 6f 73 74 6f 70  c int timetostop
6280: 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70 45 72  _x(.  Error *pEr
6290: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
62a0: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
62b0: 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29   Error code */.)
62c0: 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b  {.  int ret = 1;
62d0: 0a 20 20 69 66 28 20 70 45 72 72 2d 3e 72 63 3d  .  if( pErr->rc=
62e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
62f0: 20 20 64 6f 75 62 6c 65 20 74 3b 0a 20 20 20 20    double t;.    
6300: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
6310: 20 70 54 69 6d 65 6c 69 6d 69 74 56 66 73 2d 3e   pTimelimitVfs->
6320: 78 43 75 72 72 65 6e 74 54 69 6d 65 28 70 54 69  xCurrentTime(pTi
6330: 6d 65 6c 69 6d 69 74 56 66 73 2c 20 26 74 29 3b  melimitVfs, &t);
6340: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
6350: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6360: 70 45 72 72 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  pErr->rc = rc;. 
6370: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6380: 72 65 74 20 3d 20 28 74 20 3e 3d 20 74 69 6d 65  ret = (t >= time
6390: 6c 69 6d 69 74 29 3b 0a 20 20 20 20 7d 0a 20 20  limit);.    }.  
63a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
63b0: 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
63c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
6450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6490: 2a 2a 2a 2a 0a 2a 2a 20 45 6e 64 20 69 6e 66 72  ****.** End infr
64a0: 61 73 74 72 75 63 74 75 72 65 2e 20 42 65 67 69  astructure. Begi
64b0: 6e 20 74 65 73 74 73 2e 0a 2a 2f 0a 0a 23 64 65  n tests..*/..#de
64c0: 66 69 6e 65 20 57 41 4c 54 48 52 45 41 44 31 5f  fine WALTHREAD1_
64d0: 4e 54 48 52 45 41 44 20 20 31 30 0a 23 64 65 66  NTHREAD  10.#def
64e0: 69 6e 65 20 57 41 4c 54 48 52 45 41 44 33 5f 4e  ine WALTHREAD3_N
64f0: 54 48 52 45 41 44 20 20 36 0a 0a 73 74 61 74 69  THREAD  6..stati
6500: 63 20 63 68 61 72 20 2a 77 61 6c 74 68 72 65 61  c char *walthrea
6510: 64 31 5f 74 68 72 65 61 64 28 69 6e 74 20 69 54  d1_thread(int iT
6520: 69 64 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  id, void *pArg){
6530: 0a 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20 7b  .  Error err = {
6540: 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0};             
6550: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
6560: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 2a 2f 0a   and message */.
6570: 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20 7b 30    Sqlite db = {0
6580: 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
6590: 20 20 2f 2a 20 53 51 4c 69 74 65 20 64 61 74 61    /* SQLite data
65a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
65b0: 2a 2f 0a 20 20 69 6e 74 20 6e 49 74 65 72 20 3d  */.  int nIter =
65c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
65d0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 69 6f       /* Iteratio
65e0: 6e 73 20 73 6f 20 66 61 72 20 2a 2f 0a 0a 20 20  ns so far */..  
65f0: 6f 70 65 6e 64 62 28 26 65 72 72 2c 20 26 64 62  opendb(&err, &db
6600: 2c 20 22 74 65 73 74 2e 64 62 22 2c 20 30 29 3b  , "test.db", 0);
6610: 0a 20 20 77 68 69 6c 65 28 20 21 74 69 6d 65 74  .  while( !timet
6620: 6f 73 74 6f 70 28 26 65 72 72 29 20 29 7b 0a 20  ostop(&err) ){. 
6630: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
6640: 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  zSql[] = {.     
6650: 20 22 53 45 4c 45 43 54 20 6d 64 35 73 75 6d 28   "SELECT md5sum(
6660: 78 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  x) FROM t1 WHERE
6670: 20 72 6f 77 69 64 20 21 3d 20 28 53 45 4c 45 43   rowid != (SELEC
6680: 54 20 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  T max(rowid) FRO
6690: 4d 20 74 31 29 22 2c 0a 20 20 20 20 20 20 22 53  M t1)",.      "S
66a0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
66b0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 28 53  WHERE rowid = (S
66c0: 45 4c 45 43 54 20 6d 61 78 28 72 6f 77 69 64 29  ELECT max(rowid)
66d0: 20 46 52 4f 4d 20 74 31 29 22 2c 0a 20 20 20 20   FROM t1)",.    
66e0: 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 31 2c  };.    char *z1,
66f0: 20 2a 7a 32 2c 20 2a 7a 33 3b 0a 0a 20 20 20 20   *z2, *z3;..    
6700: 65 78 65 63 73 71 6c 28 26 65 72 72 2c 20 26 64  execsql(&err, &d
6710: 62 2c 20 22 42 45 47 49 4e 22 29 3b 0a 20 20 20  b, "BEGIN");.   
6720: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
6730: 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 20 20 20  (&err, &db);.   
6740: 20 7a 31 20 3d 20 65 78 65 63 73 71 6c 5f 74 65   z1 = execsql_te
6750: 78 74 28 26 65 72 72 2c 20 26 64 62 2c 20 31 2c  xt(&err, &db, 1,
6760: 20 61 7a 53 71 6c 5b 30 5d 29 3b 0a 20 20 20 20   azSql[0]);.    
6770: 7a 32 20 3d 20 65 78 65 63 73 71 6c 5f 74 65 78  z2 = execsql_tex
6780: 74 28 26 65 72 72 2c 20 26 64 62 2c 20 32 2c 20  t(&err, &db, 2, 
6790: 61 7a 53 71 6c 5b 31 5d 29 3b 0a 20 20 20 20 7a  azSql[1]);.    z
67a0: 33 20 3d 20 65 78 65 63 73 71 6c 5f 74 65 78 74  3 = execsql_text
67b0: 28 26 65 72 72 2c 20 26 64 62 2c 20 33 2c 20 61  (&err, &db, 3, a
67c0: 7a 53 71 6c 5b 30 5d 29 3b 0a 20 20 20 20 65 78  zSql[0]);.    ex
67d0: 65 63 73 71 6c 28 26 65 72 72 2c 20 26 64 62 2c  ecsql(&err, &db,
67e0: 20 22 43 4f 4d 4d 49 54 22 29 3b 0a 0a 20 20 20   "COMMIT");..   
67f0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 31 2c 20   if( strcmp(z1, 
6800: 7a 32 29 20 7c 7c 20 73 74 72 63 6d 70 28 7a 31  z2) || strcmp(z1
6810: 2c 20 7a 33 29 20 29 7b 0a 20 20 20 20 20 20 74  , z3) ){.      t
6820: 65 73 74 5f 65 72 72 6f 72 28 26 65 72 72 2c 20  est_error(&err, 
6830: 22 46 61 69 6c 65 64 20 72 65 61 64 3a 20 25 73  "Failed read: %s
6840: 20 25 73 20 25 73 22 2c 20 7a 31 2c 20 7a 32 2c   %s %s", z1, z2,
6850: 20 7a 33 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   z3);.    }..   
6860: 20 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72   sql_script(&err
6870: 2c 20 26 64 62 2c 0a 20 20 20 20 20 20 20 20 22  , &db,.        "
6880: 42 45 47 49 4e 3b 22 0a 20 20 20 20 20 20 20 20  BEGIN;".        
6890: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
68a0: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
68b0: 6c 6f 62 28 31 30 30 29 29 3b 22 0a 20 20 20 20  lob(100));".    
68c0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
68d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
68e0: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 3b 22 0a  domblob(100));".
68f0: 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
6900: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
6910: 20 6d 64 35 73 75 6d 28 78 29 20 46 52 4f 4d 20   md5sum(x) FROM 
6920: 74 31 3b 22 0a 20 20 20 20 20 20 20 20 22 43 4f  t1;".        "CO
6930: 4d 4d 49 54 3b 22 0a 20 20 20 20 29 3b 0a 20 20  MMIT;".    );.  
6940: 20 20 6e 49 74 65 72 2b 2b 3b 0a 20 20 7d 0a 20    nIter++;.  }. 
6950: 20 63 6c 6f 73 65 64 62 28 26 65 72 72 2c 20 26   closedb(&err, &
6960: 64 62 29 3b 0a 0a 20 20 70 72 69 6e 74 5f 61 6e  db);..  print_an
6970: 64 5f 66 72 65 65 5f 65 72 72 28 26 65 72 72 29  d_free_err(&err)
6980: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
6990: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 64 20 69  e3_mprintf("%d i
69a0: 74 65 72 61 74 69 6f 6e 73 22 2c 20 6e 49 74 65  terations", nIte
69b0: 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  r);.}..static ch
69c0: 61 72 20 2a 77 61 6c 74 68 72 65 61 64 31 5f 63  ar *walthread1_c
69d0: 6b 70 74 5f 74 68 72 65 61 64 28 69 6e 74 20 69  kpt_thread(int i
69e0: 54 69 64 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  Tid, void *pArg)
69f0: 7b 0a 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20  {.  Error err = 
6a00: 7b 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  {0};            
6a10: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
6a20: 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 2a 2f  e and message */
6a30: 0a 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20 7b  .  Sqlite db = {
6a40: 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0};             
6a50: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 64 61 74     /* SQLite dat
6a60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6a70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6b 70 74 20   */.  int nCkpt 
6a80: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6a90: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 70 6f        /* Checkpo
6aa0: 69 6e 74 73 20 73 6f 20 66 61 72 20 2a 2f 0a 0a  ints so far */..
6ab0: 20 20 6f 70 65 6e 64 62 28 26 65 72 72 2c 20 26    opendb(&err, &
6ac0: 64 62 2c 20 22 74 65 73 74 2e 64 62 22 2c 20 30  db, "test.db", 0
6ad0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 74 69 6d  );.  while( !tim
6ae0: 65 74 6f 73 74 6f 70 28 26 65 72 72 29 20 29 7b  etostop(&err) ){
6af0: 0a 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 2a  .    usleep(500*
6b00: 31 30 30 30 29 3b 0a 20 20 20 20 65 78 65 63 73  1000);.    execs
6b10: 71 6c 28 26 65 72 72 2c 20 26 64 62 2c 20 22 50  ql(&err, &db, "P
6b20: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
6b30: 6f 69 6e 74 22 29 3b 0a 20 20 20 20 69 66 28 20  oint");.    if( 
6b40: 65 72 72 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  err.rc==SQLITE_O
6b50: 4b 20 29 20 6e 43 6b 70 74 2b 2b 3b 0a 20 20 20  K ) nCkpt++;.   
6b60: 20 63 6c 65 61 72 5f 65 72 72 6f 72 28 26 65 72   clear_error(&er
6b70: 72 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 29 3b  r, SQLITE_BUSY);
6b80: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 64 62 28 26  .  }.  closedb(&
6b90: 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20 20 70 72  err, &db);..  pr
6ba0: 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72  int_and_free_err
6bb0: 28 26 65 72 72 29 3b 0a 20 20 72 65 74 75 72 6e  (&err);.  return
6bc0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
6bd0: 28 22 25 64 20 63 68 65 63 6b 70 6f 69 6e 74 73  ("%d checkpoints
6be0: 22 2c 20 6e 43 6b 70 74 29 3b 0a 7d 0a 0a 73 74  ", nCkpt);.}..st
6bf0: 61 74 69 63 20 76 6f 69 64 20 77 61 6c 74 68 72  atic void walthr
6c00: 65 61 64 31 28 69 6e 74 20 6e 4d 73 29 7b 0a 20  ead1(int nMs){. 
6c10: 20 45 72 72 6f 72 20 65 72 72 20 3d 20 7b 30 7d   Error err = {0}
6c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6c30: 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 61   /* Error code a
6c40: 6e 64 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  nd message */.  
6c50: 53 71 6c 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b  Sqlite db = {0};
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c70: 2f 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  /* SQLite databa
6c80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
6c90: 0a 20 20 54 68 72 65 61 64 73 65 74 20 74 68 72  .  Threadset thr
6ca0: 65 61 64 73 20 3d 20 7b 30 7d 3b 20 20 20 20 20  eads = {0};     
6cb0: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 72 65 61     /* Test threa
6cc0: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
6cf0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
6d00: 0a 20 20 6f 70 65 6e 64 62 28 26 65 72 72 2c 20  .  opendb(&err, 
6d10: 26 64 62 2c 20 22 74 65 73 74 2e 64 62 22 2c 20  &db, "test.db", 
6d20: 31 29 3b 0a 20 20 73 71 6c 5f 73 63 72 69 70 74  1);.  sql_script
6d30: 28 26 65 72 72 2c 20 26 64 62 2c 0a 20 20 20 20  (&err, &db,.    
6d40: 20 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61    "PRAGMA journa
6d50: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 22 0a 20  l_mode = WAL;". 
6d60: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
6d70: 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20  LE t1(x PRIMARY 
6d80: 4b 45 59 29 3b 22 0a 20 20 20 20 20 20 22 49 4e  KEY);".      "IN
6d90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6da0: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  UES(randomblob(1
6db0: 30 30 29 29 3b 22 0a 20 20 20 20 20 20 22 49 4e  00));".      "IN
6dc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6dd0: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  UES(randomblob(1
6de0: 30 30 29 29 3b 22 0a 20 20 20 20 20 20 22 49 4e  00));".      "IN
6df0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
6e00: 45 43 54 20 6d 64 35 73 75 6d 28 78 29 20 46 52  ECT md5sum(x) FR
6e10: 4f 4d 20 74 31 3b 22 0a 20 20 29 3b 0a 0a 20 20  OM t1;".  );..  
6e20: 73 65 74 73 74 6f 70 74 69 6d 65 28 26 65 72 72  setstoptime(&err
6e30: 2c 20 6e 4d 73 29 3b 0a 20 20 66 6f 72 28 69 3d  , nMs);.  for(i=
6e40: 30 3b 20 69 3c 57 41 4c 54 48 52 45 41 44 31 5f  0; i<WALTHREAD1_
6e50: 4e 54 48 52 45 41 44 3b 20 69 2b 2b 29 7b 0a 20  NTHREAD; i++){. 
6e60: 20 20 20 6c 61 75 6e 63 68 5f 74 68 72 65 61 64     launch_thread
6e70: 28 26 65 72 72 2c 20 26 74 68 72 65 61 64 73 2c  (&err, &threads,
6e80: 20 77 61 6c 74 68 72 65 61 64 31 5f 74 68 72 65   walthread1_thre
6e90: 61 64 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 6c 61  ad, 0);.  }.  la
6ea0: 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72 72  unch_thread(&err
6eb0: 2c 20 26 74 68 72 65 61 64 73 2c 20 77 61 6c 74  , &threads, walt
6ec0: 68 72 65 61 64 31 5f 63 6b 70 74 5f 74 68 72 65  hread1_ckpt_thre
6ed0: 61 64 2c 20 30 29 3b 0a 20 20 6a 6f 69 6e 5f 61  ad, 0);.  join_a
6ee0: 6c 6c 5f 74 68 72 65 61 64 73 28 26 65 72 72 2c  ll_threads(&err,
6ef0: 20 26 74 68 72 65 61 64 73 29 3b 0a 0a 20 20 70   &threads);..  p
6f00: 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72  rint_and_free_er
6f10: 72 28 26 65 72 72 29 3b 0a 7d 0a 0a 73 74 61 74  r(&err);.}..stat
6f20: 69 63 20 63 68 61 72 20 2a 77 61 6c 74 68 72 65  ic char *walthre
6f30: 61 64 32 5f 74 68 72 65 61 64 28 69 6e 74 20 69  ad2_thread(int i
6f40: 54 69 64 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  Tid, void *pArg)
6f50: 7b 0a 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20  {.  Error err = 
6f60: 7b 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  {0};            
6f70: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
6f80: 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 2a 2f  e and message */
6f90: 0a 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20 7b  .  Sqlite db = {
6fa0: 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0};             
6fb0: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 64 61 74     /* SQLite dat
6fc0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6fd0: 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 54 72 61 6e   */.  int anTran
6fe0: 73 5b 32 5d 20 3d 20 7b 30 2c 20 30 7d 3b 20 20  s[2] = {0, 0};  
6ff0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7000: 6f 66 20 57 41 4c 20 61 6e 64 20 52 6f 6c 6c 62  of WAL and Rollb
7010: 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ack transactions
7020: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 72 67 20 3d   */.  int iArg =
7030: 20 50 54 52 32 49 4e 54 28 70 41 72 67 29 3b 0a   PTR2INT(pArg);.
7040: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7050: 4a 6f 75 72 6e 61 6c 20 3d 20 22 50 52 41 47 4d  Journal = "PRAGM
7060: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
7070: 20 57 41 4c 22 3b 0a 20 20 69 66 28 20 69 41 72   WAL";.  if( iAr
7080: 67 20 29 7b 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  g ){ zJournal = 
7090: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
70a0: 6d 6f 64 65 20 3d 20 44 45 4c 45 54 45 22 3b 20  mode = DELETE"; 
70b0: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 21 74 69 6d  }..  while( !tim
70c0: 65 74 6f 73 74 6f 70 28 26 65 72 72 29 20 29 7b  etostop(&err) ){
70d0: 0a 20 20 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  .    int journal
70e0: 5f 65 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20  _exists = 0;.   
70f0: 20 69 6e 74 20 77 61 6c 5f 65 78 69 73 74 73 20   int wal_exists 
7100: 3d 20 30 3b 0a 0a 20 20 20 20 6f 70 65 6e 64 62  = 0;..    opendb
7110: 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74 65 73  (&err, &db, "tes
7120: 74 2e 64 62 22 2c 20 30 29 3b 0a 0a 20 20 20 20  t.db", 0);..    
7130: 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72 2c  sql_script(&err,
7140: 20 26 64 62 2c 20 7a 4a 6f 75 72 6e 61 6c 29 3b   &db, zJournal);
7150: 0a 20 20 20 20 63 6c 65 61 72 5f 65 72 72 6f 72  .    clear_error
7160: 28 26 65 72 72 2c 20 53 51 4c 49 54 45 5f 42 55  (&err, SQLITE_BU
7170: 53 59 29 3b 0a 20 20 20 20 73 71 6c 5f 73 63 72  SY);.    sql_scr
7180: 69 70 74 28 26 65 72 72 2c 20 26 64 62 2c 20 22  ipt(&err, &db, "
7190: 42 45 47 49 4e 22 29 3b 0a 20 20 20 20 73 71 6c  BEGIN");.    sql
71a0: 5f 73 63 72 69 70 74 28 26 65 72 72 2c 20 26 64  _script(&err, &d
71b0: 62 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  b, "INSERT INTO 
71c0: 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  t1 VALUES(NULL, 
71d0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29  randomblob(100))
71e0: 22 29 3b 0a 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  ");..    journal
71f0: 5f 65 78 69 73 74 73 20 3d 20 28 66 69 6c 65 73  _exists = (files
7200: 69 7a 65 28 26 65 72 72 2c 20 22 74 65 73 74 2e  ize(&err, "test.
7210: 64 62 2d 6a 6f 75 72 6e 61 6c 22 29 20 3e 3d 20  db-journal") >= 
7220: 30 29 3b 0a 20 20 20 20 77 61 6c 5f 65 78 69 73  0);.    wal_exis
7230: 74 73 20 3d 20 28 66 69 6c 65 73 69 7a 65 28 26  ts = (filesize(&
7240: 65 72 72 2c 20 22 74 65 73 74 2e 64 62 2d 77 61  err, "test.db-wa
7250: 6c 22 29 20 3e 3d 20 30 29 3b 0a 20 20 20 20 69  l") >= 0);.    i
7260: 66 28 20 28 6a 6f 75 72 6e 61 6c 5f 65 78 69 73  f( (journal_exis
7270: 74 73 2b 77 61 6c 5f 65 78 69 73 74 73 29 21 3d  ts+wal_exists)!=
7280: 31 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 5f  1 ){.      test_
7290: 65 72 72 6f 72 28 26 65 72 72 2c 20 22 46 69 6c  error(&err, "Fil
72a0: 65 20 73 79 73 74 65 6d 20 6c 6f 6f 6b 73 20 69  e system looks i
72b0: 6e 63 6f 72 72 65 63 74 20 28 25 64 2c 20 25 64  ncorrect (%d, %d
72c0: 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6a  )", .          j
72d0: 6f 75 72 6e 61 6c 5f 65 78 69 73 74 73 2c 20 77  ournal_exists, w
72e0: 61 6c 5f 65 78 69 73 74 73 0a 20 20 20 20 20 20  al_exists.      
72f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 54  );.    }.    anT
7300: 72 61 6e 73 5b 6a 6f 75 72 6e 61 6c 5f 65 78 69  rans[journal_exi
7310: 73 74 73 5d 2b 2b 3b 0a 0a 20 20 20 20 73 71 6c  sts]++;..    sql
7320: 5f 73 63 72 69 70 74 28 26 65 72 72 2c 20 26 64  _script(&err, &d
7330: 62 2c 20 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20  b, "COMMIT");.  
7340: 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63    integrity_chec
7350: 6b 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 20 20  k(&err, &db);.  
7360: 20 20 63 6c 6f 73 65 64 62 28 26 65 72 72 2c 20    closedb(&err, 
7370: 26 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 70 72 69  &db);.  }..  pri
7380: 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72 28  nt_and_free_err(
7390: 26 65 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  &err);.  return 
73a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
73b0: 22 57 20 25 64 20 52 20 25 64 22 2c 20 61 6e 54  "W %d R %d", anT
73c0: 72 61 6e 73 5b 30 5d 2c 20 61 6e 54 72 61 6e 73  rans[0], anTrans
73d0: 5b 31 5d 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  [1]);.}..static 
73e0: 76 6f 69 64 20 77 61 6c 74 68 72 65 61 64 32 28  void walthread2(
73f0: 69 6e 74 20 6e 4d 73 29 7b 0a 20 20 45 72 72 6f  int nMs){.  Erro
7400: 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20 53  r err = {0};.  S
7410: 71 6c 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 0a  qlite db = {0};.
7420: 20 20 54 68 72 65 61 64 73 65 74 20 74 68 72 65    Threadset thre
7430: 61 64 73 20 3d 20 7b 30 7d 3b 0a 0a 20 20 6f 70  ads = {0};..  op
7440: 65 6e 64 62 28 26 65 72 72 2c 20 26 64 62 2c 20  endb(&err, &db, 
7450: 22 74 65 73 74 2e 64 62 22 2c 20 31 29 3b 0a 20  "test.db", 1);. 
7460: 20 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72   sql_script(&err
7470: 2c 20 26 64 62 2c 20 22 43 52 45 41 54 45 20 54  , &db, "CREATE T
7480: 41 42 4c 45 20 74 31 28 78 20 49 4e 54 45 47 45  ABLE t1(x INTEGE
7490: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  R PRIMARY KEY, y
74a0: 20 55 4e 49 51 55 45 29 22 29 3b 0a 20 20 63 6c   UNIQUE)");.  cl
74b0: 6f 73 65 64 62 28 26 65 72 72 2c 20 26 64 62 29  osedb(&err, &db)
74c0: 3b 0a 0a 20 20 73 65 74 73 74 6f 70 74 69 6d 65  ;..  setstoptime
74d0: 28 26 65 72 72 2c 20 6e 4d 73 29 3b 0a 20 20 6c  (&err, nMs);.  l
74e0: 61 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72  aunch_thread(&er
74f0: 72 2c 20 26 74 68 72 65 61 64 73 2c 20 77 61 6c  r, &threads, wal
7500: 74 68 72 65 61 64 32 5f 74 68 72 65 61 64 2c 20  thread2_thread, 
7510: 30 29 3b 0a 20 20 6c 61 75 6e 63 68 5f 74 68 72  0);.  launch_thr
7520: 65 61 64 28 26 65 72 72 2c 20 26 74 68 72 65 61  ead(&err, &threa
7530: 64 73 2c 20 77 61 6c 74 68 72 65 61 64 32 5f 74  ds, walthread2_t
7540: 68 72 65 61 64 2c 20 30 29 3b 0a 20 20 6c 61 75  hread, 0);.  lau
7550: 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72 72 2c  nch_thread(&err,
7560: 20 26 74 68 72 65 61 64 73 2c 20 77 61 6c 74 68   &threads, walth
7570: 72 65 61 64 32 5f 74 68 72 65 61 64 2c 20 28 76  read2_thread, (v
7580: 6f 69 64 2a 29 31 29 3b 0a 20 20 6c 61 75 6e 63  oid*)1);.  launc
7590: 68 5f 74 68 72 65 61 64 28 26 65 72 72 2c 20 26  h_thread(&err, &
75a0: 74 68 72 65 61 64 73 2c 20 77 61 6c 74 68 72 65  threads, walthre
75b0: 61 64 32 5f 74 68 72 65 61 64 2c 20 28 76 6f 69  ad2_thread, (voi
75c0: 64 2a 29 31 29 3b 0a 20 20 6a 6f 69 6e 5f 61 6c  d*)1);.  join_al
75d0: 6c 5f 74 68 72 65 61 64 73 28 26 65 72 72 2c 20  l_threads(&err, 
75e0: 26 74 68 72 65 61 64 73 29 3b 0a 0a 20 20 70 72  &threads);..  pr
75f0: 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72  int_and_free_err
7600: 28 26 65 72 72 29 3b 0a 7d 0a 0a 73 74 61 74 69  (&err);.}..stati
7610: 63 20 63 68 61 72 20 2a 77 61 6c 74 68 72 65 61  c char *walthrea
7620: 64 33 5f 74 68 72 65 61 64 28 69 6e 74 20 69 54  d3_thread(int iT
7630: 69 64 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  id, void *pArg){
7640: 0a 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20 7b  .  Error err = {
7650: 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0};             
7660: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
7670: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 2a 2f 0a   and message */.
7680: 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20 7b 30    Sqlite db = {0
7690: 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
76a0: 20 20 2f 2a 20 53 51 4c 69 74 65 20 64 61 74 61    /* SQLite data
76b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
76c0: 2a 2f 0a 20 20 69 36 34 20 69 4e 65 78 74 57 72  */.  i64 iNextWr
76d0: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
76e0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 76 61 6c       /* Next val
76f0: 75 65 20 74 68 69 73 20 74 68 72 65 61 64 20 77  ue this thread w
7700: 69 6c 6c 20 77 72 69 74 65 20 2a 2f 0a 20 20 69  ill write */.  i
7710: 6e 74 20 69 41 72 67 20 3d 20 50 54 52 32 49 4e  nt iArg = PTR2IN
7720: 54 28 70 41 72 67 29 3b 0a 0a 20 20 6f 70 65 6e  T(pArg);..  open
7730: 64 62 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74  db(&err, &db, "t
7740: 65 73 74 2e 64 62 22 2c 20 30 29 3b 0a 20 20 73  est.db", 0);.  s
7750: 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72 2c 20  ql_script(&err, 
7760: 26 64 62 2c 20 22 50 52 41 47 4d 41 20 77 61 6c  &db, "PRAGMA wal
7770: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20  _autocheckpoint 
7780: 3d 20 31 30 22 29 3b 0a 0a 20 20 69 4e 65 78 74  = 10");..  iNext
7790: 57 72 69 74 65 20 3d 20 69 41 72 67 2b 31 3b 0a  Write = iArg+1;.
77a0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
77b0: 20 20 69 36 34 20 73 75 6d 31 3b 0a 20 20 20 20    i64 sum1;.    
77c0: 69 36 34 20 73 75 6d 32 3b 0a 20 20 20 20 69 6e  i64 sum2;.    in
77d0: 74 20 73 74 6f 70 20 3d 20 30 3b 20 20 20 20 20  t stop = 0;     
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
77f0: 72 75 65 20 74 6f 20 73 74 6f 70 20 65 78 65 63  rue to stop exec
7800: 75 74 69 6e 67 20 28 74 65 73 74 20 74 69 6d 65  uting (test time
7810: 64 20 6f 75 74 29 20 2a 2f 0a 0a 20 20 20 20 77  d out) */..    w
7820: 68 69 6c 65 28 20 30 3d 3d 28 73 74 6f 70 20 3d  hile( 0==(stop =
7830: 20 74 69 6d 65 74 6f 73 74 6f 70 28 26 65 72 72   timetostop(&err
7840: 29 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  )) ){.      i64 
7850: 69 4d 61 78 20 3d 20 65 78 65 63 73 71 6c 5f 69  iMax = execsql_i
7860: 36 34 28 26 65 72 72 2c 20 26 64 62 2c 20 22 53  64(&err, &db, "S
7870: 45 4c 45 43 54 20 6d 61 78 28 63 6e 74 29 20 46  ELECT max(cnt) F
7880: 52 4f 4d 20 74 31 22 29 3b 0a 20 20 20 20 20 20  ROM t1");.      
7890: 69 66 28 20 69 4d 61 78 2b 31 3d 3d 69 4e 65 78  if( iMax+1==iNex
78a0: 74 57 72 69 74 65 20 29 20 62 72 65 61 6b 3b 0a  tWrite ) break;.
78b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
78c0: 6f 70 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  op ) break;..   
78d0: 20 73 75 6d 31 20 3d 20 65 78 65 63 73 71 6c 5f   sum1 = execsql_
78e0: 69 36 34 28 26 65 72 72 2c 20 26 64 62 2c 20 22  i64(&err, &db, "
78f0: 53 45 4c 45 43 54 20 73 75 6d 28 63 6e 74 29 20  SELECT sum(cnt) 
7900: 46 52 4f 4d 20 74 31 22 29 3b 0a 20 20 20 20 73  FROM t1");.    s
7910: 75 6d 32 20 3d 20 65 78 65 63 73 71 6c 5f 69 36  um2 = execsql_i6
7920: 34 28 26 65 72 72 2c 20 26 64 62 2c 20 22 53 45  4(&err, &db, "SE
7930: 4c 45 43 54 20 73 75 6d 28 73 75 6d 31 29 20 46  LECT sum(sum1) F
7940: 52 4f 4d 20 74 31 22 29 3b 0a 20 20 20 20 65 78  ROM t1");.    ex
7950: 65 63 73 71 6c 5f 69 36 34 28 26 65 72 72 2c 20  ecsql_i64(&err, 
7960: 26 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22 49  &db, .        "I
7970: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
7980: 4c 55 45 53 28 3a 69 4e 65 78 74 57 72 69 74 65  LUES(:iNextWrite
7990: 2c 20 3a 69 53 75 6d 31 2c 20 3a 69 53 75 6d 32  , :iSum1, :iSum2
79a0: 29 22 2c 0a 20 20 20 20 20 20 20 20 26 69 4e 65  )",.        &iNe
79b0: 78 74 57 72 69 74 65 2c 20 26 73 75 6d 31 2c 20  xtWrite, &sum1, 
79c0: 26 73 75 6d 32 0a 20 20 20 20 29 3b 0a 20 20 20  &sum2.    );.   
79d0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
79e0: 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20 20  (&err, &db);..  
79f0: 20 20 69 4e 65 78 74 57 72 69 74 65 20 2b 3d 20    iNextWrite += 
7a00: 57 41 4c 54 48 52 45 41 44 33 5f 4e 54 48 52 45  WALTHREAD3_NTHRE
7a10: 41 44 3b 0a 20 20 7d 0a 0a 20 20 63 6c 6f 73 65  AD;.  }..  close
7a20: 64 62 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 20  db(&err, &db);. 
7a30: 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f   print_and_free_
7a40: 65 72 72 28 26 65 72 72 29 3b 0a 20 20 72 65 74  err(&err);.  ret
7a50: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
7a60: 20 76 6f 69 64 20 77 61 6c 74 68 72 65 61 64 33   void walthread3
7a70: 28 69 6e 74 20 6e 4d 73 29 7b 0a 20 20 45 72 72  (int nMs){.  Err
7a80: 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20  or err = {0};.  
7a90: 53 71 6c 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b  Sqlite db = {0};
7aa0: 0a 20 20 54 68 72 65 61 64 73 65 74 20 74 68 72  .  Threadset thr
7ab0: 65 61 64 73 20 3d 20 7b 30 7d 3b 0a 20 20 69 6e  eads = {0};.  in
7ac0: 74 20 69 3b 0a 0a 20 20 6f 70 65 6e 64 62 28 26  t i;..  opendb(&
7ad0: 65 72 72 2c 20 26 64 62 2c 20 22 74 65 73 74 2e  err, &db, "test.
7ae0: 64 62 22 2c 20 31 29 3b 0a 20 20 73 71 6c 5f 73  db", 1);.  sql_s
7af0: 63 72 69 70 74 28 26 65 72 72 2c 20 26 64 62 2c  cript(&err, &db,
7b00: 20 0a 20 20 20 20 20 20 22 50 52 41 47 4d 41 20   .      "PRAGMA 
7b10: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
7b20: 41 4c 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41  AL;".      "CREA
7b30: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6e 74 20  TE TABLE t1(cnt 
7b40: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 75 6d  PRIMARY KEY, sum
7b50: 31 2c 20 73 75 6d 32 29 3b 22 0a 20 20 20 20 20  1, sum2);".     
7b60: 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 69   "CREATE INDEX i
7b70: 31 20 4f 4e 20 74 31 28 73 75 6d 31 29 3b 22 0a  1 ON t1(sum1);".
7b80: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e        "CREATE IN
7b90: 44 45 58 20 69 32 20 4f 4e 20 74 31 28 73 75 6d  DEX i2 ON t1(sum
7ba0: 32 29 3b 22 0a 20 20 20 20 20 20 22 49 4e 53 45  2);".      "INSE
7bb0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7bc0: 53 28 30 2c 20 30 2c 20 30 29 3b 22 0a 20 20 29  S(0, 0, 0);".  )
7bd0: 3b 0a 20 20 63 6c 6f 73 65 64 62 28 26 65 72 72  ;.  closedb(&err
7be0: 2c 20 26 64 62 29 3b 0a 0a 20 20 73 65 74 73 74  , &db);..  setst
7bf0: 6f 70 74 69 6d 65 28 26 65 72 72 2c 20 6e 4d 73  optime(&err, nMs
7c00: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
7c10: 57 41 4c 54 48 52 45 41 44 33 5f 4e 54 48 52 45  WALTHREAD3_NTHRE
7c20: 41 44 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 61  AD; i++){.    la
7c30: 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72 72  unch_thread(&err
7c40: 2c 20 26 74 68 72 65 61 64 73 2c 20 77 61 6c 74  , &threads, walt
7c50: 68 72 65 61 64 33 5f 74 68 72 65 61 64 2c 20 49  hread3_thread, I
7c60: 4e 54 32 50 54 52 28 69 29 29 3b 0a 20 20 7d 0a  NT2PTR(i));.  }.
7c70: 20 20 6a 6f 69 6e 5f 61 6c 6c 5f 74 68 72 65 61    join_all_threa
7c80: 64 73 28 26 65 72 72 2c 20 26 74 68 72 65 61 64  ds(&err, &thread
7c90: 73 29 3b 0a 0a 20 20 70 72 69 6e 74 5f 61 6e 64  s);..  print_and
7ca0: 5f 66 72 65 65 5f 65 72 72 28 26 65 72 72 29 3b  _free_err(&err);
7cb0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20  .}..static char 
7cc0: 2a 77 61 6c 74 68 72 65 61 64 34 5f 72 65 61 64  *walthread4_read
7cd0: 65 72 5f 74 68 72 65 61 64 28 69 6e 74 20 69 54  er_thread(int iT
7ce0: 69 64 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  id, void *pArg){
7cf0: 0a 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20 7b  .  Error err = {
7d00: 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0};             
7d10: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
7d20: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 2a 2f 0a   and message */.
7d30: 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20 7b 30    Sqlite db = {0
7d40: 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
7d50: 20 20 2f 2a 20 53 51 4c 69 74 65 20 64 61 74 61    /* SQLite data
7d60: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
7d70: 2a 2f 0a 0a 20 20 6f 70 65 6e 64 62 28 26 65 72  */..  opendb(&er
7d80: 72 2c 20 26 64 62 2c 20 22 74 65 73 74 2e 64 62  r, &db, "test.db
7d90: 22 2c 20 30 29 3b 0a 20 20 77 68 69 6c 65 28 20  ", 0);.  while( 
7da0: 21 74 69 6d 65 74 6f 73 74 6f 70 28 26 65 72 72  !timetostop(&err
7db0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 65 67 72 69  ) ){.    integri
7dc0: 74 79 5f 63 68 65 63 6b 28 26 65 72 72 2c 20 26  ty_check(&err, &
7dd0: 64 62 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  db);.  }.  close
7de0: 64 62 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 0a  db(&err, &db);..
7df0: 20 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65    print_and_free
7e00: 5f 65 72 72 28 26 65 72 72 29 3b 0a 20 20 72 65  _err(&err);.  re
7e10: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
7e20: 63 20 63 68 61 72 20 2a 77 61 6c 74 68 72 65 61  c char *walthrea
7e30: 64 34 5f 77 72 69 74 65 72 5f 74 68 72 65 61 64  d4_writer_thread
7e40: 28 69 6e 74 20 69 54 69 64 2c 20 76 6f 69 64 20  (int iTid, void 
7e50: 2a 70 41 72 67 29 7b 0a 20 20 45 72 72 6f 72 20  *pArg){.  Error 
7e60: 65 72 72 20 3d 20 7b 30 7d 3b 20 20 20 20 20 20  err = {0};      
7e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
7e80: 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73  or code and mess
7e90: 61 67 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20  age */.  Sqlite 
7ea0: 64 62 20 3d 20 7b 30 7d 3b 20 20 20 20 20 20 20  db = {0};       
7eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
7ec0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
7ed0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 36 34 20  ection */.  i64 
7ee0: 69 52 6f 77 20 3d 20 31 3b 0a 0a 20 20 6f 70 65  iRow = 1;..  ope
7ef0: 6e 64 62 28 26 65 72 72 2c 20 26 64 62 2c 20 22  ndb(&err, &db, "
7f00: 74 65 73 74 2e 64 62 22 2c 20 30 29 3b 0a 20 20  test.db", 0);.  
7f10: 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72 2c  sql_script(&err,
7f20: 20 26 64 62 2c 20 22 50 52 41 47 4d 41 20 77 61   &db, "PRAGMA wa
7f30: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
7f40: 20 3d 20 31 35 3b 22 29 3b 0a 20 20 77 68 69 6c   = 15;");.  whil
7f50: 65 28 20 21 74 69 6d 65 74 6f 73 74 6f 70 28 26  e( !timetostop(&
7f60: 65 72 72 29 20 29 7b 0a 20 20 20 20 65 78 65 63  err) ){.    exec
7f70: 73 71 6c 5f 69 36 34 28 0a 20 20 20 20 20 20 20  sql_i64(.       
7f80: 20 26 65 72 72 2c 20 26 64 62 2c 20 22 52 45 50   &err, &db, "REP
7f90: 4c 41 43 45 20 49 4e 54 4f 20 74 31 20 56 41 4c  LACE INTO t1 VAL
7fa0: 55 45 53 28 3a 69 52 6f 77 2c 20 72 61 6e 64 6f  UES(:iRow, rando
7fb0: 6d 62 6c 6f 62 28 33 30 30 29 29 22 2c 20 26 69  mblob(300))", &i
7fc0: 52 6f 77 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Row.    );.    i
7fd0: 52 6f 77 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69  Row++;.    if( i
7fe0: 52 6f 77 3d 3d 31 30 20 29 20 69 52 6f 77 20 3d  Row==10 ) iRow =
7ff0: 20 30 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 64   0;.  }.  closed
8000: 62 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20  b(&err, &db);.. 
8010: 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f   print_and_free_
8020: 65 72 72 28 26 65 72 72 29 3b 0a 20 20 72 65 74  err(&err);.  ret
8030: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
8040: 20 76 6f 69 64 20 77 61 6c 74 68 72 65 61 64 34   void walthread4
8050: 28 69 6e 74 20 6e 4d 73 29 7b 0a 20 20 45 72 72  (int nMs){.  Err
8060: 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20  or err = {0};.  
8070: 53 71 6c 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b  Sqlite db = {0};
8080: 0a 20 20 54 68 72 65 61 64 73 65 74 20 74 68 72  .  Threadset thr
8090: 65 61 64 73 20 3d 20 7b 30 7d 3b 0a 0a 20 20 6f  eads = {0};..  o
80a0: 70 65 6e 64 62 28 26 65 72 72 2c 20 26 64 62 2c  pendb(&err, &db,
80b0: 20 22 74 65 73 74 2e 64 62 22 2c 20 31 29 3b 0a   "test.db", 1);.
80c0: 20 20 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72    sql_script(&er
80d0: 72 2c 20 26 64 62 2c 20 0a 20 20 20 20 20 20 22  r, &db, .      "
80e0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
80f0: 6f 64 65 20 3d 20 57 41 4c 3b 22 0a 20 20 20 20  ode = WAL;".    
8100: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
8110: 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t1(a INTEGER PRI
8120: 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51  MARY KEY, b UNIQ
8130: 55 45 29 3b 22 0a 20 20 29 3b 0a 20 20 63 6c 6f  UE);".  );.  clo
8140: 73 65 64 62 28 26 65 72 72 2c 20 26 64 62 29 3b  sedb(&err, &db);
8150: 0a 0a 20 20 73 65 74 73 74 6f 70 74 69 6d 65 28  ..  setstoptime(
8160: 26 65 72 72 2c 20 6e 4d 73 29 3b 0a 20 20 6c 61  &err, nMs);.  la
8170: 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72 72  unch_thread(&err
8180: 2c 20 26 74 68 72 65 61 64 73 2c 20 77 61 6c 74  , &threads, walt
8190: 68 72 65 61 64 34 5f 72 65 61 64 65 72 5f 74 68  hread4_reader_th
81a0: 72 65 61 64 2c 20 30 29 3b 0a 20 20 6c 61 75 6e  read, 0);.  laun
81b0: 63 68 5f 74 68 72 65 61 64 28 26 65 72 72 2c 20  ch_thread(&err, 
81c0: 26 74 68 72 65 61 64 73 2c 20 77 61 6c 74 68 72  &threads, walthr
81d0: 65 61 64 34 5f 77 72 69 74 65 72 5f 74 68 72 65  ead4_writer_thre
81e0: 61 64 2c 20 30 29 3b 0a 20 20 6a 6f 69 6e 5f 61  ad, 0);.  join_a
81f0: 6c 6c 5f 74 68 72 65 61 64 73 28 26 65 72 72 2c  ll_threads(&err,
8200: 20 26 74 68 72 65 61 64 73 29 3b 0a 0a 20 20 70   &threads);..  p
8210: 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72  rint_and_free_er
8220: 72 28 26 65 72 72 29 3b 0a 7d 0a 0a 73 74 61 74  r(&err);.}..stat
8230: 69 63 20 63 68 61 72 20 2a 77 61 6c 74 68 72 65  ic char *walthre
8240: 61 64 35 5f 74 68 72 65 61 64 28 69 6e 74 20 69  ad5_thread(int i
8250: 54 69 64 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  Tid, void *pArg)
8260: 7b 0a 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20  {.  Error err = 
8270: 7b 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  {0};            
8280: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
8290: 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 2a 2f  e and message */
82a0: 0a 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20 7b  .  Sqlite db = {
82b0: 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0};             
82c0: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 64 61 74     /* SQLite dat
82d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
82e0: 20 2a 2f 0a 20 20 69 36 34 20 6e 52 6f 77 3b 0a   */.  i64 nRow;.
82f0: 0a 20 20 6f 70 65 6e 64 62 28 26 65 72 72 2c 20  .  opendb(&err, 
8300: 26 64 62 2c 20 22 74 65 73 74 2e 64 62 22 2c 20  &db, "test.db", 
8310: 30 29 3b 0a 20 20 6e 52 6f 77 20 3d 20 65 78 65  0);.  nRow = exe
8320: 63 73 71 6c 5f 69 36 34 28 26 65 72 72 2c 20 26  csql_i64(&err, &
8330: 64 62 2c 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  db, "SELECT coun
8340: 74 28 2a 29 20 46 52 4f 4d 20 74 31 22 29 3b 0a  t(*) FROM t1");.
8350: 20 20 63 6c 6f 73 65 64 62 28 26 65 72 72 2c 20    closedb(&err, 
8360: 26 64 62 29 3b 0a 0a 20 20 69 66 28 20 6e 52 6f  &db);..  if( nRo
8370: 77 21 3d 36 35 35 33 36 20 29 20 74 65 73 74 5f  w!=65536 ) test_
8380: 65 72 72 6f 72 28 26 65 72 72 2c 20 22 42 61 64  error(&err, "Bad
8390: 20 72 6f 77 20 63 6f 75 6e 74 3a 20 25 64 22 2c   row count: %d",
83a0: 20 28 69 6e 74 29 6e 52 6f 77 29 3b 0a 20 20 70   (int)nRow);.  p
83b0: 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72  rint_and_free_er
83c0: 72 28 26 65 72 72 29 3b 0a 20 20 72 65 74 75 72  r(&err);.  retur
83d0: 6e 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  n 0;.}.static vo
83e0: 69 64 20 77 61 6c 74 68 72 65 61 64 35 28 69 6e  id walthread5(in
83f0: 74 20 6e 4d 73 29 7b 0a 20 20 45 72 72 6f 72 20  t nMs){.  Error 
8400: 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20 53 71 6c  err = {0};.  Sql
8410: 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 0a 20 20  ite db = {0};.  
8420: 54 68 72 65 61 64 73 65 74 20 74 68 72 65 61 64  Threadset thread
8430: 73 20 3d 20 7b 30 7d 3b 0a 0a 20 20 6f 70 65 6e  s = {0};..  open
8440: 64 62 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74  db(&err, &db, "t
8450: 65 73 74 2e 64 62 22 2c 20 31 29 3b 0a 20 20 73  est.db", 1);.  s
8460: 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72 2c 20  ql_script(&err, 
8470: 26 64 62 2c 20 0a 20 20 20 20 20 20 22 50 52 41  &db, .      "PRA
8480: 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  GMA wal_autochec
8490: 6b 70 6f 69 6e 74 20 3d 20 30 3b 22 0a 20 20 20  kpoint = 0;".   
84a0: 20 20 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f     "PRAGMA page_
84b0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 22 0a 20 20  size = 1024;".  
84c0: 20 20 20 20 22 50 52 41 47 4d 41 20 6a 6f 75 72      "PRAGMA jour
84d0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 22  nal_mode = WAL;"
84e0: 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54  .      "CREATE T
84f0: 41 42 4c 45 20 74 31 28 78 29 3b 22 0a 20 20 20  ABLE t1(x);".   
8500: 20 20 20 22 42 45 47 49 4e 3b 22 0a 20 20 20 20     "BEGIN;".    
8510: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8520: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
8530: 6c 6f 62 28 39 30 30 29 29 3b 22 0a 20 20 20 20  lob(900));".    
8540: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8550: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8560: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8570: 3b 20 20 20 20 20 20 2f 2a 20 20 20 20 20 32 20  ;      /*     2 
8580: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8590: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
85a0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
85b0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
85c0: 2a 20 20 20 20 20 34 20 2a 2f 22 0a 20 20 20 20  *     4 */".    
85d0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
85e0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
85f0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8600: 3b 20 20 20 20 20 20 2f 2a 20 20 20 20 20 38 20  ;      /*     8 
8610: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8620: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8630: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
8640: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
8650: 2a 20 20 20 20 31 36 20 2a 2f 22 0a 20 20 20 20  *    16 */".    
8660: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8670: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8680: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8690: 3b 20 20 20 20 20 20 2f 2a 20 20 20 20 33 32 20  ;      /*    32 
86a0: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
86b0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
86c0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
86d0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
86e0: 2a 20 20 20 20 36 34 20 2a 2f 22 0a 20 20 20 20  *    64 */".    
86f0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8700: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8710: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8720: 3b 20 20 20 20 20 20 2f 2a 20 20 20 31 32 38 20  ;      /*   128 
8730: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8740: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8750: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
8760: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
8770: 2a 20 20 20 32 35 36 20 2a 2f 22 0a 20 20 20 20  *   256 */".    
8780: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8790: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
87a0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
87b0: 3b 20 20 20 20 20 20 2f 2a 20 20 20 35 31 32 20  ;      /*   512 
87c0: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
87d0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
87e0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
87f0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
8800: 2a 20 20 31 30 32 34 20 2a 2f 22 0a 20 20 20 20  *  1024 */".    
8810: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8820: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8830: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8840: 3b 20 20 20 20 20 20 2f 2a 20 20 32 30 34 38 20  ;      /*  2048 
8850: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8860: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8870: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
8880: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
8890: 2a 20 20 34 30 39 36 20 2a 2f 22 0a 20 20 20 20  *  4096 */".    
88a0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
88b0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
88c0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
88d0: 3b 20 20 20 20 20 20 2f 2a 20 20 38 31 39 32 20  ;      /*  8192 
88e0: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
88f0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8900: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
8910: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
8920: 2a 20 31 36 33 38 34 20 2a 2f 22 0a 20 20 20 20  * 16384 */".    
8930: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
8940: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
8950: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
8960: 3b 20 20 20 20 20 20 2f 2a 20 33 32 37 36 38 20  ;      /* 32768 
8970: 2a 2f 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  */".      "INSER
8980: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
8990: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
89a0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 2f   FROM t1;      /
89b0: 2a 20 36 35 35 33 36 20 2a 2f 22 0a 20 20 20 20  * 65536 */".    
89c0: 20 20 22 43 4f 4d 4d 49 54 3b 22 0a 20 20 29 3b    "COMMIT;".  );
89d0: 0a 20 20 66 69 6c 65 63 6f 70 79 28 26 65 72 72  .  filecopy(&err
89e0: 2c 20 22 74 65 73 74 2e 64 62 22 2c 20 22 74 65  , "test.db", "te
89f0: 73 74 5f 73 76 2e 64 62 22 29 3b 0a 20 20 66 69  st_sv.db");.  fi
8a00: 6c 65 63 6f 70 79 28 26 65 72 72 2c 20 22 74 65  lecopy(&err, "te
8a10: 73 74 2e 64 62 2d 77 61 6c 22 2c 20 22 74 65 73  st.db-wal", "tes
8a20: 74 5f 73 76 2e 64 62 2d 77 61 6c 22 29 3b 0a 20  t_sv.db-wal");. 
8a30: 20 63 6c 6f 73 65 64 62 28 26 65 72 72 2c 20 26   closedb(&err, &
8a40: 64 62 29 3b 0a 0a 20 20 66 69 6c 65 63 6f 70 79  db);..  filecopy
8a50: 28 26 65 72 72 2c 20 22 74 65 73 74 5f 73 76 2e  (&err, "test_sv.
8a60: 64 62 22 2c 20 22 74 65 73 74 2e 64 62 22 29 3b  db", "test.db");
8a70: 0a 20 20 66 69 6c 65 63 6f 70 79 28 26 65 72 72  .  filecopy(&err
8a80: 2c 20 22 74 65 73 74 5f 73 76 2e 64 62 2d 77 61  , "test_sv.db-wa
8a90: 6c 22 2c 20 22 74 65 73 74 2e 64 62 2d 77 61 6c  l", "test.db-wal
8aa0: 22 29 3b 0a 0a 20 20 69 66 28 20 65 72 72 2e 72  ");..  if( err.r
8ab0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8ac0: 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 57 41      printf("  WA
8ad0: 4c 20 66 69 6c 65 20 69 73 20 25 64 20 62 79 74  L file is %d byt
8ae0: 65 73 2c 22 2c 20 28 69 6e 74 29 66 69 6c 65 73  es,", (int)files
8af0: 69 7a 65 28 26 65 72 72 2c 22 74 65 73 74 2e 64  ize(&err,"test.d
8b00: 62 2d 77 61 6c 22 29 29 3b 0a 20 20 20 20 70 72  b-wal"));.    pr
8b10: 69 6e 74 66 28 22 20 44 42 20 66 69 6c 65 20 69  intf(" DB file i
8b20: 73 20 25 64 2e 5c 6e 22 2c 20 28 69 6e 74 29 66  s %d.\n", (int)f
8b30: 69 6c 65 73 69 7a 65 28 26 65 72 72 2c 22 74 65  ilesize(&err,"te
8b40: 73 74 2e 64 62 22 29 29 3b 0a 20 20 7d 0a 0a 20  st.db"));.  }.. 
8b50: 20 73 65 74 73 74 6f 70 74 69 6d 65 28 26 65 72   setstoptime(&er
8b60: 72 2c 20 6e 4d 73 29 3b 0a 20 20 6c 61 75 6e 63  r, nMs);.  launc
8b70: 68 5f 74 68 72 65 61 64 28 26 65 72 72 2c 20 26  h_thread(&err, &
8b80: 74 68 72 65 61 64 73 2c 20 77 61 6c 74 68 72 65  threads, walthre
8b90: 61 64 35 5f 74 68 72 65 61 64 2c 20 30 29 3b 0a  ad5_thread, 0);.
8ba0: 20 20 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 28    launch_thread(
8bb0: 26 65 72 72 2c 20 26 74 68 72 65 61 64 73 2c 20  &err, &threads, 
8bc0: 77 61 6c 74 68 72 65 61 64 35 5f 74 68 72 65 61  walthread5_threa
8bd0: 64 2c 20 30 29 3b 0a 20 20 6c 61 75 6e 63 68 5f  d, 0);.  launch_
8be0: 74 68 72 65 61 64 28 26 65 72 72 2c 20 26 74 68  thread(&err, &th
8bf0: 72 65 61 64 73 2c 20 77 61 6c 74 68 72 65 61 64  reads, walthread
8c00: 35 5f 74 68 72 65 61 64 2c 20 30 29 3b 0a 20 20  5_thread, 0);.  
8c10: 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65  launch_thread(&e
8c20: 72 72 2c 20 26 74 68 72 65 61 64 73 2c 20 77 61  rr, &threads, wa
8c30: 6c 74 68 72 65 61 64 35 5f 74 68 72 65 61 64 2c  lthread5_thread,
8c40: 20 30 29 3b 0a 20 20 6c 61 75 6e 63 68 5f 74 68   0);.  launch_th
8c50: 72 65 61 64 28 26 65 72 72 2c 20 26 74 68 72 65  read(&err, &thre
8c60: 61 64 73 2c 20 77 61 6c 74 68 72 65 61 64 35 5f  ads, walthread5_
8c70: 74 68 72 65 61 64 2c 20 30 29 3b 0a 20 20 6a 6f  thread, 0);.  jo
8c80: 69 6e 5f 61 6c 6c 5f 74 68 72 65 61 64 73 28 26  in_all_threads(&
8c90: 65 72 72 2c 20 26 74 68 72 65 61 64 73 29 3b 0a  err, &threads);.
8ca0: 0a 20 20 69 66 28 20 65 72 72 2e 72 63 3d 3d 53  .  if( err.rc==S
8cb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8cc0: 70 72 69 6e 74 66 28 22 20 20 57 41 4c 20 66 69  printf("  WAL fi
8cd0: 6c 65 20 69 73 20 25 64 20 62 79 74 65 73 2c 22  le is %d bytes,"
8ce0: 2c 20 28 69 6e 74 29 66 69 6c 65 73 69 7a 65 28  , (int)filesize(
8cf0: 26 65 72 72 2c 22 74 65 73 74 2e 64 62 2d 77 61  &err,"test.db-wa
8d00: 6c 22 29 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  l"));.    printf
8d10: 28 22 20 44 42 20 66 69 6c 65 20 69 73 20 25 64  (" DB file is %d
8d20: 2e 5c 6e 22 2c 20 28 69 6e 74 29 66 69 6c 65 73  .\n", (int)files
8d30: 69 7a 65 28 26 65 72 72 2c 22 74 65 73 74 2e 64  ize(&err,"test.d
8d40: 62 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 70 72 69  b"));.  }..  pri
8d50: 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72 28  nt_and_free_err(
8d60: 26 65 72 72 29 3b 0a 7d 0a 0a 2f 2a 2d 2d 2d 2d  &err);.}../*----
8d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8db0: 2d 2d 2d 2d 0a 2a 2a 20 54 65 73 74 20 63 61 73  ----.** Test cas
8dc0: 65 20 22 63 67 74 5f 70 61 67 65 72 5f 31 22 0a  e "cgt_pager_1".
8dd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 4c 4c 47  */.#define CALLG
8de0: 52 49 4e 44 54 45 53 54 31 5f 4e 52 4f 57 20 31  RINDTEST1_NROW 1
8df0: 30 30 30 30 0a 73 74 61 74 69 63 20 76 6f 69 64  0000.static void
8e00: 20 63 67 74 5f 70 61 67 65 72 5f 31 5f 70 6f 70   cgt_pager_1_pop
8e10: 75 6c 61 74 65 28 45 72 72 6f 72 20 2a 70 45 72  ulate(Error *pEr
8e20: 72 2c 20 53 71 6c 69 74 65 20 2a 70 44 62 29 7b  r, Sqlite *pDb){
8e30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8e40: 49 6e 73 65 72 74 20 3d 20 22 49 4e 53 45 52 54  Insert = "INSERT
8e50: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8e60: 3a 69 52 6f 77 2c 20 7a 65 72 6f 62 6c 6f 62 28  :iRow, zeroblob(
8e70: 3a 69 42 6c 6f 62 29 29 22 3b 0a 20 20 69 36 34  :iBlob))";.  i64
8e80: 20 69 52 6f 77 3b 0a 20 20 73 71 6c 5f 73 63 72   iRow;.  sql_scr
8e90: 69 70 74 28 70 45 72 72 2c 20 70 44 62 2c 20 22  ipt(pErr, pDb, "
8ea0: 42 45 47 49 4e 22 29 3b 0a 20 20 66 6f 72 28 69  BEGIN");.  for(i
8eb0: 52 6f 77 3d 31 3b 20 69 52 6f 77 3c 3d 43 41 4c  Row=1; iRow<=CAL
8ec0: 4c 47 52 49 4e 44 54 45 53 54 31 5f 4e 52 4f 57  LGRINDTEST1_NROW
8ed0: 3b 20 69 52 6f 77 2b 2b 29 7b 0a 20 20 20 20 69  ; iRow++){.    i
8ee0: 36 34 20 69 42 6c 6f 62 20 3d 20 36 30 30 20 2b  64 iBlob = 600 +
8ef0: 20 28 69 52 6f 77 25 33 30 30 29 3b 0a 20 20 20   (iRow%300);.   
8f00: 20 65 78 65 63 73 71 6c 28 70 45 72 72 2c 20 70   execsql(pErr, p
8f10: 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 26 69 52  Db, zInsert, &iR
8f20: 6f 77 2c 20 26 69 42 6c 6f 62 29 3b 0a 20 20 7d  ow, &iBlob);.  }
8f30: 0a 20 20 73 71 6c 5f 73 63 72 69 70 74 28 70 45  .  sql_script(pE
8f40: 72 72 2c 20 70 44 62 2c 20 22 43 4f 4d 4d 49 54  rr, pDb, "COMMIT
8f50: 22 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ");.}.static voi
8f60: 64 20 63 67 74 5f 70 61 67 65 72 5f 31 5f 75 70  d cgt_pager_1_up
8f70: 64 61 74 65 28 45 72 72 6f 72 20 2a 70 45 72 72  date(Error *pErr
8f80: 2c 20 53 71 6c 69 74 65 20 2a 70 44 62 29 7b 0a  , Sqlite *pDb){.
8f90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
8fa0: 70 64 61 74 65 20 3d 20 22 55 50 44 41 54 45 20  pdate = "UPDATE 
8fb0: 74 31 20 53 45 54 20 62 20 3d 20 7a 65 72 6f 62  t1 SET b = zerob
8fc0: 6c 6f 62 28 3a 69 42 6c 6f 62 29 20 57 48 45 52  lob(:iBlob) WHER
8fd0: 45 20 61 20 3d 20 3a 69 52 6f 77 22 3b 0a 20 20  E a = :iRow";.  
8fe0: 69 36 34 20 69 52 6f 77 3b 0a 20 20 73 71 6c 5f  i64 iRow;.  sql_
8ff0: 73 63 72 69 70 74 28 70 45 72 72 2c 20 70 44 62  script(pErr, pDb
9000: 2c 20 22 42 45 47 49 4e 22 29 3b 0a 20 20 66 6f  , "BEGIN");.  fo
9010: 72 28 69 52 6f 77 3d 31 3b 20 69 52 6f 77 3c 3d  r(iRow=1; iRow<=
9020: 43 41 4c 4c 47 52 49 4e 44 54 45 53 54 31 5f 4e  CALLGRINDTEST1_N
9030: 52 4f 57 3b 20 69 52 6f 77 2b 2b 29 7b 0a 20 20  ROW; iRow++){.  
9040: 20 20 69 36 34 20 69 42 6c 6f 62 20 3d 20 36 30    i64 iBlob = 60
9050: 30 20 2b 20 28 28 69 52 6f 77 2b 31 30 30 29 25  0 + ((iRow+100)%
9060: 33 30 30 29 3b 0a 20 20 20 20 65 78 65 63 73 71  300);.    execsq
9070: 6c 28 70 45 72 72 2c 20 70 44 62 2c 20 7a 55 70  l(pErr, pDb, zUp
9080: 64 61 74 65 2c 20 26 69 42 6c 6f 62 2c 20 26 69  date, &iBlob, &i
9090: 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 5f  Row);.  }.  sql_
90a0: 73 63 72 69 70 74 28 70 45 72 72 2c 20 70 44 62  script(pErr, pDb
90b0: 2c 20 22 43 4f 4d 4d 49 54 22 29 3b 0a 7d 0a 73  , "COMMIT");.}.s
90c0: 74 61 74 69 63 20 76 6f 69 64 20 63 67 74 5f 70  tatic void cgt_p
90d0: 61 67 65 72 5f 31 5f 72 65 61 64 28 45 72 72 6f  ager_1_read(Erro
90e0: 72 20 2a 70 45 72 72 2c 20 53 71 6c 69 74 65 20  r *pErr, Sqlite 
90f0: 2a 70 44 62 29 7b 0a 20 20 69 36 34 20 69 52 6f  *pDb){.  i64 iRo
9100: 77 3b 0a 20 20 73 71 6c 5f 73 63 72 69 70 74 28  w;.  sql_script(
9110: 70 45 72 72 2c 20 70 44 62 2c 20 22 42 45 47 49  pErr, pDb, "BEGI
9120: 4e 22 29 3b 0a 20 20 66 6f 72 28 69 52 6f 77 3d  N");.  for(iRow=
9130: 31 3b 20 69 52 6f 77 3c 3d 43 41 4c 4c 47 52 49  1; iRow<=CALLGRI
9140: 4e 44 54 45 53 54 31 5f 4e 52 4f 57 3b 20 69 52  NDTEST1_NROW; iR
9150: 6f 77 2b 2b 29 7b 0a 20 20 20 20 65 78 65 63 73  ow++){.    execs
9160: 71 6c 28 70 45 72 72 2c 20 70 44 62 2c 20 22 53  ql(pErr, pDb, "S
9170: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
9180: 57 48 45 52 45 20 61 20 3d 20 3a 69 52 6f 77 22  WHERE a = :iRow"
9190: 2c 20 26 69 52 6f 77 29 3b 0a 20 20 7d 0a 20 20  , &iRow);.  }.  
91a0: 73 71 6c 5f 73 63 72 69 70 74 28 70 45 72 72 2c  sql_script(pErr,
91b0: 20 70 44 62 2c 20 22 43 4f 4d 4d 49 54 22 29 3b   pDb, "COMMIT");
91c0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
91d0: 67 74 5f 70 61 67 65 72 5f 31 28 69 6e 74 20 6e  gt_pager_1(int n
91e0: 4d 73 29 7b 0a 20 20 76 6f 69 64 20 28 2a 78 53  Ms){.  void (*xS
91f0: 75 62 29 28 45 72 72 6f 72 20 2a 2c 20 53 71 6c  ub)(Error *, Sql
9200: 69 74 65 20 2a 29 3b 0a 20 20 45 72 72 6f 72 20  ite *);.  Error 
9210: 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20 53 71 6c  err = {0};.  Sql
9220: 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 0a 0a 20  ite db = {0};.. 
9230: 20 6f 70 65 6e 64 62 28 26 65 72 72 2c 20 26 64   opendb(&err, &d
9240: 62 2c 20 22 74 65 73 74 2e 64 62 22 2c 20 31 29  b, "test.db", 1)
9250: 3b 0a 20 20 73 71 6c 5f 73 63 72 69 70 74 28 26  ;.  sql_script(&
9260: 65 72 72 2c 20 26 64 62 2c 0a 20 20 20 20 20 20  err, &db,.      
9270: 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
9280: 7a 65 20 3d 20 32 30 30 30 3b 22 0a 20 20 20 20  ze = 2000;".    
9290: 20 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73    "PRAGMA page_s
92a0: 69 7a 65 20 3d 20 31 30 32 34 3b 22 0a 20 20 20  ize = 1024;".   
92b0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
92c0: 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52   t1(a INTEGER PR
92d0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 42 4c 4f  IMARY KEY, b BLO
92e0: 42 29 3b 22 0a 20 20 29 3b 0a 0a 20 20 78 53 75  B);".  );..  xSu
92f0: 62 20 3d 20 63 67 74 5f 70 61 67 65 72 5f 31 5f  b = cgt_pager_1_
9300: 70 6f 70 75 6c 61 74 65 3b 20 78 53 75 62 28 26  populate; xSub(&
9310: 65 72 72 2c 20 26 64 62 29 3b 0a 20 20 78 53 75  err, &db);.  xSu
9320: 62 20 3d 20 63 67 74 5f 70 61 67 65 72 5f 31 5f  b = cgt_pager_1_
9330: 75 70 64 61 74 65 3b 20 20 20 78 53 75 62 28 26  update;   xSub(&
9340: 65 72 72 2c 20 26 64 62 29 3b 0a 20 20 78 53 75  err, &db);.  xSu
9350: 62 20 3d 20 63 67 74 5f 70 61 67 65 72 5f 31 5f  b = cgt_pager_1_
9360: 72 65 61 64 3b 20 20 20 20 20 78 53 75 62 28 26  read;     xSub(&
9370: 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20 20 63 6c  err, &db);..  cl
9380: 6f 73 65 64 62 28 26 65 72 72 2c 20 26 64 62 29  osedb(&err, &db)
9390: 3b 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72  ;.  print_and_fr
93a0: 65 65 5f 65 72 72 28 26 65 72 72 29 3b 0a 7d 0a  ee_err(&err);.}.
93b0: 0a 2f 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*-------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 54  -----------.** T
9400: 65 73 74 20 63 61 73 65 20 22 64 79 6e 61 6d 69  est case "dynami
9410: 63 5f 74 72 69 67 67 65 72 73 22 0a 2a 2a 0a 2a  c_triggers".**.*
9420: 2a 20 20 20 54 77 6f 20 74 68 72 65 61 64 73 20  *   Two threads 
9430: 65 78 65 63 75 74 69 6e 67 20 73 74 61 74 65 6d  executing statem
9440: 65 6e 74 73 20 74 68 61 74 20 63 61 75 73 65 20  ents that cause 
9450: 64 65 65 70 6c 79 20 6e 65 73 74 65 64 20 74 72  deeply nested tr
9460: 69 67 67 65 72 73 0a 2a 2a 20 20 20 74 6f 20 66  iggers.**   to f
9470: 69 72 65 2e 20 41 6e 64 20 6f 6e 65 20 74 68 72  ire. And one thr
9480: 65 61 64 20 62 75 73 69 6c 79 20 63 72 65 61 74  ead busily creat
9490: 69 6e 67 20 61 6e 64 20 64 65 6c 65 74 69 6e 67  ing and deleting
94a0: 20 74 72 69 67 67 65 72 73 2e 20 54 68 69 73 0a   triggers. This.
94b0: 2a 2a 20 20 20 69 73 20 61 6e 20 61 74 74 65 6d  **   is an attem
94c0: 70 74 20 74 6f 20 66 69 6e 64 20 61 20 62 75 67  pt to find a bug
94d0: 20 72 65 70 6f 72 74 65 64 20 74 6f 20 75 73 2e   reported to us.
94e0: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 63 68 61 72  .*/..static char
94f0: 20 2a 64 79 6e 61 6d 69 63 5f 74 72 69 67 67 65   *dynamic_trigge
9500: 72 73 5f 31 28 69 6e 74 20 69 54 69 64 2c 20 76  rs_1(int iTid, v
9510: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 45 72  oid *pArg){.  Er
9520: 72 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 20 20  ror err = {0};  
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9540: 20 45 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   Error code and 
9550: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 53 71 6c  message */.  Sql
9560: 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 20 20 20  ite db = {0};   
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9580: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
9590: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
95a0: 69 6e 74 20 6e 44 72 6f 70 20 3d 20 30 3b 0a 20  int nDrop = 0;. 
95b0: 20 69 6e 74 20 6e 43 72 65 61 74 65 20 3d 20 30   int nCreate = 0
95c0: 3b 0a 0a 20 20 6f 70 65 6e 64 62 28 26 65 72 72  ;..  opendb(&err
95d0: 2c 20 26 64 62 2c 20 22 74 65 73 74 2e 64 62 22  , &db, "test.db"
95e0: 2c 20 30 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  , 0);.  while( !
95f0: 74 69 6d 65 74 6f 73 74 6f 70 28 26 65 72 72 29  timetostop(&err)
9600: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a   ){.    int i;..
9610: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 39      for(i=1; i<9
9620: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
9630: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
9640: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
9650: 20 20 20 20 22 43 52 45 41 54 45 20 54 52 49 47      "CREATE TRIG
9660: 47 45 52 20 69 74 72 25 64 20 42 45 46 4f 52 45  GER itr%d BEFORE
9670: 20 49 4e 53 45 52 54 20 4f 4e 20 74 25 64 20 42   INSERT ON t%d B
9680: 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20  EGIN ".         
9690: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 25   "INSERT INTO t%
96a0: 64 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 2c 20  d VALUES(new.x, 
96b0: 6e 65 77 2e 79 29 3b 22 0a 20 20 20 20 20 20 20  new.y);".       
96c0: 20 22 45 4e 44 3b 22 2c 20 69 2c 20 69 2c 20 69   "END;", i, i, i
96d0: 2b 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  +1.      );.    
96e0: 20 20 65 78 65 63 73 71 6c 28 26 65 72 72 2c 20    execsql(&err, 
96f0: 26 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  &db, zSql);.    
9700: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9710: 53 71 6c 29 3b 0a 20 20 20 20 20 20 6e 43 72 65  Sql);.      nCre
9720: 61 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ate++;.    }..  
9730: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 39 3b 20    for(i=1; i<9; 
9740: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
9750: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
9760: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
9770: 20 20 22 43 52 45 41 54 45 20 54 52 49 47 47 45    "CREATE TRIGGE
9780: 52 20 64 74 72 25 64 20 42 45 46 4f 52 45 20 44  R dtr%d BEFORE D
9790: 45 4c 45 54 45 20 4f 4e 20 74 25 64 20 42 45 47  ELETE ON t%d BEG
97a0: 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  IN ".          "
97b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 25 64 20  DELETE FROM t%d 
97c0: 57 48 45 52 45 20 78 20 3d 20 6f 6c 64 2e 78 3b  WHERE x = old.x;
97d0: 20 22 0a 20 20 20 20 20 20 20 20 22 45 4e 44 3b   ".        "END;
97e0: 22 2c 20 69 2c 20 69 2c 20 69 2b 31 0a 20 20 20  ", i, i, i+1.   
97f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 65 78 65 63     );.      exec
9800: 73 71 6c 28 26 65 72 72 2c 20 26 64 62 2c 20 7a  sql(&err, &db, z
9810: 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
9820: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
9830: 20 20 20 20 20 20 6e 43 72 65 61 74 65 2b 2b 3b        nCreate++;
9840: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
9850: 69 3d 31 3b 20 69 3c 39 3b 20 69 2b 2b 29 7b 0a  i=1; i<9; i++){.
9860: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
9870: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9880: 74 66 28 22 44 52 4f 50 20 54 52 49 47 47 45 52  tf("DROP TRIGGER
9890: 20 69 74 72 25 64 22 2c 20 69 29 3b 0a 20 20 20   itr%d", i);.   
98a0: 20 20 20 65 78 65 63 73 71 6c 28 26 65 72 72 2c     execsql(&err,
98b0: 20 26 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20   &db, zSql);.   
98c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
98d0: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 6e 44 72  zSql);.      nDr
98e0: 6f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  op++;.    }..   
98f0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 39 3b 20 69   for(i=1; i<9; i
9900: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
9910: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
9920: 6d 70 72 69 6e 74 66 28 22 44 52 4f 50 20 54 52  mprintf("DROP TR
9930: 49 47 47 45 52 20 64 74 72 25 64 22 2c 20 69 29  IGGER dtr%d", i)
9940: 3b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 28  ;.      execsql(
9950: 26 65 72 72 2c 20 26 64 62 2c 20 7a 53 71 6c 29  &err, &db, zSql)
9960: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9970: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
9980: 20 20 6e 44 72 6f 70 2b 2b 3b 0a 20 20 20 20 7d    nDrop++;.    }
9990: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 64 62 28 26  .  }.  closedb(&
99a0: 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20 20 70 72  err, &db);..  pr
99b0: 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72  int_and_free_err
99c0: 28 26 65 72 72 29 3b 0a 20 20 72 65 74 75 72 6e  (&err);.  return
99d0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
99e0: 28 22 25 64 20 63 72 65 61 74 65 64 2c 20 25 64  ("%d created, %d
99f0: 20 64 72 6f 70 70 65 64 22 2c 20 6e 43 72 65 61   dropped", nCrea
9a00: 74 65 2c 20 6e 44 72 6f 70 29 3b 0a 7d 0a 0a 73  te, nDrop);.}..s
9a10: 74 61 74 69 63 20 63 68 61 72 20 2a 64 79 6e 61  tatic char *dyna
9a20: 6d 69 63 5f 74 72 69 67 67 65 72 73 5f 32 28 69  mic_triggers_2(i
9a30: 6e 74 20 69 54 69 64 2c 20 76 6f 69 64 20 2a 70  nt iTid, void *p
9a40: 41 72 67 29 7b 0a 20 20 45 72 72 6f 72 20 65 72  Arg){.  Error er
9a50: 72 20 3d 20 7b 30 7d 3b 20 20 20 20 20 20 20 20  r = {0};        
9a60: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
9a70: 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67   code and messag
9a80: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20 64 62  e */.  Sqlite db
9a90: 20 3d 20 7b 30 7d 3b 20 20 20 20 20 20 20 20 20   = {0};         
9aa0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
9ab0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9ac0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 36 34 20 69 56  tion */.  i64 iV
9ad0: 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 49  al = 0;.  int nI
9ae0: 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  nsert = 0;.  int
9af0: 20 6e 44 65 6c 65 74 65 20 3d 20 30 3b 0a 0a 20   nDelete = 0;.. 
9b00: 20 6f 70 65 6e 64 62 28 26 65 72 72 2c 20 26 64   opendb(&err, &d
9b10: 62 2c 20 22 74 65 73 74 2e 64 62 22 2c 20 30 29  b, "test.db", 0)
9b20: 3b 0a 20 20 77 68 69 6c 65 28 20 21 74 69 6d 65  ;.  while( !time
9b30: 74 6f 73 74 6f 70 28 26 65 72 72 29 20 29 7b 0a  tostop(&err) ){.
9b40: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
9b50: 56 61 6c 20 3d 20 28 69 56 61 6c 2b 31 29 25 31  Val = (iVal+1)%1
9b60: 30 30 3b 0a 20 20 20 20 20 20 65 78 65 63 73 71  00;.      execsq
9b70: 6c 28 26 65 72 72 2c 20 26 64 62 2c 20 22 49 4e  l(&err, &db, "IN
9b80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
9b90: 55 45 53 28 3a 69 58 2c 20 3a 69 59 2b 31 29 22  UES(:iX, :iY+1)"
9ba0: 2c 20 26 69 56 61 6c 2c 20 26 69 56 61 6c 29 3b  , &iVal, &iVal);
9bb0: 0a 20 20 20 20 20 20 6e 49 6e 73 65 72 74 2b 2b  .      nInsert++
9bc0: 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 20 69  ;.    } while( i
9bd0: 56 61 6c 20 29 3b 0a 0a 20 20 20 20 64 6f 20 7b  Val );..    do {
9be0: 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 28 69  .      iVal = (i
9bf0: 56 61 6c 2b 31 29 25 31 30 30 3b 0a 20 20 20 20  Val+1)%100;.    
9c00: 20 20 65 78 65 63 73 71 6c 28 26 65 72 72 2c 20    execsql(&err, 
9c10: 26 64 62 2c 20 22 44 45 4c 45 54 45 20 46 52 4f  &db, "DELETE FRO
9c20: 4d 20 74 31 20 57 48 45 52 45 20 78 20 3d 20 3a  M t1 WHERE x = :
9c30: 69 58 22 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  iX", &iVal);.   
9c40: 20 20 20 6e 44 65 6c 65 74 65 2b 2b 3b 0a 20 20     nDelete++;.  
9c50: 20 20 7d 20 77 68 69 6c 65 28 20 69 56 61 6c 20    } while( iVal 
9c60: 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 64 62  );.  }.  closedb
9c70: 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20 20  (&err, &db);..  
9c80: 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65  print_and_free_e
9c90: 72 72 28 26 65 72 72 29 3b 0a 20 20 72 65 74 75  rr(&err);.  retu
9ca0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  rn sqlite3_mprin
9cb0: 74 66 28 22 25 64 20 69 6e 73 65 72 74 73 2c 20  tf("%d inserts, 
9cc0: 25 64 20 64 65 6c 65 74 65 73 22 2c 20 6e 49 6e  %d deletes", nIn
9cd0: 73 65 72 74 2c 20 6e 44 65 6c 65 74 65 29 3b 0a  sert, nDelete);.
9ce0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  }..static void d
9cf0: 79 6e 61 6d 69 63 5f 74 72 69 67 67 65 72 73 28  ynamic_triggers(
9d00: 69 6e 74 20 6e 4d 73 29 7b 0a 20 20 45 72 72 6f  int nMs){.  Erro
9d10: 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20 53  r err = {0};.  S
9d20: 71 6c 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 0a  qlite db = {0};.
9d30: 20 20 54 68 72 65 61 64 73 65 74 20 74 68 72 65    Threadset thre
9d40: 61 64 73 20 3d 20 7b 30 7d 3b 0a 0a 20 20 6f 70  ads = {0};..  op
9d50: 65 6e 64 62 28 26 65 72 72 2c 20 26 64 62 2c 20  endb(&err, &db, 
9d60: 22 74 65 73 74 2e 64 62 22 2c 20 31 29 3b 0a 20  "test.db", 1);. 
9d70: 20 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72   sql_script(&err
9d80: 2c 20 26 64 62 2c 20 0a 20 20 20 20 20 20 22 50  , &db, .      "P
9d90: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
9da0: 3d 20 31 30 32 34 3b 22 0a 20 20 20 20 20 20 22  = 1024;".      "
9db0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
9dc0: 6f 64 65 20 3d 20 57 41 4c 3b 22 0a 20 20 20 20  ode = WAL;".    
9dd0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
9de0: 74 31 28 78 2c 20 79 29 3b 22 0a 20 20 20 20 20  t1(x, y);".     
9df0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
9e00: 32 28 78 2c 20 79 29 3b 22 0a 20 20 20 20 20 20  2(x, y);".      
9e10: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33  "CREATE TABLE t3
9e20: 28 78 2c 20 79 29 3b 22 0a 20 20 20 20 20 20 22  (x, y);".      "
9e30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
9e40: 78 2c 20 79 29 3b 22 0a 20 20 20 20 20 20 22 43  x, y);".      "C
9e50: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 78  REATE TABLE t5(x
9e60: 2c 20 79 29 3b 22 0a 20 20 20 20 20 20 22 43 52  , y);".      "CR
9e70: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 78 2c  EATE TABLE t6(x,
9e80: 20 79 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45   y);".      "CRE
9e90: 41 54 45 20 54 41 42 4c 45 20 74 37 28 78 2c 20  ATE TABLE t7(x, 
9ea0: 79 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41  y);".      "CREA
9eb0: 54 45 20 54 41 42 4c 45 20 74 38 28 78 2c 20 79  TE TABLE t8(x, y
9ec0: 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41 54  );".      "CREAT
9ed0: 45 20 54 41 42 4c 45 20 74 39 28 78 2c 20 79 29  E TABLE t9(x, y)
9ee0: 3b 22 0a 20 20 29 3b 0a 20 20 63 6c 6f 73 65 64  ;".  );.  closed
9ef0: 62 28 26 65 72 72 2c 20 26 64 62 29 3b 0a 0a 20  b(&err, &db);.. 
9f00: 20 73 65 74 73 74 6f 70 74 69 6d 65 28 26 65 72   setstoptime(&er
9f10: 72 2c 20 6e 4d 73 29 3b 0a 0a 20 20 73 71 6c 69  r, nMs);..  sqli
9f20: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
9f30: 64 5f 63 61 63 68 65 28 31 29 3b 0a 20 20 6c 61  d_cache(1);.  la
9f40: 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72 72  unch_thread(&err
9f50: 2c 20 26 74 68 72 65 61 64 73 2c 20 64 79 6e 61  , &threads, dyna
9f60: 6d 69 63 5f 74 72 69 67 67 65 72 73 5f 32 2c 20  mic_triggers_2, 
9f70: 30 29 3b 0a 20 20 6c 61 75 6e 63 68 5f 74 68 72  0);.  launch_thr
9f80: 65 61 64 28 26 65 72 72 2c 20 26 74 68 72 65 61  ead(&err, &threa
9f90: 64 73 2c 20 64 79 6e 61 6d 69 63 5f 74 72 69 67  ds, dynamic_trig
9fa0: 67 65 72 73 5f 32 2c 20 30 29 3b 0a 0a 20 20 73  gers_2, 0);..  s
9fb0: 6c 65 65 70 28 32 29 3b 0a 20 20 73 71 6c 69 74  leep(2);.  sqlit
9fc0: 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
9fd0: 5f 63 61 63 68 65 28 30 29 3b 0a 0a 20 20 6c 61  _cache(0);..  la
9fe0: 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72 72  unch_thread(&err
9ff0: 2c 20 26 74 68 72 65 61 64 73 2c 20 64 79 6e 61  , &threads, dyna
a000: 6d 69 63 5f 74 72 69 67 67 65 72 73 5f 32 2c 20  mic_triggers_2, 
a010: 30 29 3b 0a 20 20 6c 61 75 6e 63 68 5f 74 68 72  0);.  launch_thr
a020: 65 61 64 28 26 65 72 72 2c 20 26 74 68 72 65 61  ead(&err, &threa
a030: 64 73 2c 20 64 79 6e 61 6d 69 63 5f 74 72 69 67  ds, dynamic_trig
a040: 67 65 72 73 5f 31 2c 20 30 29 3b 0a 0a 20 20 6a  gers_1, 0);..  j
a050: 6f 69 6e 5f 61 6c 6c 5f 74 68 72 65 61 64 73 28  oin_all_threads(
a060: 26 65 72 72 2c 20 26 74 68 72 65 61 64 73 29 3b  &err, &threads);
a070: 0a 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72  ..  print_and_fr
a080: 65 65 5f 65 72 72 28 26 65 72 72 29 3b 0a 7d 0a  ee_err(&err);.}.
a090: 0a 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 74 33  ...#include "tt3
a0a0: 5f 63 68 65 63 6b 70 6f 69 6e 74 2e 63 22 0a 23  _checkpoint.c".#
a0b0: 69 6e 63 6c 75 64 65 20 22 74 74 33 5f 69 6e 64  include "tt3_ind
a0c0: 65 78 2e 63 22 0a 23 69 6e 63 6c 75 64 65 20 22  ex.c".#include "
a0d0: 74 74 33 5f 6c 6f 6f 6b 61 73 69 64 65 31 2e 63  tt3_lookaside1.c
a0e0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 74 33 5f  ".#include "tt3_
a0f0: 76 61 63 75 75 6d 2e 63 22 0a 23 69 6e 63 6c 75  vacuum.c".#inclu
a100: 64 65 20 22 74 74 33 5f 73 74 72 65 73 73 2e 63  de "tt3_stress.c
a110: 22 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20  "..int main(int 
a120: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
a130: 76 29 7b 0a 20 20 73 74 72 75 63 74 20 54 68 72  v){.  struct Thr
a140: 65 61 64 54 65 73 74 20 7b 0a 20 20 20 20 76 6f  eadTest {.    vo
a150: 69 64 20 28 2a 78 54 65 73 74 29 28 69 6e 74 29  id (*xTest)(int)
a160: 3b 20 20 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  ;   /* Routine f
a170: 6f 72 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  or running this 
a180: 74 65 73 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  test */.    cons
a190: 74 20 63 68 61 72 20 2a 7a 54 65 73 74 3b 20 20  t char *zTest;  
a1a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69    /* Name of thi
a1b0: 73 20 74 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e  s test */.    in
a1c0: 74 20 6e 4d 73 3b 20 20 20 20 20 20 20 20 20 20  t nMs;          
a1d0: 20 20 20 20 2f 2a 20 48 6f 77 20 6c 6f 6e 67 20      /* How long 
a1e0: 74 6f 20 72 75 6e 20 74 68 69 73 20 74 65 73 74  to run this test
a1f0: 2c 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  , in millisecond
a200: 73 20 2a 2f 0a 20 20 7d 20 61 54 65 73 74 5b 5d  s */.  } aTest[]
a210: 20 3d 20 7b 0a 20 20 20 20 7b 20 77 61 6c 74 68   = {.    { walth
a220: 72 65 61 64 31 2c 20 22 77 61 6c 74 68 72 65 61  read1, "walthrea
a230: 64 31 22 2c 20 32 30 30 30 30 20 7d 2c 0a 20 20  d1", 20000 },.  
a240: 20 20 7b 20 77 61 6c 74 68 72 65 61 64 32 2c 20    { walthread2, 
a250: 22 77 61 6c 74 68 72 65 61 64 32 22 2c 20 32 30  "walthread2", 20
a260: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 77 61 6c  000 },.    { wal
a270: 74 68 72 65 61 64 33 2c 20 22 77 61 6c 74 68 72  thread3, "walthr
a280: 65 61 64 33 22 2c 20 32 30 30 30 30 20 7d 2c 0a  ead3", 20000 },.
a290: 20 20 20 20 7b 20 77 61 6c 74 68 72 65 61 64 34      { walthread4
a2a0: 2c 20 22 77 61 6c 74 68 72 65 61 64 34 22 2c 20  , "walthread4", 
a2b0: 32 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 77  20000 },.    { w
a2c0: 61 6c 74 68 72 65 61 64 35 2c 20 22 77 61 6c 74  althread5, "walt
a2d0: 68 72 65 61 64 35 22 2c 20 20 31 30 30 30 20 7d  hread5",  1000 }
a2e0: 2c 0a 20 20 20 20 7b 20 77 61 6c 74 68 72 65 61  ,.    { walthrea
a2f0: 64 35 2c 20 22 77 61 6c 74 68 72 65 61 64 35 22  d5, "walthread5"
a300: 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 0a  ,  1000 },.    .
a310: 20 20 20 20 7b 20 63 67 74 5f 70 61 67 65 72 5f      { cgt_pager_
a320: 31 2c 20 20 20 20 20 20 22 63 67 74 5f 70 61 67  1,      "cgt_pag
a330: 65 72 5f 31 22 2c 20 30 20 7d 2c 0a 20 20 20 20  er_1", 0 },.    
a340: 7b 20 64 79 6e 61 6d 69 63 5f 74 72 69 67 67 65  { dynamic_trigge
a350: 72 73 2c 20 22 64 79 6e 61 6d 69 63 5f 74 72 69  rs, "dynamic_tri
a360: 67 67 65 72 73 22 2c 20 32 30 30 30 30 20 7d 2c  ggers", 20000 },
a370: 0a 0a 20 20 20 20 7b 20 63 68 65 63 6b 70 6f 69  ..    { checkpoi
a380: 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e 5f 31 2c  nt_starvation_1,
a390: 20 22 63 68 65 63 6b 70 6f 69 6e 74 5f 73 74 61   "checkpoint_sta
a3a0: 72 76 61 74 69 6f 6e 5f 31 22 2c 20 31 30 30 30  rvation_1", 1000
a3b0: 30 20 7d 2c 0a 20 20 20 20 7b 20 63 68 65 63 6b  0 },.    { check
a3c0: 70 6f 69 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e  point_starvation
a3d0: 5f 32 2c 20 22 63 68 65 63 6b 70 6f 69 6e 74 5f  _2, "checkpoint_
a3e0: 73 74 61 72 76 61 74 69 6f 6e 5f 32 22 2c 20 31  starvation_2", 1
a3f0: 30 30 30 30 20 7d 2c 0a 0a 20 20 20 20 7b 20 63  0000 },..    { c
a400: 72 65 61 74 65 5f 64 72 6f 70 5f 69 6e 64 65 78  reate_drop_index
a410: 5f 31 2c 20 22 63 72 65 61 74 65 5f 64 72 6f 70  _1, "create_drop
a420: 5f 69 6e 64 65 78 5f 31 22 2c 20 31 30 30 30 30  _index_1", 10000
a430: 20 7d 2c 0a 20 20 20 20 7b 20 6c 6f 6f 6b 61 73   },.    { lookas
a440: 69 64 65 31 2c 20 20 20 20 20 20 20 20 20 20 22  ide1,          "
a450: 6c 6f 6f 6b 61 73 69 64 65 31 22 2c 20 31 30 30  lookaside1", 100
a460: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 76 61 63 75  00 },.    { vacu
a470: 75 6d 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  um1,            
a480: 20 22 76 61 63 75 75 6d 31 22 2c 20 31 30 30 30   "vacuum1", 1000
a490: 30 20 7d 2c 0a 20 20 20 20 7b 20 73 74 72 65 73  0 },.    { stres
a4a0: 73 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s1,             
a4b0: 22 73 74 72 65 73 73 31 22 2c 20 31 30 30 30 30  "stress1", 10000
a4c0: 20 7d 2c 0a 20 20 20 20 7b 20 73 74 72 65 73 73   },.    { stress
a4d0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  2,             "
a4e0: 73 74 72 65 73 73 32 22 2c 20 36 30 30 30 30 20  stress2", 60000 
a4f0: 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 69  },.  };..  int i
a500: 3b 0a 20 20 69 6e 74 20 6e 54 65 73 74 66 6f 75  ;.  int nTestfou
a510: 6e 64 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74  nd = 0;..  sqlit
a520: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
a530: 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52  _CONFIG_MULTITHR
a540: 45 41 44 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  EAD);.  sqlite3_
a550: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
a560: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
a570: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
a580: 3c 73 69 7a 65 6f 66 28 61 54 65 73 74 29 2f 73  <sizeof(aTest)/s
a590: 69 7a 65 6f 66 28 61 54 65 73 74 5b 30 5d 29 3b  izeof(aTest[0]);
a5a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
a5b0: 63 6f 6e 73 74 20 2a 7a 20 3d 20 61 54 65 73 74  const *z = aTest
a5c0: 5b 69 5d 2e 7a 54 65 73 74 3b 0a 20 20 20 20 69  [i].zTest;.    i
a5d0: 66 28 20 61 72 67 63 3e 31 20 29 7b 0a 20 20 20  f( argc>1 ){.   
a5e0: 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20     int iArg;.   
a5f0: 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69     for(iArg=1; i
a600: 41 72 67 3c 61 72 67 63 3b 20 69 41 72 67 2b 2b  Arg<argc; iArg++
a610: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  ){.        if( 0
a620: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
a630: 62 28 61 72 67 76 5b 69 41 72 67 5d 2c 20 7a 29  b(argv[iArg], z)
a640: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a650: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 41 72 67  }.      if( iArg
a660: 3d 3d 61 72 67 63 20 29 20 63 6f 6e 74 69 6e 75  ==argc ) continu
a670: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  e;.    }..    pr
a680: 69 6e 74 66 28 22 52 75 6e 6e 69 6e 67 20 25 73  intf("Running %s
a690: 20 66 6f 72 20 25 64 20 73 65 63 6f 6e 64 73 2e   for %d seconds.
a6a0: 2e 2e 5c 6e 22 2c 20 7a 2c 20 61 54 65 73 74 5b  ..\n", z, aTest[
a6b0: 69 5d 2e 6e 4d 73 2f 31 30 30 30 29 3b 0a 20 20  i].nMs/1000);.  
a6c0: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
a6d0: 3b 0a 20 20 20 20 61 54 65 73 74 5b 69 5d 2e 78  ;.    aTest[i].x
a6e0: 54 65 73 74 28 61 54 65 73 74 5b 69 5d 2e 6e 4d  Test(aTest[i].nM
a6f0: 73 29 3b 0a 20 20 20 20 6e 54 65 73 74 66 6f 75  s);.    nTestfou
a700: 6e 64 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nd++;.  }.  if( 
a710: 6e 54 65 73 74 66 6f 75 6e 64 3d 3d 30 20 29 20  nTestfound==0 ) 
a720: 67 6f 74 6f 20 75 73 61 67 65 3b 0a 0a 20 20 70  goto usage;..  p
a730: 72 69 6e 74 66 28 22 25 64 20 65 72 72 6f 72 73  rintf("%d errors
a740: 20 6f 75 74 20 6f 66 20 25 64 20 74 65 73 74 73   out of %d tests
a750: 5c 6e 22 2c 20 6e 47 6c 6f 62 61 6c 45 72 72 2c  \n", nGlobalErr,
a760: 20 6e 54 65 73 74 66 6f 75 6e 64 29 3b 0a 20 20   nTestfound);.  
a770: 72 65 74 75 72 6e 20 28 6e 47 6c 6f 62 61 6c 45  return (nGlobalE
a780: 72 72 3e 30 20 3f 20 32 35 35 20 3a 20 30 29 3b  rr>0 ? 255 : 0);
a790: 0a 0a 20 75 73 61 67 65 3a 0a 20 20 70 72 69 6e  .. usage:.  prin
a7a0: 74 66 28 22 55 73 61 67 65 3a 20 25 73 20 5b 74  tf("Usage: %s [t
a7b0: 65 73 74 6e 61 6d 65 7c 74 65 73 74 70 72 65 66  estname|testpref
a7c0: 69 78 2a 5d 2e 2e 2e 5c 6e 22 2c 20 61 72 67 76  ix*]...\n", argv
a7d0: 5b 30 5d 29 3b 0a 20 20 70 72 69 6e 74 66 28 22  [0]);.  printf("
a7e0: 41 76 61 69 6c 61 62 6c 65 20 74 65 73 74 73 20  Available tests 
a7f0: 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28  are:\n");.  for(
a800: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 54  i=0; i<sizeof(aT
a810: 65 73 74 29 2f 73 69 7a 65 6f 66 28 61 54 65 73  est)/sizeof(aTes
a820: 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[0]); i++){.   
a830: 20 70 72 69 6e 74 66 28 22 20 20 20 25 73 5c 6e   printf("   %s\n
a840: 22 2c 20 61 54 65 73 74 5b 69 5d 2e 7a 54 65 73  ", aTest[i].zTes
a850: 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  t);.  }..  retur
a860: 6e 20 32 35 34 3b 0a 7d 0a                       n 254;.}.