/ Hex Artifact Content
Login

Artifact e286f2173563f2a1747c24bcda6b9d030bf4f4e4:


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 63 68 61 72 20 7a 42 75   *db;.  char zBu
1f30: 66 5b 31 30 30 5d 3b 0a 20 20 65 78 74 65 72 6e  f[100];.  extern
1f40: 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73 74   void Md5_Regist
1f50: 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a 20  er(sqlite3*);.. 
1f60: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1f70: 52 28 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20  R(clientData);. 
1f80: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1f90: 52 28 6f 62 6a 63 29 3b 0a 0a 20 20 7a 46 69 6c  R(objc);..  zFil
1fa0: 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  ename = Tcl_GetS
1fb0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
1fc0: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a    sqlite3_open(z
1fd0: 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a  Filename, &db);.
1fe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
1ff0: 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 64 62  S_CODEC.  if( db
2000: 20 26 26 20 6f 62 6a 63 3e 3d 34 20 29 7b 0a 20   && objc>=4 ){. 
2010: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2020: 4b 65 79 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65  Key;.    int nKe
2030: 79 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  y;.    int rc;. 
2040: 20 20 20 7a 4b 65 79 20 3d 20 54 63 6c 5f 47 65     zKey = Tcl_Ge
2050: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
2060: 62 6a 76 5b 33 5d 2c 20 26 6e 4b 65 79 29 3b 0a  bjv[3], &nKey);.
2070: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2080: 5f 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e  _key(db, zKey, n
2090: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Key);.    if( rc
20a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d       char *zErrM
20c0: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
20d0: 69 6e 74 66 28 22 65 72 72 6f 72 20 25 64 3a 20  intf("error %d: 
20e0: 25 73 22 2c 20 72 63 2c 20 73 71 6c 69 74 65 33  %s", rc, sqlite3
20f0: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
2100: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2110: 65 28 64 62 29 3b 0a 20 20 20 20 20 20 54 63 6c  e(db);.      Tcl
2120: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2130: 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 28  terp, zErrMsg, (
2140: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
2150: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
2160: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74  rMsg);.      ret
2170: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2180: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2190: 20 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 64    Md5_Register(d
21a0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 75  b);.  sqlite3_bu
21b0: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 78  sy_handler(db, x
21c0: 42 75 73 79 2c 20 30 29 3b 0a 20 20 0a 20 20 69  Busy, 0);.  .  i
21d0: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
21e0: 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
21f0: 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
2200: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2210: 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
2220: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
2230: 75 66 2c 20 30 29 3b 0a 0a 20 20 72 65 74 75 72  uf, 0);..  retur
2240: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
2250: 0a 2a 2a 20 73 71 6c 74 68 72 65 61 64 20 6f 70  .** sqlthread op
2260: 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 74  en.**.**     Ret
2270: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
2280: 74 68 72 65 61 64 2d 69 64 20 28 54 63 6c 5f 47  thread-id (Tcl_G
2290: 65 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 28  etCurrentThread(
22a0: 29 29 20 63 61 73 74 20 74 6f 0a 2a 2a 20 20 20  )) cast to.**   
22b0: 20 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f    an integer..*/
22c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 74  .static int sqlt
22d0: 68 72 65 61 64 5f 69 64 28 0a 20 20 43 6c 69 65  hread_id(.  Clie
22e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
22f0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2300: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2310: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2320: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2330: 20 20 54 63 6c 5f 54 68 72 65 61 64 49 64 20 69    Tcl_ThreadId i
2340: 64 20 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65  d = Tcl_GetCurre
2350: 6e 74 54 68 72 65 61 64 28 29 3b 0a 20 20 54 63  ntThread();.  Tc
2360: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2370: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
2380: 74 4f 62 6a 28 53 51 4c 49 54 45 5f 50 54 52 5f  tObj(SQLITE_PTR_
2390: 54 4f 5f 49 4e 54 28 69 64 29 29 29 3b 0a 20 20  TO_INT(id)));.  
23a0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23b0: 28 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20 20  (clientData);.  
23c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23d0: 28 6f 62 6a 63 29 3b 0a 20 20 55 4e 55 53 45 44  (objc);.  UNUSED
23e0: 5f 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 76 29  _PARAMETER(objv)
23f0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2400: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  K;.}.../*.** Dis
2410: 70 61 74 63 68 20 72 6f 75 74 69 6e 65 20 66 6f  patch routine fo
2420: 72 20 74 68 65 20 73 75 62 2d 63 6f 6d 6d 61 6e  r the sub-comman
2430: 64 73 20 6f 66 20 5b 73 71 6c 74 68 72 65 61 64  ds of [sqlthread
2440: 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ]..*/.static int
2450: 20 73 71 6c 74 68 72 65 61 64 5f 70 72 6f 63 28   sqlthread_proc(
2460: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2470: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2480: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2490: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
24a0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24b0: 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  v[].){.  struct 
24c0: 53 75 62 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 20  SubCommand {.   
24d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
24e0: 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63    Tcl_ObjCmdProc
24f0: 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 69 6e 74   *xProc;.    int
2500: 20 6e 41 72 67 3b 0a 20 20 20 20 63 68 61 72 20   nArg;.    char 
2510: 2a 7a 55 73 61 67 65 3b 0a 20 20 7d 20 61 53 75  *zUsage;.  } aSu
2520: 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 70 61  b[] = {.    {"pa
2530: 72 65 6e 74 22 2c 20 73 71 6c 74 68 72 65 61 64  rent", sqlthread
2540: 5f 70 61 72 65 6e 74 2c 20 31 2c 20 22 53 43 52  _parent, 1, "SCR
2550: 49 50 54 22 7d 2c 0a 20 20 20 20 7b 22 73 70 61  IPT"},.    {"spa
2560: 77 6e 22 2c 20 20 73 71 6c 74 68 72 65 61 64 5f  wn",  sqlthread_
2570: 73 70 61 77 6e 2c 20 20 32 2c 20 22 56 41 52 4e  spawn,  2, "VARN
2580: 41 4d 45 20 53 43 52 49 50 54 22 7d 2c 0a 20 20  AME SCRIPT"},.  
2590: 20 20 7b 22 6f 70 65 6e 22 2c 20 20 20 73 71 6c    {"open",   sql
25a0: 74 68 72 65 61 64 5f 6f 70 65 6e 2c 20 20 20 31  thread_open,   1
25b0: 2c 20 22 44 42 4e 41 4d 45 22 7d 2c 0a 20 20 20  , "DBNAME"},.   
25c0: 20 7b 22 69 64 22 2c 20 20 20 20 20 73 71 6c 74   {"id",     sqlt
25d0: 68 72 65 61 64 5f 69 64 2c 20 20 20 20 20 30 2c  hread_id,     0,
25e0: 20 22 22 7d 2c 0a 20 20 20 20 7b 30 2c 20 30 2c   ""},.    {0, 0,
25f0: 20 30 7d 0a 20 20 7d 3b 0a 20 20 73 74 72 75 63   0}.  };.  struc
2600: 74 20 53 75 62 43 6f 6d 6d 61 6e 64 20 2a 70 53  t SubCommand *pS
2610: 75 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ub;.  int rc;.  
2620: 69 6e 74 20 69 49 6e 64 65 78 3b 0a 0a 20 20 69  int iIndex;..  i
2630: 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
2640: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2650: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2660: 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 22  v, "SUB-COMMAND"
2670: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2680: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2690: 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65  rc = Tcl_GetInde
26a0: 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 0a  xFromObjStruct(.
26b0: 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 6f 62        interp, ob
26c0: 6a 76 5b 31 5d 2c 20 61 53 75 62 2c 20 73 69 7a  jv[1], aSub, siz
26d0: 65 6f 66 28 61 53 75 62 5b 30 5d 29 2c 20 22 73  eof(aSub[0]), "s
26e0: 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20  ub-command", 0, 
26f0: 26 69 49 6e 64 65 78 0a 20 20 29 3b 0a 20 20 69  &iIndex.  );.  i
2700: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20  f( rc!=TCL_OK ) 
2710: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 53 75  return rc;.  pSu
2720: 62 20 3d 20 26 61 53 75 62 5b 69 49 6e 64 65 78  b = &aSub[iIndex
2730: 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 28  ];..  if( objc<(
2740: 70 53 75 62 2d 3e 6e 41 72 67 2b 32 29 20 29 7b  pSub->nArg+2) ){
2750: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2760: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
2770: 20 6f 62 6a 76 2c 20 70 53 75 62 2d 3e 7a 55 73   objv, pSub->zUs
2780: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
2790: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
27a0: 0a 20 20 72 65 74 75 72 6e 20 70 53 75 62 2d 3e  .  return pSub->
27b0: 78 50 72 6f 63 28 63 6c 69 65 6e 74 44 61 74 61  xProc(clientData
27c0: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  , interp, objc, 
27d0: 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  objv);.}../*.** 
27e0: 54 68 65 20 5b 63 6c 6f 63 6b 5f 73 65 63 6f 6e  The [clock_secon
27f0: 64 73 5d 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69  ds] command. Thi
2800: 73 20 69 73 20 6d 6f 72 65 20 6f 72 20 6c 65 73  s is more or les
2810: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2820: 65 0a 2a 2a 20 72 65 67 75 6c 61 72 20 74 63 6c  e.** regular tcl
2830: 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
2840: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
2850: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
2860: 20 74 65 73 74 66 69 78 74 75 72 65 0a 2a 2a 20   testfixture.** 
2870: 77 68 65 6e 20 6c 69 6e 6b 65 64 20 61 67 61 69  when linked agai
2880: 6e 73 74 20 62 6f 74 68 20 54 63 6c 20 38 2e 34  nst both Tcl 8.4
2890: 20 61 6e 64 20 38 2e 35 2e 20 42 65 63 61 75 73   and 8.5. Becaus
28a0: 65 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  e [clock seconds
28b0: 5d 20 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ] is.** implemen
28c0: 74 65 64 20 61 73 20 61 20 73 63 72 69 70 74 20  ted as a script 
28d0: 69 6e 20 54 63 6c 20 38 2e 35 2c 20 69 74 20 69  in Tcl 8.5, it i
28e0: 73 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 61 76  s not usually av
28f0: 61 69 6c 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 65  ailable to.** te
2900: 73 74 66 69 78 74 75 72 65 2e 0a 2a 2f 20 0a 73  stfixture..*/ .s
2910: 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 63 6b 5f  tatic int clock_
2920: 73 65 63 6f 6e 64 73 5f 70 72 6f 63 28 0a 20 20  seconds_proc(.  
2930: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2940: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2950: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2960: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2970: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2980: 0a 29 7b 0a 20 20 54 63 6c 5f 54 69 6d 65 20 6e  .){.  Tcl_Time n
2990: 6f 77 3b 0a 20 20 54 63 6c 5f 47 65 74 54 69 6d  ow;.  Tcl_GetTim
29a0: 65 28 26 6e 6f 77 29 3b 0a 20 20 54 63 6c 5f 53  e(&now);.  Tcl_S
29b0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
29c0: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
29d0: 6a 28 6e 6f 77 2e 73 65 63 29 29 3b 0a 20 20 55  j(now.sec));.  U
29e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29f0: 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20 20 55  clientData);.  U
2a00: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a10: 6f 62 6a 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  objc);.  UNUSED_
2a20: 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 76 29 3b  PARAMETER(objv);
2a30: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2a40: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
2a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2a90: 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f  ** This block co
2aa0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
2ab0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
2ac0: 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69   [sqlite3_blocki
2ad0: 6e 67 5f 73 74 65 70 5d 0a 2a 2a 20 63 6f 6d 6d  ng_step].** comm
2ae0: 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  and available to
2af0: 20 74 68 72 65 61 64 73 20 63 72 65 61 74 65 64   threads created
2b00: 20 62 79 20 5b 73 71 6c 74 68 72 65 61 64 20 73   by [sqlthread s
2b10: 70 61 77 6e 5d 20 63 6f 6d 6d 61 6e 64 73 2e 20  pawn] commands. 
2b20: 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76  It.** is only av
2b30: 61 69 6c 61 62 6c 65 20 6f 6e 20 55 4e 49 58 20  ailable on UNIX 
2b40: 66 6f 72 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  for now. This is
2b50: 20 62 65 63 61 75 73 65 20 70 74 68 72 65 61 64   because pthread
2b60: 20 63 6f 6e 64 69 74 69 6f 6e 0a 2a 2a 20 76 61   condition.** va
2b70: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
2b80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 75 72  ..**.** The sour
2b90: 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
2ba0: 43 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69  C functions sqli
2bb0: 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65  te3_blocking_ste
2bc0: 70 28 29 2c 0a 2a 2a 20 62 6c 6f 63 6b 69 6e 67  p(),.** blocking
2bd0: 5f 73 74 65 70 5f 6e 6f 74 69 66 79 28 29 20 61  _step_notify() a
2be0: 6e 64 20 74 68 65 20 73 74 72 75 63 74 75 72 65  nd the structure
2bf0: 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61 74   UnlockNotificat
2c00: 69 6f 6e 20 69 73 0a 2a 2a 20 61 75 74 6f 6d 61  ion is.** automa
2c10: 74 69 63 61 6c 6c 79 20 65 78 74 72 61 63 74 65  tically extracte
2c20: 64 20 66 72 6f 6d 20 74 68 69 73 20 66 69 6c 65  d from this file
2c30: 20 61 6e 64 20 75 73 65 64 20 61 73 20 70 61 72   and used as par
2c40: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 64 6f 63 75  t of the.** docu
2c50: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68  mentation for th
2c60: 65 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  e sqlite3_unlock
2c70: 5f 6e 6f 74 69 66 79 28 29 20 41 50 49 20 66 75  _notify() API fu
2c80: 6e 63 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20  nction. This.** 
2c90: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64  should be consid
2ca0: 65 72 65 64 20 69 66 20 74 68 65 73 65 20 66 75  ered if these fu
2cb0: 6e 63 74 69 6f 6e 73 20 61 72 65 20 74 6f 20 62  nctions are to b
2cc0: 65 20 65 78 74 65 6e 64 65 64 20 28 69 2e 65 2e  e extended (i.e.
2cd0: 20 74 6f 20 0a 2a 2a 20 73 75 70 70 6f 72 74 20   to .** support 
2ce0: 77 69 6e 64 6f 77 73 29 20 69 6e 20 74 68 65 20  windows) in the 
2cf0: 66 75 74 75 72 65 2e 0a 2a 2f 20 0a 23 69 66 20  future..*/ .#if 
2d00: 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26  SQLITE_OS_UNIX &
2d10: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2d20: 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
2d30: 4f 54 49 46 59 29 0a 0a 2f 2a 20 42 45 47 49 4e  OTIFY)../* BEGIN
2d40: 5f 53 51 4c 49 54 45 5f 42 4c 4f 43 4b 49 4e 47  _SQLITE_BLOCKING
2d50: 5f 53 54 45 50 20 2a 2f 0a 2f 2a 20 54 68 69 73  _STEP */./* This
2d60: 20 65 78 61 6d 70 6c 65 20 75 73 65 73 20 74 68   example uses th
2d70: 65 20 70 74 68 72 65 61 64 73 20 41 50 49 20 2a  e pthreads API *
2d80: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68 72  /.#include <pthr
2d90: 65 61 64 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20  ead.h>../*.** A 
2da0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
2db0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
2dc0: 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73  tructure is pass
2dd0: 65 64 20 61 73 20 74 68 65 20 75 73 65 72 2d 63  ed as the user-c
2de0: 6f 6e 74 65 78 74 0a 2a 2a 20 70 6f 69 6e 74 65  ontext.** pointe
2df0: 72 20 77 68 65 6e 20 72 65 67 69 73 74 65 72 69  r when registeri
2e00: 6e 67 20 66 6f 72 20 61 6e 20 75 6e 6c 6f 63 6b  ng for an unlock
2e10: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
2e20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2e30: 75 63 74 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69  uct UnlockNotifi
2e40: 63 61 74 69 6f 6e 20 55 6e 6c 6f 63 6b 4e 6f 74  cation UnlockNot
2e50: 69 66 69 63 61 74 69 6f 6e 3b 0a 73 74 72 75 63  ification;.struc
2e60: 74 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61  t UnlockNotifica
2e70: 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 66 69 72  tion {.  int fir
2e80: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ea0: 72 75 65 20 61 66 74 65 72 20 75 6e 6c 6f 63 6b  rue after unlock
2eb0: 20 65 76 65 6e 74 20 68 61 73 20 6f 63 63 75 72   event has occur
2ec0: 72 65 64 20 2a 2f 0a 20 20 70 74 68 72 65 61 64  red */.  pthread
2ed0: 5f 63 6f 6e 64 5f 74 20 63 6f 6e 64 3b 20 20 20  _cond_t cond;   
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2ef0: 6f 6e 64 69 74 69 6f 6e 20 76 61 72 69 61 62 6c  ondition variabl
2f00: 65 20 74 6f 20 77 61 69 74 20 6f 6e 20 2a 2f 0a  e to wait on */.
2f10: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
2f20: 74 20 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20  t mutex;        
2f30: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
2f40: 20 70 72 6f 74 65 63 74 20 73 74 72 75 63 74 75   protect structu
2f50: 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  re */.};../*.** 
2f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2f70: 20 61 6e 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66   an unlock-notif
2f80: 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  y callback regis
2f90: 74 65 72 65 64 20 77 69 74 68 20 53 51 4c 69 74  tered with SQLit
2fa0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2fb0: 64 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  d unlock_notify_
2fc0: 63 62 28 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c  cb(void **apArg,
2fd0: 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e   int nArg){.  in
2fe0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
2ff0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
3000: 20 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61    UnlockNotifica
3010: 74 69 6f 6e 20 2a 70 20 3d 20 28 55 6e 6c 6f 63  tion *p = (Unloc
3020: 6b 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20 2a 29  kNotification *)
3030: 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20 20 70 74  apArg[i];.    pt
3040: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
3050: 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (&p->mutex);.   
3060: 20 70 2d 3e 66 69 72 65 64 20 3d 20 31 3b 0a 20   p->fired = 1;. 
3070: 20 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f     pthread_cond_
3080: 73 69 67 6e 61 6c 28 26 70 2d 3e 63 6f 6e 64 29  signal(&p->cond)
3090: 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  ;.    pthread_mu
30a0: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e 6d  tex_unlock(&p->m
30b0: 75 74 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  utex);.  }.}../*
30c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
30e0: 6e 20 53 51 4c 69 74 65 20 41 50 49 20 63 61 6c  n SQLite API cal
30f0: 6c 20 28 65 69 74 68 65 72 20 73 71 6c 69 74 65  l (either sqlite
3100: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 0a  3_prepare_v2() .
3110: 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 73 74  ** or sqlite3_st
3120: 65 70 28 29 29 20 68 61 73 20 6a 75 73 74 20 72  ep()) has just r
3130: 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4c  eturned SQLITE_L
3140: 4f 43 4b 45 44 2e 20 54 68 65 20 61 72 67 75 6d  OCKED. The argum
3150: 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 61 73  ent is the.** as
3160: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
3170: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
3180: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3190: 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
31a0: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20  unlock_notify() 
31b0: 74 6f 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  to register for 
31c0: 61 6e 20 0a 2a 2a 20 75 6e 6c 6f 63 6b 2d 6e 6f  an .** unlock-no
31d0: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 2c 20 74  tify callback, t
31e0: 68 65 6e 20 62 6c 6f 63 6b 73 20 75 6e 74 69 6c  hen blocks until
31f0: 20 74 68 61 74 20 63 61 6c 6c 62 61 63 6b 20 69   that callback i
3200: 73 20 64 65 6c 69 76 65 72 65 64 20 0a 2a 2a 20  s delivered .** 
3210: 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  and returns SQLI
3220: 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
3230: 72 20 73 68 6f 75 6c 64 20 74 68 65 6e 20 72 65  r should then re
3240: 74 72 79 20 74 68 65 20 66 61 69 6c 65 64 20 6f  try the failed o
3250: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
3260: 4f 72 2c 20 69 66 20 73 71 6c 69 74 65 33 5f 75  Or, if sqlite3_u
3270: 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20 69  nlock_notify() i
3280: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 6f  ndicates that to
3290: 20 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 64 65 61   block would dea
32a0: 64 6c 6f 63 6b 20 0a 2a 2a 20 74 68 65 20 73 79  dlock .** the sy
32b0: 73 74 65 6d 2c 20 74 68 65 6e 20 74 68 69 73 20  stem, then this 
32c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
32d0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
32e0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 0a  mmediately. In .
32f0: 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
3300: 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
3310: 6f 74 20 72 65 74 72 79 20 74 68 65 20 6f 70 65  ot retry the ope
3320: 72 61 74 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c  ration and shoul
3330: 64 20 72 6f 6c 6c 20 0a 2a 2a 20 62 61 63 6b 20  d roll .** back 
3340: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
3350: 73 61 63 74 69 6f 6e 20 28 69 66 20 61 6e 79 29  saction (if any)
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3370: 77 61 69 74 5f 66 6f 72 5f 75 6e 6c 6f 63 6b 5f  wait_for_unlock_
3380: 6e 6f 74 69 66 79 28 73 71 6c 69 74 65 33 20 2a  notify(sqlite3 *
3390: 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  db){.  int rc;. 
33a0: 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61 74   UnlockNotificat
33b0: 69 6f 6e 20 75 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  ion un;..  /* In
33c0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 55 6e 6c  itialize the Unl
33d0: 6f 63 6b 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20  ockNotification 
33e0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
33f0: 75 6e 2e 66 69 72 65 64 20 3d 20 30 3b 0a 20 20  un.fired = 0;.  
3400: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
3410: 69 74 28 26 75 6e 2e 6d 75 74 65 78 2c 20 30 29  it(&un.mutex, 0)
3420: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64  ;.  pthread_cond
3430: 5f 69 6e 69 74 28 26 75 6e 2e 63 6f 6e 64 2c 20  _init(&un.cond, 
3440: 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74  0);..  /* Regist
3450: 65 72 20 66 6f 72 20 61 6e 20 75 6e 6c 6f 63 6b  er for an unlock
3460: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
3470: 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
3480: 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
3490: 79 28 64 62 2c 20 75 6e 6c 6f 63 6b 5f 6e 6f 74  y(db, unlock_not
34a0: 69 66 79 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29  ify_cb, (void *)
34b0: 26 75 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  &un);.  assert( 
34c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
34d0: 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  D || rc==SQLITE_
34e0: 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  OK );..  /* The 
34f0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
3500: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20  unlock_notify() 
3510: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 65  always returns e
3520: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ither SQLITE_LOC
3530: 4b 45 44 20 0a 20 20 2a 2a 20 6f 72 20 53 51 4c  KED .  ** or SQL
3540: 49 54 45 5f 4f 4b 2e 20 0a 20 20 2a 2a 0a 20 20  ITE_OK. .  **.  
3550: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4c 4f 43  ** If SQLITE_LOC
3560: 4b 45 44 20 77 61 73 20 72 65 74 75 72 6e 65 64  KED was returned
3570: 2c 20 74 68 65 6e 20 74 68 65 20 73 79 73 74 65  , then the syste
3580: 6d 20 69 73 20 64 65 61 64 6c 6f 63 6b 65 64 2e  m is deadlocked.
3590: 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61   In this.  ** ca
35a0: 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
35b0: 20 6e 65 65 64 73 20 74 6f 20 72 65 74 75 72 6e   needs to return
35c0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 74   SQLITE_LOCKED t
35d0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 73 6f 20  o the caller so 
35e0: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63  .  ** that the c
35f0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
3600: 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
3610: 20 62 61 63 6b 2e 20 4f 74 68 65 72 77 69 73 65   back. Otherwise
3620: 2c 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 75 6e 74  , block.  ** unt
3630: 69 6c 20 74 68 65 20 75 6e 6c 6f 63 6b 2d 6e 6f  il the unlock-no
3640: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73  tify callback is
3650: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 72   invoked, then r
3660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
3670: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
3680: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3690: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
36a0: 6f 63 6b 28 26 75 6e 2e 6d 75 74 65 78 29 3b 0a  ock(&un.mutex);.
36b0: 20 20 20 20 69 66 28 20 21 75 6e 2e 66 69 72 65      if( !un.fire
36c0: 64 20 29 7b 0a 20 20 20 20 20 20 70 74 68 72 65  d ){.      pthre
36d0: 61 64 5f 63 6f 6e 64 5f 77 61 69 74 28 26 75 6e  ad_cond_wait(&un
36e0: 2e 63 6f 6e 64 2c 20 26 75 6e 2e 6d 75 74 65 78  .cond, &un.mutex
36f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 68  );.    }.    pth
3700: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
3710: 6b 28 26 75 6e 2e 6d 75 74 65 78 29 3b 0a 20 20  k(&un.mutex);.  
3720: 7d 0a 0a 20 20 2f 2a 20 44 65 73 74 72 6f 79 20  }..  /* Destroy 
3730: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 63 6f  the mutex and co
3740: 6e 64 69 74 69 6f 6e 20 76 61 72 69 61 62 6c 65  ndition variable
3750: 73 2e 20 2a 2f 0a 20 20 70 74 68 72 65 61 64 5f  s. */.  pthread_
3760: 63 6f 6e 64 5f 64 65 73 74 72 6f 79 28 26 75 6e  cond_destroy(&un
3770: 2e 63 6f 6e 64 29 3b 0a 20 20 70 74 68 72 65 61  .cond);.  pthrea
3780: 64 5f 6d 75 74 65 78 5f 64 65 73 74 72 6f 79 28  d_mutex_destroy(
3790: 26 75 6e 2e 6d 75 74 65 78 29 3b 0a 0a 20 20 72  &un.mutex);..  r
37a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37c0: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
37d0: 6f 75 6e 64 20 74 68 65 20 53 51 4c 69 74 65 20  ound the SQLite 
37e0: 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33  function sqlite3
37f0: 5f 73 74 65 70 28 29 2e 0a 2a 2a 20 49 74 20 66  _step()..** It f
3800: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  unctions in the 
3810: 73 61 6d 65 20 77 61 79 20 61 73 20 73 74 65 70  same way as step
3820: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
3830: 69 66 20 61 20 72 65 71 75 69 72 65 64 0a 2a 2a  if a required.**
3840: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6c 6f   shared-cache lo
3850: 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
3860: 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  ained, this func
3870: 74 69 6f 6e 20 6d 61 79 20 62 6c 6f 63 6b 20 77  tion may block w
3880: 61 69 74 69 6e 67 20 66 6f 72 0a 2a 2a 20 74 68  aiting for.** th
3890: 65 20 6c 6f 63 6b 20 74 6f 20 62 65 63 6f 6d 65  e lock to become
38a0: 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 6e 20 74   available. In t
38b0: 68 69 73 20 73 63 65 6e 61 72 69 6f 20 74 68 65  his scenario the
38c0: 20 6e 6f 72 6d 61 6c 20 41 50 49 20 73 74 65 70   normal API step
38d0: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  ().** function a
38e0: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
38f0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a  LITE_LOCKED..**.
3900: 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
3910: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
3920: 54 45 5f 4c 4f 43 4b 45 44 2c 20 74 68 65 20 63  TE_LOCKED, the c
3930: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 72 6f 6c  aller should rol
3940: 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20 63 75 72  lback.** the cur
3950: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
3960: 20 28 69 66 20 61 6e 79 29 20 61 6e 64 20 74 72   (if any) and tr
3970: 79 20 61 67 61 69 6e 20 6c 61 74 65 72 2e 20 4f  y again later. O
3980: 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a  therwise, the.**
3990: 20 73 79 73 74 65 6d 20 6d 61 79 20 62 65 63 6f   system may beco
39a0: 6d 65 20 64 65 61 64 6c 6f 63 6b 65 64 2e 0a 2a  me deadlocked..*
39b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 6c  /.int sqlite3_bl
39c0: 6f 63 6b 69 6e 67 5f 73 74 65 70 28 73 71 6c 69  ocking_step(sqli
39d0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29  te3_stmt *pStmt)
39e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 68  {.  int rc;.  wh
39f0: 69 6c 65 28 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ile( SQLITE_LOCK
3a00: 45 44 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  ED==(rc = sqlite
3a10: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 29 20 29  3_step(pStmt)) )
3a20: 7b 0a 20 20 20 20 72 63 20 3d 20 77 61 69 74 5f  {.    rc = wait_
3a30: 66 6f 72 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  for_unlock_notif
3a40: 79 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  y(sqlite3_db_han
3a50: 64 6c 65 28 70 53 74 6d 74 29 29 3b 0a 20 20 20  dle(pStmt));.   
3a60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3a70: 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OK ) break;.    
3a80: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
3a90: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tmt);.  }.  retu
3aa0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3ab0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3ac0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3ad0: 64 20 74 68 65 20 53 51 4c 69 74 65 20 66 75 6e  d the SQLite fun
3ae0: 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 70 72  ction sqlite3_pr
3af0: 65 70 61 72 65 5f 76 32 28 29 2e 0a 2a 2a 20 49  epare_v2()..** I
3b00: 74 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  t functions in t
3b10: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 70  he same way as p
3b20: 72 65 70 61 72 65 5f 76 32 28 29 2c 20 65 78 63  repare_v2(), exc
3b30: 65 70 74 20 74 68 61 74 20 69 66 20 61 20 72 65  ept that if a re
3b40: 71 75 69 72 65 64 0a 2a 2a 20 73 68 61 72 65 64  quired.** shared
3b50: 2d 63 61 63 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  -cache lock cann
3b60: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ot be obtained, 
3b70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
3b80: 79 20 62 6c 6f 63 6b 20 77 61 69 74 69 6e 67 20  y block waiting 
3b90: 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 20  for.** the lock 
3ba0: 74 6f 20 62 65 63 6f 6d 65 20 61 76 61 69 6c 61  to become availa
3bb0: 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 63 65  ble. In this sce
3bc0: 6e 61 72 69 6f 20 74 68 65 20 6e 6f 72 6d 61 6c  nario the normal
3bd0: 20 41 50 49 20 70 72 65 70 61 72 65 5f 76 32 28   API prepare_v2(
3be0: 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  ).** function al
3bf0: 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
3c00: 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a  ITE_LOCKED..**.*
3c10: 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
3c20: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
3c30: 45 5f 4c 4f 43 4b 45 44 2c 20 74 68 65 20 63 61  E_LOCKED, the ca
3c40: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 72 6f 6c 6c  ller should roll
3c50: 62 61 63 6b 0a 2a 2a 20 74 68 65 20 63 75 72 72  back.** the curr
3c60: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
3c70: 28 69 66 20 61 6e 79 29 20 61 6e 64 20 74 72 79  (if any) and try
3c80: 20 61 67 61 69 6e 20 6c 61 74 65 72 2e 20 4f 74   again later. Ot
3c90: 68 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a 20  herwise, the.** 
3ca0: 73 79 73 74 65 6d 20 6d 61 79 20 62 65 63 6f 6d  system may becom
3cb0: 65 20 64 65 61 64 6c 6f 63 6b 65 64 2e 0a 2a 2f  e deadlocked..*/
3cc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .int sqlite3_blo
3cd0: 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32  cking_prepare_v2
3ce0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d00: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
3d10: 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  . */.  const cha
3d20: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
3d30: 20 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   /* UTF-8 encode
3d40: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
3d50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 2c 20   */.  int nSql, 
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71  /* Length of zSq
3d80: 6c 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20  l in bytes. */. 
3d90: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
3da0: 70 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55  ppStmt,    /* OU
3db0: 54 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  T: A pointer to 
3dc0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
3dd0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
3de0: 74 20 63 68 61 72 20 2a 2a 70 7a 20 20 20 20 20  t char **pz     
3df0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e        /* OUT: En
3e00: 64 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69  d of parsed stri
3e10: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
3e20: 63 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49  c;.  while( SQLI
3e30: 54 45 5f 4c 4f 43 4b 45 44 3d 3d 28 72 63 20 3d  TE_LOCKED==(rc =
3e40: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
3e50: 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 53  _v2(db, zSql, nS
3e60: 71 6c 2c 20 70 70 53 74 6d 74 2c 20 70 7a 29 29  ql, ppStmt, pz))
3e70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 61 69   ){.    rc = wai
3e80: 74 5f 66 6f 72 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  t_for_unlock_not
3e90: 69 66 79 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ify(db);.    if(
3ea0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3eb0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
3ec0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 4e  turn rc;.}./* EN
3ed0: 44 5f 53 51 4c 49 54 45 5f 42 4c 4f 43 4b 49 4e  D_SQLITE_BLOCKIN
3ee0: 47 5f 53 54 45 50 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  G_STEP */../*.**
3ef0: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
3f00: 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 20 53 54  blocking_step ST
3f10: 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  MT.**.** Advance
3f20: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
3f30: 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a  o the next row..
3f40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6c  */.static int bl
3f50: 6f 63 6b 69 6e 67 5f 73 74 65 70 5f 70 72 6f 63  ocking_step_proc
3f60: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
3f70: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
3f80: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
3f90: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
3fa0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
3fb0: 0a 29 7b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  .){..  sqlite3_s
3fc0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
3fd0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
3fe0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
3ff0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
4000: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
4010: 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
4020: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4030: 0a 0a 20 20 70 53 74 6d 74 20 3d 20 28 73 71 6c  ..  pStmt = (sql
4040: 69 74 65 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74  ite3_stmt*)sqlit
4050: 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
4060: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
4070: 6a 76 5b 31 5d 29 29 3b 0a 20 20 72 63 20 3d 20  jv[1]));.  rc = 
4080: 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67  sqlite3_blocking
4090: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20  _step(pStmt);.. 
40a0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
40b0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
40c0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
40d0: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
40e0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
40f0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
4100: 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 70  lite3_blocking_p
4110: 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c  repare_v2 DB sql
4120: 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
4130: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
4140: 65 33 5f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 5f 70  e3_nonblocking_p
4150: 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c  repare_v2 DB sql
4160: 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
4170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4180: 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f  locking_prepare_
4190: 76 32 5f 70 72 6f 63 28 0a 20 20 76 6f 69 64 20  v2_proc(.  void 
41a0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
41b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
41c0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
41d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
41e0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
41f0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
4200: 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
4210: 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
4220: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
4230: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
4240: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
4250: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
4260: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
4270: 69 73 42 6c 6f 63 6b 69 6e 67 20 3d 20 21 28 63  isBlocking = !(c
4280: 6c 69 65 6e 74 44 61 74 61 3d 3d 30 29 3b 0a 0a  lientData==0);..
4290: 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
42a0: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
42b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
42c0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
42d0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
42e0: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
42f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
4300: 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
4310: 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
4320: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
4330: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
4340: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
4350: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
4360: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
4370: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4380: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
4390: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
43a0: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
43b0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
43c0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
43d0: 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
43e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
43f0: 0a 20 20 69 66 28 20 69 73 42 6c 6f 63 6b 69 6e  .  if( isBlockin
4400: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  g ){.    rc = sq
4410: 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 70  lite3_blocking_p
4420: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
4430: 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
4440: 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 7d 65  t, &zTail);.  }e
4450: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
4460: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
4470: 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
4480: 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c  , &pStmt, &zTail
4490: 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
44a0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
44b0: 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69  | pStmt==0);.  i
44c0: 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63  f( zTail && objc
44d0: 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62  >=5 ){.    if( b
44e0: 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
44f0: 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
4500: 20 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20   (zTail-zSql);. 
4510: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a     }.    Tcl_Obj
4520: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
4530: 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f  objv[4], 0, Tcl_
4540: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
4550: 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a  il, bytes), 0);.
4560: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
4570: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
4580: 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
4590: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
45a0: 42 75 66 2c 20 22 25 73 20 22 2c 20 28 63 68 61  Buf, "%s ", (cha
45b0: 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45  r *)sqlite3TestE
45c0: 72 72 6f 72 4e 61 6d 65 28 72 63 29 29 3b 0a 20  rrorName(rc));. 
45d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
45e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
45f0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
4600: 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
4610: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4620: 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
4630: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
4640: 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
4650: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
4660: 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
4670: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4680: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4690: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
46a0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
46b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65  rn TCL_OK;.}..#e
46c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
46d0: 53 5f 55 4e 49 58 20 26 26 20 53 51 4c 49 54 45  S_UNIX && SQLITE
46e0: 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
46f0: 4f 54 49 46 59 20 2a 2f 0a 2f 2a 0a 2a 2a 20 45  OTIFY */./*.** E
4700: 6e 64 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 61  nd of implementa
4710: 74 69 6f 6e 20 6f 66 20 5b 73 71 6c 69 74 65 33  tion of [sqlite3
4720: 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 5d 2e  _blocking_step].
4730: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
4740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
4780: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
4790: 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
47a0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
47b0: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54  .int SqlitetestT
47c0: 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49  hread_Init(Tcl_I
47d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
47e0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
47f0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
4800: 73 71 6c 74 68 72 65 61 64 22 2c 20 73 71 6c 74  sqlthread", sqlt
4810: 68 72 65 61 64 5f 70 72 6f 63 2c 20 30 2c 20 30  hread_proc, 0, 0
4820: 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  );.  Tcl_CreateO
4830: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
4840: 2c 20 22 63 6c 6f 63 6b 5f 73 65 63 6f 6e 64 73  , "clock_seconds
4850: 22 2c 20 63 6c 6f 63 6b 5f 73 65 63 6f 6e 64 73  ", clock_seconds
4860: 5f 70 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 23 69  _proc, 0, 0);.#i
4870: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
4880: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4890: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
48a0: 5f 4e 4f 54 49 46 59 29 0a 20 20 54 63 6c 5f 43  _NOTIFY).  Tcl_C
48b0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
48c0: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
48d0: 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 22 2c  _blocking_step",
48e0: 20 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 5f 70   blocking_step_p
48f0: 72 6f 63 2c 30 2c 30 29 3b 0a 20 20 54 63 6c 5f  roc,0,0);.  Tcl_
4900: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
4910: 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20  (interp, .      
4920: 22 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e  "sqlite3_blockin
4930: 67 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20 62  g_prepare_v2", b
4940: 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f  locking_prepare_
4950: 76 32 5f 70 72 6f 63 2c 20 28 76 6f 69 64 20 2a  v2_proc, (void *
4960: 29 31 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  )1, 0);.  Tcl_Cr
4970: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
4980: 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20 22 73  nterp, .      "s
4990: 71 6c 69 74 65 33 5f 6e 6f 6e 62 6c 6f 63 6b 69  qlite3_nonblocki
49a0: 6e 67 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20  ng_prepare_v2", 
49b0: 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65  blocking_prepare
49c0: 5f 76 32 5f 70 72 6f 63 2c 20 30 2c 20 30 29 3b  _v2_proc, 0, 0);
49d0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
49e0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65   TCL_OK;.}.#else
49f0: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54  .int SqlitetestT
4a00: 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49  hread_Init(Tcl_I
4a10: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
4a20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4a30: 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.