/ Hex Artifact Content
Login

Artifact b8a1ab7ca1a632f18e8a361880d5d65eeea08eac:


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 2a  orks on unix..**
0240: 0a 2a 2a 20 24 49 64 3a 20 74 65 73 74 5f 74 68  .** $Id: test_th
0250: 72 65 61 64 2e 63 2c 76 20 31 2e 31 35 20 32 30  read.c,v 1.15 20
0260: 30 39 2f 30 33 2f 32 37 20 31 32 3a 33 32 3a 35  09/03/27 12:32:5
0270: 36 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 0a  6 drh Exp $.*/..
0280: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0290: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
02a0: 3c 74 63 6c 2e 68 3e 0a 0a 23 69 66 20 53 51 4c  <tcl.h>..#if SQL
02b0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 0a  ITE_THREADSAFE..
02c0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
02d0: 68 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  h>..#if !defined
02e0: 28 5f 4d 53 43 5f 56 45 52 29 0a 23 69 6e 63 6c  (_MSC_VER).#incl
02f0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0300: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65  endif../*.** One
0310: 20 6f 66 20 74 68 65 73 65 20 69 73 20 61 6c 6c   of these is all
0320: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
0330: 74 68 72 65 61 64 20 63 72 65 61 74 65 64 20 62  thread created b
0340: 79 20 5b 73 71 6c 74 68 72 65 61 64 20 73 70 61  y [sqlthread spa
0350: 77 6e 5d 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  wn]..*/.typedef 
0360: 73 74 72 75 63 74 20 53 71 6c 54 68 72 65 61 64  struct SqlThread
0370: 20 53 71 6c 54 68 72 65 61 64 3b 0a 73 74 72 75   SqlThread;.stru
0380: 63 74 20 53 71 6c 54 68 72 65 61 64 20 7b 0a 20  ct SqlThread {. 
0390: 20 54 63 6c 5f 54 68 72 65 61 64 49 64 20 70 61   Tcl_ThreadId pa
03a0: 72 65 6e 74 3b 20 20 20 20 20 2f 2a 20 54 68 72  rent;     /* Thr
03b0: 65 61 64 20 69 64 20 6f 66 20 70 61 72 65 6e 74  ead id of parent
03c0: 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 54 63 6c   thread */.  Tcl
03d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
03e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
03f0: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
0400: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20   char *zScript; 
0410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0420: 20 73 63 72 69 70 74 20 74 6f 20 65 78 65 63 75   script to execu
0430: 74 65 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  te. */.  char *z
0440: 56 61 72 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  Varname;        
0450: 20 20 2f 2a 20 56 61 72 6e 61 6d 65 20 69 6e 20    /* Varname in 
0460: 70 61 72 65 6e 74 20 73 63 72 69 70 74 20 2a 2f  parent script */
0470: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 75 73  .};../*.** A cus
0480: 74 6f 6d 20 54 63 6c 5f 45 76 65 6e 74 20 74 79  tom Tcl_Event ty
0490: 70 65 20 75 73 65 64 20 62 79 20 74 68 69 73 20  pe used by this 
04a0: 6d 6f 64 75 6c 65 2e 20 57 68 65 6e 20 74 68 65  module. When the
04b0: 20 65 76 65 6e 74 20 69 73 0a 2a 2a 20 68 61 6e   event is.** han
04c0: 64 6c 65 64 2c 20 73 63 72 69 70 74 20 7a 53 63  dled, script zSc
04d0: 72 69 70 74 20 69 73 20 65 76 61 6c 75 61 74 65  ript is evaluate
04e0: 64 20 69 6e 20 69 6e 74 65 72 70 72 65 74 65 72  d in interpreter
04f0: 20 69 6e 74 65 72 70 2e 20 49 66 0a 2a 2a 20 74   interp. If.** t
0500: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 68  he evaluation th
0510: 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
0520: 6e 20 28 72 65 74 75 72 6e 73 20 54 43 4c 5f 45  n (returns TCL_E
0530: 52 52 4f 52 29 2c 20 74 68 65 6e 20 74 68 65 0a  RROR), then the.
0540: 2a 2a 20 65 72 72 6f 72 20 69 73 20 68 61 6e 64  ** error is hand
0550: 6c 65 64 20 62 79 20 54 63 6c 5f 42 61 63 6b 67  led by Tcl_Backg
0560: 72 6f 75 6e 64 45 72 72 6f 72 28 29 2e 20 49 66  roundError(). If
0570: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
0580: 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
0590: 69 73 20 73 69 6d 70 6c 79 20 64 69 73 63 61 72  is simply discar
05a0: 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ded..*/.typedef 
05b0: 73 74 72 75 63 74 20 45 76 61 6c 45 76 65 6e 74  struct EvalEvent
05c0: 20 45 76 61 6c 45 76 65 6e 74 3b 0a 73 74 72 75   EvalEvent;.stru
05d0: 63 74 20 45 76 61 6c 45 76 65 6e 74 20 7b 0a 20  ct EvalEvent {. 
05e0: 20 54 63 6c 5f 45 76 65 6e 74 20 62 61 73 65 3b   Tcl_Event base;
05f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
0600: 65 20 63 6c 61 73 73 20 6f 66 20 74 79 70 65 20  e class of type 
0610: 54 63 6c 5f 45 76 65 6e 74 20 2a 2f 0a 20 20 63  Tcl_Event */.  c
0620: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20  har *zScript;   
0630: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
0640: 63 72 69 70 74 20 74 6f 20 65 78 65 63 75 74 65  cript to execute
0650: 2e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  . */.  Tcl_Inter
0660: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20  p *interp;      
0670: 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74  /* The interpret
0680: 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 69 74  er to execute it
0690: 20 69 6e 2e 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74   in. */.};..stat
06a0: 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  ic Tcl_ObjCmdPro
06b0: 63 20 73 71 6c 74 68 72 65 61 64 5f 70 72 6f 63  c sqlthread_proc
06c0: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  ;.static Tcl_Obj
06d0: 43 6d 64 50 72 6f 63 20 63 6c 6f 63 6b 5f 73 65  CmdProc clock_se
06e0: 63 6f 6e 64 73 5f 70 72 6f 63 3b 0a 23 69 66 20  conds_proc;.#if 
06f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
0700: 53 5f 55 4e 49 58 29 20 26 26 20 64 65 66 69 6e  S_UNIX) && defin
0710: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
0720: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a  _UNLOCK_NOTIFY).
0730: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d  static Tcl_ObjCm
0740: 64 50 72 6f 63 20 62 6c 6f 63 6b 69 6e 67 5f 73  dProc blocking_s
0750: 74 65 70 5f 70 72 6f 63 3b 0a 73 74 61 74 69 63  tep_proc;.static
0760: 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20   Tcl_ObjCmdProc 
0770: 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65  blocking_prepare
0780: 5f 76 32 5f 70 72 6f 63 3b 0a 23 65 6e 64 69 66  _v2_proc;.#endif
0790: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31  .int Sqlitetest1
07a0: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
07b0: 20 2a 29 3b 0a 0a 2f 2a 20 46 75 6e 63 74 69 6f   *);../* Functio
07c0: 6e 73 20 66 72 6f 6d 20 74 65 73 74 31 2e 63 20  ns from test1.c 
07d0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
07e0: 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 63 6f  TestTextToPtr(co
07f0: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 63 6f 6e  nst char *);.con
0800: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0810: 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 69 6e  TestErrorName(in
0820: 74 29 3b 0a 69 6e 74 20 67 65 74 44 62 50 6f 69  t);.int getDbPoi
0830: 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20  nter(Tcl_Interp 
0840: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  *, const char *,
0850: 20 73 71 6c 69 74 65 33 20 2a 2a 29 3b 0a 69 6e   sqlite3 **);.in
0860: 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  t sqlite3TestMak
0870: 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c 5f  ePointerStr(Tcl_
0880: 49 6e 74 65 72 70 20 2a 2c 20 63 68 61 72 20 2a  Interp *, char *
0890: 2c 20 76 6f 69 64 20 2a 29 3b 0a 69 6e 74 20 73  , void *);.int s
08a0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
08b0: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 2c 20  e(Tcl_Interp *, 
08c0: 73 71 6c 69 74 65 33 20 2a 2c 20 69 6e 74 29 3b  sqlite3 *, int);
08d0: 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  ../*.** Handler 
08e0: 66 6f 72 20 65 76 65 6e 74 73 20 6f 66 20 74 79  for events of ty
08f0: 70 65 20 45 76 61 6c 45 76 65 6e 74 2e 0a 2a 2f  pe EvalEvent..*/
0900: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53  .static int tclS
0910: 63 72 69 70 74 45 76 65 6e 74 28 54 63 6c 5f 45  criptEvent(Tcl_E
0920: 76 65 6e 74 20 2a 65 76 50 74 72 2c 20 69 6e 74  vent *evPtr, int
0930: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
0940: 63 3b 0a 20 20 45 76 61 6c 45 76 65 6e 74 20 2a  c;.  EvalEvent *
0950: 70 20 3d 20 28 45 76 61 6c 45 76 65 6e 74 20 2a  p = (EvalEvent *
0960: 29 65 76 50 74 72 3b 0a 20 20 72 63 20 3d 20 54  )evPtr;.  rc = T
0970: 63 6c 5f 45 76 61 6c 28 70 2d 3e 69 6e 74 65 72  cl_Eval(p->inter
0980: 70 2c 20 70 2d 3e 7a 53 63 72 69 70 74 29 3b 0a  p, p->zScript);.
0990: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
09a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
09b0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69  groundError(p->i
09c0: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 55 4e  nterp);.  }.  UN
09d0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
09e0: 6c 61 67 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  lags);.  return 
09f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  1;.}../*.** Regi
0a00: 73 74 65 72 20 61 6e 20 45 76 61 6c 45 76 65 6e  ster an EvalEven
0a10: 74 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  t to evaluate th
0a20: 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74  e script pScript
0a30: 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e   in the.** paren
0a40: 74 20 69 6e 74 65 72 70 72 65 74 65 72 2f 74 68  t interpreter/th
0a50: 72 65 61 64 20 6f 66 20 53 71 6c 54 68 72 65 61  read of SqlThrea
0a60: 64 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d p..*/.static v
0a70: 6f 69 64 20 70 6f 73 74 54 6f 50 61 72 65 6e 74  oid postToParent
0a80: 28 53 71 6c 54 68 72 65 61 64 20 2a 70 2c 20 54  (SqlThread *p, T
0a90: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 29  cl_Obj *pScript)
0aa0: 7b 0a 20 20 45 76 61 6c 45 76 65 6e 74 20 2a 70  {.  EvalEvent *p
0ab0: 45 76 65 6e 74 3b 0a 20 20 63 68 61 72 20 2a 7a  Event;.  char *z
0ac0: 4d 73 67 3b 0a 20 20 69 6e 74 20 6e 4d 73 67 3b  Msg;.  int nMsg;
0ad0: 0a 0a 20 20 7a 4d 73 67 20 3d 20 54 63 6c 5f 47  ..  zMsg = Tcl_G
0ae0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
0af0: 70 53 63 72 69 70 74 2c 20 26 6e 4d 73 67 29 3b  pScript, &nMsg);
0b00: 20 0a 20 20 70 45 76 65 6e 74 20 3d 20 28 45 76   .  pEvent = (Ev
0b10: 61 6c 45 76 65 6e 74 20 2a 29 63 6b 61 6c 6c 6f  alEvent *)ckallo
0b20: 63 28 73 69 7a 65 6f 66 28 45 76 61 6c 45 76 65  c(sizeof(EvalEve
0b30: 6e 74 29 2b 6e 4d 73 67 2b 31 29 3b 0a 20 20 70  nt)+nMsg+1);.  p
0b40: 45 76 65 6e 74 2d 3e 62 61 73 65 2e 6e 65 78 74  Event->base.next
0b50: 50 74 72 20 3d 20 30 3b 0a 20 20 70 45 76 65 6e  Ptr = 0;.  pEven
0b60: 74 2d 3e 62 61 73 65 2e 70 72 6f 63 20 3d 20 74  t->base.proc = t
0b70: 63 6c 53 63 72 69 70 74 45 76 65 6e 74 3b 0a 20  clScriptEvent;. 
0b80: 20 70 45 76 65 6e 74 2d 3e 7a 53 63 72 69 70 74   pEvent->zScript
0b90: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 45 76 65   = (char *)&pEve
0ba0: 6e 74 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  nt[1];.  memcpy(
0bb0: 70 45 76 65 6e 74 2d 3e 7a 53 63 72 69 70 74 2c  pEvent->zScript,
0bc0: 20 7a 4d 73 67 2c 20 6e 4d 73 67 2b 31 29 3b 0a   zMsg, nMsg+1);.
0bd0: 20 20 70 45 76 65 6e 74 2d 3e 69 6e 74 65 72 70    pEvent->interp
0be0: 20 3d 20 70 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20   = p->interp;.. 
0bf0: 20 54 63 6c 5f 54 68 72 65 61 64 51 75 65 75 65   Tcl_ThreadQueue
0c00: 45 76 65 6e 74 28 70 2d 3e 70 61 72 65 6e 74 2c  Event(p->parent,
0c10: 20 28 54 63 6c 5f 45 76 65 6e 74 20 2a 29 70 45   (Tcl_Event *)pE
0c20: 76 65 6e 74 2c 20 54 43 4c 5f 51 55 45 55 45 5f  vent, TCL_QUEUE_
0c30: 54 41 49 4c 29 3b 0a 20 20 54 63 6c 5f 54 68 72  TAIL);.  Tcl_Thr
0c40: 65 61 64 41 6c 65 72 74 28 70 2d 3e 70 61 72 65  eadAlert(p->pare
0c50: 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nt);.}../*.** Th
0c60: 65 20 6d 61 69 6e 20 66 75 6e 63 74 69 6f 6e 20  e main function 
0c70: 66 6f 72 20 74 68 72 65 61 64 73 20 63 72 65 61  for threads crea
0c80: 74 65 64 20 77 69 74 68 20 5b 73 71 6c 74 68 72  ted with [sqlthr
0c90: 65 61 64 20 73 70 61 77 6e 5d 2e 0a 2a 2f 0a 73  ead spawn]..*/.s
0ca0: 74 61 74 69 63 20 54 63 6c 5f 54 68 72 65 61 64  tatic Tcl_Thread
0cb0: 43 72 65 61 74 65 54 79 70 65 20 74 63 6c 53 63  CreateType tclSc
0cc0: 72 69 70 74 54 68 72 65 61 64 28 43 6c 69 65 6e  riptThread(Clien
0cd0: 74 44 61 74 61 20 70 53 71 6c 54 68 72 65 61 64  tData pSqlThread
0ce0: 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
0cf0: 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
0d00: 62 6a 20 2a 70 52 65 73 3b 0a 20 20 54 63 6c 5f  bj *pRes;.  Tcl_
0d10: 4f 62 6a 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  Obj *pList;.  in
0d20: 74 20 72 63 3b 0a 20 20 53 71 6c 54 68 72 65 61  t rc;.  SqlThrea
0d30: 64 20 2a 70 20 3d 20 28 53 71 6c 54 68 72 65 61  d *p = (SqlThrea
0d40: 64 20 2a 29 70 53 71 6c 54 68 72 65 61 64 3b 0a  d *)pSqlThread;.
0d50: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
0d60: 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e  itetest_mutex_In
0d70: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
0d80: 0a 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c  ..  interp = Tcl
0d90: 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b  _CreateInterp();
0da0: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
0db0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
0dc0: 22 63 6c 6f 63 6b 5f 73 65 63 6f 6e 64 73 22 2c  "clock_seconds",
0dd0: 20 63 6c 6f 63 6b 5f 73 65 63 6f 6e 64 73 5f 70   clock_seconds_p
0de0: 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  roc, 0, 0);.  Tc
0df0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
0e00: 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 74  nd(interp, "sqlt
0e10: 68 72 65 61 64 22 2c 20 73 71 6c 74 68 72 65 61  hread", sqlthrea
0e20: 64 5f 70 72 6f 63 2c 20 70 53 71 6c 54 68 72 65  d_proc, pSqlThre
0e30: 61 64 2c 20 30 29 3b 0a 23 69 66 20 64 65 66 69  ad, 0);.#if defi
0e40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  ned(SQLITE_OS_UN
0e50: 49 58 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  IX) && defined(S
0e60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
0e70: 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 20 20 54 63  OCK_NOTIFY).  Tc
0e80: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
0e90: 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
0ea0: 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65  te3_blocking_ste
0eb0: 70 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 73 74 65  p", blocking_ste
0ec0: 70 5f 70 72 6f 63 2c 30 2c 30 29 3b 0a 20 20 54  p_proc,0,0);.  T
0ed0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
0ee0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  and(interp, .   
0ef0: 20 20 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 63     "sqlite3_bloc
0f00: 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32 22  king_prepare_v2"
0f10: 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61  , blocking_prepa
0f20: 72 65 5f 76 32 5f 70 72 6f 63 2c 20 28 76 6f 69  re_v2_proc, (voi
0f30: 64 20 2a 29 31 2c 20 30 29 3b 0a 20 20 54 63 6c  d *)1, 0);.  Tcl
0f40: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
0f50: 64 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  d(interp, .     
0f60: 20 22 73 71 6c 69 74 65 33 5f 6e 6f 6e 62 6c 6f   "sqlite3_nonblo
0f70: 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32  cking_prepare_v2
0f80: 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70  ", blocking_prep
0f90: 61 72 65 5f 76 32 5f 70 72 6f 63 2c 20 30 2c 20  are_v2_proc, 0, 
0fa0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 53 71 6c  0);.#endif.  Sql
0fb0: 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e  itetest1_Init(in
0fc0: 74 65 72 70 29 3b 0a 20 20 53 71 6c 69 74 65 74  terp);.  Sqlitet
0fd0: 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69  est_mutex_Init(i
0fe0: 6e 74 65 72 70 29 3b 0a 0a 20 20 72 63 20 3d 20  nterp);..  rc = 
0ff0: 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c  Tcl_Eval(interp,
1000: 20 70 2d 3e 7a 53 63 72 69 70 74 29 3b 0a 20 20   p->zScript);.  
1010: 70 52 65 73 20 3d 20 54 63 6c 5f 47 65 74 4f 62  pRes = Tcl_GetOb
1020: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
1030: 0a 20 20 70 4c 69 73 74 20 3d 20 54 63 6c 5f 4e  .  pList = Tcl_N
1040: 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49  ewObj();.  Tcl_I
1050: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 4c 69 73  ncrRefCount(pLis
1060: 74 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  t);.  Tcl_IncrRe
1070: 66 43 6f 75 6e 74 28 70 52 65 73 29 3b 0a 0a 20  fCount(pRes);.. 
1080: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1090: 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ){.    Tcl_ListO
10a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10b0: 69 6e 74 65 72 70 2c 20 70 4c 69 73 74 2c 20 54  interp, pList, T
10c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10d0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
10e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
10f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1100: 72 70 2c 20 70 4c 69 73 74 2c 20 70 52 65 73 29  rp, pList, pRes)
1110: 3b 0a 20 20 20 20 70 6f 73 74 54 6f 50 61 72 65  ;.    postToPare
1120: 6e 74 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20  nt(p, pList);.  
1130: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1140: 6e 74 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  nt(pList);.    p
1150: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
1160: 6a 28 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f  j();.  }..  Tcl_
1170: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1180: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 4c 69  ment(interp, pLi
1190: 73 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  st, Tcl_NewStrin
11a0: 67 4f 62 6a 28 22 73 65 74 22 2c 20 2d 31 29 29  gObj("set", -1))
11b0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
11c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11d0: 65 72 70 2c 20 70 4c 69 73 74 2c 20 54 63 6c 5f  erp, pList, Tcl_
11e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e  NewStringObj(p->
11f0: 7a 56 61 72 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a  zVarname, -1));.
1200: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1210: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1220: 70 2c 20 70 4c 69 73 74 2c 20 70 52 65 73 29 3b  p, pList, pRes);
1230: 0a 20 20 70 6f 73 74 54 6f 50 61 72 65 6e 74 28  .  postToParent(
1240: 70 2c 20 70 4c 69 73 74 29 3b 0a 0a 20 20 63 6b  p, pList);..  ck
1250: 66 72 65 65 28 28 76 6f 69 64 20 2a 29 70 29 3b  free((void *)p);
1260: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
1270: 75 6e 74 28 70 4c 69 73 74 29 3b 0a 20 20 54 63  unt(pList);.  Tc
1280: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1290: 52 65 73 29 3b 0a 20 20 54 63 6c 5f 44 65 6c 65  Res);.  Tcl_Dele
12a0: 74 65 49 6e 74 65 72 70 28 69 6e 74 65 72 70 29  teInterp(interp)
12b0: 3b 0a 20 20 54 43 4c 5f 54 48 52 45 41 44 5f 43  ;.  TCL_THREAD_C
12c0: 52 45 41 54 45 5f 52 45 54 55 52 4e 3b 0a 7d 0a  REATE_RETURN;.}.
12d0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 74 68 72 65 61 64  ./*.** sqlthread
12e0: 20 73 70 61 77 6e 20 56 41 52 4e 41 4d 45 20 53   spawn VARNAME S
12f0: 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 20 20 20 20  CRIPT.**.**     
1300: 53 70 61 77 6e 20 61 20 6e 65 77 20 74 68 72 65  Spawn a new thre
1310: 61 64 20 77 69 74 68 20 69 74 73 20 6f 77 6e 20  ad with its own 
1320: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20  Tcl interpreter 
1330: 61 6e 64 20 72 75 6e 20 74 68 65 0a 2a 2a 20 20  and run the.**  
1340: 20 20 20 73 70 65 63 69 66 69 65 64 20 53 43 52     specified SCR
1350: 49 50 54 28 73 29 20 69 6e 20 69 74 2e 20 54 68  IPT(s) in it. Th
1360: 65 20 74 68 72 65 61 64 20 74 65 72 6d 69 6e 61  e thread termina
1370: 74 65 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e  tes after runnin
1380: 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 73 63 72  g.**     the scr
1390: 69 70 74 2e 20 54 68 65 20 72 65 73 75 6c 74 20  ipt. The result 
13a0: 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 69 73  of the script is
13b0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 76   stored in the v
13c0: 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 20 20 56  ariable.**     V
13d0: 41 52 4e 41 4d 45 2e 0a 2a 2a 0a 2a 2a 20 20 20  ARNAME..**.**   
13e0: 20 20 54 68 65 20 63 61 6c 6c 65 72 20 63 61 6e    The caller can
13f0: 20 77 61 69 74 20 66 6f 72 20 74 68 65 20 73 63   wait for the sc
1400: 72 69 70 74 20 74 6f 20 74 65 72 6d 69 6e 61 74  ript to terminat
1410: 65 20 75 73 69 6e 67 20 5b 76 77 61 69 74 20 56  e using [vwait V
1420: 41 52 4e 41 4d 45 5d 2e 0a 2a 2f 0a 73 74 61 74  ARNAME]..*/.stat
1430: 69 63 20 69 6e 74 20 73 71 6c 74 68 72 65 61 64  ic int sqlthread
1440: 5f 73 70 61 77 6e 28 0a 20 20 43 6c 69 65 6e 74  _spawn(.  Client
1450: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1460: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1470: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1480: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1490: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14a0: 54 63 6c 5f 54 68 72 65 61 64 49 64 20 78 3b 0a  Tcl_ThreadId x;.
14b0: 20 20 53 71 6c 54 68 72 65 61 64 20 2a 70 4e 65    SqlThread *pNe
14c0: 77 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  w;.  int rc;..  
14d0: 69 6e 74 20 6e 56 61 72 6e 61 6d 65 3b 20 63 68  int nVarname; ch
14e0: 61 72 20 2a 7a 56 61 72 6e 61 6d 65 3b 0a 20 20  ar *zVarname;.  
14f0: 69 6e 74 20 6e 53 63 72 69 70 74 3b 20 63 68 61  int nScript; cha
1500: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 0a 20 20 2f  r *zScript;..  /
1510: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 66 6f 72  * Parameters for
1520: 20 74 68 72 65 61 64 20 63 72 65 61 74 69 6f 6e   thread creation
1530: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
1540: 6e 53 74 61 63 6b 20 3d 20 54 43 4c 5f 54 48 52  nStack = TCL_THR
1550: 45 41 44 5f 53 54 41 43 4b 5f 44 45 46 41 55 4c  EAD_STACK_DEFAUL
1560: 54 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  T;.  const int f
1570: 6c 61 67 73 20 3d 20 54 43 4c 5f 54 48 52 45 41  lags = TCL_THREA
1580: 44 5f 4e 4f 46 4c 41 47 53 3b 0a 0a 20 20 61 73  D_NOFLAGS;..  as
1590: 73 65 72 74 28 6f 62 6a 63 3d 3d 34 29 3b 0a 20  sert(objc==4);. 
15a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
15b0: 52 28 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20  R(clientData);. 
15c0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
15d0: 52 28 6f 62 6a 63 29 3b 0a 0a 20 20 7a 56 61 72  R(objc);..  zVar
15e0: 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  name = Tcl_GetSt
15f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1600: 5b 32 5d 2c 20 26 6e 56 61 72 6e 61 6d 65 29 3b  [2], &nVarname);
1610: 0a 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c  .  zScript = 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 33 5d 2c 20 26 6e 53 63 72  j(objv[3], &nScr
1640: 69 70 74 29 3b 0a 0a 20 20 70 4e 65 77 20 3d 20  ipt);..  pNew = 
1650: 28 53 71 6c 54 68 72 65 61 64 20 2a 29 63 6b 61  (SqlThread *)cka
1660: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 71 6c 54  lloc(sizeof(SqlT
1670: 68 72 65 61 64 29 2b 6e 56 61 72 6e 61 6d 65 2b  hread)+nVarname+
1680: 6e 53 63 72 69 70 74 2b 32 29 3b 0a 20 20 70 4e  nScript+2);.  pN
1690: 65 77 2d 3e 7a 56 61 72 6e 61 6d 65 20 3d 20 28  ew->zVarname = (
16a0: 63 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b  char *)&pNew[1];
16b0: 0a 20 20 70 4e 65 77 2d 3e 7a 53 63 72 69 70 74  .  pNew->zScript
16c0: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65 77   = (char *)&pNew
16d0: 2d 3e 7a 56 61 72 6e 61 6d 65 5b 6e 56 61 72 6e  ->zVarname[nVarn
16e0: 61 6d 65 2b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  ame+1];.  memcpy
16f0: 28 70 4e 65 77 2d 3e 7a 56 61 72 6e 61 6d 65 2c  (pNew->zVarname,
1700: 20 7a 56 61 72 6e 61 6d 65 2c 20 6e 56 61 72 6e   zVarname, nVarn
1710: 61 6d 65 2b 31 29 3b 0a 20 20 6d 65 6d 63 70 79  ame+1);.  memcpy
1720: 28 70 4e 65 77 2d 3e 7a 53 63 72 69 70 74 2c 20  (pNew->zScript, 
1730: 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74  zScript, nScript
1740: 2b 31 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 61 72  +1);.  pNew->par
1750: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 43 75 72  ent = Tcl_GetCur
1760: 72 65 6e 74 54 68 72 65 61 64 28 29 3b 0a 20 20  rentThread();.  
1770: 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 69  pNew->interp = i
1780: 6e 74 65 72 70 3b 0a 0a 20 20 72 63 20 3d 20 54  nterp;..  rc = T
1790: 63 6c 5f 43 72 65 61 74 65 54 68 72 65 61 64 28  cl_CreateThread(
17a0: 26 78 2c 20 74 63 6c 53 63 72 69 70 74 54 68 72  &x, tclScriptThr
17b0: 65 61 64 2c 20 28 76 6f 69 64 20 2a 29 70 4e 65  ead, (void *)pNe
17c0: 77 2c 20 6e 53 74 61 63 6b 2c 20 66 6c 61 67 73  w, nStack, flags
17d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
17e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
17f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1800: 72 70 2c 20 22 45 72 72 6f 72 20 69 6e 20 54 63  rp, "Error in Tc
1810: 6c 5f 43 72 65 61 74 65 54 68 72 65 61 64 28 29  l_CreateThread()
1820: 22 2c 20 30 29 3b 0a 20 20 20 20 63 6b 66 72 65  ", 0);.    ckfre
1830: 65 28 28 63 68 61 72 20 2a 29 70 4e 65 77 29 3b  e((char *)pNew);
1840: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1850: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
1860: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1870: 2f 2a 0a 2a 2a 20 73 71 6c 74 68 72 65 61 64 20  /*.** sqlthread 
1880: 70 61 72 65 6e 74 20 53 43 52 49 50 54 0a 2a 2a  parent SCRIPT.**
1890: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 63 61 6e  .**     This can
18a0: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 73 70   be called by sp
18b0: 61 77 6e 65 64 20 74 68 72 65 61 64 73 20 6f 6e  awned threads on
18c0: 6c 79 2e 20 49 74 20 73 65 6e 64 73 20 74 68 65  ly. It sends the
18d0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20   specified.**   
18e0: 20 20 73 63 72 69 70 74 20 62 61 63 6b 20 74 6f    script back to
18f0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 68 72 65   the parent thre
1900: 61 64 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ad for execution
1910: 2e 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  . The result of.
1920: 2a 2a 20 20 20 20 20 65 76 61 6c 75 61 74 69 6e  **     evaluatin
1930: 67 20 74 68 65 20 53 43 52 49 50 54 20 69 73 20  g the SCRIPT is 
1940: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 70 61  returned. The pa
1950: 72 65 6e 74 20 74 68 72 65 61 64 20 6d 75 73 74  rent thread must
1960: 20 65 6e 74 65 72 0a 2a 2a 20 20 20 20 20 74 68   enter.**     th
1970: 65 20 65 76 65 6e 74 20 6c 6f 6f 70 20 66 6f 72  e event loop for
1980: 20 74 68 69 73 20 74 6f 20 77 6f 72 6b 20 2d 20   this to work - 
1990: 6f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  otherwise the ca
19a0: 6c 6c 65 72 20 77 69 6c 6c 0a 2a 2a 20 20 20 20  ller will.**    
19b0: 20 62 6c 6f 63 6b 20 69 6e 64 65 66 69 6e 69 74   block indefinit
19c0: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e  ely..**.**     N
19d0: 4f 54 45 3a 20 41 74 20 74 68 65 20 6d 6f 6d 65  OTE: At the mome
19e0: 6e 74 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74  nt, this doesn't
19f0: 20 77 6f 72 6b 2e 20 46 49 58 4d 45 2e 0a 2a 2f   work. FIXME..*/
1a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 74  .static int sqlt
1a10: 68 72 65 61 64 5f 70 61 72 65 6e 74 28 0a 20 20  hread_parent(.  
1a20: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
1a30: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1a40: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1a50: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1a60: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1a70: 0a 29 7b 0a 20 20 45 76 61 6c 45 76 65 6e 74 20  .){.  EvalEvent 
1a80: 2a 70 45 76 65 6e 74 3b 0a 20 20 63 68 61 72 20  *pEvent;.  char 
1a90: 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 6e 4d 73  *zMsg;.  int nMs
1aa0: 67 3b 0a 20 20 53 71 6c 54 68 72 65 61 64 20 2a  g;.  SqlThread *
1ab0: 70 20 3d 20 28 53 71 6c 54 68 72 65 61 64 20 2a  p = (SqlThread *
1ac0: 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20  )clientData;..  
1ad0: 61 73 73 65 72 74 28 6f 62 6a 63 3d 3d 33 29 3b  assert(objc==3);
1ae0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1af0: 54 45 52 28 6f 62 6a 63 29 3b 0a 0a 20 20 69 66  TER(objc);..  if
1b00: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  ( p==0 ){.    Tc
1b10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b20: 6e 74 65 72 70 2c 20 22 6e 6f 20 70 61 72 65 6e  nterp, "no paren
1b30: 74 20 74 68 72 65 61 64 22 2c 20 30 29 3b 0a 20  t thread", 0);. 
1b40: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b50: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 4d 73 67  ROR;.  }..  zMsg
1b60: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1b70: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
1b80: 20 26 6e 4d 73 67 29 3b 0a 20 20 70 45 76 65 6e   &nMsg);.  pEven
1b90: 74 20 3d 20 28 45 76 61 6c 45 76 65 6e 74 20 2a  t = (EvalEvent *
1ba0: 29 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  )ckalloc(sizeof(
1bb0: 45 76 61 6c 45 76 65 6e 74 29 2b 6e 4d 73 67 2b  EvalEvent)+nMsg+
1bc0: 31 29 3b 0a 20 20 70 45 76 65 6e 74 2d 3e 62 61  1);.  pEvent->ba
1bd0: 73 65 2e 6e 65 78 74 50 74 72 20 3d 20 30 3b 0a  se.nextPtr = 0;.
1be0: 20 20 70 45 76 65 6e 74 2d 3e 62 61 73 65 2e 70    pEvent->base.p
1bf0: 72 6f 63 20 3d 20 74 63 6c 53 63 72 69 70 74 45  roc = tclScriptE
1c00: 76 65 6e 74 3b 0a 20 20 70 45 76 65 6e 74 2d 3e  vent;.  pEvent->
1c10: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 20  zScript = (char 
1c20: 2a 29 26 70 45 76 65 6e 74 5b 31 5d 3b 0a 20 20  *)&pEvent[1];.  
1c30: 6d 65 6d 63 70 79 28 70 45 76 65 6e 74 2d 3e 7a  memcpy(pEvent->z
1c40: 53 63 72 69 70 74 2c 20 7a 4d 73 67 2c 20 6e 4d  Script, zMsg, nM
1c50: 73 67 2b 31 29 3b 0a 20 20 70 45 76 65 6e 74 2d  sg+1);.  pEvent-
1c60: 3e 69 6e 74 65 72 70 20 3d 20 70 2d 3e 69 6e 74  >interp = p->int
1c70: 65 72 70 3b 0a 20 20 54 63 6c 5f 54 68 72 65 61  erp;.  Tcl_Threa
1c80: 64 51 75 65 75 65 45 76 65 6e 74 28 70 2d 3e 70  dQueueEvent(p->p
1c90: 61 72 65 6e 74 2c 20 28 54 63 6c 5f 45 76 65 6e  arent, (Tcl_Even
1ca0: 74 20 2a 29 70 45 76 65 6e 74 2c 20 54 43 4c 5f  t *)pEvent, TCL_
1cb0: 51 55 45 55 45 5f 54 41 49 4c 29 3b 0a 20 20 54  QUEUE_TAIL);.  T
1cc0: 63 6c 5f 54 68 72 65 61 64 41 6c 65 72 74 28 70  cl_ThreadAlert(p
1cd0: 2d 3e 70 61 72 65 6e 74 29 3b 0a 0a 20 20 72 65  ->parent);..  re
1ce0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1cf0: 73 74 61 74 69 63 20 69 6e 74 20 78 42 75 73 79  static int xBusy
1d00: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
1d10: 20 6e 42 75 73 79 29 7b 0a 20 20 55 4e 55 53 45   nBusy){.  UNUSE
1d20: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67  D_PARAMETER(pArg
1d30: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1d40: 4d 45 54 45 52 28 6e 42 75 73 79 29 3b 0a 20 20  METER(nBusy);.  
1d50: 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 35 30  sqlite3_sleep(50
1d60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20  );.  return 1;  
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d80: 79 20 61 67 61 69 6e 2e 2e 2e 20 2a 2f 0a 7d 0a  y again... */.}.
1d90: 0a 2f 2a 0a 2a 2a 20 73 71 6c 74 68 72 65 61 64  ./*.** sqlthread
1da0: 20 6f 70 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   open.**.**     
1db0: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
1dc0: 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 74 75 72  handle and retur
1dd0: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  n the string rep
1de0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 0a 2a  resentation of.*
1df0: 2a 20 20 20 20 20 74 68 65 20 70 6f 69 6e 74 65  *     the pointe
1e00: 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  r value..*/.stat
1e10: 69 63 20 69 6e 74 20 73 71 6c 74 68 72 65 61 64  ic int sqlthread
1e20: 5f 6f 70 65 6e 28 0a 20 20 43 6c 69 65 6e 74 44  _open(.  ClientD
1e30: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  ata clientData,.
1e40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1e50: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1e60: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1e70: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
1e80: 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  nt sqlite3TestMa
1e90: 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c  kePointerStr(Tcl
1ea0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1eb0: 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f 69   char *zPtr, voi
1ec0: 64 20 2a 70 29 3b 0a 0a 20 20 63 6f 6e 73 74 20  d *p);..  const 
1ed0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1ee0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1ef0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1f00: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 65 78   zBuf[100];.  ex
1f10: 74 65 72 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65  tern void Md5_Re
1f20: 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 2a 29  gister(sqlite3*)
1f30: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
1f40: 4d 45 54 45 52 28 63 6c 69 65 6e 74 44 61 74 61  METER(clientData
1f50: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f60: 4d 45 54 45 52 28 6f 62 6a 63 29 3b 0a 0a 20 20  METER(objc);..  
1f70: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f  zFilename = Tcl_
1f80: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
1f90: 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
1fa0: 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  e3_open(zFilenam
1fb0: 65 2c 20 26 64 62 29 3b 0a 20 20 4d 64 35 5f 52  e, &db);.  Md5_R
1fc0: 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 73  egister(db);.  s
1fd0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
1fe0: 6c 65 72 28 64 62 2c 20 78 42 75 73 79 2c 20 30  ler(db, xBusy, 0
1ff0: 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  );.  .  if( sqli
2000: 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
2010: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
2020: 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
2030: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
2040: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2050: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
2060: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
2070: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  K;.}.../*.** sql
2080: 74 68 72 65 61 64 20 6f 70 65 6e 0a 2a 2a 0a 2a  thread open.**.*
2090: 2a 20 20 20 20 20 52 65 74 75 72 6e 20 74 68 65  *     Return the
20a0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2d   current thread-
20b0: 69 64 20 28 54 63 6c 5f 47 65 74 43 75 72 72 65  id (Tcl_GetCurre
20c0: 6e 74 54 68 72 65 61 64 28 29 29 20 63 61 73 74  ntThread()) cast
20d0: 20 74 6f 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   to.**     an in
20e0: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
20f0: 20 69 6e 74 20 73 71 6c 74 68 72 65 61 64 5f 69   int sqlthread_i
2100: 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  d(.  ClientData 
2110: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2120: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2130: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2140: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2150: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 54  bjv[].){.  Tcl_T
2160: 68 72 65 61 64 49 64 20 69 64 20 3d 20 54 63 6c  hreadId id = Tcl
2170: 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61  _GetCurrentThrea
2180: 64 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  d();.  Tcl_SetOb
2190: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
21a0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69  Tcl_NewIntObj((i
21b0: 6e 74 29 69 64 29 29 3b 0a 20 20 55 4e 55 53 45  nt)id));.  UNUSE
21c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 63 6c 69 65  D_PARAMETER(clie
21d0: 6e 74 44 61 74 61 29 3b 0a 20 20 55 4e 55 53 45  ntData);.  UNUSE
21e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 63  D_PARAMETER(objc
21f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2200: 4d 45 54 45 52 28 6f 62 6a 76 29 3b 0a 20 20 72  METER(objv);.  r
2210: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2220: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 61 74 63 68  ../*.** Dispatch
2230: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
2240: 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 6f 66   sub-commands of
2250: 20 5b 73 71 6c 74 68 72 65 61 64 5d 2e 0a 2a 2f   [sqlthread]..*/
2260: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 74  .static int sqlt
2270: 68 72 65 61 64 5f 70 72 6f 63 28 0a 20 20 43 6c  hread_proc(.  Cl
2280: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2290: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
22a0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
22b0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
22c0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
22d0: 7b 0a 20 20 73 74 72 75 63 74 20 53 75 62 43 6f  {.  struct SubCo
22e0: 6d 6d 61 6e 64 20 7b 0a 20 20 20 20 63 68 61 72  mmand {.    char
22f0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 54 63 6c   *zName;.    Tcl
2300: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
2310: 6f 63 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  oc;.    int nArg
2320: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 73 61  ;.    char *zUsa
2330: 67 65 3b 0a 20 20 7d 20 61 53 75 62 5b 5d 20 3d  ge;.  } aSub[] =
2340: 20 7b 0a 20 20 20 20 7b 22 70 61 72 65 6e 74 22   {.    {"parent"
2350: 2c 20 73 71 6c 74 68 72 65 61 64 5f 70 61 72 65  , sqlthread_pare
2360: 6e 74 2c 20 31 2c 20 22 53 43 52 49 50 54 22 7d  nt, 1, "SCRIPT"}
2370: 2c 0a 20 20 20 20 7b 22 73 70 61 77 6e 22 2c 20  ,.    {"spawn", 
2380: 20 73 71 6c 74 68 72 65 61 64 5f 73 70 61 77 6e   sqlthread_spawn
2390: 2c 20 20 32 2c 20 22 56 41 52 4e 41 4d 45 20 53  ,  2, "VARNAME S
23a0: 43 52 49 50 54 22 7d 2c 0a 20 20 20 20 7b 22 6f  CRIPT"},.    {"o
23b0: 70 65 6e 22 2c 20 20 20 73 71 6c 74 68 72 65 61  pen",   sqlthrea
23c0: 64 5f 6f 70 65 6e 2c 20 20 20 31 2c 20 22 44 42  d_open,   1, "DB
23d0: 4e 41 4d 45 22 7d 2c 0a 20 20 20 20 7b 22 69 64  NAME"},.    {"id
23e0: 22 2c 20 20 20 20 20 73 71 6c 74 68 72 65 61 64  ",     sqlthread
23f0: 5f 69 64 2c 20 20 20 20 20 30 2c 20 22 22 7d 2c  _id,     0, ""},
2400: 0a 20 20 20 20 7b 30 2c 20 30 2c 20 30 7d 0a 20  .    {0, 0, 0}. 
2410: 20 7d 3b 0a 20 20 73 74 72 75 63 74 20 53 75 62   };.  struct Sub
2420: 43 6f 6d 6d 61 6e 64 20 2a 70 53 75 62 3b 0a 20  Command *pSub;. 
2430: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2440: 49 6e 64 65 78 3b 0a 0a 20 20 69 66 28 20 6f 62  Index;..  if( ob
2450: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
2460: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2470: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
2480: 55 42 2d 43 4f 4d 4d 41 4e 44 22 29 3b 0a 20 20  UB-COMMAND");.  
2490: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24a0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OR;.  }..  rc = 
24b0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
24c0: 4f 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20  ObjStruct(.     
24d0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d   interp, objv[1]
24e0: 2c 20 61 53 75 62 2c 20 73 69 7a 65 6f 66 28 61  , aSub, sizeof(a
24f0: 53 75 62 5b 30 5d 29 2c 20 22 73 75 62 2d 63 6f  Sub[0]), "sub-co
2500: 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 69 49 6e 64  mmand", 0, &iInd
2510: 65 78 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  ex.  );.  if( rc
2520: 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72  !=TCL_OK ) retur
2530: 6e 20 72 63 3b 0a 20 20 70 53 75 62 20 3d 20 26  n rc;.  pSub = &
2540: 61 53 75 62 5b 69 49 6e 64 65 78 5d 3b 0a 0a 20  aSub[iIndex];.. 
2550: 20 69 66 28 20 6f 62 6a 63 21 3d 28 70 53 75 62   if( objc!=(pSub
2560: 2d 3e 6e 41 72 67 2b 32 29 20 29 7b 0a 20 20 20  ->nArg+2) ){.   
2570: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2580: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
2590: 76 2c 20 70 53 75 62 2d 3e 7a 55 73 61 67 65 29  v, pSub->zUsage)
25a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
25b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
25c0: 65 74 75 72 6e 20 70 53 75 62 2d 3e 78 50 72 6f  eturn pSub->xPro
25d0: 63 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  c(clientData, in
25e0: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  terp, objc, objv
25f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
2600: 5b 63 6c 6f 63 6b 5f 73 65 63 6f 6e 64 73 5d 20  [clock_seconds] 
2610: 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 69 73  command. This is
2620: 20 6d 6f 72 65 20 6f 72 20 6c 65 73 73 20 74 68   more or less th
2630: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
2640: 20 72 65 67 75 6c 61 72 20 74 63 6c 20 5b 63 6c   regular tcl [cl
2650: 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 2c 20 65 78  ock seconds], ex
2660: 63 65 70 74 20 74 68 61 74 20 69 74 20 69 73 20  cept that it is 
2670: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 65 73  available in tes
2680: 74 66 69 78 74 75 72 65 0a 2a 2a 20 77 68 65 6e  tfixture.** when
2690: 20 6c 69 6e 6b 65 64 20 61 67 61 69 6e 73 74 20   linked against 
26a0: 62 6f 74 68 20 54 63 6c 20 38 2e 34 20 61 6e 64  both Tcl 8.4 and
26b0: 20 38 2e 35 2e 20 42 65 63 61 75 73 65 20 5b 63   8.5. Because [c
26c0: 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 20 69 73  lock seconds] is
26d0: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  .** implemented 
26e0: 61 73 20 61 20 73 63 72 69 70 74 20 69 6e 20 54  as a script in T
26f0: 63 6c 20 38 2e 35 2c 20 69 74 20 69 73 20 6e 6f  cl 8.5, it is no
2700: 74 20 75 73 75 61 6c 6c 79 20 61 76 61 69 6c 61  t usually availa
2710: 62 6c 65 20 74 6f 0a 2a 2a 20 74 65 73 74 66 69  ble to.** testfi
2720: 78 74 75 72 65 2e 0a 2a 2f 20 0a 73 74 61 74 69  xture..*/ .stati
2730: 63 20 69 6e 74 20 63 6c 6f 63 6b 5f 73 65 63 6f  c int clock_seco
2740: 6e 64 73 5f 70 72 6f 63 28 0a 20 20 43 6c 69 65  nds_proc(.  Clie
2750: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2760: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2770: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2780: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2790: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
27a0: 20 20 54 63 6c 5f 54 69 6d 65 20 6e 6f 77 3b 0a    Tcl_Time now;.
27b0: 20 20 54 63 6c 5f 47 65 74 54 69 6d 65 28 26 6e    Tcl_GetTime(&n
27c0: 6f 77 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ow);.  Tcl_SetOb
27d0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
27e0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f  Tcl_NewIntObj(no
27f0: 77 2e 73 65 63 29 29 3b 0a 20 20 55 4e 55 53 45  w.sec));.  UNUSE
2800: 44 5f 50 41 52 41 4d 45 54 45 52 28 63 6c 69 65  D_PARAMETER(clie
2810: 6e 74 44 61 74 61 29 3b 0a 20 20 55 4e 55 53 45  ntData);.  UNUSE
2820: 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 62 6a 63  D_PARAMETER(objc
2830: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2840: 4d 45 54 45 52 28 6f 62 6a 76 29 3b 0a 20 20 72  METER(objv);.  r
2850: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2860: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
28b0: 68 69 73 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  his block contai
28c0: 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
28d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 5b 73 71  ation of the [sq
28e0: 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 73  lite3_blocking_s
28f0: 74 65 70 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20  tep].** command 
2900: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 72  available to thr
2910: 65 61 64 73 20 63 72 65 61 74 65 64 20 62 79 20  eads created by 
2920: 5b 73 71 6c 74 68 72 65 61 64 20 73 70 61 77 6e  [sqlthread spawn
2930: 5d 20 63 6f 6d 6d 61 6e 64 73 2e 20 49 74 0a 2a  ] commands. It.*
2940: 2a 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  * is only availa
2950: 62 6c 65 20 6f 6e 20 55 4e 49 58 20 66 6f 72 20  ble on UNIX for 
2960: 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 62 65 63  now. This is bec
2970: 61 75 73 65 20 70 74 68 72 65 61 64 20 63 6f 6e  ause pthread con
2980: 64 69 74 69 6f 6e 0a 2a 2a 20 76 61 72 69 61 62  dition.** variab
2990: 6c 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  les are used..**
29a0: 0a 2a 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63  .** The source c
29b0: 6f 64 65 20 66 6f 72 20 74 68 65 20 43 20 66 75  ode for the C fu
29c0: 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
29d0: 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 28 29 2c  blocking_step(),
29e0: 0a 2a 2a 20 62 6c 6f 63 6b 69 6e 67 5f 73 74 65  .** blocking_ste
29f0: 70 5f 6e 6f 74 69 66 79 28 29 20 61 6e 64 20 74  p_notify() and t
2a00: 68 65 20 73 74 72 75 63 74 75 72 65 20 55 6e 6c  he structure Unl
2a10: 6f 63 6b 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20  ockNotification 
2a20: 69 73 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  is.** automatica
2a30: 6c 6c 79 20 65 78 74 72 61 63 74 65 64 20 66 72  lly extracted fr
2a40: 6f 6d 20 74 68 69 73 20 66 69 6c 65 20 61 6e 64  om this file and
2a50: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
2a60: 20 74 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74   the.** document
2a70: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 71  ation for the sq
2a80: 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  lite3_unlock_not
2a90: 69 66 79 28 29 20 41 50 49 20 66 75 6e 63 74 69  ify() API functi
2aa0: 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 73 68 6f 75  on. This.** shou
2ab0: 6c 64 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ld be considered
2ac0: 20 69 66 20 74 68 65 73 65 20 66 75 6e 63 74 69   if these functi
2ad0: 6f 6e 73 20 61 72 65 20 74 6f 20 62 65 20 65 78  ons are to be ex
2ae0: 74 65 6e 64 65 64 20 28 69 2e 65 2e 20 74 6f 20  tended (i.e. to 
2af0: 0a 2a 2a 20 73 75 70 70 6f 72 74 20 77 69 6e 64  .** support wind
2b00: 6f 77 73 29 20 69 6e 20 74 68 65 20 66 75 74 75  ows) in the futu
2b10: 72 65 2e 0a 2a 2f 20 0a 23 69 66 20 64 65 66 69  re..*/ .#if defi
2b20: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  ned(SQLITE_OS_UN
2b30: 49 58 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  IX) && defined(S
2b40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
2b50: 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 0a 2f 2a 20  OCK_NOTIFY)../* 
2b60: 42 45 47 49 4e 5f 53 51 4c 49 54 45 5f 42 4c 4f  BEGIN_SQLITE_BLO
2b70: 43 4b 49 4e 47 5f 53 54 45 50 20 2a 2f 0a 2f 2a  CKING_STEP */./*
2b80: 20 54 68 69 73 20 65 78 61 6d 70 6c 65 20 75 73   This example us
2b90: 65 73 20 74 68 65 20 70 74 68 72 65 61 64 73 20  es the pthreads 
2ba0: 41 50 49 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  API */.#include 
2bb0: 3c 70 74 68 72 65 61 64 2e 68 3e 0a 0a 2f 2a 0a  <pthread.h>../*.
2bc0: 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
2bd0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2be0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
2bf0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 75   passed as the u
2c00: 73 65 72 2d 63 6f 6e 74 65 78 74 0a 2a 2a 20 70  ser-context.** p
2c10: 6f 69 6e 74 65 72 20 77 68 65 6e 20 72 65 67 69  ointer when regi
2c20: 73 74 65 72 69 6e 67 20 66 6f 72 20 61 6e 20 75  stering for an u
2c30: 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
2c40: 6c 62 61 63 6b 2e 0a 2a 2f 0a 74 79 70 65 64 65  lback..*/.typede
2c50: 66 20 73 74 72 75 63 74 20 55 6e 6c 6f 63 6b 4e  f struct UnlockN
2c60: 6f 74 69 66 69 63 61 74 69 6f 6e 20 55 6e 6c 6f  otification Unlo
2c70: 63 6b 4e 6f 74 69 66 69 63 61 74 69 6f 6e 3b 0a  ckNotification;.
2c80: 73 74 72 75 63 74 20 55 6e 6c 6f 63 6b 4e 6f 74  struct UnlockNot
2c90: 69 66 69 63 61 74 69 6f 6e 20 7b 0a 20 20 69 6e  ification {.  in
2ca0: 74 20 66 69 72 65 64 3b 20 20 20 20 20 20 20 20  t fired;        
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 20 20 20 2f 2a 20 54 72 75 65 20 61 66 74 65 72     /* True after
2cd0: 20 75 6e 6c 6f 63 6b 20 65 76 65 6e 74 20 68 61   unlock event ha
2ce0: 73 20 6f 63 63 75 72 65 64 20 2a 2f 0a 20 20 70  s occured */.  p
2cf0: 74 68 72 65 61 64 5f 63 6f 6e 64 5f 74 20 63 6f  thread_cond_t co
2d00: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
2d10: 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
2d20: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 77 61 69   variable to wai
2d30: 74 20 6f 6e 20 2a 2f 0a 20 20 70 74 68 72 65 61  t on */.  pthrea
2d40: 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65 78 3b  d_mutex_t mutex;
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d60: 2a 20 4d 75 74 65 78 20 74 6f 20 70 72 6f 74 65  * Mutex to prote
2d70: 63 74 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ct structure */.
2d80: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  };../*.** This f
2d90: 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 75 6e  unction is an un
2da0: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
2db0: 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
2dc0: 77 69 74 68 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  with SQLite..*/.
2dd0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
2de0: 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69  ck_notify_cb(voi
2df0: 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e 74 20 6e  d **apArg, int n
2e00: 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Arg){.  int i;. 
2e10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
2e20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 55 6e 6c 6f  ; i++){.    Unlo
2e30: 63 6b 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20 2a  ckNotification *
2e40: 70 20 3d 20 28 55 6e 6c 6f 63 6b 4e 6f 74 69 66  p = (UnlockNotif
2e50: 69 63 61 74 69 6f 6e 20 2a 29 61 70 41 72 67 5b  ication *)apArg[
2e60: 69 5d 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f  i];.    pthread_
2e70: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e 6d  mutex_lock(&p->m
2e80: 75 74 65 78 29 3b 0a 20 20 20 20 70 2d 3e 66 69  utex);.    p->fi
2e90: 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 74 68  red = 1;.    pth
2ea0: 72 65 61 64 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c  read_cond_signal
2eb0: 28 26 70 2d 3e 63 6f 6e 64 29 3b 0a 20 20 20 20  (&p->cond);.    
2ec0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
2ed0: 6c 6f 63 6b 28 26 70 2d 3e 6d 75 74 65 78 29 3b  lock(&p->mutex);
2ee0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2ef0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
2f00: 6d 65 73 20 74 68 61 74 20 61 6e 20 53 51 4c 69  mes that an SQLi
2f10: 74 65 20 41 50 49 20 63 61 6c 6c 20 28 65 69 74  te API call (eit
2f20: 68 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70  her sqlite3_prep
2f30: 61 72 65 5f 76 32 28 29 20 0a 2a 2a 20 6f 72 20  are_v2() .** or 
2f40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 29 20  sqlite3_step()) 
2f50: 68 61 73 20 6a 75 73 74 20 72 65 74 75 72 6e 65  has just returne
2f60: 64 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  d SQLITE_LOCKED.
2f70: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
2f80: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
2f90: 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ed database conn
2fa0: 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
2fb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
2fc0: 73 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  s sqlite3_unlock
2fd0: 5f 6e 6f 74 69 66 79 28 29 20 74 6f 20 72 65 67  _notify() to reg
2fe0: 69 73 74 65 72 20 66 6f 72 20 61 6e 20 0a 2a 2a  ister for an .**
2ff0: 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
3000: 61 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 62 6c  allback, then bl
3010: 6f 63 6b 73 20 75 6e 74 69 6c 20 74 68 61 74 20  ocks until that 
3020: 63 61 6c 6c 62 61 63 6b 20 69 73 20 64 65 6c 69  callback is deli
3030: 76 65 72 65 64 20 0a 2a 2a 20 61 6e 64 20 72 65  vered .** and re
3040: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
3050: 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
3060: 6c 64 20 74 68 65 6e 20 72 65 74 72 79 20 74 68  ld then retry th
3070: 65 20 66 61 69 6c 65 64 20 6f 70 65 72 61 74 69  e failed operati
3080: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  on..**.** Or, if
3090: 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f   sqlite3_unlock_
30a0: 6e 6f 74 69 66 79 28 29 20 69 6e 64 69 63 61 74  notify() indicat
30b0: 65 73 20 74 68 61 74 20 74 6f 20 62 6c 6f 63 6b  es that to block
30c0: 20 77 6f 75 6c 64 20 64 65 61 64 6c 6f 63 6b 20   would deadlock 
30d0: 0a 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 2c 20  .** the system, 
30e0: 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
30f0: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
3100: 45 5f 4c 4f 43 4b 45 44 20 69 6d 6d 65 64 69 61  E_LOCKED immedia
3110: 74 65 6c 79 2e 20 49 6e 20 0a 2a 2a 20 74 68 69  tely. In .** thi
3120: 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65  s case the calle
3130: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 72 65 74  r should not ret
3140: 72 79 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  ry the operation
3150: 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 6f 6c 6c   and should roll
3160: 20 0a 2a 2a 20 62 61 63 6b 20 74 68 65 20 63 75   .** back the cu
3170: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
3180: 6e 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73  n (if any)..*/.s
3190: 74 61 74 69 63 20 69 6e 74 20 77 61 69 74 5f 66  tatic int wait_f
31a0: 6f 72 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  or_unlock_notify
31b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
31c0: 20 69 6e 74 20 72 63 3b 0a 20 20 55 6e 6c 6f 63   int rc;.  Unloc
31d0: 6b 4e 6f 74 69 66 69 63 61 74 69 6f 6e 20 75 6e  kNotification un
31e0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
31f0: 7a 65 20 74 68 65 20 55 6e 6c 6f 63 6b 4e 6f 74  ze the UnlockNot
3200: 69 66 69 63 61 74 69 6f 6e 20 73 74 72 75 63 74  ification struct
3210: 75 72 65 2e 20 2a 2f 0a 20 20 75 6e 2e 66 69 72  ure. */.  un.fir
3220: 65 64 20 3d 20 30 3b 0a 20 20 70 74 68 72 65 61  ed = 0;.  pthrea
3230: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26 75 6e  d_mutex_init(&un
3240: 2e 6d 75 74 65 78 2c 20 30 29 3b 0a 20 20 70 74  .mutex, 0);.  pt
3250: 68 72 65 61 64 5f 63 6f 6e 64 5f 69 6e 69 74 28  hread_cond_init(
3260: 26 75 6e 2e 63 6f 6e 64 2c 20 30 29 3b 0a 0a 20  &un.cond, 0);.. 
3270: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
3280: 20 61 6e 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66   an unlock-notif
3290: 79 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  y callback. */. 
32a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 6e   rc = sqlite3_un
32b0: 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 64 62 2c 20  lock_notify(db, 
32c0: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62  unlock_notify_cb
32d0: 2c 20 28 76 6f 69 64 20 2a 29 26 75 6e 29 3b 0a  , (void *)&un);.
32e0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32f0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 7c 7c 20 72  LITE_LOCKED || r
3300: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
3310: 0a 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  /* The call t
3320: 6f 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  o sqlite3_unlock
3330: 5f 6e 6f 74 69 66 79 28 29 20 61 6c 77 61 79 73  _notify() always
3340: 20 72 65 74 75 72 6e 73 20 65 69 74 68 65 72 20   returns either 
3350: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 0a 20  SQLITE_LOCKED . 
3360: 20 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b   ** or SQLITE_OK
3370: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
3380: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 77 61  SQLITE_LOCKED wa
3390: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
33a0: 20 74 68 65 20 73 79 73 74 65 6d 20 69 73 20 64   the system is d
33b0: 65 61 64 6c 6f 63 6b 65 64 2e 20 49 6e 20 74 68  eadlocked. In th
33c0: 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 69  is.  ** case thi
33d0: 73 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  s function needs
33e0: 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
33f0: 45 5f 4c 4f 43 4b 45 44 20 74 6f 20 74 68 65 20  E_LOCKED to the 
3400: 63 61 6c 6c 65 72 20 73 6f 20 0a 20 20 2a 2a 20  caller so .  ** 
3410: 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  that the current
3420: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e   transaction can
3430: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
3440: 20 4f 74 68 65 72 77 69 73 65 2c 20 62 6c 6f 63   Otherwise, bloc
3450: 6b 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65  k.  ** until the
3460: 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
3470: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
3480: 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ed, then return 
3490: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
34a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 74 68 72 65  _OK ){.    pthre
34c0: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 75  ad_mutex_lock(&u
34d0: 6e 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66  n.mutex);.    if
34e0: 28 20 21 75 6e 2e 66 69 72 65 64 20 29 7b 0a 20  ( !un.fired ){. 
34f0: 20 20 20 20 20 70 74 68 72 65 61 64 5f 63 6f 6e       pthread_con
3500: 64 5f 77 61 69 74 28 26 75 6e 2e 63 6f 6e 64 2c  d_wait(&un.cond,
3510: 20 26 75 6e 2e 6d 75 74 65 78 29 3b 0a 20 20 20   &un.mutex);.   
3520: 20 7d 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d   }.    pthread_m
3530: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 75 6e 2e  utex_unlock(&un.
3540: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  mutex);.  }..  /
3550: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 6d 75  * Destroy the mu
3560: 74 65 78 20 61 6e 64 20 63 6f 6e 64 69 74 69 6f  tex and conditio
3570: 6e 20 76 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a  n variables. */.
3580: 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 64    pthread_cond_d
3590: 65 73 74 72 6f 79 28 26 75 6e 2e 63 6f 6e 64 29  estroy(&un.cond)
35a0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  ;.  pthread_mute
35b0: 78 5f 64 65 73 74 72 6f 79 28 26 75 6e 2e 6d 75  x_destroy(&un.mu
35c0: 74 65 78 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  tex);..  return 
35d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
35e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
35f0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
3600: 68 65 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  he SQLite functi
3610: 6f 6e 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  on sqlite3_step(
3620: 29 2e 0a 2a 2a 20 49 74 20 66 75 6e 63 74 69 6f  )..** It functio
3630: 6e 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ns in the same w
3640: 61 79 20 61 73 20 73 74 65 70 28 29 2c 20 65 78  ay as step(), ex
3650: 63 65 70 74 20 74 68 61 74 20 69 66 20 61 20 72  cept that if a r
3660: 65 71 75 69 72 65 64 0a 2a 2a 20 73 68 61 72 65  equired.** share
3670: 64 2d 63 61 63 68 65 20 6c 6f 63 6b 20 63 61 6e  d-cache lock can
3680: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
3690: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
36a0: 61 79 20 62 6c 6f 63 6b 20 77 61 69 74 69 6e 67  ay block waiting
36b0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b   for.** the lock
36c0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 76 61 69 6c   to become avail
36d0: 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 63  able. In this sc
36e0: 65 6e 61 72 69 6f 20 74 68 65 20 6e 6f 72 6d 61  enario the norma
36f0: 6c 20 41 50 49 20 73 74 65 70 28 29 0a 2a 2a 20  l API step().** 
3700: 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
3710: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  returns SQLITE_L
3720: 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  OCKED..**.** If 
3730: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
3740: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
3750: 4b 45 44 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  KED, the caller 
3760: 73 68 6f 75 6c 64 20 72 6f 6c 6c 62 61 63 6b 0a  should rollback.
3770: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
3780: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20 61  ransaction (if a
3790: 6e 79 29 20 61 6e 64 20 74 72 79 20 61 67 61 69  ny) and try agai
37a0: 6e 20 6c 61 74 65 72 2e 20 4f 74 68 65 72 77 69  n later. Otherwi
37b0: 73 65 2c 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  se, the.** syste
37c0: 6d 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 65 61  m may become dea
37d0: 64 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 69 6e 74 20  dlocked..*/.int 
37e0: 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67  sqlite3_blocking
37f0: 5f 73 74 65 70 28 73 71 6c 69 74 65 33 5f 73 74  _step(sqlite3_st
3800: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e  mt *pStmt){.  in
3810: 74 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20 53  t rc;.  while( S
3820: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3d 3d 28 72  QLITE_LOCKED==(r
3830: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
3840: 28 70 53 74 6d 74 29 29 20 29 7b 0a 20 20 20 20  (pStmt)) ){.    
3850: 72 63 20 3d 20 77 61 69 74 5f 66 6f 72 5f 75 6e  rc = wait_for_un
3860: 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 73 71 6c 69  lock_notify(sqli
3870: 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53  te3_db_handle(pS
3880: 74 6d 74 29 29 3b 0a 20 20 20 20 69 66 28 20 72  tmt));.    if( r
3890: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
38a0: 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  reak;.    sqlite
38b0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
38c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
38d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
38e0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
38f0: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20  pper around the 
3900: 53 51 4c 69 74 65 20 66 75 6e 63 74 69 6f 6e 20  SQLite function 
3910: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
3920: 76 32 28 29 2e 0a 2a 2a 20 49 74 20 66 75 6e 63  v2()..** It func
3930: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 73 61 6d  tions in the sam
3940: 65 20 77 61 79 20 61 73 20 70 72 65 70 61 72 65  e way as prepare
3950: 5f 76 32 28 29 2c 20 65 78 63 65 70 74 20 74 68  _v2(), except th
3960: 61 74 20 69 66 20 61 20 72 65 71 75 69 72 65 64  at if a required
3970: 0a 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65  .** shared-cache
3980: 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
3990: 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66  obtained, this f
39a0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 6c 6f 63  unction may bloc
39b0: 6b 20 77 61 69 74 69 6e 67 20 66 6f 72 0a 2a 2a  k waiting for.**
39c0: 20 74 68 65 20 6c 6f 63 6b 20 74 6f 20 62 65 63   the lock to bec
39d0: 6f 6d 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 49  ome available. I
39e0: 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  n this scenario 
39f0: 74 68 65 20 6e 6f 72 6d 61 6c 20 41 50 49 20 70  the normal API p
3a00: 72 65 70 61 72 65 5f 76 32 28 29 0a 2a 2a 20 66  repare_v2().** f
3a10: 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72  unction always r
3a20: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f  eturns SQLITE_LO
3a30: 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  CKED..**.** If t
3a40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
3a50: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
3a60: 45 44 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73  ED, the caller s
3a70: 68 6f 75 6c 64 20 72 6f 6c 6c 62 61 63 6b 0a 2a  hould rollback.*
3a80: 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  * the current tr
3a90: 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20 61 6e  ansaction (if an
3aa0: 79 29 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  y) and try again
3ab0: 20 6c 61 74 65 72 2e 20 4f 74 68 65 72 77 69 73   later. Otherwis
3ac0: 65 2c 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  e, the.** system
3ad0: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 65 61 64   may become dead
3ae0: 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  locked..*/.int s
3af0: 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f  qlite3_blocking_
3b00: 70 72 65 70 61 72 65 5f 76 32 28 0a 20 20 73 71  prepare_v2(.  sq
3b10: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
3b20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
3b30: 61 73 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 20  ase handle. */. 
3b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
3b50: 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 55 54  l,         /* UT
3b60: 46 2d 38 20 65 6e 63 6f 64 65 64 20 53 51 4c 20  F-8 encoded SQL 
3b70: 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
3b80: 69 6e 74 20 6e 53 71 6c 2c 20 20 20 20 20 20 20  int nSql,       
3b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3ba0: 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62  gth of zSql in b
3bb0: 79 74 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ytes. */.  sqlit
3bc0: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
3bd0: 2c 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 20 70  ,    /* OUT: A p
3be0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72  ointer to the pr
3bf0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
3c00: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3c10: 20 2a 2a 70 7a 20 20 20 20 20 20 20 20 20 20 20   **pz           
3c20: 2f 2a 20 4f 55 54 3a 20 45 6e 64 20 6f 66 20 70  /* OUT: End of p
3c30: 61 72 73 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  arsed string */.
3c40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77  ){.  int rc;.  w
3c50: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4c 4f 43  hile( SQLITE_LOC
3c60: 4b 45 44 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  KED==(rc = sqlit
3c70: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
3c80: 2c 20 7a 53 71 6c 2c 20 6e 53 71 6c 2c 20 70 70  , zSql, nSql, pp
3c90: 53 74 6d 74 2c 20 70 7a 29 29 20 29 7b 0a 20 20  Stmt, pz)) ){.  
3ca0: 20 20 72 63 20 3d 20 77 61 69 74 5f 66 6f 72 5f    rc = wait_for_
3cb0: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 64 62  unlock_notify(db
3cc0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
3cd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
3ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3cf0: 63 3b 0a 7d 0a 2f 2a 20 45 4e 44 5f 53 51 4c 49  c;.}./* END_SQLI
3d00: 54 45 5f 42 4c 4f 43 4b 49 4e 47 5f 53 54 45 50  TE_BLOCKING_STEP
3d10: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65   */../*.** Usage
3d20: 3a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b 69  : sqlite3_blocki
3d30: 6e 67 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a  ng_step STMT.**.
3d40: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73  ** Advance the s
3d50: 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20  tatement to the 
3d60: 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  next row..*/.sta
3d70: 74 69 63 20 69 6e 74 20 62 6c 6f 63 6b 69 6e 67  tic int blocking
3d80: 5f 73 74 65 70 5f 70 72 6f 63 28 0a 20 20 76 6f  _step_proc(.  vo
3d90: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
3da0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3db0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
3dc0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
3dd0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20  NST objv[].){.. 
3de0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
3df0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
3e00: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
3e10: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
3e20: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
3e30: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
3e40: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3e50: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 53  ERROR;.  }..  pS
3e60: 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73  tmt = (sqlite3_s
3e70: 74 6d 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74  tmt*)sqlite3Test
3e80: 54 65 78 74 54 6f 50 74 72 28 54 63 6c 5f 47 65  TextToPtr(Tcl_Ge
3e90: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
3ea0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
3eb0: 33 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65 70 28  3_blocking_step(
3ec0: 70 53 74 6d 74 29 3b 0a 0a 20 20 54 63 6c 5f 53  pStmt);..  Tcl_S
3ed0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
3ee0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
3ef0: 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63  TestErrorName(rc
3f00: 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
3f10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
3f20: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
3f30: 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65  blocking_prepare
3f40: 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
3f50: 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 20 55 73   ?tailvar?.** Us
3f60: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6e 6f 6e  age: sqlite3_non
3f70: 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65  blocking_prepare
3f80: 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
3f90: 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2f 0a 73 74   ?tailvar?.*/.st
3fa0: 61 74 69 63 20 69 6e 74 20 62 6c 6f 63 6b 69 6e  atic int blockin
3fb0: 67 5f 70 72 65 70 61 72 65 5f 76 32 5f 70 72 6f  g_prepare_v2_pro
3fc0: 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  c(.  void * clie
3fd0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
3fe0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
3ff0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
4000: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
4010: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
4020: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4030: 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79   *zSql;.  int by
4040: 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tes;.  const cha
4050: 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  r *zTail = 0;.  
4060: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
4070: 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
4080: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20  zBuf[50];.  int 
4090: 72 63 3b 0a 20 20 69 6e 74 20 69 73 42 6c 6f 63  rc;.  int isBloc
40a0: 6b 69 6e 67 20 3d 20 21 28 63 6c 69 65 6e 74 44  king = !(clientD
40b0: 61 74 61 3d 3d 30 29 3b 0a 0a 20 20 69 66 28 20  ata==0);..  if( 
40c0: 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
40d0: 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
40e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
40f0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4100: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4110: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
4120: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
4130: 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
4140: 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
4150: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4160: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
4170: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
4180: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
4190: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
41a0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
41b0: 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
41c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
41d0: 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
41e0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
41f0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
4200: 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
4210: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28  CL_ERROR;..  if(
4220: 20 69 73 42 6c 6f 63 6b 69 6e 67 20 29 7b 0a 20   isBlocking ){. 
4230: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4240: 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61 72 65  blocking_prepare
4250: 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  _v2(db, zSql, by
4260: 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54  tes, &pStmt, &zT
4270: 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ail);.  }else{. 
4280: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4290: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
42a0: 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
42b0: 6d 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 7d  mt, &zTail);.  }
42c0: 0a 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53  ..  assert(rc==S
42d0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d  QLITE_OK || pStm
42e0: 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 7a 54 61  t==0);.  if( zTa
42f0: 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b  il && objc>=5 ){
4300: 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d  .    if( bytes>=
4310: 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  0 ){.      bytes
4320: 20 3d 20 62 79 74 65 73 20 2d 20 28 7a 54 61 69   = bytes - (zTai
4330: 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  l-zSql);.    }. 
4340: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
4350: 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
4360: 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ], 0, Tcl_NewStr
4370: 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79  ingObj(zTail, by
4380: 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  tes), 0);.  }.  
4390: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
43a0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
43b0: 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20   pStmt==0 );.   
43c0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
43d0: 25 73 20 22 2c 20 28 63 68 61 72 20 2a 29 73 71  %s ", (char *)sq
43e0: 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
43f0: 6d 65 28 72 63 29 29 3b 0a 20 20 20 20 54 63 6c  me(rc));.    Tcl
4400: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4410: 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
4420: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
4430: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
4440: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
4450: 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
4460: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
4470: 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
4480: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
4490: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
44a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
44b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
44c0: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
44d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
44e0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
44f0: 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  * SQLITE_OS_UNIX
4500: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
4510: 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 20  E_UNLOCK_NOTIFY 
4520: 2a 2f 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  */./*.** End of 
4530: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
4540: 66 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 63 6b  f [sqlite3_block
4550: 69 6e 67 5f 73 74 65 70 5d 2e 0a 2a 2a 2a 2a 2a  ing_step]..*****
4560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45a0: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ***/../*.** Regi
45b0: 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ster commands wi
45c0: 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
45d0: 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53  preter..*/.int S
45e0: 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f  qlitetestThread_
45f0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
4600: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f  *interp){.  Tcl_
4610: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
4620: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 74 68 72  (interp, "sqlthr
4630: 65 61 64 22 2c 20 73 71 6c 74 68 72 65 61 64 5f  ead", sqlthread_
4640: 70 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 54  proc, 0, 0);.  T
4650: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
4660: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 63 6c 6f  and(interp, "clo
4670: 63 6b 5f 73 65 63 6f 6e 64 73 22 2c 20 63 6c 6f  ck_seconds", clo
4680: 63 6b 5f 73 65 63 6f 6e 64 73 5f 70 72 6f 63 2c  ck_seconds_proc,
4690: 20 30 2c 20 30 29 3b 0a 23 69 66 20 64 65 66 69   0, 0);.#if defi
46a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  ned(SQLITE_OS_UN
46b0: 49 58 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  IX) && defined(S
46c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
46d0: 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 20 20 54 63  OCK_NOTIFY).  Tc
46e0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
46f0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
4700: 74 65 33 5f 62 6c 6f 63 6b 69 6e 67 5f 73 74 65  te3_blocking_ste
4710: 70 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 73 74 65  p", blocking_ste
4720: 70 5f 70 72 6f 63 2c 30 2c 30 29 3b 0a 20 20 54  p_proc,0,0);.  T
4730: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
4740: 61 6e 64 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  and(interp, .   
4750: 20 20 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 63     "sqlite3_bloc
4760: 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32 22  king_prepare_v2"
4770: 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70 61  , blocking_prepa
4780: 72 65 5f 76 32 5f 70 72 6f 63 2c 20 28 76 6f 69  re_v2_proc, (voi
4790: 64 20 2a 29 31 2c 20 30 29 3b 0a 20 20 54 63 6c  d *)1, 0);.  Tcl
47a0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
47b0: 64 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  d(interp, .     
47c0: 20 22 73 71 6c 69 74 65 33 5f 6e 6f 6e 62 6c 6f   "sqlite3_nonblo
47d0: 63 6b 69 6e 67 5f 70 72 65 70 61 72 65 5f 76 32  cking_prepare_v2
47e0: 22 2c 20 62 6c 6f 63 6b 69 6e 67 5f 70 72 65 70  ", blocking_prep
47f0: 61 72 65 5f 76 32 5f 70 72 6f 63 2c 20 30 2c 20  are_v2_proc, 0, 
4800: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  0);.#endif.  ret
4810: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
4820: 6c 73 65 0a 69 6e 74 20 53 71 6c 69 74 65 74 65  lse.int Sqlitete
4830: 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54 63  stThread_Init(Tc
4840: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4850: 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ){.  return TCL_
4860: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a           OK;.}.#endif.