/ Hex Artifact Content
Login

Artifact dc77f920d24f2f515bd315b87942b6396332a414:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 53 65 70 74 65  /*.** 2007 Septe
0010: 6d 62 65 72 20 39 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 9.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
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 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
01a0: 6e 20 6f 66 20 73 6f 6d 65 20 54 63 6c 20 63 6f  n of some Tcl co
01b0: 6d 6d 61 6e 64 73 20 75 73 65 64 20 74 6f 0a 2a  mmands used to.*
01c0: 2a 20 74 65 73 74 20 74 68 61 74 20 73 71 6c 69  * test that sqli
01d0: 74 65 33 20 64 61 74 61 62 61 73 65 20 68 61 6e  te3 database han
01e0: 64 6c 65 73 20 6d 61 79 20 62 65 20 63 6f 6e 63  dles may be conc
01f0: 75 72 72 65 6e 74 6c 79 20 61 63 63 65 73 73 65  urrently accesse
0200: 64 20 62 79 20 0a 2a 2a 20 6d 75 6c 74 69 70 6c  d by .** multipl
0210: 65 20 74 68 72 65 61 64 73 2e 20 52 69 67 68 74  e threads. Right
0220: 20 6e 6f 77 20 74 68 69 73 20 6f 6e 6c 79 20 77   now this only w
0230: 6f 72 6b 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2f  orks on unix..*/
0240: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
0250: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0260: 65 20 3c 74 63 6c 2e 68 3e 0a 0a 23 69 66 20 53  e <tcl.h>..#if S
0270: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
0280: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e  ..#include <errn
0290: 6f 2e 68 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e  o.h>..#if !defin
02a0: 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 23 69 6e  ed(_MSC_VER).#in
02b0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
02c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
02d0: 6e 65 20 6f 66 20 74 68 65 73 65 20 69 73 20 61  ne of these is a
02e0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
02f0: 68 20 74 68 72 65 61 64 20 63 72 65 61 74 65 64  h thread created
0300: 20 62 79 20 5b 73 71 6c 74 68 72 65 61 64 20 73   by [sqlthread s
0310: 70 61 77 6e 5d 2e 0a 2a 2f 0a 74 79 70 65 64 65  pawn]..*/.typede
0320: 66 20 73 74 72 75 63 74 20 53 71 6c 54 68 72 65  f struct SqlThre
0330: 61 64 20 53 71 6c 54 68 72 65 61 64 3b 0a 73 74  ad SqlThread;.st
0340: 72 75 63 74 20 53 71 6c 54 68 72 65 61 64 20 7b  ruct SqlThread {
0350: 0a 20 20 54 63 6c 5f 54 68 72 65 61 64 49 64 20  .  Tcl_ThreadId 
0360: 70 61 72 65 6e 74 3b 20 20 20 20 20 2f 2a 20 54  parent;     /* T
0370: 68 72 65 61 64 20 69 64 20 6f 66 20 70 61 72 65  hread id of pare
0380: 6e 74 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 54  nt thread */.  T
0390: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
03a0: 70 3b 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  p;      /* Paren
03b0: 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  t interpreter */
03c0: 0a 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74  .  char *zScript
03d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
03e0: 68 65 20 73 63 72 69 70 74 20 74 6f 20 65 78 65  he script to exe
03f0: 63 75 74 65 2e 20 2a 2f 0a 20 20 63 68 61 72 20  cute. */.  char 
0400: 2a 7a 56 61 72 6e 61 6d 65 3b 20 20 20 20 20 20  *zVarname;      
0410: 20 20 20 20 2f 2a 20 56 61 72 6e 61 6d 65 20 69      /* Varname i
0420: 6e 20 70 61 72 65 6e 74 20 73 63 72 69 70 74 20  n parent script 
0430: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  */.};../*.** A c
0440: 75 73 74 6f 6d 20 54 63 6c 5f 45 76 65 6e 74 20  ustom Tcl_Event 
0450: 74 79 70 65 20 75 73 65 64 20 62 79 20 74 68 69  type used by thi
0460: 73 20 6d 6f 64 75 6c 65 2e 20 57 68 65 6e 20 74  s module. When t
0470: 68 65 20 65 76 65 6e 74 20 69 73 0a 2a 2a 20 68  he event is.** h
0480: 61 6e 64 6c 65 64 2c 20 73 63 72 69 70 74 20 7a  andled, script z
0490: 53 63 72 69 70 74 20 69 73 20 65 76 61 6c 75 61  Script is evalua
04a0: 74 65 64 20 69 6e 20 69 6e 74 65 72 70 72 65 74  ted in interpret
04b0: 65 72 20 69 6e 74 65 72 70 2e 20 49 66 0a 2a 2a  er interp. If.**
04c0: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
04d0: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
04e0: 69 6f 6e 20 28 72 65 74 75 72 6e 73 20 54 43 4c  ion (returns TCL
04f0: 5f 45 52 52 4f 52 29 2c 20 74 68 65 6e 20 74 68  _ERROR), then th
0500: 65 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 68 61  e.** error is ha
0510: 6e 64 6c 65 64 20 62 79 20 54 63 6c 5f 42 61 63  ndled by Tcl_Bac
0520: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 29 2e 20  kgroundError(). 
0530: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
0540: 72 73 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  rs,.** the resul
0550: 74 20 69 73 20 73 69 6d 70 6c 79 20 64 69 73 63  t is simply disc
0560: 61 72 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64 65  arded..*/.typede
0570: 66 20 73 74 72 75 63 74 20 45 76 61 6c 45 76 65  f struct EvalEve
0580: 6e 74 20 45 76 61 6c 45 76 65 6e 74 3b 0a 73 74  nt EvalEvent;.st
0590: 72 75 63 74 20 45 76 61 6c 45 76 65 6e 74 20 7b  ruct EvalEvent {
05a0: 0a 20 20 54 63 6c 5f 45 76 65 6e 74 20 62 61 73  .  Tcl_Event bas
05b0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  e;          /* B
05c0: 61 73 65 20 63 6c 61 73 73 20 6f 66 20 74 79 70  ase class of typ
05d0: 65 20 54 63 6c 5f 45 76 65 6e 74 20 2a 2f 0a 20  e Tcl_Event */. 
05e0: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20   char *zScript; 
05f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0600: 20 73 63 72 69 70 74 20 74 6f 20 65 78 65 63 75   script to execu
0610: 74 65 2e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  te. */.  Tcl_Int
0620: 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20  erp *interp;    
0630: 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72    /* The interpr
0640: 65 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  eter to execute 
0650: 69 74 20 69 6e 2e 20 2a 2f 0a 7d 3b 0a 0a 73 74  it in. */.};..st
0660: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  atic Tcl_ObjCmdP
0670: 72 6f 63 20 73 71 6c 74 68 72 65 61 64 5f 70 72  roc sqlthread_pr
0680: 6f 63 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f  oc;.static Tcl_O
0690: 62 6a 43 6d 64 50 72 6f 63 20 63 6c 6f 63 6b 5f  bjCmdProc clock_
06a0: 73 65 63 6f 6e 64 73 5f 70 72 6f 63 3b 0a 23 69  seconds_proc;.#i
06b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
06c0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
06d0: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
06e0: 5f 4e 4f 54 49 46 59 29 0a 73 74 61 74 69 63 20  _NOTIFY).static 
06f0: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 62  Tcl_ObjCmdProc b
0700: 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 5f 70 72 6f  locking_step_pro
0710: 63 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  c;.static Tcl_Ob
0720: 6a 43 6d 64 50 72 6f 63 20 62 6c 6f 63 6b 69 6e  jCmdProc blockin
0730: 67 5f 70 72 65 70 61 72 65 5f 76 32 5f 70 72 6f  g_prepare_v2_pro
0740: 63 3b 0a 23 65 6e 64 69 66 0a 69 6e 74 20 53 71  c;.#endif.int Sq
0750: 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
0760: 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 69 6e  cl_Interp *);.in
0770: 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  t Sqlite3_Init(T
0780: 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 0a 2f  cl_Interp *);../
0790: 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d  * Functions from
07a0: 20 74 65 73 74 31 2e 63 20 2a 2f 0a 76 6f 69 64   test1.c */.void
07b0: 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54 65 78   *sqlite3TestTex
07c0: 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63 68 61  tToPtr(const cha
07d0: 72 20 2a 29 3b 0a 63 6f 6e 73 74 20 63 68 61 72  r *);.const char
07e0: 20 2a 73 71 6c 69 74 65 33 54 65 73 74 45 72 72   *sqlite3TestErr
07f0: 6f 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 69 6e 74  orName(int);.int
0800: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63   getDbPointer(Tc
0810: 6c 5f 49 6e 74 65 72 70 20 2a 2c 20 63 6f 6e 73  l_Interp *, cons
0820: 74 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65  t char *, sqlite
0830: 33 20 2a 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74  3 **);.int sqlit
0840: 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
0850: 72 53 74 72 28 54 63 6c 5f 49 6e 74 65 72 70 20  rStr(Tcl_Interp 
0860: 2a 2c 20 63 68 61 72 20 2a 2c 20 76 6f 69 64 20  *, char *, void 
0870: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  *);.int sqlite3T
0880: 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f 49  estErrCode(Tcl_I
0890: 6e 74 65 72 70 20 2a 2c 20 73 71 6c 69 74 65 33  nterp *, sqlite3
08a0: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a   *, int);../*.**
08b0: 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 65 76 65   Handler for eve
08c0: 6e 74 73 20 6f 66 20 74 79 70 65 20 45 76 61 6c  nts of type Eval
08d0: 45 76 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  Event..*/.static
08e0: 20 69 6e 74 20 74 63 6c 53 63 72 69 70 74 45 76   int tclScriptEv
08f0: 65 6e 74 28 54 63 6c 5f 45 76 65 6e 74 20 2a 65  ent(Tcl_Event *e
0900: 76 50 74 72 2c 20 69 6e 74 20 66 6c 61 67 73 29  vPtr, int flags)
0910: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 45 76  {.  int rc;.  Ev
0920: 61 6c 45 76 65 6e 74 20 2a 70 20 3d 20 28 45 76  alEvent *p = (Ev
0930: 61 6c 45 76 65 6e 74 20 2a 29 65 76 50 74 72 3b  alEvent *)evPtr;
0940: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
0950: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 7a  (p->interp, p->z
0960: 53 63 72 69 70 74 29 3b 0a 20 20 69 66 28 20 72  Script);.  if( r
0970: 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c!=TCL_OK ){.   
0980: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
0990: 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b  rror(p->interp);
09a0: 0a 20 20 7d 0a 20 20 55 4e 55 53 45 44 5f 50 41  .  }.  UNUSED_PA
09b0: 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a  RAMETER(flags);.
09c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
09d0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 6e  *.** Register an
09e0: 20 45 76 61 6c 45 76 65 6e 74 20 74 6f 20 65 76   EvalEvent to ev
09f0: 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70  aluate the scrip
0a00: 74 20 70 53 63 72 69 70 74 20 69 6e 20 74 68 65  t pScript in the
0a10: 0a 2a 2a 20 70 61 72 65 6e 74 20 69 6e 74 65 72  .** parent inter
0a20: 70 72 65 74 65 72 2f 74 68 72 65 61 64 20 6f 66  preter/thread of
0a30: 20 53 71 6c 54 68 72 65 61 64 20 70 2e 0a 2a 2f   SqlThread p..*/
0a40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 73  .static void pos
0a50: 74 54 6f 50 61 72 65 6e 74 28 53 71 6c 54 68 72  tToParent(SqlThr
0a60: 65 61 64 20 2a 70 2c 20 54 63 6c 5f 4f 62 6a 20  ead *p, Tcl_Obj 
0a70: 2a 70 53 63 72 69 70 74 29 7b 0a 20 20 45 76 61  *pScript){.  Eva
0a80: 6c 45 76 65 6e 74 20 2a 70 45 76 65 6e 74 3b 0a  lEvent *pEvent;.
0a90: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
0aa0: 69 6e 74 20 6e 4d 73 67 3b 0a 0a 20 20 7a 4d 73  int nMsg;..  zMs
0ab0: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
0ac0: 67 46 72 6f 6d 4f 62 6a 28 70 53 63 72 69 70 74  gFromObj(pScript
0ad0: 2c 20 26 6e 4d 73 67 29 3b 20 0a 20 20 70 45 76  , &nMsg); .  pEv
0ae0: 65 6e 74 20 3d 20 28 45 76 61 6c 45 76 65 6e 74  ent = (EvalEvent
0af0: 20 2a 29 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f   *)ckalloc(sizeo
0b00: 66 28 45 76 61 6c 45 76 65 6e 74 29 2b 6e 4d 73  f(EvalEvent)+nMs
0b10: 67 2b 31 29 3b 0a 20 20 70 45 76 65 6e 74 2d 3e  g+1);.  pEvent->
0b20: 62 61 73 65 2e 6e 65 78 74 50 74 72 20 3d 20 30  base.nextPtr = 0
0b30: 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 62 61 73 65  ;.  pEvent->base
0b40: 2e 70 72 6f 63 20 3d 20 74 63 6c 53 63 72 69 70  .proc = tclScrip
0b50: 74 45 76 65 6e 74 3b 0a 20 20 70 45 76 65 6e 74  tEvent;.  pEvent
0b60: 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61  ->zScript = (cha
0b70: 72 20 2a 29 26 70 45 76 65 6e 74 5b 31 5d 3b 0a  r *)&pEvent[1];.
0b80: 20 20 6d 65 6d 63 70 79 28 70 45 76 65 6e 74 2d    memcpy(pEvent-
0b90: 3e 7a 53 63 72 69 70 74 2c 20 7a 4d 73 67 2c 20  >zScript, zMsg, 
0ba0: 6e 4d 73 67 2b 31 29 3b 0a 20 20 70 45 76 65 6e  nMsg+1);.  pEven
0bb0: 74 2d 3e 69 6e 74 65 72 70 20 3d 20 70 2d 3e 69  t->interp = p->i
0bc0: 6e 74 65 72 70 3b 0a 0a 20 20 54 63 6c 5f 54 68  nterp;..  Tcl_Th
0bd0: 72 65 61 64 51 75 65 75 65 45 76 65 6e 74 28 70  readQueueEvent(p
0be0: 2d 3e 70 61 72 65 6e 74 2c 20 28 54 63 6c 5f 45  ->parent, (Tcl_E
0bf0: 76 65 6e 74 20 2a 29 70 45 76 65 6e 74 2c 20 54  vent *)pEvent, T
0c00: 43 4c 5f 51 55 45 55 45 5f 54 41 49 4c 29 3b 0a  CL_QUEUE_TAIL);.
0c10: 20 20 54 63 6c 5f 54 68 72 65 61 64 41 6c 65 72    Tcl_ThreadAler
0c20: 74 28 70 2d 3e 70 61 72 65 6e 74 29 3b 0a 7d 0a  t(p->parent);.}.
0c30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  ./*.** The main 
0c40: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 72  function for thr
0c50: 65 61 64 73 20 63 72 65 61 74 65 64 20 77 69 74  eads created wit
0c60: 68 20 5b 73 71 6c 74 68 72 65 61 64 20 73 70 61  h [sqlthread spa
0c70: 77 6e 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  wn]..*/.static T
0c80: 63 6c 5f 54 68 72 65 61 64 43 72 65 61 74 65 54  cl_ThreadCreateT
0c90: 79 70 65 20 74 63 6c 53 63 72 69 70 74 54 68 72  ype tclScriptThr
0ca0: 65 61 64 28 43 6c 69 65 6e 74 44 61 74 61 20 70  ead(ClientData p
0cb0: 53 71 6c 54 68 72 65 61 64 29 7b 0a 20 20 54 63  SqlThread){.  Tc
0cc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0cd0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65  ;.  Tcl_Obj *pRe
0ce0: 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4c  s;.  Tcl_Obj *pL
0cf0: 69 73 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ist;.  int rc;. 
0d00: 20 53 71 6c 54 68 72 65 61 64 20 2a 70 20 3d 20   SqlThread *p = 
0d10: 28 53 71 6c 54 68 72 65 61 64 20 2a 29 70 53 71  (SqlThread *)pSq
0d20: 6c 54 68 72 65 61 64 3b 0a 20 20 65 78 74 65 72  lThread;.  exter
0d30: 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
0d40: 5f 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f  _mutex_Init(Tcl_
0d50: 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 69 6e 74  Interp*);..  int
0d60: 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
0d70: 49 6e 74 65 72 70 28 29 3b 0a 20 20 54 63 6c 5f  Interp();.  Tcl_
0d80: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
0d90: 28 69 6e 74 65 72 70 2c 20 22 63 6c 6f 63 6b 5f  (interp, "clock_
0da0: 73 65 63 6f 6e 64 73 22 2c 20 63 6c 6f 63 6b 5f  seconds", clock_
0db0: 73 65 63 6f 6e 64 73 5f 70 72 6f 63 2c 20 30 2c  seconds_proc, 0,
0dc0: 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
0dd0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
0de0: 72 70 2c 20 22 73 71 6c 74 68 72 65 61 64 22 2c  rp, "sqlthread",
0df0: 20 73 71 6c 74 68 72 65 61 64 5f 70 72 6f 63 2c   sqlthread_proc,
0e00: 20 70 53 71 6c 54 68 72 65 61 64 2c 20 30 29 3b   pSqlThread, 0);
0e10: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55  .#if SQLITE_OS_U
0e20: 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 53  NIX && defined(S
0e30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
0e40: 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 20 20 54 63  OCK_NOTIFY).  Tc
0e50: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
0e60: 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
0e70: 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65  te3_blocking_ste
0e80: 70 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 73 74 65  p", blocking_ste
0e90: 70 5f 70 72 6f 63 2c 30 2c 30 29 3b 0a 20 20 54  p_proc,0,0);.  T
0ea0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
0eb0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  and(interp, .   
0ec0: 20 20 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 63     "sqlite3_bloc
0ed0: 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32 22  king_prepare_v2"
0ee0: 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61  , blocking_prepa
0ef0: 72 65 5f 76 32 5f 70 72 6f 63 2c 20 28 76 6f 69  re_v2_proc, (voi
0f00: 64 20 2a 29 31 2c 20 30 29 3b 0a 20 20 54 63 6c  d *)1, 0);.  Tcl
0f10: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
0f20: 64 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  d(interp, .     
0f30: 20 22 73 71 6c 69 74 65 33 5f 6e 6f 6e 62 6c 6f   "sqlite3_nonblo
0f40: 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32  cking_prepare_v2
0f50: 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70  ", blocking_prep
0f60: 61 72 65 5f 76 32 5f 70 72 6f 63 2c 20 30 2c 20  are_v2_proc, 0, 
0f70: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 53 71 6c  0);.#endif.  Sql
0f80: 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e  itetest1_Init(in
0f90: 74 65 72 70 29 3b 0a 20 20 53 71 6c 69 74 65 74  terp);.  Sqlitet
0fa0: 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69  est_mutex_Init(i
0fb0: 6e 74 65 72 70 29 3b 0a 20 20 53 71 6c 69 74 65  nterp);.  Sqlite
0fc0: 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
0fd0: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
0fe0: 28 69 6e 74 65 72 70 2c 20 70 2d 3e 7a 53 63 72  (interp, p->zScr
0ff0: 69 70 74 29 3b 0a 20 20 70 52 65 73 20 3d 20 54  ipt);.  pRes = T
1000: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
1010: 69 6e 74 65 72 70 29 3b 0a 20 20 70 4c 69 73 74  interp);.  pList
1020: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
1030: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
1040: 75 6e 74 28 70 4c 69 73 74 29 3b 0a 20 20 54 63  unt(pList);.  Tc
1050: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
1060: 52 65 73 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  Res);..  if( rc!
1070: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  =TCL_OK ){.    T
1080: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1090: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
10a0: 70 4c 69 73 74 2c 20 54 63 6c 5f 4e 65 77 53 74  pList, Tcl_NewSt
10b0: 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c  ringObj("error",
10c0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
10d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 4c 69 73  ent(interp, pLis
10f0: 74 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 70 6f  t, pRes);.    po
1100: 73 74 54 6f 50 61 72 65 6e 74 28 70 2c 20 70 4c  stToParent(p, pL
1110: 69 73 74 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ist);.    Tcl_De
1120: 63 72 52 65 66 43 6f 75 6e 74 28 70 4c 69 73 74  crRefCount(pList
1130: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 54  );.    pList = T
1140: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 7d  cl_NewObj();.  }
1150: 0a 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ..  Tcl_ListObjA
1160: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1170: 65 72 70 2c 20 70 4c 69 73 74 2c 20 54 63 6c 5f  erp, pList, Tcl_
1180: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
1190: 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  t", -1));.  Tcl_
11a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 4c 69  ment(interp, pLi
11c0: 73 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  st, Tcl_NewStrin
11d0: 67 4f 62 6a 28 70 2d 3e 7a 56 61 72 6e 61 6d 65  gObj(p->zVarname
11e0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
11f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1200: 6e 74 28 69 6e 74 65 72 70 2c 20 70 4c 69 73 74  nt(interp, pList
1210: 2c 20 70 52 65 73 29 3b 0a 20 20 70 6f 73 74 54  , pRes);.  postT
1220: 6f 50 61 72 65 6e 74 28 70 2c 20 70 4c 69 73 74  oParent(p, pList
1230: 29 3b 0a 0a 20 20 63 6b 66 72 65 65 28 28 76 6f  );..  ckfree((vo
1240: 69 64 20 2a 29 70 29 3b 0a 20 20 54 63 6c 5f 44  id *)p);.  Tcl_D
1250: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4c 69 73  ecrRefCount(pLis
1260: 74 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  t);.  Tcl_DecrRe
1270: 66 43 6f 75 6e 74 28 70 52 65 73 29 3b 0a 20 20  fCount(pRes);.  
1280: 54 63 6c 5f 44 65 6c 65 74 65 49 6e 74 65 72 70  Tcl_DeleteInterp
1290: 28 69 6e 74 65 72 70 29 3b 0a 20 20 77 68 69 6c  (interp);.  whil
12a0: 65 28 20 54 63 6c 5f 44 6f 4f 6e 65 45 76 65 6e  e( Tcl_DoOneEven
12b0: 74 28 54 43 4c 5f 41 4c 4c 5f 45 56 45 4e 54 53  t(TCL_ALL_EVENTS
12c0: 7c 54 43 4c 5f 44 4f 4e 54 5f 57 41 49 54 29 20  |TCL_DONT_WAIT) 
12d0: 29 3b 0a 20 20 54 63 6c 5f 45 78 69 74 54 68 72  );.  Tcl_ExitThr
12e0: 65 61 64 28 30 29 3b 0a 20 20 54 43 4c 5f 54 48  ead(0);.  TCL_TH
12f0: 52 45 41 44 5f 43 52 45 41 54 45 5f 52 45 54 55  READ_CREATE_RETU
1300: 52 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  RN;.}../*.** sql
1310: 74 68 72 65 61 64 20 73 70 61 77 6e 20 56 41 52  thread spawn VAR
1320: 4e 41 4d 45 20 53 43 52 49 50 54 0a 2a 2a 0a 2a  NAME SCRIPT.**.*
1330: 2a 20 20 20 20 20 53 70 61 77 6e 20 61 20 6e 65  *     Spawn a ne
1340: 77 20 74 68 72 65 61 64 20 77 69 74 68 20 69 74  w thread with it
1350: 73 20 6f 77 6e 20 54 63 6c 20 69 6e 74 65 72 70  s own Tcl interp
1360: 72 65 74 65 72 20 61 6e 64 20 72 75 6e 20 74 68  reter and run th
1370: 65 0a 2a 2a 20 20 20 20 20 73 70 65 63 69 66 69  e.**     specifi
1380: 65 64 20 53 43 52 49 50 54 28 73 29 20 69 6e 20  ed SCRIPT(s) in 
1390: 69 74 2e 20 54 68 65 20 74 68 72 65 61 64 20 74  it. The thread t
13a0: 65 72 6d 69 6e 61 74 65 73 20 61 66 74 65 72 20  erminates after 
13b0: 72 75 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 74  running.**     t
13c0: 68 65 20 73 63 72 69 70 74 2e 20 54 68 65 20 72  he script. The r
13d0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 73 63 72  esult of the scr
13e0: 69 70 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ipt is stored in
13f0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a   the variable.**
1400: 20 20 20 20 20 56 41 52 4e 41 4d 45 2e 0a 2a 2a       VARNAME..**
1410: 0a 2a 2a 20 20 20 20 20 54 68 65 20 63 61 6c 6c  .**     The call
1420: 65 72 20 63 61 6e 20 77 61 69 74 20 66 6f 72 20  er can wait for 
1430: 74 68 65 20 73 63 72 69 70 74 20 74 6f 20 74 65  the script to te
1440: 72 6d 69 6e 61 74 65 20 75 73 69 6e 67 20 5b 76  rminate using [v
1450: 77 61 69 74 20 56 41 52 4e 41 4d 45 5d 2e 0a 2a  wait VARNAME]..*
1460: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
1470: 74 68 72 65 61 64 5f 73 70 61 77 6e 28 0a 20 20  thread_spawn(.  
1480: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
1490: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
14a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
14b0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
14c0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
14d0: 0a 29 7b 0a 20 20 54 63 6c 5f 54 68 72 65 61 64  .){.  Tcl_Thread
14e0: 49 64 20 78 3b 0a 20 20 53 71 6c 54 68 72 65 61  Id x;.  SqlThrea
14f0: 64 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  d *pNew;.  int r
1500: 63 3b 0a 0a 20 20 69 6e 74 20 6e 56 61 72 6e 61  c;..  int nVarna
1510: 6d 65 3b 20 63 68 61 72 20 2a 7a 56 61 72 6e 61  me; char *zVarna
1520: 6d 65 3b 0a 20 20 69 6e 74 20 6e 53 63 72 69 70  me;.  int nScrip
1530: 74 3b 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74  t; char *zScript
1540: 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65  ;..  /* Paramete
1550: 72 73 20 66 6f 72 20 74 68 72 65 61 64 20 63 72  rs for thread cr
1560: 65 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  eation */.  cons
1570: 74 20 69 6e 74 20 6e 53 74 61 63 6b 20 3d 20 54  t int nStack = T
1580: 43 4c 5f 54 48 52 45 41 44 5f 53 54 41 43 4b 5f  CL_THREAD_STACK_
1590: 44 45 46 41 55 4c 54 3b 0a 20 20 63 6f 6e 73 74  DEFAULT;.  const
15a0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c   int flags = TCL
15b0: 5f 54 48 52 45 41 44 5f 4e 4f 46 4c 41 47 53 3b  _THREAD_NOFLAGS;
15c0: 0a 0a 20 20 61 73 73 65 72 74 28 6f 62 6a 63 3d  ..  assert(objc=
15d0: 3d 34 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  =4);.  UNUSED_PA
15e0: 52 41 4d 45 54 45 52 28 63 6c 69 65 6e 74 44 61  RAMETER(clientDa
15f0: 74 61 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ta);.  UNUSED_PA
1600: 52 41 4d 45 54 45 52 28 6f 62 6a 63 29 3b 0a 0a  RAMETER(objc);..
1610: 20 20 7a 56 61 72 6e 61 6d 65 20 3d 20 54 63 6c    zVarname = Tcl
1620: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
1630: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 56 61 72  j(objv[2], &nVar
1640: 6e 61 6d 65 29 3b 0a 20 20 7a 53 63 72 69 70 74  name);.  zScript
1650: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1660: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
1670: 20 26 6e 53 63 72 69 70 74 29 3b 0a 0a 20 20 70   &nScript);..  p
1680: 4e 65 77 20 3d 20 28 53 71 6c 54 68 72 65 61 64  New = (SqlThread
1690: 20 2a 29 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f   *)ckalloc(sizeo
16a0: 66 28 53 71 6c 54 68 72 65 61 64 29 2b 6e 56 61  f(SqlThread)+nVa
16b0: 72 6e 61 6d 65 2b 6e 53 63 72 69 70 74 2b 32 29  rname+nScript+2)
16c0: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 56 61 72 6e 61  ;.  pNew->zVarna
16d0: 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e  me = (char *)&pN
16e0: 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d 3e 7a  ew[1];.  pNew->z
16f0: 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 20 2a  Script = (char *
1700: 29 26 70 4e 65 77 2d 3e 7a 56 61 72 6e 61 6d 65  )&pNew->zVarname
1710: 5b 6e 56 61 72 6e 61 6d 65 2b 31 5d 3b 0a 20 20  [nVarname+1];.  
1720: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 56 61  memcpy(pNew->zVa
1730: 72 6e 61 6d 65 2c 20 7a 56 61 72 6e 61 6d 65 2c  rname, zVarname,
1740: 20 6e 56 61 72 6e 61 6d 65 2b 31 29 3b 0a 20 20   nVarname+1);.  
1750: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 53 63  memcpy(pNew->zSc
1760: 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e  ript, zScript, n
1770: 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 70 4e 65  Script+1);.  pNe
1780: 77 2d 3e 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f  w->parent = Tcl_
1790: 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61 64  GetCurrentThread
17a0: 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65  ();.  pNew->inte
17b0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20  rp = interp;..  
17c0: 72 63 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54  rc = Tcl_CreateT
17d0: 68 72 65 61 64 28 26 78 2c 20 74 63 6c 53 63 72  hread(&x, tclScr
17e0: 69 70 74 54 68 72 65 61 64 2c 20 28 76 6f 69 64  iptThread, (void
17f0: 20 2a 29 70 4e 65 77 2c 20 6e 53 74 61 63 6b 2c   *)pNew, nStack,
1800: 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
1810: 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c!=TCL_OK ){.   
1820: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1830: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
1840: 20 69 6e 20 54 63 6c 5f 43 72 65 61 74 65 54 68   in Tcl_CreateTh
1850: 72 65 61 64 28 29 22 2c 20 30 29 3b 0a 20 20 20  read()", 0);.   
1860: 20 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29   ckfree((char *)
1870: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
1880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1890: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
18a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 74  K;.}../*.** sqlt
18b0: 68 72 65 61 64 20 70 61 72 65 6e 74 20 53 43 52  hread parent SCR
18c0: 49 50 54 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  IPT.**.**     Th
18d0: 69 73 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  is can be called
18e0: 20 62 79 20 73 70 61 77 6e 65 64 20 74 68 72 65   by spawned thre
18f0: 61 64 73 20 6f 6e 6c 79 2e 20 49 74 20 73 65 6e  ads only. It sen
1900: 64 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ds the specified
1910: 0a 2a 2a 20 20 20 20 20 73 63 72 69 70 74 20 62  .**     script b
1920: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
1930: 74 20 74 68 72 65 61 64 20 66 6f 72 20 65 78 65  t thread for exe
1940: 63 75 74 69 6f 6e 2e 20 54 68 65 20 72 65 73 75  cution. The resu
1950: 6c 74 20 6f 66 0a 2a 2a 20 20 20 20 20 65 76 61  lt of.**     eva
1960: 6c 75 61 74 69 6e 67 20 74 68 65 20 53 43 52 49  luating the SCRI
1970: 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  PT is returned. 
1980: 54 68 65 20 70 61 72 65 6e 74 20 74 68 72 65 61  The parent threa
1990: 64 20 6d 75 73 74 20 65 6e 74 65 72 0a 2a 2a 20  d must enter.** 
19a0: 20 20 20 20 74 68 65 20 65 76 65 6e 74 20 6c 6f      the event lo
19b0: 6f 70 20 66 6f 72 20 74 68 69 73 20 74 6f 20 77  op for this to w
19c0: 6f 72 6b 20 2d 20 6f 74 68 65 72 77 69 73 65 20  ork - otherwise 
19d0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 0a  the caller will.
19e0: 2a 2a 20 20 20 20 20 62 6c 6f 63 6b 20 69 6e 64  **     block ind
19f0: 65 66 69 6e 69 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  efinitely..**.**
1a00: 20 20 20 20 20 4e 4f 54 45 3a 20 41 74 20 74 68       NOTE: At th
1a10: 65 20 6d 6f 6d 65 6e 74 2c 20 74 68 69 73 20 64  e moment, this d
1a20: 6f 65 73 6e 27 74 20 77 6f 72 6b 2e 20 46 49 58  oesn't work. FIX
1a30: 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ME..*/.static in
1a40: 74 20 73 71 6c 74 68 72 65 61 64 5f 70 61 72 65  t sqlthread_pare
1a50: 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  nt(.  ClientData
1a60: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1a70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a80: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1a90: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1aa0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 45 76 61 6c  objv[].){.  Eval
1ab0: 45 76 65 6e 74 20 2a 70 45 76 65 6e 74 3b 0a 20  Event *pEvent;. 
1ac0: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69   char *zMsg;.  i
1ad0: 6e 74 20 6e 4d 73 67 3b 0a 20 20 53 71 6c 54 68  nt nMsg;.  SqlTh
1ae0: 72 65 61 64 20 2a 70 20 3d 20 28 53 71 6c 54 68  read *p = (SqlTh
1af0: 72 65 61 64 20 2a 29 63 6c 69 65 6e 74 44 61 74  read *)clientDat
1b00: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 6f 62 6a  a;..  assert(obj
1b10: 63 3d 3d 33 29 3b 0a 20 20 55 4e 55 53 45 44 5f  c==3);.  UNUSED_
1b20: 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 63 29 3b  PARAMETER(objc);
1b30: 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ..  if( p==0 ){.
1b40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
1b60: 20 70 61 72 65 6e 74 20 74 68 72 65 61 64 22 2c   parent thread",
1b70: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1b80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1b90: 20 20 7a 4d 73 67 20 3d 20 54 63 6c 5f 47 65 74    zMsg = Tcl_Get
1ba0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1bb0: 6a 76 5b 32 5d 2c 20 26 6e 4d 73 67 29 3b 0a 20  jv[2], &nMsg);. 
1bc0: 20 70 45 76 65 6e 74 20 3d 20 28 45 76 61 6c 45   pEvent = (EvalE
1bd0: 76 65 6e 74 20 2a 29 63 6b 61 6c 6c 6f 63 28 73  vent *)ckalloc(s
1be0: 69 7a 65 6f 66 28 45 76 61 6c 45 76 65 6e 74 29  izeof(EvalEvent)
1bf0: 2b 6e 4d 73 67 2b 31 29 3b 0a 20 20 70 45 76 65  +nMsg+1);.  pEve
1c00: 6e 74 2d 3e 62 61 73 65 2e 6e 65 78 74 50 74 72  nt->base.nextPtr
1c10: 20 3d 20 30 3b 0a 20 20 70 45 76 65 6e 74 2d 3e   = 0;.  pEvent->
1c20: 62 61 73 65 2e 70 72 6f 63 20 3d 20 74 63 6c 53  base.proc = tclS
1c30: 63 72 69 70 74 45 76 65 6e 74 3b 0a 20 20 70 45  criptEvent;.  pE
1c40: 76 65 6e 74 2d 3e 7a 53 63 72 69 70 74 20 3d 20  vent->zScript = 
1c50: 28 63 68 61 72 20 2a 29 26 70 45 76 65 6e 74 5b  (char *)&pEvent[
1c60: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 45 76  1];.  memcpy(pEv
1c70: 65 6e 74 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 4d  ent->zScript, zM
1c80: 73 67 2c 20 6e 4d 73 67 2b 31 29 3b 0a 20 20 70  sg, nMsg+1);.  p
1c90: 45 76 65 6e 74 2d 3e 69 6e 74 65 72 70 20 3d 20  Event->interp = 
1ca0: 70 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p->interp;.  Tcl
1cb0: 5f 54 68 72 65 61 64 51 75 65 75 65 45 76 65 6e  _ThreadQueueEven
1cc0: 74 28 70 2d 3e 70 61 72 65 6e 74 2c 20 28 54 63  t(p->parent, (Tc
1cd0: 6c 5f 45 76 65 6e 74 20 2a 29 70 45 76 65 6e 74  l_Event *)pEvent
1ce0: 2c 20 54 43 4c 5f 51 55 45 55 45 5f 54 41 49 4c  , TCL_QUEUE_TAIL
1cf0: 29 3b 0a 20 20 54 63 6c 5f 54 68 72 65 61 64 41  );.  Tcl_ThreadA
1d00: 6c 65 72 74 28 70 2d 3e 70 61 72 65 6e 74 29 3b  lert(p->parent);
1d10: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1d20: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
1d30: 20 78 42 75 73 79 28 76 6f 69 64 20 2a 70 41 72   xBusy(void *pAr
1d40: 67 2c 20 69 6e 74 20 6e 42 75 73 79 29 7b 0a 20  g, int nBusy){. 
1d50: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d60: 52 28 70 41 72 67 29 3b 0a 20 20 55 4e 55 53 45  R(pArg);.  UNUSE
1d70: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 42 75 73  D_PARAMETER(nBus
1d80: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6c  y);.  sqlite3_sl
1d90: 65 65 70 28 35 30 29 3b 0a 20 20 72 65 74 75 72  eep(50);.  retur
1da0: 6e 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 1;            
1db0: 20 2f 2a 20 54 72 79 20 61 67 61 69 6e 2e 2e 2e   /* Try again...
1dc0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c   */.}../*.** sql
1dd0: 74 68 72 65 61 64 20 6f 70 65 6e 0a 2a 2a 0a 2a  thread open.**.*
1de0: 2a 20 20 20 20 20 4f 70 65 6e 20 61 20 64 61 74  *     Open a dat
1df0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61 6e 64  abase handle and
1e00: 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   return the stri
1e10: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
1e20: 6e 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20  n of.**     the 
1e30: 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 2e 0a 2a  pointer value..*
1e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
1e50: 74 68 72 65 61 64 5f 6f 70 65 6e 28 0a 20 20 43  thread_open(.  C
1e60: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1e70: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1e80: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1e90: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1ea0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1eb0: 29 7b 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  ){.  int sqlite3
1ec0: 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1ed0: 74 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  tr(Tcl_Interp *i
1ee0: 6e 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50 74  nterp, char *zPt
1ef0: 72 2c 20 76 6f 69 64 20 2a 70 29 3b 0a 0a 20 20  r, void *p);..  
1f00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1f10: 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
1f20: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
1f30: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1f40: 3b 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20  ;.  extern void 
1f50: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
1f60: 69 74 65 33 2a 29 3b 0a 0a 20 20 55 4e 55 53 45  ite3*);..  UNUSE
1f70: 44 5f 50 41 52 41 4d 45 54 45 52 28 63 6c 69 65  D_PARAMETER(clie
1f80: 6e 74 44 61 74 61 29 3b 0a 20 20 55 4e 55 53 45  ntData);.  UNUSE
1f90: 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 63  D_PARAMETER(objc
1fa0: 29 3b 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20  );..  zFilename 
1fb0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1fc0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 72 63 20 3d  objv[2]);.  rc =
1fd0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
1fe0: 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
1ff0: 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 64 62   Md5_Register(db
2000: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 75 73  );.  sqlite3_bus
2010: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 78 42  y_handler(db, xB
2020: 75 73 79 2c 20 30 29 3b 0a 20 20 0a 20 20 69 66  usy, 0);.  .  if
2030: 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
2040: 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
2050: 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
2060: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2070: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
2080: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
2090: 66 2c 20 30 29 3b 0a 0a 20 20 72 65 74 75 72 6e  f, 0);..  return
20a0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
20b0: 2a 2a 20 73 71 6c 74 68 72 65 61 64 20 6f 70 65  ** sqlthread ope
20c0: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 74 75  n.**.**     Retu
20d0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
20e0: 68 72 65 61 64 2d 69 64 20 28 54 63 6c 5f 47 65  hread-id (Tcl_Ge
20f0: 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 28 29  tCurrentThread()
2100: 29 20 63 61 73 74 20 74 6f 0a 2a 2a 20 20 20 20  ) cast to.**    
2110: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
2120: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 74 68  static int sqlth
2130: 72 65 61 64 5f 69 64 28 0a 20 20 43 6c 69 65 6e  read_id(.  Clien
2140: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2150: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2160: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2170: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2180: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2190: 20 54 63 6c 5f 54 68 72 65 61 64 49 64 20 69 64   Tcl_ThreadId id
21a0: 20 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e   = Tcl_GetCurren
21b0: 74 54 68 72 65 61 64 28 29 3b 0a 20 20 54 63 6c  tThread();.  Tcl
21c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
21d0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
21e0: 4f 62 6a 28 53 51 4c 49 54 45 5f 50 54 52 5f 54  Obj(SQLITE_PTR_T
21f0: 4f 5f 49 4e 54 28 69 64 29 29 29 3b 0a 20 20 55  O_INT(id)));.  U
2200: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2210: 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20 20 55  clientData);.  U
2220: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2230: 6f 62 6a 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  objc);.  UNUSED_
2240: 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 76 29 3b  PARAMETER(objv);
2250: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2260: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  ;.}.../*.** Disp
2270: 61 74 63 68 20 72 6f 75 74 69 6e 65 20 66 6f 72  atch routine for
2280: 20 74 68 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64   the sub-command
2290: 73 20 6f 66 20 5b 73 71 6c 74 68 72 65 61 64 5d  s of [sqlthread]
22a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22b0: 73 71 6c 74 68 72 65 61 64 5f 70 72 6f 63 28 0a  sqlthread_proc(.
22c0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
22d0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
22e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
22f0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2300: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2310: 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  [].){.  struct S
2320: 75 62 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 20 20  ubCommand {.    
2330: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
2340: 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20   Tcl_ObjCmdProc 
2350: 2a 78 50 72 6f 63 3b 0a 20 20 20 20 69 6e 74 20  *xProc;.    int 
2360: 6e 41 72 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nArg;.    char *
2370: 7a 55 73 61 67 65 3b 0a 20 20 7d 20 61 53 75 62  zUsage;.  } aSub
2380: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 70 61 72  [] = {.    {"par
2390: 65 6e 74 22 2c 20 73 71 6c 74 68 72 65 61 64 5f  ent", sqlthread_
23a0: 70 61 72 65 6e 74 2c 20 31 2c 20 22 53 43 52 49  parent, 1, "SCRI
23b0: 50 54 22 7d 2c 0a 20 20 20 20 7b 22 73 70 61 77  PT"},.    {"spaw
23c0: 6e 22 2c 20 20 73 71 6c 74 68 72 65 61 64 5f 73  n",  sqlthread_s
23d0: 70 61 77 6e 2c 20 20 32 2c 20 22 56 41 52 4e 41  pawn,  2, "VARNA
23e0: 4d 45 20 53 43 52 49 50 54 22 7d 2c 0a 20 20 20  ME SCRIPT"},.   
23f0: 20 7b 22 6f 70 65 6e 22 2c 20 20 20 73 71 6c 74   {"open",   sqlt
2400: 68 72 65 61 64 5f 6f 70 65 6e 2c 20 20 20 31 2c  hread_open,   1,
2410: 20 22 44 42 4e 41 4d 45 22 7d 2c 0a 20 20 20 20   "DBNAME"},.    
2420: 7b 22 69 64 22 2c 20 20 20 20 20 73 71 6c 74 68  {"id",     sqlth
2430: 72 65 61 64 5f 69 64 2c 20 20 20 20 20 30 2c 20  read_id,     0, 
2440: 22 22 7d 2c 0a 20 20 20 20 7b 30 2c 20 30 2c 20  ""},.    {0, 0, 
2450: 30 7d 0a 20 20 7d 3b 0a 20 20 73 74 72 75 63 74  0}.  };.  struct
2460: 20 53 75 62 43 6f 6d 6d 61 6e 64 20 2a 70 53 75   SubCommand *pSu
2470: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
2480: 6e 74 20 69 49 6e 64 65 78 3b 0a 0a 20 20 69 66  nt iIndex;..  if
2490: 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20  ( objc<2 ){.    
24a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
24b0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
24c0: 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 22 29  , "SUB-COMMAND")
24d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
24e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
24f0: 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  c = Tcl_GetIndex
2500: 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 0a 20  FromObjStruct(. 
2510: 20 20 20 20 20 69 6e 74 65 72 70 2c 20 6f 62 6a       interp, obj
2520: 76 5b 31 5d 2c 20 61 53 75 62 2c 20 73 69 7a 65  v[1], aSub, size
2530: 6f 66 28 61 53 75 62 5b 30 5d 29 2c 20 22 73 75  of(aSub[0]), "su
2540: 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26  b-command", 0, &
2550: 69 49 6e 64 65 78 0a 20 20 29 3b 0a 20 20 69 66  iIndex.  );.  if
2560: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
2570: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 53 75 62  eturn rc;.  pSub
2580: 20 3d 20 26 61 53 75 62 5b 69 49 6e 64 65 78 5d   = &aSub[iIndex]
2590: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 28  ;..  if( objc!=(
25a0: 70 53 75 62 2d 3e 6e 41 72 67 2b 32 29 20 29 7b  pSub->nArg+2) ){
25b0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
25c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
25d0: 20 6f 62 6a 76 2c 20 70 53 75 62 2d 3e 7a 55 73   objv, pSub->zUs
25e0: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
25f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2600: 0a 20 20 72 65 74 75 72 6e 20 70 53 75 62 2d 3e  .  return pSub->
2610: 78 50 72 6f 63 28 63 6c 69 65 6e 74 44 61 74 61  xProc(clientData
2620: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  , interp, objc, 
2630: 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  objv);.}../*.** 
2640: 54 68 65 20 5b 63 6c 6f 63 6b 5f 73 65 63 6f 6e  The [clock_secon
2650: 64 73 5d 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69  ds] command. Thi
2660: 73 20 69 73 20 6d 6f 72 65 20 6f 72 20 6c 65 73  s is more or les
2670: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2680: 65 0a 2a 2a 20 72 65 67 75 6c 61 72 20 74 63 6c  e.** regular tcl
2690: 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
26a0: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
26b0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
26c0: 20 74 65 73 74 66 69 78 74 75 72 65 0a 2a 2a 20   testfixture.** 
26d0: 77 68 65 6e 20 6c 69 6e 6b 65 64 20 61 67 61 69  when linked agai
26e0: 6e 73 74 20 62 6f 74 68 20 54 63 6c 20 38 2e 34  nst both Tcl 8.4
26f0: 20 61 6e 64 20 38 2e 35 2e 20 42 65 63 61 75 73   and 8.5. Becaus
2700: 65 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  e [clock seconds
2710: 5d 20 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ] is.** implemen
2720: 74 65 64 20 61 73 20 61 20 73 63 72 69 70 74 20  ted as a script 
2730: 69 6e 20 54 63 6c 20 38 2e 35 2c 20 69 74 20 69  in Tcl 8.5, it i
2740: 73 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 61 76  s not usually av
2750: 61 69 6c 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 65  ailable to.** te
2760: 73 74 66 69 78 74 75 72 65 2e 0a 2a 2f 20 0a 73  stfixture..*/ .s
2770: 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 63 6b 5f  tatic int clock_
2780: 73 65 63 6f 6e 64 73 5f 70 72 6f 63 28 0a 20 20  seconds_proc(.  
2790: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
27a0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
27b0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
27c0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
27d0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
27e0: 0a 29 7b 0a 20 20 54 63 6c 5f 54 69 6d 65 20 6e  .){.  Tcl_Time n
27f0: 6f 77 3b 0a 20 20 54 63 6c 5f 47 65 74 54 69 6d  ow;.  Tcl_GetTim
2800: 65 28 26 6e 6f 77 29 3b 0a 20 20 54 63 6c 5f 53  e(&now);.  Tcl_S
2810: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2820: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
2830: 6a 28 6e 6f 77 2e 73 65 63 29 29 3b 0a 20 20 55  j(now.sec));.  U
2840: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2850: 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20 20 55  clientData);.  U
2860: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2870: 6f 62 6a 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  objc);.  UNUSED_
2880: 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 76 29 3b  PARAMETER(objv);
2890: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
28a0: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
28f0: 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f  ** This block co
2900: 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
2910: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
2920: 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69   [sqlite3_blocki
2930: 6e 67 5f 73 74 65 70 5d 0a 2a 2a 20 63 6f 6d 6d  ng_step].** comm
2940: 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  and available to
2950: 20 74 68 72 65 61 64 73 20 63 72 65 61 74 65 64   threads created
2960: 20 62 79 20 5b 73 71 6c 74 68 72 65 61 64 20 73   by [sqlthread s
2970: 70 61 77 6e 5d 20 63 6f 6d 6d 61 6e 64 73 2e 20  pawn] commands. 
2980: 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76  It.** is only av
2990: 61 69 6c 61 62 6c 65 20 6f 6e 20 55 4e 49 58 20  ailable on UNIX 
29a0: 66 6f 72 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  for now. This is
29b0: 20 62 65 63 61 75 73 65 20 70 74 68 72 65 61 64   because pthread
29c0: 20 63 6f 6e 64 69 74 69 6f 6e 0a 2a 2a 20 76 61   condition.** va
29d0: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
29e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 75 72  ..**.** The sour
29f0: 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
2a00: 43 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69  C functions sqli
2a10: 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65  te3_blocking_ste
2a20: 70 28 29 2c 0a 2a 2a 20 62 6c 6f 63 6b 69 6e 67  p(),.** blocking
2a30: 5f 73 74 65 70 5f 6e 6f 74 69 66 79 28 29 20 61  _step_notify() a
2a40: 6e 64 20 74 68 65 20 73 74 72 75 63 74 75 72 65  nd the structure
2a50: 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61 74   UnlockNotificat
2a60: 69 6f 6e 20 69 73 0a 2a 2a 20 61 75 74 6f 6d 61  ion is.** automa
2a70: 74 69 63 61 6c 6c 79 20 65 78 74 72 61 63 74 65  tically extracte
2a80: 64 20 66 72 6f 6d 20 74 68 69 73 20 66 69 6c 65  d from this file
2a90: 20 61 6e 64 20 75 73 65 64 20 61 73 20 70 61 72   and used as par
2aa0: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 64 6f 63 75  t of the.** docu
2ab0: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68  mentation for th
2ac0: 65 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  e sqlite3_unlock
2ad0: 5f 6e 6f 74 69 66 79 28 29 20 41 50 49 20 66 75  _notify() API fu
2ae0: 6e 63 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20  nction. This.** 
2af0: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64  should be consid
2b00: 65 72 65 64 20 69 66 20 74 68 65 73 65 20 66 75  ered if these fu
2b10: 6e 63 74 69 6f 6e 73 20 61 72 65 20 74 6f 20 62  nctions are to b
2b20: 65 20 65 78 74 65 6e 64 65 64 20 28 69 2e 65 2e  e extended (i.e.
2b30: 20 74 6f 20 0a 2a 2a 20 73 75 70 70 6f 72 74 20   to .** support 
2b40: 77 69 6e 64 6f 77 73 29 20 69 6e 20 74 68 65 20  windows) in the 
2b50: 66 75 74 75 72 65 2e 0a 2a 2f 20 0a 23 69 66 20  future..*/ .#if 
2b60: 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26  SQLITE_OS_UNIX &
2b70: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2b80: 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
2b90: 4f 54 49 46 59 29 0a 0a 2f 2a 20 42 45 47 49 4e  OTIFY)../* BEGIN
2ba0: 5f 53 51 4c 49 54 45 5f 42 4c 4f 43 4b 49 4e 47  _SQLITE_BLOCKING
2bb0: 5f 53 54 45 50 20 2a 2f 0a 2f 2a 20 54 68 69 73  _STEP */./* This
2bc0: 20 65 78 61 6d 70 6c 65 20 75 73 65 73 20 74 68   example uses th
2bd0: 65 20 70 74 68 72 65 61 64 73 20 41 50 49 20 2a  e pthreads API *
2be0: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68 72  /.#include <pthr
2bf0: 65 61 64 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20  ead.h>../*.** A 
2c00: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
2c10: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
2c20: 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73  tructure is pass
2c30: 65 64 20 61 73 20 74 68 65 20 75 73 65 72 2d 63  ed as the user-c
2c40: 6f 6e 74 65 78 74 0a 2a 2a 20 70 6f 69 6e 74 65  ontext.** pointe
2c50: 72 20 77 68 65 6e 20 72 65 67 69 73 74 65 72 69  r when registeri
2c60: 6e 67 20 66 6f 72 20 61 6e 20 75 6e 6c 6f 63 6b  ng for an unlock
2c70: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
2c80: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2c90: 75 63 74 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69  uct UnlockNotifi
2ca0: 63 61 74 69 6f 6e 20 55 6e 6c 6f 63 6b 4e 6f 74  cation UnlockNot
2cb0: 69 66 69 63 61 74 69 6f 6e 3b 0a 73 74 72 75 63  ification;.struc
2cc0: 74 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61  t UnlockNotifica
2cd0: 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 66 69 72  tion {.  int fir
2ce0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d00: 72 75 65 20 61 66 74 65 72 20 75 6e 6c 6f 63 6b  rue after unlock
2d10: 20 65 76 65 6e 74 20 68 61 73 20 6f 63 63 75 72   event has occur
2d20: 72 65 64 20 2a 2f 0a 20 20 70 74 68 72 65 61 64  red */.  pthread
2d30: 5f 63 6f 6e 64 5f 74 20 63 6f 6e 64 3b 20 20 20  _cond_t cond;   
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2d50: 6f 6e 64 69 74 69 6f 6e 20 76 61 72 69 61 62 6c  ondition variabl
2d60: 65 20 74 6f 20 77 61 69 74 20 6f 6e 20 2a 2f 0a  e to wait on */.
2d70: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
2d80: 74 20 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20  t mutex;        
2d90: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
2da0: 20 70 72 6f 74 65 63 74 20 73 74 72 75 63 74 75   protect structu
2db0: 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  re */.};../*.** 
2dc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2dd0: 20 61 6e 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66   an unlock-notif
2de0: 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  y callback regis
2df0: 74 65 72 65 64 20 77 69 74 68 20 53 51 4c 69 74  tered with SQLit
2e00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2e10: 64 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  d unlock_notify_
2e20: 63 62 28 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c  cb(void **apArg,
2e30: 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e   int nArg){.  in
2e40: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
2e50: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
2e60: 20 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61    UnlockNotifica
2e70: 74 69 6f 6e 20 2a 70 20 3d 20 28 55 6e 6c 6f 63  tion *p = (Unloc
2e80: 6b 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20 2a 29  kNotification *)
2e90: 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20 20 70 74  apArg[i];.    pt
2ea0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
2eb0: 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (&p->mutex);.   
2ec0: 20 70 2d 3e 66 69 72 65 64 20 3d 20 31 3b 0a 20   p->fired = 1;. 
2ed0: 20 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f     pthread_cond_
2ee0: 73 69 67 6e 61 6c 28 26 70 2d 3e 63 6f 6e 64 29  signal(&p->cond)
2ef0: 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  ;.    pthread_mu
2f00: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e 6d  tex_unlock(&p->m
2f10: 75 74 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  utex);.  }.}../*
2f20: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f30: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
2f40: 6e 20 53 51 4c 69 74 65 20 41 50 49 20 63 61 6c  n SQLite API cal
2f50: 6c 20 28 65 69 74 68 65 72 20 73 71 6c 69 74 65  l (either sqlite
2f60: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 0a  3_prepare_v2() .
2f70: 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 73 74  ** or sqlite3_st
2f80: 65 70 28 29 29 20 68 61 73 20 6a 75 73 74 20 72  ep()) has just r
2f90: 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4c  eturned SQLITE_L
2fa0: 4f 43 4b 45 44 2e 20 54 68 65 20 61 72 67 75 6d  OCKED. The argum
2fb0: 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 61 73  ent is the.** as
2fc0: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
2fd0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
2fe0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2ff0: 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
3000: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20  unlock_notify() 
3010: 74 6f 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  to register for 
3020: 61 6e 20 0a 2a 2a 20 75 6e 6c 6f 63 6b 2d 6e 6f  an .** unlock-no
3030: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 2c 20 74  tify callback, t
3040: 68 65 6e 20 62 6c 6f 63 6b 73 20 75 6e 74 69 6c  hen blocks until
3050: 20 74 68 61 74 20 63 61 6c 6c 62 61 63 6b 20 69   that callback i
3060: 73 20 64 65 6c 69 76 65 72 65 64 20 0a 2a 2a 20  s delivered .** 
3070: 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  and returns SQLI
3080: 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
3090: 72 20 73 68 6f 75 6c 64 20 74 68 65 6e 20 72 65  r should then re
30a0: 74 72 79 20 74 68 65 20 66 61 69 6c 65 64 20 6f  try the failed o
30b0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
30c0: 4f 72 2c 20 69 66 20 73 71 6c 69 74 65 33 5f 75  Or, if sqlite3_u
30d0: 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20 69  nlock_notify() i
30e0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 6f  ndicates that to
30f0: 20 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 64 65 61   block would dea
3100: 64 6c 6f 63 6b 20 0a 2a 2a 20 74 68 65 20 73 79  dlock .** the sy
3110: 73 74 65 6d 2c 20 74 68 65 6e 20 74 68 69 73 20  stem, then this 
3120: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
3130: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
3140: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 0a  mmediately. In .
3150: 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
3160: 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
3170: 6f 74 20 72 65 74 72 79 20 74 68 65 20 6f 70 65  ot retry the ope
3180: 72 61 74 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c  ration and shoul
3190: 64 20 72 6f 6c 6c 20 0a 2a 2a 20 62 61 63 6b 20  d roll .** back 
31a0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
31b0: 73 61 63 74 69 6f 6e 20 28 69 66 20 61 6e 79 29  saction (if any)
31c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31d0: 77 61 69 74 5f 66 6f 72 5f 75 6e 6c 6f 63 6b 5f  wait_for_unlock_
31e0: 6e 6f 74 69 66 79 28 73 71 6c 69 74 65 33 20 2a  notify(sqlite3 *
31f0: 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  db){.  int rc;. 
3200: 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61 74   UnlockNotificat
3210: 69 6f 6e 20 75 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  ion un;..  /* In
3220: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 55 6e 6c  itialize the Unl
3230: 6f 63 6b 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20  ockNotification 
3240: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
3250: 75 6e 2e 66 69 72 65 64 20 3d 20 30 3b 0a 20 20  un.fired = 0;.  
3260: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
3270: 69 74 28 26 75 6e 2e 6d 75 74 65 78 2c 20 30 29  it(&un.mutex, 0)
3280: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64  ;.  pthread_cond
3290: 5f 69 6e 69 74 28 26 75 6e 2e 63 6f 6e 64 2c 20  _init(&un.cond, 
32a0: 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74  0);..  /* Regist
32b0: 65 72 20 66 6f 72 20 61 6e 20 75 6e 6c 6f 63 6b  er for an unlock
32c0: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
32d0: 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
32e0: 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
32f0: 79 28 64 62 2c 20 75 6e 6c 6f 63 6b 5f 6e 6f 74  y(db, unlock_not
3300: 69 66 79 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29  ify_cb, (void *)
3310: 26 75 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  &un);.  assert( 
3320: 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
3330: 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  D || rc==SQLITE_
3340: 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  OK );..  /* The 
3350: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
3360: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20  unlock_notify() 
3370: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 65  always returns e
3380: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ither SQLITE_LOC
3390: 4b 45 44 20 0a 20 20 2a 2a 20 6f 72 20 53 51 4c  KED .  ** or SQL
33a0: 49 54 45 5f 4f 4b 2e 20 0a 20 20 2a 2a 0a 20 20  ITE_OK. .  **.  
33b0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4c 4f 43  ** If SQLITE_LOC
33c0: 4b 45 44 20 77 61 73 20 72 65 74 75 72 6e 65 64  KED was returned
33d0: 2c 20 74 68 65 6e 20 74 68 65 20 73 79 73 74 65  , then the syste
33e0: 6d 20 69 73 20 64 65 61 64 6c 6f 63 6b 65 64 2e  m is deadlocked.
33f0: 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61   In this.  ** ca
3400: 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
3410: 20 6e 65 65 64 73 20 74 6f 20 72 65 74 75 72 6e   needs to return
3420: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 74   SQLITE_LOCKED t
3430: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 73 6f 20  o the caller so 
3440: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63  .  ** that the c
3450: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
3460: 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
3470: 20 62 61 63 6b 2e 20 4f 74 68 65 72 77 69 73 65   back. Otherwise
3480: 2c 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 75 6e 74  , block.  ** unt
3490: 69 6c 20 74 68 65 20 75 6e 6c 6f 63 6b 2d 6e 6f  il the unlock-no
34a0: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73  tify callback is
34b0: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 72   invoked, then r
34c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
34d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
34e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34f0: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
3500: 6f 63 6b 28 26 75 6e 2e 6d 75 74 65 78 29 3b 0a  ock(&un.mutex);.
3510: 20 20 20 20 69 66 28 20 21 75 6e 2e 66 69 72 65      if( !un.fire
3520: 64 20 29 7b 0a 20 20 20 20 20 20 70 74 68 72 65  d ){.      pthre
3530: 61 64 5f 63 6f 6e 64 5f 77 61 69 74 28 26 75 6e  ad_cond_wait(&un
3540: 2e 63 6f 6e 64 2c 20 26 75 6e 2e 6d 75 74 65 78  .cond, &un.mutex
3550: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 68  );.    }.    pth
3560: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
3570: 6b 28 26 75 6e 2e 6d 75 74 65 78 29 3b 0a 20 20  k(&un.mutex);.  
3580: 7d 0a 0a 20 20 2f 2a 20 44 65 73 74 72 6f 79 20  }..  /* Destroy 
3590: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 63 6f  the mutex and co
35a0: 6e 64 69 74 69 6f 6e 20 76 61 72 69 61 62 6c 65  ndition variable
35b0: 73 2e 20 2a 2f 0a 20 20 70 74 68 72 65 61 64 5f  s. */.  pthread_
35c0: 63 6f 6e 64 5f 64 65 73 74 72 6f 79 28 26 75 6e  cond_destroy(&un
35d0: 2e 63 6f 6e 64 29 3b 0a 20 20 70 74 68 72 65 61  .cond);.  pthrea
35e0: 64 5f 6d 75 74 65 78 5f 64 65 73 74 72 6f 79 28  d_mutex_destroy(
35f0: 26 75 6e 2e 6d 75 74 65 78 29 3b 0a 0a 20 20 72  &un.mutex);..  r
3600: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3610: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3620: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
3630: 6f 75 6e 64 20 74 68 65 20 53 51 4c 69 74 65 20  ound the SQLite 
3640: 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33  function sqlite3
3650: 5f 73 74 65 70 28 29 2e 0a 2a 2a 20 49 74 20 66  _step()..** It f
3660: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  unctions in the 
3670: 73 61 6d 65 20 77 61 79 20 61 73 20 73 74 65 70  same way as step
3680: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
3690: 69 66 20 61 20 72 65 71 75 69 72 65 64 0a 2a 2a  if a required.**
36a0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6c 6f   shared-cache lo
36b0: 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
36c0: 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  ained, this func
36d0: 74 69 6f 6e 20 6d 61 79 20 62 6c 6f 63 6b 20 77  tion may block w
36e0: 61 69 74 69 6e 67 20 66 6f 72 0a 2a 2a 20 74 68  aiting for.** th
36f0: 65 20 6c 6f 63 6b 20 74 6f 20 62 65 63 6f 6d 65  e lock to become
3700: 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 6e 20 74   available. In t
3710: 68 69 73 20 73 63 65 6e 61 72 69 6f 20 74 68 65  his scenario the
3720: 20 6e 6f 72 6d 61 6c 20 41 50 49 20 73 74 65 70   normal API step
3730: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  ().** function a
3740: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
3750: 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a  LITE_LOCKED..**.
3760: 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
3770: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
3780: 54 45 5f 4c 4f 43 4b 45 44 2c 20 74 68 65 20 63  TE_LOCKED, the c
3790: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 72 6f 6c  aller should rol
37a0: 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20 63 75 72  lback.** the cur
37b0: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
37c0: 20 28 69 66 20 61 6e 79 29 20 61 6e 64 20 74 72   (if any) and tr
37d0: 79 20 61 67 61 69 6e 20 6c 61 74 65 72 2e 20 4f  y again later. O
37e0: 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a  therwise, the.**
37f0: 20 73 79 73 74 65 6d 20 6d 61 79 20 62 65 63 6f   system may beco
3800: 6d 65 20 64 65 61 64 6c 6f 63 6b 65 64 2e 0a 2a  me deadlocked..*
3810: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 6c  /.int sqlite3_bl
3820: 6f 63 6b 69 6e 67 5f 73 74 65 70 28 73 71 6c 69  ocking_step(sqli
3830: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29  te3_stmt *pStmt)
3840: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 68  {.  int rc;.  wh
3850: 69 6c 65 28 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ile( SQLITE_LOCK
3860: 45 44 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  ED==(rc = sqlite
3870: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 29 20 29  3_step(pStmt)) )
3880: 7b 0a 20 20 20 20 72 63 20 3d 20 77 61 69 74 5f  {.    rc = wait_
3890: 66 6f 72 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  for_unlock_notif
38a0: 79 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  y(sqlite3_db_han
38b0: 64 6c 65 28 70 53 74 6d 74 29 29 3b 0a 20 20 20  dle(pStmt));.   
38c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
38d0: 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OK ) break;.    
38e0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
38f0: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tmt);.  }.  retu
3900: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3910: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3920: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3930: 64 20 74 68 65 20 53 51 4c 69 74 65 20 66 75 6e  d the SQLite fun
3940: 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 70 72  ction sqlite3_pr
3950: 65 70 61 72 65 5f 76 32 28 29 2e 0a 2a 2a 20 49  epare_v2()..** I
3960: 74 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  t functions in t
3970: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 70  he same way as p
3980: 72 65 70 61 72 65 5f 76 32 28 29 2c 20 65 78 63  repare_v2(), exc
3990: 65 70 74 20 74 68 61 74 20 69 66 20 61 20 72 65  ept that if a re
39a0: 71 75 69 72 65 64 0a 2a 2a 20 73 68 61 72 65 64  quired.** shared
39b0: 2d 63 61 63 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  -cache lock cann
39c0: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ot be obtained, 
39d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
39e0: 79 20 62 6c 6f 63 6b 20 77 61 69 74 69 6e 67 20  y block waiting 
39f0: 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 20  for.** the lock 
3a00: 74 6f 20 62 65 63 6f 6d 65 20 61 76 61 69 6c 61  to become availa
3a10: 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 63 65  ble. In this sce
3a20: 6e 61 72 69 6f 20 74 68 65 20 6e 6f 72 6d 61 6c  nario the normal
3a30: 20 41 50 49 20 70 72 65 70 61 72 65 5f 76 32 28   API prepare_v2(
3a40: 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  ).** function al
3a50: 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
3a60: 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a  ITE_LOCKED..**.*
3a70: 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
3a80: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
3a90: 45 5f 4c 4f 43 4b 45 44 2c 20 74 68 65 20 63 61  E_LOCKED, the ca
3aa0: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 72 6f 6c 6c  ller should roll
3ab0: 62 61 63 6b 0a 2a 2a 20 74 68 65 20 63 75 72 72  back.** the curr
3ac0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
3ad0: 28 69 66 20 61 6e 79 29 20 61 6e 64 20 74 72 79  (if any) and try
3ae0: 20 61 67 61 69 6e 20 6c 61 74 65 72 2e 20 4f 74   again later. Ot
3af0: 68 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a 20  herwise, the.** 
3b00: 73 79 73 74 65 6d 20 6d 61 79 20 62 65 63 6f 6d  system may becom
3b10: 65 20 64 65 61 64 6c 6f 63 6b 65 64 2e 0a 2a 2f  e deadlocked..*/
3b20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .int sqlite3_blo
3b30: 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32  cking_prepare_v2
3b40: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b60: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
3b70: 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  . */.  const cha
3b80: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
3b90: 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   /* UTF-8 encode
3ba0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
3bb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 2c 20   */.  int nSql, 
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71  /* Length of zSq
3be0: 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20  l in bytes. */. 
3bf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
3c00: 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55  ppStmt,    /* OU
3c10: 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  T: A pointer to 
3c20: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
3c30: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
3c40: 74 20 63 68 61 72 20 2a 2a 70 7a 20 20 20 20 20  t char **pz     
3c50: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e        /* OUT: En
3c60: 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69  d of parsed stri
3c70: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
3c80: 63 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49  c;.  while( SQLI
3c90: 54 45 5f 4c 4f 43 4b 45 44 3d 3d 28 72 63 20 3d  TE_LOCKED==(rc =
3ca0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
3cb0: 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 53  _v2(db, zSql, nS
3cc0: 71 6c 2c 20 70 70 53 74 6d 74 2c 20 70 7a 29 29  ql, ppStmt, pz))
3cd0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 61 69   ){.    rc = wai
3ce0: 74 5f 66 6f 72 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  t_for_unlock_not
3cf0: 69 66 79 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ify(db);.    if(
3d00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3d10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
3d20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 4e  turn rc;.}./* EN
3d30: 44 5f 53 51 4c 49 54 45 5f 42 4c 4f 43 4b 49 4e  D_SQLITE_BLOCKIN
3d40: 47 5f 53 54 45 50 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  G_STEP */../*.**
3d50: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
3d60: 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 20 53 54  blocking_step ST
3d70: 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  MT.**.** Advance
3d80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
3d90: 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a  o the next row..
3da0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6c  */.static int bl
3db0: 6f 63 6b 69 6e 67 5f 73 74 65 70 5f 70 72 6f 63  ocking_step_proc
3dc0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
3dd0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
3de0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
3df0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
3e00: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
3e10: 0a 29 7b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  .){..  sqlite3_s
3e20: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
3e30: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
3e40: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
3e50: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
3e60: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
3e70: 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
3e80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3e90: 0a 0a 20 20 70 53 74 6d 74 20 3d 20 28 73 71 6c  ..  pStmt = (sql
3ea0: 69 74 65 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74  ite3_stmt*)sqlit
3eb0: 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
3ec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
3ed0: 6a 76 5b 31 5d 29 29 3b 0a 20 20 72 63 20 3d 20  jv[1]));.  rc = 
3ee0: 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67  sqlite3_blocking
3ef0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20  _step(pStmt);.. 
3f00: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
3f10: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
3f20: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
3f30: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
3f40: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3f50: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
3f60: 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 70  lite3_blocking_p
3f70: 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c  repare_v2 DB sql
3f80: 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
3f90: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
3fa0: 65 33 5f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 5f 70  e3_nonblocking_p
3fb0: 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c  repare_v2 DB sql
3fc0: 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
3fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
3fe0: 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f  locking_prepare_
3ff0: 76 32 5f 70 72 6f 63 28 0a 20 20 76 6f 69 64 20  v2_proc(.  void 
4000: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
4010: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4020: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
4030: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
4040: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
4050: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
4060: 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
4070: 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
4080: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
4090: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
40a0: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
40b0: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
40c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
40d0: 69 73 42 6c 6f 63 6b 69 6e 67 20 3d 20 21 28 63  isBlocking = !(c
40e0: 6c 69 65 6e 74 44 61 74 61 3d 3d 30 29 3b 0a 0a  lientData==0);..
40f0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
4100: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
4110: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4120: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
4130: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
4140: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
4150: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
4160: 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
4170: 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
4180: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
4190: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
41a0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
41b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
41c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
41d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
41e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
41f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
4200: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
4210: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
4220: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
4230: 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
4240: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4250: 0a 20 20 69 66 28 20 69 73 42 6c 6f 63 6b 69 6e  .  if( isBlockin
4260: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  g ){.    rc = sq
4270: 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 70  lite3_blocking_p
4280: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
4290: 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
42a0: 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 7d 65  t, &zTail);.  }e
42b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
42c0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
42d0: 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
42e0: 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c  , &pStmt, &zTail
42f0: 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
4300: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
4310: 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69  | pStmt==0);.  i
4320: 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63  f( zTail && objc
4330: 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62  >=5 ){.    if( b
4340: 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
4350: 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
4360: 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20   (zTail-zSql);. 
4370: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a     }.    Tcl_Obj
4380: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
4390: 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f  objv[4], 0, Tcl_
43a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
43b0: 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a  il, bytes), 0);.
43c0: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
43d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
43e0: 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
43f0: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
4400: 42 75 66 2c 20 22 25 73 20 22 2c 20 28 63 68 61  Buf, "%s ", (cha
4410: 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45  r *)sqlite3TestE
4420: 72 72 6f 72 4e 61 6d 65 28 72 63 29 29 3b 0a 20  rrorName(rc));. 
4430: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4440: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
4450: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
4460: 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
4470: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4480: 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
4490: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
44a0: 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
44b0: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
44c0: 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
44d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
44e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
44f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
4500: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
4510: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65  rn TCL_OK;.}..#e
4520: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4530: 53 5f 55 4e 49 58 20 26 26 20 53 51 4c 49 54 45  S_UNIX && SQLITE
4540: 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
4550: 4f 54 49 46 59 20 2a 2f 0a 2f 2a 0a 2a 2a 20 45  OTIFY */./*.** E
4560: 6e 64 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 61  nd of implementa
4570: 74 69 6f 6e 20 6f 66 20 5b 73 71 6c 69 74 65 33  tion of [sqlite3
4580: 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 5d 2e  _blocking_step].
4590: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
45a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
45e0: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
45f0: 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
4600: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
4610: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54  .int SqlitetestT
4620: 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49  hread_Init(Tcl_I
4630: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
4640: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
4650: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
4660: 73 71 6c 74 68 72 65 61 64 22 2c 20 73 71 6c 74  sqlthread", sqlt
4670: 68 72 65 61 64 5f 70 72 6f 63 2c 20 30 2c 20 30  hread_proc, 0, 0
4680: 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
4690: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
46a0: 2c 20 22 63 6c 6f 63 6b 5f 73 65 63 6f 6e 64 73  , "clock_seconds
46b0: 22 2c 20 63 6c 6f 63 6b 5f 73 65 63 6f 6e 64 73  ", clock_seconds
46c0: 5f 70 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 23 69  _proc, 0, 0);.#i
46d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
46e0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
46f0: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
4700: 5f 4e 4f 54 49 46 59 29 0a 20 20 54 63 6c 5f 43  _NOTIFY).  Tcl_C
4710: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
4720: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
4730: 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 22 2c  _blocking_step",
4740: 20 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 5f 70   blocking_step_p
4750: 72 6f 63 2c 30 2c 30 29 3b 0a 20 20 54 63 6c 5f  roc,0,0);.  Tcl_
4760: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
4770: 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20  (interp, .      
4780: 22 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e  "sqlite3_blockin
4790: 67 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20 62  g_prepare_v2", b
47a0: 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f  locking_prepare_
47b0: 76 32 5f 70 72 6f 63 2c 20 28 76 6f 69 64 20 2a  v2_proc, (void *
47c0: 29 31 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  )1, 0);.  Tcl_Cr
47d0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
47e0: 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20 22 73  nterp, .      "s
47f0: 71 6c 69 74 65 33 5f 6e 6f 6e 62 6c 6f 63 6b 69  qlite3_nonblocki
4800: 6e 67 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20  ng_prepare_v2", 
4810: 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65  blocking_prepare
4820: 5f 76 32 5f 70 72 6f 63 2c 20 30 2c 20 30 29 3b  _v2_proc, 0, 0);
4830: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
4840: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65   TCL_OK;.}.#else
4850: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54  .int SqlitetestT
4860: 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49  hread_Init(Tcl_I
4870: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
4880: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4890: 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.