/ Hex Artifact Content
Login

Artifact fca59f0a922e03f95ed17c44b1515ed37a841c81:


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 73 74 64 6c 69 62 2e  include <stdlib.
0460: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
0470: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0480: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
0490: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f  ude <ctype.h>../
04a0: 2a 20 54 68 65 20 73 75 66 66 69 78 20 74 6f 20  * The suffix to 
04b0: 61 70 70 65 6e 64 20 74 6f 20 74 68 65 20 63 68  append to the ch
04c0: 69 6c 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ild command line
04d0: 73 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 23 69 66  s, if any */.#if
04e0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
04f0: 0a 23 20 64 65 66 69 6e 65 20 47 45 54 50 49 44  .# define GETPID
0500: 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74   (int)GetCurrent
0510: 50 72 6f 63 65 73 73 49 64 0a 23 65 6c 73 65 0a  ProcessId.#else.
0520: 23 20 64 65 66 69 6e 65 20 47 45 54 50 49 44 20  # define GETPID 
0530: 67 65 74 70 69 64 0a 23 65 6e 64 69 66 0a 0a 2f  getpid.#endif../
0540: 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
0550: 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
0560: 74 65 72 28 73 29 20 2a 2f 0a 23 69 66 20 64 65  ter(s) */.#if de
0570: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 23 20  fined(_WIN32).# 
0580: 64 65 66 69 6e 65 20 69 73 44 69 72 53 65 70 28  define isDirSep(
0590: 63 29 20 28 28 28 63 29 20 3d 3d 20 27 2f 27 29  c) (((c) == '/')
05a0: 20 7c 7c 20 28 28 63 29 20 3d 3d 20 27 5c 5c 27   || ((c) == '\\'
05b0: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
05c0: 65 20 69 73 44 69 72 53 65 70 28 63 29 20 28 28  e isDirSep(c) ((
05d0: 63 29 20 3d 3d 20 27 2f 27 29 0a 23 65 6e 64 69  c) == '/').#endi
05e0: 66 0a 0a 2f 2a 20 4d 61 72 6b 20 61 20 70 61 72  f../* Mark a par
05f0: 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73 65 64  ameter as unused
0600: 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d   to suppress com
0610: 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 2a  piler warnings *
0620: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44  /.#define UNUSED
0630: 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20 20 28  _PARAMETER(x)  (
0640: 76 6f 69 64 29 78 0a 0a 2f 2a 20 47 6c 6f 62 61  void)x../* Globa
0650: 6c 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  l data.*/.static
0660: 20 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 20 7b   struct Global {
0670: 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30 3b 20  .  char *argv0; 
0680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0690: 65 20 6f 66 20 74 68 65 20 65 78 65 63 75 74 61  e of the executa
06a0: 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ble */.  const c
06b0: 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20  har *zVfs;      
06c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74  /* Name of VFS t
06d0: 6f 20 75 73 65 2e 20 4f 66 74 65 6e 20 4e 55 4c  o use. Often NUL
06e0: 4c 20 6d 65 61 6e 69 6e 67 20 22 64 65 66 61 75  L meaning "defau
06f0: 6c 74 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  lt" */.  char *z
0700: 44 62 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  DbFile;         
0710: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
0720: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
0730: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
0740: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e      /* Open conn
0750: 65 63 74 69 6f 6e 20 74 6f 20 64 61 74 61 62 61  ection to databa
0760: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  se */.  char *zE
0770: 72 72 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 2f  rrLog;         /
0780: 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 65  * Filename for e
0790: 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 46 49  rror log */.  FI
07a0: 4c 45 20 2a 70 45 72 72 4c 6f 67 3b 20 20 20 20  LE *pErrLog;    
07b0: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
07c0: 20 77 72 69 74 65 20 65 72 72 6f 72 73 20 2a 2f   write errors */
07d0: 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 67 3b 20 20  .  char *zLog;  
07e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
07f0: 65 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f 67 20  e of output log 
0800: 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  file */.  FILE *
0810: 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20  pLog;           
0820: 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
0830: 74 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 73 20  te log messages 
0840: 2a 2f 0a 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b  */.  char zName[
0850: 33 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  32];        /* S
0860: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20  ymbolic name of 
0870: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
0880: 20 20 69 6e 74 20 74 61 73 6b 49 64 3b 20 20 20    int taskId;   
0890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 73 6b           /* Task
08a0: 20 49 44 2e 20 20 30 20 6d 65 61 6e 73 20 73 75   ID.  0 means su
08b0: 70 65 72 76 69 73 6f 72 2e 20 2a 2f 0a 20 20 69  pervisor. */.  i
08c0: 6e 74 20 69 54 72 61 63 65 3b 20 20 20 20 20 20  nt iTrace;      
08d0: 20 20 20 20 20 20 2f 2a 20 54 72 61 63 69 6e 67        /* Tracing
08e0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
08f0: 62 53 71 6c 54 72 61 63 65 3b 20 20 20 20 20 20  bSqlTrace;      
0900: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 74 72     /* True to tr
0910: 61 63 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 73  ace SQL commands
0920: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72   */.  int bIgnor
0930: 65 53 71 6c 45 72 72 6f 72 73 3b 20 20 2f 2a 20  eSqlErrors;  /* 
0940: 49 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 69 6e  Ignore errors in
0950: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
0960: 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 6f 72 3b  */.  int nError;
0970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0980: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
0990: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 73 74 3b 20  */.  int nTest; 
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
09b0: 75 6d 62 65 72 20 6f 66 20 2d 2d 6d 61 74 63 68  umber of --match
09c0: 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
09d0: 69 6e 74 20 69 54 69 6d 65 6f 75 74 3b 20 20 20  int iTimeout;   
09e0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6c 6c 69 73         /* Millis
09f0: 65 63 6f 6e 64 73 20 75 6e 74 69 6c 20 61 20 62  econds until a b
0a00: 75 73 79 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20  usy timeout */. 
0a10: 20 69 6e 74 20 62 53 79 6e 63 3b 20 20 20 20 20   int bSync;     
0a20: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20          /* Call 
0a30: 66 73 79 6e 63 28 29 20 2a 2f 0a 7d 20 67 3b 0a  fsync() */.} g;.
0a40: 0a 2f 2a 20 44 65 66 61 75 6c 74 20 74 69 6d 65  ./* Default time
0a50: 6f 75 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44  out */.#define D
0a60: 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 20 31  EFAULT_TIMEOUT 1
0a70: 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  0000../*.** Prin
0a80: 74 20 61 20 6d 65 73 73 61 67 65 20 61 64 64 69  t a message addi
0a90: 6e 67 20 7a 50 72 65 66 69 78 5b 5d 20 74 6f 20  ng zPrefix[] to 
0aa0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
0ab0: 20 65 76 65 72 79 20 6c 69 6e 65 2e 0a 2a 2f 0a   every line..*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
0ad0: 74 57 69 74 68 50 72 65 66 69 78 28 46 49 4c 45  tWithPrefix(FILE
0ae0: 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 63 68   *pOut, const ch
0af0: 61 72 20 2a 7a 50 72 65 66 69 78 2c 20 63 6f 6e  ar *zPrefix, con
0b00: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  st char *zMsg){.
0b10: 20 20 77 68 69 6c 65 28 20 7a 4d 73 67 20 26 26    while( zMsg &&
0b20: 20 7a 4d 73 67 5b 30 5d 20 29 7b 0a 20 20 20 20   zMsg[0] ){.    
0b30: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
0b40: 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a  =0; zMsg[i] && z
0b50: 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 20 26 26 20  Msg[i]!='\n' && 
0b60: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 3b 20 69  zMsg[i]!='\r'; i
0b70: 2b 2b 29 7b 7d 0a 20 20 20 20 66 70 72 69 6e 74  ++){}.    fprint
0b80: 66 28 70 4f 75 74 2c 20 22 25 73 25 2e 2a 73 5c  f(pOut, "%s%.*s\
0b90: 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 69 2c 20  n", zPrefix, i, 
0ba0: 7a 4d 73 67 29 3b 0a 20 20 20 20 7a 4d 73 67 20  zMsg);.    zMsg 
0bb0: 2b 3d 20 69 3b 0a 20 20 20 20 77 68 69 6c 65 28  += i;.    while(
0bc0: 20 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 6e 27 20 7c   zMsg[0]=='\n' |
0bd0: 7c 20 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 72 27 20  | zMsg[0]=='\r' 
0be0: 29 20 7a 4d 73 67 2b 2b 3b 0a 20 20 7d 0a 7d 0a  ) zMsg++;.  }.}.
0bf0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
0c00: 77 6f 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  wo pointers to s
0c10: 74 72 69 6e 67 73 2c 20 77 68 65 72 65 20 74 68  trings, where th
0c20: 65 20 70 6f 69 6e 74 65 72 73 20 6d 69 67 68 74  e pointers might
0c30: 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   be NULL..*/.sta
0c40: 74 69 63 20 69 6e 74 20 73 61 66 65 5f 73 74 72  tic int safe_str
0c50: 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  cmp(const char *
0c60: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62  a, const char *b
0c70: 29 7b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20  ){.  if( a==b ) 
0c80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
0c90: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  a==0 ) return -1
0ca0: 3b 0a 20 20 69 66 28 20 62 3d 3d 30 20 29 20 72  ;.  if( b==0 ) r
0cb0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
0cc0: 6e 20 73 74 72 63 6d 70 28 61 2c 62 29 3b 0a 7d  n strcmp(a,b);.}
0cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
0ce0: 52 55 45 20 69 66 20 73 74 72 69 6e 67 20 7a 5b  RUE if string z[
0cf0: 5d 20 6d 61 74 63 68 65 73 20 67 6c 6f 62 20 70  ] matches glob p
0d00: 61 74 74 65 72 6e 20 7a 47 6c 6f 62 5b 5d 2e 0a  attern zGlob[]..
0d10: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
0d20: 69 66 20 74 68 65 20 70 61 74 74 65 72 6e 20 64  if the pattern d
0d30: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a  oes not match..*
0d40: 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75  *.** Globbing ru
0d50: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
0d60: 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '*'       Matche
0d70: 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f  s any sequence o
0d80: 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63  f zero or more c
0d90: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
0da0: 20 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20        '?'       
0db0: 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20  Matches exactly 
0dc0: 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  one character..*
0dd0: 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20  *.**     [...]  
0de0: 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20      Matches one 
0df0: 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74  character from t
0e00: 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
0e10: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
0e20: 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73        characters
0e30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e  ..**.**     [^..
0e40: 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  .]     Matches o
0e50: 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74  ne character not
0e60: 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64   in the enclosed
0e70: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   list..**.**    
0e80: 20 20 27 23 27 20 20 20 20 20 20 20 4d 61 74 63    '#'       Matc
0e90: 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
0ea0: 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   of one or more 
0eb0: 64 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a 2a  digits with an.*
0ec0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0ed0: 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d   optional + or -
0ee0: 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a   sign in front.*
0ef0: 2f 0a 69 6e 74 20 73 74 72 67 6c 6f 62 28 63 6f  /.int strglob(co
0f00: 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c  nst char *zGlob,
0f10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
0f20: 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20  .  int c, c2;.  
0f30: 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e  int invert;.  in
0f40: 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65  t seen;..  while
0f50: 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b  ( (c = (*(zGlob+
0f60: 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  +)))!=0 ){.    i
0f70: 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20  f( c=='*' ){.   
0f80: 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a 28     while( (c=(*(
0f90: 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a  zGlob++))) == '*
0fa0: 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20  ' || c=='?' ){. 
0fb0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 3f         if( c=='?
0fc0: 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30  ' && (*(z++))==0
0fd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
0fe0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
0ff0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1000: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1010: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
1020: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
1030: 28 20 2a 7a 20 26 26 20 73 74 72 67 6c 6f 62 28  ( *z && strglob(
1040: 7a 47 6c 6f 62 2d 31 2c 7a 29 20 29 7b 0a 20 20  zGlob-1,z) ){.  
1050: 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
1060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1070: 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20  eturn (*z)!=0;. 
1080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
1090: 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b  le( (c2 = (*(z++
10a0: 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
10b0: 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29    while( c2!=c )
10c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  {.          c2 =
10d0: 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20   *(z++);.       
10e0: 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72     if( c2==0 ) r
10f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
1100: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
1110: 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20  trglob(zGlob,z) 
1120: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
1130: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1140: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1150: 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  ( c=='?' ){.    
1160: 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d    if( (*(z++))==
1170: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1180: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1190: 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  [' ){.      int 
11a0: 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
11b0: 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20     seen = 0;.   
11c0: 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20     invert = 0;. 
11d0: 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b       c = *(z++);
11e0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
11f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1200: 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
1210: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d  );.      if( c2=
1220: 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='^' ){.        
1230: 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20  invert = 1;.    
1240: 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
1250: 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
1260: 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
1270: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
1280: 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
1290: 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
12a0: 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
12b0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  }.      while( c
12c0: 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  2 && c2!=']' ){.
12d0: 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
12e0: 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21  '-' && zGlob[0]!
12f0: 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  =']' && zGlob[0]
1300: 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
1310: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
1320: 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
1330: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
1340: 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
1350: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
1360: 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
1370: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
1380: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
1390: 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
13a0: 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
13b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13c0: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
13d0: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
13e0: 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
13f0: 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
1400: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c       if( c2==0 |
1410: 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74  | (seen ^ invert
1420: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1430: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
1440: 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  =='#' ){.      i
1450: 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c  f( (z[0]=='-' ||
1460: 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 69   z[0]=='+') && i
1470: 73 64 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a  sdigit(z[1]) ) z
1480: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69  ++;.      if( !i
1490: 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72  sdigit(z[0]) ) r
14a0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a  eturn 0;.      z
14b0: 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
14c0: 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 29   isdigit(z[0]) )
14d0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  { z++; }.    }el
14e0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21  se{.      if( c!
14f0: 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75  =(*(z++)) ) retu
1500: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
1510: 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a    return *z==0;.
1520: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 6f  }../*.** Close o
1530: 75 74 70 75 74 20 73 74 72 65 61 6d 20 70 4f 75  utput stream pOu
1540: 74 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 73  t if it is not s
1550: 74 64 6f 75 74 20 6f 72 20 73 74 64 65 72 72 0a  tdout or stderr.
1560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1570: 61 79 62 65 43 6c 6f 73 65 28 46 49 4c 45 20 2a  aybeClose(FILE *
1580: 70 4f 75 74 29 7b 0a 20 20 69 66 28 20 70 4f 75  pOut){.  if( pOu
1590: 74 21 3d 73 74 64 6f 75 74 20 26 26 20 70 4f 75  t!=stdout && pOu
15a0: 74 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c 6f  t!=stderr ) fclo
15b0: 73 65 28 70 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  se(pOut);.}../*.
15c0: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  ** Print an erro
15d0: 72 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61  r message.*/.sta
15e0: 74 69 63 20 76 6f 69 64 20 65 72 72 6f 72 4d 65  tic void errorMe
15f0: 73 73 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72  ssage(const char
1600: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
1610: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1620: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 63   char *zMsg;.  c
1630: 68 61 72 20 7a 50 72 65 66 69 78 5b 33 30 5d 3b  har zPrefix[30];
1640: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1650: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67  zFormat);.  zMsg
1660: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
1670: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
1680: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1690: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
16a0: 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69  tf(sizeof(zPrefi
16b0: 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 25 73  x), zPrefix, "%s
16c0: 3a 45 52 52 4f 52 3a 20 22 2c 20 67 2e 7a 4e 61  :ERROR: ", g.zNa
16d0: 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f  me);.  if( g.pLo
16e0: 67 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69  g ){.    printWi
16f0: 74 68 50 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c  thPrefix(g.pLog,
1700: 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b   zPrefix, zMsg);
1710: 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e 70 4c  .    fflush(g.pL
1720: 6f 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  og);.  }.  if( g
1730: 2e 70 45 72 72 4c 6f 67 20 26 26 20 73 61 66 65  .pErrLog && safe
1740: 5f 73 74 72 63 6d 70 28 67 2e 7a 45 72 72 4c 6f  _strcmp(g.zErrLo
1750: 67 2c 67 2e 7a 4c 6f 67 29 20 29 7b 0a 20 20 20  g,g.zLog) ){.   
1760: 20 70 72 69 6e 74 57 69 74 68 50 72 65 66 69 78   printWithPrefix
1770: 28 67 2e 70 45 72 72 4c 6f 67 2c 20 7a 50 72 65  (g.pErrLog, zPre
1780: 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  fix, zMsg);.    
1790: 66 66 6c 75 73 68 28 67 2e 70 45 72 72 4c 6f 67  fflush(g.pErrLog
17a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
17b0: 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 67  _free(zMsg);.  g
17c0: 2e 6e 45 72 72 6f 72 2b 2b 3b 0a 7d 0a 0a 2f 2a  .nError++;.}../*
17d0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
17e0: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
17f0: 6e 74 20 74 72 79 53 71 6c 28 63 6f 6e 73 74 20  nt trySql(const 
1800: 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a  char*, ...);../*
1810: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72  .** Print an err
1820: 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 74  or message and t
1830: 68 65 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61  hen quit..*/.sta
1840: 74 69 63 20 76 6f 69 64 20 66 61 74 61 6c 45 72  tic void fatalEr
1850: 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ror(const char *
1860: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
1870: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
1880: 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 63 68 61  har *zMsg;.  cha
1890: 72 20 7a 50 72 65 66 69 78 5b 33 30 5d 3b 0a 20  r zPrefix[30];. 
18a0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
18b0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d  ormat);.  zMsg =
18c0: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
18d0: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
18e0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
18f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1900: 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29  (sizeof(zPrefix)
1910: 2c 20 7a 50 72 65 66 69 78 2c 20 22 25 73 3a 46  , zPrefix, "%s:F
1920: 41 54 41 4c 3a 20 22 2c 20 67 2e 7a 4e 61 6d 65  ATAL: ", g.zName
1930: 29 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f 67 20  );.  if( g.pLog 
1940: 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 74 68  ){.    printWith
1950: 50 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c 20 7a  Prefix(g.pLog, z
1960: 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20  Prefix, zMsg);. 
1970: 20 20 20 66 66 6c 75 73 68 28 67 2e 70 4c 6f 67     fflush(g.pLog
1980: 29 3b 0a 20 20 20 20 6d 61 79 62 65 43 6c 6f 73  );.    maybeClos
1990: 65 28 67 2e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20  e(g.pLog);.  }. 
19a0: 20 69 66 28 20 67 2e 70 45 72 72 4c 6f 67 20 26   if( g.pErrLog &
19b0: 26 20 73 61 66 65 5f 73 74 72 63 6d 70 28 67 2e  & safe_strcmp(g.
19c0: 7a 45 72 72 4c 6f 67 2c 67 2e 7a 4c 6f 67 29 20  zErrLog,g.zLog) 
19d0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 74 68  ){.    printWith
19e0: 50 72 65 66 69 78 28 67 2e 70 45 72 72 4c 6f 67  Prefix(g.pErrLog
19f0: 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 29  , zPrefix, zMsg)
1a00: 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e 70  ;.    fflush(g.p
1a10: 45 72 72 4c 6f 67 29 3b 0a 20 20 20 20 6d 61 79  ErrLog);.    may
1a20: 62 65 43 6c 6f 73 65 28 67 2e 70 45 72 72 4c 6f  beClose(g.pErrLo
1a30: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
1a40: 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20  3_free(zMsg);.  
1a50: 69 66 28 20 67 2e 64 62 20 29 7b 0a 20 20 20 20  if( g.db ){.    
1a60: 69 6e 74 20 6e 54 72 79 20 3d 20 30 3b 0a 20 20  int nTry = 0;.  
1a70: 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30    g.iTimeout = 0
1a80: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74 72 79  ;.    while( try
1a90: 53 71 6c 28 22 55 50 44 41 54 45 20 63 6c 69 65  Sql("UPDATE clie
1aa0: 6e 74 20 53 45 54 20 77 61 6e 74 48 61 6c 74 3d  nt SET wantHalt=
1ab0: 31 3b 22 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  1;")==SQLITE_BUS
1ac0: 59 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  Y.           && 
1ad0: 28 6e 54 72 79 2b 2b 29 3c 31 30 30 20 29 7b 0a  (nTry++)<100 ){.
1ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
1af0: 65 65 70 28 31 30 29 3b 0a 20 20 20 20 7d 0a 20  eep(10);.    }. 
1b00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f   }.  sqlite3_clo
1b10: 73 65 28 67 2e 64 62 29 3b 0a 20 20 65 78 69 74  se(g.db);.  exit
1b20: 28 31 29 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  (1);  .}.../*.**
1b30: 20 50 72 69 6e 74 20 61 20 6c 6f 67 20 6d 65 73   Print a log mes
1b40: 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sage.*/.static v
1b50: 6f 69 64 20 6c 6f 67 4d 65 73 73 61 67 65 28 63  oid logMessage(c
1b60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
1b70: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
1b80: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
1b90: 7a 4d 73 67 3b 0a 20 20 63 68 61 72 20 7a 50 72  zMsg;.  char zPr
1ba0: 65 66 69 78 5b 33 30 5d 3b 0a 20 20 76 61 5f 73  efix[30];.  va_s
1bb0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1bc0: 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  );.  zMsg = sqli
1bd0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
1be0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1bf0: 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74  end(ap);.  sqlit
1c00: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1c10: 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72  of(zPrefix), zPr
1c20: 65 66 69 78 2c 20 22 25 73 3a 20 22 2c 20 67 2e  efix, "%s: ", g.
1c30: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e  zName);.  if( g.
1c40: 70 4c 6f 67 20 29 7b 0a 20 20 20 20 70 72 69 6e  pLog ){.    prin
1c50: 74 57 69 74 68 50 72 65 66 69 78 28 67 2e 70 4c  tWithPrefix(g.pL
1c60: 6f 67 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73  og, zPrefix, zMs
1c70: 67 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 67  g);.    fflush(g
1c80: 2e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 73 71  .pLog);.  }.  sq
1c90: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29  lite3_free(zMsg)
1ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1cb0: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
1cc0: 61 20 73 74 72 69 6e 67 20 6f 6d 69 74 74 69 6e  a string omittin
1cd0: 67 20 74 72 61 69 6c 69 6e 67 20 77 68 69 74 65  g trailing white
1ce0: 73 70 61 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20  space.*/.static 
1cf0: 69 6e 74 20 63 6c 69 70 4c 65 6e 67 74 68 28 63  int clipLength(c
1d00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
1d10: 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
1d20: 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69 6c 65  rlen(z);.  while
1d30: 28 20 6e 3e 30 20 26 26 20 69 73 73 70 61 63 65  ( n>0 && isspace
1d40: 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b  (z[n-1]) ){ n--;
1d50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1d60: 0a 0a 2f 2a 0a 2a 2a 20 41 75 78 69 6c 69 61 72  ../*.** Auxiliar
1d70: 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  y SQL function t
1d80: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  o return the nam
1d90: 65 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2f 0a  e of the VFS.*/.
1da0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 66 73 4e  static void vfsN
1db0: 61 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ameFunc(.  sqlit
1dc0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1dd0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
1de0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1df0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
1e00: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
1e10: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
1e20: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
1e30: 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b   char *zVfs = 0;
1e40: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1e50: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e 55  TER(argc);.  UNU
1e60: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
1e70: 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  gv);.  sqlite3_f
1e80: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
1e90: 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
1ea0: 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 20 26 7a  CNTL_VFSNAME, &z
1eb0: 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 56 66 73  Vfs);.  if( zVfs
1ec0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1ed0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
1ee0: 65 78 74 2c 20 7a 56 66 73 2c 20 2d 31 2c 20 73  ext, zVfs, -1, s
1ef0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
1f00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 73 79 20  }.}../*.** Busy 
1f10: 68 61 6e 64 6c 65 72 20 77 69 74 68 20 61 20 67  handler with a g
1f20: 2e 69 54 69 6d 65 6f 75 74 2d 6d 69 6c 6c 69 73  .iTimeout-millis
1f30: 65 63 6f 6e 64 20 74 69 6d 65 6f 75 74 0a 2a 2f  econd timeout.*/
1f40: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 75 73 79  .static int busy
1f50: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 43  Handler(void *pC
1f60: 44 2c 20 69 6e 74 20 63 6f 75 6e 74 29 7b 0a 20  D, int count){. 
1f70: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1f80: 52 28 70 43 44 29 3b 0a 20 20 69 66 28 20 63 6f  R(pCD);.  if( co
1f90: 75 6e 74 2a 31 30 3e 67 2e 69 54 69 6d 65 6f 75  unt*10>g.iTimeou
1fa0: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 69  t ){.    if( g.i
1fb0: 54 69 6d 65 6f 75 74 3e 30 20 29 20 65 72 72 6f  Timeout>0 ) erro
1fc0: 72 4d 65 73 73 61 67 65 28 22 74 69 6d 65 6f 75  rMessage("timeou
1fd0: 74 20 61 66 74 65 72 20 25 64 6d 73 22 2c 20 67  t after %dms", g
1fe0: 2e 69 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20  .iTimeout);.    
1ff0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2000: 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30  sqlite3_sleep(10
2010: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
2020: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 54 72 61 63  ../*.** SQL Trac
2030: 65 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74  e callback.*/.st
2040: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 54 72 61  atic void sqlTra
2050: 63 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ceCallback(void 
2060: 2a 4e 6f 74 55 73 65 64 31 2c 20 63 6f 6e 73 74  *NotUsed1, const
2070: 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20   char *zSql){.  
2080: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2090: 28 4e 6f 74 55 73 65 64 31 29 3b 0a 20 20 6c 6f  (NotUsed1);.  lo
20a0: 67 4d 65 73 73 61 67 65 28 22 5b 25 2e 2a 73 5d  gMessage("[%.*s]
20b0: 22 2c 20 63 6c 69 70 4c 65 6e 67 74 68 28 7a 53  ", clipLength(zS
20c0: 71 6c 29 2c 20 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f  ql), zSql);.}../
20d0: 2a 0a 2a 2a 20 53 51 4c 20 65 72 72 6f 72 20 6c  *.** SQL error l
20e0: 6f 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73  og callback.*/.s
20f0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 45 72  tatic void sqlEr
2100: 72 6f 72 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  rorCallback(void
2110: 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72 72   *pArg, int iErr
2120: 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Code, const char
2130: 20 2a 7a 4d 73 67 29 7b 0a 20 20 55 4e 55 53 45   *zMsg){.  UNUSE
2140: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67  D_PARAMETER(pArg
2150: 29 3b 0a 20 20 69 66 28 20 69 45 72 72 43 6f 64  );.  if( iErrCod
2160: 65 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  e==SQLITE_ERROR 
2170: 26 26 20 67 2e 62 49 67 6e 6f 72 65 53 71 6c 45  && g.bIgnoreSqlE
2180: 72 72 6f 72 73 20 29 20 72 65 74 75 72 6e 3b 0a  rrors ) return;.
2190: 20 20 69 66 28 20 28 69 45 72 72 43 6f 64 65 26    if( (iErrCode&
21a0: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 53 43  0xff)==SQLITE_SC
21b0: 48 45 4d 41 20 26 26 20 67 2e 69 54 72 61 63 65  HEMA && g.iTrace
21c0: 3c 33 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <3 ) return;.  i
21d0: 66 28 20 67 2e 69 54 69 6d 65 6f 75 74 3d 3d 30  f( g.iTimeout==0
21e0: 20 26 26 20 28 69 45 72 72 43 6f 64 65 26 30 78   && (iErrCode&0x
21f0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  ff)==SQLITE_BUSY
2200: 20 26 26 20 67 2e 69 54 72 61 63 65 3c 33 20 29   && g.iTrace<3 )
2210: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
2220: 69 45 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d  iErrCode&0xff)==
2230: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 20 29 7b  SQLITE_NOTICE ){
2240: 0a 20 20 20 20 6c 6f 67 4d 65 73 73 61 67 65 28  .    logMessage(
2250: 22 28 69 6e 66 6f 29 20 25 73 22 2c 20 7a 4d 73  "(info) %s", zMs
2260: 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
2270: 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 28   errorMessage("(
2280: 65 72 72 63 6f 64 65 3d 25 64 29 20 25 73 22 2c  errcode=%d) %s",
2290: 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29   iErrCode, zMsg)
22a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
22b0: 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74  repare an SQL st
22c0: 61 74 65 6d 65 6e 74 2e 20 20 49 73 73 75 65 20  atement.  Issue 
22d0: 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 66  a fatal error if
22e0: 20 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   unable..*/.stat
22f0: 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
2300: 2a 70 72 65 70 61 72 65 53 71 6c 28 63 6f 6e 73  *prepareSql(cons
2310: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
2320: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
2330: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
2340: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  l;.  int rc;.  s
2350: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2360: 6d 74 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61  mt = 0;.  va_sta
2370: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2380: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
2390: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
23a0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
23b0: 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  d(ap);.  rc = sq
23c0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
23d0: 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  (g.db, zSql, -1,
23e0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
23f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2400: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2410: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2420: 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28  .    fatalError(
2430: 22 25 73 5c 6e 25 73 5c 6e 22 2c 20 73 71 6c 69  "%s\n%s\n", sqli
2440: 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29  te3_errmsg(g.db)
2450: 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 73  , zSql);.  }.  s
2460: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
2470: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 53 74 6d  );.  return pStm
2480: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  t;.}../*.** Run 
2490: 61 72 62 69 74 72 61 72 79 20 53 51 4c 2e 20 20  arbitrary SQL.  
24a0: 49 73 73 75 65 20 61 20 66 61 74 61 6c 20 65 72  Issue a fatal er
24b0: 72 6f 72 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ror on failure..
24c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
24d0: 75 6e 53 71 6c 28 63 6f 6e 73 74 20 63 68 61 72  unSql(const char
24e0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
24f0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2500: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
2510: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
2520: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
2530: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2540: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
2550: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
2560: 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (ap);.  rc = sql
2570: 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20  ite3_exec(g.db, 
2580: 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
2590: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 61 74 61 6c  _OK ){.    fatal
25b0: 45 72 72 6f 72 28 22 25 73 5c 6e 25 73 5c 6e 22  Error("%s\n%s\n"
25c0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
25d0: 28 67 2e 64 62 29 2c 20 7a 53 71 6c 29 3b 0a 20  (g.db), zSql);. 
25e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
25f0: 65 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(zSql);.}../*.*
2600: 2a 20 54 72 79 20 74 6f 20 72 75 6e 20 61 72 62  * Try to run arb
2610: 69 74 72 61 72 79 20 53 51 4c 2e 20 20 52 65 74  itrary SQL.  Ret
2620: 75 72 6e 20 73 75 63 63 65 73 73 20 63 6f 64 65  urn success code
2630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2640: 74 72 79 53 71 6c 28 63 6f 6e 73 74 20 63 68 61  trySql(const cha
2650: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
2660: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2670: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2680: 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61  int rc;.  va_sta
2690: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
26a0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
26b0: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
26c0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
26d0: 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  d(ap);.  rc = sq
26e0: 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c  lite3_exec(g.db,
26f0: 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
2700: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2710: 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  zSql);.  return 
2720: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 74 72 75 63 74  rc;.}../* Struct
2730: 75 72 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ure for holding 
2740: 61 6e 20 61 72 62 69 74 72 61 72 79 20 6c 65 6e  an arbitrary len
2750: 67 74 68 20 73 74 72 69 6e 67 0a 2a 2f 0a 74 79  gth string.*/.ty
2760: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 72  pedef struct Str
2770: 69 6e 67 20 53 74 72 69 6e 67 3b 0a 73 74 72 75  ing String;.stru
2780: 63 74 20 53 74 72 69 6e 67 20 7b 0a 20 20 63 68  ct String {.  ch
2790: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 2f  ar *z;         /
27a0: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a  * the string */.
27b0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
27c0: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 6f 66 20 7a     /* Slots of z
27d0: 5b 5d 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  [] used */.  int
27e0: 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 2f 2a   nAlloc;      /*
27f0: 20 53 6c 6f 74 73 20 6f 66 20 7a 5b 5d 20 61 6c   Slots of z[] al
2800: 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f  located */.};../
2810: 2a 20 46 72 65 65 20 61 20 73 74 72 69 6e 67 20  * Free a string 
2820: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2830: 74 72 69 6e 67 46 72 65 65 28 53 74 72 69 6e 67  tringFree(String
2840: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a   *p){.  if( p->z
2850: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2860: 70 2d 3e 7a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p->z);.  memset(
2870: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
2880: 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  );.}../* Append 
2890: 6e 20 62 79 74 65 73 20 6f 66 20 74 65 78 74 20  n bytes of text 
28a0: 74 6f 20 61 20 73 74 72 69 6e 67 2e 20 20 49 66  to a string.  If
28b0: 20 6e 3c 30 20 61 70 70 65 6e 64 20 74 68 65 20   n<0 append the 
28c0: 65 6e 74 69 72 65 20 73 74 72 69 6e 67 2e 20 2a  entire string. *
28d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
28e0: 72 69 6e 67 41 70 70 65 6e 64 28 53 74 72 69 6e  ringAppend(Strin
28f0: 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g *p, const char
2900: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
2910: 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 28 69 6e  f( n<0 ) n = (in
2920: 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69  t)strlen(z);.  i
2930: 66 28 20 70 2d 3e 6e 2b 6e 3e 3d 70 2d 3e 6e 41  f( p->n+n>=p->nA
2940: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
2950: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c  nAlloc = p->nAll
2960: 6f 63 2a 32 20 2b 20 6e 20 2b 20 31 30 30 3b 0a  oc*2 + n + 100;.
2970: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
2980: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d  lite3_realloc(p-
2990: 3e 7a 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20  >z, nAlloc);.   
29a0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 66 61 74 61   if( z==0 ) fata
29b0: 6c 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d  lError("out of m
29c0: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 70 2d 3e  emory");.    p->
29d0: 7a 20 3d 20 7a 3b 0a 20 20 20 20 70 2d 3e 6e 41  z = z;.    p->nA
29e0: 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20  lloc = nAlloc;. 
29f0: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a   }.  memcpy(p->z
2a00: 2b 70 2d 3e 6e 2c 20 7a 2c 20 6e 29 3b 0a 20 20  +p->n, z, n);.  
2a10: 70 2d 3e 6e 20 2b 3d 20 6e 3b 0a 20 20 70 2d 3e  p->n += n;.  p->
2a20: 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a  z[p->n] = 0;.}..
2a30: 2f 2a 20 52 65 73 65 74 20 61 20 73 74 72 69 6e  /* Reset a strin
2a40: 67 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 74  g to an empty st
2a50: 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 76  ring */.static v
2a60: 6f 69 64 20 73 74 72 69 6e 67 52 65 73 65 74 28  oid stringReset(
2a70: 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69 66  String *p){.  if
2a80: 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 74 72 69  ( p->z==0 ) stri
2a90: 6e 67 41 70 70 65 6e 64 28 70 2c 20 22 20 22 2c  ngAppend(p, " ",
2aa0: 20 31 29 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b   1);.  p->n = 0;
2ab0: 0a 20 20 70 2d 3e 7a 5b 30 5d 20 3d 20 30 3b 0a  .  p->z[0] = 0;.
2ac0: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 6e  }../* Append a n
2ad0: 65 77 20 74 6f 6b 65 6e 20 6f 6e 74 6f 20 74 68  ew token onto th
2ae0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 72  e end of the str
2af0: 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ing */.static vo
2b00: 69 64 20 73 74 72 69 6e 67 41 70 70 65 6e 64 54  id stringAppendT
2b10: 65 72 6d 28 53 74 72 69 6e 67 20 2a 70 2c 20 63  erm(String *p, c
2b20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
2b30: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
2b40: 3e 6e 20 29 20 73 74 72 69 6e 67 41 70 70 65 6e  >n ) stringAppen
2b50: 64 28 70 2c 20 22 20 22 2c 20 31 29 3b 0a 20 20  d(p, " ", 1);.  
2b60: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
2b70: 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70 2c 20  stringAppend(p, 
2b80: 22 6e 69 6c 22 2c 20 33 29 3b 0a 20 20 20 20 72  "nil", 3);.    r
2b90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
2ba0: 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 21 69  (i=0; z[i] && !i
2bb0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
2bc0: 2b 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 26  +){}.  if( i>0 &
2bd0: 26 20 7a 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  & z[i]==0 ){.   
2be0: 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70 2c   stringAppend(p,
2bf0: 20 7a 2c 20 69 29 3b 0a 20 20 20 20 72 65 74 75   z, i);.    retu
2c00: 72 6e 3b 0a 20 20 7d 0a 20 20 73 74 72 69 6e 67  rn;.  }.  string
2c10: 41 70 70 65 6e 64 28 70 2c 20 22 27 22 2c 20 31  Append(p, "'", 1
2c20: 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d  );.  while( z[0]
2c30: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2c40: 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27   z[i] && z[i]!='
2c50: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
2c60: 69 66 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20 20  if( z[i] ){.    
2c70: 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70    stringAppend(p
2c80: 2c 20 7a 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  , z, i+1);.     
2c90: 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70 2c   stringAppend(p,
2ca0: 20 22 27 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   "'", 1);.      
2cb0: 7a 20 2b 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 65  z += i+1;.    }e
2cc0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72 69 6e  lse{.      strin
2cd0: 67 41 70 70 65 6e 64 28 70 2c 20 7a 2c 20 69 29  gAppend(p, z, i)
2ce0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2cf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 69 6e     }.  }.  strin
2d00: 67 41 70 70 65 6e 64 28 70 2c 20 22 27 22 2c 20  gAppend(p, "'", 
2d10: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  1);.}../*.** Cal
2d20: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 66  lback function f
2d30: 6f 72 20 65 76 61 6c 53 71 6c 28 29 0a 2a 2f 0a  or evalSql().*/.
2d40: 73 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43  static int evalC
2d50: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
2d60: 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20  Data, int argc, 
2d70: 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61  char **argv, cha
2d80: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 53 74  r **azCol){.  St
2d90: 72 69 6e 67 20 2a 70 20 3d 20 28 53 74 72 69 6e  ring *p = (Strin
2da0: 67 2a 29 70 43 44 61 74 61 3b 0a 20 20 69 6e 74  g*)pCData;.  int
2db0: 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   i;.  UNUSED_PAR
2dc0: 41 4d 45 54 45 52 28 61 7a 43 6f 6c 29 3b 0a 20  AMETER(azCol);. 
2dd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
2de0: 3b 20 69 2b 2b 29 20 73 74 72 69 6e 67 41 70 70  ; i++) stringApp
2df0: 65 6e 64 54 65 72 6d 28 70 2c 20 61 72 67 76 5b  endTerm(p, argv[
2e00: 69 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  i]);.  return 0;
2e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 72  .}../*.** Run ar
2e20: 62 69 74 72 61 72 79 20 53 51 4c 20 61 6e 64 20  bitrary SQL and 
2e30: 72 65 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c  record the resul
2e40: 74 73 20 69 6e 20 61 6e 20 6f 75 74 70 75 74 20  ts in an output 
2e50: 73 74 72 69 6e 67 0a 2a 2a 20 67 69 76 65 6e 20  string.** given 
2e60: 62 79 20 74 68 65 20 66 69 72 73 74 20 70 61 72  by the first par
2e70: 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ameter..*/.stati
2e80: 63 20 69 6e 74 20 65 76 61 6c 53 71 6c 28 53 74  c int evalSql(St
2e90: 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63  ring *p, const c
2ea0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
2eb0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2ec0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
2ed0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2ee0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
2ef0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2f00: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
2f10: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
2f20: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
2f30: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2f40: 61 73 73 65 72 74 28 20 67 2e 69 54 69 6d 65 6f  assert( g.iTimeo
2f50: 75 74 3e 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  ut>0 );.  rc = s
2f60: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62  qlite3_exec(g.db
2f70: 2c 20 7a 53 71 6c 2c 20 65 76 61 6c 43 61 6c 6c  , zSql, evalCall
2f80: 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 4d 73  back, p, &zErrMs
2f90: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  g);.  sqlite3_fr
2fa0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ee(zSql);.  if( 
2fb0: 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  rc ){.    char z
2fc0: 45 72 72 5b 33 30 5d 3b 0a 20 20 20 20 73 71 6c  Err[30];.    sql
2fd0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2fe0: 7a 65 6f 66 28 7a 45 72 72 29 2c 20 7a 45 72 72  zeof(zErr), zErr
2ff0: 2c 20 22 65 72 72 6f 72 28 25 64 29 22 2c 20 72  , "error(%d)", r
3000: 63 29 3b 0a 20 20 20 20 73 74 72 69 6e 67 41 70  c);.    stringAp
3010: 70 65 6e 64 54 65 72 6d 28 70 2c 20 7a 45 72 72  pendTerm(p, zErr
3020: 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d  );.    if( zErrM
3030: 73 67 20 29 7b 0a 20 20 20 20 20 20 73 74 72 69  sg ){.      stri
3040: 6e 67 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20  ngAppendTerm(p, 
3050: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
3060: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
3070: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
3080: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3090: 0a 2f 2a 0a 2a 2a 20 41 75 78 69 6c 69 61 72 79  ./*.** Auxiliary
30a0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f   SQL function to
30b0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 65 76 61   recursively eva
30c0: 6c 75 61 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74  luate SQL..*/.st
30d0: 61 74 69 63 20 76 6f 69 64 20 65 76 61 6c 46 75  atic void evalFu
30e0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
30f0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
3100: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
3110: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
3120: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
3130: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
3140: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
3150: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 6f 6e 73  context);.  cons
3160: 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28  t char *zSql = (
3170: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
3180: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
3190: 72 67 76 5b 30 5d 29 3b 0a 20 20 53 74 72 69 6e  rgv[0]);.  Strin
31a0: 67 20 72 65 73 3b 0a 20 20 63 68 61 72 20 2a 7a  g res;.  char *z
31b0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 6e  ErrMsg = 0;.  in
31c0: 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t rc;.  UNUSED_P
31d0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
31e0: 20 20 6d 65 6d 73 65 74 28 26 72 65 73 2c 20 30    memset(&res, 0
31f0: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
3200: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
3210: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 76  xec(db, zSql, ev
3220: 61 6c 43 61 6c 6c 62 61 63 6b 2c 20 26 72 65 73  alCallback, &res
3230: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
3240: 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
3250: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3260: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
3270: 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20 20  zErrMsg, -1);.  
3280: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3290: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65  ErrMsg);.  }else
32a0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
32b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
32c0: 72 6f 72 5f 63 6f 64 65 28 63 6f 6e 74 65 78 74  ror_code(context
32d0: 2c 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , rc);.  }else{.
32e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
32f0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
3300: 20 72 65 73 2e 7a 2c 20 2d 31 2c 20 53 51 4c 49   res.z, -1, SQLI
3310: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
3320: 20 7d 0a 20 20 73 74 72 69 6e 67 46 72 65 65 28   }.  stringFree(
3330: 26 72 65 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &res);.}../*.** 
3340: 4c 6f 6f 6b 20 75 70 20 74 68 65 20 6e 65 78 74  Look up the next
3350: 20 74 61 73 6b 20 66 6f 72 20 63 6c 69 65 6e 74   task for client
3360: 20 69 43 6c 69 65 6e 74 20 69 6e 20 74 68 65 20   iClient in the 
3370: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74  database..** Ret
3380: 75 72 6e 20 74 68 65 20 74 61 73 6b 20 73 63 72  urn the task scr
3390: 69 70 74 20 61 6e 64 20 74 68 65 20 74 61 73 6b  ipt and the task
33a0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 6d 61 72 6b   number and mark
33b0: 20 74 68 61 74 0a 2a 2a 20 74 61 73 6b 20 61 73   that.** task as
33c0: 20 62 65 69 6e 67 20 75 6e 64 65 72 20 77 61 79   being under way
33d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33e0: 73 74 61 72 74 53 63 72 69 70 74 28 0a 20 20 69  startScript(.  i
33f0: 6e 74 20 69 43 6c 69 65 6e 74 2c 20 20 20 20 20  nt iClient,     
3400: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3410: 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72 20 2a 2f  client number */
3420: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 53 63 72 69  .  char **pzScri
3430: 70 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pt,          /* 
3440: 57 72 69 74 65 20 74 61 73 6b 20 73 63 72 69 70  Write task scrip
3450: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
3460: 2a 70 54 61 73 6b 49 64 2c 20 20 20 20 20 20 20  *pTaskId,       
3470: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
3480: 61 73 6b 20 6e 75 6d 62 65 72 20 68 65 72 65 20  ask number here 
3490: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 54 61  */.  char **pzTa
34a0: 73 6b 4e 61 6d 65 20 20 20 20 20 20 20 20 20 2f  skName         /
34b0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
34c0: 73 6b 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  sk */.){.  sqlit
34d0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
34e0: 20 30 3b 0a 20 20 69 6e 74 20 74 61 73 6b 49 64   0;.  int taskId
34f0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
3500: 74 20 74 6f 74 61 6c 54 69 6d 65 20 3d 20 30 3b  t totalTime = 0;
3510: 0a 0a 20 20 2a 70 7a 53 63 72 69 70 74 20 3d 20  ..  *pzScript = 
3520: 30 3b 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20  0;.  g.iTimeout 
3530: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  = 0;.  while(1){
3540: 0a 20 20 20 20 72 63 20 3d 20 74 72 79 53 71 6c  .    rc = trySql
3550: 28 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54  ("BEGIN IMMEDIAT
3560: 45 22 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  E");.    if( rc=
3570: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
3580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
3590: 65 65 70 28 31 30 29 3b 0a 20 20 20 20 20 20 74  eep(10);.      t
35a0: 6f 74 61 6c 54 69 6d 65 20 2b 3d 20 31 30 3b 0a  otalTime += 10;.
35b0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
35c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
35d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35e0: 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28       fatalError(
35f0: 22 69 6e 20 73 74 61 72 74 53 63 72 69 70 74 3a  "in startScript:
3600: 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72   %s", sqlite3_er
3610: 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a 20 20 20  rmsg(g.db));.   
3620: 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 6e 45 72   }.    if( g.nEr
3630: 72 6f 72 20 7c 7c 20 67 2e 6e 54 65 73 74 20 29  ror || g.nTest )
3640: 7b 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22  {.      runSql("
3650: 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 73 20  UPDATE counters 
3660: 53 45 54 20 6e 45 72 72 6f 72 3d 6e 45 72 72 6f  SET nError=nErro
3670: 72 2b 25 64 2c 20 6e 54 65 73 74 3d 6e 54 65 73  r+%d, nTest=nTes
3680: 74 2b 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t+%d",.         
3690: 20 20 20 20 67 2e 6e 45 72 72 6f 72 2c 20 67 2e      g.nError, g.
36a0: 6e 54 65 73 74 29 3b 0a 20 20 20 20 20 20 67 2e  nTest);.      g.
36b0: 6e 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  nError = 0;.    
36c0: 20 20 67 2e 6e 54 65 73 74 20 3d 20 30 3b 0a 20    g.nTest = 0;. 
36d0: 20 20 20 7d 0a 20 20 20 20 70 53 74 6d 74 20 3d     }.    pStmt =
36e0: 20 70 72 65 70 61 72 65 53 71 6c 28 22 53 45 4c   prepareSql("SEL
36f0: 45 43 54 20 31 20 46 52 4f 4d 20 63 6c 69 65 6e  ECT 1 FROM clien
3700: 74 20 57 48 45 52 45 20 69 64 3d 25 64 20 41 4e  t WHERE id=%d AN
3710: 44 20 77 61 6e 74 48 61 6c 74 22 2c 69 43 6c 69  D wantHalt",iCli
3720: 65 6e 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ent);.    rc = s
3730: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
3740: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
3750: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
3760: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
3770: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
3780: 20 72 75 6e 53 71 6c 28 22 44 45 4c 45 54 45 20   runSql("DELETE 
3790: 46 52 4f 4d 20 63 6c 69 65 6e 74 20 57 48 45 52  FROM client WHER
37a0: 45 20 69 64 3d 25 64 22 2c 20 69 43 6c 69 65 6e  E id=%d", iClien
37b0: 74 29 3b 0a 20 20 20 20 20 20 67 2e 69 54 69 6d  t);.      g.iTim
37c0: 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f 54  eout = DEFAULT_T
37d0: 49 4d 45 4f 55 54 3b 0a 20 20 20 20 20 20 72 75  IMEOUT;.      ru
37e0: 6e 53 71 6c 28 22 43 4f 4d 4d 49 54 20 54 52 41  nSql("COMMIT TRA
37f0: 4e 53 41 43 54 49 4f 4e 3b 22 29 3b 0a 20 20 20  NSACTION;");.   
3800: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3810: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20  _DONE;.    }.   
3820: 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65   pStmt = prepare
3830: 53 71 6c 28 0a 20 20 20 20 20 20 20 20 20 20 20  Sql(.           
3840: 20 20 20 22 53 45 4c 45 43 54 20 73 63 72 69 70     "SELECT scrip
3850: 74 2c 20 69 64 2c 20 6e 61 6d 65 20 46 52 4f 4d  t, id, name FROM
3860: 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20   task".         
3870: 20 20 20 20 20 22 20 57 48 45 52 45 20 63 6c 69       " WHERE cli
3880: 65 6e 74 3d 25 64 20 41 4e 44 20 73 74 61 72 74  ent=%d AND start
3890: 74 69 6d 65 20 49 53 20 4e 55 4c 4c 22 0a 20 20  time IS NULL".  
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
38b0: 44 45 52 20 42 59 20 69 64 20 4c 49 4d 49 54 20  DER BY id LIMIT 
38c0: 31 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20  1", iClient);.  
38d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
38e0: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
38f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
3900: 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OW ){.      int 
3910: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
3920: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
3930: 30 29 3b 0a 20 20 20 20 20 20 2a 70 7a 53 63 72  0);.      *pzScr
3940: 69 70 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ipt = sqlite3_ma
3950: 6c 6c 6f 63 28 6e 2b 31 29 3b 0a 20 20 20 20 20  lloc(n+1);.     
3960: 20 73 74 72 63 70 79 28 2a 70 7a 53 63 72 69 70   strcpy(*pzScrip
3970: 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  t, (const char*)
3980: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
3990: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  ext(pStmt, 0));.
39a0: 20 20 20 20 20 20 2a 70 54 61 73 6b 49 64 20 3d        *pTaskId =
39b0: 20 74 61 73 6b 49 64 20 3d 20 73 71 6c 69 74 65   taskId = sqlite
39c0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
39d0: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 2a 70  mt, 1);.      *p
39e0: 7a 54 61 73 6b 4e 61 6d 65 20 3d 20 73 71 6c 69  zTaskName = sqli
39f0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
3a00: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
3a10: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 29  _text(pStmt, 2))
3a20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3a30: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
3a40: 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22 55  .      runSql("U
3a50: 50 44 41 54 45 20 74 61 73 6b 22 0a 20 20 20 20  PDATE task".    
3a60: 20 20 20 20 20 20 20 20 20 22 20 20 20 53 45 54           "   SET
3a70: 20 73 74 61 72 74 74 69 6d 65 3d 73 74 72 66 74   starttime=strft
3a80: 69 6d 65 28 27 25 25 59 2d 25 25 6d 2d 25 25 64  ime('%%Y-%%m-%%d
3a90: 20 25 25 48 3a 25 25 4d 3a 25 25 66 27 2c 27 6e   %%H:%%M:%%f','n
3aa0: 6f 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ow')".          
3ab0: 20 20 20 22 20 57 48 45 52 45 20 69 64 3d 25 64     " WHERE id=%d
3ac0: 3b 22 2c 20 74 61 73 6b 49 64 29 3b 0a 20 20 20  ;", taskId);.   
3ad0: 20 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20     g.iTimeout = 
3ae0: 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b  DEFAULT_TIMEOUT;
3af0: 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22 43  .      runSql("C
3b00: 4f 4d 4d 49 54 20 54 52 41 4e 53 41 43 54 49 4f  OMMIT TRANSACTIO
3b10: 4e 3b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  N;");.      retu
3b20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3b30: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
3b40: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
3b50: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
3b60: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
3b70: 20 20 69 66 28 20 74 6f 74 61 6c 54 69 6d 65 3e    if( totalTime>
3b80: 33 30 30 30 30 20 29 7b 0a 20 20 20 20 20 20 20  30000 ){.       
3b90: 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 57   errorMessage("W
3ba0: 61 69 74 65 64 20 6f 76 65 72 20 33 30 20 73 65  aited over 30 se
3bb0: 63 6f 6e 64 73 20 77 69 74 68 20 6e 6f 20 77 6f  conds with no wo
3bc0: 72 6b 2e 20 20 47 69 76 69 6e 67 20 75 70 2e 22  rk.  Giving up."
3bd0: 29 3b 0a 20 20 20 20 20 20 20 20 72 75 6e 53 71  );.        runSq
3be0: 6c 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  l("DELETE FROM c
3bf0: 6c 69 65 6e 74 20 57 48 45 52 45 20 69 64 3d 25  lient WHERE id=%
3c00: 64 3b 20 43 4f 4d 4d 49 54 3b 22 2c 20 69 43 6c  d; COMMIT;", iCl
3c10: 69 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  ient);.        s
3c20: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64  qlite3_close(g.d
3c30: 62 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  b);.        exit
3c40: 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
3c50: 20 20 20 77 68 69 6c 65 28 20 74 72 79 53 71 6c     while( trySql
3c60: 28 22 43 4f 4d 4d 49 54 22 29 3d 3d 53 51 4c 49  ("COMMIT")==SQLI
3c70: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
3c80: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
3c90: 28 31 30 29 3b 0a 20 20 20 20 20 20 20 20 74 6f  (10);.        to
3ca0: 74 61 6c 54 69 6d 65 20 2b 3d 20 31 30 3b 0a 20  talTime += 10;. 
3cb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
3cc0: 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b  ite3_sleep(100);
3cd0: 0a 20 20 20 20 20 20 74 6f 74 61 6c 54 69 6d 65  .      totalTime
3ce0: 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 63   += 100;.      c
3cf0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
3d00: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 25     fatalError("%
3d10: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
3d20: 73 67 28 67 2e 64 62 29 29 3b 0a 20 20 7d 0a 20  sg(g.db));.  }. 
3d30: 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 44 45   g.iTimeout = DE
3d40: 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a 7d  FAULT_TIMEOUT;.}
3d50: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
3d60: 63 72 69 70 74 20 61 73 20 68 61 76 69 6e 67 20  cript as having 
3d70: 66 69 6e 69 73 68 65 64 2e 20 20 20 52 65 6d 6f  finished.   Remo
3d80: 76 65 20 74 68 65 20 43 4c 49 45 4e 54 20 74 61  ve the CLIENT ta
3d90: 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 69 66 20  ble entry.** if 
3da0: 62 53 68 75 74 64 6f 77 6e 20 69 73 20 74 72 75  bShutdown is tru
3db0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3dc0: 20 66 69 6e 69 73 68 53 63 72 69 70 74 28 69 6e   finishScript(in
3dd0: 74 20 69 43 6c 69 65 6e 74 2c 20 69 6e 74 20 74  t iClient, int t
3de0: 61 73 6b 49 64 2c 20 69 6e 74 20 62 53 68 75 74  askId, int bShut
3df0: 64 6f 77 6e 29 7b 0a 20 20 72 75 6e 53 71 6c 28  down){.  runSql(
3e00: 22 55 50 44 41 54 45 20 74 61 73 6b 22 0a 20 20  "UPDATE task".  
3e10: 20 20 20 20 20 20 20 22 20 20 20 53 45 54 20 65         "   SET e
3e20: 6e 64 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28  ndtime=strftime(
3e30: 27 25 25 59 2d 25 25 6d 2d 25 25 64 20 25 25 48  '%%Y-%%m-%%d %%H
3e40: 3a 25 25 4d 3a 25 25 66 27 2c 27 6e 6f 77 27 29  :%%M:%%f','now')
3e50: 22 0a 20 20 20 20 20 20 20 20 20 22 20 57 48 45  ".         " WHE
3e60: 52 45 20 69 64 3d 25 64 3b 22 2c 20 74 61 73 6b  RE id=%d;", task
3e70: 49 64 29 3b 0a 20 20 69 66 28 20 62 53 68 75 74  Id);.  if( bShut
3e80: 64 6f 77 6e 20 29 7b 0a 20 20 20 20 72 75 6e 53  down ){.    runS
3e90: 71 6c 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ql("DELETE FROM 
3ea0: 63 6c 69 65 6e 74 20 57 48 45 52 45 20 69 64 3d  client WHERE id=
3eb0: 25 64 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20  %d", iClient);. 
3ec0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
3ed0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3ee0: 53 74 61 72 74 20 75 70 20 61 20 63 6c 69 65 6e  Start up a clien
3ef0: 74 20 70 72 6f 63 65 73 73 20 66 6f 72 20 69 43  t process for iC
3f00: 6c 69 65 6e 74 2c 20 69 66 20 69 74 20 69 73 20  lient, if it is 
3f10: 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 72  not already.** r
3f20: 75 6e 6e 69 6e 67 2e 20 20 49 66 20 74 68 65 20  unning.  If the 
3f30: 63 6c 69 65 6e 74 20 69 73 20 61 6c 72 65 61 64  client is alread
3f40: 79 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65 6e 20  y running, then 
3f50: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
3f60: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
3f70: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 72 74  tatic void start
3f80: 43 6c 69 65 6e 74 28 69 6e 74 20 69 43 6c 69 65  Client(int iClie
3f90: 6e 74 29 7b 0a 20 20 72 75 6e 53 71 6c 28 22 49  nt){.  runSql("I
3fa0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
3fb0: 49 4e 54 4f 20 63 6c 69 65 6e 74 20 56 41 4c 55  INTO client VALU
3fc0: 45 53 28 25 64 2c 30 29 22 2c 20 69 43 6c 69 65  ES(%d,0)", iClie
3fd0: 6e 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  nt);.  if( sqlit
3fe0: 65 33 5f 63 68 61 6e 67 65 73 28 67 2e 64 62 29  e3_changes(g.db)
3ff0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   ){.    char *zS
4000: 79 73 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ys;.    int rc;.
4010: 20 20 20 20 7a 53 79 73 20 3d 20 73 71 6c 69 74      zSys = sqlit
4020: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 5c  e3_mprintf("%s \
4030: 22 25 73 5c 22 20 2d 2d 63 6c 69 65 6e 74 20 25  "%s\" --client %
4040: 64 20 2d 2d 74 72 61 63 65 20 25 64 22 2c 0a 20  d --trace %d",. 
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 67 2e 61 72 67 76 30 2c 20 67 2e 7a 44 62 46 69  g.argv0, g.zDbFi
4070: 6c 65 2c 20 69 43 6c 69 65 6e 74 2c 20 67 2e 69  le, iClient, g.i
4080: 54 72 61 63 65 29 3b 0a 20 20 20 20 69 66 28 20  Trace);.    if( 
4090: 67 2e 62 53 71 6c 54 72 61 63 65 20 29 7b 0a 20  g.bSqlTrace ){. 
40a0: 20 20 20 20 20 7a 53 79 73 20 3d 20 73 71 6c 69       zSys = sqli
40b0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20  te3_mprintf("%z 
40c0: 2d 2d 73 71 6c 74 72 61 63 65 22 2c 20 7a 53 79  --sqltrace", zSy
40d0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
40e0: 28 20 67 2e 62 53 79 6e 63 20 29 7b 0a 20 20 20  ( g.bSync ){.   
40f0: 20 20 20 7a 53 79 73 20 3d 20 73 71 6c 69 74 65     zSys = sqlite
4100: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20 2d 2d  3_mprintf("%z --
4110: 73 79 6e 63 22 2c 20 7a 53 79 73 29 3b 0a 20 20  sync", zSys);.  
4120: 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 7a 56    }.    if( g.zV
4130: 66 73 20 29 7b 0a 20 20 20 20 20 20 7a 53 79 73  fs ){.      zSys
4140: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4150: 74 66 28 22 25 7a 20 2d 2d 76 66 73 20 5c 22 25  tf("%z --vfs \"%
4160: 73 5c 22 22 2c 20 7a 53 79 73 2c 20 67 2e 7a 56  s\"", zSys, g.zV
4170: 66 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fs);.    }.    i
4180: 66 28 20 67 2e 69 54 72 61 63 65 3e 3d 32 20 29  f( g.iTrace>=2 )
4190: 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 73 79 73   logMessage("sys
41a0: 74 65 6d 28 27 25 71 27 29 22 2c 20 7a 53 79 73  tem('%q')", zSys
41b0: 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
41c0: 5f 57 49 4e 33 32 29 0a 20 20 20 20 7a 53 79 73  _WIN32).    zSys
41d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
41e0: 74 66 28 22 25 7a 20 26 22 2c 20 7a 53 79 73 29  tf("%z &", zSys)
41f0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 79 73 74 65  ;.    rc = syste
4200: 6d 28 7a 53 79 73 29 3b 0a 20 20 20 20 69 66 28  m(zSys);.    if(
4210: 20 72 63 20 29 20 65 72 72 6f 72 4d 65 73 73 61   rc ) errorMessa
4220: 67 65 28 22 73 79 73 74 65 6d 28 29 20 66 61 69  ge("system() fai
4230: 6c 73 20 77 69 74 68 20 65 72 72 6f 72 20 63 6f  ls with error co
4240: 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 23 65 6c  de %d", rc);.#el
4250: 73 65 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 53  se.    {.      S
4260: 54 41 52 54 55 50 49 4e 46 4f 41 20 73 74 61 72  TARTUPINFOA star
4270: 74 75 70 49 6e 66 6f 3b 0a 20 20 20 20 20 20 50  tupInfo;.      P
4280: 52 4f 43 45 53 53 5f 49 4e 46 4f 52 4d 41 54 49  ROCESS_INFORMATI
4290: 4f 4e 20 70 72 6f 63 65 73 73 49 6e 66 6f 3b 0a  ON processInfo;.
42a0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 74        memset(&st
42b0: 61 72 74 75 70 49 6e 66 6f 2c 20 30 2c 20 73 69  artupInfo, 0, si
42c0: 7a 65 6f 66 28 73 74 61 72 74 75 70 49 6e 66 6f  zeof(startupInfo
42d0: 29 29 3b 0a 20 20 20 20 20 20 73 74 61 72 74 75  ));.      startu
42e0: 70 49 6e 66 6f 2e 63 62 20 3d 20 73 69 7a 65 6f  pInfo.cb = sizeo
42f0: 66 28 73 74 61 72 74 75 70 49 6e 66 6f 29 3b 0a  f(startupInfo);.
4300: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 72        memset(&pr
4310: 6f 63 65 73 73 49 6e 66 6f 2c 20 30 2c 20 73 69  ocessInfo, 0, si
4320: 7a 65 6f 66 28 70 72 6f 63 65 73 73 49 6e 66 6f  zeof(processInfo
4330: 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 43  ));.      rc = C
4340: 72 65 61 74 65 50 72 6f 63 65 73 73 41 28 4e 55  reateProcessA(NU
4350: 4c 4c 2c 20 7a 53 79 73 2c 20 4e 55 4c 4c 2c 20  LL, zSys, NULL, 
4360: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 30 2c 20  NULL, FALSE, 0, 
4370: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  NULL, NULL,.    
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 20 20 20 20 26 73 74 61 72 74 75 70 49 6e 66 6f      &startupInfo
43a0: 2c 20 26 70 72 6f 63 65 73 73 49 6e 66 6f 29 3b  , &processInfo);
43b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
43c0: 0a 20 20 20 20 20 20 20 20 43 6c 6f 73 65 48 61  .        CloseHa
43d0: 6e 64 6c 65 28 70 72 6f 63 65 73 73 49 6e 66 6f  ndle(processInfo
43e0: 2e 68 54 68 72 65 61 64 29 3b 0a 20 20 20 20 20  .hThread);.     
43f0: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
4400: 72 6f 63 65 73 73 49 6e 66 6f 2e 68 50 72 6f 63  rocessInfo.hProc
4410: 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ess);.      }els
4420: 65 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72  e{.        error
4430: 4d 65 73 73 61 67 65 28 22 43 72 65 61 74 65 50  Message("CreateP
4440: 72 6f 63 65 73 73 41 28 29 20 66 61 69 6c 73 20  rocessA() fails 
4450: 77 69 74 68 20 65 72 72 6f 72 20 63 6f 64 65 20  with error code 
4460: 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %lu",.          
4470: 20 20 20 20 20 20 20 20 20 20 20 47 65 74 4c 61             GetLa
4480: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
4490: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
44a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
44b0: 65 28 7a 53 79 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(zSys);.  }.}..
44c0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 65  /*.** Read the e
44d0: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
44e0: 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d   a file into mem
44f0: 6f 72 79 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ory.*/.static ch
4500: 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e  ar *readFile(con
4510: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
4520: 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20  me){.  FILE *in 
4530: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  = fopen(zFilenam
4540: 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67  e, "rb");.  long
4550: 20 73 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   sz;.  char *z;.
4560: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
4570: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63     fatalError("c
4580: 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
4590: 22 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20  " for reading", 
45a0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
45b0: 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53    fseek(in, 0, S
45c0: 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d  EEK_END);.  sz =
45d0: 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65   ftell(in);.  re
45e0: 77 69 6e 64 28 69 6e 29 3b 0a 20 20 7a 20 3d 20  wind(in);.  z = 
45f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
4600: 73 7a 2b 31 20 29 3b 0a 20 20 73 7a 20 3d 20 28  sz+1 );.  sz = (
4610: 6c 6f 6e 67 29 66 72 65 61 64 28 7a 2c 20 31 2c  long)fread(z, 1,
4620: 20 73 7a 2c 20 69 6e 29 3b 0a 20 20 7a 5b 73 7a   sz, in);.  z[sz
4630: 5d 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73 65 28  ] = 0;.  fclose(
4640: 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  in);.  return z;
4650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4660: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
4670: 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a  he next token..*
4680: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6f 6b  /.static int tok
4690: 65 6e 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  enLength(const c
46a0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 6e 4c  har *z, int *pnL
46b0: 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  ine){.  int n = 
46c0: 30 3b 0a 20 20 69 66 28 20 69 73 73 70 61 63 65  0;.  if( isspace
46d0: 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d  (z[0]) || (z[0]=
46e0: 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2a  ='/' && z[1]=='*
46f0: 27 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 6e  ') ){.    int in
4700: 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 63  C = 0;.    int c
4710: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
4720: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 43  '/' ){.      inC
4730: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 20 3d 20   = 1;.      n = 
4740: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  2;.    }.    whi
4750: 6c 65 28 20 28 63 20 3d 20 7a 5b 6e 2b 2b 5d 29  le( (c = z[n++])
4760: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
4770: 20 63 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 6e 4c   c=='\n' ) (*pnL
4780: 69 6e 65 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66  ine)++;.      if
4790: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
47a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
47b0: 66 28 20 69 6e 43 20 26 26 20 63 3d 3d 27 2a 27  f( inC && c=='*'
47c0: 20 26 26 20 7a 5b 6e 5d 3d 3d 27 2f 27 20 29 7b   && z[n]=='/' ){
47d0: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
47e0: 20 20 20 20 20 20 69 6e 43 20 3d 20 30 3b 0a 20        inC = 0;. 
47f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
4800: 69 6e 43 20 26 26 20 63 3d 3d 27 2f 27 20 26 26  inC && c=='/' &&
4810: 20 7a 5b 6e 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20   z[n]=='*' ){.  
4820: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
4830: 20 20 20 69 6e 43 20 3d 20 31 3b 0a 20 20 20 20     inC = 1;.    
4840: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 6e 43    }else if( !inC
4850: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
4860: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4870: 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 65 6c 73  .    n--;.  }els
4880: 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20  e if( z[0]=='-' 
4890: 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a  && z[1]=='-' ){.
48a0: 20 20 20 20 66 6f 72 28 6e 3d 32 3b 20 7a 5b 6e      for(n=2; z[n
48b0: 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27 5c 6e 27 3b  ] && z[n]!='\n';
48c0: 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20   n++){}.    if( 
48d0: 7a 5b 6e 5d 20 29 7b 20 28 2a 70 6e 4c 69 6e 65  z[n] ){ (*pnLine
48e0: 29 2b 2b 3b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 65  )++; n++; }.  }e
48f0: 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 22  lse if( z[0]=='"
4900: 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 5c 27 27 20  ' || z[0]=='\'' 
4910: 29 7b 0a 20 20 20 20 69 6e 74 20 64 65 6c 69 6d  ){.    int delim
4920: 20 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 66 6f 72   = z[0];.    for
4930: 28 6e 3d 31 3b 20 7a 5b 6e 5d 3b 20 6e 2b 2b 29  (n=1; z[n]; n++)
4940: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d  {.      if( z[n]
4950: 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 6e 4c 69 6e  =='\n' ) (*pnLin
4960: 65 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  e)++;.      if( 
4970: 7a 5b 6e 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20  z[n]==delim ){. 
4980: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
4990: 20 20 20 20 69 66 28 20 7a 5b 6e 2b 31 5d 21 3d      if( z[n+1]!=
49a0: 64 65 6c 69 6d 20 29 20 62 72 65 61 6b 3b 0a 20  delim ) break;. 
49b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
49c0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b  else{.    int c;
49d0: 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 28 63  .    for(n=1; (c
49e0: 20 3d 20 7a 5b 6e 5d 29 21 3d 30 20 26 26 20 21   = z[n])!=0 && !
49f0: 69 73 73 70 61 63 65 28 63 29 20 26 26 20 63 21  isspace(c) && c!
4a00: 3d 27 22 27 20 26 26 20 63 21 3d 27 5c 27 27 20  ='"' && c!='\'' 
4a10: 26 26 20 63 21 3d 27 3b 27 3b 20 6e 2b 2b 29 7b  && c!=';'; n++){
4a20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
4a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
4a40: 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 69  a single token i
4a50: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4a60: 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
4a70: 6e 74 20 65 78 74 72 61 63 74 54 6f 6b 65 6e 28  nt extractToken(
4a80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
4a90: 20 69 6e 74 20 6e 49 6e 2c 20 63 68 61 72 20 2a   int nIn, char *
4aa0: 7a 4f 75 74 2c 20 69 6e 74 20 6e 4f 75 74 29 7b  zOut, int nOut){
4ab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4ac0: 6e 49 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 7a 4f  nIn<=0 ){.    zO
4ad0: 75 74 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 72  ut[0] = 0;.    r
4ae0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
4af0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 20 26 26  or(i=0; i<nIn &&
4b00: 20 69 3c 6e 4f 75 74 2d 31 20 26 26 20 21 69 73   i<nOut-1 && !is
4b10: 73 70 61 63 65 28 7a 49 6e 5b 69 5d 29 3b 20 69  space(zIn[i]); i
4b20: 2b 2b 29 7b 20 7a 4f 75 74 5b 69 5d 20 3d 20 7a  ++){ zOut[i] = z
4b30: 49 6e 5b 69 5d 3b 20 7d 0a 20 20 7a 4f 75 74 5b  In[i]; }.  zOut[
4b40: 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
4b50: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   i;.}../*.** Fin
4b60: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4b70: 63 68 61 72 61 63 74 65 72 73 20 75 70 20 74 6f  characters up to
4b80: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
4b90: 65 20 6e 65 78 74 20 22 2d 2d 65 6e 64 22 20 74  e next "--end" t
4ba0: 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oken..*/.static 
4bb0: 69 6e 74 20 66 69 6e 64 45 6e 64 28 63 6f 6e 73  int findEnd(cons
4bc0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t char *z, int *
4bd0: 70 6e 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e  pnLine){.  int n
4be0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a   = 0;.  while( z
4bf0: 5b 6e 5d 20 26 26 20 28 73 74 72 6e 63 6d 70 28  [n] && (strncmp(
4c00: 7a 2b 6e 2c 22 2d 2d 65 6e 64 22 2c 35 29 20 7c  z+n,"--end",5) |
4c10: 7c 20 21 69 73 73 70 61 63 65 28 7a 5b 6e 2b 35  | !isspace(z[n+5
4c20: 5d 29 29 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ])) ){.    n += 
4c30: 74 6f 6b 65 6e 4c 65 6e 67 74 68 28 7a 2b 6e 2c  tokenLength(z+n,
4c40: 20 70 6e 4c 69 6e 65 29 3b 0a 20 20 7d 0a 20 20   pnLine);.  }.  
4c50: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
4c60: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 75 6d 62  ** Find the numb
4c70: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
4c80: 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
4c90: 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20   character past 
4ca0: 74 68 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 65  the.** of the ne
4cb0: 78 74 20 22 2d 2d 65 6e 64 69 66 22 20 20 6f 72  xt "--endif"  or
4cc0: 20 22 2d 2d 65 6c 73 65 22 20 74 6f 6b 65 6e 2e   "--else" token.
4cd0: 20 4e 65 73 74 65 64 20 2d 2d 69 66 20 63 6f 6d   Nested --if com
4ce0: 6d 61 6e 64 73 20 61 72 65 0a 2a 2a 20 61 6c 73  mands are.** als
4cf0: 6f 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  o skipped..*/.st
4d00: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 45 6e 64  atic int findEnd
4d10: 69 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  if(const char *z
4d20: 2c 20 69 6e 74 20 73 74 6f 70 41 74 45 6c 73 65  , int stopAtElse
4d30: 2c 20 69 6e 74 20 2a 70 6e 4c 69 6e 65 29 7b 0a  , int *pnLine){.
4d40: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77    int n = 0;.  w
4d50: 68 69 6c 65 28 20 7a 5b 6e 5d 20 29 7b 0a 20 20  hile( z[n] ){.  
4d60: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 74 6f 6b 65    int len = toke
4d70: 6e 4c 65 6e 67 74 68 28 7a 2b 6e 2c 20 70 6e 4c  nLength(z+n, pnL
4d80: 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28 73  ine);.    if( (s
4d90: 74 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 65 6e  trncmp(z+n,"--en
4da0: 64 69 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73  dif",7)==0 && is
4db0: 73 70 61 63 65 28 7a 5b 6e 2b 37 5d 29 29 0a 20  space(z[n+7])). 
4dc0: 20 20 20 20 7c 7c 20 28 73 74 6f 70 41 74 45 6c      || (stopAtEl
4dd0: 73 65 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b  se && strncmp(z+
4de0: 6e 2c 22 2d 2d 65 6c 73 65 22 2c 36 29 3d 3d 30  n,"--else",6)==0
4df0: 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 6e 2b   && isspace(z[n+
4e00: 36 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  6])).    ){.    
4e10: 20 20 72 65 74 75 72 6e 20 6e 2b 6c 65 6e 3b 0a    return n+len;.
4e20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
4e30: 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 69 66 22  rncmp(z+n,"--if"
4e40: 2c 34 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,4)==0 && isspac
4e50: 65 28 7a 5b 6e 2b 34 5d 29 20 29 7b 0a 20 20 20  e(z[n+4]) ){.   
4e60: 20 20 20 69 6e 74 20 73 6b 69 70 20 3d 20 66 69     int skip = fi
4e70: 6e 64 45 6e 64 69 66 28 7a 2b 6e 2b 6c 65 6e 2c  ndEndif(z+n+len,
4e80: 20 30 2c 20 70 6e 4c 69 6e 65 29 3b 0a 20 20 20   0, pnLine);.   
4e90: 20 20 20 6e 20 2b 3d 20 73 6b 69 70 20 2b 20 6c     n += skip + l
4ea0: 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  en;.    }else{. 
4eb0: 20 20 20 20 20 6e 20 2b 3d 20 6c 65 6e 3b 0a 20       n += len;. 
4ec0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4ed0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  n n;.}../*.** Wa
4ee0: 69 74 20 66 6f 72 20 61 20 63 6c 69 65 6e 74 20  it for a client 
4ef0: 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 70 6c  process to compl
4f00: 65 74 65 20 61 6c 6c 20 69 74 73 20 74 61 73 6b  ete all its task
4f10: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
4f20: 20 77 61 69 74 46 6f 72 43 6c 69 65 6e 74 28 69   waitForClient(i
4f30: 6e 74 20 69 43 6c 69 65 6e 74 2c 20 69 6e 74 20  nt iClient, int 
4f40: 69 54 69 6d 65 6f 75 74 2c 20 63 68 61 72 20 2a  iTimeout, char *
4f50: 7a 45 72 72 50 72 65 66 69 78 29 7b 0a 20 20 73  zErrPrefix){.  s
4f60: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
4f70: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
4f80: 69 66 28 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b  if( iClient>0 ){
4f90: 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72 65  .    pStmt = pre
4fa0: 70 61 72 65 53 71 6c 28 0a 20 20 20 20 20 20 20  pareSql(.       
4fb0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
4fc0: 31 20 46 52 4f 4d 20 74 61 73 6b 22 0a 20 20 20  1 FROM task".   
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
4fe0: 45 52 45 20 63 6c 69 65 6e 74 3d 25 64 22 0a 20  ERE client=%d". 
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
5000: 20 20 41 4e 44 20 63 6c 69 65 6e 74 20 49 4e 20    AND client IN 
5010: 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  (SELECT id FROM 
5020: 63 6c 69 65 6e 74 29 22 0a 20 20 20 20 20 20 20  client)".       
5030: 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 65          "  AND e
5040: 6e 64 74 69 6d 65 20 49 53 20 4e 55 4c 4c 22 2c  ndtime IS NULL",
5050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5060: 69 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  iClient);.  }els
5070: 65 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70  e{.    pStmt = p
5080: 72 65 70 61 72 65 53 71 6c 28 0a 20 20 20 20 20  repareSql(.     
5090: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
50a0: 54 20 31 20 46 52 4f 4d 20 74 61 73 6b 22 0a 20  T 1 FROM task". 
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
50c0: 57 48 45 52 45 20 63 6c 69 65 6e 74 20 49 4e 20  WHERE client IN 
50d0: 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  (SELECT id FROM 
50e0: 63 6c 69 65 6e 74 29 22 0a 20 20 20 20 20 20 20  client)".       
50f0: 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
5100: 65 6e 64 74 69 6d 65 20 49 53 20 4e 55 4c 4c 22  endtime IS NULL"
5110: 29 3b 0a 20 20 7d 0a 20 20 67 2e 69 54 69 6d 65  );.  }.  g.iTime
5120: 6f 75 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  out = 0;.  while
5130: 28 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33  ( ((rc = sqlite3
5140: 5f 73 74 65 70 28 70 53 74 6d 74 29 29 3d 3d 53  _step(pStmt))==S
5150: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63  QLITE_BUSY || rc
5160: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 29 0a 20 20  ==SQLITE_ROW).  
5170: 20 20 26 26 20 69 54 69 6d 65 6f 75 74 3e 30 0a    && iTimeout>0.
5180: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
5190: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
51a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
51b0: 28 35 30 29 3b 0a 20 20 20 20 69 54 69 6d 65 6f  (50);.    iTimeo
51c0: 75 74 20 2d 3d 20 35 30 3b 0a 20 20 7d 0a 20 20  ut -= 50;.  }.  
51d0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
51e0: 28 70 53 74 6d 74 29 3b 0a 20 20 67 2e 69 54 69  (pStmt);.  g.iTi
51f0: 6d 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f  meout = DEFAULT_
5200: 54 49 4d 45 4f 55 54 3b 0a 20 20 69 66 28 20 72  TIMEOUT;.  if( r
5210: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
5220: 7b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 50 72  {.    if( zErrPr
5230: 65 66 69 78 3d 3d 30 20 29 20 7a 45 72 72 50 72  efix==0 ) zErrPr
5240: 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 69  efix = "";.    i
5250: 66 28 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b 0a  f( iClient>0 ){.
5260: 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61        errorMessa
5270: 67 65 28 22 25 73 74 69 6d 65 6f 75 74 20 77 61  ge("%stimeout wa
5280: 69 74 69 6e 67 20 66 6f 72 20 63 6c 69 65 6e 74  iting for client
5290: 20 25 64 22 2c 20 7a 45 72 72 50 72 65 66 69 78   %d", zErrPrefix
52a0: 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20  , iClient);.    
52b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72 72  }else{.      err
52c0: 6f 72 4d 65 73 73 61 67 65 28 22 25 73 74 69 6d  orMessage("%stim
52d0: 65 6f 75 74 20 77 61 69 74 69 6e 67 20 66 6f 72  eout waiting for
52e0: 20 61 6c 6c 20 63 6c 69 65 6e 74 73 22 2c 20 7a   all clients", z
52f0: 45 72 72 50 72 65 66 69 78 29 3b 0a 20 20 20 20  ErrPrefix);.    
5300: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75  }.  }.}../* Retu
5310: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
5320: 74 68 65 20 74 61 69 6c 20 6f 66 20 61 20 66 69  the tail of a fi
5330: 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63  lename.*/.static
5340: 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 54   char *filenameT
5350: 61 69 6c 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ail(char *z){.  
5360: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
5370: 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  i=j=0; z[i]; i++
5380: 29 20 69 66 28 20 69 73 44 69 72 53 65 70 28 7a  ) if( isDirSep(z
5390: 5b 69 5d 29 20 29 20 6a 20 3d 20 69 2b 31 3b 0a  [i]) ) j = i+1;.
53a0: 20 20 72 65 74 75 72 6e 20 7a 2b 6a 3b 0a 7d 0a    return z+j;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
53c0: 20 7a 41 72 67 20 61 73 20 61 20 62 6f 6f 6c 65   zArg as a boole
53d0: 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72  an value.  Retur
53e0: 6e 20 65 69 74 68 65 72 20 30 20 6f 72 20 31 2e  n either 0 or 1.
53f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5400: 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 68 61 72  ooleanValue(char
5410: 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 69   *zArg){.  int i
5420: 3b 0a 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20  ;.  if( zArg==0 
5430: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
5440: 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d  r(i=0; zArg[i]>=
5450: 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d  '0' && zArg[i]<=
5460: 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  '9'; i++){}.  if
5470: 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d  ( i>0 && zArg[i]
5480: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 74 6f  ==0 ) return ato
5490: 69 28 7a 41 72 67 29 3b 0a 20 20 69 66 28 20 73  i(zArg);.  if( s
54a0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
54b0: 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c  Arg, "on")==0 ||
54c0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
54d0: 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20  (zArg,"yes")==0 
54e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
54f0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
5500: 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
5510: 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71   "off")==0 || sq
5520: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
5530: 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20  rg,"no")==0 ){. 
5540: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5550: 0a 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28  .  errorMessage(
5560: 22 75 6e 6b 6e 6f 77 6e 20 62 6f 6f 6c 65 61 6e  "unknown boolean
5570: 3a 20 5b 25 73 5d 22 2c 20 7a 41 72 67 29 3b 0a  : [%s]", zArg);.
5580: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
5590: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
55a0: 65 78 69 73 74 73 20 61 73 20 61 20 63 6f 6e 76  exists as a conv
55b0: 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
55c0: 73 65 74 20 61 20 64 65 62 75 67 67 65 72 0a 2a  set a debugger.*
55d0: 2a 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f  * breakpoint..*/
55e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
55f0: 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69  t_breakpoint(voi
5600: 64 29 7b 20 73 74 61 74 69 63 20 76 6f 6c 61 74  d){ static volat
5610: 69 6c 65 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ile int cnt = 0;
5620: 20 63 6e 74 2b 2b 3b 20 7d 0a 0a 2f 2a 20 4d 61   cnt++; }../* Ma
5630: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
5640: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 2d  arguments to a -
5650: 2d 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 23 64 65 66  -command */.#def
5660: 69 6e 65 20 4d 58 5f 41 52 47 20 32 0a 0a 2f 2a  ine MX_ARG 2../*
5670: 0a 2a 2a 20 52 75 6e 20 61 20 73 63 72 69 70 74  .** Run a script
5680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5690: 20 72 75 6e 53 63 72 69 70 74 28 0a 20 20 69 6e   runScript(.  in
56a0: 74 20 69 43 6c 69 65 6e 74 2c 20 20 20 20 20 20  t iClient,      
56b0: 20 2f 2a 20 54 68 65 20 63 6c 69 65 6e 74 20 6e   /* The client n
56c0: 75 6d 62 65 72 2c 20 6f 72 20 30 20 66 6f 72 20  umber, or 0 for 
56d0: 74 68 65 20 6d 61 73 74 65 72 20 2a 2f 0a 20 20  the master */.  
56e0: 69 6e 74 20 74 61 73 6b 49 64 2c 20 20 20 20 20  int taskId,     
56f0: 20 20 20 2f 2a 20 54 68 65 20 74 61 73 6b 20 49     /* The task I
5700: 44 20 66 6f 72 20 63 6c 69 65 6e 74 73 2e 20 20  D for clients.  
5710: 30 20 66 6f 72 20 6d 61 73 74 65 72 20 2a 2f 0a  0 for master */.
5720: 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 2c    char *zScript,
5730: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
5740: 74 68 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  the script */.  
5750: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 20  char *zFilename 
5760: 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20     /* File from 
5770: 77 68 69 63 68 20 73 63 72 69 70 74 20 77 61 73  which script was
5780: 20 72 65 61 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69   read. */.){.  i
5790: 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20  nt lineno = 1;. 
57a0: 20 69 6e 74 20 70 72 65 76 4c 69 6e 65 20 3d 20   int prevLine = 
57b0: 31 3b 0a 20 20 69 6e 74 20 69 69 20 3d 20 30 3b  1;.  int ii = 0;
57c0: 0a 20 20 69 6e 74 20 69 42 65 67 69 6e 20 3d 20  .  int iBegin = 
57d0: 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 2c 20 6a  0;.  int n, c, j
57e0: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69  ;.  int len;.  i
57f0: 6e 74 20 6e 41 72 67 3b 0a 20 20 53 74 72 69 6e  nt nArg;.  Strin
5800: 67 20 73 52 65 73 75 6c 74 3b 0a 20 20 63 68 61  g sResult;.  cha
5810: 72 20 7a 43 6d 64 5b 33 30 5d 3b 0a 20 20 63 68  r zCmd[30];.  ch
5820: 61 72 20 7a 45 72 72 6f 72 5b 31 30 30 30 5d 3b  ar zError[1000];
5830: 0a 20 20 63 68 61 72 20 61 7a 41 72 67 5b 4d 58  .  char azArg[MX
5840: 5f 41 52 47 5d 5b 31 30 30 5d 3b 0a 0a 20 20 6d  _ARG][100];..  m
5850: 65 6d 73 65 74 28 26 73 52 65 73 75 6c 74 2c 20  emset(&sResult, 
5860: 30 2c 20 73 69 7a 65 6f 66 28 73 52 65 73 75 6c  0, sizeof(sResul
5870: 74 29 29 3b 0a 20 20 73 74 72 69 6e 67 52 65 73  t));.  stringRes
5880: 65 74 28 26 73 52 65 73 75 6c 74 29 3b 0a 20 20  et(&sResult);.  
5890: 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 53 63 72  while( (c = zScr
58a0: 69 70 74 5b 69 69 5d 29 21 3d 30 20 29 7b 0a 20  ipt[ii])!=0 ){. 
58b0: 20 20 20 70 72 65 76 4c 69 6e 65 20 3d 20 6c 69     prevLine = li
58c0: 6e 65 6e 6f 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  neno;.    len = 
58d0: 74 6f 6b 65 6e 4c 65 6e 67 74 68 28 7a 53 63 72  tokenLength(zScr
58e0: 69 70 74 2b 69 69 2c 20 26 6c 69 6e 65 6e 6f 29  ipt+ii, &lineno)
58f0: 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  ;.    if( isspac
5900: 65 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2f 27 20  e(c) || (c=='/' 
5910: 26 26 20 7a 53 63 72 69 70 74 5b 69 69 2b 31 5d  && zScript[ii+1]
5920: 3d 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20  =='*') ){.      
5930: 69 69 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ii += len;.     
5940: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
5950: 0a 20 20 20 20 69 66 28 20 63 21 3d 27 2d 27 20  .    if( c!='-' 
5960: 7c 7c 20 7a 53 63 72 69 70 74 5b 69 69 2b 31 5d  || zScript[ii+1]
5970: 21 3d 27 2d 27 20 7c 7c 20 21 69 73 61 6c 70 68  !='-' || !isalph
5980: 61 28 7a 53 63 72 69 70 74 5b 69 69 2b 32 5d 29  a(zScript[ii+2])
5990: 20 29 7b 0a 20 20 20 20 20 20 69 69 20 2b 3d 20   ){.      ii += 
59a0: 6c 65 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  len;.      conti
59b0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
59c0: 2f 2a 20 52 75 6e 20 61 6e 79 20 70 72 69 6f 72  /* Run any prior
59d0: 20 53 51 4c 20 62 65 66 6f 72 65 20 70 72 6f 63   SQL before proc
59e0: 65 73 73 69 6e 67 20 74 68 65 20 6e 65 77 20 2d  essing the new -
59f0: 2d 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20  -command */.    
5a00: 69 66 28 20 69 69 3e 69 42 65 67 69 6e 20 29 7b  if( ii>iBegin ){
5a10: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71  .      char *zSq
5a20: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
5a30: 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 69 2d 69  ntf("%.*s", ii-i
5a40: 42 65 67 69 6e 2c 20 7a 53 63 72 69 70 74 2b 69  Begin, zScript+i
5a50: 42 65 67 69 6e 29 3b 0a 20 20 20 20 20 20 65 76  Begin);.      ev
5a60: 61 6c 53 71 6c 28 26 73 52 65 73 75 6c 74 2c 20  alSql(&sResult, 
5a70: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
5a80: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
5a90: 0a 20 20 20 20 20 20 69 42 65 67 69 6e 20 3d 20  .      iBegin = 
5aa0: 69 69 20 2b 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  ii + len;.    }.
5ab0: 0a 20 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68  .    /* Parse th
5ac0: 65 20 2d 2d 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  e --command */. 
5ad0: 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65 3e     if( g.iTrace>
5ae0: 3d 32 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28  =2 ) logMessage(
5af0: 22 25 2e 2a 73 22 2c 20 6c 65 6e 2c 20 7a 53 63  "%.*s", len, zSc
5b00: 72 69 70 74 2b 69 69 29 3b 0a 20 20 20 20 6e 20  ript+ii);.    n 
5b10: 3d 20 65 78 74 72 61 63 74 54 6f 6b 65 6e 28 7a  = extractToken(z
5b20: 53 63 72 69 70 74 2b 69 69 2b 32 2c 20 6c 65 6e  Script+ii+2, len
5b30: 2d 32 2c 20 7a 43 6d 64 2c 20 73 69 7a 65 6f 66  -2, zCmd, sizeof
5b40: 28 7a 43 6d 64 29 29 3b 0a 20 20 20 20 66 6f 72  (zCmd));.    for
5b50: 28 6e 41 72 67 3d 30 3b 20 6e 3c 6c 65 6e 2d 32  (nArg=0; n<len-2
5b60: 20 26 26 20 6e 41 72 67 3c 4d 58 5f 41 52 47 3b   && nArg<MX_ARG;
5b70: 20 6e 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20   nArg++){.      
5b80: 77 68 69 6c 65 28 20 6e 3c 6c 65 6e 2d 32 20 26  while( n<len-2 &
5b90: 26 20 69 73 73 70 61 63 65 28 7a 53 63 72 69 70  & isspace(zScrip
5ba0: 74 5b 69 69 2b 32 2b 6e 5d 29 20 29 7b 20 6e 2b  t[ii+2+n]) ){ n+
5bb0: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e  +; }.      if( n
5bc0: 3e 3d 6c 65 6e 2d 32 20 29 20 62 72 65 61 6b 3b  >=len-2 ) break;
5bd0: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 65 78 74 72  .      n += extr
5be0: 61 63 74 54 6f 6b 65 6e 28 7a 53 63 72 69 70 74  actToken(zScript
5bf0: 2b 69 69 2b 32 2b 6e 2c 20 6c 65 6e 2d 32 2d 6e  +ii+2+n, len-2-n
5c00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5c10: 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
5c20: 6e 41 72 67 5d 2c 20 73 69 7a 65 6f 66 28 61 7a  nArg], sizeof(az
5c30: 41 72 67 5b 6e 41 72 67 5d 29 29 3b 0a 20 20 20  Arg[nArg]));.   
5c40: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 6e 41 72   }.    for(j=nAr
5c50: 67 3b 20 6a 3c 4d 58 5f 41 52 47 3b 20 6a 2b 2b  g; j<MX_ARG; j++
5c60: 29 20 61 7a 41 72 67 5b 6a 2b 2b 5d 5b 30 5d 20  ) azArg[j++][0] 
5c70: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  = 0;..    /*.   
5c80: 20 2a 2a 20 20 2d 2d 73 6c 65 65 70 20 4e 0a 20   **  --sleep N. 
5c90: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 75     **.    ** Pau
5ca0: 73 65 20 66 6f 72 20 4e 20 6d 69 6c 6c 69 73 65  se for N millise
5cb0: 63 6f 6e 64 73 0a 20 20 20 20 2a 2f 0a 20 20 20  conds.    */.   
5cc0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
5cd0: 2c 20 22 73 6c 65 65 70 22 29 3d 3d 30 20 29 7b  , "sleep")==0 ){
5ce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
5cf0: 6c 65 65 70 28 61 74 6f 69 28 61 7a 41 72 67 5b  leep(atoi(azArg[
5d00: 30 5d 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  0]));.    }else 
5d10: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
5d20: 20 20 2d 2d 65 78 69 74 20 4e 0a 20 20 20 20 2a    --exit N.    *
5d30: 2a 0a 20 20 20 20 2a 2a 20 45 78 69 74 20 74 68  *.    ** Exit th
5d40: 69 73 20 70 72 6f 63 65 73 73 2e 20 20 49 66 20  is process.  If 
5d50: 4e 3e 30 20 74 68 65 6e 20 65 78 69 74 20 77 69  N>0 then exit wi
5d60: 74 68 6f 75 74 20 73 68 75 74 74 69 6e 67 20 64  thout shutting d
5d70: 6f 77 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74  own.    ** SQLit
5d80: 65 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  e.  (In other wo
5d90: 72 64 73 2c 20 73 69 6d 75 6c 61 74 65 20 61 20  rds, simulate a 
5da0: 63 72 61 73 68 2e 29 0a 20 20 20 20 2a 2f 0a 20  crash.).    */. 
5db0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43     if( strcmp(zC
5dc0: 6d 64 2c 20 22 65 78 69 74 22 29 3d 3d 30 20 29  md, "exit")==0 )
5dd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
5de0: 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 3b   atoi(azArg[0]);
5df0: 0a 20 20 20 20 20 20 66 69 6e 69 73 68 53 63 72  .      finishScr
5e00: 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73  ipt(iClient, tas
5e10: 6b 49 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  kId, 1);.      i
5e20: 66 28 20 72 63 3d 3d 30 20 29 20 73 71 6c 69 74  f( rc==0 ) sqlit
5e30: 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a  e3_close(g.db);.
5e40: 20 20 20 20 20 20 65 78 69 74 28 72 63 29 3b 0a        exit(rc);.
5e50: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
5e60: 2a 0a 20 20 20 20 2a 2a 20 20 20 2d 2d 74 65 73  *.    **   --tes
5e70: 74 63 61 73 65 20 4e 41 4d 45 0a 20 20 20 20 2a  tcase NAME.    *
5e80: 2a 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 61  *.    ** Begin a
5e90: 20 6e 65 77 20 74 65 73 74 20 63 61 73 65 2e 20   new test case. 
5ea0: 20 41 6e 6e 6f 75 6e 63 65 20 69 6e 20 74 68 65   Announce in the
5eb0: 20 6c 6f 67 20 74 68 61 74 20 74 68 65 20 74 65   log that the te
5ec0: 73 74 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 68  st case.    ** h
5ed0: 61 73 20 62 65 67 75 6e 2e 0a 20 20 20 20 2a 2f  as begun..    */
5ee0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
5ef0: 7a 43 6d 64 2c 20 22 74 65 73 74 63 61 73 65 22  zCmd, "testcase"
5f00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
5f10: 28 20 67 2e 69 54 72 61 63 65 3d 3d 31 20 29 20  ( g.iTrace==1 ) 
5f20: 6c 6f 67 4d 65 73 73 61 67 65 28 22 25 2e 2a 73  logMessage("%.*s
5f30: 22 2c 20 6c 65 6e 20 2d 20 31 2c 20 7a 53 63 72  ", len - 1, zScr
5f40: 69 70 74 2b 69 69 29 3b 0a 20 20 20 20 20 20 73  ipt+ii);.      s
5f50: 74 72 69 6e 67 52 65 73 65 74 28 26 73 52 65 73  tringReset(&sRes
5f60: 75 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ult);.    }else.
5f70: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
5f80: 20 2d 2d 66 69 6e 69 73 68 0a 20 20 20 20 2a 2a   --finish.    **
5f90: 0a 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65  .    ** Mark the
5fa0: 20 63 75 72 72 65 6e 74 20 74 61 73 6b 20 61 73   current task as
5fb0: 20 68 61 76 69 6e 67 20 66 69 6e 69 73 68 65 64   having finished
5fc0: 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  , even if it is 
5fd0: 6e 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  not..    ** This
5fe0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
5ff0: 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 77 69 74 68  conjunction with
6000: 20 2d 2d 65 78 69 74 20 74 6f 20 73 69 6d 75 6c   --exit to simul
6010: 61 74 65 20 61 20 63 72 61 73 68 2e 0a 20 20 20  ate a crash..   
6020: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
6030: 6d 70 28 7a 43 6d 64 2c 20 22 66 69 6e 69 73 68  mp(zCmd, "finish
6040: 22 29 3d 3d 30 20 26 26 20 69 43 6c 69 65 6e 74  ")==0 && iClient
6050: 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 69 6e 69  >0 ){.      fini
6060: 73 68 53 63 72 69 70 74 28 69 43 6c 69 65 6e 74  shScript(iClient
6070: 2c 20 74 61 73 6b 49 64 2c 20 31 29 3b 0a 20 20  , taskId, 1);.  
6080: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a    }else..    /*.
6090: 20 20 20 20 2a 2a 20 20 2d 2d 72 65 73 65 74 0a      **  --reset.
60a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
60b0: 73 65 74 20 61 63 63 75 6d 75 6c 61 74 65 64 20  set accumulated 
60c0: 72 65 73 75 6c 74 73 20 62 61 63 6b 20 74 6f 20  results back to 
60d0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a  an empty string.
60e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
60f0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 72 65 73  trcmp(zCmd, "res
6100: 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  et")==0 ){.     
6110: 20 73 74 72 69 6e 67 52 65 73 65 74 28 26 73 52   stringReset(&sR
6120: 65 73 75 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73  esult);.    }els
6130: 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e..    /*.    **
6140: 20 20 2d 2d 6d 61 74 63 68 20 41 4e 53 57 45 52    --match ANSWER
6150: 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ....    **.    *
6160: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
6170: 66 20 6f 75 74 70 75 74 20 6d 61 74 63 68 65 73  f output matches
6180: 20 41 4e 53 57 45 52 2e 20 20 52 65 70 6f 72 74   ANSWER.  Report
6190: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6e 6f 74   an error if not
61a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
61b0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6d   strcmp(zCmd, "m
61c0: 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  atch")==0 ){.   
61d0: 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
61e0: 20 63 68 61 72 20 2a 7a 41 6e 73 20 3d 20 7a 53   char *zAns = zS
61f0: 63 72 69 70 74 2b 69 69 3b 0a 20 20 20 20 20 20  cript+ii;.      
6200: 66 6f 72 28 6a 6a 3d 37 3b 20 6a 6a 3c 6c 65 6e  for(jj=7; jj<len
6210: 2d 31 20 26 26 20 69 73 73 70 61 63 65 28 7a 41  -1 && isspace(zA
6220: 6e 73 5b 6a 6a 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d  ns[jj]); jj++){}
6230: 0a 20 20 20 20 20 20 7a 41 6e 73 20 2b 3d 20 6a  .      zAns += j
6240: 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e  j;.      if( len
6250: 2d 6a 6a 2d 31 21 3d 73 52 65 73 75 6c 74 2e 6e  -jj-1!=sResult.n
6260: 20 7c 7c 20 73 74 72 6e 63 6d 70 28 73 52 65 73   || strncmp(sRes
6270: 75 6c 74 2e 7a 2c 20 7a 41 6e 73 2c 20 6c 65 6e  ult.z, zAns, len
6280: 2d 6a 6a 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  -jj-1) ){.      
6290: 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22    errorMessage("
62a0: 6c 69 6e 65 20 25 64 20 6f 66 20 25 73 3a 5c 6e  line %d of %s:\n
62b0: 45 78 70 65 63 74 65 64 20 5b 25 2e 2a 73 5d 5c  Expected [%.*s]\
62c0: 6e 20 20 20 20 20 47 6f 74 20 5b 25 73 5d 22 2c  n     Got [%s]",
62d0: 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76 4c  .          prevL
62e0: 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ine, zFilename, 
62f0: 6c 65 6e 2d 6a 6a 2d 31 2c 20 7a 41 6e 73 2c 20  len-jj-1, zAns, 
6300: 73 52 65 73 75 6c 74 2e 7a 29 3b 0a 20 20 20 20  sResult.z);.    
6310: 20 20 7d 0a 20 20 20 20 20 20 67 2e 6e 54 65 73    }.      g.nTes
6320: 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 72 69 6e  t++;.      strin
6330: 67 52 65 73 65 74 28 26 73 52 65 73 75 6c 74 29  gReset(&sResult)
6340: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
6350: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 67 6c   /*.    **  --gl
6360: 6f 62 20 41 4e 53 57 45 52 2e 2e 2e 0a 20 20 20  ob ANSWER....   
6370: 20 2a 2a 20 20 2d 2d 6e 6f 74 67 6c 6f 62 20 41   **  --notglob A
6380: 4e 53 57 45 52 2e 2e 2e 2e 0a 20 20 20 20 2a 2a  NSWER.....    **
6390: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
63a0: 20 73 65 65 20 69 66 20 6f 75 74 70 75 74 20 64   see if output d
63b0: 6f 65 73 20 6f 72 20 64 6f 65 73 20 6e 6f 74 20  oes or does not 
63c0: 6d 61 74 63 68 20 74 68 65 20 67 6c 6f 62 20 70  match the glob p
63d0: 61 74 74 65 72 6e 0a 20 20 20 20 2a 2a 20 41 4e  attern.    ** AN
63e0: 53 57 45 52 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  SWER..    */.   
63f0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6400: 2c 20 22 67 6c 6f 62 22 29 3d 3d 30 20 7c 7c 20  , "glob")==0 || 
6410: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f  strcmp(zCmd, "no
6420: 74 67 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20  tglob")==0 ){.  
6430: 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20      int jj;.    
6440: 20 20 63 68 61 72 20 2a 7a 41 6e 73 20 3d 20 7a    char *zAns = z
6450: 53 63 72 69 70 74 2b 69 69 3b 0a 20 20 20 20 20  Script+ii;.     
6460: 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a 20 20   char *zCopy;.  
6470: 20 20 20 20 69 6e 74 20 69 73 47 6c 6f 62 20 3d      int isGlob =
6480: 20 28 7a 43 6d 64 5b 30 5d 3d 3d 27 67 27 29 3b   (zCmd[0]=='g');
6490: 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 39 2d  .      for(jj=9-
64a0: 33 2a 69 73 47 6c 6f 62 3b 20 6a 6a 3c 6c 65 6e  3*isGlob; jj<len
64b0: 2d 31 20 26 26 20 69 73 73 70 61 63 65 28 7a 41  -1 && isspace(zA
64c0: 6e 73 5b 6a 6a 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d  ns[jj]); jj++){}
64d0: 0a 20 20 20 20 20 20 7a 41 6e 73 20 2b 3d 20 6a  .      zAns += j
64e0: 6a 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 20 3d  j;.      zCopy =
64f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
6500: 28 22 25 2e 2a 73 22 2c 20 6c 65 6e 2d 6a 6a 2d  ("%.*s", len-jj-
6510: 31 2c 20 7a 41 6e 73 29 3b 0a 20 20 20 20 20 20  1, zAns);.      
6520: 69 66 28 20 28 73 71 6c 69 74 65 33 5f 73 74 72  if( (sqlite3_str
6530: 67 6c 6f 62 28 7a 43 6f 70 79 2c 20 73 52 65 73  glob(zCopy, sRes
6540: 75 6c 74 2e 7a 29 3d 3d 30 29 5e 69 73 47 6c 6f  ult.z)==0)^isGlo
6550: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  b ){.        err
6560: 6f 72 4d 65 73 73 61 67 65 28 22 6c 69 6e 65 20  orMessage("line 
6570: 25 64 20 6f 66 20 25 73 3a 5c 6e 45 78 70 65 63  %d of %s:\nExpec
6580: 74 65 64 20 5b 25 73 5d 5c 6e 20 20 20 20 20 47  ted [%s]\n     G
6590: 6f 74 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20  ot [%s]",.      
65a0: 20 20 20 20 70 72 65 76 4c 69 6e 65 2c 20 7a 46      prevLine, zF
65b0: 69 6c 65 6e 61 6d 65 2c 20 7a 43 6f 70 79 2c 20  ilename, zCopy, 
65c0: 73 52 65 73 75 6c 74 2e 7a 29 3b 0a 20 20 20 20  sResult.z);.    
65d0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
65e0: 33 5f 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20  3_free(zCopy);. 
65f0: 20 20 20 20 20 67 2e 6e 54 65 73 74 2b 2b 3b 0a       g.nTest++;.
6600: 20 20 20 20 20 20 73 74 72 69 6e 67 52 65 73 65        stringRese
6610: 74 28 26 73 52 65 73 75 6c 74 29 3b 0a 20 20 20  t(&sResult);.   
6620: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20   }else..    /*. 
6630: 20 20 20 2a 2a 20 20 2d 2d 6f 75 74 70 75 74 0a     **  --output.
6640: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 75      **.    ** Ou
6650: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 20  tput the result 
6660: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
6670: 53 51 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  SQL..    */.    
6680: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6690: 20 22 6f 75 74 70 75 74 22 29 3d 3d 30 20 29 7b   "output")==0 ){
66a0: 0a 20 20 20 20 20 20 6c 6f 67 4d 65 73 73 61 67  .      logMessag
66b0: 65 28 22 25 73 22 2c 20 73 52 65 73 75 6c 74 2e  e("%s", sResult.
66c0: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20  z);.    }else.. 
66d0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d     /*.    **  --
66e0: 73 6f 75 72 63 65 20 46 49 4c 45 4e 41 4d 45 0a  source FILENAME.
66f0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75      **.    ** Ru
6700: 6e 20 61 20 73 75 62 73 63 72 69 70 74 20 66 72  n a subscript fr
6710: 6f 6d 20 61 20 73 65 70 61 72 61 74 65 20 66 69  om a separate fi
6720: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
6730: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6740: 22 73 6f 75 72 63 65 22 29 3d 3d 30 20 29 7b 0a  "source")==0 ){.
6750: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
6760: 46 69 6c 65 2c 20 2a 7a 4e 65 77 53 63 72 69 70  File, *zNewScrip
6770: 74 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  t;.      char *z
6780: 54 6f 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  ToDel = 0;.     
6790: 20 7a 4e 65 77 46 69 6c 65 20 3d 20 61 7a 41 72   zNewFile = azAr
67a0: 67 5b 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  g[0];.      if( 
67b0: 21 69 73 44 69 72 53 65 70 28 7a 4e 65 77 46 69  !isDirSep(zNewFi
67c0: 6c 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  le[0]) ){.      
67d0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
67e0: 20 66 6f 72 28 6b 3d 28 69 6e 74 29 73 74 72 6c   for(k=(int)strl
67f0: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 2d 31 3b  en(zFilename)-1;
6800: 20 6b 3e 3d 30 20 26 26 20 21 69 73 44 69 72 53   k>=0 && !isDirS
6810: 65 70 28 7a 46 69 6c 65 6e 61 6d 65 5b 6b 5d 29  ep(zFilename[k])
6820: 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20  ; k--){}.       
6830: 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
6840: 20 20 20 20 20 20 7a 4e 65 77 46 69 6c 65 20 3d        zNewFile =
6850: 20 7a 54 6f 44 65 6c 20 3d 20 73 71 6c 69 74 65   zToDel = sqlite
6860: 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 2f  3_mprintf("%.*s/
6870: 25 73 22 2c 20 6b 2c 7a 46 69 6c 65 6e 61 6d 65  %s", k,zFilename
6880: 2c 7a 4e 65 77 46 69 6c 65 29 3b 0a 20 20 20 20  ,zNewFile);.    
6890: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
68a0: 20 20 20 20 7a 4e 65 77 53 63 72 69 70 74 20 3d      zNewScript =
68b0: 20 72 65 61 64 46 69 6c 65 28 7a 4e 65 77 46 69   readFile(zNewFi
68c0: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  le);.      if( g
68d0: 2e 69 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73  .iTrace ) logMes
68e0: 73 61 67 65 28 22 62 65 67 69 6e 20 73 63 72 69  sage("begin scri
68f0: 70 74 20 5b 25 73 5d 5c 6e 22 2c 20 7a 4e 65 77  pt [%s]\n", zNew
6900: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  File);.      run
6910: 53 63 72 69 70 74 28 30 2c 20 30 2c 20 7a 4e 65  Script(0, 0, zNe
6920: 77 53 63 72 69 70 74 2c 20 7a 4e 65 77 46 69 6c  wScript, zNewFil
6930: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
6940: 33 5f 66 72 65 65 28 7a 4e 65 77 53 63 72 69 70  3_free(zNewScrip
6950: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e  t);.      if( g.
6960: 69 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73  iTrace ) logMess
6970: 61 67 65 28 22 65 6e 64 20 73 63 72 69 70 74 20  age("end script 
6980: 5b 25 73 5d 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c  [%s]\n", zNewFil
6990: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
69a0: 33 5f 66 72 65 65 28 7a 54 6f 44 65 6c 29 3b 0a  3_free(zToDel);.
69b0: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
69c0: 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 70 72 69 6e  *.    **  --prin
69d0: 74 20 4d 45 53 53 41 47 45 2e 2e 2e 2e 0a 20 20  t MESSAGE.....  
69e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 75 74 70    **.    ** Outp
69f0: 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  ut the remainder
6a00: 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 74 6f 20   of the line to 
6a10: 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 20 20 20  the log file.   
6a20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
6a30: 6d 70 28 7a 43 6d 64 2c 20 22 70 72 69 6e 74 22  mp(zCmd, "print"
6a40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
6a50: 74 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  t jj;.      for(
6a60: 6a 6a 3d 37 3b 20 6a 6a 3c 6c 65 6e 20 26 26 20  jj=7; jj<len && 
6a70: 69 73 73 70 61 63 65 28 7a 53 63 72 69 70 74 5b  isspace(zScript[
6a80: 69 69 2b 6a 6a 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d  ii+jj]); jj++){}
6a90: 0a 20 20 20 20 20 20 6c 6f 67 4d 65 73 73 61 67  .      logMessag
6aa0: 65 28 22 25 2e 2a 73 22 2c 20 6c 65 6e 2d 6a 6a  e("%.*s", len-jj
6ab0: 2c 20 7a 53 63 72 69 70 74 2b 69 69 2b 6a 6a 29  , zScript+ii+jj)
6ac0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
6ad0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 69 66   /*.    **  --if
6ae0: 20 45 58 50 52 0a 20 20 20 20 2a 2a 0a 20 20 20   EXPR.    **.   
6af0: 20 2a 2a 20 53 6b 69 70 20 66 6f 72 77 61 72 64   ** Skip forward
6b00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
6b10: 63 68 69 6e 67 20 2d 2d 65 6e 64 69 66 20 6f 72  ching --endif or
6b20: 20 2d 2d 65 6c 73 65 20 69 66 20 45 58 50 52 20   --else if EXPR 
6b30: 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2f  is false..    */
6b40: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
6b50: 7a 43 6d 64 2c 20 22 69 66 22 29 3d 3d 30 20 29  zCmd, "if")==0 )
6b60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 2c 20  {.      int jj, 
6b70: 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
6b80: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
6b90: 20 20 20 20 20 66 6f 72 28 6a 6a 3d 34 3b 20 6a       for(jj=4; j
6ba0: 6a 3c 6c 65 6e 20 26 26 20 69 73 73 70 61 63 65  j<len && isspace
6bb0: 28 7a 53 63 72 69 70 74 5b 69 69 2b 6a 6a 5d 29  (zScript[ii+jj])
6bc0: 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ; jj++){}.      
6bd0: 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53  pStmt = prepareS
6be0: 71 6c 28 22 53 45 4c 45 43 54 20 25 2e 2a 73 22  ql("SELECT %.*s"
6bf0: 2c 20 6c 65 6e 2d 6a 6a 2c 20 7a 53 63 72 69 70  , len-jj, zScrip
6c00: 74 2b 69 69 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  t+ii+jj);.      
6c10: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
6c20: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
6c30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52  if( rc!=SQLITE_R
6c40: 4f 57 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f  OW || sqlite3_co
6c50: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
6c60: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)==0 ){.       
6c70: 20 69 69 20 2b 3d 20 66 69 6e 64 45 6e 64 69 66   ii += findEndif
6c80: 28 7a 53 63 72 69 70 74 2b 69 69 2b 6c 65 6e 2c  (zScript+ii+len,
6c90: 20 31 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20   1, &lineno);.  
6ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
6cb0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
6cc0: 6d 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a  mt);.    }else..
6cd0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d      /*.    **  -
6ce0: 2d 65 6c 73 65 0a 20 20 20 20 2a 2a 0a 20 20 20  -else.    **.   
6cf0: 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64   ** This command
6d00: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 65 6e 63   can only be enc
6d10: 6f 75 6e 74 65 72 65 64 20 69 66 20 63 75 72 72  ountered if curr
6d20: 65 6e 74 6c 79 20 69 6e 73 69 64 65 20 61 6e 20  ently inside an 
6d30: 2d 2d 69 66 20 74 68 61 74 0a 20 20 20 20 2a 2a  --if that.    **
6d40: 20 69 73 20 74 72 75 65 2e 20 20 53 6b 69 70 20   is true.  Skip 
6d50: 66 6f 72 77 61 72 64 20 74 6f 20 74 68 65 20 6e  forward to the n
6d60: 65 78 74 20 6d 61 74 63 68 69 6e 67 20 2d 2d 65  ext matching --e
6d70: 6e 64 69 66 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndif..    */.   
6d80: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6d90: 2c 20 22 65 6c 73 65 22 29 3d 3d 30 20 29 7b 0a  , "else")==0 ){.
6da0: 20 20 20 20 20 20 69 69 20 2b 3d 20 66 69 6e 64        ii += find
6db0: 45 6e 64 69 66 28 7a 53 63 72 69 70 74 2b 69 69  Endif(zScript+ii
6dc0: 2b 6c 65 6e 2c 20 30 2c 20 26 6c 69 6e 65 6e 6f  +len, 0, &lineno
6dd0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20  );.    }else..  
6de0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 65    /*.    **  --e
6df0: 6e 64 69 66 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ndif.    **.    
6e00: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
6e10: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 65 6e 63 6f  can only be enco
6e20: 75 6e 74 65 72 65 64 20 69 66 20 63 75 72 72 65  untered if curre
6e30: 6e 74 6c 79 20 69 6e 73 69 64 65 20 61 6e 20 2d  ntly inside an -
6e40: 2d 69 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  -if that.    ** 
6e50: 69 73 20 74 72 75 65 20 6f 72 20 61 6e 20 2d 2d  is true or an --
6e60: 65 6c 73 65 20 6f 66 20 61 20 66 61 6c 73 65 20  else of a false 
6e70: 69 66 2e 20 20 54 68 69 73 20 69 73 20 61 20 6e  if.  This is a n
6e80: 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
6e90: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6ea0: 2c 20 22 65 6e 64 69 66 22 29 3d 3d 30 20 29 7b  , "endif")==0 ){
6eb0: 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  .      /* no-op 
6ec0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20  */.    }else..  
6ed0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 73    /*.    **  --s
6ee0: 74 61 72 74 20 43 4c 49 45 4e 54 0a 20 20 20 20  tart CLIENT.    
6ef0: 2a 2a 0a 20 20 20 20 2a 2a 20 53 74 61 72 74 20  **.    ** Start 
6f00: 75 70 20 74 68 65 20 67 69 76 65 6e 20 63 6c 69  up the given cli
6f10: 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
6f20: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6f30: 20 22 73 74 61 72 74 22 29 3d 3d 30 20 26 26 20   "start")==0 && 
6f40: 69 43 6c 69 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  iClient==0 ){.  
6f50: 20 20 20 20 69 6e 74 20 69 4e 65 77 43 6c 69 65      int iNewClie
6f60: 6e 74 20 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b  nt = atoi(azArg[
6f70: 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  0]);.      if( i
6f80: 4e 65 77 43 6c 69 65 6e 74 3e 30 20 29 7b 0a 20  NewClient>0 ){. 
6f90: 20 20 20 20 20 20 20 73 74 61 72 74 43 6c 69 65         startClie
6fa0: 6e 74 28 69 4e 65 77 43 6c 69 65 6e 74 29 3b 0a  nt(iNewClient);.
6fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6fc0: 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e..    /*.    **
6fd0: 20 20 2d 2d 77 61 69 74 20 43 4c 49 45 4e 54 20    --wait CLIENT 
6fe0: 54 49 4d 45 4f 55 54 0a 20 20 20 20 2a 2a 0a 20  TIMEOUT.    **. 
6ff0: 20 20 20 2a 2a 20 57 61 69 74 20 75 6e 74 69 6c     ** Wait until
7000: 20 61 6c 6c 20 74 61 73 6b 73 20 63 6f 6d 70 6c   all tasks compl
7010: 65 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ete for the give
7020: 6e 20 63 6c 69 65 6e 74 2e 20 20 49 66 20 43 4c  n client.  If CL
7030: 49 45 4e 54 20 69 73 0a 20 20 20 20 2a 2a 20 22  IENT is.    ** "
7040: 61 6c 6c 22 20 74 68 65 6e 20 77 61 69 74 20 66  all" then wait f
7050: 6f 72 20 61 6c 6c 20 63 6c 69 65 6e 74 73 20 74  or all clients t
7060: 6f 20 63 6f 6d 70 6c 65 74 65 2e 20 20 57 61 69  o complete.  Wai
7070: 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 68 61 6e  t no longer than
7080: 0a 20 20 20 20 2a 2a 20 54 49 4d 45 4f 55 54 20  .    ** TIMEOUT 
7090: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 28 64 65  milliseconds (de
70a0: 66 61 75 6c 74 20 31 30 2c 30 30 30 29 0a 20 20  fault 10,000).  
70b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
70c0: 63 6d 70 28 7a 43 6d 64 2c 20 22 77 61 69 74 22  cmp(zCmd, "wait"
70d0: 29 3d 3d 30 20 26 26 20 69 43 6c 69 65 6e 74 3d  )==0 && iClient=
70e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
70f0: 69 54 69 6d 65 6f 75 74 20 3d 20 6e 41 72 67 3e  iTimeout = nArg>
7100: 3d 32 20 3f 20 61 74 6f 69 28 61 7a 41 72 67 5b  =2 ? atoi(azArg[
7110: 31 5d 29 20 3a 20 31 30 30 30 30 3b 0a 20 20 20  1]) : 10000;.   
7120: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7130: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72 72 6f  ntf(sizeof(zErro
7140: 72 29 2c 7a 45 72 72 6f 72 2c 22 6c 69 6e 65 20  r),zError,"line 
7150: 25 64 20 6f 66 20 25 73 5c 6e 22 2c 0a 20 20 20  %d of %s\n",.   
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 20 70 72 65 76 4c 69 6e 65 2c 20 7a 46      prevLine, zF
7180: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
7190: 77 61 69 74 46 6f 72 43 6c 69 65 6e 74 28 61 74  waitForClient(at
71a0: 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20 69 54  oi(azArg[0]), iT
71b0: 69 6d 65 6f 75 74 2c 20 7a 45 72 72 6f 72 29 3b  imeout, zError);
71c0: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
71d0: 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 74 61 73  /*.    **  --tas
71e0: 6b 20 43 4c 49 45 4e 54 0a 20 20 20 20 2a 2a 20  k CLIENT.    ** 
71f0: 20 20 20 20 3c 74 61 73 6b 2d 63 6f 6e 74 65 6e      <task-conten
7200: 74 2d 68 65 72 65 3e 0a 20 20 20 20 2a 2a 20 20  t-here>.    **  
7210: 2d 2d 65 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20  --end.    **.   
7220: 20 2a 2a 20 41 73 73 69 67 6e 20 77 6f 72 6b 20   ** Assign work 
7230: 74 6f 20 61 20 63 6c 69 65 6e 74 2e 20 20 53 74  to a client.  St
7240: 61 72 74 20 74 68 65 20 63 6c 69 65 6e 74 20 69  art the client i
7250: 66 20 69 74 20 69 73 20 6e 6f 74 20 72 75 6e 6e  f it is not runn
7260: 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ing.    ** alrea
7270: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
7280: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
7290: 22 74 61 73 6b 22 29 3d 3d 30 20 26 26 20 69 43  "task")==0 && iC
72a0: 6c 69 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  lient==0 ){.    
72b0: 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20    int iTarget = 
72c0: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  atoi(azArg[0]);.
72d0: 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a        int iEnd;.
72e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 73        char *zTas
72f0: 6b 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  k;.      char *z
7300: 54 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 45 6e  TName;.      iEn
7310: 64 20 3d 20 66 69 6e 64 45 6e 64 28 7a 53 63 72  d = findEnd(zScr
7320: 69 70 74 2b 69 69 2b 6c 65 6e 2c 20 26 6c 69 6e  ipt+ii+len, &lin
7330: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eno);.      if( 
7340: 69 54 61 72 67 65 74 3c 30 20 29 7b 0a 20 20 20  iTarget<0 ){.   
7350: 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67       errorMessag
7360: 65 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73  e("line %d of %s
7370: 3a 20 62 61 64 20 63 6c 69 65 6e 74 20 6e 75 6d  : bad client num
7380: 62 65 72 3a 20 25 64 22 2c 0a 20 20 20 20 20 20  ber: %d",.      
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
73a0: 72 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61  revLine, zFilena
73b0: 6d 65 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  me, iTarget);.  
73c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
73d0: 20 20 20 7a 54 61 73 6b 20 3d 20 73 71 6c 69 74     zTask = sqlit
73e0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73  e3_mprintf("%.*s
73f0: 22 2c 20 69 45 6e 64 2c 20 7a 53 63 72 69 70 74  ", iEnd, zScript
7400: 2b 69 69 2b 6c 65 6e 29 3b 0a 20 20 20 20 20 20  +ii+len);.      
7410: 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a    if( nArg>1 ){.
7420: 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
7430: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7440: 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 31  tf("%s", azArg[1
7450: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
7460: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
7470: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ame = sqlite3_mp
7480: 72 69 6e 74 66 28 22 25 73 3a 25 64 22 2c 20 66  rintf("%s:%d", f
7490: 69 6c 65 6e 61 6d 65 54 61 69 6c 28 7a 46 69 6c  ilenameTail(zFil
74a0: 65 6e 61 6d 65 29 2c 20 70 72 65 76 4c 69 6e 65  ename), prevLine
74b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
74c0: 20 20 20 20 20 73 74 61 72 74 43 6c 69 65 6e 74       startClient
74d0: 28 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20  (iTarget);.     
74e0: 20 20 20 72 75 6e 53 71 6c 28 22 49 4e 53 45 52     runSql("INSER
74f0: 54 20 49 4e 54 4f 20 74 61 73 6b 28 63 6c 69 65  T INTO task(clie
7500: 6e 74 2c 73 63 72 69 70 74 2c 6e 61 6d 65 29 22  nt,script,name)"
7510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7520: 22 20 56 41 4c 55 45 53 28 25 64 2c 27 25 71 27  " VALUES(%d,'%q'
7530: 2c 25 51 29 22 2c 20 69 54 61 72 67 65 74 2c 20  ,%Q)", iTarget, 
7540: 7a 54 61 73 6b 2c 20 7a 54 4e 61 6d 65 29 3b 0a  zTask, zTName);.
7550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7560: 66 72 65 65 28 7a 54 61 73 6b 29 3b 0a 20 20 20  free(zTask);.   
7570: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7580: 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e(zTName);.     
7590: 20 7d 0a 20 20 20 20 20 20 69 45 6e 64 20 2b 3d   }.      iEnd +=
75a0: 20 74 6f 6b 65 6e 4c 65 6e 67 74 68 28 7a 53 63   tokenLength(zSc
75b0: 72 69 70 74 2b 69 69 2b 6c 65 6e 2b 69 45 6e 64  ript+ii+len+iEnd
75c0: 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  , &lineno);.    
75d0: 20 20 6c 65 6e 20 2b 3d 20 69 45 6e 64 3b 0a 20    len += iEnd;. 
75e0: 20 20 20 20 20 69 42 65 67 69 6e 20 3d 20 69 69       iBegin = ii
75f0: 2b 6c 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  +len;.    }else.
7600: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
7610: 2d 2d 62 72 65 61 6b 70 6f 69 6e 74 0a 20 20 20  --breakpoint.   
7620: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
7630: 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73 20 22 74  command calls "t
7640: 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  est_breakpoint()
7650: 22 20 77 68 69 63 68 20 69 73 20 61 20 72 6f 75  " which is a rou
7660: 74 69 6e 65 20 70 72 6f 76 69 64 65 64 0a 20 20  tine provided.  
7670: 20 20 2a 2a 20 61 73 20 61 20 63 6f 6e 76 65 6e    ** as a conven
7680: 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
7690: 74 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65  t a debugger bre
76a0: 61 6b 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2f 0a  akpoint..    */.
76b0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
76c0: 43 6d 64 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74  Cmd, "breakpoint
76d0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  ")==0 ){.      t
76e0: 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  est_breakpoint()
76f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
7700: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 73 68   /*.    **  --sh
7710: 6f 77 2d 73 71 6c 2d 65 72 72 6f 72 73 20 42 4f  ow-sql-errors BO
7720: 4f 4c 45 41 4e 0a 20 20 20 20 2a 2a 0a 20 20 20  OLEAN.    **.   
7730: 20 2a 2a 20 54 75 72 6e 20 64 69 73 70 6c 61 79   ** Turn display
7740: 20 6f 66 20 53 51 4c 20 65 72 72 6f 72 73 20 6f   of SQL errors o
7750: 6e 20 61 6e 64 20 6f 66 66 2e 0a 20 20 20 20 2a  n and off..    *
7760: 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
7770: 28 7a 43 6d 64 2c 20 22 73 68 6f 77 2d 73 71 6c  (zCmd, "show-sql
7780: 2d 65 72 72 6f 72 73 22 29 3d 3d 30 20 29 7b 0a  -errors")==0 ){.
7790: 20 20 20 20 20 20 67 2e 62 49 67 6e 6f 72 65 53        g.bIgnoreS
77a0: 71 6c 45 72 72 6f 72 73 20 3d 20 6e 41 72 67 3e  qlErrors = nArg>
77b0: 3d 31 20 3f 20 21 62 6f 6f 6c 65 61 6e 56 61 6c  =1 ? !booleanVal
77c0: 75 65 28 61 7a 41 72 67 5b 30 5d 29 20 3a 20 31  ue(azArg[0]) : 1
77d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 0a 20 20  ;.    }else...  
77e0: 20 20 2f 2a 20 65 72 72 6f 72 20 2a 2f 7b 0a 20    /* error */{. 
77f0: 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67       errorMessag
7800: 65 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73  e("line %d of %s
7810: 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e  : unknown comman
7820: 64 20 2d 2d 25 73 22 2c 0a 20 20 20 20 20 20 20  d --%s",.       
7830: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76              prev
7840: 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  Line, zFilename,
7850: 20 7a 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20   zCmd);.    }.  
7860: 20 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a 20 20 7d    ii += len;.  }
7870: 0a 20 20 69 66 28 20 69 42 65 67 69 6e 3c 69 69  .  if( iBegin<ii
7880: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   ){.    char *zS
7890: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
78a0: 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 69 2d  intf("%.*s", ii-
78b0: 69 42 65 67 69 6e 2c 20 7a 53 63 72 69 70 74 2b  iBegin, zScript+
78c0: 69 42 65 67 69 6e 29 3b 0a 20 20 20 20 72 75 6e  iBegin);.    run
78d0: 53 71 6c 28 7a 53 71 6c 29 3b 0a 20 20 20 20 73  Sql(zSql);.    s
78e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
78f0: 29 3b 0a 20 20 7d 0a 20 20 73 74 72 69 6e 67 46  );.  }.  stringF
7900: 72 65 65 28 26 73 52 65 73 75 6c 74 29 3b 0a 7d  ree(&sResult);.}
7910: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 66 6f 72  ../*.** Look for
7920: 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20   a command-line 
7930: 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73  option.  If pres
7940: 65 6e 74 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  ent, return a po
7950: 69 6e 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e  inter..** Return
7960: 20 4e 55 4c 4c 20 69 66 20 6d 69 73 73 69 6e 67   NULL if missing
7970: 2e 0a 2a 2a 0a 2a 2a 20 68 61 73 41 72 67 3d 3d  ..**.** hasArg==
7980: 30 20 6d 65 61 6e 73 20 74 68 65 20 6f 70 74 69  0 means the opti
7990: 6f 6e 20 69 73 20 61 20 66 6c 61 67 2e 20 20 49  on is a flag.  I
79a0: 74 20 69 73 20 65 69 74 68 65 72 20 70 72 65 73  t is either pres
79b0: 65 6e 74 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 20 68  ent or not..** h
79c0: 61 73 41 72 67 3d 3d 31 20 6d 65 61 6e 73 20 74  asArg==1 means t
79d0: 68 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 61 6e  he option has an
79e0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75   argument.  Retu
79f0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
7a00: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
7a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
7a20: 2a 66 69 6e 64 4f 70 74 69 6f 6e 28 0a 20 20 63  *findOption(.  c
7a30: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69  har **azArg,.  i
7a40: 6e 74 20 2a 70 6e 41 72 67 2c 0a 20 20 63 6f 6e  nt *pnArg,.  con
7a50: 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 69 6f 6e  st char *zOption
7a60: 2c 0a 20 20 69 6e 74 20 68 61 73 41 72 67 0a 29  ,.  int hasArg.)
7a70: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
7a80: 63 68 61 72 20 2a 7a 52 65 74 75 72 6e 20 3d 20  char *zReturn = 
7a90: 30 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  0;.  int nArg = 
7aa0: 2a 70 6e 41 72 67 3b 0a 0a 20 20 61 73 73 65 72  *pnArg;..  asser
7ab0: 74 28 20 68 61 73 41 72 67 3d 3d 30 20 7c 7c 20  t( hasArg==0 || 
7ac0: 68 61 73 41 72 67 3d 3d 31 20 29 3b 0a 20 20 66  hasArg==1 );.  f
7ad0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
7ae0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
7af0: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
7b00: 20 69 2b 68 61 73 41 72 67 20 3e 3d 20 6e 41 72   i+hasArg >= nAr
7b10: 67 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a  g ) break;.    z
7b20: 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
7b30: 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29   if( z[0]!='-' )
7b40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
7b50: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  ++;.    if( z[0]
7b60: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69  =='-' ){.      i
7b70: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 20 62 72 65  f( z[1]==0 ) bre
7b80: 61 6b 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20  ak;.      z++;. 
7b90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
7ba0: 63 6d 70 28 7a 2c 7a 4f 70 74 69 6f 6e 29 3d 3d  cmp(z,zOption)==
7bb0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  0 ){.      if( h
7bc0: 61 73 41 72 67 20 26 26 20 69 3d 3d 6e 41 72 67  asArg && i==nArg
7bd0: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 66 61  -1 ){.        fa
7be0: 74 61 6c 45 72 72 6f 72 28 22 63 6f 6d 6d 61 6e  talError("comman
7bf0: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 5c 22  d-line option \"
7c00: 2d 2d 25 73 5c 22 20 72 65 71 75 69 72 65 73 20  --%s\" requires 
7c10: 61 6e 20 61 72 67 75 6d 65 6e 74 22 2c 20 7a 29  an argument", z)
7c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7c30: 69 66 28 20 68 61 73 41 72 67 20 29 7b 0a 20 20  if( hasArg ){.  
7c40: 20 20 20 20 20 20 7a 52 65 74 75 72 6e 20 3d 20        zReturn = 
7c50: 61 7a 41 72 67 5b 69 2b 31 5d 3b 0a 20 20 20 20  azArg[i+1];.    
7c60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7c70: 20 7a 52 65 74 75 72 6e 20 3d 20 61 7a 41 72 67   zReturn = azArg
7c80: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
7c90: 20 20 20 6a 20 3d 20 69 2b 31 2b 28 68 61 73 41     j = i+1+(hasA
7ca0: 72 67 21 3d 30 29 3b 0a 20 20 20 20 20 20 77 68  rg!=0);.      wh
7cb0: 69 6c 65 28 20 6a 3c 6e 41 72 67 20 29 20 61 7a  ile( j<nArg ) az
7cc0: 41 72 67 5b 69 2b 2b 5d 20 3d 20 61 7a 41 72 67  Arg[i++] = azArg
7cd0: 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 2a 70 6e  [j++];.      *pn
7ce0: 41 72 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 72  Arg = i;.      r
7cf0: 65 74 75 72 6e 20 7a 52 65 74 75 72 6e 3b 0a 20  eturn zReturn;. 
7d00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7d10: 6e 20 7a 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n zReturn;.}../*
7d20: 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d   Print a usage m
7d30: 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 70  essage for the p
7d40: 72 6f 67 72 61 6d 20 61 6e 64 20 65 78 69 74 20  rogram and exit 
7d50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
7d60: 73 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20  sage(const char 
7d70: 2a 61 72 67 76 30 29 7b 0a 20 20 69 6e 74 20 69  *argv0){.  int i
7d80: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7d90: 7a 54 61 69 6c 20 3d 20 61 72 67 76 30 3b 0a 20  zTail = argv0;. 
7da0: 20 66 6f 72 28 69 3d 30 3b 20 61 72 67 76 30 5b   for(i=0; argv0[
7db0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
7dc0: 28 20 69 73 44 69 72 53 65 70 28 61 72 67 76 30  ( isDirSep(argv0
7dd0: 5b 69 5d 29 20 29 20 7a 54 61 69 6c 20 3d 20 61  [i]) ) zTail = a
7de0: 72 67 76 30 2b 69 2b 31 3b 0a 20 20 7d 0a 20 20  rgv0+i+1;.  }.  
7df0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
7e00: 55 73 61 67 65 3a 20 25 73 20 44 41 54 41 42 41  Usage: %s DATABA
7e10: 53 45 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 53 43  SE ?OPTIONS? ?SC
7e20: 52 49 50 54 3f 5c 6e 22 2c 20 7a 54 61 69 6c 29  RIPT?\n", zTail)
7e30: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  ;.  exit(1);.}..
7e40: 2f 2a 20 52 65 70 6f 72 74 20 6f 6e 20 75 6e 72  /* Report on unr
7e50: 65 63 6f 67 6e 69 7a 65 64 20 61 72 67 75 6d 65  ecognized argume
7e60: 6e 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts */.static vo
7e70: 69 64 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 41  id unrecognizedA
7e80: 72 67 75 6d 65 6e 74 73 28 0a 20 20 63 6f 6e 73  rguments(.  cons
7e90: 74 20 63 68 61 72 20 2a 61 72 67 76 30 2c 0a 20  t char *argv0,. 
7ea0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 63 68 61   int nArg,.  cha
7eb0: 72 20 2a 2a 61 7a 41 72 67 0a 29 7b 0a 20 20 69  r **azArg.){.  i
7ec0: 6e 74 20 69 3b 0a 20 20 66 70 72 69 6e 74 66 28  nt i;.  fprintf(
7ed0: 73 74 64 65 72 72 2c 22 25 73 3a 20 75 6e 72 65  stderr,"%s: unre
7ee0: 63 6f 67 6e 69 7a 65 64 20 61 72 67 75 6d 65 6e  cognized argumen
7ef0: 74 73 3a 22 2c 20 61 72 67 76 30 29 3b 0a 20 20  ts:", argv0);.  
7f00: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
7f10: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e   i++){.    fprin
7f20: 74 66 28 73 74 64 65 72 72 2c 22 20 25 73 22 2c  tf(stderr," %s",
7f30: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 7d 0a   azArg[i]);.  }.
7f40: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
7f50: 2c 22 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31  ,"\n");.  exit(1
7f60: 29 3b 0a 7d 0a 0a 69 6e 74 20 53 51 4c 49 54 45  );.}..int SQLITE
7f70: 5f 43 44 45 43 4c 20 6d 61 69 6e 28 69 6e 74 20  _CDECL main(int 
7f80: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
7f90: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v){.  const char
7fa0: 20 2a 7a 43 6c 69 65 6e 74 3b 0a 20 20 69 6e 74   *zClient;.  int
7fb0: 20 69 43 6c 69 65 6e 74 3b 0a 20 20 69 6e 74 20   iClient;.  int 
7fc0: 6e 2c 20 69 3b 0a 20 20 69 6e 74 20 6f 70 65 6e  n, i;.  int open
7fd0: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
7fe0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
7ff0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
8000: 2a 7a 53 63 72 69 70 74 3b 0a 20 20 69 6e 74 20  *zScript;.  int 
8010: 74 61 73 6b 49 64 3b 0a 20 20 63 6f 6e 73 74 20  taskId;.  const 
8020: 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20  char *zTrace;.  
8030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 4f 70  const char *zCOp
8040: 74 69 6f 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  tion;.  const ch
8050: 61 72 20 2a 7a 4a 4d 6f 64 65 3b 0a 20 20 63 6f  ar *zJMode;.  co
8060: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 52 65 70 3b  nst char *zNRep;
8070: 0a 20 20 69 6e 74 20 6e 52 65 70 20 3d 20 31 2c  .  int nRep = 1,
8080: 20 69 52 65 70 3b 0a 0a 20 20 67 2e 61 72 67 76   iRep;..  g.argv
8090: 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 67  0 = argv[0];.  g
80a0: 2e 69 54 72 61 63 65 20 3d 20 31 3b 0a 20 20 69  .iTrace = 1;.  i
80b0: 66 28 20 61 72 67 63 3c 32 20 29 20 75 73 61 67  f( argc<2 ) usag
80c0: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 67 2e  e(argv[0]);.  g.
80d0: 7a 44 62 46 69 6c 65 20 3d 20 61 72 67 76 5b 31  zDbFile = argv[1
80e0: 5d 3b 0a 20 20 69 66 28 20 73 74 72 67 6c 6f 62  ];.  if( strglob
80f0: 28 22 2a 2e 74 65 73 74 22 2c 20 67 2e 7a 44 62  ("*.test", g.zDb
8100: 46 69 6c 65 29 20 29 20 75 73 61 67 65 28 61 72  File) ) usage(ar
8110: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 73 74  gv[0]);.  if( st
8120: 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 73 6f 75  rcmp(sqlite3_sou
8130: 72 63 65 69 64 28 29 2c 20 53 51 4c 49 54 45 5f  rceid(), SQLITE_
8140: 53 4f 55 52 43 45 5f 49 44 29 21 3d 30 20 29 7b  SOURCE_ID)!=0 ){
8150: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
8160: 65 72 72 2c 20 22 53 51 4c 69 74 65 20 6c 69 62  err, "SQLite lib
8170: 72 61 72 79 20 61 6e 64 20 68 65 61 64 65 72 20  rary and header 
8180: 6d 69 73 6d 61 74 63 68 5c 6e 22 0a 20 20 20 20  mismatch\n".    
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 22 4c 69 62 72 61 72 79 3a 20 25 73 5c 6e 22 0a  "Library: %s\n".
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 20 20 22 48 65 61 64 65 72 3a 20 20 25 73      "Header:  %s
81d0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
81e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
81f0: 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 53 51 4c  _sourceid(), SQL
8200: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 29 3b 0a  ITE_SOURCE_ID);.
8210: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
8220: 0a 20 20 6e 20 3d 20 61 72 67 63 2d 32 3b 0a 20  .  n = argc-2;. 
8230: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8240: 66 28 73 69 7a 65 6f 66 28 67 2e 7a 4e 61 6d 65  f(sizeof(g.zName
8250: 29 2c 20 67 2e 7a 4e 61 6d 65 2c 20 22 25 30 35  ), g.zName, "%05
8260: 64 2e 6d 70 74 65 73 74 22 2c 20 47 45 54 50 49  d.mptest", GETPI
8270: 44 28 29 29 3b 0a 20 20 7a 4a 4d 6f 64 65 20 3d  D());.  zJMode =
8280: 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76   findOption(argv
8290: 2b 32 2c 20 26 6e 2c 20 22 6a 6f 75 72 6e 61 6c  +2, &n, "journal
82a0: 6d 6f 64 65 22 2c 20 31 29 3b 0a 20 20 7a 4e 52  mode", 1);.  zNR
82b0: 65 70 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28  ep = findOption(
82c0: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 72 65 70  argv+2, &n, "rep
82d0: 65 61 74 22 2c 20 31 29 3b 0a 20 20 69 66 28 20  eat", 1);.  if( 
82e0: 7a 4e 52 65 70 20 29 20 6e 52 65 70 20 3d 20 61  zNRep ) nRep = a
82f0: 74 6f 69 28 7a 4e 52 65 70 29 3b 0a 20 20 69 66  toi(zNRep);.  if
8300: 28 20 6e 52 65 70 3c 31 20 29 20 6e 52 65 70 20  ( nRep<1 ) nRep 
8310: 3d 20 31 3b 0a 20 20 67 2e 7a 56 66 73 20 3d 20  = 1;.  g.zVfs = 
8320: 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b  findOption(argv+
8330: 32 2c 20 26 6e 2c 20 22 76 66 73 22 2c 20 31 29  2, &n, "vfs", 1)
8340: 3b 0a 20 20 7a 43 6c 69 65 6e 74 20 3d 20 66 69  ;.  zClient = fi
8350: 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c  ndOption(argv+2,
8360: 20 26 6e 2c 20 22 63 6c 69 65 6e 74 22 2c 20 31   &n, "client", 1
8370: 29 3b 0a 20 20 67 2e 7a 45 72 72 4c 6f 67 20 3d  );.  g.zErrLog =
8380: 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76   findOption(argv
8390: 2b 32 2c 20 26 6e 2c 20 22 65 72 72 6c 6f 67 22  +2, &n, "errlog"
83a0: 2c 20 31 29 3b 0a 20 20 67 2e 7a 4c 6f 67 20 3d  , 1);.  g.zLog =
83b0: 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76   findOption(argv
83c0: 2b 32 2c 20 26 6e 2c 20 22 6c 6f 67 22 2c 20 31  +2, &n, "log", 1
83d0: 29 3b 0a 20 20 7a 54 72 61 63 65 20 3d 20 66 69  );.  zTrace = fi
83e0: 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c  ndOption(argv+2,
83f0: 20 26 6e 2c 20 22 74 72 61 63 65 22 2c 20 31 29   &n, "trace", 1)
8400: 3b 0a 20 20 69 66 28 20 7a 54 72 61 63 65 20 29  ;.  if( zTrace )
8410: 20 67 2e 69 54 72 61 63 65 20 3d 20 61 74 6f 69   g.iTrace = atoi
8420: 28 7a 54 72 61 63 65 29 3b 0a 20 20 69 66 28 20  (zTrace);.  if( 
8430: 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b  findOption(argv+
8440: 32 2c 20 26 6e 2c 20 22 71 75 69 65 74 22 2c 20  2, &n, "quiet", 
8450: 30 29 21 3d 30 20 29 20 67 2e 69 54 72 61 63 65  0)!=0 ) g.iTrace
8460: 20 3d 20 30 3b 0a 20 20 67 2e 62 53 71 6c 54 72   = 0;.  g.bSqlTr
8470: 61 63 65 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e  ace = findOption
8480: 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 73 71  (argv+2, &n, "sq
8490: 6c 74 72 61 63 65 22 2c 20 30 29 21 3d 30 3b 0a  ltrace", 0)!=0;.
84a0: 20 20 67 2e 62 53 79 6e 63 20 3d 20 66 69 6e 64    g.bSync = find
84b0: 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26  Option(argv+2, &
84c0: 6e 2c 20 22 73 79 6e 63 22 2c 20 30 29 21 3d 30  n, "sync", 0)!=0
84d0: 3b 0a 20 20 69 66 28 20 67 2e 7a 45 72 72 4c 6f  ;.  if( g.zErrLo
84e0: 67 20 29 7b 0a 20 20 20 20 67 2e 70 45 72 72 4c  g ){.    g.pErrL
84f0: 6f 67 20 3d 20 66 6f 70 65 6e 28 67 2e 7a 45 72  og = fopen(g.zEr
8500: 72 4c 6f 67 2c 20 22 61 22 29 3b 0a 20 20 7d 65  rLog, "a");.  }e
8510: 6c 73 65 7b 0a 20 20 20 20 67 2e 70 45 72 72 4c  lse{.    g.pErrL
8520: 6f 67 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d  og = stderr;.  }
8530: 0a 20 20 69 66 28 20 67 2e 7a 4c 6f 67 20 29 7b  .  if( g.zLog ){
8540: 0a 20 20 20 20 67 2e 70 4c 6f 67 20 3d 20 66 6f  .    g.pLog = fo
8550: 70 65 6e 28 67 2e 7a 4c 6f 67 2c 20 22 61 22 29  pen(g.zLog, "a")
8560: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
8570: 2e 70 4c 6f 67 20 3d 20 73 74 64 6f 75 74 3b 0a  .pLog = stdout;.
8580: 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33    }.  .  sqlite3
8590: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
85a0: 4f 4e 46 49 47 5f 4c 4f 47 2c 20 73 71 6c 45 72  ONFIG_LOG, sqlEr
85b0: 72 6f 72 43 61 6c 6c 62 61 63 6b 2c 20 30 29 3b  rorCallback, 0);
85c0: 0a 20 20 69 66 28 20 7a 43 6c 69 65 6e 74 20 29  .  if( zClient )
85d0: 7b 0a 20 20 20 20 69 43 6c 69 65 6e 74 20 3d 20  {.    iClient = 
85e0: 61 74 6f 69 28 7a 43 6c 69 65 6e 74 29 3b 0a 20  atoi(zClient);. 
85f0: 20 20 20 69 66 28 20 69 43 6c 69 65 6e 74 3c 31     if( iClient<1
8600: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 69   ) fatalError("i
8610: 6c 6c 65 67 61 6c 20 63 6c 69 65 6e 74 20 6e 75  llegal client nu
8620: 6d 62 65 72 3a 20 25 64 5c 6e 22 2c 20 69 43 6c  mber: %d\n", iCl
8630: 69 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  ient);.    sqlit
8640: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
8650: 6f 66 28 67 2e 7a 4e 61 6d 65 29 2c 20 67 2e 7a  of(g.zName), g.z
8660: 4e 61 6d 65 2c 20 22 25 30 35 64 2e 63 6c 69 65  Name, "%05d.clie
8670: 6e 74 25 30 32 64 22 2c 0a 20 20 20 20 20 20 20  nt%02d",.       
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 45                GE
8690: 54 50 49 44 28 29 2c 20 69 43 6c 69 65 6e 74 29  TPID(), iClient)
86a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
86b0: 66 28 20 67 2e 69 54 72 61 63 65 3e 30 20 29 7b  f( g.iTrace>0 ){
86c0: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 42  .      printf("B
86d0: 45 47 49 4e 3a 20 25 73 22 2c 20 61 72 67 76 5b  EGIN: %s", argv[
86e0: 30 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0]);.      for(i
86f0: 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =1; i<argc; i++)
8700: 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20 61   printf(" %s", a
8710: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  rgv[i]);.      p
8720: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
8730: 20 20 20 70 72 69 6e 74 66 28 22 57 69 74 68 20     printf("With 
8740: 53 51 4c 69 74 65 20 22 20 53 51 4c 49 54 45 5f  SQLite " SQLITE_
8750: 56 45 52 53 49 4f 4e 20 22 20 22 20 53 51 4c 49  VERSION " " SQLI
8760: 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 22 5c 6e  TE_SOURCE_ID "\n
8770: 22 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  " );.      for(i
8780: 3d 30 3b 20 28 7a 43 4f 70 74 69 6f 6e 20 3d 20  =0; (zCOption = 
8790: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
87a0: 70 74 69 6f 6e 5f 67 65 74 28 69 29 29 21 3d 30  ption_get(i))!=0
87b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
87c0: 70 72 69 6e 74 66 28 22 2d 44 53 51 4c 49 54 45  printf("-DSQLITE
87d0: 5f 25 73 5c 6e 22 2c 20 7a 43 4f 70 74 69 6f 6e  _%s\n", zCOption
87e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
87f0: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
8800: 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 6c 69 65  .    }.    iClie
8810: 6e 74 20 3d 20 20 30 3b 0a 20 20 20 20 75 6e 6c  nt =  0;.    unl
8820: 69 6e 6b 28 67 2e 7a 44 62 46 69 6c 65 29 3b 0a  ink(g.zDbFile);.
8830: 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
8840: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
8850: 41 54 45 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ATE;.  }.  rc = 
8860: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
8870: 67 2e 7a 44 62 46 69 6c 65 2c 20 26 67 2e 64 62  g.zDbFile, &g.db
8880: 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 67 2e 7a  , openFlags, g.z
8890: 56 66 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Vfs);.  if( rc )
88a0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e   fatalError("can
88b0: 6e 6f 74 20 6f 70 65 6e 20 5b 25 73 5d 22 2c 20  not open [%s]", 
88c0: 67 2e 7a 44 62 46 69 6c 65 29 3b 0a 20 20 69 66  g.zDbFile);.  if
88d0: 28 20 7a 4a 4d 6f 64 65 20 29 7b 0a 23 69 66 20  ( zJMode ){.#if 
88e0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
88f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
8900: 73 74 72 69 63 6d 70 28 7a 4a 4d 6f 64 65 2c 22  stricmp(zJMode,"
8910: 70 65 72 73 69 73 74 22 29 3d 3d 30 0a 20 20 20  persist")==0.   
8920: 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72    || sqlite3_str
8930: 69 63 6d 70 28 7a 4a 4d 6f 64 65 2c 22 74 72 75  icmp(zJMode,"tru
8940: 6e 63 61 74 65 22 29 3d 3d 30 0a 20 20 20 20 29  ncate")==0.    )
8950: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
8960: 43 68 61 6e 67 69 6e 67 20 6a 6f 75 72 6e 61 6c  Changing journal
8970: 20 6d 6f 64 65 20 74 6f 20 44 45 4c 45 54 45 20   mode to DELETE 
8980: 66 72 6f 6d 20 25 73 22 2c 20 7a 4a 4d 6f 64 65  from %s", zJMode
8990: 29 3b 0a 20 20 20 20 20 20 7a 4a 4d 6f 64 65 20  );.      zJMode 
89a0: 3d 20 22 44 45 4c 45 54 45 22 3b 0a 20 20 20 20  = "DELETE";.    
89b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 75 6e  }.#endif.    run
89c0: 53 71 6c 28 22 50 52 41 47 4d 41 20 6a 6f 75 72  Sql("PRAGMA jour
89d0: 6e 61 6c 5f 6d 6f 64 65 3d 25 51 3b 22 2c 20 7a  nal_mode=%Q;", z
89e0: 4a 4d 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 69 66  JMode);.  }.  if
89f0: 28 20 21 67 2e 62 53 79 6e 63 20 29 20 74 72 79  ( !g.bSync ) try
8a00: 53 71 6c 28 22 50 52 41 47 4d 41 20 73 79 6e 63  Sql("PRAGMA sync
8a10: 68 72 6f 6e 6f 75 73 3d 4f 46 46 22 29 3b 0a 20  hronous=OFF");. 
8a20: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
8a30: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 67  load_extension(g
8a40: 2e 64 62 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  .db, 1);.  sqlit
8a50: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
8a60: 67 2e 64 62 2c 20 62 75 73 79 48 61 6e 64 6c 65  g.db, busyHandle
8a70: 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  r, 0);.  sqlite3
8a80: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8a90: 28 67 2e 64 62 2c 20 22 76 66 73 6e 61 6d 65 22  (g.db, "vfsname"
8aa0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
8ab0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
8ad0: 66 73 4e 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30  fsNameFunc, 0, 0
8ae0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  );.  sqlite3_cre
8af0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64  ate_function(g.d
8b00: 62 2c 20 22 65 76 61 6c 22 2c 20 31 2c 20 53 51  b, "eval", 1, SQ
8b10: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 20 20 20 20 20 20 20 65 76 61 6c 46 75 6e 63          evalFunc
8b40: 2c 20 30 2c 20 30 29 3b 0a 20 20 67 2e 69 54 69  , 0, 0);.  g.iTi
8b50: 6d 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f  meout = DEFAULT_
8b60: 54 49 4d 45 4f 55 54 3b 0a 20 20 69 66 28 20 67  TIMEOUT;.  if( g
8b70: 2e 62 53 71 6c 54 72 61 63 65 20 29 20 73 71 6c  .bSqlTrace ) sql
8b80: 69 74 65 33 5f 74 72 61 63 65 28 67 2e 64 62 2c  ite3_trace(g.db,
8b90: 20 73 71 6c 54 72 61 63 65 43 61 6c 6c 62 61 63   sqlTraceCallbac
8ba0: 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 69 43 6c  k, 0);.  if( iCl
8bb0: 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69 66  ient>0 ){.    if
8bc0: 28 20 6e 3e 30 20 29 20 75 6e 72 65 63 6f 67 6e  ( n>0 ) unrecogn
8bd0: 69 7a 65 64 41 72 67 75 6d 65 6e 74 73 28 61 72  izedArguments(ar
8be0: 67 76 5b 30 5d 2c 20 6e 2c 20 61 72 67 76 2b 32  gv[0], n, argv+2
8bf0: 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 69 54 72  );.    if( g.iTr
8c00: 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65  ace ) logMessage
8c10: 28 22 73 74 61 72 74 2d 63 6c 69 65 6e 74 22 29  ("start-client")
8c20: 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a  ;.    while(1){.
8c30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 73        char *zTas
8c40: 6b 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  kName = 0;.     
8c50: 20 72 63 20 3d 20 73 74 61 72 74 53 63 72 69 70   rc = startScrip
8c60: 74 28 69 43 6c 69 65 6e 74 2c 20 26 7a 53 63 72  t(iClient, &zScr
8c70: 69 70 74 2c 20 26 74 61 73 6b 49 64 2c 20 26 7a  ipt, &taskId, &z
8c80: 54 61 73 6b 4e 61 6d 65 29 3b 0a 20 20 20 20 20  TaskName);.     
8c90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8ca0: 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20  DONE ) break;.  
8cb0: 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65      if( g.iTrace
8cc0: 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 62   ) logMessage("b
8cd0: 65 67 69 6e 20 25 73 20 28 25 64 29 22 2c 20 7a  egin %s (%d)", z
8ce0: 54 61 73 6b 4e 61 6d 65 2c 20 74 61 73 6b 49 64  TaskName, taskId
8cf0: 29 3b 0a 20 20 20 20 20 20 72 75 6e 53 63 72 69  );.      runScri
8d00: 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73 6b  pt(iClient, task
8d10: 49 64 2c 20 7a 53 63 72 69 70 74 2c 20 7a 54 61  Id, zScript, zTa
8d20: 73 6b 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  skName);.      i
8d30: 66 28 20 67 2e 69 54 72 61 63 65 20 29 20 6c 6f  f( g.iTrace ) lo
8d40: 67 4d 65 73 73 61 67 65 28 22 65 6e 64 20 25 73  gMessage("end %s
8d50: 20 28 25 64 29 22 2c 20 7a 54 61 73 6b 4e 61 6d   (%d)", zTaskNam
8d60: 65 2c 20 74 61 73 6b 49 64 29 3b 0a 20 20 20 20  e, taskId);.    
8d70: 20 20 66 69 6e 69 73 68 53 63 72 69 70 74 28 69    finishScript(i
8d80: 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49 64 2c 20  Client, taskId, 
8d90: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8da0: 33 5f 66 72 65 65 28 7a 54 61 73 6b 4e 61 6d 65  3_free(zTaskName
8db0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8dc0: 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 20  _sleep(10);.    
8dd0: 7d 0a 20 20 20 20 69 66 28 20 67 2e 69 54 72 61  }.    if( g.iTra
8de0: 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28  ce ) logMessage(
8df0: 22 65 6e 64 2d 63 6c 69 65 6e 74 22 29 3b 0a 20  "end-client");. 
8e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8e10: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
8e20: 0a 20 20 20 20 69 6e 74 20 69 54 69 6d 65 6f 75  .    int iTimeou
8e30: 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  t;.    if( n==0 
8e40: 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 45 72  ){.      fatalEr
8e50: 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 73 63 72  ror("missing scr
8e60: 69 70 74 20 66 69 6c 65 6e 61 6d 65 22 29 3b 0a  ipt filename");.
8e70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
8e80: 31 20 29 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64  1 ) unrecognized
8e90: 41 72 67 75 6d 65 6e 74 73 28 61 72 67 76 5b 30  Arguments(argv[0
8ea0: 5d 2c 20 6e 2c 20 61 72 67 76 2b 32 29 3b 0a 20  ], n, argv+2);. 
8eb0: 20 20 20 72 75 6e 53 71 6c 28 0a 20 20 20 20 20     runSql(.     
8ec0: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
8ed0: 45 58 49 53 54 53 20 74 61 73 6b 3b 5c 6e 22 0a  EXISTS task;\n".
8ee0: 20 20 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c        "DROP TABL
8ef0: 45 20 49 46 20 45 58 49 53 54 53 20 63 6f 75 6e  E IF EXISTS coun
8f00: 74 65 72 73 3b 5c 6e 22 0a 20 20 20 20 20 20 22  ters;\n".      "
8f10: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
8f20: 49 53 54 53 20 63 6c 69 65 6e 74 3b 5c 6e 22 0a  ISTS client;\n".
8f30: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
8f40: 42 4c 45 20 74 61 73 6b 28 5c 6e 22 0a 20 20 20  BLE task(\n".   
8f50: 20 20 20 22 20 20 69 64 20 49 4e 54 45 47 45 52     "  id INTEGER
8f60: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22   PRIMARY KEY,\n"
8f70: 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54  .      "  name T
8f80: 45 58 54 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20  EXT,\n".      " 
8f90: 20 63 6c 69 65 6e 74 20 49 4e 54 45 47 45 52 2c   client INTEGER,
8fa0: 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 73 74 61  \n".      "  sta
8fb0: 72 74 74 69 6d 65 20 44 41 54 45 2c 5c 6e 22 0a  rttime DATE,\n".
8fc0: 20 20 20 20 20 20 22 20 20 65 6e 64 74 69 6d 65        "  endtime
8fd0: 20 44 41 54 45 2c 5c 6e 22 0a 20 20 20 20 20 20   DATE,\n".      
8fe0: 22 20 20 73 63 72 69 70 74 20 54 45 58 54 5c 6e  "  script TEXT\n
8ff0: 22 0a 20 20 20 20 20 20 22 29 3b 22 0a 20 20 20  ".      ");".   
9000: 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58     "CREATE INDEX
9010: 20 74 61 73 6b 5f 69 31 20 4f 4e 20 74 61 73 6b   task_i1 ON task
9020: 28 63 6c 69 65 6e 74 2c 20 73 74 61 72 74 74 69  (client, startti
9030: 6d 65 29 3b 5c 6e 22 0a 20 20 20 20 20 20 22 43  me);\n".      "C
9040: 52 45 41 54 45 20 49 4e 44 45 58 20 74 61 73 6b  REATE INDEX task
9050: 5f 69 32 20 4f 4e 20 74 61 73 6b 28 63 6c 69 65  _i2 ON task(clie
9060: 6e 74 2c 20 65 6e 64 74 69 6d 65 29 3b 5c 6e 22  nt, endtime);\n"
9070: 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54  .      "CREATE T
9080: 41 42 4c 45 20 63 6f 75 6e 74 65 72 73 28 6e 45  ABLE counters(nE
9090: 72 72 6f 72 2c 6e 54 65 73 74 29 3b 5c 6e 22 0a  rror,nTest);\n".
90a0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
90b0: 54 4f 20 63 6f 75 6e 74 65 72 73 20 56 41 4c 55  TO counters VALU
90c0: 45 53 28 30 2c 30 29 3b 5c 6e 22 0a 20 20 20 20  ES(0,0);\n".    
90d0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
90e0: 63 6c 69 65 6e 74 28 69 64 20 49 4e 54 45 47 45  client(id INTEGE
90f0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 77  R PRIMARY KEY, w
9100: 61 6e 74 48 61 6c 74 29 3b 5c 6e 22 0a 20 20 20  antHalt);\n".   
9110: 20 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20   );.    zScript 
9120: 3d 20 72 65 61 64 46 69 6c 65 28 61 72 67 76 5b  = readFile(argv[
9130: 32 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 52 65  2]);.    for(iRe
9140: 70 3d 31 3b 20 69 52 65 70 3c 3d 6e 52 65 70 3b  p=1; iRep<=nRep;
9150: 20 69 52 65 70 2b 2b 29 7b 0a 20 20 20 20 20 20   iRep++){.      
9160: 69 66 28 20 67 2e 69 54 72 61 63 65 20 29 20 6c  if( g.iTrace ) l
9170: 6f 67 4d 65 73 73 61 67 65 28 22 62 65 67 69 6e  ogMessage("begin
9180: 20 73 63 72 69 70 74 20 5b 25 73 5d 20 63 79 63   script [%s] cyc
9190: 6c 65 20 25 64 5c 6e 22 2c 20 61 72 67 76 5b 32  le %d\n", argv[2
91a0: 5d 2c 20 69 52 65 70 29 3b 0a 20 20 20 20 20 20  ], iRep);.      
91b0: 72 75 6e 53 63 72 69 70 74 28 30 2c 20 30 2c 20  runScript(0, 0, 
91c0: 7a 53 63 72 69 70 74 2c 20 61 72 67 76 5b 32 5d  zScript, argv[2]
91d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69  );.      if( g.i
91e0: 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61  Trace ) logMessa
91f0: 67 65 28 22 65 6e 64 20 73 63 72 69 70 74 20 5b  ge("end script [
9200: 25 73 5d 20 63 79 63 6c 65 20 25 64 5c 6e 22 2c  %s] cycle %d\n",
9210: 20 61 72 67 76 5b 32 5d 2c 20 69 52 65 70 29 3b   argv[2], iRep);
9220: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9230: 65 33 5f 66 72 65 65 28 7a 53 63 72 69 70 74 29  e3_free(zScript)
9240: 3b 0a 20 20 20 20 77 61 69 74 46 6f 72 43 6c 69  ;.    waitForCli
9250: 65 6e 74 28 30 2c 20 32 30 30 30 2c 20 22 64 75  ent(0, 2000, "du
9260: 72 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 2e 2e  ring shutdown...
9270: 5c 6e 22 29 3b 0a 20 20 20 20 74 72 79 53 71 6c  \n");.    trySql
9280: 28 22 55 50 44 41 54 45 20 63 6c 69 65 6e 74 20  ("UPDATE client 
9290: 53 45 54 20 77 61 6e 74 48 61 6c 74 3d 31 22 29  SET wantHalt=1")
92a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c  ;.    sqlite3_sl
92b0: 65 65 70 28 31 30 29 3b 0a 20 20 20 20 67 2e 69  eep(10);.    g.i
92c0: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20  Timeout = 0;.   
92d0: 20 69 54 69 6d 65 6f 75 74 20 3d 20 31 30 30 30   iTimeout = 1000
92e0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 72  ;.    while( ((r
92f0: 63 20 3d 20 74 72 79 53 71 6c 28 22 53 45 4c 45  c = trySql("SELE
9300: 43 54 20 31 20 46 52 4f 4d 20 63 6c 69 65 6e 74  CT 1 FROM client
9310: 22 29 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  "))==SQLITE_BUSY
9320: 0a 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d  .        || rc==
9330: 53 51 4c 49 54 45 5f 52 4f 57 29 20 26 26 20 69  SQLITE_ROW) && i
9340: 54 69 6d 65 6f 75 74 3e 30 20 29 7b 0a 20 20 20  Timeout>0 ){.   
9350: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
9360: 28 31 30 29 3b 0a 20 20 20 20 20 20 69 54 69 6d  (10);.      iTim
9370: 65 6f 75 74 20 2d 3d 20 31 30 3b 0a 20 20 20 20  eout -= 10;.    
9380: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c  }.    sqlite3_sl
9390: 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 70 53  eep(100);.    pS
93a0: 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c  tmt = prepareSql
93b0: 28 22 53 45 4c 45 43 54 20 6e 45 72 72 6f 72 2c  ("SELECT nError,
93c0: 20 6e 54 65 73 74 20 46 52 4f 4d 20 63 6f 75 6e   nTest FROM coun
93d0: 74 65 72 73 22 29 3b 0a 20 20 20 20 69 54 69 6d  ters");.    iTim
93e0: 65 6f 75 74 20 3d 20 31 30 30 30 3b 0a 20 20 20  eout = 1000;.   
93f0: 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
9400: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
9410: 29 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  ))==SQLITE_BUSY 
9420: 26 26 20 69 54 69 6d 65 6f 75 74 3e 30 20 29 7b  && iTimeout>0 ){
9430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9440: 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 20 20 20  leep(10);.      
9450: 69 54 69 6d 65 6f 75 74 20 2d 3d 20 31 30 3b 0a  iTimeout -= 10;.
9460: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
9470: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
9480: 20 20 20 20 20 20 67 2e 6e 45 72 72 6f 72 20 2b        g.nError +
9490: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
94a0: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
94b0: 20 20 20 20 20 20 67 2e 6e 54 65 73 74 20 2b 3d        g.nTest +=
94c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
94d0: 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  int(pStmt, 1);. 
94e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
94f0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
9500: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
9510: 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20 6d  close(g.db);.  m
9520: 61 79 62 65 43 6c 6f 73 65 28 67 2e 70 4c 6f 67  aybeClose(g.pLog
9530: 29 3b 0a 20 20 6d 61 79 62 65 43 6c 6f 73 65 28  );.  maybeClose(
9540: 67 2e 70 45 72 72 4c 6f 67 29 3b 0a 20 20 69 66  g.pErrLog);.  if
9550: 28 20 69 43 6c 69 65 6e 74 3d 3d 30 20 29 7b 0a  ( iClient==0 ){.
9560: 20 20 20 20 70 72 69 6e 74 66 28 22 53 75 6d 6d      printf("Summ
9570: 61 72 79 3a 20 25 64 20 65 72 72 6f 72 73 20 6f  ary: %d errors o
9580: 75 74 20 6f 66 20 25 64 20 74 65 73 74 73 5c 6e  ut of %d tests\n
9590: 22 2c 20 67 2e 6e 45 72 72 6f 72 2c 20 67 2e 6e  ", g.nError, g.n
95a0: 54 65 73 74 29 3b 0a 20 20 20 20 70 72 69 6e 74  Test);.    print
95b0: 66 28 22 45 4e 44 3a 20 25 73 22 2c 20 61 72 67  f("END: %s", arg
95c0: 76 5b 30 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  v[0]);.    for(i
95d0: 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =1; i<argc; i++)
95e0: 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20 61   printf(" %s", a
95f0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 70 72 69  rgv[i]);.    pri
9600: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
9610: 20 72 65 74 75 72 6e 20 67 2e 6e 45 72 72 6f 72   return g.nError
9620: 3e 30 3b 0a 7d 0a                                >0;.}.