/ Hex Artifact Content
Login

Artifact 911d15fb14e19c0c542bdc8aabf981c2f10a4858:


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 66 20 64 65 66  teInt.h".#if def
0260: 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53 51 4c  ined(INCLUDE_SQL
0270: 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 20 69 6e  ITE_TCL_H).#  in
0280: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 5f 74 63  clude "sqlite_tc
0290: 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20 20 69 6e  l.h".#else.#  in
02a0: 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 65  clude "tcl.h".#e
02b0: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
02c0: 5f 54 48 52 45 41 44 53 41 46 45 0a 0a 23 69 6e  _THREADSAFE..#in
02d0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
02e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 4d  .#if !defined(_M
02f0: 53 43 5f 56 45 52 29 0a 23 69 6e 63 6c 75 64 65  SC_VER).#include
0300: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64   <unistd.h>.#end
0310: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 66  if../*.** One of
0320: 20 74 68 65 73 65 20 69 73 20 61 6c 6c 6f 63 61   these is alloca
0330: 74 65 64 20 66 6f 72 20 65 61 63 68 20 74 68 72  ted for each thr
0340: 65 61 64 20 63 72 65 61 74 65 64 20 62 79 20 5b  ead created by [
0350: 73 71 6c 74 68 72 65 61 64 20 73 70 61 77 6e 5d  sqlthread spawn]
0360: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0370: 75 63 74 20 53 71 6c 54 68 72 65 61 64 20 53 71  uct SqlThread Sq
0380: 6c 54 68 72 65 61 64 3b 0a 73 74 72 75 63 74 20  lThread;.struct 
0390: 53 71 6c 54 68 72 65 61 64 20 7b 0a 20 20 54 63  SqlThread {.  Tc
03a0: 6c 5f 54 68 72 65 61 64 49 64 20 70 61 72 65 6e  l_ThreadId paren
03b0: 74 3b 20 20 20 20 20 2f 2a 20 54 68 72 65 61 64  t;     /* Thread
03c0: 20 69 64 20 6f 66 20 70 61 72 65 6e 74 20 74 68   id of parent th
03d0: 72 65 61 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  read */.  Tcl_In
03e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20  terp *interp;   
03f0: 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 69 6e 74     /* Parent int
0400: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 63 68  erpreter */.  ch
0410: 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20 20  ar *zScript;    
0420: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63         /* The sc
0430: 72 69 70 74 20 74 6f 20 65 78 65 63 75 74 65 2e  ript to execute.
0440: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 56 61 72   */.  char *zVar
0450: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  name;          /
0460: 2a 20 56 61 72 6e 61 6d 65 20 69 6e 20 70 61 72  * Varname in par
0470: 65 6e 74 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b  ent script */.};
0480: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 75 73 74 6f 6d  ../*.** A custom
0490: 20 54 63 6c 5f 45 76 65 6e 74 20 74 79 70 65 20   Tcl_Event type 
04a0: 75 73 65 64 20 62 79 20 74 68 69 73 20 6d 6f 64  used by this mod
04b0: 75 6c 65 2e 20 57 68 65 6e 20 74 68 65 20 65 76  ule. When the ev
04c0: 65 6e 74 20 69 73 0a 2a 2a 20 68 61 6e 64 6c 65  ent is.** handle
04d0: 64 2c 20 73 63 72 69 70 74 20 7a 53 63 72 69 70  d, script zScrip
04e0: 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 69  t is evaluated i
04f0: 6e 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e  n interpreter in
0500: 74 65 72 70 2e 20 49 66 0a 2a 2a 20 74 68 65 20  terp. If.** the 
0510: 65 76 61 6c 75 61 74 69 6f 6e 20 74 68 72 6f 77  evaluation throw
0520: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28  s an exception (
0530: 72 65 74 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f  returns TCL_ERRO
0540: 52 29 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  R), then the.** 
0550: 65 72 72 6f 72 20 69 73 20 68 61 6e 64 6c 65 64  error is handled
0560: 20 62 79 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75   by Tcl_Backgrou
0570: 6e 64 45 72 72 6f 72 28 29 2e 20 49 66 20 6e 6f  ndError(). If no
0580: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
0590: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
05a0: 73 69 6d 70 6c 79 20 64 69 73 63 61 72 64 65 64  simply discarded
05b0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
05c0: 75 63 74 20 45 76 61 6c 45 76 65 6e 74 20 45 76  uct EvalEvent Ev
05d0: 61 6c 45 76 65 6e 74 3b 0a 73 74 72 75 63 74 20  alEvent;.struct 
05e0: 45 76 61 6c 45 76 65 6e 74 20 7b 0a 20 20 54 63  EvalEvent {.  Tc
05f0: 6c 5f 45 76 65 6e 74 20 62 61 73 65 3b 20 20 20  l_Event base;   
0600: 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63         /* Base c
0610: 6c 61 73 73 20 6f 66 20 74 79 70 65 20 54 63 6c  lass of type Tcl
0620: 5f 45 76 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72  _Event */.  char
0630: 20 2a 7a 53 63 72 69 70 74 3b 20 20 20 20 20 20   *zScript;      
0640: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69       /* The scri
0650: 70 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a  pt to execute. *
0660: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
0670: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 2f 2a 20  interp;      /* 
0680: 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  The interpreter 
0690: 74 6f 20 65 78 65 63 75 74 65 20 69 74 20 69 6e  to execute it in
06a0: 2e 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  . */.};..static 
06b0: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 73  Tcl_ObjCmdProc s
06c0: 71 6c 74 68 72 65 61 64 5f 70 72 6f 63 3b 0a 73  qlthread_proc;.s
06d0: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64  tatic Tcl_ObjCmd
06e0: 50 72 6f 63 20 63 6c 6f 63 6b 5f 73 65 63 6f 6e  Proc clock_secon
06f0: 64 73 5f 70 72 6f 63 3b 0a 23 69 66 20 53 51 4c  ds_proc;.#if SQL
0700: 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64  ITE_OS_UNIX && d
0710: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0720: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
0730: 46 59 29 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f  FY).static Tcl_O
0740: 62 6a 43 6d 64 50 72 6f 63 20 62 6c 6f 63 6b 69  bjCmdProc blocki
0750: 6e 67 5f 73 74 65 70 5f 70 72 6f 63 3b 0a 73 74  ng_step_proc;.st
0760: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  atic Tcl_ObjCmdP
0770: 72 6f 63 20 62 6c 6f 63 6b 69 6e 67 5f 70 72 65  roc blocking_pre
0780: 70 61 72 65 5f 76 32 5f 70 72 6f 63 3b 0a 23 65  pare_v2_proc;.#e
0790: 6e 64 69 66 0a 69 6e 74 20 53 71 6c 69 74 65 74  ndif.int Sqlitet
07a0: 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est1_Init(Tcl_In
07b0: 74 65 72 70 20 2a 29 3b 0a 69 6e 74 20 53 71 6c  terp *);.int Sql
07c0: 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
07d0: 74 65 72 70 20 2a 29 3b 0a 0a 2f 2a 20 46 75 6e  terp *);../* Fun
07e0: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6d 61 69 6e  ctions from main
07f0: 2e 63 20 2a 2f 0a 65 78 74 65 72 6e 20 63 6f 6e  .c */.extern con
0800: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0810: 45 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 0a 2f  ErrName(int);../
0820: 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d  * Functions from
0830: 20 74 65 73 74 31 2e 63 20 2a 2f 0a 65 78 74 65   test1.c */.exte
0840: 72 6e 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  rn void *sqlite3
0850: 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 63 6f  TestTextToPtr(co
0860: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 65 78 74  nst char *);.ext
0870: 65 72 6e 20 69 6e 74 20 67 65 74 44 62 50 6f 69  ern int getDbPoi
0880: 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20  nter(Tcl_Interp 
0890: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  *, const char *,
08a0: 20 73 71 6c 69 74 65 33 20 2a 2a 29 3b 0a 65 78   sqlite3 **);.ex
08b0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
08c0: 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
08d0: 74 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 2c  tr(Tcl_Interp *,
08e0: 20 63 68 61 72 20 2a 2c 20 76 6f 69 64 20 2a 29   char *, void *)
08f0: 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
0900: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
0910: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 2c 20 73 71  Tcl_Interp *, sq
0920: 6c 69 74 65 33 20 2a 2c 20 69 6e 74 29 3b 0a 0a  lite3 *, int);..
0930: 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
0940: 72 20 65 76 65 6e 74 73 20 6f 66 20 74 79 70 65  r events of type
0950: 20 45 76 61 6c 45 76 65 6e 74 2e 0a 2a 2f 0a 73   EvalEvent..*/.s
0960: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
0970: 5f 54 43 4c 41 50 49 20 74 63 6c 53 63 72 69 70  _TCLAPI tclScrip
0980: 74 45 76 65 6e 74 28 54 63 6c 5f 45 76 65 6e 74  tEvent(Tcl_Event
0990: 20 2a 65 76 50 74 72 2c 20 69 6e 74 20 66 6c 61   *evPtr, int fla
09a0: 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
09b0: 20 45 76 61 6c 45 76 65 6e 74 20 2a 70 20 3d 20   EvalEvent *p = 
09c0: 28 45 76 61 6c 45 76 65 6e 74 20 2a 29 65 76 50  (EvalEvent *)evP
09d0: 74 72 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45  tr;.  rc = Tcl_E
09e0: 76 61 6c 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  val(p->interp, p
09f0: 2d 3e 7a 53 63 72 69 70 74 29 3b 0a 20 20 69 66  ->zScript);.  if
0a00: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc!=TCL_OK ){.
0a10: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
0a20: 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72  ndError(p->inter
0a30: 70 29 3b 0a 20 20 7d 0a 20 20 55 4e 55 53 45 44  p);.  }.  UNUSED
0a40: 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73  _PARAMETER(flags
0a50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
0a60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
0a70: 20 61 6e 20 45 76 61 6c 45 76 65 6e 74 20 74 6f   an EvalEvent to
0a80: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 73 63   evaluate the sc
0a90: 72 69 70 74 20 70 53 63 72 69 70 74 20 69 6e 20  ript pScript in 
0aa0: 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 69 6e  the.** parent in
0ab0: 74 65 72 70 72 65 74 65 72 2f 74 68 72 65 61 64  terpreter/thread
0ac0: 20 6f 66 20 53 71 6c 54 68 72 65 61 64 20 70 2e   of SqlThread p.
0ad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0ae0: 70 6f 73 74 54 6f 50 61 72 65 6e 74 28 53 71 6c  postToParent(Sql
0af0: 54 68 72 65 61 64 20 2a 70 2c 20 54 63 6c 5f 4f  Thread *p, Tcl_O
0b00: 62 6a 20 2a 70 53 63 72 69 70 74 29 7b 0a 20 20  bj *pScript){.  
0b10: 45 76 61 6c 45 76 65 6e 74 20 2a 70 45 76 65 6e  EvalEvent *pEven
0b20: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  t;.  char *zMsg;
0b30: 0a 20 20 69 6e 74 20 6e 4d 73 67 3b 0a 0a 20 20  .  int nMsg;..  
0b40: 7a 4d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zMsg = Tcl_GetSt
0b50: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 53 63 72  ringFromObj(pScr
0b60: 69 70 74 2c 20 26 6e 4d 73 67 29 3b 20 0a 20 20  ipt, &nMsg); .  
0b70: 70 45 76 65 6e 74 20 3d 20 28 45 76 61 6c 45 76  pEvent = (EvalEv
0b80: 65 6e 74 20 2a 29 63 6b 61 6c 6c 6f 63 28 73 69  ent *)ckalloc(si
0b90: 7a 65 6f 66 28 45 76 61 6c 45 76 65 6e 74 29 2b  zeof(EvalEvent)+
0ba0: 6e 4d 73 67 2b 31 29 3b 0a 20 20 70 45 76 65 6e  nMsg+1);.  pEven
0bb0: 74 2d 3e 62 61 73 65 2e 6e 65 78 74 50 74 72 20  t->base.nextPtr 
0bc0: 3d 20 30 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 62  = 0;.  pEvent->b
0bd0: 61 73 65 2e 70 72 6f 63 20 3d 20 74 63 6c 53 63  ase.proc = tclSc
0be0: 72 69 70 74 45 76 65 6e 74 3b 0a 20 20 70 45 76  riptEvent;.  pEv
0bf0: 65 6e 74 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28  ent->zScript = (
0c00: 63 68 61 72 20 2a 29 26 70 45 76 65 6e 74 5b 31  char *)&pEvent[1
0c10: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 45 76 65  ];.  memcpy(pEve
0c20: 6e 74 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 4d 73  nt->zScript, zMs
0c30: 67 2c 20 6e 4d 73 67 2b 31 29 3b 0a 20 20 70 45  g, nMsg+1);.  pE
0c40: 76 65 6e 74 2d 3e 69 6e 74 65 72 70 20 3d 20 70  vent->interp = p
0c50: 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 54 63 6c  ->interp;..  Tcl
0c60: 5f 54 68 72 65 61 64 51 75 65 75 65 45 76 65 6e  _ThreadQueueEven
0c70: 74 28 70 2d 3e 70 61 72 65 6e 74 2c 20 28 54 63  t(p->parent, (Tc
0c80: 6c 5f 45 76 65 6e 74 20 2a 29 70 45 76 65 6e 74  l_Event *)pEvent
0c90: 2c 20 54 43 4c 5f 51 55 45 55 45 5f 54 41 49 4c  , TCL_QUEUE_TAIL
0ca0: 29 3b 0a 20 20 54 63 6c 5f 54 68 72 65 61 64 41  );.  Tcl_ThreadA
0cb0: 6c 65 72 74 28 70 2d 3e 70 61 72 65 6e 74 29 3b  lert(p->parent);
0cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  .}../*.** The ma
0cd0: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  in function for 
0ce0: 74 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20  threads created 
0cf0: 77 69 74 68 20 5b 73 71 6c 74 68 72 65 61 64 20  with [sqlthread 
0d00: 73 70 61 77 6e 5d 2e 0a 2a 2f 0a 73 74 61 74 69  spawn]..*/.stati
0d10: 63 20 54 63 6c 5f 54 68 72 65 61 64 43 72 65 61  c Tcl_ThreadCrea
0d20: 74 65 54 79 70 65 20 74 63 6c 53 63 72 69 70 74  teType tclScript
0d30: 54 68 72 65 61 64 28 43 6c 69 65 6e 74 44 61 74  Thread(ClientDat
0d40: 61 20 70 53 71 6c 54 68 72 65 61 64 29 7b 0a 20  a pSqlThread){. 
0d50: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0d60: 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
0d70: 70 52 65 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pRes;.  Tcl_Obj 
0d80: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 63  *pList;.  int rc
0d90: 3b 0a 20 20 53 71 6c 54 68 72 65 61 64 20 2a 70  ;.  SqlThread *p
0da0: 20 3d 20 28 53 71 6c 54 68 72 65 61 64 20 2a 29   = (SqlThread *)
0db0: 70 53 71 6c 54 68 72 65 61 64 3b 0a 20 20 65 78  pSqlThread;.  ex
0dc0: 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
0dd0: 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 54  est_mutex_Init(T
0de0: 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20  cl_Interp*);..  
0df0: 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
0e00: 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 54  ateInterp();.  T
0e10: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
0e20: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 63 6c 6f  and(interp, "clo
0e30: 63 6b 5f 73 65 63 6f 6e 64 73 22 2c 20 63 6c 6f  ck_seconds", clo
0e40: 63 6b 5f 73 65 63 6f 6e 64 73 5f 70 72 6f 63 2c  ck_seconds_proc,
0e50: 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72   0, 0);.  Tcl_Cr
0e60: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
0e70: 6e 74 65 72 70 2c 20 22 73 71 6c 74 68 72 65 61  nterp, "sqlthrea
0e80: 64 22 2c 20 73 71 6c 74 68 72 65 61 64 5f 70 72  d", sqlthread_pr
0e90: 6f 63 2c 20 70 53 71 6c 54 68 72 65 61 64 2c 20  oc, pSqlThread, 
0ea0: 30 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  0);.#if SQLITE_O
0eb0: 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65  S_UNIX && define
0ec0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
0ed0: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 20  UNLOCK_NOTIFY). 
0ee0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
0ef0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
0f00: 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f  qlite3_blocking_
0f10: 73 74 65 70 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f  step", blocking_
0f20: 73 74 65 70 5f 70 72 6f 63 2c 30 2c 30 29 3b 0a  step_proc,0,0);.
0f30: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
0f40: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 0a  ommand(interp, .
0f50: 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 62        "sqlite3_b
0f60: 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f  locking_prepare_
0f70: 76 32 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70 72  v2", blocking_pr
0f80: 65 70 61 72 65 5f 76 32 5f 70 72 6f 63 2c 20 28  epare_v2_proc, (
0f90: 76 6f 69 64 20 2a 29 31 2c 20 30 29 3b 0a 20 20  void *)1, 0);.  
0fa0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
0fb0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 0a 20 20  mand(interp, .  
0fc0: 20 20 20 20 22 73 71 6c 69 74 65 33 5f 6e 6f 6e      "sqlite3_non
0fd0: 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65  blocking_prepare
0fe0: 5f 76 32 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70  _v2", blocking_p
0ff0: 72 65 70 61 72 65 5f 76 32 5f 70 72 6f 63 2c 20  repare_v2_proc, 
1000: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
1010: 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
1020: 28 69 6e 74 65 72 70 29 3b 0a 20 20 53 71 6c 69  (interp);.  Sqli
1030: 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69  tetest_mutex_Ini
1040: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 53 71 6c  t(interp);.  Sql
1050: 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
1060: 29 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45  );..  rc = Tcl_E
1070: 76 61 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 7a  val(interp, p->z
1080: 53 63 72 69 70 74 29 3b 0a 20 20 70 52 65 73 20  Script);.  pRes 
1090: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
10a0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 70 4c  lt(interp);.  pL
10b0: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ist = Tcl_NewObj
10c0: 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ();.  Tcl_IncrRe
10d0: 66 43 6f 75 6e 74 28 70 4c 69 73 74 29 3b 0a 20  fCount(pList);. 
10e0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
10f0: 74 28 70 52 65 73 29 3b 0a 0a 20 20 69 66 28 20  t(pRes);..  if( 
1100: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc!=TCL_OK ){.  
1110: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1120: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1130: 70 2c 20 70 4c 69 73 74 2c 20 54 63 6c 5f 4e 65  p, pList, Tcl_Ne
1140: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f  wStringObj("erro
1150: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  r", -1));.    Tc
1160: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1170: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
1180: 4c 69 73 74 2c 20 70 52 65 73 29 3b 0a 20 20 20  List, pRes);.   
1190: 20 70 6f 73 74 54 6f 50 61 72 65 6e 74 28 70 2c   postToParent(p,
11a0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 54 63 6c   pList);.    Tcl
11b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4c  _DecrRefCount(pL
11c0: 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ist);.    pList 
11d0: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
11e0: 20 20 7d 0a 0a 20 20 54 63 6c 5f 4c 69 73 74 4f    }..  Tcl_ListO
11f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1200: 69 6e 74 65 72 70 2c 20 70 4c 69 73 74 2c 20 54  interp, pList, T
1210: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1220: 22 73 65 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54  "set", -1));.  T
1230: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1240: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1250: 70 4c 69 73 74 2c 20 54 63 6c 5f 4e 65 77 53 74  pList, Tcl_NewSt
1260: 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 56 61 72 6e  ringObj(p->zVarn
1270: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ame, -1));.  Tcl
1280: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1290: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 4c  ement(interp, pL
12a0: 69 73 74 2c 20 70 52 65 73 29 3b 0a 20 20 70 6f  ist, pRes);.  po
12b0: 73 74 54 6f 50 61 72 65 6e 74 28 70 2c 20 70 4c  stToParent(p, pL
12c0: 69 73 74 29 3b 0a 0a 20 20 63 6b 66 72 65 65 28  ist);..  ckfree(
12d0: 28 76 6f 69 64 20 2a 29 70 29 3b 0a 20 20 54 63  (void *)p);.  Tc
12e0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
12f0: 4c 69 73 74 29 3b 0a 20 20 54 63 6c 5f 44 65 63  List);.  Tcl_Dec
1300: 72 52 65 66 43 6f 75 6e 74 28 70 52 65 73 29 3b  rRefCount(pRes);
1310: 0a 20 20 54 63 6c 5f 44 65 6c 65 74 65 49 6e 74  .  Tcl_DeleteInt
1320: 65 72 70 28 69 6e 74 65 72 70 29 3b 0a 20 20 77  erp(interp);.  w
1330: 68 69 6c 65 28 20 54 63 6c 5f 44 6f 4f 6e 65 45  hile( Tcl_DoOneE
1340: 76 65 6e 74 28 54 43 4c 5f 41 4c 4c 5f 45 56 45  vent(TCL_ALL_EVE
1350: 4e 54 53 7c 54 43 4c 5f 44 4f 4e 54 5f 57 41 49  NTS|TCL_DONT_WAI
1360: 54 29 20 29 3b 0a 20 20 54 63 6c 5f 45 78 69 74  T) );.  Tcl_Exit
1370: 54 68 72 65 61 64 28 30 29 3b 0a 20 20 54 43 4c  Thread(0);.  TCL
1380: 5f 54 48 52 45 41 44 5f 43 52 45 41 54 45 5f 52  _THREAD_CREATE_R
1390: 45 54 55 52 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ETURN;.}../*.** 
13a0: 73 71 6c 74 68 72 65 61 64 20 73 70 61 77 6e 20  sqlthread spawn 
13b0: 56 41 52 4e 41 4d 45 20 53 43 52 49 50 54 0a 2a  VARNAME SCRIPT.*
13c0: 2a 0a 2a 2a 20 20 20 20 20 53 70 61 77 6e 20 61  *.**     Spawn a
13d0: 20 6e 65 77 20 74 68 72 65 61 64 20 77 69 74 68   new thread with
13e0: 20 69 74 73 20 6f 77 6e 20 54 63 6c 20 69 6e 74   its own Tcl int
13f0: 65 72 70 72 65 74 65 72 20 61 6e 64 20 72 75 6e  erpreter and run
1400: 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 70 65 63   the.**     spec
1410: 69 66 69 65 64 20 53 43 52 49 50 54 28 73 29 20  ified SCRIPT(s) 
1420: 69 6e 20 69 74 2e 20 54 68 65 20 74 68 72 65 61  in it. The threa
1430: 64 20 74 65 72 6d 69 6e 61 74 65 73 20 61 66 74  d terminates aft
1440: 65 72 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 20 20  er running.**   
1450: 20 20 74 68 65 20 73 63 72 69 70 74 2e 20 54 68    the script. Th
1460: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
1470: 73 63 72 69 70 74 20 69 73 20 73 74 6f 72 65 64  script is stored
1480: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
1490: 0a 2a 2a 20 20 20 20 20 56 41 52 4e 41 4d 45 2e  .**     VARNAME.
14a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 63  .**.**     The c
14b0: 61 6c 6c 65 72 20 63 61 6e 20 77 61 69 74 20 66  aller can wait f
14c0: 6f 72 20 74 68 65 20 73 63 72 69 70 74 20 74 6f  or the script to
14d0: 20 74 65 72 6d 69 6e 61 74 65 20 75 73 69 6e 67   terminate using
14e0: 20 5b 76 77 61 69 74 20 56 41 52 4e 41 4d 45 5d   [vwait VARNAME]
14f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1500: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
1510: 6c 74 68 72 65 61 64 5f 73 70 61 77 6e 28 0a 20  lthread_spawn(. 
1520: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
1530: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1540: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1550: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1560: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1570: 5d 0a 29 7b 0a 20 20 54 63 6c 5f 54 68 72 65 61  ].){.  Tcl_Threa
1580: 64 49 64 20 78 3b 0a 20 20 53 71 6c 54 68 72 65  dId x;.  SqlThre
1590: 61 64 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  ad *pNew;.  int 
15a0: 72 63 3b 0a 0a 20 20 69 6e 74 20 6e 56 61 72 6e  rc;..  int nVarn
15b0: 61 6d 65 3b 20 63 68 61 72 20 2a 7a 56 61 72 6e  ame; char *zVarn
15c0: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 53 63 72 69  ame;.  int nScri
15d0: 70 74 3b 20 63 68 61 72 20 2a 7a 53 63 72 69 70  pt; char *zScrip
15e0: 74 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74  t;..  /* Paramet
15f0: 65 72 73 20 66 6f 72 20 74 68 72 65 61 64 20 63  ers for thread c
1600: 72 65 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  reation */.  con
1610: 73 74 20 69 6e 74 20 6e 53 74 61 63 6b 20 3d 20  st int nStack = 
1620: 54 43 4c 5f 54 48 52 45 41 44 5f 53 54 41 43 4b  TCL_THREAD_STACK
1630: 5f 44 45 46 41 55 4c 54 3b 0a 20 20 63 6f 6e 73  _DEFAULT;.  cons
1640: 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43  t int flags = TC
1650: 4c 5f 54 48 52 45 41 44 5f 4e 4f 46 4c 41 47 53  L_THREAD_NOFLAGS
1660: 3b 0a 0a 20 20 61 73 73 65 72 74 28 6f 62 6a 63  ;..  assert(objc
1670: 3d 3d 34 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ==4);.  UNUSED_P
1680: 41 52 41 4d 45 54 45 52 28 63 6c 69 65 6e 74 44  ARAMETER(clientD
1690: 61 74 61 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ata);.  UNUSED_P
16a0: 41 52 41 4d 45 54 45 52 28 6f 62 6a 63 29 3b 0a  ARAMETER(objc);.
16b0: 0a 20 20 7a 56 61 72 6e 61 6d 65 20 3d 20 54 63  .  zVarname = Tc
16c0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
16d0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 56 61  bj(objv[2], &nVa
16e0: 72 6e 61 6d 65 29 3b 0a 20 20 7a 53 63 72 69 70  rname);.  zScrip
16f0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
1700: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
1710: 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 0a 20 20  , &nScript);..  
1720: 70 4e 65 77 20 3d 20 28 53 71 6c 54 68 72 65 61  pNew = (SqlThrea
1730: 64 20 2a 29 63 6b 61 6c 6c 6f 63 28 73 69 7a 65  d *)ckalloc(size
1740: 6f 66 28 53 71 6c 54 68 72 65 61 64 29 2b 6e 56  of(SqlThread)+nV
1750: 61 72 6e 61 6d 65 2b 6e 53 63 72 69 70 74 2b 32  arname+nScript+2
1760: 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 56 61 72 6e  );.  pNew->zVarn
1770: 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ame = (char *)&p
1780: 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d 3e  New[1];.  pNew->
1790: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 20  zScript = (char 
17a0: 2a 29 26 70 4e 65 77 2d 3e 7a 56 61 72 6e 61 6d  *)&pNew->zVarnam
17b0: 65 5b 6e 56 61 72 6e 61 6d 65 2b 31 5d 3b 0a 20  e[nVarname+1];. 
17c0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 56   memcpy(pNew->zV
17d0: 61 72 6e 61 6d 65 2c 20 7a 56 61 72 6e 61 6d 65  arname, zVarname
17e0: 2c 20 6e 56 61 72 6e 61 6d 65 2b 31 29 3b 0a 20  , nVarname+1);. 
17f0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 53   memcpy(pNew->zS
1800: 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c 20  cript, zScript, 
1810: 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 70 4e  nScript+1);.  pN
1820: 65 77 2d 3e 70 61 72 65 6e 74 20 3d 20 54 63 6c  ew->parent = Tcl
1830: 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61  _GetCurrentThrea
1840: 64 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 6e 74  d();.  pNew->int
1850: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20  erp = interp;.. 
1860: 20 72 63 20 3d 20 54 63 6c 5f 43 72 65 61 74 65   rc = Tcl_Create
1870: 54 68 72 65 61 64 28 26 78 2c 20 74 63 6c 53 63  Thread(&x, tclSc
1880: 72 69 70 74 54 68 72 65 61 64 2c 20 28 76 6f 69  riptThread, (voi
1890: 64 20 2a 29 70 4e 65 77 2c 20 6e 53 74 61 63 6b  d *)pNew, nStack
18a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
18b0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc!=TCL_OK ){.  
18c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
18e0: 72 20 69 6e 20 54 63 6c 5f 43 72 65 61 74 65 54  r in Tcl_CreateT
18f0: 68 72 65 61 64 28 29 22 2c 20 30 29 3b 0a 20 20  hread()", 0);.  
1900: 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a    ckfree((char *
1910: 29 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75  )pNew);.    retu
1920: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1930: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
1940: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  OK;.}../*.** sql
1950: 74 68 72 65 61 64 20 70 61 72 65 6e 74 20 53 43  thread parent SC
1960: 52 49 50 54 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54  RIPT.**.**     T
1970: 68 69 73 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  his can be calle
1980: 64 20 62 79 20 73 70 61 77 6e 65 64 20 74 68 72  d by spawned thr
1990: 65 61 64 73 20 6f 6e 6c 79 2e 20 49 74 20 73 65  eads only. It se
19a0: 6e 64 73 20 74 68 65 20 73 70 65 63 69 66 69 65  nds the specifie
19b0: 64 0a 2a 2a 20 20 20 20 20 73 63 72 69 70 74 20  d.**     script 
19c0: 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65  back to the pare
19d0: 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20 65 78  nt thread for ex
19e0: 65 63 75 74 69 6f 6e 2e 20 54 68 65 20 72 65 73  ecution. The res
19f0: 75 6c 74 20 6f 66 0a 2a 2a 20 20 20 20 20 65 76  ult of.**     ev
1a00: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 53 43 52  aluating the SCR
1a10: 49 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  IPT is returned.
1a20: 20 54 68 65 20 70 61 72 65 6e 74 20 74 68 72 65   The parent thre
1a30: 61 64 20 6d 75 73 74 20 65 6e 74 65 72 0a 2a 2a  ad must enter.**
1a40: 20 20 20 20 20 74 68 65 20 65 76 65 6e 74 20 6c       the event l
1a50: 6f 6f 70 20 66 6f 72 20 74 68 69 73 20 74 6f 20  oop for this to 
1a60: 77 6f 72 6b 20 2d 20 6f 74 68 65 72 77 69 73 65  work - otherwise
1a70: 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
1a80: 0a 2a 2a 20 20 20 20 20 62 6c 6f 63 6b 20 69 6e  .**     block in
1a90: 64 65 66 69 6e 69 74 65 6c 79 2e 0a 2a 2a 0a 2a  definitely..**.*
1aa0: 2a 20 20 20 20 20 4e 4f 54 45 3a 20 41 74 20 74  *     NOTE: At t
1ab0: 68 65 20 6d 6f 6d 65 6e 74 2c 20 74 68 69 73 20  he moment, this 
1ac0: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2e 20 46 49  doesn't work. FI
1ad0: 58 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  XME..*/.static i
1ae0: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1af0: 20 73 71 6c 74 68 72 65 61 64 5f 70 61 72 65 6e   sqlthread_paren
1b00: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1b10: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1b20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b30: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1b40: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1b50: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 45 76 61 6c 45  bjv[].){.  EvalE
1b60: 76 65 6e 74 20 2a 70 45 76 65 6e 74 3b 0a 20 20  vent *pEvent;.  
1b70: 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e  char *zMsg;.  in
1b80: 74 20 6e 4d 73 67 3b 0a 20 20 53 71 6c 54 68 72  t nMsg;.  SqlThr
1b90: 65 61 64 20 2a 70 20 3d 20 28 53 71 6c 54 68 72  ead *p = (SqlThr
1ba0: 65 61 64 20 2a 29 63 6c 69 65 6e 74 44 61 74 61  ead *)clientData
1bb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 6f 62 6a 63  ;..  assert(objc
1bc0: 3d 3d 33 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ==3);.  UNUSED_P
1bd0: 41 52 41 4d 45 54 45 52 28 6f 62 6a 63 29 3b 0a  ARAMETER(objc);.
1be0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
1bf0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1c00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
1c10: 70 61 72 65 6e 74 20 74 68 72 65 61 64 22 2c 20  parent thread", 
1c20: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1c30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1c40: 20 7a 4d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53   zMsg = Tcl_GetS
1c50: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
1c60: 76 5b 32 5d 2c 20 26 6e 4d 73 67 29 3b 0a 20 20  v[2], &nMsg);.  
1c70: 70 45 76 65 6e 74 20 3d 20 28 45 76 61 6c 45 76  pEvent = (EvalEv
1c80: 65 6e 74 20 2a 29 63 6b 61 6c 6c 6f 63 28 73 69  ent *)ckalloc(si
1c90: 7a 65 6f 66 28 45 76 61 6c 45 76 65 6e 74 29 2b  zeof(EvalEvent)+
1ca0: 6e 4d 73 67 2b 31 29 3b 0a 20 20 70 45 76 65 6e  nMsg+1);.  pEven
1cb0: 74 2d 3e 62 61 73 65 2e 6e 65 78 74 50 74 72 20  t->base.nextPtr 
1cc0: 3d 20 30 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 62  = 0;.  pEvent->b
1cd0: 61 73 65 2e 70 72 6f 63 20 3d 20 74 63 6c 53 63  ase.proc = tclSc
1ce0: 72 69 70 74 45 76 65 6e 74 3b 0a 20 20 70 45 76  riptEvent;.  pEv
1cf0: 65 6e 74 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28  ent->zScript = (
1d00: 63 68 61 72 20 2a 29 26 70 45 76 65 6e 74 5b 31  char *)&pEvent[1
1d10: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 45 76 65  ];.  memcpy(pEve
1d20: 6e 74 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 4d 73  nt->zScript, zMs
1d30: 67 2c 20 6e 4d 73 67 2b 31 29 3b 0a 20 20 70 45  g, nMsg+1);.  pE
1d40: 76 65 6e 74 2d 3e 69 6e 74 65 72 70 20 3d 20 70  vent->interp = p
1d50: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f  ->interp;.  Tcl_
1d60: 54 68 72 65 61 64 51 75 65 75 65 45 76 65 6e 74  ThreadQueueEvent
1d70: 28 70 2d 3e 70 61 72 65 6e 74 2c 20 28 54 63 6c  (p->parent, (Tcl
1d80: 5f 45 76 65 6e 74 20 2a 29 70 45 76 65 6e 74 2c  _Event *)pEvent,
1d90: 20 54 43 4c 5f 51 55 45 55 45 5f 54 41 49 4c 29   TCL_QUEUE_TAIL)
1da0: 3b 0a 20 20 54 63 6c 5f 54 68 72 65 61 64 41 6c  ;.  Tcl_ThreadAl
1db0: 65 72 74 28 70 2d 3e 70 61 72 65 6e 74 29 3b 0a  ert(p->parent);.
1dc0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1dd0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1de0: 78 42 75 73 79 28 76 6f 69 64 20 2a 70 41 72 67  xBusy(void *pArg
1df0: 2c 20 69 6e 74 20 6e 42 75 73 79 29 7b 0a 20 20  , int nBusy){.  
1e00: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1e10: 28 70 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44  (pArg);.  UNUSED
1e20: 5f 50 41 52 41 4d 45 54 45 52 28 6e 42 75 73 79  _PARAMETER(nBusy
1e30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6c 65  );.  sqlite3_sle
1e40: 65 70 28 35 30 29 3b 0a 20 20 72 65 74 75 72 6e  ep(50);.  return
1e50: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1e60: 2f 2a 20 54 72 79 20 61 67 61 69 6e 2e 2e 2e 20  /* Try again... 
1e70: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 74  */.}../*.** sqlt
1e80: 68 72 65 61 64 20 6f 70 65 6e 0a 2a 2a 0a 2a 2a  hread open.**.**
1e90: 20 20 20 20 20 4f 70 65 6e 20 61 20 64 61 74 61       Open a data
1ea0: 62 61 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20  base handle and 
1eb0: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e  return the strin
1ec0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
1ed0: 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 70   of.**     the p
1ee0: 6f 69 6e 74 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  ointer value..*/
1ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1f00: 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 74 68 72  TE_TCLAPI sqlthr
1f10: 65 61 64 5f 6f 70 65 6e 28 0a 20 20 43 6c 69 65  ead_open(.  Clie
1f20: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
1f30: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1f40: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1f50: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1f60: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1f70: 20 20 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73    int sqlite3Tes
1f80: 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1f90: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1fa0: 72 70 2c 20 63 68 61 72 20 2a 7a 50 74 72 2c 20  rp, char *zPtr, 
1fb0: 76 6f 69 64 20 2a 70 29 3b 0a 0a 20 20 63 6f 6e  void *p);..  con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1fd0: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
1fe0: 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  b;.  char zBuf[1
1ff0: 30 30 5d 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  00];.  extern in
2000: 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73  t Md5_Register(s
2010: 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2020: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2030: 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 0a 20 20  _routines*);..  
2040: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2050: 28 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20 20  (clientData);.  
2060: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2070: 28 6f 62 6a 63 29 3b 0a 0a 20 20 7a 46 69 6c 65  (objc);..  zFile
2080: 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  name = Tcl_GetSt
2090: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
20a0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
20b0: 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 23  ilename, &db);.#
20c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
20d0: 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 64 62 20  _CODEC.  if( db 
20e0: 26 26 20 6f 62 6a 63 3e 3d 34 20 29 7b 0a 20 20  && objc>=4 ){.  
20f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
2100: 65 79 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  ey;.    int nKey
2110: 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
2120: 20 20 7a 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    zKey = Tcl_Get
2130: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
2140: 6a 76 5b 33 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20  jv[3], &nKey);. 
2150: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2160: 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b  key(db, zKey, nK
2170: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ey);.    if( rc!
2180: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2190: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
21a0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
21b0: 6e 74 66 28 22 65 72 72 6f 72 20 25 64 3a 20 25  ntf("error %d: %
21c0: 73 22 2c 20 72 63 2c 20 73 71 6c 69 74 65 33 5f  s", rc, sqlite3_
21d0: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
21e0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
21f0: 28 64 62 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  (db);.      Tcl_
2200: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2210: 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 28 63  erp, zErrMsg, (c
2220: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73  har*)0);.      s
2230: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2240: 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Msg);.      retu
2250: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2260: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
2270: 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 64 62   Md5_Register(db
2280: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
2290: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
22a0: 64 62 2c 20 78 42 75 73 79 2c 20 30 29 3b 0a 20  db, xBusy, 0);. 
22b0: 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
22c0: 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
22d0: 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
22e0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
22f0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
2300: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2310: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 0a 20 20  p, zBuf, 0);..  
2320: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2330: 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 74 68 72 65  .../*.** sqlthre
2340: 61 64 20 6f 70 65 6e 0a 2a 2a 0a 2a 2a 20 20 20  ad open.**.**   
2350: 20 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72    Return the cur
2360: 72 65 6e 74 20 74 68 72 65 61 64 2d 69 64 20 28  rent thread-id (
2370: 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68  Tcl_GetCurrentTh
2380: 72 65 61 64 28 29 29 20 63 61 73 74 20 74 6f 0a  read()) cast to.
2390: 2a 2a 20 20 20 20 20 61 6e 20 69 6e 74 65 67 65  **     an intege
23a0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
23b0: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73   SQLITE_TCLAPI s
23c0: 71 6c 74 68 72 65 61 64 5f 69 64 28 0a 20 20 43  qlthread_id(.  C
23d0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
23e0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
23f0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2400: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2410: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2420: 29 7b 0a 20 20 54 63 6c 5f 54 68 72 65 61 64 49  ){.  Tcl_ThreadI
2430: 64 20 69 64 20 3d 20 54 63 6c 5f 47 65 74 43 75  d id = Tcl_GetCu
2440: 72 72 65 6e 74 54 68 72 65 61 64 28 29 3b 0a 20  rrentThread();. 
2450: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2460: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2470: 77 49 6e 74 4f 62 6a 28 53 51 4c 49 54 45 5f 50  wIntObj(SQLITE_P
2480: 54 52 5f 54 4f 5f 49 4e 54 28 69 64 29 29 29 3b  TR_TO_INT(id)));
2490: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
24a0: 54 45 52 28 63 6c 69 65 6e 74 44 61 74 61 29 3b  TER(clientData);
24b0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
24c0: 54 45 52 28 6f 62 6a 63 29 3b 0a 20 20 55 4e 55  TER(objc);.  UNU
24d0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 62  SED_PARAMETER(ob
24e0: 6a 76 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  jv);.  return TC
24f0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
2500: 44 69 73 70 61 74 63 68 20 72 6f 75 74 69 6e 65  Dispatch routine
2510: 20 66 6f 72 20 74 68 65 20 73 75 62 2d 63 6f 6d   for the sub-com
2520: 6d 61 6e 64 73 20 6f 66 20 5b 73 71 6c 74 68 72  mands of [sqlthr
2530: 65 61 64 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ead]..*/.static 
2540: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2550: 49 20 73 71 6c 74 68 72 65 61 64 5f 70 72 6f 63  I sqlthread_proc
2560: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2570: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2580: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2590: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
25a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
25b0: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74  jv[].){.  struct
25c0: 20 53 75 62 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20   SubCommand {.  
25d0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
25e0: 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f     Tcl_ObjCmdPro
25f0: 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 69 6e  c *xProc;.    in
2600: 74 20 6e 41 72 67 3b 0a 20 20 20 20 63 68 61 72  t nArg;.    char
2610: 20 2a 7a 55 73 61 67 65 3b 0a 20 20 7d 20 61 53   *zUsage;.  } aS
2620: 75 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 70  ub[] = {.    {"p
2630: 61 72 65 6e 74 22 2c 20 73 71 6c 74 68 72 65 61  arent", sqlthrea
2640: 64 5f 70 61 72 65 6e 74 2c 20 31 2c 20 22 53 43  d_parent, 1, "SC
2650: 52 49 50 54 22 7d 2c 0a 20 20 20 20 7b 22 73 70  RIPT"},.    {"sp
2660: 61 77 6e 22 2c 20 20 73 71 6c 74 68 72 65 61 64  awn",  sqlthread
2670: 5f 73 70 61 77 6e 2c 20 20 32 2c 20 22 56 41 52  _spawn,  2, "VAR
2680: 4e 41 4d 45 20 53 43 52 49 50 54 22 7d 2c 0a 20  NAME SCRIPT"},. 
2690: 20 20 20 7b 22 6f 70 65 6e 22 2c 20 20 20 73 71     {"open",   sq
26a0: 6c 74 68 72 65 61 64 5f 6f 70 65 6e 2c 20 20 20  lthread_open,   
26b0: 31 2c 20 22 44 42 4e 41 4d 45 22 7d 2c 0a 20 20  1, "DBNAME"},.  
26c0: 20 20 7b 22 69 64 22 2c 20 20 20 20 20 73 71 6c    {"id",     sql
26d0: 74 68 72 65 61 64 5f 69 64 2c 20 20 20 20 20 30  thread_id,     0
26e0: 2c 20 22 22 7d 2c 0a 20 20 20 20 7b 30 2c 20 30  , ""},.    {0, 0
26f0: 2c 20 30 7d 0a 20 20 7d 3b 0a 20 20 73 74 72 75  , 0}.  };.  stru
2700: 63 74 20 53 75 62 43 6f 6d 6d 61 6e 64 20 2a 70  ct SubCommand *p
2710: 53 75 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Sub;.  int rc;. 
2720: 20 69 6e 74 20 69 49 6e 64 65 78 3b 0a 0a 20 20   int iIndex;..  
2730: 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
2740: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2750: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2760: 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44  jv, "SUB-COMMAND
2770: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2780: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2790: 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64   rc = Tcl_GetInd
27a0: 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28  exFromObjStruct(
27b0: 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 6f  .      interp, o
27c0: 62 6a 76 5b 31 5d 2c 20 61 53 75 62 2c 20 73 69  bjv[1], aSub, si
27d0: 7a 65 6f 66 28 61 53 75 62 5b 30 5d 29 2c 20 22  zeof(aSub[0]), "
27e0: 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c  sub-command", 0,
27f0: 20 26 69 49 6e 64 65 78 0a 20 20 29 3b 0a 20 20   &iIndex.  );.  
2800: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29  if( rc!=TCL_OK )
2810: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 53   return rc;.  pS
2820: 75 62 20 3d 20 26 61 53 75 62 5b 69 49 6e 64 65  ub = &aSub[iInde
2830: 78 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c  x];..  if( objc<
2840: 28 70 53 75 62 2d 3e 6e 41 72 67 2b 32 29 20 29  (pSub->nArg+2) )
2850: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2860: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
2870: 2c 20 6f 62 6a 76 2c 20 70 53 75 62 2d 3e 7a 55  , objv, pSub->zU
2880: 73 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  sage);.    retur
2890: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28a0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 53 75 62 2d  ..  return pSub-
28b0: 3e 78 50 72 6f 63 28 63 6c 69 65 6e 74 44 61 74  >xProc(clientDat
28c0: 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  a, interp, objc,
28d0: 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   objv);.}../*.**
28e0: 20 54 68 65 20 5b 63 6c 6f 63 6b 5f 73 65 63 6f   The [clock_seco
28f0: 6e 64 73 5d 20 63 6f 6d 6d 61 6e 64 2e 20 54 68  nds] command. Th
2900: 69 73 20 69 73 20 6d 6f 72 65 20 6f 72 20 6c 65  is is more or le
2910: 73 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  ss the same as t
2920: 68 65 0a 2a 2a 20 72 65 67 75 6c 61 72 20 74 63  he.** regular tc
2930: 6c 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  l [clock seconds
2940: 5d 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ], except that i
2950: 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  t is available i
2960: 6e 20 74 65 73 74 66 69 78 74 75 72 65 0a 2a 2a  n testfixture.**
2970: 20 77 68 65 6e 20 6c 69 6e 6b 65 64 20 61 67 61   when linked aga
2980: 69 6e 73 74 20 62 6f 74 68 20 54 63 6c 20 38 2e  inst both Tcl 8.
2990: 34 20 61 6e 64 20 38 2e 35 2e 20 42 65 63 61 75  4 and 8.5. Becau
29a0: 73 65 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  se [clock second
29b0: 73 5d 20 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65  s] is.** impleme
29c0: 6e 74 65 64 20 61 73 20 61 20 73 63 72 69 70 74  nted as a script
29d0: 20 69 6e 20 54 63 6c 20 38 2e 35 2c 20 69 74 20   in Tcl 8.5, it 
29e0: 69 73 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 61  is not usually a
29f0: 76 61 69 6c 61 62 6c 65 20 74 6f 0a 2a 2a 20 74  vailable to.** t
2a00: 65 73 74 66 69 78 74 75 72 65 2e 0a 2a 2f 20 0a  estfixture..*/ .
2a10: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2a20: 45 5f 54 43 4c 41 50 49 20 63 6c 6f 63 6b 5f 73  E_TCLAPI clock_s
2a30: 65 63 6f 6e 64 73 5f 70 72 6f 63 28 0a 20 20 43  econds_proc(.  C
2a40: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2a50: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2a60: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2a70: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2a80: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2a90: 29 7b 0a 20 20 54 63 6c 5f 54 69 6d 65 20 6e 6f  ){.  Tcl_Time no
2aa0: 77 3b 0a 20 20 54 63 6c 5f 47 65 74 54 69 6d 65  w;.  Tcl_GetTime
2ab0: 28 26 6e 6f 77 29 3b 0a 20 20 54 63 6c 5f 53 65  (&now);.  Tcl_Se
2ac0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2ad0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
2ae0: 28 6e 6f 77 2e 73 65 63 29 29 3b 0a 20 20 55 4e  (now.sec));.  UN
2af0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 63  USED_PARAMETER(c
2b00: 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20 20 55 4e  lientData);.  UN
2b10: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f  USED_PARAMETER(o
2b20: 62 6a 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  bjc);.  UNUSED_P
2b30: 41 52 41 4d 45 54 45 52 28 6f 62 6a 76 29 3b 0a  ARAMETER(objv);.
2b40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2b50: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
2b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2ba0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 6e  * This block con
2bb0: 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
2bc0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2bd0: 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e  [sqlite3_blockin
2be0: 67 5f 73 74 65 70 5d 0a 2a 2a 20 63 6f 6d 6d 61  g_step].** comma
2bf0: 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  nd available to 
2c00: 74 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20  threads created 
2c10: 62 79 20 5b 73 71 6c 74 68 72 65 61 64 20 73 70  by [sqlthread sp
2c20: 61 77 6e 5d 20 63 6f 6d 6d 61 6e 64 73 2e 20 49  awn] commands. I
2c30: 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 76 61  t.** is only ava
2c40: 69 6c 61 62 6c 65 20 6f 6e 20 55 4e 49 58 20 66  ilable on UNIX f
2c50: 6f 72 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  or now. This is 
2c60: 62 65 63 61 75 73 65 20 70 74 68 72 65 61 64 20  because pthread 
2c70: 63 6f 6e 64 69 74 69 6f 6e 0a 2a 2a 20 76 61 72  condition.** var
2c80: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 2e  iables are used.
2c90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 75 72 63  .**.** The sourc
2ca0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 43  e code for the C
2cb0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74   functions sqlit
2cc0: 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70  e3_blocking_step
2cd0: 28 29 2c 0a 2a 2a 20 62 6c 6f 63 6b 69 6e 67 5f  (),.** blocking_
2ce0: 73 74 65 70 5f 6e 6f 74 69 66 79 28 29 20 61 6e  step_notify() an
2cf0: 64 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  d the structure 
2d00: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61 74 69  UnlockNotificati
2d10: 6f 6e 20 69 73 0a 2a 2a 20 61 75 74 6f 6d 61 74  on is.** automat
2d20: 69 63 61 6c 6c 79 20 65 78 74 72 61 63 74 65 64  ically extracted
2d30: 20 66 72 6f 6d 20 74 68 69 73 20 66 69 6c 65 20   from this file 
2d40: 61 6e 64 20 75 73 65 64 20 61 73 20 70 61 72 74  and used as part
2d50: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 6f 63 75 6d   of the.** docum
2d60: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  entation for the
2d70: 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f   sqlite3_unlock_
2d80: 6e 6f 74 69 66 79 28 29 20 41 50 49 20 66 75 6e  notify() API fun
2d90: 63 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 73  ction. This.** s
2da0: 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65  hould be conside
2db0: 72 65 64 20 69 66 20 74 68 65 73 65 20 66 75 6e  red if these fun
2dc0: 63 74 69 6f 6e 73 20 61 72 65 20 74 6f 20 62 65  ctions are to be
2dd0: 20 65 78 74 65 6e 64 65 64 20 28 69 2e 65 2e 20   extended (i.e. 
2de0: 74 6f 20 0a 2a 2a 20 73 75 70 70 6f 72 74 20 77  to .** support w
2df0: 69 6e 64 6f 77 73 29 20 69 6e 20 74 68 65 20 66  indows) in the f
2e00: 75 74 75 72 65 2e 0a 2a 2f 20 0a 23 69 66 20 53  uture..*/ .#if S
2e10: 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26  QLITE_OS_UNIX &&
2e20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2e30: 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
2e40: 54 49 46 59 29 0a 0a 2f 2a 20 42 45 47 49 4e 5f  TIFY)../* BEGIN_
2e50: 53 51 4c 49 54 45 5f 42 4c 4f 43 4b 49 4e 47 5f  SQLITE_BLOCKING_
2e60: 53 54 45 50 20 2a 2f 0a 2f 2a 20 54 68 69 73 20  STEP */./* This 
2e70: 65 78 61 6d 70 6c 65 20 75 73 65 73 20 74 68 65  example uses the
2e80: 20 70 74 68 72 65 61 64 73 20 41 50 49 20 2a 2f   pthreads API */
2e90: 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  .#include <pthre
2ea0: 61 64 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 70  ad.h>../*.** A p
2eb0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2ec0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
2ed0: 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73 65  ructure is passe
2ee0: 64 20 61 73 20 74 68 65 20 75 73 65 72 2d 63 6f  d as the user-co
2ef0: 6e 74 65 78 74 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntext.** pointer
2f00: 20 77 68 65 6e 20 72 65 67 69 73 74 65 72 69 6e   when registerin
2f10: 67 20 66 6f 72 20 61 6e 20 75 6e 6c 6f 63 6b 2d  g for an unlock-
2f20: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 2e  notify callback.
2f30: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2f40: 63 74 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63  ct UnlockNotific
2f50: 61 74 69 6f 6e 20 55 6e 6c 6f 63 6b 4e 6f 74 69  ation UnlockNoti
2f60: 66 69 63 61 74 69 6f 6e 3b 0a 73 74 72 75 63 74  fication;.struct
2f70: 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61 74   UnlockNotificat
2f80: 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 66 69 72 65  ion {.  int fire
2f90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2fb0: 75 65 20 61 66 74 65 72 20 75 6e 6c 6f 63 6b 20  ue after unlock 
2fc0: 65 76 65 6e 74 20 68 61 73 20 6f 63 63 75 72 72  event has occurr
2fd0: 65 64 20 2a 2f 0a 20 20 70 74 68 72 65 61 64 5f  ed */.  pthread_
2fe0: 63 6f 6e 64 5f 74 20 63 6f 6e 64 3b 20 20 20 20  cond_t cond;    
2ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3000: 6e 64 69 74 69 6f 6e 20 76 61 72 69 61 62 6c 65  ndition variable
3010: 20 74 6f 20 77 61 69 74 20 6f 6e 20 2a 2f 0a 20   to wait on */. 
3020: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74   pthread_mutex_t
3030: 20 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20   mutex;         
3040: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
3050: 70 72 6f 74 65 63 74 20 73 74 72 75 63 74 75 72  protect structur
3060: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
3070: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3080: 61 6e 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  an unlock-notify
3090: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
30a0: 65 72 65 64 20 77 69 74 68 20 53 51 4c 69 74 65  ered with SQLite
30b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
30c0: 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63   unlock_notify_c
30d0: 62 28 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20  b(void **apArg, 
30e0: 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74  int nArg){.  int
30f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
3100: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
3110: 20 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61 74   UnlockNotificat
3120: 69 6f 6e 20 2a 70 20 3d 20 28 55 6e 6c 6f 63 6b  ion *p = (Unlock
3130: 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20 2a 29 61  Notification *)a
3140: 70 41 72 67 5b 69 5d 3b 0a 20 20 20 20 70 74 68  pArg[i];.    pth
3150: 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
3160: 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  &p->mutex);.    
3170: 70 2d 3e 66 69 72 65 64 20 3d 20 31 3b 0a 20 20  p->fired = 1;.  
3180: 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 73    pthread_cond_s
3190: 69 67 6e 61 6c 28 26 70 2d 3e 63 6f 6e 64 29 3b  ignal(&p->cond);
31a0: 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74  .    pthread_mut
31b0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e 6d 75  ex_unlock(&p->mu
31c0: 74 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  tex);.  }.}../*.
31d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31e0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e   assumes that an
31f0: 20 53 51 4c 69 74 65 20 41 50 49 20 63 61 6c 6c   SQLite API call
3200: 20 28 65 69 74 68 65 72 20 73 71 6c 69 74 65 33   (either sqlite3
3210: 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 0a 2a  _prepare_v2() .*
3220: 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 65  * or sqlite3_ste
3230: 70 28 29 29 20 68 61 73 20 6a 75 73 74 20 72 65  p()) has just re
3240: 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4c 4f  turned SQLITE_LO
3250: 43 4b 45 44 2e 20 54 68 65 20 61 72 67 75 6d 65  CKED. The argume
3260: 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 61 73 73  nt is the.** ass
3270: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
3280: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
3290: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
32a0: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 75   calls sqlite3_u
32b0: 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20 74  nlock_notify() t
32c0: 6f 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 61  o register for a
32d0: 6e 20 0a 2a 2a 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  n .** unlock-not
32e0: 69 66 79 20 63 61 6c 6c 62 61 63 6b 2c 20 74 68  ify callback, th
32f0: 65 6e 20 62 6c 6f 63 6b 73 20 75 6e 74 69 6c 20  en blocks until 
3300: 74 68 61 74 20 63 61 6c 6c 62 61 63 6b 20 69 73  that callback is
3310: 20 64 65 6c 69 76 65 72 65 64 20 0a 2a 2a 20 61   delivered .** a
3320: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
3330: 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
3340: 20 73 68 6f 75 6c 64 20 74 68 65 6e 20 72 65 74   should then ret
3350: 72 79 20 74 68 65 20 66 61 69 6c 65 64 20 6f 70  ry the failed op
3360: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f  eration..**.** O
3370: 72 2c 20 69 66 20 73 71 6c 69 74 65 33 5f 75 6e  r, if sqlite3_un
3380: 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20 69 6e  lock_notify() in
3390: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 6f 20  dicates that to 
33a0: 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 64 65 61 64  block would dead
33b0: 6c 6f 63 6b 20 0a 2a 2a 20 74 68 65 20 73 79 73  lock .** the sys
33c0: 74 65 6d 2c 20 74 68 65 6e 20 74 68 69 73 20 66  tem, then this f
33d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
33e0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 6d  SQLITE_LOCKED im
33f0: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 0a 2a  mediately. In .*
3400: 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
3410: 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f  caller should no
3420: 74 20 72 65 74 72 79 20 74 68 65 20 6f 70 65 72  t retry the oper
3430: 61 74 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64  ation and should
3440: 20 72 6f 6c 6c 20 0a 2a 2a 20 62 61 63 6b 20 74   roll .** back t
3450: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
3460: 61 63 74 69 6f 6e 20 28 69 66 20 61 6e 79 29 2e  action (if any).
3470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
3480: 61 69 74 5f 66 6f 72 5f 75 6e 6c 6f 63 6b 5f 6e  ait_for_unlock_n
3490: 6f 74 69 66 79 28 73 71 6c 69 74 65 33 20 2a 64  otify(sqlite3 *d
34a0: 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b){.  int rc;.  
34b0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 69 63 61 74 69  UnlockNotificati
34c0: 6f 6e 20 75 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 69  on un;..  /* Ini
34d0: 74 69 61 6c 69 7a 65 20 74 68 65 20 55 6e 6c 6f  tialize the Unlo
34e0: 63 6b 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20 73  ckNotification s
34f0: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 75  tructure. */.  u
3500: 6e 2e 66 69 72 65 64 20 3d 20 30 3b 0a 20 20 70  n.fired = 0;.  p
3510: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
3520: 74 28 26 75 6e 2e 6d 75 74 65 78 2c 20 30 29 3b  t(&un.mutex, 0);
3530: 0a 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f  .  pthread_cond_
3540: 69 6e 69 74 28 26 75 6e 2e 63 6f 6e 64 2c 20 30  init(&un.cond, 0
3550: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65  );..  /* Registe
3560: 72 20 66 6f 72 20 61 6e 20 75 6e 6c 6f 63 6b 2d  r for an unlock-
3570: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 2e  notify callback.
3580: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
3590: 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
35a0: 28 64 62 2c 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  (db, unlock_noti
35b0: 66 79 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29 26  fy_cb, (void *)&
35c0: 75 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  un);.  assert( r
35d0: 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  c==SQLITE_LOCKED
35e0: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
35f0: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63  K );..  /* The c
3600: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 75  all to sqlite3_u
3610: 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 29 20 61  nlock_notify() a
3620: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 69  lways returns ei
3630: 74 68 65 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ther SQLITE_LOCK
3640: 45 44 20 0a 20 20 2a 2a 20 6f 72 20 53 51 4c 49  ED .  ** or SQLI
3650: 54 45 5f 4f 4b 2e 20 0a 20 20 2a 2a 0a 20 20 2a  TE_OK. .  **.  *
3660: 2a 20 49 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  * If SQLITE_LOCK
3670: 45 44 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c  ED was returned,
3680: 20 74 68 65 6e 20 74 68 65 20 73 79 73 74 65 6d   then the system
3690: 20 69 73 20 64 65 61 64 6c 6f 63 6b 65 64 2e 20   is deadlocked. 
36a0: 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73  In this.  ** cas
36b0: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
36c0: 6e 65 65 64 73 20 74 6f 20 72 65 74 75 72 6e 20  needs to return 
36d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 74 6f  SQLITE_LOCKED to
36e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 73 6f 20 0a   the caller so .
36f0: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75    ** that the cu
3700: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
3710: 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  n can be rolled 
3720: 62 61 63 6b 2e 20 4f 74 68 65 72 77 69 73 65 2c  back. Otherwise,
3730: 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 75 6e 74 69   block.  ** unti
3740: 6c 20 74 68 65 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  l the unlock-not
3750: 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ify callback is 
3760: 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 72 65  invoked, then re
3770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
3780: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
3790: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37a0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
37b0: 63 6b 28 26 75 6e 2e 6d 75 74 65 78 29 3b 0a 20  ck(&un.mutex);. 
37c0: 20 20 20 69 66 28 20 21 75 6e 2e 66 69 72 65 64     if( !un.fired
37d0: 20 29 7b 0a 20 20 20 20 20 20 70 74 68 72 65 61   ){.      pthrea
37e0: 64 5f 63 6f 6e 64 5f 77 61 69 74 28 26 75 6e 2e  d_cond_wait(&un.
37f0: 63 6f 6e 64 2c 20 26 75 6e 2e 6d 75 74 65 78 29  cond, &un.mutex)
3800: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 68 72  ;.    }.    pthr
3810: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
3820: 28 26 75 6e 2e 6d 75 74 65 78 29 3b 0a 20 20 7d  (&un.mutex);.  }
3830: 0a 0a 20 20 2f 2a 20 44 65 73 74 72 6f 79 20 74  ..  /* Destroy t
3840: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 63 6f 6e  he mutex and con
3850: 64 69 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 73  dition variables
3860: 2e 20 2a 2f 0a 20 20 70 74 68 72 65 61 64 5f 63  . */.  pthread_c
3870: 6f 6e 64 5f 64 65 73 74 72 6f 79 28 26 75 6e 2e  ond_destroy(&un.
3880: 63 6f 6e 64 29 3b 0a 20 20 70 74 68 72 65 61 64  cond);.  pthread
3890: 5f 6d 75 74 65 78 5f 64 65 73 74 72 6f 79 28 26  _mutex_destroy(&
38a0: 75 6e 2e 6d 75 74 65 78 29 3b 0a 0a 20 20 72 65  un.mutex);..  re
38b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
38c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
38d0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
38e0: 75 6e 64 20 74 68 65 20 53 51 4c 69 74 65 20 66  und the SQLite f
38f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f  unction sqlite3_
3900: 73 74 65 70 28 29 2e 0a 2a 2a 20 49 74 20 66 75  step()..** It fu
3910: 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 73  nctions in the s
3920: 61 6d 65 20 77 61 79 20 61 73 20 73 74 65 70 28  ame way as step(
3930: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
3940: 66 20 61 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  f a required.** 
3950: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6c 6f 63  shared-cache loc
3960: 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
3970: 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ined, this funct
3980: 69 6f 6e 20 6d 61 79 20 62 6c 6f 63 6b 20 77 61  ion may block wa
3990: 69 74 69 6e 67 20 66 6f 72 0a 2a 2a 20 74 68 65  iting for.** the
39a0: 20 6c 6f 63 6b 20 74 6f 20 62 65 63 6f 6d 65 20   lock to become 
39b0: 61 76 61 69 6c 61 62 6c 65 2e 20 49 6e 20 74 68  available. In th
39c0: 69 73 20 73 63 65 6e 61 72 69 6f 20 74 68 65 20  is scenario the 
39d0: 6e 6f 72 6d 61 6c 20 41 50 49 20 73 74 65 70 28  normal API step(
39e0: 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  ).** function al
39f0: 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
3a00: 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a  ITE_LOCKED..**.*
3a10: 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
3a20: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
3a30: 45 5f 4c 4f 43 4b 45 44 2c 20 74 68 65 20 63 61  E_LOCKED, the ca
3a40: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 72 6f 6c 6c  ller should roll
3a50: 62 61 63 6b 0a 2a 2a 20 74 68 65 20 63 75 72 72  back.** the curr
3a60: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
3a70: 28 69 66 20 61 6e 79 29 20 61 6e 64 20 74 72 79  (if any) and try
3a80: 20 61 67 61 69 6e 20 6c 61 74 65 72 2e 20 4f 74   again later. Ot
3a90: 68 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a 20  herwise, the.** 
3aa0: 73 79 73 74 65 6d 20 6d 61 79 20 62 65 63 6f 6d  system may becom
3ab0: 65 20 64 65 61 64 6c 6f 63 6b 65 64 2e 0a 2a 2f  e deadlocked..*/
3ac0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .int sqlite3_blo
3ad0: 63 6b 69 6e 67 5f 73 74 65 70 28 73 71 6c 69 74  cking_step(sqlit
3ae0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
3af0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 68 69  .  int rc;.  whi
3b00: 6c 65 28 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  le( SQLITE_LOCKE
3b10: 44 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  D==(rc = sqlite3
3b20: 5f 73 74 65 70 28 70 53 74 6d 74 29 29 20 29 7b  _step(pStmt)) ){
3b30: 0a 20 20 20 20 72 63 20 3d 20 77 61 69 74 5f 66  .    rc = wait_f
3b40: 6f 72 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  or_unlock_notify
3b50: 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64  (sqlite3_db_hand
3b60: 6c 65 28 70 53 74 6d 74 29 29 3b 0a 20 20 20 20  le(pStmt));.    
3b70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3b80: 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  K ) break;.    s
3b90: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
3ba0: 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mt);.  }.  retur
3bb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
3bc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3bd0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
3be0: 20 74 68 65 20 53 51 4c 69 74 65 20 66 75 6e 63   the SQLite func
3bf0: 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 70 72 65  tion sqlite3_pre
3c00: 70 61 72 65 5f 76 32 28 29 2e 0a 2a 2a 20 49 74  pare_v2()..** It
3c10: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68   functions in th
3c20: 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 70 72  e same way as pr
3c30: 65 70 61 72 65 5f 76 32 28 29 2c 20 65 78 63 65  epare_v2(), exce
3c40: 70 74 20 74 68 61 74 20 69 66 20 61 20 72 65 71  pt that if a req
3c50: 75 69 72 65 64 0a 2a 2a 20 73 68 61 72 65 64 2d  uired.** shared-
3c60: 63 61 63 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  cache lock canno
3c70: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 74  t be obtained, t
3c80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
3c90: 20 62 6c 6f 63 6b 20 77 61 69 74 69 6e 67 20 66   block waiting f
3ca0: 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 74  or.** the lock t
3cb0: 6f 20 62 65 63 6f 6d 65 20 61 76 61 69 6c 61 62  o become availab
3cc0: 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 63 65 6e  le. In this scen
3cd0: 61 72 69 6f 20 74 68 65 20 6e 6f 72 6d 61 6c 20  ario the normal 
3ce0: 41 50 49 20 70 72 65 70 61 72 65 5f 76 32 28 29  API prepare_v2()
3cf0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  .** function alw
3d00: 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
3d10: 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a  TE_LOCKED..**.**
3d20: 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
3d30: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
3d40: 5f 4c 4f 43 4b 45 44 2c 20 74 68 65 20 63 61 6c  _LOCKED, the cal
3d50: 6c 65 72 20 73 68 6f 75 6c 64 20 72 6f 6c 6c 62  ler should rollb
3d60: 61 63 6b 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  ack.** the curre
3d70: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
3d80: 69 66 20 61 6e 79 29 20 61 6e 64 20 74 72 79 20  if any) and try 
3d90: 61 67 61 69 6e 20 6c 61 74 65 72 2e 20 4f 74 68  again later. Oth
3da0: 65 72 77 69 73 65 2c 20 74 68 65 0a 2a 2a 20 73  erwise, the.** s
3db0: 79 73 74 65 6d 20 6d 61 79 20 62 65 63 6f 6d 65  ystem may become
3dc0: 20 64 65 61 64 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a   deadlocked..*/.
3dd0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 6c 6f 63  int sqlite3_bloc
3de0: 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32 28  king_prepare_v2(
3df0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e10: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  Database handle.
3e20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3e30: 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
3e40: 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  /* UTF-8 encoded
3e50: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
3e60: 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 2c 20 20  */.  int nSql,  
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e80: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
3e90: 20 69 6e 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20   in bytes. */.  
3ea0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
3eb0: 70 53 74 6d 74 2c 20 20 20 20 2f 2a 20 4f 55 54  pStmt,    /* OUT
3ec0: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  : A pointer to t
3ed0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
3ee0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
3ef0: 20 63 68 61 72 20 2a 2a 70 7a 20 20 20 20 20 20   char **pz      
3f00: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
3f10: 20 6f 66 20 70 61 72 73 65 64 20 73 74 72 69 6e   of parsed strin
3f20: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
3f30: 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  ;.  while( SQLIT
3f40: 45 5f 4c 4f 43 4b 45 44 3d 3d 28 72 63 20 3d 20  E_LOCKED==(rc = 
3f50: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
3f60: 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 6e 53 71  v2(db, zSql, nSq
3f70: 6c 2c 20 70 70 53 74 6d 74 2c 20 70 7a 29 29 20  l, ppStmt, pz)) 
3f80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 61 69 74  ){.    rc = wait
3f90: 5f 66 6f 72 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  _for_unlock_noti
3fa0: 66 79 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  fy(db);.    if( 
3fb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3fc0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
3fd0: 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 4e 44  urn rc;.}./* END
3fe0: 5f 53 51 4c 49 54 45 5f 42 4c 4f 43 4b 49 4e 47  _SQLITE_BLOCKING
3ff0: 5f 53 54 45 50 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _STEP */../*.** 
4000: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62  Usage: sqlite3_b
4010: 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 20 53 54 4d  locking_step STM
4020: 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  T.**.** Advance 
4030: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
4040: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a   the next row..*
4050: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
4060: 49 54 45 5f 54 43 4c 41 50 49 20 62 6c 6f 63 6b  ITE_TCLAPI block
4070: 69 6e 67 5f 73 74 65 70 5f 70 72 6f 63 28 0a 20  ing_step_proc(. 
4080: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
4090: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
40a0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
40b0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
40c0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
40d0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ..  sqlite3_stmt
40e0: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
40f0: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
4100: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
4110: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
4120: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
4130: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
4140: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
4150: 20 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65   pStmt = (sqlite
4160: 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65 33 54  3_stmt*)sqlite3T
4170: 65 73 74 54 65 78 74 54 6f 50 74 72 28 54 63 6c  estTextToPtr(Tcl
4180: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
4190: 31 5d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  1]));.  rc = sql
41a0: 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74  ite3_blocking_st
41b0: 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 54 63  ep(pStmt);..  Tc
41c0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
41d0: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
41e0: 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
41f0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
4200: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4210: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 6c 6f  age: sqlite3_blo
4220: 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32  cking_prepare_v2
4230: 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
4240: 61 69 6c 76 61 72 3f 0a 2a 2a 20 55 73 61 67 65  ailvar?.** Usage
4250: 3a 20 73 71 6c 69 74 65 33 5f 6e 6f 6e 62 6c 6f  : sqlite3_nonblo
4260: 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32  cking_prepare_v2
4270: 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
4280: 61 69 6c 76 61 72 3f 0a 2a 2f 0a 73 74 61 74 69  ailvar?.*/.stati
4290: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
42a0: 41 50 49 20 62 6c 6f 63 6b 69 6e 67 5f 70 72 65  API blocking_pre
42b0: 70 61 72 65 5f 76 32 5f 70 72 6f 63 28 0a 20 20  pare_v2_proc(.  
42c0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
42d0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
42e0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
42f0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
4300: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
4310: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
4320: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
4330: 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  l;.  int bytes;.
4340: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
4350: 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
4360: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
4370: 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
4380: 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  50];.  int rc;. 
4390: 20 69 6e 74 20 69 73 42 6c 6f 63 6b 69 6e 67 20   int isBlocking 
43a0: 3d 20 21 28 63 6c 69 65 6e 74 44 61 74 61 3d 3d  = !(clientData==
43b0: 30 29 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0);..  if( objc!
43c0: 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =5 && objc!=4 ){
43d0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
43e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
43f0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
4400: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
4410: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
4420: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
4430: 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
4440: 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ar", 0);.    ret
4450: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4460: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
4470: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
4480: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
4490: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
44a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
44b0: 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zSql = Tcl_GetS
44c0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
44d0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
44e0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
44f0: 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
4500: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4510: 52 4f 52 3b 0a 0a 20 20 69 66 28 20 69 73 42 6c  ROR;..  if( isBl
4520: 6f 63 6b 69 6e 67 20 29 7b 0a 20 20 20 20 72 63  ocking ){.    rc
4530: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b   = sqlite3_block
4540: 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32 28 64  ing_prepare_v2(d
4550: 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
4560: 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b  &pStmt, &zTail);
4570: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
4580: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
4590: 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
45a0: 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26  bytes, &pStmt, &
45b0: 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 61  zTail);.  }..  a
45c0: 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
45d0: 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
45e0: 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26  ;.  if( zTail &&
45f0: 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
4600: 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
4610: 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79        bytes = by
4620: 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a 53 71  tes - (zTail-zSq
4630: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  l);.    }.    Tc
4640: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
4650: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
4660: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4670: 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c  j(zTail, bytes),
4680: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
4690: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
46a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d      assert( pStm
46b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==0 );.    sqli
46c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
46d0: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
46e0: 20 22 25 73 20 22 2c 20 28 63 68 61 72 20 2a 29   "%s ", (char *)
46f0: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
4700: 63 29 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  c));.    Tcl_App
4710: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4720: 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
4730: 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
4740: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4750: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
4760: 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
4770: 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
4780: 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
4790: 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
47a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
47b0: 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
47c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
47d0: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
47e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
47f0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
4800: 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20  LITE_OS_UNIX && 
4810: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
4820: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 2f  LOCK_NOTIFY */./
4830: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 69 6d 70 6c  *.** End of impl
4840: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 5b 73  ementation of [s
4850: 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f  qlite3_blocking_
4860: 73 74 65 70 5d 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  step]..*********
4870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
48b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
48c0: 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74   commands with t
48d0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
48e0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74  er..*/.int Sqlit
48f0: 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74  etestThread_Init
4900: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
4910: 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61  erp){.  Tcl_Crea
4920: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
4930: 65 72 70 2c 20 22 73 71 6c 74 68 72 65 61 64 22  erp, "sqlthread"
4940: 2c 20 73 71 6c 74 68 72 65 61 64 5f 70 72 6f 63  , sqlthread_proc
4950: 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  , 0, 0);.  Tcl_C
4960: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
4970: 69 6e 74 65 72 70 2c 20 22 63 6c 6f 63 6b 5f 73  interp, "clock_s
4980: 65 63 6f 6e 64 73 22 2c 20 63 6c 6f 63 6b 5f 73  econds", clock_s
4990: 65 63 6f 6e 64 73 5f 70 72 6f 63 2c 20 30 2c 20  econds_proc, 0, 
49a0: 30 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  0);.#if SQLITE_O
49b0: 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65  S_UNIX && define
49c0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
49d0: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 20  UNLOCK_NOTIFY). 
49e0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
49f0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
4a00: 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f  qlite3_blocking_
4a10: 73 74 65 70 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f  step", blocking_
4a20: 73 74 65 70 5f 70 72 6f 63 2c 30 2c 30 29 3b 0a  step_proc,0,0);.
4a30: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
4a40: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 0a  ommand(interp, .
4a50: 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 62        "sqlite3_b
4a60: 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f  locking_prepare_
4a70: 76 32 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70 72  v2", blocking_pr
4a80: 65 70 61 72 65 5f 76 32 5f 70 72 6f 63 2c 20 28  epare_v2_proc, (
4a90: 76 6f 69 64 20 2a 29 31 2c 20 30 29 3b 0a 20 20  void *)1, 0);.  
4aa0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
4ab0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 0a 20 20  mand(interp, .  
4ac0: 20 20 20 20 22 73 71 6c 69 74 65 33 5f 6e 6f 6e      "sqlite3_non
4ad0: 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65  blocking_prepare
4ae0: 5f 76 32 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70  _v2", blocking_p
4af0: 72 65 70 61 72 65 5f 76 32 5f 70 72 6f 63 2c 20  repare_v2_proc, 
4b00: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
4b10: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
4b20: 0a 23 65 6c 73 65 0a 69 6e 74 20 53 71 6c 69 74  .#else.int Sqlit
4b30: 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74  etestThread_Init
4b40: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
4b50: 65 72 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  erp){.  return T
4b60: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.