/ Hex Artifact Content
Login

Artifact aa41ace6dbc5050d76b02548d3521e6bbccae4f0:


0000: 2f 2a 0a 2a 2a 20 32 30 31 33 2d 30 34 2d 30 35  /*.** 2013-04-05
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 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ** .** This is a
0180: 20 70 72 6f 67 72 61 6d 20 75 73 65 64 20 66 6f   program used fo
0190: 72 20 74 65 73 74 69 6e 67 20 53 51 4c 69 74 65  r testing SQLite
01a0: 2c 20 61 6e 64 20 73 70 65 63 69 66 69 63 61 6c  , and specifical
01b0: 6c 79 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ly for testing.*
01c0: 2a 20 74 68 65 20 61 62 69 6c 69 74 79 20 6f 66  * the ability of
01d0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 70 72 6f   independent pro
01e0: 63 65 73 73 65 73 20 74 6f 20 61 63 63 65 73 73  cesses to access
01f0: 20 74 68 65 20 73 61 6d 65 20 53 51 4c 69 74 65   the same SQLite
0200: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
0210: 63 75 72 72 65 6e 74 6c 79 2e 0a 2a 2a 0a 2a 2a  currently..**.**
0220: 20 43 6f 6d 70 69 6c 65 20 74 68 69 73 20 70 72   Compile this pr
0230: 6f 67 72 61 6d 20 61 73 20 66 6f 6c 6c 6f 77 73  ogram as follows
0240: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 67 63 63 20 2d  :.**.**    gcc -
0250: 67 20 2d 63 20 2d 57 61 6c 6c 20 73 71 6c 69 74  g -c -Wall sqlit
0260: 65 33 2e 63 20 24 28 4f 50 54 53 29 0a 2a 2a 20  e3.c $(OPTS).** 
0270: 20 20 20 67 63 63 20 2d 67 20 2d 6f 20 6d 70 74     gcc -g -o mpt
0280: 65 73 74 20 6d 70 74 65 73 74 2e 63 20 73 71 6c  est mptest.c sql
0290: 69 74 65 33 2e 6f 20 24 28 4c 49 42 53 29 0a 2a  ite3.o $(LIBS).*
02a0: 2a 0a 2a 2a 20 52 65 63 6f 6d 6d 65 6e 64 65 64  *.** Recommended
02b0: 20 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20   options:.**.** 
02c0: 20 20 20 2d 44 48 41 56 45 5f 55 53 4c 45 45 50     -DHAVE_USLEEP
02d0: 0a 2a 2a 20 20 20 20 2d 44 53 51 4c 49 54 45 5f  .**    -DSQLITE_
02e0: 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 20 20 20 2d 44  NO_SYNC.**    -D
02f0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
0300: 45 3d 30 0a 2a 2a 20 20 20 20 2d 44 53 51 4c 49  E=0.**    -DSQLI
0310: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
0320: 45 4e 53 49 4f 4e 0a 2a 2a 0a 2a 2a 20 52 75 6e  ENSION.**.** Run
0330: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
0340: 2a 20 20 20 20 20 2e 2f 6d 70 74 65 73 74 20 24  *     ./mptest $
0350: 64 61 74 61 62 61 73 65 20 24 73 63 72 69 70 74  database $script
0360: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24 64 61  .**.** where $da
0370: 74 61 62 61 73 65 20 69 73 20 74 68 65 20 64 61  tabase is the da
0380: 74 61 62 61 73 65 20 74 6f 20 75 73 65 20 66 6f  tabase to use fo
0390: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 24 73  r testing and $s
03a0: 63 72 69 70 74 20 69 73 20 61 0a 2a 2a 20 74 65  cript is a.** te
03b0: 73 74 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69  st script..*/.#i
03c0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
03e0: 69 6f 2e 68 3e 0a 23 69 66 20 64 65 66 69 6e 65  io.h>.#if define
03f0: 64 28 5f 57 49 4e 33 32 29 0a 23 20 64 65 66 69  d(_WIN32).# defi
0400: 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e  ne WIN32_LEAN_AN
0410: 44 5f 4d 45 41 4e 0a 23 20 69 6e 63 6c 75 64 65  D_MEAN.# include
0420: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 65 6c   <windows.h>.#el
0430: 73 65 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e  se.# include <un
0440: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
0450: 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68  include <errno.h
0460: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  >.#include <stdl
0470: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
0480: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0490: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
04a0: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
04b0: 0a 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43  ..#define ISSPAC
04c0: 45 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e  E(X) isspace((un
04d0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29  signed char)(X))
04e0: 0a 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54  .#define ISDIGIT
04f0: 28 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73  (X) isdigit((uns
0500: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
0510: 0a 2f 2a 20 54 68 65 20 73 75 66 66 69 78 20 74  ./* The suffix t
0520: 6f 20 61 70 70 65 6e 64 20 74 6f 20 74 68 65 20  o append to the 
0530: 63 68 69 6c 64 20 63 6f 6d 6d 61 6e 64 20 6c 69  child command li
0540: 6e 65 73 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 23  nes, if any */.#
0550: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
0560: 32 29 0a 23 20 64 65 66 69 6e 65 20 47 45 54 50  2).# define GETP
0570: 49 44 20 28 69 6e 74 29 47 65 74 43 75 72 72 65  ID (int)GetCurre
0580: 6e 74 50 72 6f 63 65 73 73 49 64 0a 23 65 6c 73  ntProcessId.#els
0590: 65 0a 23 20 64 65 66 69 6e 65 20 47 45 54 50 49  e.# define GETPI
05a0: 44 20 67 65 74 70 69 64 0a 23 65 6e 64 69 66 0a  D getpid.#endif.
05b0: 0a 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  ./* The director
05c0: 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
05d0: 61 63 74 65 72 28 73 29 20 2a 2f 0a 23 69 66 20  acter(s) */.#if 
05e0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
05f0: 23 20 64 65 66 69 6e 65 20 69 73 44 69 72 53 65  # define isDirSe
0600: 70 28 63 29 20 28 28 28 63 29 20 3d 3d 20 27 2f  p(c) (((c) == '/
0610: 27 29 20 7c 7c 20 28 28 63 29 20 3d 3d 20 27 5c  ') || ((c) == '\
0620: 5c 27 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  \')).#else.# def
0630: 69 6e 65 20 69 73 44 69 72 53 65 70 28 63 29 20  ine isDirSep(c) 
0640: 28 28 63 29 20 3d 3d 20 27 2f 27 29 0a 23 65 6e  ((c) == '/').#en
0650: 64 69 66 0a 0a 2f 2a 20 4d 61 72 6b 20 61 20 70  dif../* Mark a p
0660: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73  arameter as unus
0670: 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 63  ed to suppress c
0680: 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
0690: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55 53   */.#define UNUS
06a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20  ED_PARAMETER(x) 
06b0: 20 28 76 6f 69 64 29 78 0a 0a 2f 2a 20 47 6c 6f   (void)x../* Glo
06c0: 62 61 6c 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74  bal data.*/.stat
06d0: 69 63 20 73 74 72 75 63 74 20 47 6c 6f 62 61 6c  ic struct Global
06e0: 20 7b 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30   {.  char *argv0
06f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
0700: 61 6d 65 20 6f 66 20 74 68 65 20 65 78 65 63 75  ame of the execu
0710: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  table */.  const
0720: 20 63 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20   char *zVfs;    
0730: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
0740: 20 74 6f 20 75 73 65 2e 20 4f 66 74 65 6e 20 4e   to use. Often N
0750: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 22 64 65 66  ULL meaning "def
0760: 61 75 6c 74 22 20 2a 2f 0a 20 20 63 68 61 72 20  ault" */.  char 
0770: 2a 7a 44 62 46 69 6c 65 3b 20 20 20 20 20 20 20  *zDbFile;       
0780: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
0790: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
07a0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
07b0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
07c0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 64 61 74 61  nnection to data
07d0: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
07e0: 7a 45 72 72 4c 6f 67 3b 20 20 20 20 20 20 20 20  zErrLog;        
07f0: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72   /* Filename for
0800: 20 65 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20   error log */.  
0810: 46 49 4c 45 20 2a 70 45 72 72 4c 6f 67 3b 20 20  FILE *pErrLog;  
0820: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
0830: 74 6f 20 77 72 69 74 65 20 65 72 72 6f 72 73 20  to write errors 
0840: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 67 3b  */.  char *zLog;
0850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0860: 61 6d 65 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f  ame of output lo
0870: 67 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45  g file */.  FILE
0880: 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20   *pLog;         
0890: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
08a0: 72 69 74 65 20 6c 6f 67 20 6d 65 73 73 61 67 65  rite log message
08b0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4e 61 6d  s */.  char zNam
08c0: 65 5b 33 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  e[32];        /*
08d0: 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f   Symbolic name o
08e0: 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  f this process *
08f0: 2f 0a 20 20 69 6e 74 20 74 61 73 6b 49 64 3b 20  /.  int taskId; 
0900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
0910: 73 6b 20 49 44 2e 20 20 30 20 6d 65 61 6e 73 20  sk ID.  0 means 
0920: 73 75 70 65 72 76 69 73 6f 72 2e 20 2a 2f 0a 20  supervisor. */. 
0930: 20 69 6e 74 20 69 54 72 61 63 65 3b 20 20 20 20   int iTrace;    
0940: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 63 69          /* Traci
0950: 6e 67 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e  ng level */.  in
0960: 74 20 62 53 71 6c 54 72 61 63 65 3b 20 20 20 20  t bSqlTrace;    
0970: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
0980: 74 72 61 63 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  trace SQL comman
0990: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 62 49 67 6e  ds */.  int bIgn
09a0: 6f 72 65 53 71 6c 45 72 72 6f 72 73 3b 20 20 2f  oreSqlErrors;  /
09b0: 2a 20 49 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  * Ignore errors 
09c0: 69 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  in SQL statement
09d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 6f  s */.  int nErro
09e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
09f0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
0a00: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 73 74  s */.  int nTest
0a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0a20: 20 4e 75 6d 62 65 72 20 6f 66 20 2d 2d 6d 61 74   Number of --mat
0a30: 63 68 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ch operators */.
0a40: 20 20 69 6e 74 20 69 54 69 6d 65 6f 75 74 3b 20    int iTimeout; 
0a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6c 6c           /* Mill
0a60: 69 73 65 63 6f 6e 64 73 20 75 6e 74 69 6c 20 61  iseconds until a
0a70: 20 62 75 73 79 20 74 69 6d 65 6f 75 74 20 2a 2f   busy timeout */
0a80: 0a 20 20 69 6e 74 20 62 53 79 6e 63 3b 20 20 20  .  int bSync;   
0a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c            /* Cal
0aa0: 6c 20 66 73 79 6e 63 28 29 20 2a 2f 0a 7d 20 67  l fsync() */.} g
0ab0: 3b 0a 0a 2f 2a 20 44 65 66 61 75 6c 74 20 74 69  ;../* Default ti
0ac0: 6d 65 6f 75 74 20 2a 2f 0a 23 64 65 66 69 6e 65  meout */.#define
0ad0: 20 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54   DEFAULT_TIMEOUT
0ae0: 20 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 50 72   10000../*.** Pr
0af0: 69 6e 74 20 61 20 6d 65 73 73 61 67 65 20 61 64  int a message ad
0b00: 64 69 6e 67 20 7a 50 72 65 66 69 78 5b 5d 20 74  ding zPrefix[] t
0b10: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
0b20: 6f 66 20 65 76 65 72 79 20 6c 69 6e 65 2e 0a 2a  of every line..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
0b40: 69 6e 74 57 69 74 68 50 72 65 66 69 78 28 46 49  intWithPrefix(FI
0b50: 4c 45 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20  LE *pOut, const 
0b60: 63 68 61 72 20 2a 7a 50 72 65 66 69 78 2c 20 63  char *zPrefix, c
0b70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29  onst char *zMsg)
0b80: 7b 0a 20 20 77 68 69 6c 65 28 20 7a 4d 73 67 20  {.  while( zMsg 
0b90: 26 26 20 7a 4d 73 67 5b 30 5d 20 29 7b 0a 20 20  && zMsg[0] ){.  
0ba0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
0bb0: 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26  (i=0; zMsg[i] &&
0bc0: 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 20 26   zMsg[i]!='\n' &
0bd0: 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 3b  & zMsg[i]!='\r';
0be0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 70 72 69   i++){}.    fpri
0bf0: 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2e 2a  ntf(pOut, "%s%.*
0c00: 73 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 69  s\n", zPrefix, i
0c10: 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 7a 4d 73  , zMsg);.    zMs
0c20: 67 20 2b 3d 20 69 3b 0a 20 20 20 20 77 68 69 6c  g += i;.    whil
0c30: 65 28 20 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 6e 27  e( zMsg[0]=='\n'
0c40: 20 7c 7c 20 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 72   || zMsg[0]=='\r
0c50: 27 20 29 20 7a 4d 73 67 2b 2b 3b 0a 20 20 7d 0a  ' ) zMsg++;.  }.
0c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
0c70: 20 74 77 6f 20 70 6f 69 6e 74 65 72 73 20 74 6f   two pointers to
0c80: 20 73 74 72 69 6e 67 73 2c 20 77 68 65 72 65 20   strings, where 
0c90: 74 68 65 20 70 6f 69 6e 74 65 72 73 20 6d 69 67  the pointers mig
0ca0: 68 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  ht be NULL..*/.s
0cb0: 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 5f 73  tatic int safe_s
0cc0: 74 72 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72  trcmp(const char
0cd0: 20 2a 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *a, const char 
0ce0: 2a 62 29 7b 0a 20 20 69 66 28 20 61 3d 3d 62 20  *b){.  if( a==b 
0cf0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
0d00: 28 20 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( a==0 ) return 
0d10: 2d 31 3b 0a 20 20 69 66 28 20 62 3d 3d 30 20 29  -1;.  if( b==0 )
0d20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
0d30: 75 72 6e 20 73 74 72 63 6d 70 28 61 2c 62 29 3b  urn strcmp(a,b);
0d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0d50: 20 54 52 55 45 20 69 66 20 73 74 72 69 6e 67 20   TRUE if string 
0d60: 7a 5b 5d 20 6d 61 74 63 68 65 73 20 67 6c 6f 62  z[] matches glob
0d70: 20 70 61 74 74 65 72 6e 20 7a 47 6c 6f 62 5b 5d   pattern zGlob[]
0d80: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
0d90: 45 20 69 66 20 74 68 65 20 70 61 74 74 65 72 6e  E if the pattern
0da0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e   does not match.
0db0: 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20  .**.** Globbing 
0dc0: 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rules:.**.**    
0dd0: 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63    '*'       Matc
0de0: 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
0df0: 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
0e00: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
0e10: 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20  **      '?'     
0e20: 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c    Matches exactl
0e30: 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e  y one character.
0e40: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d  .**.**     [...]
0e50: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e        Matches on
0e60: 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d  e character from
0e70: 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
0e80: 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  st of.**        
0e90: 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65          characte
0ea0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e  rs..**.**     [^
0eb0: 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73  ...]     Matches
0ec0: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e   one character n
0ed0: 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73  ot in the enclos
0ee0: 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20  ed list..**.**  
0ef0: 20 20 20 20 27 23 27 20 20 20 20 20 20 20 4d 61      '#'       Ma
0f00: 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
0f10: 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ce of one or mor
0f20: 65 20 64 69 67 69 74 73 20 77 69 74 68 20 61 6e  e digits with an
0f30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0f40: 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72     optional + or
0f50: 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74   - sign in front
0f60: 0a 2a 2f 0a 69 6e 74 20 73 74 72 67 6c 6f 62 28  .*/.int strglob(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f  const char *zGlo
0f80: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
0f90: 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a  ){.  int c, c2;.
0fa0: 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20    int invert;.  
0fb0: 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69  int seen;..  whi
0fc0: 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f  le( (c = (*(zGlo
0fd0: 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  b++)))!=0 ){.   
0fe0: 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20   if( c=='*' ){. 
0ff0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28       while( (c=(
1000: 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20  *(zGlob++))) == 
1010: 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b  '*' || c=='?' ){
1020: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
1030: 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d  '?' && (*(z++))=
1040: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1060: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1080: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
1090: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  ' ){.        whi
10a0: 6c 65 28 20 2a 7a 20 26 26 20 73 74 72 67 6c 6f  le( *z && strglo
10b0: 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 20 29 7b 0a  b(zGlob-1,z) ){.
10c0: 20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20            z++;. 
10d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10e0: 20 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b   return (*z)!=0;
10f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
1100: 68 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a  hile( (c2 = (*(z
1110: 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ++)))!=0 ){.    
1120: 20 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63      while( c2!=c
1130: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
1140: 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20   = *(z++);.     
1150: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29       if( c2==0 )
1160: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1180: 20 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a   strglob(zGlob,z
1190: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
11a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
11b0: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
11c0: 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20  if( c=='?' ){.  
11d0: 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29      if( (*(z++))
11e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
11f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1200: 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e  ='[' ){.      in
1210: 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20  t prior_c = 0;. 
1220: 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20       seen = 0;. 
1230: 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b       invert = 0;
1240: 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b  .      c = *(z++
1250: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
1260: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1270: 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
1280: 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ++);.      if( c
1290: 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20  2=='^' ){.      
12a0: 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20    invert = 1;.  
12b0: 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
12c0: 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
12d0: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27       if( c2==']'
12e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
12f0: 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20  c==']' ) seen = 
1300: 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
1310: 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
1320: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
1330: 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29   c2 && c2!=']' )
1340: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32  {.        if( c2
1350: 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30  =='-' && zGlob[0
1360: 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b  ]!=']' && zGlob[
1370: 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63  0]!=0 && prior_c
1380: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1390: 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
13a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
13b0: 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d  >=prior_c && c<=
13c0: 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  c2 ) seen = 1;. 
13d0: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
13e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
13f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1400: 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20  f( c==c2 ){.    
1410: 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31          seen = 1
1420: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1430: 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20          prior_c 
1440: 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = c2;.        }.
1450: 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
1460: 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
1470: 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30  .      if( c2==0
1480: 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65   || (seen ^ inve
1490: 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rt)==0 ) return 
14a0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
14b0: 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20   c=='#' ){.     
14c0: 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20   if( (z[0]=='-' 
14d0: 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26  || z[0]=='+') &&
14e0: 20 49 53 44 49 47 49 54 28 7a 5b 31 5d 29 20 29   ISDIGIT(z[1]) )
14f0: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
1500: 21 49 53 44 49 47 49 54 28 7a 5b 30 5d 29 20 29  !ISDIGIT(z[0]) )
1510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1520: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c   z++;.      whil
1530: 65 28 20 49 53 44 49 47 49 54 28 7a 5b 30 5d 29  e( ISDIGIT(z[0])
1540: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d   ){ z++; }.    }
1550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
1560: 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65  c!=(*(z++)) ) re
1570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1580: 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30  }.  return *z==0
1590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
15a0: 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20 70   output stream p
15b0: 4f 75 74 20 69 66 20 69 74 20 69 73 20 6e 6f 74  Out if it is not
15c0: 20 73 74 64 6f 75 74 20 6f 72 20 73 74 64 65 72   stdout or stder
15d0: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  r.*/.static void
15e0: 20 6d 61 79 62 65 43 6c 6f 73 65 28 46 49 4c 45   maybeClose(FILE
15f0: 20 2a 70 4f 75 74 29 7b 0a 20 20 69 66 28 20 70   *pOut){.  if( p
1600: 4f 75 74 21 3d 73 74 64 6f 75 74 20 26 26 20 70  Out!=stdout && p
1610: 4f 75 74 21 3d 73 74 64 65 72 72 20 29 20 66 63  Out!=stderr ) fc
1620: 6c 6f 73 65 28 70 4f 75 74 29 3b 0a 7d 0a 0a 2f  lose(pOut);.}../
1630: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72  *.** Print an er
1640: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73  ror message.*/.s
1650: 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6f 72  tatic void error
1660: 4d 65 73 73 61 67 65 28 63 6f 6e 73 74 20 63 68  Message(const ch
1670: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1680: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1690: 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20  .  char *zMsg;. 
16a0: 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b 33 30   char zPrefix[30
16b0: 5d 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  ];.  va_start(ap
16c0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d  , zFormat);.  zM
16d0: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  sg = sqlite3_vmp
16e0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
16f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
1700: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
1710: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65  intf(sizeof(zPre
1720: 66 69 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22  fix), zPrefix, "
1730: 25 73 3a 45 52 52 4f 52 3a 20 22 2c 20 67 2e 7a  %s:ERROR: ", g.z
1740: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e 70  Name);.  if( g.p
1750: 4c 6f 67 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  Log ){.    print
1760: 57 69 74 68 50 72 65 66 69 78 28 67 2e 70 4c 6f  WithPrefix(g.pLo
1770: 67 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67  g, zPrefix, zMsg
1780: 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e  );.    fflush(g.
1790: 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pLog);.  }.  if(
17a0: 20 67 2e 70 45 72 72 4c 6f 67 20 26 26 20 73 61   g.pErrLog && sa
17b0: 66 65 5f 73 74 72 63 6d 70 28 67 2e 7a 45 72 72  fe_strcmp(g.zErr
17c0: 4c 6f 67 2c 67 2e 7a 4c 6f 67 29 20 29 7b 0a 20  Log,g.zLog) ){. 
17d0: 20 20 20 70 72 69 6e 74 57 69 74 68 50 72 65 66     printWithPref
17e0: 69 78 28 67 2e 70 45 72 72 4c 6f 67 2c 20 7a 50  ix(g.pErrLog, zP
17f0: 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20  refix, zMsg);.  
1800: 20 20 66 66 6c 75 73 68 28 67 2e 70 45 72 72 4c    fflush(g.pErrL
1810: 6f 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  og);.  }.  sqlit
1820: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
1830: 20 67 2e 6e 45 72 72 6f 72 2b 2b 3b 0a 7d 0a 0a   g.nError++;.}..
1840: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1850: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
1860: 20 69 6e 74 20 74 72 79 53 71 6c 28 63 6f 6e 73   int trySql(cons
1870: 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 0a  t char*, ...);..
1880: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65  /*.** Print an e
1890: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
18a0: 20 74 68 65 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73   then quit..*/.s
18b0: 74 61 74 69 63 20 76 6f 69 64 20 66 61 74 61 6c  tatic void fatal
18c0: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  Error(const char
18d0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
18e0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
18f0: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 63   char *zMsg;.  c
1900: 68 61 72 20 7a 50 72 65 66 69 78 5b 33 30 5d 3b  har zPrefix[30];
1910: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1920: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67  zFormat);.  zMsg
1930: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
1940: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
1950: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1960: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1970: 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69  tf(sizeof(zPrefi
1980: 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 25 73  x), zPrefix, "%s
1990: 3a 46 41 54 41 4c 3a 20 22 2c 20 67 2e 7a 4e 61  :FATAL: ", g.zNa
19a0: 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f  me);.  if( g.pLo
19b0: 67 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69  g ){.    printWi
19c0: 74 68 50 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c  thPrefix(g.pLog,
19d0: 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b   zPrefix, zMsg);
19e0: 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e 70 4c  .    fflush(g.pL
19f0: 6f 67 29 3b 0a 20 20 20 20 6d 61 79 62 65 43 6c  og);.    maybeCl
1a00: 6f 73 65 28 67 2e 70 4c 6f 67 29 3b 0a 20 20 7d  ose(g.pLog);.  }
1a10: 0a 20 20 69 66 28 20 67 2e 70 45 72 72 4c 6f 67  .  if( g.pErrLog
1a20: 20 26 26 20 73 61 66 65 5f 73 74 72 63 6d 70 28   && safe_strcmp(
1a30: 67 2e 7a 45 72 72 4c 6f 67 2c 67 2e 7a 4c 6f 67  g.zErrLog,g.zLog
1a40: 29 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69  ) ){.    printWi
1a50: 74 68 50 72 65 66 69 78 28 67 2e 70 45 72 72 4c  thPrefix(g.pErrL
1a60: 6f 67 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73  og, zPrefix, zMs
1a70: 67 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 67  g);.    fflush(g
1a80: 2e 70 45 72 72 4c 6f 67 29 3b 0a 20 20 20 20 6d  .pErrLog);.    m
1a90: 61 79 62 65 43 6c 6f 73 65 28 67 2e 70 45 72 72  aybeClose(g.pErr
1aa0: 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Log);.  }.  sqli
1ab0: 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a  te3_free(zMsg);.
1ac0: 20 20 69 66 28 20 67 2e 64 62 20 29 7b 0a 20 20    if( g.db ){.  
1ad0: 20 20 69 6e 74 20 6e 54 72 79 20 3d 20 30 3b 0a    int nTry = 0;.
1ae0: 20 20 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d      g.iTimeout =
1af0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74   0;.    while( t
1b00: 72 79 53 71 6c 28 22 55 50 44 41 54 45 20 63 6c  rySql("UPDATE cl
1b10: 69 65 6e 74 20 53 45 54 20 77 61 6e 74 48 61 6c  ient SET wantHal
1b20: 74 3d 31 3b 22 29 3d 3d 53 51 4c 49 54 45 5f 42  t=1;")==SQLITE_B
1b30: 55 53 59 0a 20 20 20 20 20 20 20 20 20 20 20 26  USY.           &
1b40: 26 20 28 6e 54 72 79 2b 2b 29 3c 31 30 30 20 29  & (nTry++)<100 )
1b50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1b60: 73 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 20 7d  sleep(10);.    }
1b70: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63  .  }.  sqlite3_c
1b80: 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20 65 78  lose(g.db);.  ex
1b90: 69 74 28 31 29 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a  it(1);  .}.../*.
1ba0: 2a 2a 20 50 72 69 6e 74 20 61 20 6c 6f 67 20 6d  ** Print a log m
1bb0: 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  essage.*/.static
1bc0: 20 76 6f 69 64 20 6c 6f 67 4d 65 73 73 61 67 65   void logMessage
1bd0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
1be0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1bf0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
1c00: 20 2a 7a 4d 73 67 3b 0a 20 20 63 68 61 72 20 7a   *zMsg;.  char z
1c10: 50 72 65 66 69 78 5b 33 30 5d 3b 0a 20 20 76 61  Prefix[30];.  va
1c20: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
1c30: 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71  at);.  zMsg = sq
1c40: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
1c50: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
1c60: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c  a_end(ap);.  sql
1c70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1c80: 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a  zeof(zPrefix), z
1c90: 50 72 65 66 69 78 2c 20 22 25 73 3a 20 22 2c 20  Prefix, "%s: ", 
1ca0: 67 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  g.zName);.  if( 
1cb0: 67 2e 70 4c 6f 67 20 29 7b 0a 20 20 20 20 70 72  g.pLog ){.    pr
1cc0: 69 6e 74 57 69 74 68 50 72 65 66 69 78 28 67 2e  intWithPrefix(g.
1cd0: 70 4c 6f 67 2c 20 7a 50 72 65 66 69 78 2c 20 7a  pLog, zPrefix, z
1ce0: 4d 73 67 29 3b 0a 20 20 20 20 66 66 6c 75 73 68  Msg);.    fflush
1cf0: 28 67 2e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20  (g.pLog);.  }.  
1d00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73  sqlite3_free(zMs
1d10: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  g);.}../*.** Ret
1d20: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
1d30: 66 20 61 20 73 74 72 69 6e 67 20 6f 6d 69 74 74  f a string omitt
1d40: 69 6e 67 20 74 72 61 69 6c 69 6e 67 20 77 68 69  ing trailing whi
1d50: 74 65 73 70 61 63 65 0a 2a 2f 0a 73 74 61 74 69  tespace.*/.stati
1d60: 63 20 69 6e 74 20 63 6c 69 70 4c 65 6e 67 74 68  c int clipLength
1d70: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
1d80: 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29  .  int n = (int)
1d90: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69  strlen(z);.  whi
1da0: 6c 65 28 20 6e 3e 30 20 26 26 20 49 53 53 50 41  le( n>0 && ISSPA
1db0: 43 45 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d  CE(z[n-1]) ){ n-
1dc0: 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  -; }.  return n;
1dd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 75 78 69 6c 69  .}../*.** Auxili
1de0: 61 72 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ary SQL function
1df0: 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6e   to return the n
1e00: 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  ame of the VFS.*
1e10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 66  /.static void vf
1e20: 73 4e 61 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c  sNameFunc(.  sql
1e30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1e40: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
1e50: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
1e60: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
1e70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
1e80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
1e90: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
1ea0: 0a 20 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  .  char *zVfs = 
1eb0: 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
1ec0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55  METER(argc);.  U
1ed0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ee0: 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  argv);.  sqlite3
1ef0: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
1f00: 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
1f10: 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 20  _FCNTL_VFSNAME, 
1f20: 26 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 56  &zVfs);.  if( zV
1f30: 66 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  fs ){.    sqlite
1f40: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
1f50: 6e 74 65 78 74 2c 20 7a 56 66 73 2c 20 2d 31 2c  ntext, zVfs, -1,
1f60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
1f70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 73    }.}../*.** Bus
1f80: 79 20 68 61 6e 64 6c 65 72 20 77 69 74 68 20 61  y handler with a
1f90: 20 67 2e 69 54 69 6d 65 6f 75 74 2d 6d 69 6c 6c   g.iTimeout-mill
1fa0: 69 73 65 63 6f 6e 64 20 74 69 6d 65 6f 75 74 0a  isecond timeout.
1fb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 75  */.static int bu
1fc0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
1fd0: 70 43 44 2c 20 69 6e 74 20 63 6f 75 6e 74 29 7b  pCD, int count){
1fe0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1ff0: 54 45 52 28 70 43 44 29 3b 0a 20 20 69 66 28 20  TER(pCD);.  if( 
2000: 63 6f 75 6e 74 2a 31 30 3e 67 2e 69 54 69 6d 65  count*10>g.iTime
2010: 6f 75 74 20 29 7b 0a 20 20 20 20 69 66 28 20 67  out ){.    if( g
2020: 2e 69 54 69 6d 65 6f 75 74 3e 30 20 29 20 65 72  .iTimeout>0 ) er
2030: 72 6f 72 4d 65 73 73 61 67 65 28 22 74 69 6d 65  rorMessage("time
2040: 6f 75 74 20 61 66 74 65 72 20 25 64 6d 73 22 2c  out after %dms",
2050: 20 67 2e 69 54 69 6d 65 6f 75 74 29 3b 0a 20 20   g.iTimeout);.  
2060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2070: 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28    sqlite3_sleep(
2080: 31 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  10);.  return 1;
2090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 54 72  .}../*.** SQL Tr
20a0: 61 63 65 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a  ace callback.*/.
20b0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 54  static void sqlT
20c0: 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69  raceCallback(voi
20d0: 64 20 2a 4e 6f 74 55 73 65 64 31 2c 20 63 6f 6e  d *NotUsed1, con
20e0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
20f0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2100: 45 52 28 4e 6f 74 55 73 65 64 31 29 3b 0a 20 20  ER(NotUsed1);.  
2110: 6c 6f 67 4d 65 73 73 61 67 65 28 22 5b 25 2e 2a  logMessage("[%.*
2120: 73 5d 22 2c 20 63 6c 69 70 4c 65 6e 67 74 68 28  s]", clipLength(
2130: 7a 53 71 6c 29 2c 20 7a 53 71 6c 29 3b 0a 7d 0a  zSql), zSql);.}.
2140: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 65 72 72 6f 72  ./*.** SQL error
2150: 20 6c 6f 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f   log callback.*/
2160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2170: 45 72 72 6f 72 43 61 6c 6c 62 61 63 6b 28 76 6f  ErrorCallback(vo
2180: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45  id *pArg, int iE
2190: 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68  rrCode, const ch
21a0: 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 55 4e 55  ar *zMsg){.  UNU
21b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41  SED_PARAMETER(pA
21c0: 72 67 29 3b 0a 20 20 69 66 28 20 69 45 72 72 43  rg);.  if( iErrC
21d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f  ode==SQLITE_ERRO
21e0: 52 20 26 26 20 67 2e 62 49 67 6e 6f 72 65 53 71  R && g.bIgnoreSq
21f0: 6c 45 72 72 6f 72 73 20 29 20 72 65 74 75 72 6e  lErrors ) return
2200: 3b 0a 20 20 69 66 28 20 28 69 45 72 72 43 6f 64  ;.  if( (iErrCod
2210: 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  e&0xff)==SQLITE_
2220: 53 43 48 45 4d 41 20 26 26 20 67 2e 69 54 72 61  SCHEMA && g.iTra
2230: 63 65 3c 33 20 29 20 72 65 74 75 72 6e 3b 0a 20  ce<3 ) return;. 
2240: 20 69 66 28 20 67 2e 69 54 69 6d 65 6f 75 74 3d   if( g.iTimeout=
2250: 3d 30 20 26 26 20 28 69 45 72 72 43 6f 64 65 26  =0 && (iErrCode&
2260: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xff)==SQLITE_BU
2270: 53 59 20 26 26 20 67 2e 69 54 72 61 63 65 3c 33  SY && g.iTrace<3
2280: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2290: 20 28 69 45 72 72 43 6f 64 65 26 30 78 66 66 29   (iErrCode&0xff)
22a0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 20  ==SQLITE_NOTICE 
22b0: 29 7b 0a 20 20 20 20 6c 6f 67 4d 65 73 73 61 67  ){.    logMessag
22c0: 65 28 22 28 69 6e 66 6f 29 20 25 73 22 2c 20 7a  e("(info) %s", z
22d0: 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Msg);.  }else{. 
22e0: 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28     errorMessage(
22f0: 22 28 65 72 72 63 6f 64 65 3d 25 64 29 20 25 73  "(errcode=%d) %s
2300: 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73  ", iErrCode, zMs
2310: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
2320: 20 50 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20   Prepare an SQL 
2330: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 73 73 75  statement.  Issu
2340: 65 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20  e a fatal error 
2350: 69 66 20 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73 74  if unable..*/.st
2360: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
2370: 74 20 2a 70 72 65 70 61 72 65 53 71 6c 28 63 6f  t *prepareSql(co
2380: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
2390: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
23a0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
23b0: 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Sql;.  int rc;. 
23c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
23d0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 76 61 5f 73  Stmt = 0;.  va_s
23e0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
23f0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
2400: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
2410: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
2420: 65 6e 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20  end(ap);.  rc = 
2430: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2440: 76 32 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d  v2(g.db, zSql, -
2450: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2460: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2470: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2480: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2490: 29 3b 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f  );.    fatalErro
24a0: 72 28 22 25 73 5c 6e 25 73 5c 6e 22 2c 20 73 71  r("%s\n%s\n", sq
24b0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64  lite3_errmsg(g.d
24c0: 62 29 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  b), zSql);.  }. 
24d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
24e0: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 53  ql);.  return pS
24f0: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  tmt;.}../*.** Ru
2500: 6e 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 2e  n arbitrary SQL.
2510: 20 20 49 73 73 75 65 20 61 20 66 61 74 61 6c 20    Issue a fatal 
2520: 65 72 72 6f 72 20 6f 6e 20 66 61 69 6c 75 72 65  error on failure
2530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2540: 20 72 75 6e 53 71 6c 28 63 6f 6e 73 74 20 63 68   runSql(const ch
2550: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
2560: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
2570: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
2580: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
2590: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
25a0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
25b0: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72  e3_vmprintf(zFor
25c0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
25d0: 6e 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73  nd(ap);.  rc = s
25e0: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62  qlite3_exec(g.db
25f0: 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29  , zSql, 0, 0, 0)
2600: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2610: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 61 74  TE_OK ){.    fat
2620: 61 6c 45 72 72 6f 72 28 22 25 73 5c 6e 25 73 5c  alError("%s\n%s\
2630: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
2640: 73 67 28 67 2e 64 62 29 2c 20 7a 53 71 6c 29 3b  sg(g.db), zSql);
2650: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
2660: 72 65 65 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a  ree(zSql);.}../*
2670: 0a 2a 2a 20 54 72 79 20 74 6f 20 72 75 6e 20 61  .** Try to run a
2680: 72 62 69 74 72 61 72 79 20 53 51 4c 2e 20 20 52  rbitrary SQL.  R
2690: 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 63 6f  eturn success co
26a0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
26b0: 74 20 74 72 79 53 71 6c 28 63 6f 6e 73 74 20 63  t trySql(const c
26c0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
26d0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
26e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
26f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
2700: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2710: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
2720: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
2730: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
2740: 65 6e 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20  end(ap);.  rc = 
2750: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64  sqlite3_exec(g.d
2760: 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
2770: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2780: 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72  e(zSql);.  retur
2790: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 74 72 75  n rc;.}../* Stru
27a0: 63 74 75 72 65 20 66 6f 72 20 68 6f 6c 64 69 6e  cture for holdin
27b0: 67 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6c  g an arbitrary l
27c0: 65 6e 67 74 68 20 73 74 72 69 6e 67 0a 2a 2f 0a  ength string.*/.
27d0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
27e0: 74 72 69 6e 67 20 53 74 72 69 6e 67 3b 0a 73 74  tring String;.st
27f0: 72 75 63 74 20 53 74 72 69 6e 67 20 7b 0a 20 20  ruct String {.  
2800: 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
2810: 20 2f 2a 20 74 68 65 20 73 74 72 69 6e 67 20 2a   /* the string *
2820: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
2830: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 6f 66       /* Slots of
2840: 20 7a 5b 5d 20 75 73 65 64 20 2a 2f 0a 20 20 69   z[] used */.  i
2850: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  nt nAlloc;      
2860: 2f 2a 20 53 6c 6f 74 73 20 6f 66 20 7a 5b 5d 20  /* Slots of z[] 
2870: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a  allocated */.};.
2880: 0a 2f 2a 20 46 72 65 65 20 61 20 73 74 72 69 6e  ./* Free a strin
2890: 67 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  g */.static void
28a0: 20 73 74 72 69 6e 67 46 72 65 65 28 53 74 72 69   stringFree(Stri
28b0: 6e 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ng *p){.  if( p-
28c0: 3e 7a 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  >z ) sqlite3_fre
28d0: 65 28 70 2d 3e 7a 29 3b 0a 20 20 6d 65 6d 73 65  e(p->z);.  memse
28e0: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
28f0: 70 29 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e  p));.}../* Appen
2900: 64 20 6e 20 62 79 74 65 73 20 6f 66 20 74 65 78  d n bytes of tex
2910: 74 20 74 6f 20 61 20 73 74 72 69 6e 67 2e 20 20  t to a string.  
2920: 49 66 20 6e 3c 30 20 61 70 70 65 6e 64 20 74 68  If n<0 append th
2930: 65 20 65 6e 74 69 72 65 20 73 74 72 69 6e 67 2e  e entire string.
2940: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
2950: 73 74 72 69 6e 67 41 70 70 65 6e 64 28 53 74 72  stringAppend(Str
2960: 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ing *p, const ch
2970: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
2980: 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 28   if( n<0 ) n = (
2990: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  int)strlen(z);. 
29a0: 20 69 66 28 20 70 2d 3e 6e 2b 6e 3e 3d 70 2d 3e   if( p->n+n>=p->
29b0: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  nAlloc ){.    in
29c0: 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  t nAlloc = p->nA
29d0: 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 31 30 30  lloc*2 + n + 100
29e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77  ;.    char *zNew
29f0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
2a00: 6f 63 28 70 2d 3e 7a 2c 20 6e 41 6c 6c 6f 63 29  oc(p->z, nAlloc)
2a10: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d  ;.    if( zNew==
2a20: 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  0 ) fatalError("
2a30: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
2a40: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77  .    p->z = zNew
2a50: 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20  ;.    p->nAlloc 
2a60: 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 20 20  = nAlloc;.  }.  
2a70: 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e  memcpy(p->z+p->n
2a80: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 2d 3e 6e 20  , z, n);.  p->n 
2a90: 2b 3d 20 6e 3b 0a 20 20 70 2d 3e 7a 5b 70 2d 3e  += n;.  p->z[p->
2aa0: 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  n] = 0;.}../* Re
2ab0: 73 65 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20  set a string to 
2ac0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
2ad0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2ae0: 74 72 69 6e 67 52 65 73 65 74 28 53 74 72 69 6e  tringReset(Strin
2af0: 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  g *p){.  if( p->
2b00: 7a 3d 3d 30 20 29 20 73 74 72 69 6e 67 41 70 70  z==0 ) stringApp
2b10: 65 6e 64 28 70 2c 20 22 20 22 2c 20 31 29 3b 0a  end(p, " ", 1);.
2b20: 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 70 2d    p->n = 0;.  p-
2b30: 3e 7a 5b 30 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >z[0] = 0;.}../*
2b40: 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 6f   Append a new to
2b50: 6b 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ken onto the end
2b60: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 2a   of the string *
2b70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
2b80: 72 69 6e 67 41 70 70 65 6e 64 54 65 72 6d 28 53  ringAppendTerm(S
2b90: 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20  tring *p, const 
2ba0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
2bb0: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20  i;.  if( p->n ) 
2bc0: 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70 2c 20  stringAppend(p, 
2bd0: 22 20 22 2c 20 31 29 3b 0a 20 20 69 66 28 20 7a  " ", 1);.  if( z
2be0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 69 6e  ==0 ){.    strin
2bf0: 67 41 70 70 65 6e 64 28 70 2c 20 22 6e 69 6c 22  gAppend(p, "nil"
2c00: 2c 20 33 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 3);.    return
2c10: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
2c20: 20 7a 5b 69 5d 20 26 26 20 21 49 53 53 50 41 43   z[i] && !ISSPAC
2c30: 45 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  E(z[i]); i++){}.
2c40: 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 5b 69    if( i>0 && z[i
2c50: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 69  ]==0 ){.    stri
2c60: 6e 67 41 70 70 65 6e 64 28 70 2c 20 7a 2c 20 69  ngAppend(p, z, i
2c70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2c80: 20 7d 0a 20 20 73 74 72 69 6e 67 41 70 70 65 6e   }.  stringAppen
2c90: 64 28 70 2c 20 22 27 22 2c 20 31 29 3b 0a 20 20  d(p, "'", 1);.  
2ca0: 77 68 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20  while( z[0] ){. 
2cb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d     for(i=0; z[i]
2cc0: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 20   && z[i]!='\''; 
2cd0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a  i++){}.    if( z
2ce0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 74 72  [i] ){.      str
2cf0: 69 6e 67 41 70 70 65 6e 64 28 70 2c 20 7a 2c 20  ingAppend(p, z, 
2d00: 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 74 72 69  i+1);.      stri
2d10: 6e 67 41 70 70 65 6e 64 28 70 2c 20 22 27 22 2c  ngAppend(p, "'",
2d20: 20 31 29 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20   1);.      z += 
2d30: 69 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  i+1;.    }else{.
2d40: 20 20 20 20 20 20 73 74 72 69 6e 67 41 70 70 65        stringAppe
2d50: 6e 64 28 70 2c 20 7a 2c 20 69 29 3b 0a 20 20 20  nd(p, z, i);.   
2d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2d70: 20 20 7d 0a 20 20 73 74 72 69 6e 67 41 70 70 65    }.  stringAppe
2d80: 6e 64 28 70 2c 20 22 27 22 2c 20 31 29 3b 0a 7d  nd(p, "'", 1);.}
2d90: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b  ../*.** Callback
2da0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 76   function for ev
2db0: 61 6c 53 71 6c 28 29 0a 2a 2f 0a 73 74 61 74 69  alSql().*/.stati
2dc0: 63 20 69 6e 74 20 65 76 61 6c 43 61 6c 6c 62 61  c int evalCallba
2dd0: 63 6b 28 76 6f 69 64 20 2a 70 43 44 61 74 61 2c  ck(void *pCData,
2de0: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
2df0: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 61  **argv, char **a
2e00: 7a 43 6f 6c 29 7b 0a 20 20 53 74 72 69 6e 67 20  zCol){.  String 
2e10: 2a 70 20 3d 20 28 53 74 72 69 6e 67 2a 29 70 43  *p = (String*)pC
2e20: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Data;.  int i;. 
2e30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2e40: 52 28 61 7a 43 6f 6c 29 3b 0a 20 20 66 6f 72 28  R(azCol);.  for(
2e50: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
2e60: 29 20 73 74 72 69 6e 67 41 70 70 65 6e 64 54 65  ) stringAppendTe
2e70: 72 6d 28 70 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  rm(p, argv[i]);.
2e80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2e90: 2a 0a 2a 2a 20 52 75 6e 20 61 72 62 69 74 72 61  *.** Run arbitra
2ea0: 72 79 20 53 51 4c 20 61 6e 64 20 72 65 63 6f 72  ry SQL and recor
2eb0: 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  d the results in
2ec0: 20 61 6e 20 6f 75 74 70 75 74 20 73 74 72 69 6e   an output strin
2ed0: 67 0a 2a 2a 20 67 69 76 65 6e 20 62 79 20 74 68  g.** given by th
2ee0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
2ef0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2f00: 20 65 76 61 6c 53 71 6c 28 53 74 72 69 6e 67 20   evalSql(String 
2f10: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
2f20: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
2f30: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2f40: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
2f50: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2f60: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 76 61 5f 73  rMsg = 0;.  va_s
2f70: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2f80: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
2f90: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
2fa0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
2fb0: 65 6e 64 28 61 70 29 3b 0a 20 20 61 73 73 65 72  end(ap);.  asser
2fc0: 74 28 20 67 2e 69 54 69 6d 65 6f 75 74 3e 30 20  t( g.iTimeout>0 
2fd0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2fe0: 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a 53 71  3_exec(g.db, zSq
2ff0: 6c 2c 20 65 76 61 6c 43 61 6c 6c 62 61 63 6b 2c  l, evalCallback,
3000: 20 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   p, &zErrMsg);. 
3010: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
3020: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ql);.  if( rc ){
3030: 0a 20 20 20 20 63 68 61 72 20 7a 45 72 72 5b 33  .    char zErr[3
3040: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
3050: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3060: 7a 45 72 72 29 2c 20 7a 45 72 72 2c 20 22 65 72  zErr), zErr, "er
3070: 72 6f 72 28 25 64 29 22 2c 20 72 63 29 3b 0a 20  ror(%d)", rc);. 
3080: 20 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 54     stringAppendT
3090: 65 72 6d 28 70 2c 20 7a 45 72 72 29 3b 0a 20 20  erm(p, zErr);.  
30a0: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
30b0: 0a 20 20 20 20 20 20 73 74 72 69 6e 67 41 70 70  .      stringApp
30c0: 65 6e 64 54 65 72 6d 28 70 2c 20 7a 45 72 72 4d  endTerm(p, zErrM
30d0: 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
30e0: 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
30f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3100: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3110: 2a 20 41 75 78 69 6c 69 61 72 79 20 53 51 4c 20  * Auxiliary SQL 
3120: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 63 75  function to recu
3130: 72 73 69 76 65 6c 79 20 65 76 61 6c 75 61 74 65  rsively evaluate
3140: 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   SQL..*/.static 
3150: 76 6f 69 64 20 65 76 61 6c 46 75 6e 63 28 0a 20  void evalFunc(. 
3160: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3170: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
3180: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
3190: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
31a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
31b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
31c0: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
31d0: 78 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  xt);.  const cha
31e0: 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74  r *zSql = (const
31f0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
3200: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
3210: 5d 29 3b 0a 20 20 53 74 72 69 6e 67 20 72 65 73  ]);.  String res
3220: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
3230: 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  g = 0;.  int rc;
3240: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
3250: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6d 65 6d  TER(argc);.  mem
3260: 73 65 74 28 26 72 65 73 2c 20 30 2c 20 73 69 7a  set(&res, 0, siz
3270: 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 72 63 20  eof(res));.  rc 
3280: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
3290: 62 2c 20 7a 53 71 6c 2c 20 65 76 61 6c 43 61 6c  b, zSql, evalCal
32a0: 6c 62 61 63 6b 2c 20 26 72 65 73 2c 20 26 7a 45  lback, &res, &zE
32b0: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45  rrMsg);.  if( zE
32c0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c  rrMsg ){.    sql
32d0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
32e0: 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 4d  r(context, zErrM
32f0: 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c  sg, -1);.    sql
3300: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
3310: 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  g);.  }else if( 
3320: 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
3330: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
3340: 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29  ode(context, rc)
3350: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
3360: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
3370: 78 74 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 2e  xt(context, res.
3380: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  z, -1, SQLITE_TR
3390: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20  ANSIENT);.  }.  
33a0: 73 74 72 69 6e 67 46 72 65 65 28 26 72 65 73 29  stringFree(&res)
33b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  ;.}../*.** Look 
33c0: 75 70 20 74 68 65 20 6e 65 78 74 20 74 61 73 6b  up the next task
33d0: 20 66 6f 72 20 63 6c 69 65 6e 74 20 69 43 6c 69   for client iCli
33e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
33f0: 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ase..** Return t
3400: 68 65 20 74 61 73 6b 20 73 63 72 69 70 74 20 61  he task script a
3410: 6e 64 20 74 68 65 20 74 61 73 6b 20 6e 75 6d 62  nd the task numb
3420: 65 72 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74  er and mark that
3430: 0a 2a 2a 20 74 61 73 6b 20 61 73 20 62 65 69 6e  .** task as bein
3440: 67 20 75 6e 64 65 72 20 77 61 79 2e 0a 2a 2f 0a  g under way..*/.
3450: 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 72 74  static int start
3460: 53 63 72 69 70 74 28 0a 20 20 69 6e 74 20 69 43  Script(.  int iC
3470: 6c 69 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  lient,          
3480: 20 20 20 20 2f 2a 20 54 68 65 20 63 6c 69 65 6e      /* The clien
3490: 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  t number */.  ch
34a0: 61 72 20 2a 2a 70 7a 53 63 72 69 70 74 2c 20 20  ar **pzScript,  
34b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
34c0: 20 74 61 73 6b 20 73 63 72 69 70 74 20 68 65 72   task script her
34d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 54 61 73  e */.  int *pTas
34e0: 6b 49 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  kId,            
34f0: 20 2f 2a 20 57 72 69 74 65 20 74 61 73 6b 20 6e   /* Write task n
3500: 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
3510: 63 68 61 72 20 2a 2a 70 7a 54 61 73 6b 4e 61 6d  char **pzTaskNam
3520: 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e         /* Nam
3530: 65 20 6f 66 20 74 68 65 20 74 61 73 6b 20 2a 2f  e of the task */
3540: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
3550: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
3560: 20 69 6e 74 20 74 61 73 6b 49 64 3b 0a 20 20 69   int taskId;.  i
3570: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 74 6f 74  nt rc;.  int tot
3580: 61 6c 54 69 6d 65 20 3d 20 30 3b 0a 0a 20 20 2a  alTime = 0;..  *
3590: 70 7a 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20  pzScript = 0;.  
35a0: 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  g.iTimeout = 0;.
35b0: 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20    while(1){.    
35c0: 72 63 20 3d 20 74 72 79 53 71 6c 28 22 42 45 47  rc = trySql("BEG
35d0: 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 29 3b 0a  IN IMMEDIATE");.
35e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35f0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
3600: 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31   sqlite3_sleep(1
3610: 30 29 3b 0a 20 20 20 20 20 20 74 6f 74 61 6c 54  0);.      totalT
3620: 69 6d 65 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20  ime += 10;.     
3630: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
3640: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
3650: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
3660: 66 61 74 61 6c 45 72 72 6f 72 28 22 69 6e 20 73  fatalError("in s
3670: 74 61 72 74 53 63 72 69 70 74 3a 20 25 73 22 2c  tartScript: %s",
3680: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
3690: 67 2e 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20  g.db));.    }.  
36a0: 20 20 69 66 28 20 67 2e 6e 45 72 72 6f 72 20 7c    if( g.nError |
36b0: 7c 20 67 2e 6e 54 65 73 74 20 29 7b 0a 20 20 20  | g.nTest ){.   
36c0: 20 20 20 72 75 6e 53 71 6c 28 22 55 50 44 41 54     runSql("UPDAT
36d0: 45 20 63 6f 75 6e 74 65 72 73 20 53 45 54 20 6e  E counters SET n
36e0: 45 72 72 6f 72 3d 6e 45 72 72 6f 72 2b 25 64 2c  Error=nError+%d,
36f0: 20 6e 54 65 73 74 3d 6e 54 65 73 74 2b 25 64 22   nTest=nTest+%d"
3700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 67  ,.             g
3710: 2e 6e 45 72 72 6f 72 2c 20 67 2e 6e 54 65 73 74  .nError, g.nTest
3720: 29 3b 0a 20 20 20 20 20 20 67 2e 6e 45 72 72 6f  );.      g.nErro
3730: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 2e 6e  r = 0;.      g.n
3740: 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Test = 0;.    }.
3750: 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70      pStmt = prep
3760: 61 72 65 53 71 6c 28 22 53 45 4c 45 43 54 20 31  areSql("SELECT 1
3770: 20 46 52 4f 4d 20 63 6c 69 65 6e 74 20 57 48 45   FROM client WHE
3780: 52 45 20 69 64 3d 25 64 20 41 4e 44 20 77 61 6e  RE id=%d AND wan
3790: 74 48 61 6c 74 22 2c 69 43 6c 69 65 6e 74 29 3b  tHalt",iClient);
37a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
37b0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
37c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
37d0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
37e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
37f0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 72 75 6e 53  OW ){.      runS
3800: 71 6c 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ql("DELETE FROM 
3810: 63 6c 69 65 6e 74 20 57 48 45 52 45 20 69 64 3d  client WHERE id=
3820: 25 64 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20  %d", iClient);. 
3830: 20 20 20 20 20 67 2e 69 54 69 6d 65 6f 75 74 20       g.iTimeout 
3840: 3d 20 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55  = DEFAULT_TIMEOU
3850: 54 3b 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28  T;.      runSql(
3860: 22 43 4f 4d 4d 49 54 20 54 52 41 4e 53 41 43 54  "COMMIT TRANSACT
3870: 49 4f 4e 3b 22 29 3b 0a 20 20 20 20 20 20 72 65  ION;");.      re
3880: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
3890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 6d  ;.    }.    pStm
38a0: 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28 0a  t = prepareSql(.
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
38c0: 45 4c 45 43 54 20 73 63 72 69 70 74 2c 20 69 64  ELECT script, id
38d0: 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 74 61 73 6b  , name FROM task
38e0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
38f0: 22 20 57 48 45 52 45 20 63 6c 69 65 6e 74 3d 25  " WHERE client=%
3900: 64 20 41 4e 44 20 73 74 61 72 74 74 69 6d 65 20  d AND starttime 
3910: 49 53 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20  IS NULL".       
3920: 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
3930: 59 20 69 64 20 4c 49 4d 49 54 20 31 22 2c 20 69  Y id LIMIT 1", i
3940: 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 72 63 20  Client);.    rc 
3950: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
3960: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
3970: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
3980: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
3990: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
39a0: 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  tes(pStmt, 0);. 
39b0: 20 20 20 20 20 2a 70 7a 53 63 72 69 70 74 20 3d       *pzScript =
39c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
39d0: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 73 74 72 63  n+1);.      strc
39e0: 70 79 28 2a 70 7a 53 63 72 69 70 74 2c 20 28 63  py(*pzScript, (c
39f0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
3a00: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
3a10: 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20  Stmt, 0));.     
3a20: 20 2a 70 54 61 73 6b 49 64 20 3d 20 74 61 73 6b   *pTaskId = task
3a30: 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Id = sqlite3_col
3a40: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
3a50: 29 3b 0a 20 20 20 20 20 20 2a 70 7a 54 61 73 6b  );.      *pzTask
3a60: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Name = sqlite3_m
3a70: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
3a80: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
3a90: 28 70 53 74 6d 74 2c 20 32 29 29 3b 0a 20 20 20  (pStmt, 2));.   
3aa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
3ab0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
3ac0: 20 20 72 75 6e 53 71 6c 28 22 55 50 44 41 54 45    runSql("UPDATE
3ad0: 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20   task".         
3ae0: 20 20 20 20 22 20 20 20 53 45 54 20 73 74 61 72      "   SET star
3af0: 74 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28 27  ttime=strftime('
3b00: 25 25 59 2d 25 25 6d 2d 25 25 64 20 25 25 48 3a  %%Y-%%m-%%d %%H:
3b10: 25 25 4d 3a 25 25 66 27 2c 27 6e 6f 77 27 29 22  %%M:%%f','now')"
3b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
3b30: 57 48 45 52 45 20 69 64 3d 25 64 3b 22 2c 20 74  WHERE id=%d;", t
3b40: 61 73 6b 49 64 29 3b 0a 20 20 20 20 20 20 67 2e  askId);.      g.
3b50: 69 54 69 6d 65 6f 75 74 20 3d 20 44 45 46 41 55  iTimeout = DEFAU
3b60: 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a 20 20 20 20  LT_TIMEOUT;.    
3b70: 20 20 72 75 6e 53 71 6c 28 22 43 4f 4d 4d 49 54    runSql("COMMIT
3b80: 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 22 29 3b   TRANSACTION;");
3b90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3ba0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
3bb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
3bc0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
3bd0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
3be0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ONE ){.      if(
3bf0: 20 74 6f 74 61 6c 54 69 6d 65 3e 33 30 30 30 30   totalTime>30000
3c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f   ){.        erro
3c10: 72 4d 65 73 73 61 67 65 28 22 57 61 69 74 65 64  rMessage("Waited
3c20: 20 6f 76 65 72 20 33 30 20 73 65 63 6f 6e 64 73   over 30 seconds
3c30: 20 77 69 74 68 20 6e 6f 20 77 6f 72 6b 2e 20 20   with no work.  
3c40: 47 69 76 69 6e 67 20 75 70 2e 22 29 3b 0a 20 20  Giving up.");.  
3c50: 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22 44 45        runSql("DE
3c60: 4c 45 54 45 20 46 52 4f 4d 20 63 6c 69 65 6e 74  LETE FROM client
3c70: 20 57 48 45 52 45 20 69 64 3d 25 64 3b 20 43 4f   WHERE id=%d; CO
3c80: 4d 4d 49 54 3b 22 2c 20 69 43 6c 69 65 6e 74 29  MMIT;", iClient)
3c90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3ca0: 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20  3_close(g.db);. 
3cb0: 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a         exit(1);.
3cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
3cd0: 69 6c 65 28 20 74 72 79 53 71 6c 28 22 43 4f 4d  ile( trySql("COM
3ce0: 4d 49 54 22 29 3d 3d 53 51 4c 49 54 45 5f 42 55  MIT")==SQLITE_BU
3cf0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  SY ){.        sq
3d00: 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b  lite3_sleep(10);
3d10: 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c 54 69  .        totalTi
3d20: 6d 65 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20  me += 10;.      
3d30: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
3d40: 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20  sleep(100);.    
3d50: 20 20 74 6f 74 61 6c 54 69 6d 65 20 2b 3d 20 31    totalTime += 1
3d60: 30 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  00;.      contin
3d70: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 61  ue;.    }.    fa
3d80: 74 61 6c 45 72 72 6f 72 28 22 25 73 22 2c 20 73  talError("%s", s
3d90: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e  qlite3_errmsg(g.
3da0: 64 62 29 29 3b 0a 20 20 7d 0a 20 20 67 2e 69 54  db));.  }.  g.iT
3db0: 69 6d 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54  imeout = DEFAULT
3dc0: 5f 54 49 4d 45 4f 55 54 3b 0a 7d 0a 0a 2f 2a 0a  _TIMEOUT;.}../*.
3dd0: 2a 2a 20 4d 61 72 6b 20 61 20 73 63 72 69 70 74  ** Mark a script
3de0: 20 61 73 20 68 61 76 69 6e 67 20 66 69 6e 69 73   as having finis
3df0: 68 65 64 2e 20 20 20 52 65 6d 6f 76 65 20 74 68  hed.   Remove th
3e00: 65 20 43 4c 49 45 4e 54 20 74 61 62 6c 65 20 65  e CLIENT table e
3e10: 6e 74 72 79 0a 2a 2a 20 69 66 20 62 53 68 75 74  ntry.** if bShut
3e20: 64 6f 77 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2f  down is true..*/
3e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 69  .static int fini
3e40: 73 68 53 63 72 69 70 74 28 69 6e 74 20 69 43 6c  shScript(int iCl
3e50: 69 65 6e 74 2c 20 69 6e 74 20 74 61 73 6b 49 64  ient, int taskId
3e60: 2c 20 69 6e 74 20 62 53 68 75 74 64 6f 77 6e 29  , int bShutdown)
3e70: 7b 0a 20 20 72 75 6e 53 71 6c 28 22 55 50 44 41  {.  runSql("UPDA
3e80: 54 45 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20  TE task".       
3e90: 20 20 22 20 20 20 53 45 54 20 65 6e 64 74 69 6d    "   SET endtim
3ea0: 65 3d 73 74 72 66 74 69 6d 65 28 27 25 25 59 2d  e=strftime('%%Y-
3eb0: 25 25 6d 2d 25 25 64 20 25 25 48 3a 25 25 4d 3a  %%m-%%d %%H:%%M:
3ec0: 25 25 66 27 2c 27 6e 6f 77 27 29 22 0a 20 20 20  %%f','now')".   
3ed0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 69 64        " WHERE id
3ee0: 3d 25 64 3b 22 2c 20 74 61 73 6b 49 64 29 3b 0a  =%d;", taskId);.
3ef0: 20 20 69 66 28 20 62 53 68 75 74 64 6f 77 6e 20    if( bShutdown 
3f00: 29 7b 0a 20 20 20 20 72 75 6e 53 71 6c 28 22 44  ){.    runSql("D
3f10: 45 4c 45 54 45 20 46 52 4f 4d 20 63 6c 69 65 6e  ELETE FROM clien
3f20: 74 20 57 48 45 52 45 20 69 64 3d 25 64 22 2c 20  t WHERE id=%d", 
3f30: 69 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  iClient);.  }.  
3f40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
3f60: 20 75 70 20 61 20 63 6c 69 65 6e 74 20 70 72 6f   up a client pro
3f70: 63 65 73 73 20 66 6f 72 20 69 43 6c 69 65 6e 74  cess for iClient
3f80: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
3f90: 6c 72 65 61 64 79 0a 2a 2a 20 72 75 6e 6e 69 6e  lready.** runnin
3fa0: 67 2e 20 20 49 66 20 74 68 65 20 63 6c 69 65 6e  g.  If the clien
3fb0: 74 20 69 73 20 61 6c 72 65 61 64 79 20 72 75 6e  t is already run
3fc0: 6e 69 6e 67 2c 20 74 68 65 6e 20 74 68 69 73 20  ning, then this 
3fd0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20  routine.** is a 
3fe0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
3ff0: 20 76 6f 69 64 20 73 74 61 72 74 43 6c 69 65 6e   void startClien
4000: 74 28 69 6e 74 20 69 43 6c 69 65 6e 74 29 7b 0a  t(int iClient){.
4010: 20 20 72 75 6e 53 71 6c 28 22 49 4e 53 45 52 54    runSql("INSERT
4020: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
4030: 63 6c 69 65 6e 74 20 56 41 4c 55 45 53 28 25 64  client VALUES(%d
4040: 2c 30 29 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a  ,0)", iClient);.
4050: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 68    if( sqlite3_ch
4060: 61 6e 67 65 73 28 67 2e 64 62 29 20 29 7b 0a 20  anges(g.db) ){. 
4070: 20 20 20 63 68 61 72 20 2a 7a 53 79 73 3b 0a 20     char *zSys;. 
4080: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 7a     int rc;.    z
4090: 53 79 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sys = sqlite3_mp
40a0: 72 69 6e 74 66 28 22 25 73 20 5c 22 25 73 5c 22  rintf("%s \"%s\"
40b0: 20 2d 2d 63 6c 69 65 6e 74 20 25 64 20 2d 2d 74   --client %d --t
40c0: 72 61 63 65 20 25 64 22 2c 0a 20 20 20 20 20 20  race %d",.      
40d0: 20 20 20 20 20 20 20 20 20 20 20 67 2e 61 72 67             g.arg
40e0: 76 30 2c 20 67 2e 7a 44 62 46 69 6c 65 2c 20 69  v0, g.zDbFile, i
40f0: 43 6c 69 65 6e 74 2c 20 67 2e 69 54 72 61 63 65  Client, g.iTrace
4100: 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 62 53 71  );.    if( g.bSq
4110: 6c 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  lTrace ){.      
4120: 7a 53 79 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSys = sqlite3_m
4130: 70 72 69 6e 74 66 28 22 25 7a 20 2d 2d 73 71 6c  printf("%z --sql
4140: 74 72 61 63 65 22 2c 20 7a 53 79 73 29 3b 0a 20  trace", zSys);. 
4150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 62     }.    if( g.b
4160: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 7a 53  Sync ){.      zS
4170: 79 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ys = sqlite3_mpr
4180: 69 6e 74 66 28 22 25 7a 20 2d 2d 73 79 6e 63 22  intf("%z --sync"
4190: 2c 20 7a 53 79 73 29 3b 0a 20 20 20 20 7d 0a 20  , zSys);.    }. 
41a0: 20 20 20 69 66 28 20 67 2e 7a 56 66 73 20 29 7b     if( g.zVfs ){
41b0: 0a 20 20 20 20 20 20 7a 53 79 73 20 3d 20 73 71  .      zSys = sq
41c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
41d0: 7a 20 2d 2d 76 66 73 20 5c 22 25 73 5c 22 22 2c  z --vfs \"%s\"",
41e0: 20 7a 53 79 73 2c 20 67 2e 7a 56 66 73 29 3b 0a   zSys, g.zVfs);.
41f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e      }.    if( g.
4200: 69 54 72 61 63 65 3e 3d 32 20 29 20 6c 6f 67 4d  iTrace>=2 ) logM
4210: 65 73 73 61 67 65 28 22 73 79 73 74 65 6d 28 27  essage("system('
4220: 25 71 27 29 22 2c 20 7a 53 79 73 29 3b 0a 23 69  %q')", zSys);.#i
4230: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
4240: 32 29 0a 20 20 20 20 7a 53 79 73 20 3d 20 73 71  2).    zSys = sq
4250: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
4260: 7a 20 26 22 2c 20 7a 53 79 73 29 3b 0a 20 20 20  z &", zSys);.   
4270: 20 72 63 20 3d 20 73 79 73 74 65 6d 28 7a 53 79   rc = system(zSy
4280: 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
4290: 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 73   errorMessage("s
42a0: 79 73 74 65 6d 28 29 20 66 61 69 6c 73 20 77 69  ystem() fails wi
42b0: 74 68 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64  th error code %d
42c0: 22 2c 20 72 63 29 3b 0a 23 65 6c 73 65 0a 20 20  ", rc);.#else.  
42d0: 20 20 7b 0a 20 20 20 20 20 20 53 54 41 52 54 55    {.      STARTU
42e0: 50 49 4e 46 4f 41 20 73 74 61 72 74 75 70 49 6e  PINFOA startupIn
42f0: 66 6f 3b 0a 20 20 20 20 20 20 50 52 4f 43 45 53  fo;.      PROCES
4300: 53 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 70 72  S_INFORMATION pr
4310: 6f 63 65 73 73 49 6e 66 6f 3b 0a 20 20 20 20 20  ocessInfo;.     
4320: 20 6d 65 6d 73 65 74 28 26 73 74 61 72 74 75 70   memset(&startup
4330: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
4340: 73 74 61 72 74 75 70 49 6e 66 6f 29 29 3b 0a 20  startupInfo));. 
4350: 20 20 20 20 20 73 74 61 72 74 75 70 49 6e 66 6f       startupInfo
4360: 2e 63 62 20 3d 20 73 69 7a 65 6f 66 28 73 74 61  .cb = sizeof(sta
4370: 72 74 75 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20  rtupInfo);.     
4380: 20 6d 65 6d 73 65 74 28 26 70 72 6f 63 65 73 73   memset(&process
4390: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
43a0: 70 72 6f 63 65 73 73 49 6e 66 6f 29 29 3b 0a 20  processInfo));. 
43b0: 20 20 20 20 20 72 63 20 3d 20 43 72 65 61 74 65       rc = Create
43c0: 50 72 6f 63 65 73 73 41 28 4e 55 4c 4c 2c 20 7a  ProcessA(NULL, z
43d0: 53 79 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  Sys, NULL, NULL,
43e0: 20 46 41 4c 53 45 2c 20 30 2c 20 4e 55 4c 4c 2c   FALSE, 0, NULL,
43f0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
4410: 73 74 61 72 74 75 70 49 6e 66 6f 2c 20 26 70 72  startupInfo, &pr
4420: 6f 63 65 73 73 49 6e 66 6f 29 3b 0a 20 20 20 20  ocessInfo);.    
4430: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
4440: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
4450: 70 72 6f 63 65 73 73 49 6e 66 6f 2e 68 54 68 72  processInfo.hThr
4460: 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20 43 6c  ead);.        Cl
4470: 6f 73 65 48 61 6e 64 6c 65 28 70 72 6f 63 65 73  oseHandle(proces
4480: 73 49 6e 66 6f 2e 68 50 72 6f 63 65 73 73 29 3b  sInfo.hProcess);
4490: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
44a0: 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61        errorMessa
44b0: 67 65 28 22 43 72 65 61 74 65 50 72 6f 63 65 73  ge("CreateProces
44c0: 73 41 28 29 20 66 61 69 6c 73 20 77 69 74 68 20  sA() fails with 
44d0: 65 72 72 6f 72 20 63 6f 64 65 20 25 6c 75 22 2c  error code %lu",
44e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44f0: 20 20 20 20 20 20 47 65 74 4c 61 73 74 45 72 72        GetLastErr
4500: 6f 72 28 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  or());.      }. 
4510: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 79  sqlite3_free(zSy
4530: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  s);.  }.}../*.**
4540: 20 52 65 61 64 20 74 68 65 20 65 6e 74 69 72 65   Read the entire
4550: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69   content of a fi
4560: 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
4570: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
4580: 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68  eadFile(const ch
4590: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
45a0: 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70    FILE *in = fop
45b0: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 72  en(zFilename, "r
45c0: 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 73 7a 3b 0a  b");.  long sz;.
45d0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
45e0: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 61   in==0 ){.    fa
45f0: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74  talError("cannot
4600: 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
4610: 20 72 65 61 64 69 6e 67 22 2c 20 7a 46 69 6c 65   reading", zFile
4620: 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 66 73 65  name);.  }.  fse
4630: 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45  ek(in, 0, SEEK_E
4640: 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c  ND);.  sz = ftel
4650: 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(in);.  rewind(
4660: 69 6e 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  in);.  z = sqlit
4670: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 7a 2b 31 20  e3_malloc( sz+1 
4680: 29 3b 0a 20 20 73 7a 20 3d 20 28 6c 6f 6e 67 29  );.  sz = (long)
4690: 66 72 65 61 64 28 7a 2c 20 31 2c 20 73 7a 2c 20  fread(z, 1, sz, 
46a0: 69 6e 29 3b 0a 20 20 7a 5b 73 7a 5d 20 3d 20 30  in);.  z[sz] = 0
46b0: 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  ;.  fclose(in);.
46c0: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
46d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
46e0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6e 65  length of the ne
46f0: 78 74 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  xt token..*/.sta
4700: 74 69 63 20 69 6e 74 20 74 6f 6b 65 6e 4c 65 6e  tic int tokenLen
4710: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
4720: 7a 2c 20 69 6e 74 20 2a 70 6e 4c 69 6e 65 29 7b  z, int *pnLine){
4730: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
4740: 69 66 28 20 49 53 53 50 41 43 45 28 7a 5b 30 5d  if( ISSPACE(z[0]
4750: 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2f 27 20  ) || (z[0]=='/' 
4760: 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 29 20 29 7b  && z[1]=='*') ){
4770: 0a 20 20 20 20 69 6e 74 20 69 6e 43 20 3d 20 30  .    int inC = 0
4780: 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  ;.    int c;.   
4790: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 29   if( z[0]=='/' )
47a0: 7b 0a 20 20 20 20 20 20 69 6e 43 20 3d 20 31 3b  {.      inC = 1;
47b0: 0a 20 20 20 20 20 20 6e 20 3d 20 32 3b 0a 20 20  .      n = 2;.  
47c0: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28    }.    while( (
47d0: 63 20 3d 20 7a 5b 6e 2b 2b 5d 29 21 3d 30 20 29  c = z[n++])!=0 )
47e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  {.      if( c=='
47f0: 5c 6e 27 20 29 20 28 2a 70 6e 4c 69 6e 65 29 2b  \n' ) (*pnLine)+
4800: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 53  +;.      if( ISS
4810: 50 41 43 45 28 63 29 20 29 20 63 6f 6e 74 69 6e  PACE(c) ) contin
4820: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  ue;.      if( in
4830: 43 20 26 26 20 63 3d 3d 27 2a 27 20 26 26 20 7a  C && c=='*' && z
4840: 5b 6e 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [n]=='/' ){.    
4850: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20      n++;.       
4860: 20 69 6e 43 20 3d 20 30 3b 0a 20 20 20 20 20 20   inC = 0;.      
4870: 7d 65 6c 73 65 20 69 66 28 20 21 69 6e 43 20 26  }else if( !inC &
4880: 26 20 63 3d 3d 27 2f 27 20 26 26 20 7a 5b 6e 5d  & c=='/' && z[n]
4890: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20  =='*' ){.       
48a0: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 6e   n++;.        in
48b0: 43 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  C = 1;.      }el
48c0: 73 65 20 69 66 28 20 21 69 6e 43 20 29 7b 0a 20  se if( !inC ){. 
48d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
48e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
48f0: 6e 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n--;.  }else if(
4900: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[0]=='-' && z[
4910: 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 66  1]=='-' ){.    f
4920: 6f 72 28 6e 3d 32 3b 20 7a 5b 6e 5d 20 26 26 20  or(n=2; z[n] && 
4930: 7a 5b 6e 5d 21 3d 27 5c 6e 27 3b 20 6e 2b 2b 29  z[n]!='\n'; n++)
4940: 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b 6e 5d 20  {}.    if( z[n] 
4950: 29 7b 20 28 2a 70 6e 4c 69 6e 65 29 2b 2b 3b 20  ){ (*pnLine)++; 
4960: 6e 2b 2b 3b 20 7d 0a 20 20 7d 65 6c 73 65 20 69  n++; }.  }else i
4970: 66 28 20 7a 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20  f( z[0]=='"' || 
4980: 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  z[0]=='\'' ){.  
4990: 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 5b    int delim = z[
49a0: 30 5d 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b  0];.    for(n=1;
49b0: 20 7a 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20 20 20   z[n]; n++){.   
49c0: 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c 6e     if( z[n]=='\n
49d0: 27 20 29 20 28 2a 70 6e 4c 69 6e 65 29 2b 2b 3b  ' ) (*pnLine)++;
49e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d  .      if( z[n]=
49f0: 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
4a00: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69    n++;.        i
4a10: 66 28 20 7a 5b 6e 2b 31 5d 21 3d 64 65 6c 69 6d  f( z[n+1]!=delim
4a20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4a30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
4a40: 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20  .    int c;.    
4a50: 66 6f 72 28 6e 3d 31 3b 20 28 63 20 3d 20 7a 5b  for(n=1; (c = z[
4a60: 6e 5d 29 21 3d 30 20 26 26 20 21 49 53 53 50 41  n])!=0 && !ISSPA
4a70: 43 45 28 63 29 20 26 26 20 63 21 3d 27 22 27 20  CE(c) && c!='"' 
4a80: 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21  && c!='\'' && c!
4a90: 3d 27 3b 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 7d  =';'; n++){}.  }
4aa0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
4ab0: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 61 20 73 69 6e  /*.** Copy a sin
4ac0: 67 6c 65 20 74 6f 6b 65 6e 20 69 6e 74 6f 20 61  gle token into a
4ad0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 2e 0a   string buffer..
4ae0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
4af0: 74 72 61 63 74 54 6f 6b 65 6e 28 63 6f 6e 73 74  tractToken(const
4b00: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20   char *zIn, int 
4b10: 6e 49 6e 2c 20 63 68 61 72 20 2a 7a 4f 75 74 2c  nIn, char *zOut,
4b20: 20 69 6e 74 20 6e 4f 75 74 29 7b 0a 20 20 69 6e   int nOut){.  in
4b30: 74 20 69 3b 0a 20 20 69 66 28 20 6e 49 6e 3c 3d  t i;.  if( nIn<=
4b40: 30 20 29 7b 0a 20 20 20 20 7a 4f 75 74 5b 30 5d  0 ){.    zOut[0]
4b50: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
4b60: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
4b70: 30 3b 20 69 3c 6e 49 6e 20 26 26 20 69 3c 6e 4f  0; i<nIn && i<nO
4b80: 75 74 2d 31 20 26 26 20 21 49 53 53 50 41 43 45  ut-1 && !ISSPACE
4b90: 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 20  (zIn[i]); i++){ 
4ba0: 7a 4f 75 74 5b 69 5d 20 3d 20 7a 49 6e 5b 69 5d  zOut[i] = zIn[i]
4bb0: 3b 20 7d 0a 20 20 7a 4f 75 74 5b 69 5d 20 3d 20  ; }.  zOut[i] = 
4bc0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  0;.  return i;.}
4bd0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
4be0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
4bf0: 63 74 65 72 73 20 75 70 20 74 6f 20 74 68 65 20  cters up to the 
4c00: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
4c10: 74 20 22 2d 2d 65 6e 64 22 20 74 6f 6b 65 6e 2e  t "--end" token.
4c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
4c30: 69 6e 64 45 6e 64 28 63 6f 6e 73 74 20 63 68 61  indEnd(const cha
4c40: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 6e 4c 69 6e  r *z, int *pnLin
4c50: 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  e){.  int n = 0;
4c60: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 20 26  .  while( z[n] &
4c70: 26 20 28 73 74 72 6e 63 6d 70 28 7a 2b 6e 2c 22  & (strncmp(z+n,"
4c80: 2d 2d 65 6e 64 22 2c 35 29 20 7c 7c 20 21 49 53  --end",5) || !IS
4c90: 53 50 41 43 45 28 7a 5b 6e 2b 35 5d 29 29 20 29  SPACE(z[n+5])) )
4ca0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 74 6f 6b 65 6e  {.    n += token
4cb0: 4c 65 6e 67 74 68 28 7a 2b 6e 2c 20 70 6e 4c 69  Length(z+n, pnLi
4cc0: 6e 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ne);.  }.  retur
4cd0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n n;.}../*.** Fi
4ce0: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
4cf0: 20 63 68 61 72 61 63 74 65 72 73 20 75 70 20 74   characters up t
4d00: 6f 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  o the first char
4d10: 61 63 74 65 72 20 70 61 73 74 20 74 68 65 0a 2a  acter past the.*
4d20: 2a 20 6f 66 20 74 68 65 20 6e 65 78 74 20 22 2d  * of the next "-
4d30: 2d 65 6e 64 69 66 22 20 20 6f 72 20 22 2d 2d 65  -endif"  or "--e
4d40: 6c 73 65 22 20 74 6f 6b 65 6e 2e 20 4e 65 73 74  lse" token. Nest
4d50: 65 64 20 2d 2d 69 66 20 63 6f 6d 6d 61 6e 64 73  ed --if commands
4d60: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 73 6b 69   are.** also ski
4d70: 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
4d80: 69 6e 74 20 66 69 6e 64 45 6e 64 69 66 28 63 6f  int findEndif(co
4d90: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
4da0: 20 73 74 6f 70 41 74 45 6c 73 65 2c 20 69 6e 74   stopAtElse, int
4db0: 20 2a 70 6e 4c 69 6e 65 29 7b 0a 20 20 69 6e 74   *pnLine){.  int
4dc0: 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   n = 0;.  while(
4dd0: 20 7a 5b 6e 5d 20 29 7b 0a 20 20 20 20 69 6e 74   z[n] ){.    int
4de0: 20 6c 65 6e 20 3d 20 74 6f 6b 65 6e 4c 65 6e 67   len = tokenLeng
4df0: 74 68 28 7a 2b 6e 2c 20 70 6e 4c 69 6e 65 29 3b  th(z+n, pnLine);
4e00: 0a 20 20 20 20 69 66 28 20 28 73 74 72 6e 63 6d  .    if( (strncm
4e10: 70 28 7a 2b 6e 2c 22 2d 2d 65 6e 64 69 66 22 2c  p(z+n,"--endif",
4e20: 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  7)==0 && ISSPACE
4e30: 28 7a 5b 6e 2b 37 5d 29 29 0a 20 20 20 20 20 7c  (z[n+7])).     |
4e40: 7c 20 28 73 74 6f 70 41 74 45 6c 73 65 20 26 26  | (stopAtElse &&
4e50: 20 73 74 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d   strncmp(z+n,"--
4e60: 65 6c 73 65 22 2c 36 29 3d 3d 30 20 26 26 20 49  else",6)==0 && I
4e70: 53 53 50 41 43 45 28 7a 5b 6e 2b 36 5d 29 29 0a  SSPACE(z[n+6])).
4e80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
4e90: 75 72 6e 20 6e 2b 6c 65 6e 3b 0a 20 20 20 20 7d  urn n+len;.    }
4ea0: 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
4eb0: 28 7a 2b 6e 2c 22 2d 2d 69 66 22 2c 34 29 3d 3d  (z+n,"--if",4)==
4ec0: 30 20 26 26 20 49 53 53 50 41 43 45 28 7a 5b 6e  0 && ISSPACE(z[n
4ed0: 2b 34 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  +4]) ){.      in
4ee0: 74 20 73 6b 69 70 20 3d 20 66 69 6e 64 45 6e 64  t skip = findEnd
4ef0: 69 66 28 7a 2b 6e 2b 6c 65 6e 2c 20 30 2c 20 70  if(z+n+len, 0, p
4f00: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 6e 20  nLine);.      n 
4f10: 2b 3d 20 73 6b 69 70 20 2b 20 6c 65 6e 3b 0a 20  += skip + len;. 
4f20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4f30: 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  n += len;.    }.
4f40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
4f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 69 74 20 66 6f  }../*.** Wait fo
4f60: 72 20 61 20 63 6c 69 65 6e 74 20 70 72 6f 63 65  r a client proce
4f70: 73 73 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 61  ss to complete a
4f80: 6c 6c 20 69 74 73 20 74 61 73 6b 73 0a 2a 2f 0a  ll its tasks.*/.
4f90: 73 74 61 74 69 63 20 76 6f 69 64 20 77 61 69 74  static void wait
4fa0: 46 6f 72 43 6c 69 65 6e 74 28 69 6e 74 20 69 43  ForClient(int iC
4fb0: 6c 69 65 6e 74 2c 20 69 6e 74 20 69 54 69 6d 65  lient, int iTime
4fc0: 6f 75 74 2c 20 63 68 61 72 20 2a 7a 45 72 72 50  out, char *zErrP
4fd0: 72 65 66 69 78 29 7b 0a 20 20 73 71 6c 69 74 65  refix){.  sqlite
4fe0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
4ff0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
5000: 43 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20  Client>0 ){.    
5010: 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53  pStmt = prepareS
5020: 71 6c 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ql(.            
5030: 20 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f     "SELECT 1 FRO
5040: 4d 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20  M task".        
5050: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 63         " WHERE c
5060: 6c 69 65 6e 74 3d 25 64 22 0a 20 20 20 20 20 20  lient=%d".      
5070: 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44           "   AND
5080: 20 63 6c 69 65 6e 74 20 49 4e 20 28 53 45 4c 45   client IN (SELE
5090: 43 54 20 69 64 20 46 52 4f 4d 20 63 6c 69 65 6e  CT id FROM clien
50a0: 74 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)".            
50b0: 20 20 20 22 20 20 41 4e 44 20 65 6e 64 74 69 6d     "  AND endtim
50c0: 65 20 49 53 20 4e 55 4c 4c 22 2c 0a 20 20 20 20  e IS NULL",.    
50d0: 20 20 20 20 20 20 20 20 20 20 20 69 43 6c 69 65             iClie
50e0: 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt);.  }else{.  
50f0: 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72    pStmt = prepar
5100: 65 53 71 6c 28 0a 20 20 20 20 20 20 20 20 20 20  eSql(.          
5110: 20 20 20 20 20 22 53 45 4c 45 43 54 20 31 20 46       "SELECT 1 F
5120: 52 4f 4d 20 74 61 73 6b 22 0a 20 20 20 20 20 20  ROM task".      
5130: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
5140: 20 63 6c 69 65 6e 74 20 49 4e 20 28 53 45 4c 45   client IN (SELE
5150: 43 54 20 69 64 20 46 52 4f 4d 20 63 6c 69 65 6e  CT id FROM clien
5160: 74 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)".            
5170: 20 20 20 22 20 20 20 41 4e 44 20 65 6e 64 74 69     "   AND endti
5180: 6d 65 20 49 53 20 4e 55 4c 4c 22 29 3b 0a 20 20  me IS NULL");.  
5190: 7d 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d  }.  g.iTimeout =
51a0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 28 72   0;.  while( ((r
51b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
51c0: 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c 49 54 45  (pStmt))==SQLITE
51d0: 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
51e0: 49 54 45 5f 52 4f 57 29 0a 20 20 20 20 26 26 20  ITE_ROW).    && 
51f0: 69 54 69 6d 65 6f 75 74 3e 30 0a 20 20 29 7b 0a  iTimeout>0.  ){.
5200: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
5210: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  t(pStmt);.    sq
5220: 6c 69 74 65 33 5f 73 6c 65 65 70 28 35 30 29 3b  lite3_sleep(50);
5230: 0a 20 20 20 20 69 54 69 6d 65 6f 75 74 20 2d 3d  .    iTimeout -=
5240: 20 35 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   50;.  }.  sqlit
5250: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5260: 74 29 3b 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74  t);.  g.iTimeout
5270: 20 3d 20 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f   = DEFAULT_TIMEO
5280: 55 54 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  UT;.  if( rc!=SQ
5290: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
52a0: 20 69 66 28 20 7a 45 72 72 50 72 65 66 69 78 3d   if( zErrPrefix=
52b0: 3d 30 20 29 20 7a 45 72 72 50 72 65 66 69 78 20  =0 ) zErrPrefix 
52c0: 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 69 43  = "";.    if( iC
52d0: 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20  lient>0 ){.     
52e0: 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 25   errorMessage("%
52f0: 73 74 69 6d 65 6f 75 74 20 77 61 69 74 69 6e 67  stimeout waiting
5300: 20 66 6f 72 20 63 6c 69 65 6e 74 20 25 64 22 2c   for client %d",
5310: 20 7a 45 72 72 50 72 65 66 69 78 2c 20 69 43 6c   zErrPrefix, iCl
5320: 69 65 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ient);.    }else
5330: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73  {.      errorMes
5340: 73 61 67 65 28 22 25 73 74 69 6d 65 6f 75 74 20  sage("%stimeout 
5350: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6c 6c 20  waiting for all 
5360: 63 6c 69 65 6e 74 73 22 2c 20 7a 45 72 72 50 72  clients", zErrPr
5370: 65 66 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  efix);.    }.  }
5380: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
5390: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
53a0: 61 69 6c 20 6f 66 20 61 20 66 69 6c 65 6e 61 6d  ail of a filenam
53b0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
53c0: 20 2a 66 69 6c 65 6e 61 6d 65 54 61 69 6c 28 63   *filenameTail(c
53d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
53e0: 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  , j;.  for(i=j=0
53f0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 20 69 66 28  ; z[i]; i++) if(
5400: 20 69 73 44 69 72 53 65 70 28 7a 5b 69 5d 29 20   isDirSep(z[i]) 
5410: 29 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 72 65 74  ) j = i+1;.  ret
5420: 75 72 6e 20 7a 2b 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn z+j;.}../*.*
5430: 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67  * Interpret zArg
5440: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
5450: 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 65 69 74  lue.  Return eit
5460: 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2f 0a 73  her 0 or 1..*/.s
5470: 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61  tatic int boolea
5480: 6e 56 61 6c 75 65 28 63 68 61 72 20 2a 7a 41 72  nValue(char *zAr
5490: 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
54a0: 66 28 20 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  f( zArg==0 ) ret
54b0: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
54c0: 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26  ; zArg[i]>='0' &
54d0: 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20  & zArg[i]<='9'; 
54e0: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i++){}.  if( i>0
54f0: 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29   && zArg[i]==0 )
5500: 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a 41 72   return atoi(zAr
5510: 67 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  g);.  if( sqlite
5520: 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
5530: 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  "on")==0 || sqli
5540: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
5550: 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"yes")==0 ){.  
5560: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
5570: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
5580: 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66  ricmp(zArg, "off
5590: 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ")==0 || sqlite3
55a0: 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e  _stricmp(zArg,"n
55b0: 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  o")==0 ){.    re
55c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 65 72  turn 0;.  }.  er
55d0: 72 6f 72 4d 65 73 73 61 67 65 28 22 75 6e 6b 6e  rorMessage("unkn
55e0: 6f 77 6e 20 62 6f 6f 6c 65 61 6e 3a 20 5b 25 73  own boolean: [%s
55f0: 5d 22 2c 20 7a 41 72 67 29 3b 0a 20 20 72 65 74  ]", zArg);.  ret
5600: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68  urn 0;.}.../* Th
5610: 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74  is routine exist
5620: 73 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  s as a convenien
5630: 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
5640: 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 62 72 65   debugger.** bre
5650: 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  akpoint..*/.stat
5660: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65  ic void test_bre
5670: 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 20 73  akpoint(void){ s
5680: 74 61 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 69  tatic volatile i
5690: 6e 74 20 63 6e 74 20 3d 20 30 3b 20 63 6e 74 2b  nt cnt = 0; cnt+
56a0: 2b 3b 20 7d 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d  +; }../* Maximum
56b0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
56c0: 65 6e 74 73 20 74 6f 20 61 20 2d 2d 63 6f 6d 6d  ents to a --comm
56d0: 61 6e 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  and */.#define M
56e0: 58 5f 41 52 47 20 32 0a 0a 2f 2a 0a 2a 2a 20 52  X_ARG 2../*.** R
56f0: 75 6e 20 61 20 73 63 72 69 70 74 2e 0a 2a 2f 0a  un a script..*/.
5700: 73 74 61 74 69 63 20 76 6f 69 64 20 72 75 6e 53  static void runS
5710: 63 72 69 70 74 28 0a 20 20 69 6e 74 20 69 43 6c  cript(.  int iCl
5720: 69 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  ient,       /* T
5730: 68 65 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72  he client number
5740: 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6d  , or 0 for the m
5750: 61 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  aster */.  int t
5760: 61 73 6b 49 64 2c 20 20 20 20 20 20 20 20 2f 2a  askId,        /*
5770: 20 54 68 65 20 74 61 73 6b 20 49 44 20 66 6f 72   The task ID for
5780: 20 63 6c 69 65 6e 74 73 2e 20 20 30 20 66 6f 72   clients.  0 for
5790: 20 6d 61 73 74 65 72 20 2a 2f 0a 20 20 63 68 61   master */.  cha
57a0: 72 20 2a 7a 53 63 72 69 70 74 2c 20 20 20 20 20  r *zScript,     
57b0: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 73  /* Text of the s
57c0: 63 72 69 70 74 20 2a 2f 0a 20 20 63 68 61 72 20  cript */.  char 
57d0: 2a 7a 46 69 6c 65 6e 61 6d 65 20 20 20 20 2f 2a  *zFilename    /*
57e0: 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   File from which
57f0: 20 73 63 72 69 70 74 20 77 61 73 20 72 65 61 64   script was read
5800: 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69  . */.){.  int li
5810: 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20  neno = 1;.  int 
5820: 70 72 65 76 4c 69 6e 65 20 3d 20 31 3b 0a 20 20  prevLine = 1;.  
5830: 69 6e 74 20 69 69 20 3d 20 30 3b 0a 20 20 69 6e  int ii = 0;.  in
5840: 74 20 69 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20  t iBegin = 0;.  
5850: 69 6e 74 20 6e 2c 20 63 2c 20 6a 3b 0a 20 20 69  int n, c, j;.  i
5860: 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 6e 41  nt len;.  int nA
5870: 72 67 3b 0a 20 20 53 74 72 69 6e 67 20 73 52 65  rg;.  String sRe
5880: 73 75 6c 74 3b 0a 20 20 63 68 61 72 20 7a 43 6d  sult;.  char zCm
5890: 64 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 7a 45  d[30];.  char zE
58a0: 72 72 6f 72 5b 31 30 30 30 5d 3b 0a 20 20 63 68  rror[1000];.  ch
58b0: 61 72 20 61 7a 41 72 67 5b 4d 58 5f 41 52 47 5d  ar azArg[MX_ARG]
58c0: 5b 31 30 30 5d 3b 0a 0a 20 20 6d 65 6d 73 65 74  [100];..  memset
58d0: 28 26 73 52 65 73 75 6c 74 2c 20 30 2c 20 73 69  (&sResult, 0, si
58e0: 7a 65 6f 66 28 73 52 65 73 75 6c 74 29 29 3b 0a  zeof(sResult));.
58f0: 20 20 73 74 72 69 6e 67 52 65 73 65 74 28 26 73    stringReset(&s
5900: 52 65 73 75 6c 74 29 3b 0a 20 20 77 68 69 6c 65  Result);.  while
5910: 28 20 28 63 20 3d 20 7a 53 63 72 69 70 74 5b 69  ( (c = zScript[i
5920: 69 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 72  i])!=0 ){.    pr
5930: 65 76 4c 69 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b  evLine = lineno;
5940: 0a 20 20 20 20 6c 65 6e 20 3d 20 74 6f 6b 65 6e  .    len = token
5950: 4c 65 6e 67 74 68 28 7a 53 63 72 69 70 74 2b 69  Length(zScript+i
5960: 69 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  i, &lineno);.   
5970: 20 69 66 28 20 49 53 53 50 41 43 45 28 63 29 20   if( ISSPACE(c) 
5980: 7c 7c 20 28 63 3d 3d 27 2f 27 20 26 26 20 7a 53  || (c=='/' && zS
5990: 63 72 69 70 74 5b 69 69 2b 31 5d 3d 3d 27 2a 27  cript[ii+1]=='*'
59a0: 29 20 29 7b 0a 20 20 20 20 20 20 69 69 20 2b 3d  ) ){.      ii +=
59b0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 74   len;.      cont
59c0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
59d0: 69 66 28 20 63 21 3d 27 2d 27 20 7c 7c 20 7a 53  if( c!='-' || zS
59e0: 63 72 69 70 74 5b 69 69 2b 31 5d 21 3d 27 2d 27  cript[ii+1]!='-'
59f0: 20 7c 7c 20 21 69 73 61 6c 70 68 61 28 7a 53 63   || !isalpha(zSc
5a00: 72 69 70 74 5b 69 69 2b 32 5d 29 20 29 7b 0a 20  ript[ii+2]) ){. 
5a10: 20 20 20 20 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a       ii += len;.
5a20: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
5a30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75      }..    /* Ru
5a40: 6e 20 61 6e 79 20 70 72 69 6f 72 20 53 51 4c 20  n any prior SQL 
5a50: 62 65 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e  before processin
5a60: 67 20 74 68 65 20 6e 65 77 20 2d 2d 63 6f 6d 6d  g the new --comm
5a70: 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  and */.    if( i
5a80: 69 3e 69 42 65 67 69 6e 20 29 7b 0a 20 20 20 20  i>iBegin ){.    
5a90: 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
5aa0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5ab0: 25 2e 2a 73 22 2c 20 69 69 2d 69 42 65 67 69 6e  %.*s", ii-iBegin
5ac0: 2c 20 7a 53 63 72 69 70 74 2b 69 42 65 67 69 6e  , zScript+iBegin
5ad0: 29 3b 0a 20 20 20 20 20 20 65 76 61 6c 53 71 6c  );.      evalSql
5ae0: 28 26 73 52 65 73 75 6c 74 2c 20 7a 53 71 6c 29  (&sResult, zSql)
5af0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5b00: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
5b10: 20 20 69 42 65 67 69 6e 20 3d 20 69 69 20 2b 20    iBegin = ii + 
5b20: 6c 65 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  len;.    }..    
5b30: 2f 2a 20 50 61 72 73 65 20 74 68 65 20 2d 2d 63  /* Parse the --c
5b40: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66  ommand */.    if
5b50: 28 20 67 2e 69 54 72 61 63 65 3e 3d 32 20 29 20  ( g.iTrace>=2 ) 
5b60: 6c 6f 67 4d 65 73 73 61 67 65 28 22 25 2e 2a 73  logMessage("%.*s
5b70: 22 2c 20 6c 65 6e 2c 20 7a 53 63 72 69 70 74 2b  ", len, zScript+
5b80: 69 69 29 3b 0a 20 20 20 20 6e 20 3d 20 65 78 74  ii);.    n = ext
5b90: 72 61 63 74 54 6f 6b 65 6e 28 7a 53 63 72 69 70  ractToken(zScrip
5ba0: 74 2b 69 69 2b 32 2c 20 6c 65 6e 2d 32 2c 20 7a  t+ii+2, len-2, z
5bb0: 43 6d 64 2c 20 73 69 7a 65 6f 66 28 7a 43 6d 64  Cmd, sizeof(zCmd
5bc0: 29 29 3b 0a 20 20 20 20 66 6f 72 28 6e 41 72 67  ));.    for(nArg
5bd0: 3d 30 3b 20 6e 3c 6c 65 6e 2d 32 20 26 26 20 6e  =0; n<len-2 && n
5be0: 41 72 67 3c 4d 58 5f 41 52 47 3b 20 6e 41 72 67  Arg<MX_ARG; nArg
5bf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ++){.      while
5c00: 28 20 6e 3c 6c 65 6e 2d 32 20 26 26 20 49 53 53  ( n<len-2 && ISS
5c10: 50 41 43 45 28 7a 53 63 72 69 70 74 5b 69 69 2b  PACE(zScript[ii+
5c20: 32 2b 6e 5d 29 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  2+n]) ){ n++; }.
5c30: 20 20 20 20 20 20 69 66 28 20 6e 3e 3d 6c 65 6e        if( n>=len
5c40: 2d 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  -2 ) break;.    
5c50: 20 20 6e 20 2b 3d 20 65 78 74 72 61 63 74 54 6f    n += extractTo
5c60: 6b 65 6e 28 7a 53 63 72 69 70 74 2b 69 69 2b 32  ken(zScript+ii+2
5c70: 2b 6e 2c 20 6c 65 6e 2d 32 2d 6e 2c 0a 20 20 20  +n, len-2-n,.   
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 5d       azArg[nArg]
5ca0: 2c 20 73 69 7a 65 6f 66 28 61 7a 41 72 67 5b 6e  , sizeof(azArg[n
5cb0: 41 72 67 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Arg]));.    }.  
5cc0: 20 20 66 6f 72 28 6a 3d 6e 41 72 67 3b 20 6a 3c    for(j=nArg; j<
5cd0: 4d 58 5f 41 52 47 3b 20 6a 2b 2b 29 20 61 7a 41  MX_ARG; j++) azA
5ce0: 72 67 5b 6a 2b 2b 5d 5b 30 5d 20 3d 20 30 3b 0a  rg[j++][0] = 0;.
5cf0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
5d00: 2d 2d 73 6c 65 65 70 20 4e 0a 20 20 20 20 2a 2a  --sleep N.    **
5d10: 0a 20 20 20 20 2a 2a 20 50 61 75 73 65 20 66 6f  .    ** Pause fo
5d20: 72 20 4e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  r N milliseconds
5d30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5d40: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73 6c  strcmp(zCmd, "sl
5d50: 65 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eep")==0 ){.    
5d60: 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28    sqlite3_sleep(
5d70: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 29 3b  atoi(azArg[0]));
5d80: 0a 20 20 20 20 7d 65 6c 73 65 20 0a 0a 20 20 20  .    }else ..   
5d90: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 2d 2d 65   /*.    **   --e
5da0: 78 69 74 20 4e 0a 20 20 20 20 2a 2a 0a 20 20 20  xit N.    **.   
5db0: 20 2a 2a 20 45 78 69 74 20 74 68 69 73 20 70 72   ** Exit this pr
5dc0: 6f 63 65 73 73 2e 20 20 49 66 20 4e 3e 30 20 74  ocess.  If N>0 t
5dd0: 68 65 6e 20 65 78 69 74 20 77 69 74 68 6f 75 74  hen exit without
5de0: 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 0a 20   shutting down. 
5df0: 20 20 20 2a 2a 20 53 51 4c 69 74 65 2e 20 20 28     ** SQLite.  (
5e00: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
5e10: 73 69 6d 75 6c 61 74 65 20 61 20 63 72 61 73 68  simulate a crash
5e20: 2e 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .).    */.    if
5e30: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
5e40: 65 78 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  exit")==0 ){.   
5e50: 20 20 20 69 6e 74 20 72 63 20 3d 20 61 74 6f 69     int rc = atoi
5e60: 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20  (azArg[0]);.    
5e70: 20 20 66 69 6e 69 73 68 53 63 72 69 70 74 28 69    finishScript(i
5e80: 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49 64 2c 20  Client, taskId, 
5e90: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
5ea0: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 63 6c  ==0 ) sqlite3_cl
5eb0: 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20 20 20 20  ose(g.db);.     
5ec0: 20 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20 7d   exit(rc);.    }
5ed0: 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  else..    /*.   
5ee0: 20 2a 2a 20 20 20 2d 2d 74 65 73 74 63 61 73 65   **   --testcase
5ef0: 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 0a 20 20 20   NAME.    **.   
5f00: 20 2a 2a 20 42 65 67 69 6e 20 61 20 6e 65 77 20   ** Begin a new 
5f10: 74 65 73 74 20 63 61 73 65 2e 20 20 41 6e 6e 6f  test case.  Anno
5f20: 75 6e 63 65 20 69 6e 20 74 68 65 20 6c 6f 67 20  unce in the log 
5f30: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 63 61  that the test ca
5f40: 73 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  se.    ** has be
5f50: 67 75 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  gun..    */.    
5f60: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
5f70: 20 22 74 65 73 74 63 61 73 65 22 29 3d 3d 30 20   "testcase")==0 
5f80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69  ){.      if( g.i
5f90: 54 72 61 63 65 3d 3d 31 20 29 20 6c 6f 67 4d 65  Trace==1 ) logMe
5fa0: 73 73 61 67 65 28 22 25 2e 2a 73 22 2c 20 6c 65  ssage("%.*s", le
5fb0: 6e 20 2d 20 31 2c 20 7a 53 63 72 69 70 74 2b 69  n - 1, zScript+i
5fc0: 69 29 3b 0a 20 20 20 20 20 20 73 74 72 69 6e 67  i);.      string
5fd0: 52 65 73 65 74 28 26 73 52 65 73 75 6c 74 29 3b  Reset(&sResult);
5fe0: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
5ff0: 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 2d 2d 66 69  /*.    **   --fi
6000: 6e 69 73 68 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nish.    **.    
6010: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 63 75 72 72  ** Mark the curr
6020: 65 6e 74 20 74 61 73 6b 20 61 73 20 68 61 76 69  ent task as havi
6030: 6e 67 20 66 69 6e 69 73 68 65 64 2c 20 65 76 65  ng finished, eve
6040: 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a  n if it is not..
6050: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20      ** This can 
6060: 62 65 20 75 73 65 64 20 69 6e 20 63 6f 6e 6a 75  be used in conju
6070: 6e 63 74 69 6f 6e 20 77 69 74 68 20 2d 2d 65 78  nction with --ex
6080: 69 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  it to simulate a
6090: 20 63 72 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20   crash..    */. 
60a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43     if( strcmp(zC
60b0: 6d 64 2c 20 22 66 69 6e 69 73 68 22 29 3d 3d 30  md, "finish")==0
60c0: 20 26 26 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b   && iClient>0 ){
60d0: 0a 20 20 20 20 20 20 66 69 6e 69 73 68 53 63 72  .      finishScr
60e0: 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73  ipt(iClient, tas
60f0: 6b 49 64 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  kId, 1);.    }el
6100: 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  se..    /*.    *
6110: 2a 20 20 2d 2d 72 65 73 65 74 0a 20 20 20 20 2a  *  --reset.    *
6120: 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 61  *.    ** Reset a
6130: 63 63 75 6d 75 6c 61 74 65 64 20 72 65 73 75 6c  ccumulated resul
6140: 74 73 20 62 61 63 6b 20 74 6f 20 61 6e 20 65 6d  ts back to an em
6150: 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20 20 2a  pty string.    *
6160: 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
6170: 28 7a 43 6d 64 2c 20 22 72 65 73 65 74 22 29 3d  (zCmd, "reset")=
6180: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 69  =0 ){.      stri
6190: 6e 67 52 65 73 65 74 28 26 73 52 65 73 75 6c 74  ngReset(&sResult
61a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20  );.    }else..  
61b0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 6d    /*.    **  --m
61c0: 61 74 63 68 20 41 4e 53 57 45 52 2e 2e 2e 0a 20  atch ANSWER.... 
61d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65     **.    ** Che
61e0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 6f 75 74  ck to see if out
61f0: 70 75 74 20 6d 61 74 63 68 65 73 20 41 4e 53 57  put matches ANSW
6200: 45 52 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  ER.  Report an e
6210: 72 72 6f 72 20 69 66 20 6e 6f 74 2e 0a 20 20 20  rror if not..   
6220: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
6230: 6d 70 28 7a 43 6d 64 2c 20 22 6d 61 74 63 68 22  mp(zCmd, "match"
6240: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
6250: 74 20 6a 6a 3b 0a 20 20 20 20 20 20 63 68 61 72  t jj;.      char
6260: 20 2a 7a 41 6e 73 20 3d 20 7a 53 63 72 69 70 74   *zAns = zScript
6270: 2b 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  +ii;.      for(j
6280: 6a 3d 37 3b 20 6a 6a 3c 6c 65 6e 2d 31 20 26 26  j=7; jj<len-1 &&
6290: 20 49 53 53 50 41 43 45 28 7a 41 6e 73 5b 6a 6a   ISSPACE(zAns[jj
62a0: 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ]); jj++){}.    
62b0: 20 20 7a 41 6e 73 20 2b 3d 20 6a 6a 3b 0a 20 20    zAns += jj;.  
62c0: 20 20 20 20 69 66 28 20 6c 65 6e 2d 6a 6a 2d 31      if( len-jj-1
62d0: 21 3d 73 52 65 73 75 6c 74 2e 6e 20 7c 7c 20 73  !=sResult.n || s
62e0: 74 72 6e 63 6d 70 28 73 52 65 73 75 6c 74 2e 7a  trncmp(sResult.z
62f0: 2c 20 7a 41 6e 73 2c 20 6c 65 6e 2d 6a 6a 2d 31  , zAns, len-jj-1
6300: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  ) ){.        err
6310: 6f 72 4d 65 73 73 61 67 65 28 22 6c 69 6e 65 20  orMessage("line 
6320: 25 64 20 6f 66 20 25 73 3a 5c 6e 45 78 70 65 63  %d of %s:\nExpec
6330: 74 65 64 20 5b 25 2e 2a 73 5d 5c 6e 20 20 20 20  ted [%.*s]\n    
6340: 20 47 6f 74 20 5b 25 73 5d 22 2c 0a 20 20 20 20   Got [%s]",.    
6350: 20 20 20 20 20 20 70 72 65 76 4c 69 6e 65 2c 20        prevLine, 
6360: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6c 65 6e 2d 6a  zFilename, len-j
6370: 6a 2d 31 2c 20 7a 41 6e 73 2c 20 73 52 65 73 75  j-1, zAns, sResu
6380: 6c 74 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt.z);.      }. 
6390: 20 20 20 20 20 67 2e 6e 54 65 73 74 2b 2b 3b 0a       g.nTest++;.
63a0: 20 20 20 20 20 20 73 74 72 69 6e 67 52 65 73 65        stringRese
63b0: 74 28 26 73 52 65 73 75 6c 74 29 3b 0a 20 20 20  t(&sResult);.   
63c0: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20   }else..    /*. 
63d0: 20 20 20 2a 2a 20 20 2d 2d 67 6c 6f 62 20 41 4e     **  --glob AN
63e0: 53 57 45 52 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20  SWER....    **  
63f0: 2d 2d 6e 6f 74 67 6c 6f 62 20 41 4e 53 57 45 52  --notglob ANSWER
6400: 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  .....    **.    
6410: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
6420: 69 66 20 6f 75 74 70 75 74 20 64 6f 65 73 20 6f  if output does o
6430: 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  r does not match
6440: 20 74 68 65 20 67 6c 6f 62 20 70 61 74 74 65 72   the glob patter
6450: 6e 0a 20 20 20 20 2a 2a 20 41 4e 53 57 45 52 2e  n.    ** ANSWER.
6460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6470: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 67 6c  strcmp(zCmd, "gl
6480: 6f 62 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  ob")==0 || strcm
6490: 70 28 7a 43 6d 64 2c 20 22 6e 6f 74 67 6c 6f 62  p(zCmd, "notglob
64a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
64b0: 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 63 68 61  nt jj;.      cha
64c0: 72 20 2a 7a 41 6e 73 20 3d 20 7a 53 63 72 69 70  r *zAns = zScrip
64d0: 74 2b 69 69 3b 0a 20 20 20 20 20 20 63 68 61 72  t+ii;.      char
64e0: 20 2a 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 69   *zCopy;.      i
64f0: 6e 74 20 69 73 47 6c 6f 62 20 3d 20 28 7a 43 6d  nt isGlob = (zCm
6500: 64 5b 30 5d 3d 3d 27 67 27 29 3b 0a 20 20 20 20  d[0]=='g');.    
6510: 20 20 66 6f 72 28 6a 6a 3d 39 2d 33 2a 69 73 47    for(jj=9-3*isG
6520: 6c 6f 62 3b 20 6a 6a 3c 6c 65 6e 2d 31 20 26 26  lob; jj<len-1 &&
6530: 20 49 53 53 50 41 43 45 28 7a 41 6e 73 5b 6a 6a   ISSPACE(zAns[jj
6540: 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ]); jj++){}.    
6550: 20 20 7a 41 6e 73 20 2b 3d 20 6a 6a 3b 0a 20 20    zAns += jj;.  
6560: 20 20 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69      zCopy = sqli
6570: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a  te3_mprintf("%.*
6580: 73 22 2c 20 6c 65 6e 2d 6a 6a 2d 31 2c 20 7a 41  s", len-jj-1, zA
6590: 6e 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ns);.      if( (
65a0: 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
65b0: 7a 43 6f 70 79 2c 20 73 52 65 73 75 6c 74 2e 7a  zCopy, sResult.z
65c0: 29 3d 3d 30 29 5e 69 73 47 6c 6f 62 20 29 7b 0a  )==0)^isGlob ){.
65d0: 20 20 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73          errorMes
65e0: 73 61 67 65 28 22 6c 69 6e 65 20 25 64 20 6f 66  sage("line %d of
65f0: 20 25 73 3a 5c 6e 45 78 70 65 63 74 65 64 20 5b   %s:\nExpected [
6600: 25 73 5d 5c 6e 20 20 20 20 20 47 6f 74 20 5b 25  %s]\n     Got [%
6610: 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  s]",.          p
6620: 72 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61  revLine, zFilena
6630: 6d 65 2c 20 7a 43 6f 70 79 2c 20 73 52 65 73 75  me, zCopy, sResu
6640: 6c 74 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt.z);.      }. 
6650: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6660: 65 28 7a 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  e(zCopy);.      
6670: 67 2e 6e 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20  g.nTest++;.     
6680: 20 73 74 72 69 6e 67 52 65 73 65 74 28 26 73 52   stringReset(&sR
6690: 65 73 75 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73  esult);.    }els
66a0: 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e..    /*.    **
66b0: 20 20 2d 2d 6f 75 74 70 75 74 0a 20 20 20 20 2a    --output.    *
66c0: 2a 0a 20 20 20 20 2a 2a 20 4f 75 74 70 75 74 20  *.    ** Output 
66d0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
66e0: 65 20 70 72 65 76 69 6f 75 73 20 53 51 4c 2e 0a  e previous SQL..
66f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
6700: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6f 75 74  trcmp(zCmd, "out
6710: 70 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  put")==0 ){.    
6720: 20 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 25 73    logMessage("%s
6730: 22 2c 20 73 52 65 73 75 6c 74 2e 7a 29 3b 0a 20  ", sResult.z);. 
6740: 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
6750: 0a 20 20 20 20 2a 2a 20 20 2d 2d 73 6f 75 72 63  .    **  --sourc
6760: 65 20 46 49 4c 45 4e 41 4d 45 0a 20 20 20 20 2a  e FILENAME.    *
6770: 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 73  *.    ** Run a s
6780: 75 62 73 63 72 69 70 74 20 66 72 6f 6d 20 61 20  ubscript from a 
6790: 73 65 70 61 72 61 74 65 20 66 69 6c 65 2e 0a 20  separate file.. 
67a0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
67b0: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73 6f 75 72  rcmp(zCmd, "sour
67c0: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
67d0: 20 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 2c   char *zNewFile,
67e0: 20 2a 7a 4e 65 77 53 63 72 69 70 74 3b 0a 20 20   *zNewScript;.  
67f0: 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 44 65 6c      char *zToDel
6800: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 4e 65 77   = 0;.      zNew
6810: 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b  File = azArg[0];
6820: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 44 69  .      if( !isDi
6830: 72 53 65 70 28 7a 4e 65 77 46 69 6c 65 5b 30 5d  rSep(zNewFile[0]
6840: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
6850: 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
6860: 6b 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  k=(int)strlen(zF
6870: 69 6c 65 6e 61 6d 65 29 2d 31 3b 20 6b 3e 3d 30  ilename)-1; k>=0
6880: 20 26 26 20 21 69 73 44 69 72 53 65 70 28 7a 46   && !isDirSep(zF
6890: 69 6c 65 6e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d  ilename[k]); k--
68a0: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
68b0: 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k>0 ){.         
68c0: 20 7a 4e 65 77 46 69 6c 65 20 3d 20 7a 54 6f 44   zNewFile = zToD
68d0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  el = sqlite3_mpr
68e0: 69 6e 74 66 28 22 25 2e 2a 73 2f 25 73 22 2c 20  intf("%.*s/%s", 
68f0: 6b 2c 7a 46 69 6c 65 6e 61 6d 65 2c 7a 4e 65 77  k,zFilename,zNew
6900: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  File);.        }
6910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
6920: 4e 65 77 53 63 72 69 70 74 20 3d 20 72 65 61 64  NewScript = read
6930: 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 29 3b 0a  File(zNewFile);.
6940: 20 20 20 20 20 20 69 66 28 20 67 2e 69 54 72 61        if( g.iTra
6950: 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28  ce ) logMessage(
6960: 22 62 65 67 69 6e 20 73 63 72 69 70 74 20 5b 25  "begin script [%
6970: 73 5d 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 29  s]\n", zNewFile)
6980: 3b 0a 20 20 20 20 20 20 72 75 6e 53 63 72 69 70  ;.      runScrip
6990: 74 28 30 2c 20 30 2c 20 7a 4e 65 77 53 63 72 69  t(0, 0, zNewScri
69a0: 70 74 2c 20 7a 4e 65 77 46 69 6c 65 29 3b 0a 20  pt, zNewFile);. 
69b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
69c0: 65 28 7a 4e 65 77 53 63 72 69 70 74 29 3b 0a 20  e(zNewScript);. 
69d0: 20 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63       if( g.iTrac
69e0: 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22  e ) logMessage("
69f0: 65 6e 64 20 73 63 72 69 70 74 20 5b 25 73 5d 5c  end script [%s]\
6a00: 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 29 3b 0a 20  n", zNewFile);. 
6a10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6a20: 65 28 7a 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d  e(zToDel);.    }
6a30: 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  else..    /*.   
6a40: 20 2a 2a 20 20 2d 2d 70 72 69 6e 74 20 4d 45 53   **  --print MES
6a50: 53 41 47 45 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 0a  SAGE.....    **.
6a60: 20 20 20 20 2a 2a 20 4f 75 74 70 75 74 20 74 68      ** Output th
6a70: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
6a80: 68 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 6c  he line to the l
6a90: 6f 67 20 66 69 6c 65 0a 20 20 20 20 2a 2f 0a 20  og file.    */. 
6aa0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43     if( strcmp(zC
6ab0: 6d 64 2c 20 22 70 72 69 6e 74 22 29 3d 3d 30 20  md, "print")==0 
6ac0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b  ){.      int jj;
6ad0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 37 3b  .      for(jj=7;
6ae0: 20 6a 6a 3c 6c 65 6e 20 26 26 20 49 53 53 50 41   jj<len && ISSPA
6af0: 43 45 28 7a 53 63 72 69 70 74 5b 69 69 2b 6a 6a  CE(zScript[ii+jj
6b00: 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ]); jj++){}.    
6b10: 20 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 25 2e    logMessage("%.
6b20: 2a 73 22 2c 20 6c 65 6e 2d 6a 6a 2c 20 7a 53 63  *s", len-jj, zSc
6b30: 72 69 70 74 2b 69 69 2b 6a 6a 29 3b 0a 20 20 20  ript+ii+jj);.   
6b40: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20   }else..    /*. 
6b50: 20 20 20 2a 2a 20 20 2d 2d 69 66 20 45 58 50 52     **  --if EXPR
6b60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
6b70: 6b 69 70 20 66 6f 72 77 61 72 64 20 74 6f 20 74  kip forward to t
6b80: 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
6b90: 20 2d 2d 65 6e 64 69 66 20 6f 72 20 2d 2d 65 6c   --endif or --el
6ba0: 73 65 20 69 66 20 45 58 50 52 20 69 73 20 66 61  se if EXPR is fa
6bb0: 6c 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lse..    */.    
6bc0: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6bd0: 20 22 69 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20   "if")==0 ){.   
6be0: 20 20 20 69 6e 74 20 6a 6a 2c 20 72 63 3b 0a 20     int jj, rc;. 
6bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
6c00: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20  t *pStmt;.      
6c10: 66 6f 72 28 6a 6a 3d 34 3b 20 6a 6a 3c 6c 65 6e  for(jj=4; jj<len
6c20: 20 26 26 20 49 53 53 50 41 43 45 28 7a 53 63 72   && ISSPACE(zScr
6c30: 69 70 74 5b 69 69 2b 6a 6a 5d 29 3b 20 6a 6a 2b  ipt[ii+jj]); jj+
6c40: 2b 29 7b 7d 0a 20 20 20 20 20 20 70 53 74 6d 74  +){}.      pStmt
6c50: 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28 22 53   = prepareSql("S
6c60: 45 4c 45 43 54 20 25 2e 2a 73 22 2c 20 6c 65 6e  ELECT %.*s", len
6c70: 2d 6a 6a 2c 20 7a 53 63 72 69 70 74 2b 69 69 2b  -jj, zScript+ii+
6c80: 6a 6a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  jj);.      rc = 
6c90: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
6ca0: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
6cb0: 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c  c!=SQLITE_ROW ||
6cc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
6cd0: 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3d 3d 30  int(pStmt, 0)==0
6ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 2b   ){.        ii +
6cf0: 3d 20 66 69 6e 64 45 6e 64 69 66 28 7a 53 63 72  = findEndif(zScr
6d00: 69 70 74 2b 69 69 2b 6c 65 6e 2c 20 31 2c 20 26  ipt+ii+len, 1, &
6d10: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  lineno);.      }
6d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
6d30: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
6d40: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
6d50: 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 65 6c 73 65  *.    **  --else
6d60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
6d70: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6e 20  his command can 
6d80: 6f 6e 6c 79 20 62 65 20 65 6e 63 6f 75 6e 74 65  only be encounte
6d90: 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79  red if currently
6da0: 20 69 6e 73 69 64 65 20 61 6e 20 2d 2d 69 66 20   inside an --if 
6db0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
6dc0: 72 75 65 2e 20 20 53 6b 69 70 20 66 6f 72 77 61  rue.  Skip forwa
6dd0: 72 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  rd to the next m
6de0: 61 74 63 68 69 6e 67 20 2d 2d 65 6e 64 69 66 2e  atching --endif.
6df0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6e00: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 65 6c  strcmp(zCmd, "el
6e10: 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  se")==0 ){.     
6e20: 20 69 69 20 2b 3d 20 66 69 6e 64 45 6e 64 69 66   ii += findEndif
6e30: 28 7a 53 63 72 69 70 74 2b 69 69 2b 6c 65 6e 2c  (zScript+ii+len,
6e40: 20 30 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20   0, &lineno);.  
6e50: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a    }else..    /*.
6e60: 20 20 20 20 2a 2a 20 20 2d 2d 65 6e 64 69 66 0a      **  --endif.
6e70: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
6e80: 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6e 20 6f  is command can o
6e90: 6e 6c 79 20 62 65 20 65 6e 63 6f 75 6e 74 65 72  nly be encounter
6ea0: 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ed if currently 
6eb0: 69 6e 73 69 64 65 20 61 6e 20 2d 2d 69 66 20 74  inside an --if t
6ec0: 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 72  hat.    ** is tr
6ed0: 75 65 20 6f 72 20 61 6e 20 2d 2d 65 6c 73 65 20  ue or an --else 
6ee0: 6f 66 20 61 20 66 61 6c 73 65 20 69 66 2e 20 20  of a false if.  
6ef0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  This is a no-op.
6f00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6f10: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 65 6e  strcmp(zCmd, "en
6f20: 64 69 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  dif")==0 ){.    
6f30: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
6f40: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a    }else..    /*.
6f50: 20 20 20 20 2a 2a 20 20 2d 2d 73 74 61 72 74 20      **  --start 
6f60: 43 4c 49 45 4e 54 0a 20 20 20 20 2a 2a 0a 20 20  CLIENT.    **.  
6f70: 20 20 2a 2a 20 53 74 61 72 74 20 75 70 20 74 68    ** Start up th
6f80: 65 20 67 69 76 65 6e 20 63 6c 69 65 6e 74 2e 0a  e given client..
6f90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
6fa0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73 74 61  trcmp(zCmd, "sta
6fb0: 72 74 22 29 3d 3d 30 20 26 26 20 69 43 6c 69 65  rt")==0 && iClie
6fc0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  nt==0 ){.      i
6fd0: 6e 74 20 69 4e 65 77 43 6c 69 65 6e 74 20 3d 20  nt iNewClient = 
6fe0: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  atoi(azArg[0]);.
6ff0: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 43 6c        if( iNewCl
7000: 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  ient>0 ){.      
7010: 20 20 73 74 61 72 74 43 6c 69 65 6e 74 28 69 4e    startClient(iN
7020: 65 77 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 20  ewClient);.     
7030: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
7040: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 77    /*.    **  --w
7050: 61 69 74 20 43 4c 49 45 4e 54 20 54 49 4d 45 4f  ait CLIENT TIMEO
7060: 55 54 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  UT.    **.    **
7070: 20 57 61 69 74 20 75 6e 74 69 6c 20 61 6c 6c 20   Wait until all 
7080: 74 61 73 6b 73 20 63 6f 6d 70 6c 65 74 65 20 66  tasks complete f
7090: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 6c 69  or the given cli
70a0: 65 6e 74 2e 20 20 49 66 20 43 4c 49 45 4e 54 20  ent.  If CLIENT 
70b0: 69 73 0a 20 20 20 20 2a 2a 20 22 61 6c 6c 22 20  is.    ** "all" 
70c0: 74 68 65 6e 20 77 61 69 74 20 66 6f 72 20 61 6c  then wait for al
70d0: 6c 20 63 6c 69 65 6e 74 73 20 74 6f 20 63 6f 6d  l clients to com
70e0: 70 6c 65 74 65 2e 20 20 57 61 69 74 20 6e 6f 20  plete.  Wait no 
70f0: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20 20  longer than.    
7100: 2a 2a 20 54 49 4d 45 4f 55 54 20 6d 69 6c 6c 69  ** TIMEOUT milli
7110: 73 65 63 6f 6e 64 73 20 28 64 65 66 61 75 6c 74  seconds (default
7120: 20 31 30 2c 30 30 30 29 0a 20 20 20 20 2a 2f 0a   10,000).    */.
7130: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
7140: 43 6d 64 2c 20 22 77 61 69 74 22 29 3d 3d 30 20  Cmd, "wait")==0 
7150: 26 26 20 69 43 6c 69 65 6e 74 3d 3d 30 20 29 7b  && iClient==0 ){
7160: 0a 20 20 20 20 20 20 69 6e 74 20 69 54 69 6d 65  .      int iTime
7170: 6f 75 74 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20  out = nArg>=2 ? 
7180: 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 20 3a  atoi(azArg[1]) :
7190: 20 31 30 30 30 30 3b 0a 20 20 20 20 20 20 73 71   10000;.      sq
71a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
71b0: 69 7a 65 6f 66 28 7a 45 72 72 6f 72 29 2c 7a 45  izeof(zError),zE
71c0: 72 72 6f 72 2c 22 6c 69 6e 65 20 25 64 20 6f 66  rror,"line %d of
71d0: 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
71f0: 72 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61  revLine, zFilena
7200: 6d 65 29 3b 0a 20 20 20 20 20 20 77 61 69 74 46  me);.      waitF
7210: 6f 72 43 6c 69 65 6e 74 28 61 74 6f 69 28 61 7a  orClient(atoi(az
7220: 41 72 67 5b 30 5d 29 2c 20 69 54 69 6d 65 6f 75  Arg[0]), iTimeou
7230: 74 2c 20 7a 45 72 72 6f 72 29 3b 0a 20 20 20 20  t, zError);.    
7240: 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20  }else..    /*.  
7250: 20 20 2a 2a 20 20 2d 2d 74 61 73 6b 20 43 4c 49    **  --task CLI
7260: 45 4e 54 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c  ENT.    **     <
7270: 74 61 73 6b 2d 63 6f 6e 74 65 6e 74 2d 68 65 72  task-content-her
7280: 65 3e 0a 20 20 20 20 2a 2a 20 20 2d 2d 65 6e 64  e>.    **  --end
7290: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
72a0: 73 73 69 67 6e 20 77 6f 72 6b 20 74 6f 20 61 20  ssign work to a 
72b0: 63 6c 69 65 6e 74 2e 20 20 53 74 61 72 74 20 74  client.  Start t
72c0: 68 65 20 63 6c 69 65 6e 74 20 69 66 20 69 74 20  he client if it 
72d0: 69 73 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 0a 20  is not running. 
72e0: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
72f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
7300: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 61 73 6b  rcmp(zCmd, "task
7310: 22 29 3d 3d 30 20 26 26 20 69 43 6c 69 65 6e 74  ")==0 && iClient
7320: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
7330: 20 69 54 61 72 67 65 74 20 3d 20 61 74 6f 69 28   iTarget = atoi(
7340: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
7350: 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20 20 20   int iEnd;.     
7360: 20 63 68 61 72 20 2a 7a 54 61 73 6b 3b 0a 20 20   char *zTask;.  
7370: 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
7380: 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 66  ;.      iEnd = f
7390: 69 6e 64 45 6e 64 28 7a 53 63 72 69 70 74 2b 69  indEnd(zScript+i
73a0: 69 2b 6c 65 6e 2c 20 26 6c 69 6e 65 6e 6f 29 3b  i+len, &lineno);
73b0: 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 72 67  .      if( iTarg
73c0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  et<0 ){.        
73d0: 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 6c 69  errorMessage("li
73e0: 6e 65 20 25 64 20 6f 66 20 25 73 3a 20 62 61 64  ne %d of %s: bad
73f0: 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72 3a 20   client number: 
7400: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
7410: 20 20 20 20 20 20 20 20 20 20 70 72 65 76 4c 69            prevLi
7420: 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ne, zFilename, i
7430: 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  Target);.      }
7440: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
7450: 61 73 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ask = sqlite3_mp
7460: 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 45  rintf("%.*s", iE
7470: 6e 64 2c 20 7a 53 63 72 69 70 74 2b 69 69 2b 6c  nd, zScript+ii+l
7480: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  en);.        if(
7490: 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 20   nArg>1 ){.     
74a0: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71       zTName = sq
74b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
74c0: 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  s", azArg[1]);. 
74d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
74e0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
74f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
7500: 28 22 25 73 3a 25 64 22 2c 20 66 69 6c 65 6e 61  ("%s:%d", filena
7510: 6d 65 54 61 69 6c 28 7a 46 69 6c 65 6e 61 6d 65  meTail(zFilename
7520: 29 2c 20 70 72 65 76 4c 69 6e 65 29 3b 0a 20 20  ), prevLine);.  
7530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7540: 73 74 61 72 74 43 6c 69 65 6e 74 28 69 54 61 72  startClient(iTar
7550: 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 75  get);.        ru
7560: 6e 53 71 6c 28 22 49 4e 53 45 52 54 20 49 4e 54  nSql("INSERT INT
7570: 4f 20 74 61 73 6b 28 63 6c 69 65 6e 74 2c 73 63  O task(client,sc
7580: 72 69 70 74 2c 6e 61 6d 65 29 22 0a 20 20 20 20  ript,name)".    
7590: 20 20 20 20 20 20 20 20 20 20 20 22 20 56 41 4c             " VAL
75a0: 55 45 53 28 25 64 2c 27 25 71 27 2c 25 51 29 22  UES(%d,'%q',%Q)"
75b0: 2c 20 69 54 61 72 67 65 74 2c 20 7a 54 61 73 6b  , iTarget, zTask
75c0: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
75d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
75e0: 7a 54 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20  zTask);.        
75f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e  sqlite3_free(zTN
7600: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
7610: 20 20 20 20 69 45 6e 64 20 2b 3d 20 74 6f 6b 65      iEnd += toke
7620: 6e 4c 65 6e 67 74 68 28 7a 53 63 72 69 70 74 2b  nLength(zScript+
7630: 69 69 2b 6c 65 6e 2b 69 45 6e 64 2c 20 26 6c 69  ii+len+iEnd, &li
7640: 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 6c 65 6e  neno);.      len
7650: 20 2b 3d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20   += iEnd;.      
7660: 69 42 65 67 69 6e 20 3d 20 69 69 2b 6c 65 6e 3b  iBegin = ii+len;
7670: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
7680: 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 62 72 65  /*.    **  --bre
7690: 61 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 0a 20  akpoint.    **. 
76a0: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61     ** This comma
76b0: 6e 64 20 63 61 6c 6c 73 20 22 74 65 73 74 5f 62  nd calls "test_b
76c0: 72 65 61 6b 70 6f 69 6e 74 28 29 22 20 77 68 69  reakpoint()" whi
76d0: 63 68 20 69 73 20 61 20 72 6f 75 74 69 6e 65 20  ch is a routine 
76e0: 70 72 6f 76 69 64 65 64 0a 20 20 20 20 2a 2a 20  provided.    ** 
76f0: 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  as a convenient 
7700: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 64  place to set a d
7710: 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69  ebugger breakpoi
7720: 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nt..    */.    i
7730: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
7740: 22 62 72 65 61 6b 70 6f 69 6e 74 22 29 3d 3d 30  "breakpoint")==0
7750: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 5f 62   ){.      test_b
7760: 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 20  reakpoint();.   
7770: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20   }else..    /*. 
7780: 20 20 20 2a 2a 20 20 2d 2d 73 68 6f 77 2d 73 71     **  --show-sq
7790: 6c 2d 65 72 72 6f 72 73 20 42 4f 4f 4c 45 41 4e  l-errors BOOLEAN
77a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
77b0: 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 53  urn display of S
77c0: 51 4c 20 65 72 72 6f 72 73 20 6f 6e 20 61 6e 64  QL errors on and
77d0: 20 6f 66 66 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   off..    */.   
77e0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
77f0: 2c 20 22 73 68 6f 77 2d 73 71 6c 2d 65 72 72 6f  , "show-sql-erro
7800: 72 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rs")==0 ){.     
7810: 20 67 2e 62 49 67 6e 6f 72 65 53 71 6c 45 72 72   g.bIgnoreSqlErr
7820: 6f 72 73 20 3d 20 6e 41 72 67 3e 3d 31 20 3f 20  ors = nArg>=1 ? 
7830: 21 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a  !booleanValue(az
7840: 41 72 67 5b 30 5d 29 20 3a 20 31 3b 0a 20 20 20  Arg[0]) : 1;.   
7850: 20 7d 65 6c 73 65 0a 0a 0a 20 20 20 20 2f 2a 20   }else...    /* 
7860: 65 72 72 6f 72 20 2a 2f 7b 0a 20 20 20 20 20 20  error */{.      
7870: 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 6c 69  errorMessage("li
7880: 6e 65 20 25 64 20 6f 66 20 25 73 3a 20 75 6e 6b  ne %d of %s: unk
7890: 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 2d 2d 25  nown command --%
78a0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
78b0: 20 20 20 20 20 20 20 70 72 65 76 4c 69 6e 65 2c         prevLine,
78c0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 43 6d 64   zFilename, zCmd
78d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 69 20  );.    }.    ii 
78e0: 2b 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  += len;.  }.  if
78f0: 28 20 69 42 65 67 69 6e 3c 69 69 20 29 7b 0a 20  ( iBegin<ii ){. 
7900: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
7910: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7920: 22 25 2e 2a 73 22 2c 20 69 69 2d 69 42 65 67 69  "%.*s", ii-iBegi
7930: 6e 2c 20 7a 53 63 72 69 70 74 2b 69 42 65 67 69  n, zScript+iBegi
7940: 6e 29 3b 0a 20 20 20 20 72 75 6e 53 71 6c 28 7a  n);.    runSql(z
7950: 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sql);.    sqlite
7960: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
7970: 7d 0a 20 20 73 74 72 69 6e 67 46 72 65 65 28 26  }.  stringFree(&
7980: 73 52 65 73 75 6c 74 29 3b 0a 7d 0a 0a 2f 2a 0a  sResult);.}../*.
7990: 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 20 63 6f  ** Look for a co
79a0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
79b0: 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c 20  n.  If present, 
79c0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
79d0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
79e0: 20 69 66 20 6d 69 73 73 69 6e 67 2e 0a 2a 2a 0a   if missing..**.
79f0: 2a 2a 20 68 61 73 41 72 67 3d 3d 30 20 6d 65 61  ** hasArg==0 mea
7a00: 6e 73 20 74 68 65 20 6f 70 74 69 6f 6e 20 69 73  ns the option is
7a10: 20 61 20 66 6c 61 67 2e 20 20 49 74 20 69 73 20   a flag.  It is 
7a20: 65 69 74 68 65 72 20 70 72 65 73 65 6e 74 20 6f  either present o
7a30: 72 20 6e 6f 74 2e 0a 2a 2a 20 68 61 73 41 72 67  r not..** hasArg
7a40: 3d 3d 31 20 6d 65 61 6e 73 20 74 68 65 20 6f 70  ==1 means the op
7a50: 74 69 6f 6e 20 68 61 73 20 61 6e 20 61 72 67 75  tion has an argu
7a60: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
7a70: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
7a80: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
7a90: 74 61 74 69 63 20 63 68 61 72 20 2a 66 69 6e 64  tatic char *find
7aa0: 4f 70 74 69 6f 6e 28 0a 20 20 63 68 61 72 20 2a  Option(.  char *
7ab0: 2a 61 7a 41 72 67 2c 0a 20 20 69 6e 74 20 2a 70  *azArg,.  int *p
7ac0: 6e 41 72 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68  nArg,.  const ch
7ad0: 61 72 20 2a 7a 4f 70 74 69 6f 6e 2c 0a 20 20 69  ar *zOption,.  i
7ae0: 6e 74 20 68 61 73 41 72 67 0a 29 7b 0a 20 20 69  nt hasArg.){.  i
7af0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
7b00: 2a 7a 52 65 74 75 72 6e 20 3d 20 30 3b 0a 20 20  *zReturn = 0;.  
7b10: 69 6e 74 20 6e 41 72 67 20 3d 20 2a 70 6e 41 72  int nArg = *pnAr
7b20: 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 68 61  g;..  assert( ha
7b30: 73 41 72 67 3d 3d 30 20 7c 7c 20 68 61 73 41 72  sArg==0 || hasAr
7b40: 67 3d 3d 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  g==1 );.  for(i=
7b50: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
7b60: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7b70: 2a 7a 3b 0a 20 20 20 20 69 66 28 20 69 2b 68 61  *z;.    if( i+ha
7b80: 73 41 72 67 20 3e 3d 20 6e 41 72 67 20 29 20 62  sArg >= nArg ) b
7b90: 72 65 61 6b 3b 0a 20 20 20 20 7a 20 3d 20 61 7a  reak;.    z = az
7ba0: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Arg[i];.    if( 
7bb0: 7a 5b 30 5d 21 3d 27 2d 27 20 29 20 63 6f 6e 74  z[0]!='-' ) cont
7bc0: 69 6e 75 65 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  inue;.    z++;. 
7bd0: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
7be0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
7bf0: 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  1]==0 ) break;. 
7c00: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a       z++;.    }.
7c10: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
7c20: 2c 7a 4f 70 74 69 6f 6e 29 3d 3d 30 20 29 7b 0a  ,zOption)==0 ){.
7c30: 20 20 20 20 20 20 69 66 28 20 68 61 73 41 72 67        if( hasArg
7c40: 20 26 26 20 69 3d 3d 6e 41 72 67 2d 31 20 29 7b   && i==nArg-1 ){
7c50: 0a 20 20 20 20 20 20 20 20 66 61 74 61 6c 45 72  .        fatalEr
7c60: 72 6f 72 28 22 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  ror("command-lin
7c70: 65 20 6f 70 74 69 6f 6e 20 5c 22 2d 2d 25 73 5c  e option \"--%s\
7c80: 22 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  " requires an ar
7c90: 67 75 6d 65 6e 74 22 2c 20 7a 29 3b 0a 20 20 20  gument", z);.   
7ca0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 68     }.      if( h
7cb0: 61 73 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  asArg ){.       
7cc0: 20 7a 52 65 74 75 72 6e 20 3d 20 61 7a 41 72 67   zReturn = azArg
7cd0: 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  [i+1];.      }el
7ce0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
7cf0: 75 72 6e 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a  urn = azArg[i];.
7d00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
7d10: 3d 20 69 2b 31 2b 28 68 61 73 41 72 67 21 3d 30  = i+1+(hasArg!=0
7d20: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
7d30: 6a 3c 6e 41 72 67 20 29 20 61 7a 41 72 67 5b 69  j<nArg ) azArg[i
7d40: 2b 2b 5d 20 3d 20 61 7a 41 72 67 5b 6a 2b 2b 5d  ++] = azArg[j++]
7d50: 3b 0a 20 20 20 20 20 20 2a 70 6e 41 72 67 20 3d  ;.      *pnArg =
7d60: 20 69 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   i;.      return
7d70: 20 7a 52 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a   zReturn;.    }.
7d80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
7d90: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  turn;.}../* Prin
7da0: 74 20 61 20 75 73 61 67 65 20 6d 65 73 73 61 67  t a usage messag
7db0: 65 20 66 6f 72 20 74 68 65 20 70 72 6f 67 72 61  e for the progra
7dc0: 6d 20 61 6e 64 20 65 78 69 74 20 2a 2f 0a 73 74  m and exit */.st
7dd0: 61 74 69 63 20 76 6f 69 64 20 75 73 61 67 65 28  atic void usage(
7de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67 76  const char *argv
7df0: 30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  0){.  int i;.  c
7e00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
7e10: 20 3d 20 61 72 67 76 30 3b 0a 20 20 66 6f 72 28   = argv0;.  for(
7e20: 69 3d 30 3b 20 61 72 67 76 30 5b 69 5d 3b 20 69  i=0; argv0[i]; i
7e30: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44  ++){.    if( isD
7e40: 69 72 53 65 70 28 61 72 67 76 30 5b 69 5d 29 20  irSep(argv0[i]) 
7e50: 29 20 7a 54 61 69 6c 20 3d 20 61 72 67 76 30 2b  ) zTail = argv0+
7e60: 69 2b 31 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  i+1;.  }.  fprin
7e70: 74 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65  tf(stderr,"Usage
7e80: 3a 20 25 73 20 44 41 54 41 42 41 53 45 20 3f 4f  : %s DATABASE ?O
7e90: 50 54 49 4f 4e 53 3f 20 3f 53 43 52 49 50 54 3f  PTIONS? ?SCRIPT?
7ea0: 5c 6e 22 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 66  \n", zTail);.  f
7eb0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
7ec0: 20 20 20 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a     "Options:\n".
7ed0: 20 20 20 20 22 20 20 20 2d 2d 65 72 72 6c 6f 67      "   --errlog
7ee0: 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20   FILENAME       
7ef0: 20 20 20 20 57 72 69 74 65 20 65 72 72 6f 72 73      Write errors
7f00: 20 74 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a   to FILENAME\n".
7f10: 20 20 20 20 22 20 20 20 2d 2d 6a 6f 75 72 6e 61      "   --journa
7f20: 6c 6d 6f 64 65 20 4d 4f 44 45 20 20 20 20 20 20  lmode MODE      
7f30: 20 20 20 20 55 73 65 20 4d 4f 44 45 20 61 73 20      Use MODE as 
7f40: 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
7f50: 5c 6e 22 0a 20 20 20 20 22 20 20 20 2d 2d 6c 6f  \n".    "   --lo
7f60: 67 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20  g FILENAME      
7f70: 20 20 20 20 20 20 20 20 4c 6f 67 20 6d 65 73 73          Log mess
7f80: 61 67 65 73 20 74 6f 20 46 49 4c 45 4e 41 4d 45  ages to FILENAME
7f90: 5c 6e 22 0a 20 20 20 20 22 20 20 20 2d 2d 71 75  \n".    "   --qu
7fa0: 69 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  iet             
7fb0: 20 20 20 20 20 20 20 20 53 75 70 70 72 65 73 73          Suppress
7fc0: 20 75 6e 6e 65 63 65 73 73 61 72 79 20 6f 75 74   unnecessary out
7fd0: 70 75 74 5c 6e 22 0a 20 20 20 20 22 20 20 20 2d  put\n".    "   -
7fe0: 2d 76 66 73 20 4e 41 4d 45 20 20 20 20 20 20 20  -vfs NAME       
7ff0: 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 4e             Use N
8000: 41 4d 45 20 61 73 20 74 68 65 20 56 46 53 5c 6e  AME as the VFS\n
8010: 22 0a 20 20 20 20 22 20 20 20 2d 2d 72 65 70 65  ".    "   --repe
8020: 61 74 20 4e 20 20 20 20 20 20 20 20 20 20 20 20  at N            
8030: 20 20 20 20 20 20 52 65 70 65 61 74 20 74 68 65        Repeat the
8040: 20 74 65 73 74 20 4e 20 74 69 6d 65 73 5c 6e 22   test N times\n"
8050: 0a 20 20 20 20 22 20 20 20 2d 2d 73 71 6c 74 72  .    "   --sqltr
8060: 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ace             
8070: 20 20 20 20 20 45 6e 61 62 6c 65 20 53 51 4c 20       Enable SQL 
8080: 74 72 61 63 69 6e 67 5c 6e 22 0a 20 20 20 20 22  tracing\n".    "
8090: 20 20 20 2d 2d 73 79 6e 63 20 20 20 20 20 20 20     --sync       
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
80b0: 6e 61 62 6c 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nable synchronou
80c0: 73 20 64 69 73 6b 20 77 72 69 74 65 73 5c 6e 22  s disk writes\n"
80d0: 0a 20 20 20 20 22 20 20 20 2d 2d 74 69 6d 65 6f  .    "   --timeo
80e0: 75 74 20 4d 49 4c 4c 49 53 45 43 20 20 20 20 20  ut MILLISEC     
80f0: 20 20 20 20 20 42 75 73 79 20 74 69 6d 65 6f 75       Busy timeou
8100: 74 20 69 73 20 4d 49 4c 4c 49 53 45 43 5c 6e 22  t is MILLISEC\n"
8110: 0a 20 20 20 20 22 20 20 20 2d 2d 74 72 61 63 65  .    "   --trace
8120: 20 42 4f 4f 4c 45 41 4e 20 20 20 20 20 20 20 20   BOOLEAN        
8130: 20 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64       Enable or d
8140: 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67 5c 6e  isable tracing\n
8150: 22 0a 20 20 29 3b 0a 20 20 65 78 69 74 28 31 29  ".  );.  exit(1)
8160: 3b 0a 7d 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 6f  ;.}../* Report o
8170: 6e 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 61  n unrecognized a
8180: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 73 74 61 74  rguments */.stat
8190: 69 63 20 76 6f 69 64 20 75 6e 72 65 63 6f 67 6e  ic void unrecogn
81a0: 69 7a 65 64 41 72 67 75 6d 65 6e 74 73 28 0a 20  izedArguments(. 
81b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67   const char *arg
81c0: 76 30 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  v0,.  int nArg,.
81d0: 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 0a 29    char **azArg.)
81e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 70 72  {.  int i;.  fpr
81f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
8200: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 61 72   unrecognized ar
8210: 67 75 6d 65 6e 74 73 3a 22 2c 20 61 72 67 76 30  guments:", argv0
8220: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
8230: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
8240: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
8250: 20 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b   %s", azArg[i]);
8260: 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 73  .  }.  fprintf(s
8270: 74 64 65 72 72 2c 22 5c 6e 22 29 3b 0a 20 20 65  tderr,"\n");.  e
8280: 78 69 74 28 31 29 3b 0a 7d 0a 0a 69 6e 74 20 53  xit(1);.}..int S
8290: 51 4c 49 54 45 5f 43 44 45 43 4c 20 6d 61 69 6e  QLITE_CDECL main
82a0: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
82b0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
82c0: 20 63 68 61 72 20 2a 7a 43 6c 69 65 6e 74 3b 0a   char *zClient;.
82d0: 20 20 69 6e 74 20 69 43 6c 69 65 6e 74 3b 0a 20    int iClient;. 
82e0: 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 69 6e 74   int n, i;.  int
82f0: 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 53 51 4c   openFlags = SQL
8300: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
8310: 54 45 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  TE;.  int rc;.  
8320: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20  char *zScript;. 
8330: 20 69 6e 74 20 74 61 73 6b 49 64 3b 0a 20 20 63   int taskId;.  c
8340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 72 61 63  onst char *zTrac
8350: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
8360: 2a 7a 43 4f 70 74 69 6f 6e 3b 0a 20 20 63 6f 6e  *zCOption;.  con
8370: 73 74 20 63 68 61 72 20 2a 7a 4a 4d 6f 64 65 3b  st char *zJMode;
8380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8390: 4e 52 65 70 3b 0a 20 20 69 6e 74 20 6e 52 65 70  NRep;.  int nRep
83a0: 20 3d 20 31 2c 20 69 52 65 70 3b 0a 20 20 69 6e   = 1, iRep;.  in
83b0: 74 20 69 54 6d 6f 75 74 20 3d 20 30 3b 20 20 20  t iTmout = 0;   
83c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
83d0: 66 61 75 6c 74 3a 20 6e 6f 20 74 69 6d 65 6f 75  fault: no timeou
83e0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
83f0: 72 20 2a 7a 54 6d 6f 75 74 3b 0a 0a 20 20 67 2e  r *zTmout;..  g.
8400: 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b  argv0 = argv[0];
8410: 0a 20 20 67 2e 69 54 72 61 63 65 20 3d 20 31 3b  .  g.iTrace = 1;
8420: 0a 20 20 69 66 28 20 61 72 67 63 3c 32 20 29 20  .  if( argc<2 ) 
8430: 75 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a  usage(argv[0]);.
8440: 20 20 67 2e 7a 44 62 46 69 6c 65 20 3d 20 61 72    g.zDbFile = ar
8450: 67 76 5b 31 5d 3b 0a 20 20 69 66 28 20 73 74 72  gv[1];.  if( str
8460: 67 6c 6f 62 28 22 2a 2e 74 65 73 74 22 2c 20 67  glob("*.test", g
8470: 2e 7a 44 62 46 69 6c 65 29 20 29 20 75 73 61 67  .zDbFile) ) usag
8480: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  e(argv[0]);.  if
8490: 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33  ( strcmp(sqlite3
84a0: 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 53 51 4c  _sourceid(), SQL
84b0: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 29 21 3d  ITE_SOURCE_ID)!=
84c0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
84d0: 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74 65  (stderr, "SQLite
84e0: 20 6c 69 62 72 61 72 79 20 61 6e 64 20 68 65 61   library and hea
84f0: 64 65 72 20 6d 69 73 6d 61 74 63 68 5c 6e 22 0a  der mismatch\n".
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 22 4c 69 62 72 61 72 79 3a 20 25 73      "Library: %s
8520: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
8530: 20 20 20 20 20 20 20 20 22 48 65 61 64 65 72 3a          "Header:
8540: 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %s\n",.       
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8560: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
8570: 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49   SQLITE_SOURCE_I
8580: 44 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  D);.    exit(1);
8590: 0a 20 20 7d 0a 20 20 6e 20 3d 20 61 72 67 63 2d  .  }.  n = argc-
85a0: 32 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  2;.  sqlite3_snp
85b0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 67 2e 7a  rintf(sizeof(g.z
85c0: 4e 61 6d 65 29 2c 20 67 2e 7a 4e 61 6d 65 2c 20  Name), g.zName, 
85d0: 22 25 30 35 64 2e 6d 70 74 65 73 74 22 2c 20 47  "%05d.mptest", G
85e0: 45 54 50 49 44 28 29 29 3b 0a 20 20 7a 4a 4d 6f  ETPID());.  zJMo
85f0: 64 65 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28  de = findOption(
8600: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 6a 6f 75  argv+2, &n, "jou
8610: 72 6e 61 6c 6d 6f 64 65 22 2c 20 31 29 3b 0a 20  rnalmode", 1);. 
8620: 20 7a 4e 52 65 70 20 3d 20 66 69 6e 64 4f 70 74   zNRep = findOpt
8630: 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20  ion(argv+2, &n, 
8640: 22 72 65 70 65 61 74 22 2c 20 31 29 3b 0a 20 20  "repeat", 1);.  
8650: 69 66 28 20 7a 4e 52 65 70 20 29 20 6e 52 65 70  if( zNRep ) nRep
8660: 20 3d 20 61 74 6f 69 28 7a 4e 52 65 70 29 3b 0a   = atoi(zNRep);.
8670: 20 20 69 66 28 20 6e 52 65 70 3c 31 20 29 20 6e    if( nRep<1 ) n
8680: 52 65 70 20 3d 20 31 3b 0a 20 20 67 2e 7a 56 66  Rep = 1;.  g.zVf
8690: 73 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61  s = findOption(a
86a0: 72 67 76 2b 32 2c 20 26 6e 2c 20 22 76 66 73 22  rgv+2, &n, "vfs"
86b0: 2c 20 31 29 3b 0a 20 20 7a 43 6c 69 65 6e 74 20  , 1);.  zClient 
86c0: 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67  = findOption(arg
86d0: 76 2b 32 2c 20 26 6e 2c 20 22 63 6c 69 65 6e 74  v+2, &n, "client
86e0: 22 2c 20 31 29 3b 0a 20 20 67 2e 7a 45 72 72 4c  ", 1);.  g.zErrL
86f0: 6f 67 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28  og = findOption(
8700: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 65 72 72  argv+2, &n, "err
8710: 6c 6f 67 22 2c 20 31 29 3b 0a 20 20 67 2e 7a 4c  log", 1);.  g.zL
8720: 6f 67 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28  og = findOption(
8730: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 6c 6f 67  argv+2, &n, "log
8740: 22 2c 20 31 29 3b 0a 20 20 7a 54 72 61 63 65 20  ", 1);.  zTrace 
8750: 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67  = findOption(arg
8760: 76 2b 32 2c 20 26 6e 2c 20 22 74 72 61 63 65 22  v+2, &n, "trace"
8770: 2c 20 31 29 3b 0a 20 20 69 66 28 20 7a 54 72 61  , 1);.  if( zTra
8780: 63 65 20 29 20 67 2e 69 54 72 61 63 65 20 3d 20  ce ) g.iTrace = 
8790: 61 74 6f 69 28 7a 54 72 61 63 65 29 3b 0a 20 20  atoi(zTrace);.  
87a0: 69 66 28 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61  if( findOption(a
87b0: 72 67 76 2b 32 2c 20 26 6e 2c 20 22 71 75 69 65  rgv+2, &n, "quie
87c0: 74 22 2c 20 30 29 21 3d 30 20 29 20 67 2e 69 54  t", 0)!=0 ) g.iT
87d0: 72 61 63 65 20 3d 20 30 3b 0a 20 20 7a 54 6d 6f  race = 0;.  zTmo
87e0: 75 74 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28  ut = findOption(
87f0: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 74 69 6d  argv+2, &n, "tim
8800: 65 6f 75 74 22 2c 20 31 29 3b 0a 20 20 69 66 28  eout", 1);.  if(
8810: 20 7a 54 6d 6f 75 74 20 29 20 69 54 6d 6f 75 74   zTmout ) iTmout
8820: 20 3d 20 61 74 6f 69 28 7a 54 6d 6f 75 74 29 3b   = atoi(zTmout);
8830: 0a 20 20 67 2e 62 53 71 6c 54 72 61 63 65 20 3d  .  g.bSqlTrace =
8840: 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76   findOption(argv
8850: 2b 32 2c 20 26 6e 2c 20 22 73 71 6c 74 72 61 63  +2, &n, "sqltrac
8860: 65 22 2c 20 30 29 21 3d 30 3b 0a 20 20 67 2e 62  e", 0)!=0;.  g.b
8870: 53 79 6e 63 20 3d 20 66 69 6e 64 4f 70 74 69 6f  Sync = findOptio
8880: 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 73  n(argv+2, &n, "s
8890: 79 6e 63 22 2c 20 30 29 21 3d 30 3b 0a 20 20 69  ync", 0)!=0;.  i
88a0: 66 28 20 67 2e 7a 45 72 72 4c 6f 67 20 29 7b 0a  f( g.zErrLog ){.
88b0: 20 20 20 20 67 2e 70 45 72 72 4c 6f 67 20 3d 20      g.pErrLog = 
88c0: 66 6f 70 65 6e 28 67 2e 7a 45 72 72 4c 6f 67 2c  fopen(g.zErrLog,
88d0: 20 22 61 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   "a");.  }else{.
88e0: 20 20 20 20 67 2e 70 45 72 72 4c 6f 67 20 3d 20      g.pErrLog = 
88f0: 73 74 64 65 72 72 3b 0a 20 20 7d 0a 20 20 69 66  stderr;.  }.  if
8900: 28 20 67 2e 7a 4c 6f 67 20 29 7b 0a 20 20 20 20  ( g.zLog ){.    
8910: 67 2e 70 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 67  g.pLog = fopen(g
8920: 2e 7a 4c 6f 67 2c 20 22 61 22 29 3b 0a 20 20 7d  .zLog, "a");.  }
8930: 65 6c 73 65 7b 0a 20 20 20 20 67 2e 70 4c 6f 67  else{.    g.pLog
8940: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 20   = stdout;.  }. 
8950: 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66   .  sqlite3_conf
8960: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
8970: 5f 4c 4f 47 2c 20 73 71 6c 45 72 72 6f 72 43 61  _LOG, sqlErrorCa
8980: 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 69 66  llback, 0);.  if
8990: 28 20 7a 43 6c 69 65 6e 74 20 29 7b 0a 20 20 20  ( zClient ){.   
89a0: 20 69 43 6c 69 65 6e 74 20 3d 20 61 74 6f 69 28   iClient = atoi(
89b0: 7a 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 69 66  zClient);.    if
89c0: 28 20 69 43 6c 69 65 6e 74 3c 31 20 29 20 66 61  ( iClient<1 ) fa
89d0: 74 61 6c 45 72 72 6f 72 28 22 69 6c 6c 65 67 61  talError("illega
89e0: 6c 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72 3a  l client number:
89f0: 20 25 64 5c 6e 22 2c 20 69 43 6c 69 65 6e 74 29   %d\n", iClient)
8a00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
8a10: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 67 2e  printf(sizeof(g.
8a20: 7a 4e 61 6d 65 29 2c 20 67 2e 7a 4e 61 6d 65 2c  zName), g.zName,
8a30: 20 22 25 30 35 64 2e 63 6c 69 65 6e 74 25 30 32   "%05d.client%02
8a40: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
8a50: 20 20 20 20 20 20 20 20 20 47 45 54 50 49 44 28           GETPID(
8a60: 29 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 7d  ), iClient);.  }
8a70: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 54  else{.    int nT
8a80: 72 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ry = 0;.    if( 
8a90: 67 2e 69 54 72 61 63 65 3e 30 20 29 7b 0a 20 20  g.iTrace>0 ){.  
8aa0: 20 20 20 20 70 72 69 6e 74 66 28 22 42 45 47 49      printf("BEGI
8ab0: 4e 3a 20 25 73 22 2c 20 61 72 67 76 5b 30 5d 29  N: %s", argv[0])
8ac0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
8ad0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 20 70 72   i<argc; i++) pr
8ae0: 69 6e 74 66 28 22 20 25 73 22 2c 20 61 72 67 76  intf(" %s", argv
8af0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  [i]);.      prin
8b00: 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tf("\n");.      
8b10: 70 72 69 6e 74 66 28 22 57 69 74 68 20 53 51 4c  printf("With SQL
8b20: 69 74 65 20 22 20 53 51 4c 49 54 45 5f 56 45 52  ite " SQLITE_VER
8b30: 53 49 4f 4e 20 22 20 22 20 53 51 4c 49 54 45 5f  SION " " SQLITE_
8b40: 53 4f 55 52 43 45 5f 49 44 20 22 5c 6e 22 20 29  SOURCE_ID "\n" )
8b50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
8b60: 20 28 7a 43 4f 70 74 69 6f 6e 20 3d 20 73 71 6c   (zCOption = sql
8b70: 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
8b80: 6f 6e 5f 67 65 74 28 69 29 29 21 3d 30 3b 20 69  on_get(i))!=0; i
8b90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  ++){.        pri
8ba0: 6e 74 66 28 22 2d 44 53 51 4c 49 54 45 5f 25 73  ntf("-DSQLITE_%s
8bb0: 5c 6e 22 2c 20 7a 43 4f 70 74 69 6f 6e 29 3b 0a  \n", zCOption);.
8bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 66        }.      ff
8bd0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
8be0: 20 20 7d 0a 20 20 20 20 69 43 6c 69 65 6e 74 20    }.    iClient 
8bf0: 3d 20 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  =  0;.    do{.  
8c00: 20 20 20 20 69 66 28 20 28 6e 54 72 79 25 35 29      if( (nTry%5)
8c10: 3d 3d 34 20 29 20 70 72 69 6e 74 66 28 22 2e 2e  ==4 ) printf("..
8c20: 2e 20 25 73 74 72 79 69 6e 67 20 74 6f 20 75 6e  . %strying to un
8c30: 6c 69 6e 6b 20 27 25 73 27 5c 6e 22 2c 0a 20 20  link '%s'\n",.  
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 54 72               nTr
8c60: 79 3e 35 20 3f 20 22 73 74 69 6c 6c 20 22 20 3a  y>5 ? "still " :
8c70: 20 22 22 2c 20 67 2e 7a 44 62 46 69 6c 65 29 3b   "", g.zDbFile);
8c80: 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 6c 69  .      rc = unli
8c90: 6e 6b 28 67 2e 7a 44 62 46 69 6c 65 29 3b 0a 20  nk(g.zDbFile);. 
8ca0: 20 20 20 20 20 69 66 28 20 72 63 20 26 26 20 65       if( rc && e
8cb0: 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 20 72  rrno==ENOENT ) r
8cc0: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  c = 0;.    }whil
8cd0: 65 28 20 72 63 21 3d 30 20 26 26 20 28 2b 2b 6e  e( rc!=0 && (++n
8ce0: 54 72 79 29 3c 36 30 20 26 26 20 73 71 6c 69 74  Try)<60 && sqlit
8cf0: 65 33 5f 73 6c 65 65 70 28 31 30 30 30 29 3e 30  e3_sleep(1000)>0
8d00: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
8d10: 30 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c  0 ){.      fatal
8d20: 45 72 72 6f 72 28 22 75 6e 61 62 6c 65 20 74 6f  Error("unable to
8d30: 20 75 6e 6c 69 6e 6b 20 27 25 73 27 20 61 66 74   unlink '%s' aft
8d40: 65 72 20 25 64 20 61 74 74 65 6d 70 74 73 5c 6e  er %d attempts\n
8d50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
8d60: 20 20 20 20 67 2e 7a 44 62 46 69 6c 65 2c 20 6e      g.zDbFile, n
8d70: 54 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Try);.    }.    
8d80: 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c  openFlags |= SQL
8d90: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
8da0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
8db0: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 67 2e 7a 44  te3_open_v2(g.zD
8dc0: 62 46 69 6c 65 2c 20 26 67 2e 64 62 2c 20 6f 70  bFile, &g.db, op
8dd0: 65 6e 46 6c 61 67 73 2c 20 67 2e 7a 56 66 73 29  enFlags, g.zVfs)
8de0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 66 61 74  ;.  if( rc ) fat
8df0: 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20  alError("cannot 
8e00: 6f 70 65 6e 20 5b 25 73 5d 22 2c 20 67 2e 7a 44  open [%s]", g.zD
8e10: 62 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 54  bFile);.  if( iT
8e20: 6d 6f 75 74 3e 30 20 29 20 73 71 6c 69 74 65 33  mout>0 ) sqlite3
8e30: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 67 2e  _busy_timeout(g.
8e40: 64 62 2c 20 69 54 6d 6f 75 74 29 3b 0a 20 20 0a  db, iTmout);.  .
8e50: 20 20 69 66 28 20 7a 4a 4d 6f 64 65 20 29 7b 0a    if( zJMode ){.
8e60: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
8e70: 33 32 29 0a 20 20 20 20 69 66 28 20 73 71 6c 69  32).    if( sqli
8e80: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4a 4d 6f  te3_stricmp(zJMo
8e90: 64 65 2c 22 70 65 72 73 69 73 74 22 29 3d 3d 30  de,"persist")==0
8ea0: 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
8eb0: 5f 73 74 72 69 63 6d 70 28 7a 4a 4d 6f 64 65 2c  _stricmp(zJMode,
8ec0: 22 74 72 75 6e 63 61 74 65 22 29 3d 3d 30 0a 20  "truncate")==0. 
8ed0: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e     ){.      prin
8ee0: 74 66 28 22 43 68 61 6e 67 69 6e 67 20 6a 6f 75  tf("Changing jou
8ef0: 72 6e 61 6c 20 6d 6f 64 65 20 74 6f 20 44 45 4c  rnal mode to DEL
8f00: 45 54 45 20 66 72 6f 6d 20 25 73 22 2c 20 7a 4a  ETE from %s", zJ
8f10: 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 7a 4a 4d  Mode);.      zJM
8f20: 6f 64 65 20 3d 20 22 44 45 4c 45 54 45 22 3b 0a  ode = "DELETE";.
8f30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8f40: 20 72 75 6e 53 71 6c 28 22 50 52 41 47 4d 41 20   runSql("PRAGMA 
8f50: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 51 3b  journal_mode=%Q;
8f60: 22 2c 20 7a 4a 4d 6f 64 65 29 3b 0a 20 20 7d 0a  ", zJMode);.  }.
8f70: 20 20 69 66 28 20 21 67 2e 62 53 79 6e 63 20 29    if( !g.bSync )
8f80: 20 74 72 79 53 71 6c 28 22 50 52 41 47 4d 41 20   trySql("PRAGMA 
8f90: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 22  synchronous=OFF"
8fa0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61  );.  sqlite3_ena
8fb0: 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
8fc0: 6f 6e 28 67 2e 64 62 2c 20 31 29 3b 0a 20 20 73  on(g.db, 1);.  s
8fd0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
8fe0: 6c 65 72 28 67 2e 64 62 2c 20 62 75 73 79 48 61  ler(g.db, busyHa
8ff0: 6e 64 6c 65 72 2c 20 30 29 3b 0a 20 20 73 71 6c  ndler, 0);.  sql
9000: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
9010: 74 69 6f 6e 28 67 2e 64 62 2c 20 22 76 66 73 6e  tion(g.db, "vfsn
9020: 61 6d 65 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  ame", 0, SQLITE_
9030: 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 20 20 20 76 66 73 4e 61 6d 65 46 75 6e 63 2c 20     vfsNameFunc, 
9060: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
9070: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
9080: 28 67 2e 64 62 2c 20 22 65 76 61 6c 22 2c 20 31  (g.db, "eval", 1
9090: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
90a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 65 76 61 6c              eval
90c0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 67  Func, 0, 0);.  g
90d0: 2e 69 54 69 6d 65 6f 75 74 20 3d 20 44 45 46 41  .iTimeout = DEFA
90e0: 55 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a 20 20 69  ULT_TIMEOUT;.  i
90f0: 66 28 20 67 2e 62 53 71 6c 54 72 61 63 65 20 29  f( g.bSqlTrace )
9100: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 67   sqlite3_trace(g
9110: 2e 64 62 2c 20 73 71 6c 54 72 61 63 65 43 61 6c  .db, sqlTraceCal
9120: 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28  lback, 0);.  if(
9130: 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20   iClient>0 ){.  
9140: 20 20 69 66 28 20 6e 3e 30 20 29 20 75 6e 72 65    if( n>0 ) unre
9150: 63 6f 67 6e 69 7a 65 64 41 72 67 75 6d 65 6e 74  cognizedArgument
9160: 73 28 61 72 67 76 5b 30 5d 2c 20 6e 2c 20 61 72  s(argv[0], n, ar
9170: 67 76 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 67  gv+2);.    if( g
9180: 2e 69 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73  .iTrace ) logMes
9190: 73 61 67 65 28 22 73 74 61 72 74 2d 63 6c 69 65  sage("start-clie
91a0: 6e 74 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  nt");.    while(
91b0: 31 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  1){.      char *
91c0: 7a 54 61 73 6b 4e 61 6d 65 20 3d 20 30 3b 0a 20  zTaskName = 0;. 
91d0: 20 20 20 20 20 72 63 20 3d 20 73 74 61 72 74 53       rc = startS
91e0: 63 72 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 26  cript(iClient, &
91f0: 7a 53 63 72 69 70 74 2c 20 26 74 61 73 6b 49 64  zScript, &taskId
9200: 2c 20 26 7a 54 61 73 6b 4e 61 6d 65 29 3b 0a 20  , &zTaskName);. 
9210: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
9220: 49 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b  ITE_DONE ) break
9230: 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69 54  ;.      if( g.iT
9240: 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67  race ) logMessag
9250: 65 28 22 62 65 67 69 6e 20 25 73 20 28 25 64 29  e("begin %s (%d)
9260: 22 2c 20 7a 54 61 73 6b 4e 61 6d 65 2c 20 74 61  ", zTaskName, ta
9270: 73 6b 49 64 29 3b 0a 20 20 20 20 20 20 72 75 6e  skId);.      run
9280: 53 63 72 69 70 74 28 69 43 6c 69 65 6e 74 2c 20  Script(iClient, 
9290: 74 61 73 6b 49 64 2c 20 7a 53 63 72 69 70 74 2c  taskId, zScript,
92a0: 20 7a 54 61 73 6b 4e 61 6d 65 29 3b 0a 20 20 20   zTaskName);.   
92b0: 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65 20     if( g.iTrace 
92c0: 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 65 6e  ) logMessage("en
92d0: 64 20 25 73 20 28 25 64 29 22 2c 20 7a 54 61 73  d %s (%d)", zTas
92e0: 6b 4e 61 6d 65 2c 20 74 61 73 6b 49 64 29 3b 0a  kName, taskId);.
92f0: 20 20 20 20 20 20 66 69 6e 69 73 68 53 63 72 69        finishScri
9300: 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73 6b  pt(iClient, task
9310: 49 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Id, 0);.      sq
9320: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 73 6b  lite3_free(zTask
9330: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
9340: 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a  ite3_sleep(10);.
9350: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e      }.    if( g.
9360: 69 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73  iTrace ) logMess
9370: 61 67 65 28 22 65 6e 64 2d 63 6c 69 65 6e 74 22  age("end-client"
9380: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9390: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
93a0: 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 54 69  tmt;.    int iTi
93b0: 6d 65 6f 75 74 3b 0a 20 20 20 20 69 66 28 20 6e  meout;.    if( n
93c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 61 74  ==0 ){.      fat
93d0: 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  alError("missing
93e0: 20 73 63 72 69 70 74 20 66 69 6c 65 6e 61 6d 65   script filename
93f0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
9400: 28 20 6e 3e 31 20 29 20 75 6e 72 65 63 6f 67 6e  ( n>1 ) unrecogn
9410: 69 7a 65 64 41 72 67 75 6d 65 6e 74 73 28 61 72  izedArguments(ar
9420: 67 76 5b 30 5d 2c 20 6e 2c 20 61 72 67 76 2b 32  gv[0], n, argv+2
9430: 29 3b 0a 20 20 20 20 72 75 6e 53 71 6c 28 0a 20  );.    runSql(. 
9440: 20 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45       "DROP TABLE
9450: 20 49 46 20 45 58 49 53 54 53 20 74 61 73 6b 3b   IF EXISTS task;
9460: 5c 6e 22 0a 20 20 20 20 20 20 22 44 52 4f 50 20  \n".      "DROP 
9470: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
9480: 63 6f 75 6e 74 65 72 73 3b 5c 6e 22 0a 20 20 20  counters;\n".   
9490: 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49     "DROP TABLE I
94a0: 46 20 45 58 49 53 54 53 20 63 6c 69 65 6e 74 3b  F EXISTS client;
94b0: 5c 6e 22 0a 20 20 20 20 20 20 22 43 52 45 41 54  \n".      "CREAT
94c0: 45 20 54 41 42 4c 45 20 74 61 73 6b 28 5c 6e 22  E TABLE task(\n"
94d0: 0a 20 20 20 20 20 20 22 20 20 69 64 20 49 4e 54  .      "  id INT
94e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
94f0: 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6e 61  ,\n".      "  na
9500: 6d 65 20 54 45 58 54 2c 5c 6e 22 0a 20 20 20 20  me TEXT,\n".    
9510: 20 20 22 20 20 63 6c 69 65 6e 74 20 49 4e 54 45    "  client INTE
9520: 47 45 52 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20  GER,\n".      " 
9530: 20 73 74 61 72 74 74 69 6d 65 20 44 41 54 45 2c   starttime DATE,
9540: 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 65 6e 64  \n".      "  end
9550: 74 69 6d 65 20 44 41 54 45 2c 5c 6e 22 0a 20 20  time DATE,\n".  
9560: 20 20 20 20 22 20 20 73 63 72 69 70 74 20 54 45      "  script TE
9570: 58 54 5c 6e 22 0a 20 20 20 20 20 20 22 29 3b 22  XT\n".      ");"
9580: 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49  .      "CREATE I
9590: 4e 44 45 58 20 74 61 73 6b 5f 69 31 20 4f 4e 20  NDEX task_i1 ON 
95a0: 74 61 73 6b 28 63 6c 69 65 6e 74 2c 20 73 74 61  task(client, sta
95b0: 72 74 74 69 6d 65 29 3b 5c 6e 22 0a 20 20 20 20  rttime);\n".    
95c0: 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20    "CREATE INDEX 
95d0: 74 61 73 6b 5f 69 32 20 4f 4e 20 74 61 73 6b 28  task_i2 ON task(
95e0: 63 6c 69 65 6e 74 2c 20 65 6e 64 74 69 6d 65 29  client, endtime)
95f0: 3b 5c 6e 22 0a 20 20 20 20 20 20 22 43 52 45 41  ;\n".      "CREA
9600: 54 45 20 54 41 42 4c 45 20 63 6f 75 6e 74 65 72  TE TABLE counter
9610: 73 28 6e 45 72 72 6f 72 2c 6e 54 65 73 74 29 3b  s(nError,nTest);
9620: 5c 6e 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  \n".      "INSER
9630: 54 20 49 4e 54 4f 20 63 6f 75 6e 74 65 72 73 20  T INTO counters 
9640: 56 41 4c 55 45 53 28 30 2c 30 29 3b 5c 6e 22 0a  VALUES(0,0);\n".
9650: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
9660: 42 4c 45 20 63 6c 69 65 6e 74 28 69 64 20 49 4e  BLE client(id IN
9670: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
9680: 59 2c 20 77 61 6e 74 48 61 6c 74 29 3b 5c 6e 22  Y, wantHalt);\n"
9690: 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 53 63 72  .    );.    zScr
96a0: 69 70 74 20 3d 20 72 65 61 64 46 69 6c 65 28 61  ipt = readFile(a
96b0: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 66 6f 72  rgv[2]);.    for
96c0: 28 69 52 65 70 3d 31 3b 20 69 52 65 70 3c 3d 6e  (iRep=1; iRep<=n
96d0: 52 65 70 3b 20 69 52 65 70 2b 2b 29 7b 0a 20 20  Rep; iRep++){.  
96e0: 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65      if( g.iTrace
96f0: 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 62   ) logMessage("b
9700: 65 67 69 6e 20 73 63 72 69 70 74 20 5b 25 73 5d  egin script [%s]
9710: 20 63 79 63 6c 65 20 25 64 5c 6e 22 2c 20 61 72   cycle %d\n", ar
9720: 67 76 5b 32 5d 2c 20 69 52 65 70 29 3b 0a 20 20  gv[2], iRep);.  
9730: 20 20 20 20 72 75 6e 53 63 72 69 70 74 28 30 2c      runScript(0,
9740: 20 30 2c 20 7a 53 63 72 69 70 74 2c 20 61 72 67   0, zScript, arg
9750: 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[2]);.      if(
9760: 20 67 2e 69 54 72 61 63 65 20 29 20 6c 6f 67 4d   g.iTrace ) logM
9770: 65 73 73 61 67 65 28 22 65 6e 64 20 73 63 72 69  essage("end scri
9780: 70 74 20 5b 25 73 5d 20 63 79 63 6c 65 20 25 64  pt [%s] cycle %d
9790: 5c 6e 22 2c 20 61 72 67 76 5b 32 5d 2c 20 69 52  \n", argv[2], iR
97a0: 65 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ep);.    }.    s
97b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 72  qlite3_free(zScr
97c0: 69 70 74 29 3b 0a 20 20 20 20 77 61 69 74 46 6f  ipt);.    waitFo
97d0: 72 43 6c 69 65 6e 74 28 30 2c 20 32 30 30 30 2c  rClient(0, 2000,
97e0: 20 22 64 75 72 69 6e 67 20 73 68 75 74 64 6f 77   "during shutdow
97f0: 6e 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 20 20 74 72  n...\n");.    tr
9800: 79 53 71 6c 28 22 55 50 44 41 54 45 20 63 6c 69  ySql("UPDATE cli
9810: 65 6e 74 20 53 45 54 20 77 61 6e 74 48 61 6c 74  ent SET wantHalt
9820: 3d 31 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1");.    sqlite
9830: 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20 20 20  3_sleep(10);.   
9840: 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30 3b   g.iTimeout = 0;
9850: 0a 20 20 20 20 69 54 69 6d 65 6f 75 74 20 3d 20  .    iTimeout = 
9860: 31 30 30 30 3b 0a 20 20 20 20 77 68 69 6c 65 28  1000;.    while(
9870: 20 28 28 72 63 20 3d 20 74 72 79 53 71 6c 28 22   ((rc = trySql("
9880: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 6c  SELECT 1 FROM cl
9890: 69 65 6e 74 22 29 29 3d 3d 53 51 4c 49 54 45 5f  ient"))==SQLITE_
98a0: 42 55 53 59 0a 20 20 20 20 20 20 20 20 7c 7c 20  BUSY.        || 
98b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 29 20  rc==SQLITE_ROW) 
98c0: 26 26 20 69 54 69 6d 65 6f 75 74 3e 30 20 29 7b  && iTimeout>0 ){
98d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
98e0: 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 20 20 20  leep(10);.      
98f0: 69 54 69 6d 65 6f 75 74 20 2d 3d 20 31 30 3b 0a  iTimeout -= 10;.
9900: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9910: 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20  3_sleep(100);.  
9920: 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72    pStmt = prepar
9930: 65 53 71 6c 28 22 53 45 4c 45 43 54 20 6e 45 72  eSql("SELECT nEr
9940: 72 6f 72 2c 20 6e 54 65 73 74 20 46 52 4f 4d 20  ror, nTest FROM 
9950: 63 6f 75 6e 74 65 72 73 22 29 3b 0a 20 20 20 20  counters");.    
9960: 69 54 69 6d 65 6f 75 74 20 3d 20 31 30 30 30 3b  iTimeout = 1000;
9970: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
9980: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
9990: 53 74 6d 74 29 29 3d 3d 53 51 4c 49 54 45 5f 42  Stmt))==SQLITE_B
99a0: 55 53 59 20 26 26 20 69 54 69 6d 65 6f 75 74 3e  USY && iTimeout>
99b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
99c0: 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20 20  e3_sleep(10);.  
99d0: 20 20 20 20 69 54 69 6d 65 6f 75 74 20 2d 3d 20      iTimeout -= 
99e0: 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  10;.    }.    if
99f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
9a00: 20 29 7b 0a 20 20 20 20 20 20 67 2e 6e 45 72 72   ){.      g.nErr
9a10: 6f 72 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f  or += sqlite3_co
9a20: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
9a30: 30 29 3b 0a 20 20 20 20 20 20 67 2e 6e 54 65 73  0);.      g.nTes
9a40: 74 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  t += sqlite3_col
9a50: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
9a60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
9a70: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
9a80: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tmt);.  }.  sqli
9a90: 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b  te3_close(g.db);
9aa0: 0a 20 20 6d 61 79 62 65 43 6c 6f 73 65 28 67 2e  .  maybeClose(g.
9ab0: 70 4c 6f 67 29 3b 0a 20 20 6d 61 79 62 65 43 6c  pLog);.  maybeCl
9ac0: 6f 73 65 28 67 2e 70 45 72 72 4c 6f 67 29 3b 0a  ose(g.pErrLog);.
9ad0: 20 20 69 66 28 20 69 43 6c 69 65 6e 74 3d 3d 30    if( iClient==0
9ae0: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
9af0: 53 75 6d 6d 61 72 79 3a 20 25 64 20 65 72 72 6f  Summary: %d erro
9b00: 72 73 20 6f 75 74 20 6f 66 20 25 64 20 74 65 73  rs out of %d tes
9b10: 74 73 5c 6e 22 2c 20 67 2e 6e 45 72 72 6f 72 2c  ts\n", g.nError,
9b20: 20 67 2e 6e 54 65 73 74 29 3b 0a 20 20 20 20 70   g.nTest);.    p
9b30: 72 69 6e 74 66 28 22 45 4e 44 3a 20 25 73 22 2c  rintf("END: %s",
9b40: 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 66   argv[0]);.    f
9b50: 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20  or(i=1; i<argc; 
9b60: 69 2b 2b 29 20 70 72 69 6e 74 66 28 22 20 25 73  i++) printf(" %s
9b70: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
9b80: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
9b90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 2e 6e 45   }.  return g.nE
9ba0: 72 72 6f 72 3e 30 3b 0a 7d 0a                    rror>0;.}.