/ Hex Artifact Content
Login

Artifact 11a2618c227fd13ccad73ee02d1199f9880c59db2b3144fd7432db1980a2577d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you 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 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 20 20 20 20 20 20 20 20 20  -DTCLSH         
0230: 41 64 64 20 61 20 22 6d 61 69 6e 28 29 22 20 72  Add a "main()" r
0240: 6f 75 74 69 6e 65 20 74 68 61 74 20 77 6f 72 6b  outine that work
0250: 73 20 61 73 20 61 20 74 63 6c 73 68 2e 0a 2a 2a  s as a tclsh..**
0260: 0a 2a 2a 20 20 2d 44 54 43 4c 53 48 5f 49 4e 49  .**  -DTCLSH_INI
0270: 54 5f 50 52 4f 43 3d 6e 61 6d 65 0a 2a 2a 0a 2a  T_PROC=name.**.*
0280: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0290: 20 20 20 49 6e 76 6f 6b 65 20 6e 61 6d 65 28 69     Invoke name(i
02a0: 6e 74 65 72 70 29 20 74 6f 20 69 6e 69 74 69 61  nterp) to initia
02b0: 6c 69 7a 65 20 74 68 65 20 54 63 6c 20 69 6e 74  lize the Tcl int
02c0: 65 72 70 72 65 74 65 72 2e 0a 2a 2a 20 20 20 20  erpreter..**    
02d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66                If
02e0: 20 6e 61 6d 65 28 69 6e 74 65 72 70 29 20 72 65   name(interp) re
02f0: 74 75 72 6e 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  turns a non-NULL
0300: 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 72 75   string, then ru
0310: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
0320: 20 20 20 20 20 20 74 68 61 74 20 73 74 72 69 6e        that strin
0330: 67 20 61 73 20 61 20 54 63 6c 20 73 63 72 69 70  g as a Tcl scrip
0340: 74 20 74 6f 20 6c 61 75 6e 63 68 20 74 68 65 20  t to launch the 
0350: 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 2a 2a 20  application..** 
0360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0370: 20 49 66 20 6e 61 6d 65 28 69 6e 74 65 72 70 29   If name(interp)
0380: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2c 20 74   returns NULL, t
0390: 68 65 6e 20 72 75 6e 20 74 68 65 20 72 65 67 75  hen run the regu
03a0: 6c 61 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  lar.**          
03b0: 20 20 20 20 20 20 20 20 74 63 6c 73 68 2d 65 6d          tclsh-em
03c0: 75 6c 61 74 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a  ulator code..*/.
03d0: 23 69 66 64 65 66 20 54 43 4c 53 48 5f 49 4e 49  #ifdef TCLSH_INI
03e0: 54 5f 50 52 4f 43 0a 23 20 64 65 66 69 6e 65 20  T_PROC.# define 
03f0: 54 43 4c 53 48 20 31 0a 23 65 6e 64 69 66 0a 0a  TCLSH 1.#endif..
0400: 2f 2a 0a 2a 2a 20 49 66 20 72 65 71 75 65 73 74  /*.** If request
0410: 65 64 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20  ed, include the 
0420: 53 51 4c 69 74 65 20 63 6f 6d 70 69 6c 65 72 20  SQLite compiler 
0430: 6f 70 74 69 6f 6e 73 20 66 69 6c 65 20 66 6f 72  options file for
0440: 20 4d 53 56 43 2e 0a 2a 2f 0a 23 69 66 20 64 65   MSVC..*/.#if de
0450: 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 4d 53  fined(INCLUDE_MS
0460: 56 43 5f 48 29 0a 23 20 69 6e 63 6c 75 64 65 20  VC_H).# include 
0470: 22 6d 73 76 63 2e 68 22 0a 23 65 6e 64 69 66 0a  "msvc.h".#endif.
0480: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 43  .#if defined(INC
0490: 4c 55 44 45 5f 53 51 4c 49 54 45 5f 54 43 4c 5f  LUDE_SQLITE_TCL_
04a0: 48 29 0a 23 20 69 6e 63 6c 75 64 65 20 22 73 71  H).# include "sq
04b0: 6c 69 74 65 5f 74 63 6c 2e 68 22 0a 23 65 6c 73  lite_tcl.h".#els
04c0: 65 0a 23 20 69 6e 63 6c 75 64 65 20 22 74 63 6c  e.# include "tcl
04d0: 2e 68 22 0a 23 20 69 66 6e 64 65 66 20 53 51 4c  .h".# ifndef SQL
04e0: 49 54 45 5f 54 43 4c 41 50 49 0a 23 20 20 64 65  ITE_TCLAPI.#  de
04f0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 41  fine SQLITE_TCLA
0500: 50 49 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  PI.# endif.#endi
0510: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e  f.#include <errn
0520: 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  o.h>../*.** Some
0530: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 63 6c   additional incl
0540: 75 64 65 20 66 69 6c 65 73 20 61 72 65 20 6e 65  ude files are ne
0550: 65 64 65 64 20 69 66 20 74 68 69 73 20 66 69 6c  eded if this fil
0560: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  e is not.** appe
0570: 6e 64 65 64 20 74 6f 20 74 68 65 20 61 6d 61 6c  nded to the amal
0580: 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  gamation..*/.#if
0590: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
05a0: 47 41 4d 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75  GAMATION.# inclu
05b0: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23  de "sqlite3.h".#
05c0: 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62   include <stdlib
05d0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
05e0: 74 72 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75  tring.h>.# inclu
05f0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 20 20  de <assert.h>.  
0600: 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64  typedef unsigned
0610: 20 63 68 61 72 20 75 38 3b 0a 23 65 6e 64 69 66   char u8;.#endif
0620: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
0630: 2e 68 3e 0a 0a 2f 2a 20 55 73 65 64 20 74 6f 20  .h>../* Used to 
0640: 67 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  get the current 
0650: 70 72 6f 63 65 73 73 20 49 44 20 2a 2f 0a 23 69  process ID */.#i
0660: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
0670: 32 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e  2).# include <un
0680: 69 73 74 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65  istd.h>.# define
0690: 20 47 45 54 50 49 44 20 67 65 74 70 69 64 0a 23   GETPID getpid.#
06a0: 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  elif !defined(_W
06b0: 49 4e 33 32 5f 57 43 45 29 0a 23 20 69 66 6e 64  IN32_WCE).# ifnd
06c0: 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
06d0: 4d 41 54 49 4f 4e 0a 23 20 20 69 66 6e 64 65 66  MATION.#  ifndef
06e0: 20 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e 44 5f   WIN32_LEAN_AND_
06f0: 4d 45 41 4e 0a 23 20 20 20 64 65 66 69 6e 65 20  MEAN.#   define 
0700: 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e 44 5f 4d  WIN32_LEAN_AND_M
0710: 45 41 4e 0a 23 20 20 65 6e 64 69 66 0a 23 20 20  EAN.#  endif.#  
0720: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73  include <windows
0730: 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 20 64 65  .h>.# endif.# de
0740: 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e 74  fine GETPID (int
0750: 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  )GetCurrentProce
0760: 73 73 49 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ssId.#endif../*.
0770: 20 2a 20 57 69 6e 64 6f 77 73 20 6e 65 65 64 73   * Windows needs
0780: 20 74 6f 20 6b 6e 6f 77 20 77 68 69 63 68 20 73   to know which s
0790: 79 6d 62 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74  ymbols to export
07a0: 2e 20 20 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74  .  Unix does not
07b0: 2e 0a 20 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74  .. * BUILD_sqlit
07c0: 65 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 64 65  e should be unde
07d0: 66 69 6e 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a  fined for Unix..
07e0: 20 2a 2f 0a 23 69 66 64 65 66 20 42 55 49 4c 44   */.#ifdef BUILD
07f0: 5f 73 71 6c 69 74 65 0a 23 75 6e 64 65 66 20 54  _sqlite.#undef T
0800: 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53  CL_STORAGE_CLASS
0810: 0a 23 64 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f  .#define TCL_STO
0820: 52 41 47 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58  RAGE_CLASS DLLEX
0830: 50 4f 52 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42  PORT.#endif /* B
0840: 55 49 4c 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a  UILD_sqlite */..
0850: 23 64 65 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50  #define NUM_PREP
0860: 41 52 45 44 5f 53 54 4d 54 53 20 31 30 0a 23 64  ARED_STMTS 10.#d
0870: 65 66 69 6e 65 20 4d 41 58 5f 50 52 45 50 41 52  efine MAX_PREPAR
0880: 45 44 5f 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a  ED_STMTS 100../*
0890: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
08a0: 74 69 6f 6e 20 2a 2f 0a 74 79 70 65 64 65 66 20  tion */.typedef 
08b0: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
08c0: 53 71 6c 69 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a  SqliteDb;../*.**
08d0: 20 4e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f   New SQL functio
08e0: 6e 73 20 63 61 6e 20 62 65 20 63 72 65 61 74 65  ns can be create
08f0: 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73  d as TCL scripts
0900: 2e 20 20 45 61 63 68 20 73 75 63 68 20 66 75 6e  .  Each such fun
0910: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63  ction.** is desc
0920: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
0930: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0940: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
0950: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0960: 63 74 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75  ct SqlFunc SqlFu
0970: 6e 63 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75  nc;.struct SqlFu
0980: 6e 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nc {.  Tcl_Inter
0990: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
09a0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
09b0: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
09c0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
09d0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
09e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f       /* The Tcl_
09f0: 4f 62 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69  Obj representati
0a00: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74  on of the script
0a10: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   */.  SqliteDb *
0a20: 70 44 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  pDb;        /* D
0a30: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a40: 6f 6e 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69  on that owns thi
0a50: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
0a60: 69 6e 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b  int useEvalObjv;
0a70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0a80: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75   it is safe to u
0a90: 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20  se Tcl_EvalObjv 
0aa0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
0ab0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
0ac0: 6d 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  me of this funct
0ad0: 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63  ion */.  SqlFunc
0ae0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f   *pNext;       /
0af0: 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20  * Next function 
0b00: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74  on the list of t
0b10: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  hem all */.};../
0b20: 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69  *.** New collati
0b30: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e  on sequences fun
0b40: 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65  ction can be cre
0b50: 61 74 65 64 20 61 73 20 54 43 4c 20 73 63 72 69  ated as TCL scri
0b60: 70 74 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a  pts.  Each such.
0b70: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64  ** function is d
0b80: 65 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69  escribed by an i
0b90: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0ba0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
0bb0: 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  re..*/.typedef s
0bc0: 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65  truct SqlCollate
0bd0: 20 53 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72   SqlCollate;.str
0be0: 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b  uct SqlCollate {
0bf0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
0c00: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
0c10: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f  TCL interpret to
0c20: 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e   execute the fun
0c30: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ction */.  char 
0c40: 2a 7a 53 63 72 69 70 74 3b 20 20 20 20 20 20 20  *zScript;       
0c50: 20 2f 2a 20 54 68 65 20 73 63 72 69 70 74 20 74   /* The script t
0c60: 6f 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71  o be run */.  Sq
0c70: 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b  lCollate *pNext;
0c80: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63      /* Next func
0c90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74  tion on the list
0ca0: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
0cb0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  };../*.** Prepar
0cc0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ed statements ar
0cd0: 65 20 63 61 63 68 65 64 20 66 6f 72 20 66 61 73  e cached for fas
0ce0: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
0cf0: 45 61 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a  Each prepared.**
0d00: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65   statement is de
0d10: 73 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e  scribed by an in
0d20: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0d30: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0d40: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0d50: 72 75 63 74 20 53 71 6c 50 72 65 70 61 72 65 64  ruct SqlPrepared
0d60: 53 74 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64  Stmt SqlPrepared
0d70: 53 74 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c  Stmt;.struct Sql
0d80: 50 72 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20  PreparedStmt {. 
0d90: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0da0: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
0db0: 74 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74  t in linked list
0dc0: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
0dd0: 64 53 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f  dStmt *pPrev;  /
0de0: 2a 20 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68  * Previous on th
0df0: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  e list */.  sqli
0e00: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
0e10: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
0e20: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
0e30: 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20  /.  int nSql;   
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e50: 63 68 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20  chars in zSql[] 
0e60: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0e70: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 2f 2a  *zSql;        /*
0e80: 20 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   Text of the SQL
0e90: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0ea0: 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20  int nParm;      
0eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
0ec0: 20 6f 66 20 61 70 50 61 72 6d 20 61 72 72 61 79   of apParm array
0ed0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a   */.  Tcl_Obj **
0ee0: 61 70 50 61 72 6d 3b 20 20 20 20 20 20 20 20 2f  apParm;        /
0ef0: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 66 65 72  * Array of refer
0f00: 65 6e 63 65 64 20 6f 62 6a 65 63 74 20 70 6f 69  enced object poi
0f10: 6e 74 65 72 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70  nters */.};..typ
0f20: 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 63 72  edef struct Incr
0f30: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 49 6e 63 72  blobChannel Incr
0f40: 62 6c 6f 62 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a  blobChannel;../*
0f50: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  .** There is one
0f60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
0f70: 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
0f80: 65 61 63 68 20 53 51 4c 69 74 65 20 64 61 74 61  each SQLite data
0f90: 62 61 73 65 0a 2a 2a 20 74 68 61 74 20 68 61 73  base.** that has
0fa0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20   been opened by 
0fb0: 74 68 65 20 53 51 4c 69 74 65 20 54 43 4c 20 69  the SQLite TCL i
0fc0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
0fd0: 49 66 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  If this module i
0fe0: 73 20 62 75 69 6c 74 20 77 69 74 68 20 53 51 4c  s built with SQL
0ff0: 49 54 45 5f 54 45 53 54 20 64 65 66 69 6e 65 64  ITE_TEST defined
1000: 20 28 74 6f 20 63 72 65 61 74 65 20 74 68 65 20   (to create the 
1010: 53 51 4c 69 74 65 0a 2a 2a 20 74 65 73 74 66 69  SQLite.** testfi
1020: 78 74 75 72 65 20 65 78 65 63 75 74 61 62 6c 65  xture executable
1030: 29 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  ), then it may b
1040: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  e configured to 
1050: 75 73 65 20 65 69 74 68 65 72 0a 2a 2a 20 73 71  use either.** sq
1060: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1070: 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 70 72  () or sqlite3_pr
1080: 65 70 61 72 65 28 29 20 74 6f 20 70 72 65 70 61  epare() to prepa
1090: 72 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  re SQL statement
10a0: 73 2e 0a 2a 2a 20 49 66 20 53 71 6c 69 74 65 44  s..** If SqliteD
10b0: 62 2e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65  b.bLegacyPrepare
10c0: 20 69 73 20 74 72 75 65 2c 20 73 71 6c 69 74 65   is true, sqlite
10d0: 33 5f 70 72 65 70 61 72 65 28 29 20 69 73 20 75  3_prepare() is u
10e0: 73 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  sed..*/.struct S
10f0: 71 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69  qliteDb {.  sqli
1100: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
1110: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72         /* The "r
1120: 65 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74  eal" database st
1130: 72 75 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45  ructure. MUST BE
1140: 20 46 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f   FIRST */.  Tcl_
1150: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
1160: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1170: 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66  terpreter used f
1180: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1190: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73   */.  char *zBus
11a0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
11b0: 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c   /* The busy cal
11c0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
11d0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  .  char *zCommit
11e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11f0: 20 54 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   The commit hook
1200: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
1210: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72  e */.  char *zTr
1220: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
1230: 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63    /* The trace c
1240: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
1250: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63  */.  char *zTrac
1260: 65 56 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  eV2;            
1270: 2f 2a 20 54 68 65 20 74 72 61 63 65 5f 76 32 20  /* The trace_v2 
1280: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
1290: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f   */.  char *zPro
12a0: 66 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  file;           
12b0: 20 2f 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20   /* The profile 
12c0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
12d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f   */.  char *zPro
12e0: 67 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20  gress;          
12f0: 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73   /* The progress
1300: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
1310: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75  e */.  char *zAu
1320: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1330: 20 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69    /* The authori
1340: 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20  zation callback 
1350: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1360: 20 64 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20   disableAuth;   
1370: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
1380: 6c 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65  le the authorize
1390: 72 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a  r if it exists *
13a0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b  /.  char *zNull;
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13c0: 2a 20 54 65 78 74 20 74 6f 20 73 75 62 73 74 69  * Text to substi
13d0: 74 75 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20  tute for an SQL 
13e0: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
13f0: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20  SqlFunc *pFunc; 
1400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1410: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
1420: 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ons */.  Tcl_Obj
1430: 20 2a 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20   *pUpdateHook;  
1440: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f      /* Update ho
1450: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
1460: 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  y) */.  Tcl_Obj 
1470: 2a 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3b  *pPreUpdateHook;
1480: 20 20 20 2f 2a 20 50 72 65 2d 75 70 64 61 74 65     /* Pre-update
1490: 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66   hook script (if
14a0: 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f   any) */.  Tcl_O
14b0: 62 6a 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  bj *pRollbackHoo
14c0: 6b 3b 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63  k;    /* Rollbac
14d0: 6b 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69  k hook script (i
14e0: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f  f any) */.  Tcl_
14f0: 4f 62 6a 20 2a 70 57 61 6c 48 6f 6f 6b 3b 20 20  Obj *pWalHook;  
1500: 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 68 6f         /* WAL ho
1510: 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e  ok script (if an
1520: 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  y) */.  Tcl_Obj 
1530: 2a 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 20  *pUnlockNotify; 
1540: 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 6e 6f 74     /* Unlock not
1550: 69 66 79 20 73 63 72 69 70 74 20 28 69 66 20 61  ify script (if a
1560: 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c  ny) */.  SqlColl
1570: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20  ate *pCollate;  
1580: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53      /* List of S
1590: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
15a0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
15b0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
15c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
15d0: 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65   code of most re
15e0: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  cent sqlite3_exe
15f0: 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  c() */.  Tcl_Obj
1600: 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64   *pCollateNeeded
1610: 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e  ;   /* Collation
1620: 20 6e 65 65 64 65 64 20 73 63 72 69 70 74 20 2a   needed script *
1630: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
1640: 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f  tmt *stmtList; /
1650: 2a 20 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72  * List of prepar
1660: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a  ed statements*/.
1670: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
1680: 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20  t *stmtLast; /* 
1690: 4c 61 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69  Last statement i
16a0: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
16b0: 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20  int maxStmt;    
16c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16d0: 65 20 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e  e next maximum n
16e0: 75 6d 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73  umber of stmtLis
16f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74  t */.  int nStmt
1700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1710: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
1720: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d  tatements in stm
1730: 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62  tList */.  Incrb
1740: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63  lobChannel *pInc
1750: 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20  rblob;/* Linked 
1760: 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63  list of open inc
1770: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1780: 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70 2c 20 6e  /.  int nStep, n
1790: 53 6f 72 74 2c 20 6e 49 6e 64 65 78 3b 20 20 2f  Sort, nIndex;  /
17a0: 2a 20 53 74 61 74 69 73 74 69 63 73 20 66 6f 72  * Statistics for
17b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6f 70 65   most recent ope
17c0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
17d0: 6e 56 4d 53 74 65 70 3b 20 20 20 20 20 20 20 20  nVMStep;        
17e0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
17f0: 72 20 73 74 61 74 69 73 74 69 63 20 66 6f 72 20  r statistic for 
1800: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72  most recent oper
1810: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ation */.  int n
1820: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20  Transaction;    
1830: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1840: 6f 66 20 6e 65 73 74 65 64 20 5b 74 72 61 6e 73  of nested [trans
1850: 61 63 74 69 6f 6e 5d 20 6d 65 74 68 6f 64 73 20  action] methods 
1860: 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  */.  int openFla
1870: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1880: 2f 2a 20 46 6c 61 67 73 20 75 73 65 64 20 74 6f  /* Flags used to
1890: 20 6f 70 65 6e 2e 20 20 28 53 51 4c 49 54 45 5f   open.  (SQLITE_
18a0: 4f 50 45 4e 5f 55 52 49 29 20 2a 2f 0a 23 69 66  OPEN_URI) */.#if
18b0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18c0: 20 20 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65    int bLegacyPre
18d0: 70 61 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  pare;        /* 
18e0: 54 72 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69  True to use sqli
18f0: 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f  te3_prepare() */
1900: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75  .#endif.};..stru
1910: 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  ct IncrblobChann
1920: 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62  el {.  sqlite3_b
1930: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
1940: 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62   /* sqlite3 blob
1950: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c   handle */.  Sql
1960: 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20  iteDb *pDb;     
1970: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
1980: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f  ated database co
1990: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
19a0: 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20  t iSeek;        
19b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
19c0: 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a  nt seek offset *
19d0: 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  /.  Tcl_Channel 
19e0: 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a  channel;      /*
19f0: 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66   Channel identif
1a00: 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  ier */.  Incrblo
1a10: 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b  bChannel *pNext;
1a20: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
1a30: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e  t of all open in
1a40: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20  crblob channels 
1a50: 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  */.  IncrblobCha
1a60: 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f  nnel *pPrev;   /
1a70: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1a80: 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c   all open incrbl
1a90: 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d  ob channels */.}
1aa0: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  ;../*.** Compute
1ab0: 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   a string length
1ac0: 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64   that is limited
1ad0: 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20   to what can be 
1ae0: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77  stored in.** low
1af0: 65 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20  er 30 bits of a 
1b00: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
1b10: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
1b20: 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f   int strlen30(co
1b30: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
1b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d  const char *z2 =
1b50: 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32   z;.  while( *z2
1b60: 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65   ){ z2++; }.  re
1b70: 74 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20  turn 0x3fffffff 
1b80: 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b  & (int)(z2 - z);
1b90: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1ba0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1bb0: 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  B./*.** Close al
1bc0: 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  l incrblob chann
1bd0: 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  els opened using
1be0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1bf0: 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69  tion pDb..** Thi
1c00: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
1c10: 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74   shutting down t
1c20: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1c30: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
1c40: 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72  c void closeIncr
1c50: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c  blobChannels(Sql
1c60: 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49  iteDb *pDb){.  I
1c70: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1c80: 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  p;.  IncrblobCha
1c90: 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20  nnel *pNext;..  
1ca0: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72  for(p=pDb->pIncr
1cb0: 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74  blob; p; p=pNext
1cc0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
1cd0: 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a  ->pNext;..    /*
1ce0: 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75   Note: Calling u
1cf0: 6e 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63  nregister here c
1d00: 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e  all Tcl_Close on
1d10: 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68   the incrblob ch
1d20: 61 6e 6e 65 6c 2c 0a 20 20 20 20 2a 2a 20 77 68  annel,.    ** wh
1d30: 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65 20  ich deletes the 
1d40: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1d50: 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e  structure at *p.
1d60: 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   So do not.    *
1d70: 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28  * call Tcl_Free(
1d80: 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ) here..    */. 
1d90: 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65     Tcl_Unregiste
1da0: 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e  rChannel(pDb->in
1db0: 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c  terp, p->channel
1dc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1dd0: 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65  Close an increme
1de0: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1df0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1e00: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69   SQLITE_TCLAPI i
1e10: 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 0a 20 20  ncrblobClose(.  
1e20: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
1e30: 6e 63 65 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  nceData,.  Tcl_I
1e40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 0a 29 7b  nterp *interp.){
1e50: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1e60: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
1e70: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
1e80: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72  nceData;.  int r
1e90: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
1ea0: 5f 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29  _close(p->pBlob)
1eb0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1ec0: 3d 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20  = p->pDb->db;.. 
1ed0: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63   /* Remove the c
1ee0: 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20  hannel from the 
1ef0: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
1f00: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66  ob list. */.  if
1f10: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
1f20: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
1f30: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
1f40: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  }.  if( p->pPrev
1f50: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
1f60: 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
1f70: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
1f80: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d  >pDb->pIncrblob=
1f90: 3d 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62  =p ){.    p->pDb
1fa0: 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d  ->pIncrblob = p-
1fb0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f  >pNext;.  }..  /
1fc0: 2a 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62  * Free the Incrb
1fd0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63  lobChannel struc
1fe0: 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72  ture */.  Tcl_Fr
1ff0: 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a  ee((char *)p);..
2000: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2010: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
2020: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
2030: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2040: 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c  _errmsg(db), TCL
2050: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
2060: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
2080: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2090: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
20a0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
20b0: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
20c0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
20d0: 5f 54 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62  _TCLAPI incrblob
20e0: 49 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44  Input(.  ClientD
20f0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2100: 2c 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 0a 20  ,.  char *buf,. 
2110: 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20   int bufSize,.  
2120: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
2130: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
2140: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
2150: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
2160: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
2170: 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69  nt nRead = bufSi
2180: 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ze;         /* N
2190: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
21a0: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
21b0: 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
21c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
21d0: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  l size of the bl
21e0: 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ob */.  int rc; 
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65       /* sqlite e
2210: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  rror code */..  
2220: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
2230: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
2240: 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  lob);.  if( (p->
2250: 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c  iSeek+nRead)>nBl
2260: 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20  ob ){.    nRead 
2270: 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b  = nBlob-p->iSeek
2280: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61  ;.  }.  if( nRea
2290: 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d<=0 ){.    retu
22a0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  rn 0;.  }..  rc 
22b0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
22c0: 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ead(p->pBlob, (v
22d0: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64  oid *)buf, nRead
22e0: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
22f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2300: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
2310: 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20  dePtr = rc;.    
2320: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
2330: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52    p->iSeek += nR
2340: 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52  ead;.  return nR
2350: 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ead;.}../*.** Wr
2360: 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69  ite data to an i
2370: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2380: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2390: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
23a0: 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 4f 75 74  LAPI incrblobOut
23b0: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
23c0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a  a instanceData,.
23d0: 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75    CONST char *bu
23e0: 66 2c 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65  f,.  int toWrite
23f0: 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  ,.  int *errorCo
2400: 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62  dePtr.){.  Incrb
2410: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
2420: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
2430: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
2440: 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
2450: 74 6f 57 72 69 74 65 3b 20 20 20 20 20 20 20 20  toWrite;        
2460: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2470: 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  es to write */. 
2480: 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20   int nBlob;     
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a0: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
24b0: 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74  he blob */.  int
24c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
24e0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
24f0: 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c  /..  nBlob = sql
2500: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
2510: 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  p->pBlob);.  if(
2520: 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74   (p->iSeek+nWrit
2530: 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20  e)>nBlob ){.    
2540: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2550: 45 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75  EINVAL;.    retu
2560: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28  rn -1;.  }.  if(
2570: 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20   nWrite<=0 ){.  
2580: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2590: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
25a0: 62 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42  blob_write(p->pB
25b0: 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66  lob, (void *)buf
25c0: 2c 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65  , nWrite, p->iSe
25d0: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
25e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
2600: 45 49 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  EIO;.    return 
2610: 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53  -1;.  }..  p->iS
2620: 65 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  eek += nWrite;. 
2630: 20 72 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a   return nWrite;.
2640: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e  }../*.** Seek an
2650: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2660: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
2670: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2680: 54 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 53  TCLAPI incrblobS
2690: 65 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  eek(.  ClientDat
26a0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a  a instanceData,.
26b0: 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20    long offset,. 
26c0: 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20   int seekMode,. 
26d0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
26e0: 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  tr.){.  Incrblob
26f0: 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e  Channel *p = (In
2700: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29  crblobChannel *)
2710: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20  instanceData;.. 
2720: 20 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64   switch( seekMod
2730: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45  e ){.    case SE
2740: 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d  EK_SET:.      p-
2750: 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b  >iSeek = offset;
2760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2770: 20 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a    case SEEK_CUR:
2780: 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20  .      p->iSeek 
2790: 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20  += offset;.     
27a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
27b0: 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20   SEEK_END:.     
27c0: 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69   p->iSeek = sqli
27d0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
27e0: 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65  ->pBlob) + offse
27f0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
2800: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
2810: 73 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d  sert(!"Bad seekM
2820: 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ode");.  }..  re
2830: 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d  turn p->iSeek;.}
2840: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  ...static void S
2850: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63  QLITE_TCLAPI inc
2860: 72 62 6c 6f 62 57 61 74 63 68 28 0a 20 20 43 6c  rblobWatch(.  Cl
2870: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
2880: 65 44 61 74 61 2c 0a 20 20 69 6e 74 20 6d 6f 64  eData,.  int mod
2890: 65 0a 29 7b 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20  e.){.  /* NO-OP 
28a0: 2a 2f 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  */.}.static int 
28b0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e  SQLITE_TCLAPI in
28c0: 63 72 62 6c 6f 62 48 61 6e 64 6c 65 28 0a 20 20  crblobHandle(.  
28d0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
28e0: 6e 63 65 44 61 74 61 2c 0a 20 20 69 6e 74 20 64  nceData,.  int d
28f0: 69 72 2c 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ir,.  ClientData
2900: 20 2a 68 50 74 72 0a 29 7b 0a 20 20 72 65 74 75   *hPtr.){.  retu
2910: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
2920: 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e  .static Tcl_Chan
2930: 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62  nelType Incrblob
2940: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
2950: 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20    "incrblob",   
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65       /* typeName
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
29a0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
29b0: 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20  RSION_2,        
29c0: 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20       /* version 
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
29f0: 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c    incrblobClose,
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f       /* closePro
2a20: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2a40: 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c    incrblobInput,
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f       /* inputPro
2a70: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2a90: 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74    incrblobOutput
2aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ab0: 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72       /* outputPr
2ac0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2ae0: 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20    incrblobSeek, 
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63       /* seekProc
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2b30: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f       /* setOptio
2b60: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2b80: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f       /* getOptio
2bb0: 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  nProc           
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2bd0: 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c    incrblobWatch,
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f       /* watchPro
2c00: 63 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  c (this is a no-
2c10: 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  op)          */.
2c20: 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65    incrblobHandle
2c30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c40: 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c       /* getHandl
2c50: 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65  eProc (always re
2c60: 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a  turns error) */.
2c70: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72       /* close2Pr
2ca0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2cc0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64       /* blockMod
2cf0: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2d10: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f       /* flushPro
2d40: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2d60: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50       /* handlerP
2d90: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2db0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b       /* wideSeek
2de0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2e00: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  };../*.** Create
2e10: 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20   a new incrblob 
2e20: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2e30: 69 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63  ic int createInc
2e40: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
2e50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2e60: 72 70 2c 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  rp,.  SqliteDb *
2e70: 70 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  pDb,.  const cha
2e80: 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20  r *zDb,.  const 
2e90: 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 0a 20 20  char *zTable,.  
2ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2eb0: 75 6d 6e 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e  umn,.  sqlite_in
2ec0: 74 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20  t64 iRow,.  int 
2ed0: 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20  isReadonly.){.  
2ee0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
2ef0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
2f00: 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73  b = pDb->db;.  s
2f10: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
2f20: 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ob;.  int rc;.  
2f30: 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f  int flags = TCL_
2f40: 52 45 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64  READABLE|(isRead
2f50: 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57  only ? 0 : TCL_W
2f60: 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20  RITABLE);..  /* 
2f70: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
2f80: 20 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68   used to name th
2f90: 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63  e channels: "inc
2fa0: 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e  rblob_[incr coun
2fb0: 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  t]" */.  static 
2fc0: 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  int count = 0;. 
2fd0: 20 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36   char zChannel[6
2fe0: 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  4];..  rc = sqli
2ff0: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62  te3_blob_open(db
3000: 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a  , zDb, zTable, z
3010: 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69  Column, iRow, !i
3020: 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f  sReadonly, &pBlo
3030: 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  b);.  if( rc!=SQ
3040: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
3050: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
3060: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
3070: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
3080: 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
3090: 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
30a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
30b0: 20 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43    p = (IncrblobC
30c0: 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c  hannel *)Tcl_All
30d0: 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c  oc(sizeof(Incrbl
30e0: 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70  obChannel));.  p
30f0: 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70  ->iSeek = 0;.  p
3100: 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b  ->pBlob = pBlob;
3110: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
3120: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61  intf(sizeof(zCha
3130: 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c  nnel), zChannel,
3140: 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20   "incrblob_%d", 
3150: 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63  ++count);.  p->c
3160: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65  hannel = Tcl_Cre
3170: 61 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72  ateChannel(&Incr
3180: 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c  blobChannelType,
3190: 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c   zChannel, p, fl
31a0: 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69  ags);.  Tcl_Regi
31b0: 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65  sterChannel(inte
31c0: 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b  rp, p->channel);
31d0: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
31e0: 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f  new channel into
31f0: 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49   the SqliteDb.pI
3200: 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f  ncrblob list. */
3210: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44  .  p->pNext = pD
3220: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20  b->pIncrblob;.  
3230: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
3240: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
3250: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
3260: 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70  rev = p;.  }.  p
3270: 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20  Db->pIncrblob = 
3280: 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44  p;.  p->pDb = pD
3290: 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  b;..  Tcl_SetRes
32a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
32b0: 72 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  r *)Tcl_GetChann
32c0: 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65  elName(p->channe
32d0: 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  l), TCL_VOLATILE
32e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
32f0: 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20  OK;.}.#else  /* 
3300: 65 6c 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20  else clause for 
3310: 22 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  "#ifndef SQLITE_
3320: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a  OMIT_INCRBLOB" *
3330: 2f 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73  /.  #define clos
3340: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
3350: 73 28 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f  s(pDb).#endif../
3360: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65  *.** Look at the
3370: 20 73 63 72 69 70 74 20 70 72 65 66 69 78 20 69   script prefix i
3380: 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c  n pCmd.  We will
3390: 20 62 65 20 65 78 65 63 75 74 69 6e 67 20 74 68   be executing th
33a0: 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74  is script.** aft
33b0: 65 72 20 66 69 72 73 74 20 61 70 70 65 6e 64 69  er first appendi
33c0: 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61  ng one or more a
33d0: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20  rguments.  This 
33e0: 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
33f0: 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20 74  .** the script t
3400: 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73  o see if it is s
3410: 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45  afe to use Tcl_E
3420: 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65  valObjv() on the
3430: 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65   script.** rathe
3440: 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20  r than the more 
3450: 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c  general Tcl_Eval
3460: 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f  Ex().  Tcl_EvalO
3470: 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a  bjv() is much.**
3480: 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53   faster..**.** S
3490: 63 72 69 70 74 73 20 74 68 61 74 20 61 72 65 20  cripts that are 
34a0: 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68  safe to use with
34b0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
34c0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
34d0: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f   command name fo
34e0: 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f  llowed by zero o
34f0: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
3500: 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f   with no [...] o
3510: 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20  r $.** or {...} 
3520: 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20  or ; to be seen 
3530: 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20  anywhere.  Most 
3540: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73  callback scripts
3550: 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a   consist.** of j
3560: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  ust a single pro
3570: 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20  cedure name and 
3580: 74 68 65 79 20 6d 65 65 74 20 74 68 69 73 20 72  they meet this r
3590: 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  equirement..*/.s
35a0: 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f  tatic int safeTo
35b0: 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f  UseEvalObjv(Tcl_
35c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
35d0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a  Tcl_Obj *pCmd){.
35e0: 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72    /* We could tr
35f0: 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  y to do somethin
3600: 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65  g with Tcl_Parse
3610: 28 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  ().  But we will
3620: 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75   instead.  ** ju
3630: 73 74 20 64 6f 20 61 20 73 65 61 72 63 68 20 66  st do a search f
3640: 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61  or forbidden cha
3650: 72 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79  racters.  If any
3660: 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64 65   of the forbidde
3670: 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  n.  ** character
3680: 73 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64  s appear in pCmd
3690: 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74  , we will report
36a0: 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 75   the string as u
36b0: 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f  nsafe..  */.  co
36c0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
36d0: 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f  nt n;.  z = Tcl_
36e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
36f0: 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68  (pCmd, &n);.  wh
3700: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
3710: 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b      int c = *(z+
3720: 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +);.    if( c=='
3730: 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  $' || c=='[' || 
3740: 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20  c==';' ) return 
3750: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
3760: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  1;.}../*.** Find
3770: 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75   an SqlFunc stru
3780: 63 74 75 72 65 20 77 69 74 68 20 74 68 65 20 67  cture with the g
3790: 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63  iven name.  Or c
37a0: 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f  reate a new.** o
37b0: 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ne if an existin
37c0: 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20  g one cannot be 
37d0: 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61  found.  Return a
37e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
37f0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
3800: 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20  .static SqlFunc 
3810: 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c  *findSqlFunc(Sql
3820: 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73  iteDb *pDb, cons
3830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
3840: 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70    SqlFunc *p, *p
3850: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  New;.  int nName
3860: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d   = strlen30(zNam
3870: 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71  e);.  pNew = (Sq
3880: 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63  lFunc*)Tcl_Alloc
3890: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
38a0: 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20  + nName + 1 );. 
38b0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28   pNew->zName = (
38c0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
38d0: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
38e0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
38f0: 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 70 3d 70  me+1);.  for(p=p
3900: 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d  Db->pFunc; p; p=
3910: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3920: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
3930: 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65  mp(p->zName, pNe
3940: 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  w->zName)==0 ){.
3950: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
3960: 63 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20  char*)pNew);.   
3970: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20     return p;.   
3980: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69   }.  }.  pNew->i
3990: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
39a0: 65 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 44 62  erp;.  pNew->pDb
39b0: 20 3d 20 70 44 62 3b 0a 20 20 70 4e 65 77 2d 3e   = pDb;.  pNew->
39c0: 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70  pScript = 0;.  p
39d0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  New->pNext = pDb
39e0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e  ->pFunc;.  pDb->
39f0: 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20  pFunc = pNew;.  
3a00: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
3a10: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 69 6e  /*.** Free a sin
3a20: 67 6c 65 20 53 71 6c 50 72 65 70 61 72 65 64 53  gle SqlPreparedS
3a30: 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  tmt object..*/.s
3a40: 74 61 74 69 63 20 76 6f 69 64 20 64 62 46 72 65  tatic void dbFre
3a50: 65 53 74 6d 74 28 53 71 6c 50 72 65 70 61 72 65  eStmt(SqlPrepare
3a60: 64 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 23  dStmt *pStmt){.#
3a70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3a80: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
3a90: 73 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  sql(pStmt->pStmt
3aa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )==0 ){.    Tcl_
3ab0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 53 74  Free((char *)pSt
3ac0: 6d 74 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 23  mt->zSql);.  }.#
3ad0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
3ae0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e  finalize(pStmt->
3af0: 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 46 72  pStmt);.  Tcl_Fr
3b00: 65 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74  ee((char *)pStmt
3b10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61  );.}../*.** Fina
3b20: 6c 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20  lize and free a 
3b30: 6c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64  list of prepared
3b40: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73   statements.*/.s
3b50: 74 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68  tatic void flush
3b60: 53 74 6d 74 43 61 63 68 65 28 53 71 6c 69 74 65  StmtCache(Sqlite
3b70: 44 62 20 2a 70 44 62 29 7b 0a 20 20 53 71 6c 50  Db *pDb){.  SqlP
3b80: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
3b90: 65 53 74 6d 74 3b 0a 20 20 53 71 6c 50 72 65 70  eStmt;.  SqlPrep
3ba0: 61 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b  aredStmt *pNext;
3bb0: 0a 0a 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74  ..  for(pPreStmt
3bc0: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
3bd0: 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65  ; pPreStmt; pPre
3be0: 53 74 6d 74 3d 70 4e 65 78 74 29 7b 0a 20 20 20  Stmt=pNext){.   
3bf0: 20 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d   pNext = pPreStm
3c00: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 64 62  t->pNext;.    db
3c10: 46 72 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d  FreeStmt(pPreStm
3c20: 74 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e  t);.  }.  pDb->n
3c30: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d  Stmt = 0;.  pDb-
3c40: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 20  >stmtLast = 0;. 
3c50: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
3c60: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c   0;.}../*.** TCL
3c70: 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63   calls this proc
3c80: 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71  edure when an sq
3c90: 6c 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63  lite3 database c
3ca0: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c  ommand is.** del
3cb0: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
3cc0: 76 6f 69 64 20 53 51 4c 49 54 45 5f 54 43 4c 41  void SQLITE_TCLA
3cd0: 50 49 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76  PI DbDeleteCmd(v
3ce0: 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69  oid *db){.  Sqli
3cf0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3d00: 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75  iteDb*)db;.  flu
3d10: 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29  shStmtCache(pDb)
3d20: 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  ;.  closeIncrblo
3d30: 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a  bChannels(pDb);.
3d40: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
3d50: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c  pDb->db);.  whil
3d60: 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b  e( pDb->pFunc ){
3d70: 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
3d80: 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63  unc = pDb->pFunc
3d90: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63  ;.    pDb->pFunc
3da0: 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b   = pFunc->pNext;
3db0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 75  .    assert( pFu
3dc0: 6e 63 2d 3e 70 44 62 3d 3d 70 44 62 20 29 3b 0a  nc->pDb==pDb );.
3dd0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3de0: 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72  ount(pFunc->pScr
3df0: 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72  ipt);.    Tcl_Fr
3e00: 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29  ee((char*)pFunc)
3e10: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
3e20: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  Db->pCollate ){.
3e30: 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a      SqlCollate *
3e40: 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e  pCollate = pDb->
3e50: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44  pCollate;.    pD
3e60: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43  b->pCollate = pC
3e70: 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20  ollate->pNext;. 
3e80: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3e90: 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20  r*)pCollate);.  
3ea0: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75  }.  if( pDb->zBu
3eb0: 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  sy ){.    Tcl_Fr
3ec0: 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a  ee(pDb->zBusy);.
3ed0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
3ee0: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c  Trace ){.    Tcl
3ef0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
3f00: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  e);.  }.  if( pD
3f10: 62 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20  b->zTraceV2 ){. 
3f20: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3f30: 3e 7a 54 72 61 63 65 56 32 29 3b 0a 20 20 7d 0a  >zTraceV2);.  }.
3f40: 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
3f50: 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ile ){.    Tcl_F
3f60: 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  ree(pDb->zProfil
3f70: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  e);.  }.  if( pD
3f80: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
3f90: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41  Tcl_Free(pDb->zA
3fa0: 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  uth);.  }.  if( 
3fb0: 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20  pDb->zNull ){.  
3fc0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3fd0: 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  zNull);.  }.  if
3fe0: 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  ( pDb->pUpdateHo
3ff0: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ok ){.    Tcl_De
4000: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
4010: 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  pUpdateHook);.  
4020: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 50 72  }.  if( pDb->pPr
4030: 65 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20  eUpdateHook ){. 
4040: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
4050: 75 6e 74 28 70 44 62 2d 3e 70 50 72 65 55 70 64  unt(pDb->pPreUpd
4060: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ateHook);.  }.  
4070: 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  if( pDb->pRollba
4080: 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63  ckHook ){.    Tc
4090: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
40a0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
40b0: 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  k);.  }.  if( pD
40c0: 62 2d 3e 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20  b->pWalHook ){. 
40d0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
40e0: 75 6e 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f  unt(pDb->pWalHoo
40f0: 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  k);.  }.  if( pD
4100: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
4110: 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  d ){.    Tcl_Dec
4120: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
4130: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
4140: 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28    }.  Tcl_Free((
4150: 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f  char*)pDb);.}../
4160: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4170: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
4180: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
4190: 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65   is locked while
41a0: 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78   trying.** to ex
41b0: 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74  ecute SQL..*/.st
41c0: 61 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48  atic int DbBusyH
41d0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c  andler(void *cd,
41e0: 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20   int nTries){.  
41f0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4200: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
4210: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
4220: 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c  zVal[30];..  sql
4230: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4240: 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c  zeof(zVal), zVal
4250: 2c 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b  , "%d", nTries);
4260: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45  .  rc = Tcl_VarE
4270: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
4280: 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22   pDb->zBusy, " "
4290: 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30  , zVal, (char*)0
42a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
42b0: 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f  _OK || atoi(Tcl_
42c0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
42d0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b  pDb->interp)) ){
42e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
42f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
4300: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4310: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
4320: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
4330: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
4340: 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70 72  voked as the 'pr
4350: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27  ogress callback'
4360: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
4370: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4380: 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
4390: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
43a0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
43b0: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
43c0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
43d0: 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rt( pDb->zProgre
43e0: 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c  ss );.  rc = Tcl
43f0: 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72  _Eval(pDb->inter
4400: 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  p, pDb->zProgres
4410: 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  s);.  if( rc!=TC
4420: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
4430: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
4440: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
4450: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
4460: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4470: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
4480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4490: 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
44a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
44b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
44c0: 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69  ) && \.    !defi
44d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
44e0: 44 45 50 52 45 43 41 54 45 44 29 0a 2f 2a 0a 2a  DEPRECATED)./*.*
44f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4500: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4510: 53 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e  SQLite trace han
4520: 64 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20  dler whenever a 
4530: 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20  new.** block of 
4540: 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e  SQL is executed.
4550: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
4560: 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20   in pDb->zTrace 
4570: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a  is executed..*/.
4580: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72  static void DbTr
4590: 61 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  aceHandler(void 
45a0: 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *cd, const char 
45b0: 2a 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65  *zSql){.  Sqlite
45c0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
45d0: 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44  eDb*)cd;.  Tcl_D
45e0: 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54  String str;..  T
45f0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
4600: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  str);.  Tcl_DStr
4610: 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20  ingAppend(&str, 
4620: 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29  pDb->zTrace, -1)
4630: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
4640: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
4650: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
4660: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
4670: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
4680: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
4690: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
46a0: 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  r);.  Tcl_ResetR
46b0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
46c0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  p);.}.#endif..#i
46d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
46e0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68  T_TRACE./*.** Th
46f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4700: 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  lled by the SQLi
4710: 74 65 20 74 72 61 63 65 5f 76 32 20 68 61 6e 64  te trace_v2 hand
4720: 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e  ler whenever a n
4730: 65 77 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20  ew.** supported 
4740: 65 76 65 6e 74 20 69 73 20 67 65 6e 65 72 61 74  event is generat
4750: 65 64 2e 20 20 55 6e 73 75 70 70 6f 72 74 65 64  ed.  Unsupported
4760: 20 65 76 65 6e 74 20 74 79 70 65 73 20 61 72 65   event types are
4770: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 54 68 65   ignored..** The
4780: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
4790: 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 69 73 20  Db->zTraceV2 is 
47a0: 65 78 65 63 75 74 65 64 2c 20 77 69 74 68 20 74  executed, with t
47b0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  he arguments for
47c0: 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 61 70  .** the event ap
47d0: 70 65 6e 64 65 64 20 74 6f 20 69 74 20 28 61 73  pended to it (as
47e0: 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 29 2e   list elements).
47f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
4800: 62 54 72 61 63 65 56 32 48 61 6e 64 6c 65 72 28  bTraceV2Handler(
4810: 0a 20 20 75 6e 73 69 67 6e 65 64 20 74 79 70 65  .  unsigned type
4820: 2c 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20  , /* One of the 
4830: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 2a 20 65  SQLITE_TRACE_* e
4840: 76 65 6e 74 20 74 79 70 65 73 2e 20 2a 2f 0a 20  vent types. */. 
4850: 20 76 6f 69 64 20 2a 63 64 2c 20 20 20 20 20 20   void *cd,      
4860: 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
4870: 63 6f 6e 74 65 78 74 20 64 61 74 61 20 70 6f 69  context data poi
4880: 6e 74 65 72 2e 20 2a 2f 0a 20 20 76 6f 69 64 20  nter. */.  void 
4890: 2a 70 64 2c 20 20 20 20 20 20 2f 2a 20 50 72 69  *pd,      /* Pri
48a0: 6d 61 72 79 20 65 76 65 6e 74 20 64 61 74 61 2c  mary event data,
48b0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e   depends on even
48c0: 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 76 6f 69  t type. */.  voi
48d0: 64 20 2a 78 64 20 20 20 20 20 20 20 2f 2a 20 45  d *xd       /* E
48e0: 78 74 72 61 20 65 76 65 6e 74 20 64 61 74 61 2c  xtra event data,
48f0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e   depends on even
4900: 74 20 74 79 70 65 2e 20 2a 2f 0a 29 7b 0a 20 20  t type. */.){.  
4910: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4920: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
4930: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a   Tcl_Obj *pCmd;.
4940: 0a 20 20 73 77 69 74 63 68 28 20 74 79 70 65 20  .  switch( type 
4950: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
4960: 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b  TE_TRACE_STMT: {
4970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4980: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 28 73 71  tmt *pStmt = (sq
4990: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b  lite3_stmt *)pd;
49a0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71  .      char *zSq
49b0: 6c 20 3d 20 28 63 68 61 72 20 2a 29 78 64 3b 0a  l = (char *)xd;.
49c0: 0a 20 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63  .      pCmd = Tc
49d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
49e0: 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31  Db->zTraceV2, -1
49f0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
4a00: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4a10: 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
4a20: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4a30: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  pDb->interp, pCm
4a40: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74    Tcl_NewWideInt
4a70: 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74  Obj((Tcl_WideInt
4a80: 29 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 20 20  )pStmt));.      
4a90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4aa0: 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e  dElement(pDb->in
4ab0: 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20  terp, pCmd,.    
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e             Tcl_N
4ae0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 53 71 6c  ewStringObj(zSql
4af0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63  , -1));.      Tc
4b00: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
4b10: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
4b20: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
4b30: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
4b40: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4b50: 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65       Tcl_ResetRe
4b60: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4b70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b80: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4b90: 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46  QLITE_TRACE_PROF
4ba0: 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILE: {.      sql
4bb0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
4bc0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74   = (sqlite3_stmt
4bd0: 20 2a 29 70 64 3b 0a 20 20 20 20 20 20 73 71 6c   *)pd;.      sql
4be0: 69 74 65 33 5f 69 6e 74 36 34 20 6e 73 20 3d 20  ite3_int64 ns = 
4bf0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78  (sqlite3_int64)x
4c00: 64 3b 0a 0a 20 20 20 20 20 20 70 43 6d 64 20 3d  d;..      pCmd =
4c10: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4c20: 6a 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c  j(pDb->zTraceV2,
4c30: 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f   -1);.      Tcl_
4c40: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
4c50: 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  d);.      Tcl_Li
4c60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4c70: 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  nt(pDb->interp, 
4c80: 70 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  pCmd,.          
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65       Tcl_NewWide
4cb0: 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65  IntObj((Tcl_Wide
4cc0: 49 6e 74 29 70 53 74 6d 74 29 29 3b 0a 20 20 20  Int)pStmt));.   
4cd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4ce0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d  pendElement(pDb-
4cf0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20  >interp, pCmd,. 
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
4d20: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
4d30: 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 6e 73 29  (Tcl_WideInt)ns)
4d40: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 45 76 61  );.      Tcl_Eva
4d50: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
4d60: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
4d70: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20  AL_DIRECT);.    
4d80: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4d90: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20  nt(pCmd);.      
4da0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
4db0: 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  pDb->interp);.  
4dc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4dd0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4de0: 5f 54 52 41 43 45 5f 52 4f 57 3a 20 7b 0a 20 20  _TRACE_ROW: {.  
4df0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
4e00: 20 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74   *pStmt = (sqlit
4e10: 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 0a 20  e3_stmt *)pd;.. 
4e20: 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f       pCmd = Tcl_
4e30: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62  NewStringObj(pDb
4e40: 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b  ->zTraceV2, -1);
4e50: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
4e60: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4e70: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
4e80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44  AppendElement(pD
4e90: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
4ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
4ed0: 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70  j((Tcl_WideInt)p
4ee0: 53 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63  Stmt));.      Tc
4ef0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
4f00: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
4f10: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
4f20: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
4f30: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4f40: 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65       Tcl_ResetRe
4f50: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4f60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4f70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4f80: 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
4f90: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4fa0: 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65  e3 *db = (sqlite
4fb0: 33 20 2a 29 70 64 3b 0a 0a 20 20 20 20 20 20 70  3 *)pd;..      p
4fc0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
4fd0: 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61  ingObj(pDb->zTra
4fe0: 63 65 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ceV2, -1);.     
4ff0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5000: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54  t(pCmd);.      T
5010: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5020: 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74  Element(pDb->int
5030: 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20  erp, pCmd,.     
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65            Tcl_Ne
5060: 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c  wWideIntObj((Tcl
5070: 5f 57 69 64 65 49 6e 74 29 64 62 29 29 3b 0a 20  _WideInt)db));. 
5080: 20 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a       Tcl_EvalObj
5090: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
50a0: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
50b0: 49 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63  IRECT);.      Tc
50c0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
50d0: 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Cmd);.      Tcl_
50e0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
50f0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  >interp);.      
5100: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5110: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5120: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
5130: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
5140: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
5150: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
5160: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
5170: 50 4f 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20  POINT) && \.    
5180: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5190: 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 29  OMIT_DEPRECATED)
51a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
51b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
51c0: 20 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66   the SQLite prof
51d0: 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65  ile handler afte
51e0: 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  r a statement.**
51f0: 20 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65   SQL has execute
5200: 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69  d.  The TCL scri
5210: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66  pt in pDb->zProf
5220: 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64  ile is evaluated
5230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5240: 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65   DbProfileHandle
5250: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
5260: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71  t char *zSql, sq
5270: 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b  lite_uint64 tm){
5280: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
5290: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
52a0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
52b0: 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b  str;.  char zTm[
52c0: 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  100];..  sqlite3
52d0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
52e0: 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25  (zTm)-1, zTm, "%
52f0: 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c  lld", tm);.  Tcl
5300: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
5310: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
5320: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
5330: 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29  b->zProfile, -1)
5340: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
5350: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
5360: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
5370: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
5380: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b  ment(&str, zTm);
5390: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
53a0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
53b0: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
53c0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
53d0: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
53e0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
53f0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
5400: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
5410: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5420: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
5430: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
5440: 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73  d.  The.** TCL s
5450: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43  cript in pDb->zC
5460: 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65  ommit is execute
5470: 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e  d.  If it return
5480: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a  s non-zero or.**
5490: 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e   if it throws an
54a0: 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20   exception, the 
54b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
54c0: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65  olled back inste
54d0: 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63  ad.** of being c
54e0: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61  ommitted..*/.sta
54f0: 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74  tic int DbCommit
5500: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
5510: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
5520: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
5530: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
5540: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
5550: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
5560: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  >zCommit);.  if(
5570: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
5580: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
5590: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
55a0: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
55b0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
55c0: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
55d0: 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b   void DbRollback
55e0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c  Handler(void *cl
55f0: 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c  ientData){.  Sql
5600: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
5610: 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61  liteDb*)clientDa
5620: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62  ta;.  assert(pDb
5630: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
5640: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
5650: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
5660: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
5670: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30  pRollbackHook, 0
5680: 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63  ) ){.    Tcl_Bac
5690: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62  kgroundError(pDb
56a0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d  ->interp);.  }.}
56b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f  ../*.** This pro
56c0: 63 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20 77  cedure handles w
56d0: 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  al_hook callback
56e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
56f0: 20 44 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a 20   DbWalHandler(. 
5700: 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
5710: 61 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a,.  sqlite3 *db
5720: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
5730: 7a 44 62 2c 0a 20 20 69 6e 74 20 6e 45 6e 74 72  zDb,.  int nEntr
5740: 79 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d  y.){.  int ret =
5750: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63   SQLITE_OK;.  Tc
5760: 6c 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69  l_Obj *p;.  Sqli
5770: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
5780: 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74  iteDb*)clientDat
5790: 61 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a;.  Tcl_Interp 
57a0: 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69  *interp = pDb->i
57b0: 6e 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28  nterp;.  assert(
57c0: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
57d0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70  .  assert( db==p
57e0: 44 62 2d 3e 64 62 20 29 3b 0a 20 20 70 20 3d 20  Db->db );.  p = 
57f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
5800: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b  (pDb->pWalHook);
5810: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
5820: 75 6e 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69  unt(p);.  Tcl_Li
5830: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5840: 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63  nt(interp, p, Tc
5850: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5860: 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  Db, -1));.  Tcl_
5870: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5880: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20  ment(interp, p, 
5890: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45  Tcl_NewIntObj(nE
58a0: 6e 74 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43  ntry));.  if( TC
58b0: 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62  L_OK!=Tcl_EvalOb
58c0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30  jEx(interp, p, 0
58d0: 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d  ).   || TCL_OK!=
58e0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
58f0: 6a 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  j(interp, Tcl_Ge
5900: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
5910: 70 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20  p), &ret).  ){. 
5920: 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e     Tcl_Backgroun
5930: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
5940: 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65    }.  Tcl_DecrRe
5950: 66 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65  fCount(p);..  re
5960: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66  turn ret;.}..#if
5970: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5980: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
5990: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55  (SQLITE_ENABLE_U
59a0: 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74  NLOCK_NOTIFY).st
59b0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73  atic void setTes
59c0: 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72  tUnlockNotifyVar
59d0: 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  s(Tcl_Interp *in
59e0: 74 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20  terp, int iArg, 
59f0: 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61  int nArg){.  cha
5a00: 72 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 71  r zBuf[64];.  sq
5a10: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
5a20: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
5a30: 66 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a  f, "%d", iArg);.
5a40: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
5a50: 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c  erp, "sqlite_unl
5a60: 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c  ock_notify_arg",
5a70: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
5a80: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73 71 6c 69 74  L_ONLY);.  sqlit
5a90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
5aa0: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
5ab0: 22 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54  "%d", nArg);.  T
5ac0: 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
5ad0: 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b  , "sqlite_unlock
5ae0: 5f 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e 74  _notify_argcount
5af0: 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f  ", zBuf, TCL_GLO
5b00: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c  BAL_ONLY);.}.#el
5b10: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 54  se.# define setT
5b20: 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56  estUnlockNotifyV
5b30: 61 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  ars(x,y,z).#endi
5b40: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
5b50: 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
5b60: 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69  OTIFY.static voi
5b70: 64 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  d DbUnlockNotify
5b80: 28 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69  (void **apArg, i
5b90: 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20  nt nArg){.  int 
5ba0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5bb0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
5bc0: 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
5bd0: 3d 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  = (TCL_EVAL_GLOB
5be0: 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  AL|TCL_EVAL_DIRE
5bf0: 43 54 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44  CT);.    SqliteD
5c00: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
5c10: 44 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20  Db *)apArg[i];. 
5c20: 20 20 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b     setTestUnlock
5c30: 4e 6f 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e  NotifyVars(pDb->
5c40: 69 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29  interp, i, nArg)
5c50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  ;.    assert( pD
5c60: 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
5c70: 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f  );.    Tcl_EvalO
5c80: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
5c90: 2c 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  , pDb->pUnlockNo
5ca0: 74 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  tify, flags);.  
5cb0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5cc0: 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  nt(pDb->pUnlockN
5cd0: 6f 74 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d  otify);.    pDb-
5ce0: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d  >pUnlockNotify =
5cf0: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
5d00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5d10: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
5d20: 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d  _HOOK./*.** Pre-
5d30: 75 70 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c  update hook call
5d40: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
5d50: 76 6f 69 64 20 44 62 50 72 65 55 70 64 61 74 65  void DbPreUpdate
5d60: 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20  Handler(.  void 
5d70: 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p,.  sqlite3 *d
5d80: 62 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63  b,.  int op,.  c
5d90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a  onst char *zDb,.
5da0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
5db0: 62 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  bl,.  sqlite_int
5dc0: 36 34 20 69 4b 65 79 31 2c 0a 20 20 73 71 6c 69  64 iKey1,.  sqli
5dd0: 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 32 0a 29  te_int64 iKey2.)
5de0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
5df0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
5e00: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  p;.  Tcl_Obj *pC
5e10: 6d 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  md;.  static con
5e20: 73 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d  st char *azStr[]
5e30: 20 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49   = {"DELETE", "I
5e40: 4e 53 45 52 54 22 2c 20 22 55 50 44 41 54 45 22  NSERT", "UPDATE"
5e50: 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53  };..  assert( (S
5e60: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f  QLITE_DELETE-1)/
5e70: 39 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65  9 == 0 );.  asse
5e80: 72 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45  rt( (SQLITE_INSE
5e90: 52 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a  RT-1)/9 == 1 );.
5ea0: 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54    assert( (SQLIT
5eb0: 45 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d  E_UPDATE-1)/9 ==
5ec0: 20 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   2 );.  assert( 
5ed0: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
5ee0: 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ook );.  assert(
5ef0: 20 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a   db==pDb->db );.
5f00: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
5f10: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
5f20: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
5f30: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
5f40: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
5f50: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
5f60: 4f 62 6a 28 70 44 62 2d 3e 70 50 72 65 55 70 64  Obj(pDb->pPreUpd
5f70: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f  ateHook);.  Tcl_
5f80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
5f90: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
5fa0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5fb0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
5fc0: 74 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b 28  tringObj(azStr[(
5fd0: 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a  op-1)/9], -1));.
5fe0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5ff0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
6000: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
6010: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
6020: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6030: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
6040: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
6050: 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b  gObj(zTbl, -1));
6060: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
6070: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
6080: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  Cmd, Tcl_NewWide
6090: 49 6e 74 4f 62 6a 28 69 4b 65 79 31 29 29 3b 0a  IntObj(iKey1));.
60a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
60b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
60c0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
60d0: 6e 74 4f 62 6a 28 69 4b 65 79 32 29 29 3b 0a 20  ntObj(iKey2));. 
60e0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
60f0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
6100: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
6110: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
6120: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a  fCount(pCmd);.}.
6130: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6140: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
6150: 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61 74 69  E_HOOK */..stati
6160: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
6170: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
6180: 70 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63  p,.  int op,.  c
6190: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a  onst char *zDb,.
61a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
61b0: 62 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  bl,.  sqlite_int
61c0: 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71  64 rowid.){.  Sq
61d0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
61e0: 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54  qliteDb *)p;.  T
61f0: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20  cl_Obj *pCmd;.  
6200: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
6210: 72 20 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44  r *azStr[] = {"D
6220: 45 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22  ELETE", "INSERT"
6230: 2c 20 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20  , "UPDATE"};..  
6240: 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f  assert( (SQLITE_
6250: 44 45 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30  DELETE-1)/9 == 0
6260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53   );.  assert( (S
6270: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f  QLITE_INSERT-1)/
6280: 39 20 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65  9 == 1 );.  asse
6290: 72 74 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41  rt( (SQLITE_UPDA
62a0: 54 45 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a  TE-1)/9 == 2 );.
62b0: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
62c0: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20  pUpdateHook );. 
62d0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
62e0: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
62f0: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
6300: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
6310: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
6320: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
6330: 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  bj(pDb->pUpdateH
6340: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
6350: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
6360: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6370: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
6380: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
6390: 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31  gObj(azStr[(op-1
63a0: 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63  )/9], -1));.  Tc
63b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
63c0: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
63d0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
63e0: 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63  (zDb, -1));.  Tc
63f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6400: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
6410: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6420: 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54  (zTbl, -1));.  T
6430: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6440: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
6450: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
6460: 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63  bj(rowid));.  Tc
6470: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
6480: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
6490: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
64a0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
64b0: 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74  unt(pCmd);.}..st
64c0: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c  atic void tclCol
64d0: 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f  lateNeeded(.  vo
64e0: 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69  id *pCtx,.  sqli
64f0: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65  te3 *db,.  int e
6500: 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  nc,.  const char
6510: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c   *zName.){.  Sql
6520: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
6530: 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20  liteDb *)pCtx;. 
6540: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
6550: 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  t = Tcl_Duplicat
6560: 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  eObj(pDb->pColla
6570: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c  teNeeded);.  Tcl
6580: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
6590: 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69  cript);.  Tcl_Li
65a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
65b0: 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54  nt(0, pScript, T
65c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
65d0: 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54  zName, -1));.  T
65e0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
65f0: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
6600: 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  t, 0);.  Tcl_Dec
6610: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
6620: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
6630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
6640: 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  led to evaluate 
6650: 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  an SQL collation
6660: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
6670: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
6680: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
6690: 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43  atic int tclSqlC
66a0: 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
66b0: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a  pCtx,.  int nA,.
66c0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41    const void *zA
66d0: 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f  ,.  int nB,.  co
66e0: 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a  nst void *zB.){.
66f0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20    SqlCollate *p 
6700: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29  = (SqlCollate *)
6710: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
6720: 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d  *pCmd;..  pCmd =
6730: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6740: 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31  j(p->zScript, -1
6750: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
6760: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54  Count(pCmd);.  T
6770: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6780: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
6790: 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  p, pCmd, Tcl_New
67a0: 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41  StringObj(zA, nA
67b0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
67c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
67d0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
67e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
67f0: 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c  (zB, nB));.  Tcl
6800: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
6810: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
6820: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
6830: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
6840: 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e  (pCmd);.  return
6850: 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74   (atoi(Tcl_GetSt
6860: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
6870: 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  terp)));.}../*.*
6880: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6890: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
68a0: 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63  uate an SQL func
68b0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
68c0: 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63  .** using TCL sc
68d0: 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ript..*/.static 
68e0: 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28  void tclSqlFunc(
68f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6900: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
6910: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
6920: 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46  e**argv){.  SqlF
6930: 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  unc *p = sqlite3
6940: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
6950: 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  xt);.  Tcl_Obj *
6960: 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pCmd;.  int i;. 
6970: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
6980: 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  argc==0 ){.    /
6990: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
69a0: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  o arguments to t
69b0: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c  he function, cal
69c0: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20  l Tcl_EvalObjEx 
69d0: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  on the.    ** sc
69e0: 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65  ript object dire
69f0: 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f  ctly.  This allo
6a00: 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69  ws the TCL compi
6a10: 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  ler to generate.
6a20: 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20      ** bytecode 
6a30: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  for the command 
6a40: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
6a50: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73  ocation and thus
6a60: 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62   make.    ** sub
6a70: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
6a80: 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e  ons much faster.
6a90: 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70   */.    pCmd = p
6aa0: 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54  ->pScript;.    T
6ab0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
6ac0: 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  pCmd);.    rc = 
6ad0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
6ae0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30  >interp, pCmd, 0
6af0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
6b00: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
6b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
6b20: 66 20 74 68 65 72 65 20 61 72 65 20 61 72 67 75  f there are argu
6b30: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
6b40: 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68  ction, make a sh
6b50: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68  allow copy of th
6b60: 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20  e.    ** script 
6b70: 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20  object, lappend 
6b80: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74  the arguments, t
6b90: 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
6ba0: 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20   copy..    **.  
6bb0: 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77    ** By "shallow
6bc0: 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20  " copy, we mean 
6bd0: 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c  only the outer l
6be0: 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64  ist Tcl_Obj is d
6bf0: 75 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a  uplicated..    *
6c00: 2a 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62  * The new Tcl_Ob
6c10: 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  j contains point
6c20: 65 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ers to the origi
6c30: 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74  nal list element
6c40: 73 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77  s..    ** That w
6c50: 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61  ay, when Tcl_Eva
6c60: 6c 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61  lObjv() is run a
6c70: 6e 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20  nd shimmers the 
6c80: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20  first element.  
6c90: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74    ** of the list
6ca0: 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79   to tclCmdNameTy
6cb0: 70 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61  pe, that alterna
6cc0: 74 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  te representatio
6cd0: 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
6ce0: 20 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72   preserved and r
6cf0: 65 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  eused on the nex
6d00: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20  t invocation..  
6d10: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a    */.    Tcl_Obj
6d20: 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74   **aArg;.    int
6d30: 20 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54   nArg;.    if( T
6d40: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
6d50: 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c  ments(p->interp,
6d60: 20 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41   p->pScript, &nA
6d70: 72 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20  rg, &aArg) ){.  
6d80: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6d90: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
6da0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
6db0: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
6dc0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74  , -1);.      ret
6dd0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
6de0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
6df0: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
6e00: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
6e10: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6e20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
6e30: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
6e40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
6e50: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
6e60: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
6e70: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
6e80: 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pVal to contain 
6e90: 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20  the i'th column 
6ea0: 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a  of this row. */.
6eb0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71        switch( sq
6ec0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
6ed0: 28 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  (pIn) ){.       
6ee0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
6ef0: 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  B: {.          i
6f00: 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74  nt bytes = sqlit
6f10: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
6f20: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
6f30: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  Val = Tcl_NewByt
6f40: 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65  eArrayObj(sqlite
6f50: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e  3_value_blob(pIn
6f60: 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20  ), bytes);.     
6f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
6f90: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
6fa0: 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73  R: {.          s
6fb0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20  qlite_int64 v = 
6fc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
6fd0: 74 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  t64(pIn);.      
6fe0: 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37      if( v>=-2147
6ff0: 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34  483647 && v<=214
7000: 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20  7483647 ){.     
7010: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
7020: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74  l_NewIntObj((int
7030: 29 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  )v);.          }
7040: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7050: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
7060: 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  WideIntObj(v);. 
7070: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
70a0: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
70b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75   {.          dou
70c0: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
70d0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e  value_double(pIn
70e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
70f0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
7100: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
7110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7120: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
7130: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
7140: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
7150: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7160: 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  j(p->pDb->zNull,
7170: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -1);.          
7180: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
7190: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
71a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
71b0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
71c0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
71d0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
71e0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
71f0: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71  ngObj((char *)sq
7200: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7210: 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20  (pIn), bytes);. 
7220: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7230: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7240: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c  }.      rc = Tcl
7250: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7260: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
7270: 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20   pCmd, pVal);.  
7280: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
7290: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
72a0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
72b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
72c0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
72d0: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
72e0: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
72f0: 70 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  p), -1);.       
7300: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
7310: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
7320: 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29  p->useEvalObjv )
7330: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45  {.      /* Tcl_E
7340: 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20  valObjEx() will 
7350: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61  automatically ca
7360: 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  ll Tcl_EvalObjv(
7370: 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20  ) if pCmd.      
7380: 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74  ** is a list wit
7390: 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65  hout a string re
73a0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54  presentation.  T
73b0: 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66  o prevent this f
73c0: 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70  rom.      ** hap
73d0: 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72  pening, make sur
73e0: 65 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c  e pCmd has a val
73f0: 69 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  id string repres
7400: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
7410: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
7420: 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCmd);.    }.   
7430: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
7440: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
7450: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
7460: 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44  RECT);.    Tcl_D
7470: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ecrRefCount(pCmd
7480: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
7490: 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55   && rc!=TCL_RETU
74a0: 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  RN ){.    sqlite
74b0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
74c0: 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53  ontext, Tcl_GetS
74d0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
74e0: 6e 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20 20 7d  nterp), -1);.  }
74f0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
7500: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
7510: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
7520: 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e  terp);.    int n
7530: 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a  ;.    u8 *data;.
7540: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7550: 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74  zType = (pVar->t
7560: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
7570: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
7580: 22 29 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  ");.    char c =
7590: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69   zType[0];.    i
75a0: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
75b0: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
75c0: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
75d0: 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20  r->bytes==0 ){. 
75e0: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74       /* Only ret
75f0: 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20  urn a BLOB type 
7600: 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61  if the Tcl varia
7610: 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72  ble is a bytearr
7620: 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ay and.      ** 
7630: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
7640: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
7650: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63  .      data = Tc
7660: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
7670: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
7680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7690: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
76a0: 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c  xt, data, n, SQL
76b0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
76c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
76d0: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
76e0: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
76f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
7700: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
7710: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
7720: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7730: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29  _int(context, n)
7740: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7750: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
7760: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
7770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  ==0 ){.      dou
7780: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c  ble r;.      Tcl
7790: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
77a0: 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  j(0, pVar, &r);.
77b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
77c0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
77d0: 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c  ext, r);.    }el
77e0: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
77f0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
7800: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
7810: 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27  .          (c=='
7820: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
7830: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
7840: 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49  .      Tcl_WideI
7850: 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f  nt v;.      Tcl_
7860: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
7870: 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  j(0, pVar, &v);.
7880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7890: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
78a0: 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, v);.    }els
78b0: 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  e{.      data = 
78c0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
78d0: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
78e0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
78f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7900: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
7910: 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61  xt, (char *)data
7920: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
7930: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20  SIENT);.    }.  
7940: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
7950: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
7960: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  ZATION./*.** Thi
7970: 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74  s is the authent
7980: 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ication function
7990: 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68  .  It appends th
79a0: 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
79b0: 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e  .** type code an
79c0: 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65  d the two argume
79d0: 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68  nts to zCmd[] th
79e0: 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72  en invokes the r
79f0: 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20  esult.** on the 
7a00: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
7a10: 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69  e reply is exami
7a20: 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ned to determine
7a30: 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65   if the.** authe
7a40: 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  ntication fails 
7a50: 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a  or succeeds..*/.
7a60: 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f  static int auth_
7a70: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
7a80: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f   *pArg,.  int co
7a90: 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de,.  const char
7aa0: 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74   *zArg1,.  const
7ab0: 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20   char *zArg2,.  
7ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
7ad0: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
7ae0: 2a 7a 41 72 67 34 0a 23 69 66 64 65 66 20 53 51  *zArg4.#ifdef SQ
7af0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
7b00: 54 49 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73  TICATION.  ,cons
7b10: 74 20 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65  t char *zArg5.#e
7b20: 6e 64 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ndif.){.  const 
7b30: 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54  char *zCode;.  T
7b40: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
7b50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
7b60: 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a  t char *zReply;.
7b70: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
7b80: 3a 20 52 2d 33 38 35 39 30 2d 36 32 37 36 39 20  : R-38590-62769 
7b90: 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
7ba0: 74 65 72 20 74 6f 20 74 68 65 20 61 75 74 68 6f  ter to the autho
7bb0: 72 69 7a 65 72 0a 20 20 2a 2a 20 63 61 6c 6c 62  rizer.  ** callb
7bc0: 61 63 6b 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ack is a copy of
7bd0: 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d   the third param
7be0: 65 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  eter to the.  **
7bf0: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
7c00: 68 6f 72 69 7a 65 72 28 29 20 69 6e 74 65 72 66  horizer() interf
7c10: 61 63 65 2e 0a 20 20 2a 2f 0a 20 20 53 71 6c 69  ace..  */.  Sqli
7c20: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
7c30: 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 20 20 69  iteDb*)pArg;.  i
7c40: 66 28 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41  f( pDb->disableA
7c50: 75 74 68 20 29 20 72 65 74 75 72 6e 20 53 51 4c  uth ) return SQL
7c60: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 45 56  ITE_OK;..  /* EV
7c70: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 35  IDENCE-OF: R-565
7c80: 31 38 2d 34 34 33 31 30 20 54 68 65 20 73 65 63  18-44310 The sec
7c90: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 74 6f  ond parameter to
7ca0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73   the callback is
7cb0: 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72   an.  ** integer
7cc0: 20 61 63 74 69 6f 6e 20 63 6f 64 65 20 74 68 61   action code tha
7cd0: 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  t specifies the 
7ce0: 70 61 72 74 69 63 75 6c 61 72 20 61 63 74 69 6f  particular actio
7cf0: 6e 20 74 6f 20 62 65 0a 20 20 2a 2a 20 61 75 74  n to be.  ** aut
7d00: 68 6f 72 69 7a 65 64 2e 20 2a 2f 0a 20 20 73 77  horized. */.  sw
7d10: 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20  itch( code ){.  
7d20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
7d30: 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20  PY              
7d40: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7d50: 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20  COPY"; break;.  
7d60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
7d70: 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20  EATE_INDEX      
7d80: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7d90: 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62  CREATE_INDEX"; b
7da0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7db0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
7dc0: 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  LE      : zCode=
7dd0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
7de0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
7df0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
7e00: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  EATE_TEMP_INDEX 
7e10: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7e20: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
7e30: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
7e40: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
7e50: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a  E_TEMP_TABLE : z
7e60: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
7e70: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b  ATE_TEMP_TABLE";
7e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7e90: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7ea0: 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f  EMP_TRIGGER: zCo
7eb0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
7ec0: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  E_TEMP_TRIGGER";
7ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7ee0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7ef0: 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64  EMP_VIEW  : zCod
7f00: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
7f10: 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65  _TEMP_VIEW"; bre
7f20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7f30: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
7f40: 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  ER    : zCode="S
7f50: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
7f60: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
7f70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
7f80: 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20 20  EATE_VIEW       
7f90: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7fa0: 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72  CREATE_VIEW"; br
7fb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7fc0: 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20  LITE_DELETE     
7fd0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7fe0: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20  SQLITE_DELETE"; 
7ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8000: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
8010: 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  X        : zCode
8020: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  ="SQLITE_DROP_IN
8030: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
8040: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
8050: 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a  P_TABLE        :
8060: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
8070: 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  ROP_TABLE"; brea
8080: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8090: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
80a0: 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  EX   : zCode="SQ
80b0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
80c0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
80d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
80e0: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20  OP_TEMP_TABLE   
80f0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8100: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22  DROP_TEMP_TABLE"
8110: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
8120: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
8130: 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f  MP_TRIGGER : zCo
8140: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
8150: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62  TEMP_TRIGGER"; b
8160: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
8170: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
8180: 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d  VIEW    : zCode=
8190: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
81a0: 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  P_VIEW"; break;.
81b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
81c0: 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20  DROP_TRIGGER    
81d0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
81e0: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b  E_DROP_TRIGGER";
81f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8200: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
8210: 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  W         : zCod
8220: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
8230: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
8240: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53   case SQLITE_INS
8250: 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20 3a  ERT            :
8260: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49   zCode="SQLITE_I
8270: 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20  NSERT"; break;. 
8280: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
8290: 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20  RAGMA           
82a0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
82b0: 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b  _PRAGMA"; break;
82c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
82d0: 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
82e0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
82f0: 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b  TE_READ"; break;
8300: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8310: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
8320: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8330: 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61  TE_SELECT"; brea
8340: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8350: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20  TE_TRANSACTION  
8360: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
8370: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
8380: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
8390: 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45  se SQLITE_UPDATE
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
83b0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41  ode="SQLITE_UPDA
83c0: 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TE"; break;.    
83d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41  case SQLITE_ATTA
83e0: 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CH            : 
83f0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54  zCode="SQLITE_AT
8400: 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TACH"; break;.  
8410: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45    case SQLITE_DE
8420: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
8430: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8440: 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  DETACH"; break;.
8450: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8460: 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20  ALTER_TABLE     
8470: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
8480: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20  E_ALTER_TABLE"; 
8490: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
84a0: 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20  SQLITE_REINDEX  
84b0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
84c0: 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  ="SQLITE_REINDEX
84d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
84e0: 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a  se SQLITE_ANALYZ
84f0: 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43  E           : zC
8500: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c  ode="SQLITE_ANAL
8510: 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  YZE"; break;.   
8520: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
8530: 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20 3a  ATE_VTABLE     :
8540: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
8550: 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20 62  REATE_VTABLE"; b
8560: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
8570: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
8580: 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  E       : zCode=
8590: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41  "SQLITE_DROP_VTA
85a0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
85b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e   case SQLITE_FUN
85c0: 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20 3a  CTION          :
85d0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 46   zCode="SQLITE_F
85e0: 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b  UNCTION"; break;
85f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8600: 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20 20  _SAVEPOINT      
8610: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8620: 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20 62  TE_SAVEPOINT"; b
8630: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
8640: 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 20  QLITE_RECURSIVE 
8650: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
8660: 22 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56  "SQLITE_RECURSIV
8670: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  E"; break;.    d
8680: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20  efault          
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a               : z
86a0: 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65  Code="????"; bre
86b0: 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53  ak;.  }.  Tcl_DS
86c0: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
86d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
86e0: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
86f0: 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63  zAuth, -1);.  Tc
8700: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
8710: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f  lement(&str, zCo
8720: 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  de);.  Tcl_DStri
8730: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
8740: 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41  &str, zArg1 ? zA
8750: 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg1 : "");.  Tcl
8760: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
8770: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
8780: 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b  2 ? zArg2 : "");
8790: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
87a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
87b0: 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20  , zArg3 ? zArg3 
87c0: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
87d0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
87e0: 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20  t(&str, zArg4 ? 
87f0: 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 23 69 66  zArg4 : "");.#if
8800: 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  def SQLITE_USER_
8810: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
8820: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
8830: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
8840: 7a 41 72 67 35 20 3f 20 7a 41 72 67 35 20 3a 20  zArg5 ? zArg5 : 
8850: 22 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 63  "");.#endif.  rc
8860: 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61   = Tcl_GlobalEva
8870: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
8880: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
8890: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
88a0: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
88b0: 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d  .  zReply = rc==
88c0: 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74  TCL_OK ? Tcl_Get
88d0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
88e0: 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c  ->interp) : "SQL
88f0: 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28  ITE_DENY";.  if(
8900: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
8910: 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29  SQLITE_OK")==0 )
8920: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
8930: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
8940: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
8950: 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d  "SQLITE_DENY")==
8960: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
8970: 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c  LITE_DENY;.  }el
8980: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
8990: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e  eply,"SQLITE_IGN
89a0: 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ORE")==0 ){.    
89b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f  rc = SQLITE_IGNO
89c0: 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  RE;.  }else{.   
89d0: 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20   rc = 999;.  }. 
89e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
89f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8a00: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
8a10: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  N */../*.** This
8a20: 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61   routine reads a
8a30: 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72   line of text fr
8a40: 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72  om FILE in, stor
8a50: 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69  es.** the text i
8a60: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
8a70: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  d from malloc() 
8a80: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
8a90: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8aa0: 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72  text.  NULL is r
8ab0: 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f  eturned at end o
8ac0: 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61  f file, or if ma
8ad0: 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e  lloc().** fails.
8ae0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
8af0: 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65  face is like "re
8b00: 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63  adline" but no c
8b10: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74  ommand-line edit
8b20: 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a  ing.** is done..
8b30: 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f  **.** copied fro
8b40: 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27  m shell.c from '
8b50: 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64  .import' command
8b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
8b70: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
8b80: 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49  har *zPrompt, FI
8b90: 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  LE *in){.  char 
8ba0: 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c  *zLine;.  int nL
8bb0: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ine;.  int n;.. 
8bc0: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
8bd0: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
8be0: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
8bf0: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
8c00: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77   0;.  n = 0;.  w
8c10: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
8c20: 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29  f( n+100>nLine )
8c30: 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20  {.      nLine = 
8c40: 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20  nLine*2 + 100;. 
8c50: 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61       zLine = rea
8c60: 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e  lloc(zLine, nLin
8c70: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  e);.      if( zL
8c80: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
8c90: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
8ca0: 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d   fgets(&zLine[n]
8cb0: 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29  , nLine - n, in)
8cc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
8cd0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
8ce0: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
8cf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
8d00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c        }.      zL
8d10: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
8d20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8d30: 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
8d40: 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20  n] ){ n++; }.   
8d50: 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e   if( n>0 && zLin
8d60: 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a  e[n-1]=='\n' ){.
8d70: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
8d80: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
8d90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8da0: 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20  }.  }.  zLine = 
8db0: 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20  realloc( zLine, 
8dc0: 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  n+1 );.  return 
8dd0: 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  zLine;.}.../*.**
8de0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
8df0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d  s part of the im
8e00: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
8e10: 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a  the command:.**.
8e20: 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  **   $db transac
8e30: 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
8e40: 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
8e50: 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a  usive] SCRIPT.**
8e60: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
8e70: 64 20 61 66 74 65 72 20 65 76 61 6c 75 61 74 69  d after evaluati
8e80: 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 53 43  ng the script SC
8e90: 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f  RIPT to commit o
8ea0: 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68  r rollback.** th
8eb0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
8ec0: 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65   savepoint opene
8ed0: 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61  d by the [transa
8ee0: 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a  ction] command..
8ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
8f00: 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62 54 72  LITE_TCLAPI DbTr
8f10: 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43 6c  ansPostCmd(.  Cl
8f20: 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c  ientData data[],
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73     /* data[0] is
8f50: 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a 20   the Sqlite3Db* 
8f60: 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63 6c  for $db */.  Tcl
8f70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72    /* Tcl interpr
8fa0: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  eter */.  int re
8fb0: 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8fd0: 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61 6c  * Result of eval
8fe0: 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a 2f  uating SCRIPT */
8ff0: 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
9000: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61  st char *const a
9010: 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  zEnd[] = {.    "
9020: 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61  RELEASE _tcl_tra
9030: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
9040: 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52    /* rc==TCL_ERR
9050: 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e  OR, nTransaction
9060: 21 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d  !=0 */.    "COMM
9070: 49 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  IT",            
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9090: 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20   rc!=TCL_ERROR, 
90a0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20  nTransaction==0 
90b0: 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b  */.    "ROLLBACK
90c0: 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63   TO _tcl_transac
90d0: 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f  tion ; RELEASE _
90e0: 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
90f0: 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22  ,.    "ROLLBACK"
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d           /* rc==
9120: 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e  TCL_ERROR, nTran
9130: 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20  saction==0 */.  
9140: 7d 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  };.  SqliteDb *p
9150: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
9160: 64 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72  data[0];.  int r
9170: 63 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f  c = result;.  co
9180: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a  nst char *zEnd;.
9190: 0a 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  .  pDb->nTransac
91a0: 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d  tion--;.  zEnd =
91b0: 20 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f   azEnd[(rc==TCL_
91c0: 45 52 52 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d  ERROR)*2 + (pDb-
91d0: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
91e0: 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61  )];..  pDb->disa
91f0: 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28  bleAuth++;.  if(
9200: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
9210: 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20  b->db, zEnd, 0, 
9220: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  0, 0) ){.      /
9230: 2a 20 54 68 69 73 20 69 73 20 61 20 74 72 69 63  * This is a tric
9240: 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f 20 68  ky scenario to h
9250: 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20  andle. The most 
9260: 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f 66 20  likely cause of 
9270: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  an.      ** erro
9280: 72 20 69 73 20 74 68 61 74 20 74 68 65 20 65 78  r is that the ex
9290: 65 63 28 29 20 61 62 6f 76 65 20 77 61 73 20 61  ec() above was a
92a0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d  n attempt to com
92b0: 6d 69 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  mit the.      **
92c0: 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73   top-level trans
92d0: 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75  action that retu
92e0: 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55 53 59  rned SQLITE_BUSY
92f0: 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c  . Or, less likel
9300: 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  y,.      ** that
9310: 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61 73   an IO-error has
9320: 20 6f 63 63 75 72 72 65 64 2e 20 49 6e 20 65 69   occurred. In ei
9330: 74 68 65 72 20 63 61 73 65 2c 20 74 68 72 6f 77  ther case, throw
9340: 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e   a Tcl exception
9350: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 72  .      ** and tr
9360: 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  y to rollback th
9370: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
9380: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
9390: 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20 61 6c   But it could al
93a0: 73 6f 20 62 65 20 74 68 61 74 20 74 68 65 20 75  so be that the u
93b0: 73 65 72 20 65 78 65 63 75 74 65 64 20 6f 6e 65  ser executed one
93c0: 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c 0a   or more BEGIN,.
93d0: 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c        ** COMMIT,
93e0: 20 53 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c 45   SAVEPOINT, RELE
93f0: 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  ASE or ROLLBACK 
9400: 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 61 72  commands that ar
9410: 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20 20  e confusing.    
9420: 20 20 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f 64    ** this method
9430: 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63 6c  's logic. Not cl
9440: 65 61 72 20 68 6f 77 20 74 68 69 73 20 77 6f 75  ear how this wou
9450: 6c 64 20 62 65 20 62 65 73 74 20 68 61 6e 64 6c  ld be best handl
9460: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
9470: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45 52 52   if( rc!=TCL_ERR
9480: 4f 52 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OR ){.      Tcl_
9490: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
94a0: 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
94b0: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
94c0: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
94d0: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
94e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
94f0: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22  _exec(pDb->db, "
9500: 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c  ROLLBACK", 0, 0,
9510: 20 30 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e   0);.  }.  pDb->
9520: 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 0a  disableAuth--;..
9530: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9540: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c  /*.** Unless SQL
9550: 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
9560: 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
9570: 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c 65 20 77  on is a simple w
9580: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a  rapper around.**
9590: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
95a0: 5f 76 32 28 29 2e 20 49 66 20 53 51 4c 49 54 45  _v2(). If SQLITE
95b0: 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64  _TEST is defined
95c0: 2c 20 74 68 65 6e 20 69 74 20 75 73 65 73 20 65  , then it uses e
95d0: 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65 33  ither.** sqlite3
95e0: 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f 72  _prepare_v2() or
95f0: 20 6c 65 67 61 63 79 20 69 6e 74 65 72 66 61 63   legacy interfac
9600: 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  e sqlite3_prepar
9610: 65 28 29 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a  e(), depending.*
9620: 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  * on whether or 
9630: 6e 6f 74 20 74 68 65 20 5b 64 62 5f 75 73 65 5f  not the [db_use_
9640: 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5d 20  legacy_prepare] 
9650: 63 6f 6d 6d 61 6e 64 20 68 61 73 20 62 65 65 6e  command has been
9660: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 66   used to.** conf
9670: 69 67 75 72 65 20 74 68 65 20 63 6f 6e 6e 65 63  igure the connec
9680: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9690: 69 6e 74 20 64 62 50 72 65 70 61 72 65 28 0a 20  int dbPrepare(. 
96a0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a   /* Database obj
96d0: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
96e0: 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
96f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
9700: 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20  to compile */.  
9710: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
9720: 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20  pStmt,          
9730: 2f 2a 20 4f 55 54 3a 20 50 72 65 70 61 72 65 64  /* OUT: Prepared
9740: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
9750: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
9760: 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
9770: 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
9780: 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74  to next SQL stat
9790: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 75 6e  ement */.){.  un
97a0: 73 69 67 6e 65 64 20 69 6e 74 20 70 72 65 70 46  signed int prepF
97b0: 6c 61 67 73 20 3d 20 30 3b 0a 23 69 66 64 65 66  lags = 0;.#ifdef
97c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
97d0: 66 28 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50  f( pDb->bLegacyP
97e0: 72 65 70 61 72 65 20 29 7b 0a 20 20 20 20 72 65  repare ){.    re
97f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65  turn sqlite3_pre
9800: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
9810: 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20  ql, -1, ppStmt, 
9820: 70 7a 4f 75 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  pzOut);.  }.#end
9830: 69 66 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  if.  /* If the s
9840: 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 69  tatement cache i
9850: 73 20 6c 61 72 67 65 2c 20 75 73 65 20 74 68 65  s large, use the
9860: 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f   SQLITE_PREPARE_
9870: 50 45 52 53 49 53 54 45 4e 54 0a 20 20 2a 2a 20  PERSISTENT.  ** 
9880: 66 6c 61 67 73 2c 20 77 68 69 63 68 20 75 73 65  flags, which use
9890: 73 20 6c 65 73 73 20 6c 6f 6f 6b 61 73 69 64 65  s less lookaside
98a0: 20 6d 65 6d 6f 72 79 2e 20 20 42 75 74 20 69 66   memory.  But if
98b0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 73 6d   the cache is sm
98c0: 61 6c 6c 2c 0a 20 20 2a 2a 20 6f 6d 69 74 20 74  all,.  ** omit t
98d0: 68 61 74 20 66 6c 61 67 20 74 6f 20 6d 61 6b 65  hat flag to make
98e0: 20 66 75 6c 6c 20 75 73 65 20 6f 66 20 6c 6f 6f   full use of loo
98f0: 6b 61 73 69 64 65 20 2a 2f 0a 20 20 69 66 28 20  kaside */.  if( 
9900: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3e 35 20 29  pDb->maxStmt>5 )
9910: 20 70 72 65 70 46 6c 61 67 73 20 3d 20 53 51 4c   prepFlags = SQL
9920: 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45 52 53  ITE_PREPARE_PERS
9930: 49 53 54 45 4e 54 3b 0a 0a 20 20 72 65 74 75 72  ISTENT;..  retur
9940: 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  n sqlite3_prepar
9950: 65 5f 76 33 28 70 44 62 2d 3e 64 62 2c 20 7a 53  e_v3(pDb->db, zS
9960: 71 6c 2c 20 2d 31 2c 20 70 72 65 70 46 6c 61 67  ql, -1, prepFlag
9970: 73 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74  s, ppStmt, pzOut
9980: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  );.}../*.** Sear
9990: 63 68 20 74 68 65 20 63 61 63 68 65 20 66 6f 72  ch the cache for
99a0: 20 61 20 70 72 65 70 61 72 65 64 2d 73 74 61 74   a prepared-stat
99b0: 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 68 61  ement object tha
99c0: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
99d0: 0a 2a 2a 20 66 69 72 73 74 20 53 51 4c 20 73 74  .** first SQL st
99e0: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 62  atement in the b
99f0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
9a00: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 7a 49   by parameter zI
9a10: 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  n. If.** no such
9a20: 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d   prepared-statem
9a30: 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ent can be found
9a40: 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  , allocate and p
9a50: 72 65 70 61 72 65 20 61 20 6e 65 77 0a 2a 2a 20  repare a new.** 
9a60: 6f 6e 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  one. In either c
9a70: 61 73 65 2c 20 62 69 6e 64 20 74 68 65 20 63 75  ase, bind the cu
9a80: 72 72 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20  rrent values of 
9a90: 74 68 65 20 72 65 6c 65 76 61 6e 74 20 54 63 6c  the relevant Tcl
9aa0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f  .** variables to
9ab0: 20 61 6e 79 20 24 76 61 72 2c 20 3a 76 61 72 20   any $var, :var 
9ac0: 6f 72 20 40 76 61 72 20 76 61 72 69 61 62 6c 65  or @var variable
9ad0: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
9ae0: 6e 74 2e 20 42 65 66 6f 72 65 0a 2a 2a 20 72 65  nt. Before.** re
9af0: 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 70  turning, set *pp
9b00: 50 72 65 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74  PreStmt to point
9b10: 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64   to the prepared
9b20: 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63  -statement objec
9b30: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  t..**.** Output 
9b40: 70 61 72 61 6d 65 74 65 72 20 2a 70 7a 4f 75 74  parameter *pzOut
9b50: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
9b60: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 53 51 4c   to the next SQL
9b70: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a   statement in.**
9b80: 20 62 75 66 66 65 72 20 7a 49 6e 2c 20 6f 72 20   buffer zIn, or 
9b90: 74 6f 20 74 68 65 20 27 5c 30 27 20 62 79 74 65  to the '\0' byte
9ba0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a   at the end of z
9bb0: 49 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  In if there is n
9bc0: 6f 0a 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d  o.** next statem
9bd0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ent..**.** If su
9be0: 63 63 65 73 73 66 75 6c 2c 20 54 43 4c 5f 4f 4b  ccessful, TCL_OK
9bf0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
9c00: 68 65 72 77 69 73 65 2c 20 54 43 4c 5f 45 52 52  herwise, TCL_ERR
9c10: 4f 52 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OR is returned.*
9c20: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  * and an error m
9c30: 65 73 73 61 67 65 20 6c 6f 61 64 65 64 20 69 6e  essage loaded in
9c40: 74 6f 20 69 6e 74 65 72 70 72 65 74 65 72 20 70  to interpreter p
9c50: 44 62 2d 3e 69 6e 74 65 72 70 2e 0a 2a 2f 0a 73  Db->interp..*/.s
9c60: 74 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70  tatic int dbPrep
9c70: 61 72 65 41 6e 64 42 69 6e 64 28 0a 20 20 53 71  areAndBind(.  Sq
9c80: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20  liteDb *pDb,    
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ca0: 20 44 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74   Database object
9cb0: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
9cc0: 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20   *zIn,          
9cd0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20        /* SQL to 
9ce0: 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20 63 68 61  compile */.  cha
9cf0: 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 4f 75 74 2c  r const **pzOut,
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d10: 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
9d20: 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  next SQL stateme
9d30: 6e 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  nt */.  SqlPrepa
9d40: 72 65 64 53 74 6d 74 20 2a 2a 70 70 50 72 65 53  redStmt **ppPreS
9d50: 74 6d 74 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  tmt     /* OUT: 
9d60: 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 63  Object used to c
9d70: 61 63 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a  ache statement *
9d80: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
9d90: 72 20 2a 7a 53 71 6c 20 3d 20 7a 49 6e 3b 20 20  r *zSql = zIn;  
9da0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9db0: 72 20 74 6f 20 66 69 72 73 74 20 53 51 4c 20 73  r to first SQL s
9dc0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 49 6e 20  tatement in zIn 
9dd0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
9de0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20  t *pStmt = 0;   
9df0: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
9e00: 20 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63   statement objec
9e10: 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  t */.  SqlPrepar
9e20: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
9e30: 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
9e40: 72 20 74 6f 20 63 61 63 68 65 64 20 73 74 61 74  r to cached stat
9e50: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
9e60: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
9e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
9e80: 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20  ngth of zSql in 
9e90: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
9ea0: 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Var = 0;        
9eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9ec0: 6d 62 65 72 20 6f 66 20 76 61 72 69 61 62 6c 65  mber of variable
9ed0: 73 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 2a  s in statement *
9ee0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
9ef0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9f00: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65      /* Next free
9f10: 20 65 6e 74 72 79 20 69 6e 20 61 70 50 61 72 6d   entry in apParm
9f20: 20 2a 2f 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   */.  char c;.  
9f30: 69 6e 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74  int i;.  Tcl_Int
9f40: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44  erp *interp = pD
9f50: 62 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70  b->interp;..  *p
9f60: 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  pPreStmt = 0;.. 
9f70: 20 2f 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20   /* Trim spaces 
9f80: 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
9f90: 66 20 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75  f zSql and calcu
9fa0: 6c 61 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69  late the remaini
9fb0: 6e 67 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20  ng length. */.  
9fc0: 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 53 71 6c  while( (c = zSql
9fd0: 5b 30 5d 29 3d 3d 27 20 27 20 7c 7c 20 63 3d 3d  [0])==' ' || c==
9fe0: 27 5c 74 27 20 7c 7c 20 63 3d 3d 27 5c 72 27 20  '\t' || c=='\r' 
9ff0: 7c 7c 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 7a 53  || c=='\n' ){ zS
a000: 71 6c 2b 2b 3b 20 7d 0a 20 20 6e 53 71 6c 20 3d  ql++; }.  nSql =
a010: 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
a020: 0a 0a 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74  ..  for(pPreStmt
a030: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
a040: 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65  ; pPreStmt; pPre
a050: 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70  Stmt=pPreStmt->p
a060: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Next){.    int n
a070: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71   = pPreStmt->nSq
a080: 6c 3b 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3e  l;.    if( nSql>
a090: 3d 6e 0a 20 20 20 20 20 20 20 20 26 26 20 6d 65  =n.        && me
a0a0: 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a  mcmp(pPreStmt->z
a0b0: 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30  Sql, zSql, n)==0
a0c0: 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 53 71  .        && (zSq
a0d0: 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b  l[n]==0 || zSql[
a0e0: 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 29  n-1]==';').    )
a0f0: 7b 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20  {.      pStmt = 
a100: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b  pPreStmt->pStmt;
a110: 0a 20 20 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20  .      *pzOut = 
a120: 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e  &zSql[pPreStmt->
a130: 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a  nSql];..      /*
a140: 20 57 68 65 6e 20 61 20 70 72 65 70 61 72 65 64   When a prepared
a150: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f   statement is fo
a160: 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66  und, unlink it f
a170: 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  rom the.      **
a180: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74   cache list.  It
a190: 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61   will later be a
a1a0: 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  dded back to the
a1b0: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
a1c0: 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65   ** of the cache
a1d0: 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74   list in order t
a1e0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20  o implement LRU 
a1f0: 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20  replacement..   
a200: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
a210: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
a220: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  ){.        pPreS
a230: 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  tmt->pPrev->pNex
a240: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
a250: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
a260: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  {.        pDb->s
a270: 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74  tmtList = pPreSt
a280: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mt->pNext;.     
a290: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 72   }.      if( pPr
a2a0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a  eStmt->pNext ){.
a2b0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
a2c0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
a2d0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
a2e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a2f0: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
a300: 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Last = pPreStmt-
a310: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
a320: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
a330: 2d 2d 3b 0a 20 20 20 20 20 20 6e 56 61 72 20 3d  --;.      nVar =
a340: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
a350: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
a360: 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tmt);.      brea
a370: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
a380: 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65  /* If no prepare
a390: 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  d statement was 
a3a0: 66 6f 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74  found. Compile t
a3b0: 68 65 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73  he SQL text. Als
a3c0: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
a3d0: 61 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65  a new SqlPrepare
a3e0: 64 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e  dStmt structure.
a3f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53    */.  if( pPreS
a400: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  tmt==0 ){.    in
a410: 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66  t nByte;..    if
a420: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50  ( SQLITE_OK!=dbP
a430: 72 65 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c  repare(pDb, zSql
a440: 2c 20 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29  , &pStmt, pzOut)
a450: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
a460: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
a470: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
a480: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
a490: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29  sg(pDb->db), -1)
a4a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a4b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a4c0: 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d  .    if( pStmt==
a4d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  0 ){.      if( S
a4e0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
a4f0: 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
a500: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
a510: 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20   A compile-time 
a520: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61  error in the sta
a530: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  tement. */.     
a540: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
a550: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
a560: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
a570: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
a580: 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  >db), -1));.    
a590: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a5a0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
a5b0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
a5c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  e statement was 
a5d0: 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e  a no-op.  Contin
a5e0: 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ue to the next s
a5f0: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  tatement.       
a600: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73   ** in the SQL s
a610: 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  tring..        *
a620: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
a630: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d   TCL_OK;.      }
a640: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
a650: 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20  rt( pPreStmt==0 
a660: 29 3b 0a 20 20 20 20 6e 56 61 72 20 3d 20 73 71  );.    nVar = sq
a670: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
a680: 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
a690: 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  );.    nByte = s
a6a0: 69 7a 65 6f 66 28 53 71 6c 50 72 65 70 61 72 65  izeof(SqlPrepare
a6b0: 64 53 74 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69  dStmt) + nVar*si
a6c0: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b  zeof(Tcl_Obj *);
a6d0: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20  .    pPreStmt = 
a6e0: 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74  (SqlPreparedStmt
a6f0: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74  *)Tcl_Alloc(nByt
a700: 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  e);.    memset(p
a710: 50 72 65 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74  PreStmt, 0, nByt
a720: 65 29 3b 0a 0a 20 20 20 20 70 50 72 65 53 74 6d  e);..    pPreStm
a730: 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  t->pStmt = pStmt
a740: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ;.    pPreStmt->
a750: 6e 53 71 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a  nSql = (int)(*pz
a760: 4f 75 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20  Out - zSql);.   
a770: 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20   pPreStmt->zSql 
a780: 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
a790: 74 6d 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74  tmt);.    pPreSt
a7a0: 6d 74 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63  mt->apParm = (Tc
a7b0: 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74  l_Obj **)&pPreSt
a7c0: 6d 74 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  mt[1];.#ifdef SQ
a7d0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66  LITE_TEST.    if
a7e0: 28 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c  ( pPreStmt->zSql
a7f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==0 ){.      cha
a800: 72 20 2a 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41  r *zCopy = Tcl_A
a810: 6c 6c 6f 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e  lloc(pPreStmt->n
a820: 53 71 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  Sql + 1);.      
a830: 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53  memcpy(zCopy, zS
a840: 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  ql, pPreStmt->nS
a850: 71 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79  ql);.      zCopy
a860: 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d  [pPreStmt->nSql]
a870: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 70   = '\0';.      p
a880: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
a890: 7a 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e  zCopy;.    }.#en
a8a0: 64 69 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  dif.  }.  assert
a8b0: 28 20 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20  ( pPreStmt );.  
a8c0: 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30  assert( strlen30
a8d0: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29  (pPreStmt->zSql)
a8e0: 3d 3d 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  ==pPreStmt->nSql
a8f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
a900: 3d 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74  =memcmp(pPreStmt
a910: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50  ->zSql, zSql, pP
a920: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b  reStmt->nSql) );
a930: 0a 0a 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75  ..  /* Bind valu
a940: 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73  es to parameters
a950: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
a960: 20 24 20 6f 72 20 3a 20 2a 2f 0a 20 20 66 6f 72   $ or : */.  for
a970: 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69  (i=1; i<=nVar; i
a980: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
a990: 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69  har *zVar = sqli
a9a0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
a9b0: 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  er_name(pStmt, i
a9c0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21  );.    if( zVar!
a9d0: 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d  =0 && (zVar[0]==
a9e0: 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d  '$' || zVar[0]==
a9f0: 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d  ':' || zVar[0]==
aa00: 27 40 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63  '@') ){.      Tc
aa10: 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63  l_Obj *pVar = Tc
aa20: 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65  l_GetVar2Ex(inte
aa30: 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c  rp, &zVar[1], 0,
aa40: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
aa50: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Var ){.        i
aa60: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38  nt n;.        u8
aa70: 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20   *data;.        
aa80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
aa90: 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50  e = (pVar->typeP
aaa0: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
aab0: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a  tr->name : "");.
aac0: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 54 79 70          c = zTyp
aad0: 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  e[0];.        if
aae0: 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c  ( zVar[0]=='@' |
aaf0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 28 63 3d  |.           (c=
ab00: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
ab10: 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22  Type,"bytearray"
ab20: 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79  )==0 && pVar->by
ab30: 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  tes==0) ){.     
ab40: 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42       /* Load a B
ab50: 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20  LOB type if the 
ab60: 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  Tcl variable is 
ab70: 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a  a bytearray and.
ab80: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
ab90: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
aba0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20  presentation or 
abb0: 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20  the host.       
abc0: 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
abd0: 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
abe0: 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20   "@". */.       
abf0: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
ac00: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
ac10: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
ac20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
ac30: 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
ac40: 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  i, data, n, SQLI
ac50: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
ac60: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
ac70: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
ac80: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
ac90: 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b  ->apParm[iParm++
aca0: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
acb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
acc0: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
acd0: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
ace0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
acf0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
ad00: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e  interp, pVar, &n
ad10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ad20: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
ad30: 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20  tmt, i, n);.    
ad40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
ad50: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
ad60: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
ad70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64  0 ){.          d
ad80: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20  ouble r;.       
ad90: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
ada0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
adb0: 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20  pVar, &r);.     
adc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
add0: 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
ade0: 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  i, r);.        }
adf0: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27  else if( (c=='w'
ae00: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
ae10: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20  ,"wideInt")==0) 
ae20: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
ae30: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
ae40: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
ae50: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
ae60: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
ae70: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
ae80: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
ae90: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76  interp, pVar, &v
aea0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
aeb0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
aec0: 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20  pStmt, i, v);.  
aed0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aee0: 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75         data = (u
aef0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
af00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
af10: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
af20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
af30: 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
af40: 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74  , i, (char *)dat
af50: 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  a, n, SQLITE_STA
af60: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
af70: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
af80: 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20  (pVar);.        
af90: 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61    pPreStmt->apPa
afa0: 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56  rm[iParm++] = pV
afb0: 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ar;.        }.  
afc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
afd0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
afe0: 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a  null(pStmt, i);.
aff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b000: 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50  }.  pPreStmt->nP
b010: 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a  arm = iParm;.  *
b020: 70 70 50 72 65 53 74 6d 74 20 3d 20 70 50 72 65  ppPreStmt = pPre
b030: 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Stmt;..  return 
b040: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
b050: 20 52 65 6c 65 61 73 65 20 61 20 73 74 61 74 65   Release a state
b060: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 6f  ment reference o
b070: 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69  btained by calli
b080: 6e 67 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ng dbPrepareAndB
b090: 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20  ind()..** There 
b0a0: 73 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c  should be exactl
b0b0: 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68  y one call to th
b0c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  is function for 
b0d0: 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  each call to.** 
b0e0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
b0f0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
b100: 20 64 69 73 63 61 72 64 20 70 61 72 61 6d 65 74   discard paramet
b110: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
b120: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
b130: 6e 74 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a  nt is deleted.**
b140: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74   immediately. Ot
b150: 68 65 72 77 69 73 65 20 69 74 20 69 73 20 61 64  herwise it is ad
b160: 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
b170: 69 73 74 20 61 6e 64 20 6d 61 79 20 62 65 20 72  ist and may be r
b180: 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20  eturned.** by a 
b190: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
b1a0: 74 6f 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  to dbPrepareAndB
b1b0: 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ind()..*/.static
b1c0: 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65 53   void dbReleaseS
b1d0: 74 6d 74 28 0a 20 20 53 71 6c 69 74 65 44 62 20  tmt(.  SqliteDb 
b1e0: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
b1f0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
b200: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  se handle */.  S
b210: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
b220: 70 50 72 65 53 74 6d 74 2c 20 20 20 20 20 20 2f  pPreStmt,      /
b230: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
b240: 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74 6f 20 72  ment handle to r
b250: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
b260: 64 69 73 63 61 72 64 20 20 20 20 20 20 20 20 20  discard         
b270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b280: 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20 28 6e  rue to delete (n
b290: 6f 74 20 63 61 63 68 65 29 20 74 68 65 20 70 50  ot cache) the pP
b2a0: 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69  reStmt */.){.  i
b2b0: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nt i;..  /* Free
b2c0: 20 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e   the bound strin
b2d0: 67 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d  g and blob param
b2e0: 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69  eters */.  for(i
b2f0: 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e  =0; i<pPreStmt->
b300: 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nParm; i++){.   
b310: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
b320: 74 28 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61  t(pPreStmt->apPa
b330: 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50  rm[i]);.  }.  pP
b340: 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20  reStmt->nParm = 
b350: 30 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d  0;..  if( pDb->m
b360: 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73  axStmt<=0 || dis
b370: 63 61 72 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49  card ){.    /* I
b380: 66 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74  f the cache is t
b390: 75 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c  urned off, deall
b3a0: 6f 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65  ocated the state
b3b0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 64 62 46 72  ment */.    dbFr
b3c0: 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74 29  eeStmt(pPreStmt)
b3d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
b3e0: 2a 20 41 64 64 20 74 68 65 20 70 72 65 70 61 72  * Add the prepar
b3f0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ed statement to 
b400: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
b410: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e   the cache list.
b420: 20 2a 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74   */.    pPreStmt
b430: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73  ->pNext = pDb->s
b440: 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72  tmtList;.    pPr
b450: 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30  eStmt->pPrev = 0
b460: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73  ;.    if( pDb->s
b470: 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  tmtList ){.     
b480: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
b490: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b  Prev = pPreStmt;
b4a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e  .    }.    pDb->
b4b0: 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53  stmtList = pPreS
b4c0: 74 6d 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62  tmt;.    if( pDb
b4d0: 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b  ->stmtLast==0 ){
b4e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b4f0: 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  Db->nStmt==0 );.
b500: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
b510: 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  ast = pPreStmt;.
b520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b530: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
b540: 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  tmt>0 );.    }. 
b550: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b     pDb->nStmt++;
b560: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68  ..    /* If we h
b570: 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61  ave too many sta
b580: 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c  tement in cache,
b590: 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70   remove the surp
b5a0: 6c 75 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  lus from.    ** 
b5b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
b5c0: 61 63 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ache list.  */. 
b5d0: 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e     while( pDb->n
b5e0: 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d  Stmt>pDb->maxStm
b5f0: 74 20 29 7b 0a 20 20 20 20 20 20 53 71 6c 50 72  t ){.      SqlPr
b600: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4c 61 73  eparedStmt *pLas
b610: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  t = pDb->stmtLas
b620: 74 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  t;.      pDb->st
b630: 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e  mtLast = pLast->
b640: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 70 44 62  pPrev;.      pDb
b650: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
b660: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 62  t = 0;.      pDb
b670: 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20  ->nStmt--;.     
b680: 20 64 62 46 72 65 65 53 74 6d 74 28 70 4c 61 73   dbFreeStmt(pLas
b690: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
b6a0: 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
b6b0: 20 75 73 65 64 20 77 69 74 68 20 64 62 45 76 61   used with dbEva
b6c0: 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  lXXX() functions
b6d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c  :.**.**   dbEval
b6e0: 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64 62 45 76  Init().**   dbEv
b6f0: 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20 20 64 62  alStep().**   db
b700: 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a  EvalFinalize().*
b710: 2a 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66  *   dbEvalRowInf
b720: 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43  o().**   dbEvalC
b730: 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a  olumnValue().*/.
b740: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44  typedef struct D
b750: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 44 62 45  bEvalContext DbE
b760: 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  valContext;.stru
b770: 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ct DbEvalContext
b780: 20 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70   {.  SqliteDb *p
b790: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
b7a0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
b7b0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c   handle */.  Tcl
b7c0: 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20  _Obj *pSql;     
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b7e0: 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20 73  Object holding s
b7f0: 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20  tring zSql */.  
b800: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
b810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b820: 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c  /* Remaining SQL
b830: 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20   to execute */. 
b840: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
b850: 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20   *pPreStmt;     
b860: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
b870: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
b880: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
b890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b8a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
b8b0: 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d  returned by pStm
b8c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 76 61 6c 46  t */.  int evalF
b8d0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
b8e0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
b8f0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  used */.  Tcl_Ob
b900: 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20  j *pArray;      
b910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
b920: 65 20 6f 66 20 61 72 72 61 79 20 76 61 72 69 61  e of array varia
b930: 62 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ble */.  Tcl_Obj
b940: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20   **apColName;   
b950: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
b960: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
b970: 73 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  s */.};..#define
b980: 20 53 51 4c 49 54 45 5f 45 56 41 4c 5f 57 49 54   SQLITE_EVAL_WIT
b990: 48 4f 55 54 4e 55 4c 4c 53 20 20 30 78 30 30 30  HOUTNULLS  0x000
b9a0: 30 31 20 20 2f 2a 20 55 6e 73 65 74 20 61 72 72  01  /* Unset arr
b9b0: 61 79 28 2a 29 20 66 6f 72 20 4e 55 4c 4c 20 2a  ay(*) for NULL *
b9c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  /../*.** Release
b9d0: 20 61 6e 79 20 63 61 63 68 65 20 6f 66 20 63 6f   any cache of co
b9e0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65  lumn names curre
b9f0: 6e 74 6c 79 20 68 65 6c 64 20 61 73 20 70 61 72  ntly held as par
ba00: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 44 62 45 76  t of.** the DbEv
ba10: 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  alContext struct
ba20: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
ba30: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
ba40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ba50: 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e   dbReleaseColumn
ba60: 4e 61 6d 65 73 28 44 62 45 76 61 6c 43 6f 6e 74  Names(DbEvalCont
ba70: 65 78 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ext *p){.  if( p
ba80: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20  ->apColName ){. 
ba90: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
baa0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
bab0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
bac0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
bad0: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  ->apColName[i]);
bae0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 46  .    }.    Tcl_F
baf0: 72 65 65 28 28 63 68 61 72 20 2a 29 70 2d 3e 61  ree((char *)p->a
bb00: 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70  pColName);.    p
bb10: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b  ->apColName = 0;
bb20: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d  .  }.  p->nCol =
bb30: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
bb40: 74 69 61 6c 69 7a 65 20 61 20 44 62 45 76 61 6c  tialize a DbEval
bb50: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
bb60: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72  e..**.** If pArr
bb70: 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ay is not NULL, 
bb80: 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73  then it contains
bb90: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 54   the name of a T
bba0: 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76 61 72 69  cl array.** vari
bbb0: 61 62 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d 65  able. The "*" me
bbc0: 6d 62 65 72 20 6f 66 20 74 68 69 73 20 61 72 72  mber of this arr
bbd0: 61 79 20 69 73 20 73 65 74 20 74 6f 20 61 20 6c  ay is set to a l
bbe0: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
bbf0: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * the names of t
bc00: 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  he columns retur
bc10: 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  ned by the state
bc20: 6d 65 6e 74 20 61 73 20 70 61 72 74 20 6f 66 20  ment as part of 
bc30: 65 61 63 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  each.** call to 
bc40: 64 62 45 76 61 6c 53 74 65 70 28 29 2c 20 69 6e  dbEvalStep(), in
bc50: 20 6f 72 64 65 72 20 66 72 6f 6d 20 6c 65 66 74   order from left
bc60: 20 74 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e 20   to right. e.g. 
bc70: 69 66 20 74 68 65 20 6e 61 6d 65 73 0a 2a 2a 20  if the names.** 
bc80: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
bc90: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20 62  columns are a, b
bca0: 20 61 6e 64 20 63 2c 20 69 74 20 64 6f 65 73 20   and c, it does 
bcb0: 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
bcc0: 66 20 74 68 65 0a 2a 2a 20 74 63 6c 20 63 6f 6d  f the.** tcl com
bcd0: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand:.**.**     
bce0: 73 65 74 20 24 7b 70 41 72 72 61 79 7d 28 2a 29  set ${pArray}(*)
bcf0: 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74   {a b c}.*/.stat
bd00: 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 49 6e  ic void dbEvalIn
bd10: 69 74 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74  it(.  DbEvalCont
bd20: 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ext *p,         
bd30: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
bd40: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f   to structure to
bd50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20   initialize */. 
bd60: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
bd90: 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  dle */.  Tcl_Obj
bda0: 20 2a 70 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *pSql,         
bdb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
bdc0: 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51  ct containing SQ
bdd0: 4c 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 54 63  L script */.  Tc
bde0: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 2c 20 20  l_Obj *pArray,  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be00: 20 4e 61 6d 65 20 6f 66 20 54 63 6c 20 61 72 72   Name of Tcl arr
be10: 61 79 20 74 6f 20 73 65 74 20 28 2a 29 20 65 6c  ay to set (*) el
be20: 65 6d 65 6e 74 20 6f 66 20 2a 2f 0a 20 20 69 6e  ement of */.  in
be30: 74 20 65 76 61 6c 46 6c 61 67 73 20 20 20 20 20  t evalFlags     
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be50: 20 46 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   Flags controlli
be60: 6e 67 20 65 76 61 6c 75 61 74 69 6f 6e 20 2a 2f  ng evaluation */
be70: 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  .){.  memset(p, 
be80: 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61 6c  0, sizeof(DbEval
be90: 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d 3e  Context));.  p->
bea0: 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d 3e  pDb = pDb;.  p->
beb0: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
bec0: 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70 2d  ring(pSql);.  p-
bed0: 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20 20  >pSql = pSql;.  
bee0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
bef0: 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 41  (pSql);.  if( pA
bf00: 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70  rray ){.    p->p
bf10: 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b 0a  Array = pArray;.
bf20: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
bf30: 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20 20  ount(pArray);.  
bf40: 7d 0a 20 20 70 2d 3e 65 76 61 6c 46 6c 61 67 73  }.  p->evalFlags
bf50: 20 3d 20 65 76 61 6c 46 6c 61 67 73 3b 0a 7d 0a   = evalFlags;.}.
bf60: 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e  ./*.** Obtain in
bf70: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
bf80: 74 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65  the row that the
bf90: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 70   DbEvalContext p
bfa0: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
bfb0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63  first argument c
bfc0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
bfd0: 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  to..*/.static vo
bfe0: 69 64 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f  id dbEvalRowInfo
bff0: 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  (.  DbEvalContex
c000: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
c010: 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f      /* Evaluatio
c020: 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  n context */.  i
c030: 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  nt *pnCol,      
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c050: 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
c060: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
c070: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61  .  Tcl_Obj ***pa
c080: 70 43 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20 20  pColName        
c090: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79     /* OUT: Array
c0a0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
c0b0: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70   */.){.  /* Comp
c0c0: 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ute column names
c0d0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e   */.  if( 0==p->
c0e0: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
c0f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
c100: 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74  Stmt = p->pPreSt
c110: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69  mt->pStmt;.    i
c120: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c140: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
c150: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  e */.    int nCo
c160: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
c170: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c180: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
c190: 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f  rned by pStmt */
c1a0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
c1b0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20  pColName = 0;   
c1c0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
c1d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
c1e0: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43      p->nCol = nC
c1f0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
c200: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
c210: 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30  ;.    if( nCol>0
c220: 20 26 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20   && (papColName 
c230: 7c 7c 20 70 2d 3e 70 41 72 72 61 79 29 20 29 7b  || p->pArray) ){
c240: 0a 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65  .      apColName
c250: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
c260: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
c270: 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29  Tcl_Obj*)*nCol )
c280: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c290: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
c2a0: 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65         apColName
c2b0: 5b 69 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  [i] = Tcl_NewStr
c2c0: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  ingObj(sqlite3_c
c2d0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
c2e0: 2c 69 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ,i), -1);.      
c2f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c300: 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29  nt(apColName[i])
c310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c320: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61  p->apColName = a
c330: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a  pColName;.    }.
c340: 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 73 75 6c  .    /* If resul
c350: 74 73 20 61 72 65 20 62 65 69 6e 67 20 73 74 6f  ts are being sto
c360: 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20  red in an array 
c370: 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e 20 63  variable, then c
c380: 72 65 61 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  reate.    ** the
c390: 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20   array(*) entry 
c3a0: 66 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a 20  for that array. 
c3b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
c3c0: 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20  >pArray ){.     
c3d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c3e0: 65 72 70 20 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e  erp = p->pDb->in
c3f0: 74 65 72 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f  terp;.      Tcl_
c400: 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20  Obj *pColList = 
c410: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
c420: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74      Tcl_Obj *pSt
c430: 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  ar = Tcl_NewStri
c440: 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a  ngObj("*", -1);.
c450: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c460: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
c470: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
c480: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
c490: 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c  nterp, pColList,
c4a0: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a   apColName[i]);.
c4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63        }.      Tc
c4c0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c4d0: 53 74 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c  Star);.      Tcl
c4e0: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
c4f0: 72 70 2c 20 70 2d 3e 70 41 72 72 61 79 2c 20 70  rp, p->pArray, p
c500: 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 20  Star, pColList, 
c510: 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65  0);.      Tcl_De
c520: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72  crRefCount(pStar
c530: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
c540: 69 66 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29  if( papColName )
c550: 7b 0a 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d  {.    *papColNam
c560: 65 20 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65  e = p->apColName
c570: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f  ;.  }.  if( pnCo
c580: 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  l ){.    *pnCol 
c590: 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d  = p->nCol;.  }.}
c5a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f  ../*.** Return o
c5b0: 6e 65 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54 43  ne of TCL_OK, TC
c5c0: 4c 5f 42 52 45 41 4b 20 6f 72 20 54 43 4c 5f 45  L_BREAK or TCL_E
c5d0: 52 52 4f 52 2e 20 49 66 20 54 43 4c 5f 45 52 52  RROR. If TCL_ERR
c5e0: 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  OR is.** returne
c5f0: 64 2c 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72  d, then an error
c600: 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
c610: 65 64 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70  ed in the interp
c620: 72 65 74 65 72 20 62 65 66 6f 72 65 0a 2a 2a 20  reter before.** 
c630: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
c640: 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   A return value 
c650: 6f 66 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20  of TCL_OK means 
c660: 74 68 65 72 65 20 69 73 20 61 20 72 6f 77 20 6f  there is a row o
c670: 66 20 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65  f data available
c680: 2e 20 54 68 65 0a 2a 2a 20 64 61 74 61 20 6d 61  . The.** data ma
c690: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 75 73  y be accessed us
c6a0: 69 6e 67 20 64 62 45 76 61 6c 52 6f 77 49 6e 66  ing dbEvalRowInf
c6b0: 6f 28 29 20 61 6e 64 20 64 62 45 76 61 6c 43 6f  o() and dbEvalCo
c6c0: 6c 75 6d 6e 56 61 6c 75 65 28 29 2e 20 54 68 69  lumnValue(). Thi
c6d0: 73 0a 2a 2a 20 69 73 20 61 6e 61 6c 6f 67 6f 75  s.** is analogou
c6e0: 73 20 74 6f 20 61 20 72 65 74 75 72 6e 20 6f 66  s to a return of
c6f0: 20 53 51 4c 49 54 45 5f 52 4f 57 20 66 72 6f 6d   SQLITE_ROW from
c700: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
c710: 20 49 66 20 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a   If TCL_BREAK.**
c720: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
c730: 65 6e 20 74 68 65 20 53 51 4c 20 73 63 72 69 70  en the SQL scrip
c740: 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 65  t has finished e
c750: 78 65 63 75 74 69 6e 67 20 61 6e 64 20 74 68 65  xecuting and the
c760: 72 65 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 75 72  re are.** no fur
c770: 74 68 65 72 20 72 6f 77 73 20 61 76 61 69 6c 61  ther rows availa
c780: 62 6c 65 2e 20 54 68 69 73 20 69 73 20 73 69 6d  ble. This is sim
c790: 69 6c 61 72 20 74 6f 20 53 51 4c 49 54 45 5f 44  ilar to SQLITE_D
c7a0: 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONE..*/.static i
c7b0: 6e 74 20 64 62 45 76 61 6c 53 74 65 70 28 44 62  nt dbEvalStep(Db
c7c0: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b  EvalContext *p){
c7d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c7e0: 50 72 65 76 53 71 6c 20 3d 20 30 3b 20 20 20 20  PrevSql = 0;    
c7f0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76     /* Previous v
c800: 61 6c 75 65 20 6f 66 20 70 2d 3e 7a 53 71 6c 20  alue of p->zSql 
c810: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  */..  while( p->
c820: 7a 53 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50  zSql[0] || p->pP
c830: 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e  reStmt ){.    in
c840: 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 2d  t rc;.    if( p-
c850: 3e 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a  >pPreStmt==0 ){.
c860: 20 20 20 20 20 20 7a 50 72 65 76 53 71 6c 20 3d        zPrevSql =
c870: 20 28 70 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76   (p->zSql==zPrev
c880: 53 71 6c 20 3f 20 30 20 3a 20 70 2d 3e 7a 53 71  Sql ? 0 : p->zSq
c890: 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64  l);.      rc = d
c8a0: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
c8b0: 70 2d 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c  p->pDb, p->zSql,
c8c0: 20 26 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70   &p->zSql, &p->p
c8d0: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
c8e0: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29  if( rc!=TCL_OK )
c8f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
c910: 20 72 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69   rcs;.      Sqli
c920: 74 65 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70  teDb *pDb = p->p
c930: 44 62 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65  Db;.      SqlPre
c940: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
c950: 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d  tmt = p->pPreStm
c960: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
c970: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70  _stmt *pStmt = p
c980: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
c990: 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c  .      rcs = sql
c9a0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
c9b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 73 3d  ;.      if( rcs=
c9c0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
c9d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
c9e0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
c9f0: 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61      if( p->pArra
ca00: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45  y ){.        dbE
ca10: 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c  valRowInfo(p, 0,
ca20: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ca30: 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33     rcs = sqlite3
ca40: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a  _reset(pStmt);..
ca50: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70        pDb->nStep
ca60: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
ca70: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c  status(pStmt,SQL
ca80: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
ca90: 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b  ULLSCAN_STEP,1);
caa0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72  .      pDb->nSor
cab0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  t = sqlite3_stmt
cac0: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51  _status(pStmt,SQ
cad0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
cae0: 53 4f 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70  SORT,1);.      p
caf0: 44 62 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c  Db->nIndex = sql
cb00: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
cb10: 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54  (pStmt,SQLITE_ST
cb20: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
cb30: 45 58 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  EX,1);.      pDb
cb40: 2d 3e 6e 56 4d 53 74 65 70 20 3d 20 73 71 6c 69  ->nVMStep = sqli
cb50: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
cb60: 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d  pStmt,SQLITE_STM
cb70: 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c  TSTATUS_VM_STEP,
cb80: 31 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65  1);.      dbRele
cb90: 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  aseColumnNames(p
cba0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  );.      p->pPre
cbb0: 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Stmt = 0;..     
cbc0: 20 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45   if( rcs!=SQLITE
cbd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
cbe0: 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20  * If a run-time 
cbf0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
cc00: 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61  port the error a
cc10: 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a  nd stop reading.
cc20: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
cc30: 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  QL.  */.        
cc40: 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44  dbReleaseStmt(pD
cc50: 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b  b, pPreStmt, 1);
cc60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54  .#if SQLITE_TEST
cc70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
cc80: 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70  pDb->bLegacyPrep
cc90: 61 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49  are && rcs==SQLI
cca0: 54 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72  TE_SCHEMA && zPr
ccb0: 65 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  evSql ){.       
ccc0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e     /* If the run
ccd0: 74 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61  time error was a
cce0: 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c  n SQLITE_SCHEMA,
ccf0: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
cd00: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
cd10: 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75  andle is configu
cd20: 72 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c  red to use the l
cd30: 65 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72  egacy sqlite3_pr
cd40: 65 70 61 72 65 28 29 0a 20 20 20 20 20 20 20 20  epare().        
cd50: 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20    ** interface, 
cd60: 72 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f  retry prepare()/
cd70: 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61  step() on the sa
cd80: 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  me SQL statement
cd90: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  ..          ** T
cda0: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
cdb0: 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20   once. If there 
cdc0: 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49  is a second SQLI
cdd0: 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20  TE_SCHEMA.      
cde0: 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68      ** error, th
cdf0: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
ce00: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
ce10: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20  caller. */.     
ce20: 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a       p->zSql = z
ce30: 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20  PrevSql;.       
ce40: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
ce50: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
ce60: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
ce70: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
ce80: 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rp,.            
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
cea0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
ceb0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
cec0: 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20  ->db), -1));.   
ced0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
cee0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
cef0: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65  se{.        dbRe
cf00: 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70  leaseStmt(pDb, p
cf10: 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  PreStmt, 0);.   
cf20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
cf30: 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f    /* Finished */
cf40: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52  .  return TCL_BR
cf50: 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  EAK;.}../*.** Fr
cf60: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
cf70: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
cf80: 62 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  by the DbEvalCon
cf90: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70  text structure p
cfa0: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
cfb0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
cfc0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
cfd0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c  exactly one call
cfe0: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
cff0: 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61  n.** for each ca
d000: 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74  ll to dbEvalInit
d010: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
d020: 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a  id dbEvalFinaliz
d030: 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e(DbEvalContext 
d040: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50  *p){.  if( p->pP
d050: 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  reStmt ){.    sq
d060: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
d070: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b  PreStmt->pStmt);
d080: 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74  .    dbReleaseSt
d090: 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50  mt(p->pDb, p->pP
d0a0: 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  reStmt, 0);.    
d0b0: 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b  p->pPreStmt = 0;
d0c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41  .  }.  if( p->pA
d0d0: 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  rray ){.    Tcl_
d0e0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
d0f0: 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e  pArray);.    p->
d100: 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a  pArray = 0;.  }.
d110: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
d120: 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64  nt(p->pSql);.  d
d130: 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61  bReleaseColumnNa
d140: 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mes(p);.}../*.**
d150: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
d160: 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73  r to a Tcl_Obj s
d170: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 72 65  tructure with re
d180: 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63  f-count 0 that c
d190: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76  ontains.** the v
d1a0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f  alue for the iCo
d1b0: 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  l'th column of t
d1c0: 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  he row currently
d1d0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
d1e0: 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  * the DbEvalCont
d1f0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
d200: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
d210: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
d220: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64  tatic Tcl_Obj *d
d230: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
d240: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
d250: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
d260: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
d270: 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d  tmt = p->pPreStm
d280: 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74  t->pStmt;.  swit
d290: 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ch( sqlite3_colu
d2a0: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69  mn_type(pStmt, i
d2b0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65  Col) ){.    case
d2c0: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
d2d0: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
d2e0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
d2f0: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43  _bytes(pStmt, iC
d300: 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ol);.      const
d310: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73   char *zBlob = s
d320: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
d330: 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  ob(pStmt, iCol);
d340: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f  .      if( !zBlo
d350: 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20  b ) bytes = 0;. 
d360: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
d370: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
d380: 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65  (u8*)zBlob, byte
d390: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  s);.    }.    ca
d3a0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
d3b0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
d3c0: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
d3d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
d3e0: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
d3f0: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
d400: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
d410: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
d420: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
d430: 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29  ewIntObj((int)v)
d440: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63         return Tc
d460: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
d470: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
d480: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
d490: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
d4a0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44   return Tcl_NewD
d4b0: 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33  oubleObj(sqlite3
d4c0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
d4d0: 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20  Stmt, iCol));.  
d4e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
d4f0: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
d500: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
d510: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62  StringObj(p->pDb
d520: 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20  ->zNull, -1);.  
d530: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
d540: 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  n Tcl_NewStringO
d550: 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
d560: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
d570: 74 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29 3b  tmt, iCol), -1);
d580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69  .}../*.** If usi
d590: 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38  ng Tcl version 8
d5a0: 2e 36 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75  .6 or greater, u
d5b0: 73 65 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69  se the NR functi
d5c0: 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20  ons to avoid.** 
d5d0: 72 65 63 75 72 73 69 76 65 20 65 76 61 6c 75 74  recursive evalut
d5e0: 69 6f 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62  ion of scripts b
d5f0: 79 20 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20  y the [db eval] 
d600: 61 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a  and [db trans].*
d610: 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e  * commands. Even
d620: 20 69 66 20 74 68 65 20 68 65 61 64 65 72 73 20   if the headers 
d630: 75 73 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69  used while compi
d640: 6c 69 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69  ling the extensi
d650: 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72  on.** are 8.6 or
d660: 20 6e 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65   newer, the code
d670: 20 73 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65   still tests the
d680: 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20   Tcl version at 
d690: 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73  runtime..** This
d6a0: 20 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e   allows stubs-en
d6b0: 61 62 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20  abled builds to 
d6c0: 62 65 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64  be used with old
d6d0: 65 72 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73  er Tcl libraries
d6e0: 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a  ..*/.#if TCL_MAJ
d6f0: 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20  OR_VERSION>8 || 
d700: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
d710: 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e  ON==8 && TCL_MIN
d720: 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23  OR_VERSION>=6).#
d730: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54   define SQLITE_T
d740: 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20  CL_NRE 1.static 
d750: 69 6e 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69  int DbUseNre(voi
d760: 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c  d){.  int major,
d770: 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65   minor;.  Tcl_Ge
d780: 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c  tVersion(&major,
d790: 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a   &minor, 0, 0);.
d7a0: 20 20 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72    return( (major
d7b0: 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29  ==8 && minor>=6)
d7c0: 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d   || major>8 );.}
d7d0: 0a 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20 43 6f 6d  .#else./*.** Com
d7e0: 70 69 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61  piling using hea
d7f0: 64 65 72 73 20 65 61 72 6c 69 65 72 20 74 68 61  ders earlier tha
d800: 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63  n 8.6. In this c
d810: 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65  ase NR cannot be
d820: 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55  .** used, so DbU
d830: 73 65 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79  seNre() to alway
d840: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41  s return zero. A
d850: 64 64 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20  dd #defines for 
d860: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c  the other.** Tcl
d870: 5f 4e 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f  _NRxxx() functio
d880: 6e 73 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ns to prevent th
d890: 65 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20  em from causing 
d8a0: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f  compilation erro
d8b0: 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75  rs,.** even thou
d8c0: 67 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f  gh the only invo
d8d0: 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20  cations of them 
d8e0: 61 72 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69  are within condi
d8f0: 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 0a 2a 2a  tional blocks.**
d900: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
d910: 0a 2a 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e  .**   if( DbUseN
d920: 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a  re() ) { ... }.*
d930: 2f 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  /.# define SQLIT
d940: 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65  E_TCL_NRE 0.# de
d950: 66 69 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20  fine DbUseNre() 
d960: 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e  0.# define Tcl_N
d970: 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62  RAddCallback(a,b
d980: 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64 29  ,c,d,e,f) (void)
d990: 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e  0.# define Tcl_N
d9a0: 52 45 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20  REvalObj(a,b,c) 
d9b0: 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e  0.# define Tcl_N
d9c0: 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61  RCreateCommand(a
d9d0: 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f 69  ,b,c,d,e,f) (voi
d9e0: 64 29 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d)0.#endif../*.*
d9f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
da00: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
da10: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
da20: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a   the command:.**
da30: 0a 2a 2a 20 20 20 24 64 62 20 65 76 61 6c 20 53  .**   $db eval S
da40: 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45 3f 20 53  QL ?ARRAYNAME? S
da50: 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74 69 63 20  CRIPT.*/.static 
da60: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
da70: 49 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28  I DbEvalNextCmd(
da80: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61  .  ClientData da
da90: 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20  ta[],           
daa0: 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b          /* data[
dab0: 30 5d 20 69 73 20 74 68 65 20 28 44 62 45 76 61  0] is the (DbEva
dac0: 6c 43 6f 6e 74 65 78 74 2a 29 20 2a 2f 0a 20 20  lContext*) */.  
dad0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
dae0: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
daf0: 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65       /* Tcl inte
db00: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rpreter */.  int
db10: 20 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20   result         
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 6f 20 66    /* Result so f
db40: 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ar */.){.  int r
db50: 63 20 3d 20 72 65 73 75 6c 74 3b 20 20 20 20 20  c = result;     
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
db80: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 69 72 73  /..  /* The firs
db90: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  t element of the
dba0: 20 64 61 74 61 5b 5d 20 61 72 72 61 79 20 69 73   data[] array is
dbb0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
dbc0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 0a 20 20  DbEvalContext.  
dbd0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c  ** structure all
dbe0: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c  ocated using Tcl
dbf0: 5f 41 6c 6c 6f 63 28 29 2e 20 54 68 65 20 73 65  _Alloc(). The se
dc00: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
dc10: 64 61 74 61 5b 5d 0a 20 20 2a 2a 20 69 73 20 61  data[].  ** is a
dc20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63   pointer to a Tc
dc30: 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 69 6e 67  l_Obj containing
dc40: 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20 72   the script to r
dc50: 75 6e 20 66 6f 72 20 65 61 63 68 20 72 6f 77 0a  un for each row.
dc60: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79    ** returned by
dc70: 20 74 68 65 20 71 75 65 72 69 65 73 20 65 6e 63   the queries enc
dc80: 61 70 73 75 6c 61 74 65 64 20 69 6e 20 64 61 74  apsulated in dat
dc90: 61 5b 30 5d 2e 20 2a 2f 0a 20 20 44 62 45 76 61  a[0]. */.  DbEva
dca0: 6c 43 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28 44  lContext *p = (D
dcb0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 64  bEvalContext *)d
dcc0: 61 74 61 5b 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62  ata[0];.  Tcl_Ob
dcd0: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 28 54 63  j *pScript = (Tc
dce0: 6c 5f 4f 62 6a 20 2a 29 64 61 74 61 5b 31 5d 3b  l_Obj *)data[1];
dcf0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
dd00: 61 79 20 3d 20 70 2d 3e 70 41 72 72 61 79 3b 0a  ay = p->pArray;.
dd10: 0a 20 20 77 68 69 6c 65 28 20 28 72 63 3d 3d 54  .  while( (rc==T
dd20: 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c  CL_OK || rc==TCL
dd30: 5f 43 4f 4e 54 49 4e 55 45 29 20 26 26 20 54 43  _CONTINUE) && TC
dd40: 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
dd50: 61 6c 53 74 65 70 28 70 29 29 20 29 7b 0a 20 20  alStep(p)) ){.  
dd60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
dd70: 20 6e 43 6f 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f   nCol;.    Tcl_O
dd80: 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a  bj **apColName;.
dd90: 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66      dbEvalRowInf
dda0: 6f 28 70 2c 20 26 6e 43 6f 6c 2c 20 26 61 70 43  o(p, &nCol, &apC
ddb0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  olName);.    for
ddc0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
ddd0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41  +){.      if( pA
dde0: 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rray==0 ){.     
ddf0: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
de00: 32 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e  2(interp, apColN
de10: 61 6d 65 5b 69 5d 2c 20 30 2c 20 64 62 45 76 61  ame[i], 0, dbEva
de20: 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 70 2c 69  lColumnValue(p,i
de30: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ), 0);.      }el
de40: 73 65 20 69 66 28 20 28 70 2d 3e 65 76 61 6c 46  se if( (p->evalF
de50: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 56  lags & SQLITE_EV
de60: 41 4c 5f 57 49 54 48 4f 55 54 4e 55 4c 4c 53 29  AL_WITHOUTNULLS)
de70: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
de80: 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   && sqlite3_colu
de90: 6d 6e 5f 74 79 70 65 28 70 2d 3e 70 50 72 65 53  mn_type(p->pPreS
dea0: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 69 29 3d 3d  tmt->pStmt, i)==
deb0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20 20 20  SQLITE_NULL .   
dec0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63     ){.        Tc
ded0: 6c 5f 55 6e 73 65 74 56 61 72 32 28 69 6e 74 65  l_UnsetVar2(inte
dee0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
def0: 67 28 70 41 72 72 61 79 29 2c 20 0a 20 20 20 20  g(pArray), .    
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df10: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
df20: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 2c 20 30  apColName[i]), 0
df30: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
df40: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
df50: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
df60: 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65  Array, apColName
df70: 5b 69 5d 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d  [i], dbEvalColum
df80: 6e 56 61 6c 75 65 28 70 2c 69 29 2c 20 30 29 3b  nValue(p,i), 0);
df90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
dfa0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 69      /* The requi
dfb0: 72 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20  red interpreter 
dfc0: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f  variables are no
dfd0: 77 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  w populated with
dfe0: 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
dff0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
e000: 74 20 72 6f 77 2e 20 49 66 20 75 73 69 6e 67 20  t row. If using 
e010: 4e 52 45 2c 20 73 63 68 65 64 75 6c 65 20 63 61  NRE, schedule ca
e020: 6c 6c 62 61 63 6b 73 20 74 6f 20 65 76 61 6c 75  llbacks to evalu
e030: 61 74 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  ate.    ** scrip
e040: 74 20 70 53 63 72 69 70 74 2c 20 74 68 65 6e 20  t pScript, then 
e050: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  to invoke this f
e060: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 74 6f  unction again to
e070: 20 66 65 74 63 68 20 74 68 65 20 6e 65 78 74 0a   fetch the next.
e080: 20 20 20 20 2a 2a 20 72 6f 77 20 28 6f 72 20 63      ** row (or c
e090: 6c 65 61 6e 20 75 70 20 69 66 20 74 68 65 72 65  lean up if there
e0a0: 20 69 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 20   is no next row 
e0b0: 6f 72 20 74 68 65 20 73 63 72 69 70 74 20 74 68  or the script th
e0c0: 72 6f 77 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65  rows an.    ** e
e0d0: 78 63 65 70 74 69 6f 6e 29 2e 20 41 66 74 65 72  xception). After
e0e0: 20 73 63 68 65 64 75 6c 69 6e 67 20 74 68 65 20   scheduling the 
e0f0: 63 61 6c 6c 62 61 63 6b 73 2c 20 72 65 74 75 72  callbacks, retur
e100: 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  n control to the
e110: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a  .    ** caller..
e120: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
e130: 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20   not using NRE, 
e140: 65 76 61 6c 75 61 74 65 20 70 53 63 72 69 70 74  evaluate pScript
e150: 20 64 69 72 65 63 74 6c 79 20 61 6e 64 20 63 6f   directly and co
e160: 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 0a  ntinue with the.
e170: 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72      ** next iter
e180: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 77 68  ation of this wh
e190: 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 2e 20 20  ile(...) loop.  
e1a0: 2a 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73 65  */.    if( DbUse
e1b0: 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54  Nre() ){.      T
e1c0: 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b  cl_NRAddCallback
e1d0: 28 69 6e 74 65 72 70 2c 20 44 62 45 76 61 6c 4e  (interp, DbEvalN
e1e0: 65 78 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29 70  extCmd, (void*)p
e1f0: 2c 20 28 76 6f 69 64 2a 29 70 53 63 72 69 70 74  , (void*)pScript
e200: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  , 0, 0);.      r
e210: 65 74 75 72 6e 20 54 63 6c 5f 4e 52 45 76 61 6c  eturn Tcl_NREval
e220: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72  Obj(interp, pScr
e230: 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ipt, 0);.    }el
e240: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  se{.      rc = T
e250: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
e260: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
e270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54  ;.    }.  }..  T
e280: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
e290: 70 53 63 72 69 70 74 29 3b 0a 20 20 64 62 45 76  pScript);.  dbEv
e2a0: 61 6c 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20  alFinalize(p);. 
e2b0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
e2c0: 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  *)p);..  if( rc=
e2d0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54  =TCL_OK || rc==T
e2e0: 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20  CL_BREAK ){.    
e2f0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
e300: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 63 20  interp);.    rc 
e310: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  = TCL_OK;.  }.  
e320: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e330: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
e340: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
e350: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
e360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
e370: 67 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 68 61  g database.** ha
e380: 6e 64 6c 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64  ndle sub-command
e390: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 75  s:.**.**   $db u
e3a0: 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 53 43 52 49  pdate_hook ?SCRI
e3b0: 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 77 61 6c  PT?.**   $db wal
e3c0: 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a  _hook ?SCRIPT?.*
e3d0: 2a 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68  *   $db commit_h
e3e0: 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20  ook ?SCRIPT?.** 
e3f0: 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65 20    $db preupdate 
e400: 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2f  hook ?SCRIPT?.*/
e410: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 48  .static void DbH
e420: 6f 6f 6b 43 6d 64 28 0a 20 20 54 63 6c 5f 49 6e  ookCmd(.  Tcl_In
e430: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
e440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c            /* Tcl
e450: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
e460: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c    SqliteDb *pDb,
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
e490: 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ndle */.  Tcl_Ob
e4a0: 6a 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  j *pArg,        
e4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 43 52            /* SCR
e4c0: 49 50 54 20 61 72 67 75 6d 65 6e 74 20 28 6f 72  IPT argument (or
e4d0: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 54 63 6c 5f   NULL) */.  Tcl_
e4e0: 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 20 20 20 20  Obj **ppHook    
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
e500: 6f 69 6e 74 65 72 20 74 6f 20 6d 65 6d 62 65 72  ointer to member
e510: 20 6f 66 20 53 71 6c 69 74 65 44 62 20 2a 2f 0a   of SqliteDb */.
e520: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e530: 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 69   = pDb->db;..  i
e540: 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20  f( *ppHook ){.  
e550: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
e560: 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f  lt(interp, *ppHo
e570: 6f 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72  ok);.    if( pAr
e580: 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  g ){.      Tcl_D
e590: 65 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ecrRefCount(*ppH
e5a0: 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 2a 70 70 48  ook);.      *ppH
e5b0: 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ook = 0;.    }. 
e5c0: 20 7d 0a 20 20 69 66 28 20 70 41 72 67 20 29 7b   }.  if( pArg ){
e5d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28 2a  .    assert( !(*
e5e0: 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 69  ppHook) );.    i
e5f0: 66 28 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65  f( Tcl_GetCharLe
e600: 6e 67 74 68 28 70 41 72 67 29 3e 30 20 29 7b 0a  ngth(pArg)>0 ){.
e610: 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20        *ppHook = 
e620: 70 41 72 67 3b 0a 20 20 20 20 20 20 54 63 6c 5f  pArg;.      Tcl_
e630: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70  IncrRefCount(*pp
e640: 48 6f 6f 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Hook);.    }.  }
e650: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e660: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
e670: 5f 48 4f 4f 4b 0a 20 20 73 71 6c 69 74 65 33 5f  _HOOK.  sqlite3_
e680: 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64  preupdate_hook(d
e690: 62 2c 20 28 70 44 62 2d 3e 70 50 72 65 55 70 64  b, (pDb->pPreUpd
e6a0: 61 74 65 48 6f 6f 6b 3f 44 62 50 72 65 55 70 64  ateHook?DbPreUpd
e6b0: 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70  ateHandler:0), p
e6c0: 44 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  Db);.#endif.  sq
e6d0: 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
e6e0: 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64  k(db, (pDb->pUpd
e6f0: 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65  ateHook?DbUpdate
e700: 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
e710: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c  ;.  sqlite3_roll
e720: 62 61 63 6b 5f 68 6f 6f 6b 28 64 62 2c 20 28 70  back_hook(db, (p
e730: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
e740: 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  k?DbRollbackHand
e750: 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20  ler:0), pDb);.  
e760: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
e770: 28 64 62 2c 20 28 70 44 62 2d 3e 70 57 61 6c 48  (db, (pDb->pWalH
e780: 6f 6f 6b 3f 44 62 57 61 6c 48 61 6e 64 6c 65 72  ook?DbWalHandler
e790: 3a 30 29 2c 20 70 44 62 29 3b 0a 7d 0a 0a 2f 2a  :0), pDb);.}../*
e7a0: 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22  .** The "sqlite"
e7b0: 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63   command below c
e7c0: 72 65 61 74 65 73 20 61 20 6e 65 77 20 54 63 6c  reates a new Tcl
e7d0: 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63   command for eac
e7e0: 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  h.** connection 
e7f0: 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53  it opens to an S
e800: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
e810: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
e820: 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e   invoked.** when
e830: 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73  ever one of thos
e840: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65  e connection-spe
e850: 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69  cific commands i
e860: 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e  s executed.** in
e870: 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70   Tcl.  For examp
e880: 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20 54  le, if you run T
e890: 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69  cl code like thi
e8a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73  s:.**.**       s
e8b0: 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d 79 5f  qlite3 db1  "my_
e8c0: 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20 20  database".**    
e8d0: 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a     db1 close.**.
e8e0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d  ** The first com
e8f0: 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e  mand opens a con
e900: 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 22  nection to the "
e910: 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64 61 74  my_database" dat
e920: 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c  abase.** and cal
e930: 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  ls that connecti
e940: 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20 73  on "db1".  The s
e950: 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61  econd command ca
e960: 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75 62  uses this.** sub
e970: 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69 6e  routine to be in
e980: 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  voked..*/.static
e990: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
e9a0: 50 49 20 44 62 4f 62 6a 43 6d 64 28 0a 20 20 76  PI DbObjCmd(.  v
e9b0: 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49  oid *cd,.  Tcl_I
e9c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
e9d0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
e9e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
e9f0: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
ea00: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
ea10: 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63  )cd;.  int choic
ea20: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43  e;.  int rc = TC
ea30: 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63  L_OK;.  static c
ea40: 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74  onst char *DB_st
ea50: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75  rs[] = {.    "au
ea60: 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20  thorizer",      
ea70: 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20     "backup",    
ea80: 20 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a          "busy",.
ea90: 20 20 20 20 22 63 61 63 68 65 22 2c 20 20 20 20      "cache",    
eaa0: 20 20 20 20 20 20 20 20 20 20 22 63 68 61 6e 67            "chang
eab0: 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  es",           "
eac0: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c  close",.    "col
ead0: 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  late",          
eae0: 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65    "collation_nee
eaf0: 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68  ded",  "commit_h
eb00: 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c  ook",.    "compl
eb10: 65 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ete",           
eb20: 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20  "copy",         
eb30: 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61       "enable_loa
eb40: 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20  d_extension",.  
eb50: 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20    "errorcode",  
eb60: 20 20 20 20 20 20 20 20 22 65 76 61 6c 22 2c 20          "eval", 
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78               "ex
eb80: 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75 6e 63  ists",.    "func
eb90: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  tion",          
eba0: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
ebb0: 20 20 20 20 20 20 22 69 6e 74 65 72 72 75 70 74        "interrupt
ebc0: 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73  ",.    "last_ins
ebd0: 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75  ert_rowid",  "nu
ebe0: 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20  llvalue",       
ebf0: 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20    "onecolumn",. 
ec00: 20 20 20 22 70 72 65 75 70 64 61 74 65 22 2c 20     "preupdate", 
ec10: 20 20 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c           "profil
ec20: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 70  e",           "p
ec30: 72 6f 67 72 65 73 73 22 2c 0a 20 20 20 20 22 72  rogress",.    "r
ec40: 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  ekey",          
ec50: 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c 20 20      "restore",  
ec60: 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61           "rollba
ec70: 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 73  ck_hook",.    "s
ec80: 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20  tatus",         
ec90: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
eca0: 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f           "total_
ecb0: 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20 22 74  changes",.    "t
ecc0: 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20  race",          
ecd0: 20 20 20 20 22 74 72 61 63 65 5f 76 32 22 2c 20      "trace_v2", 
ece0: 20 20 20 20 20 20 20 20 20 22 74 72 61 6e 73 61           "transa
ecf0: 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 75 6e 6c  ction",.    "unl
ed00: 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 20 20 20  ock_notify",    
ed10: 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c    "update_hook",
ed20: 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22         "version"
ed30: 2c 0a 20 20 20 20 22 77 61 6c 5f 68 6f 6f 6b 22  ,.    "wal_hook"
ed40: 2c 0a 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20 65  ,.    0.  };.  e
ed50: 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20  num DB_enum {.  
ed60: 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c    DB_AUTHORIZER,
ed70: 20 20 20 20 20 20 20 20 44 42 5f 42 41 43 4b 55          DB_BACKU
ed80: 50 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  P,           DB_
ed90: 42 55 53 59 2c 0a 20 20 20 20 44 42 5f 43 41 43  BUSY,.    DB_CAC
eda0: 48 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  HE,             
edb0: 44 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20  DB_CHANGES,     
edc0: 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20       DB_CLOSE,. 
edd0: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20     DB_COLLATE,  
ede0: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c           DB_COLL
edf0: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42  ATION_NEEDED, DB
ee00: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20  _COMMIT_HOOK,.  
ee10: 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20    DB_COMPLETE,  
ee20: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 50 59 2c          DB_COPY,
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
ee40: 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
ee50: 4e 53 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52  NSION,.    DB_ER
ee60: 52 4f 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20  RORCODE,        
ee70: 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20   DB_EVAL,       
ee80: 20 20 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c        DB_EXISTS,
ee90: 0a 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e  .    DB_FUNCTION
eea0: 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e  ,          DB_IN
eeb0: 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20  CRBLOB,         
eec0: 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 0a 20 20  DB_INTERRUPT,.  
eed0: 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54    DB_LAST_INSERT
eee0: 5f 52 4f 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56  _ROWID, DB_NULLV
eef0: 41 4c 55 45 2c 20 20 20 20 20 20 20 20 44 42 5f  ALUE,        DB_
ef00: 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44  ONECOLUMN,.    D
ef10: 42 5f 50 52 45 55 50 44 41 54 45 2c 20 20 20 20  B_PREUPDATE,    
ef20: 20 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c       DB_PROFILE,
ef30: 20 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f            DB_PRO
ef40: 47 52 45 53 53 2c 0a 20 20 20 20 44 42 5f 52 45  GRESS,.    DB_RE
ef50: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  KEY,            
ef60: 20 44 42 5f 52 45 53 54 4f 52 45 2c 20 20 20 20   DB_RESTORE,    
ef70: 20 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43        DB_ROLLBAC
ef80: 4b 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 53  K_HOOK,.    DB_S
ef90: 54 41 54 55 53 2c 20 20 20 20 20 20 20 20 20 20  TATUS,          
efa0: 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20    DB_TIMEOUT,   
efb0: 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f         DB_TOTAL_
efc0: 43 48 41 4e 47 45 53 2c 0a 20 20 20 20 44 42 5f  CHANGES,.    DB_
efd0: 54 52 41 43 45 2c 20 20 20 20 20 20 20 20 20 20  TRACE,          
efe0: 20 20 20 44 42 5f 54 52 41 43 45 5f 56 32 2c 20     DB_TRACE_V2, 
eff0: 20 20 20 20 20 20 20 20 44 42 5f 54 52 41 4e 53          DB_TRANS
f000: 41 43 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 55  ACTION,.    DB_U
f010: 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20 20 20  NLOCK_NOTIFY,   
f020: 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b    DB_UPDATE_HOOK
f030: 2c 20 20 20 20 20 20 44 42 5f 56 45 52 53 49 4f  ,      DB_VERSIO
f040: 4e 2c 0a 20 20 20 20 44 42 5f 57 41 4c 5f 48 4f  N,.    DB_WAL_HO
f050: 4f 4b 2c 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f  OK,.  };.  /* do
f060: 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69  n't leave traili
f070: 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f  ng commas on DB_
f080: 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65  enum, it confuse
f090: 73 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f  s the AIX xlc co
f0a0: 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28  mpiler */..  if(
f0b0: 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54   objc<2 ){.    T
f0c0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f0d0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
f0e0: 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e   "SUBCOMMAND ...
f0f0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
f100: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f110: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
f120: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f130: 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73  objv[1], DB_strs
f140: 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26  , "option", 0, &
f150: 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72  choice) ){.    r
f160: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f170: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
f180: 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68  (enum DB_enum)ch
f190: 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20  oice ){..  /*   
f1a0: 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20   $db authorizer 
f1b0: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
f1c0: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
f1d0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74  given callback t
f1e0: 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68  o authorize each
f1f0: 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61   SQL operation a
f200: 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  s it is.  ** com
f210: 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65  piled.  5 argume
f220: 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64  nts are appended
f230: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
f240: 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20   before it is.  
f250: 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a  ** invoked:.  **
f260: 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20  .  **   (1) The 
f270: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79  authorization ty
f280: 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43  pe (ex: SQLITE_C
f290: 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c  REATE_TABLE, SQL
f2a0: 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29  ITE_INSERT, ...)
f2b0: 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73  .  **   (2) Firs
f2c0: 74 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  t descriptive na
f2d0: 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61  me (depends on a
f2e0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
f2f0: 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65  e).  **   (3) Se
f300: 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65  cond descriptive
f310: 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29   name.  **   (4)
f320: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
f330: 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e  abase (ex: "main
f340: 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20  ", "temp").  ** 
f350: 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72    (5) Name of tr
f360: 69 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f  igger that is do
f370: 69 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20  ing the access. 
f380: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
f390: 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74  lback should ret
f3a0: 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f  urn on of the fo
f3b0: 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a  llowing strings:
f3c0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a   SQLITE_OK,.  **
f3d0: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20   SQLITE_IGNORE, 
f3e0: 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20  or SQLITE_DENY. 
f3f0: 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
f400: 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72  n value is an er
f410: 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ror..  **.  ** I
f420: 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73  f this method is
f430: 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f   invoked with no
f440: 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20   arguments, the 
f450: 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a  current authoriz
f460: 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62  ation.  ** callb
f470: 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65  ack string is re
f480: 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  turned..  */.  c
f490: 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45  ase DB_AUTHORIZE
f4a0: 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  R: {.#ifdef SQLI
f4b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
f4c0: 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70  ATION.    Tcl_Ap
f4d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f4e0: 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  p, "authorizatio
f4f0: 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  n not available 
f500: 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 0a  in this build",.
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
f530: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f540: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
f550: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
f560: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
f570: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
f580: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
f590: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
f5a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f5b0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
f5c0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
f5d0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
f5e0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
f5f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
f600: 44 62 2d 3e 7a 41 75 74 68 2c 20 28 63 68 61 72  Db->zAuth, (char
f610: 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
f620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
f630: 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20  har *zAuth;.    
f640: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
f650: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
f660: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
f670: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
f680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
f690: 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74  Auth = Tcl_GetSt
f6a0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f6b0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
f6c0: 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c    if( zAuth && l
f6d0: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
f6e0: 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c  pDb->zAuth = Tcl
f6f0: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
f700: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
f710: 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41  y(pDb->zAuth, zA
f720: 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  uth, len+1);.   
f730: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f740: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30    pDb->zAuth = 0
f750: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f760: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
f770: 7b 0a 20 20 20 20 20 20 20 20 74 79 70 65 64 65  {.        typede
f780: 66 20 69 6e 74 20 28 2a 73 71 6c 69 74 65 33 5f  f int (*sqlite3_
f790: 61 75 74 68 5f 63 62 29 28 0a 20 20 20 20 20 20  auth_cb)(.      
f7a0: 20 20 20 20 20 76 6f 69 64 2a 2c 69 6e 74 2c 63       void*,int,c
f7b0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
f7c0: 20 63 68 61 72 2a 2c 0a 20 20 20 20 20 20 20 20   char*,.        
f7d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63     const char*,c
f7e0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
f7f0: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
f800: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
f810: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
f820: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
f830: 62 2c 28 73 71 6c 69 74 65 33 5f 61 75 74 68 5f  b,(sqlite3_auth_
f840: 63 62 29 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  cb)auth_callback
f850: 2c 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ,pDb);.      }el
f860: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
f870: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
f880: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
f890: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f8a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
f8b0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
f8c0: 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41  $db backup ?DATA
f8d0: 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
f8e0: 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72   **.  ** Open or
f8f0: 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
f900: 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49  se file named FI
f910: 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65  LENAME.  Transfe
f920: 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65  r the.  ** conte
f930: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  nt of local data
f940: 62 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64  base DATABASE (d
f950: 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20  efault: "main") 
f960: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49  into the.  ** FI
f970: 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e  LENAME database.
f980: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
f990: 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f  BACKUP: {.    co
f9a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
f9b0: 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
f9c0: 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20  har *zSrcDb;.   
f9d0: 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b   sqlite3 *pDest;
f9e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
f9f0: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20  kup *pBackup;.. 
fa00: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
fa10: 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d  {.      zSrcDb =
fa20: 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
fa30: 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47  DestFile = Tcl_G
fa40: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
fa50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
fa60: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
fa70: 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47    zSrcDb = Tcl_G
fa80: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
fa90: 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69  );.      zDestFi
faa0: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
fab0: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
fac0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
fad0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fae0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
faf0: 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45  "?DATABASE? FILE
fb00: 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65  NAME");.      re
fb10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fb20: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
fb30: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
fb40: 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74  DestFile, &pDest
fb50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fb60: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fb70: 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
fb80: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 20 70 44 62  OPEN_CREATE| pDb
fb90: 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  ->openFlags, 0);
fba0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fbb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fbc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fbd0: 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
fbe0: 20 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61 74   open target dat
fbf0: 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20  abase: ",.      
fc00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
fc10: 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61  msg(pDest), (cha
fc20: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
fc30: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
fc40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fc50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
fc60: 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
fc70: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
fc80: 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22  it(pDest, "main"
fc90: 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44  , pDb->db, zSrcD
fca0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  b);.    if( pBac
fcb0: 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
fcc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fcd0: 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70  (interp, "backup
fce0: 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
fcf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
fd00: 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63  rrmsg(pDest), (c
fd10: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73  har*)0);.      s
fd20: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
fd30: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
fd40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
fd50: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28   }.    while(  (
fd60: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
fd70: 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
fd80: 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
fd90: 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  K ){}.    sqlite
fda0: 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
fdb0: 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
fdc0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
fdd0: 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
fde0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  TCL_OK;.    }els
fdf0: 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
fe00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
fe10: 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64  , "backup failed
fe20: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
fe30: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
fe40: 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29  Dest), (char*)0)
fe50: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
fe60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
fe70: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
fe80: 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61  pDest);.    brea
fe90: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
fea0: 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41  $db busy ?CALLBA
feb0: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
fec0: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
fed0: 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51  allback if an SQ
fee0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65  L statement atte
fef0: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  mpts to open.  *
ff00: 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62  * a locked datab
ff10: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
ff20: 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b   case DB_BUSY: {
ff30: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
ff40: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
ff50: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ff60: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c  , 2, objv, "CALL
ff70: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
ff80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ff90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
ffa0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
ffb0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
ffc0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
ffd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ffe0: 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 28 63  , pDb->zBusy, (c
fff0: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d  har*)0);.      }
10000 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10010 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20    char *zBusy;. 
10020 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
10030 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
10040 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  sy ){.        Tc
10050 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
10060 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
10070 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65    zBusy = Tcl_Ge
10080 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10090 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
100a0 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26       if( zBusy &
100b0 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
100c0 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20     pDb->zBusy = 
100d0 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
100e0 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
100f0 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c  mcpy(pDb->zBusy,
10100 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a   zBusy, len+1);.
10110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10120 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
10130 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
10140 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
10150 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  y ){.        pDb
10160 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
10170 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
10180 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
10190 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48  pDb->db, DbBusyH
101a0 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
101b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
101c0 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
101d0 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
101e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
101f0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
10200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24  .  }..  /*     $
10210 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20  db cache flush. 
10220 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68   **     $db cach
10230 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20  e size n.  **.  
10240 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65  ** Flush the pre
10250 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
10260 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68  cache, or set th
10270 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
10280 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20   of.  ** cached 
10290 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
102a0 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45  .  case DB_CACHE
102b0 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75  : {.    char *su
102c0 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  bCmd;.    int n;
102d0 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d  ..    if( objc<=
102e0 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
102f0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10300 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61  rp, 1, objv, "ca
10310 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f  che option ?arg?
10320 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10330 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10340 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54  }.    subCmd = T
10350 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10360 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20  Obj( objv[2], 0 
10370 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43  );.    if( *subC
10380 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d  md=='f' && strcm
10390 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22  p(subCmd,"flush"
103a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
103b0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
103c0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
103d0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
103e0 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b   objv, "flush");
103f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10400 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
10410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10420 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
10430 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pDb );.      }. 
10440 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75     }else if( *su
10450 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72  bCmd=='s' && str
10460 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65  cmp(subCmd,"size
10470 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
10480 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
10490 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
104a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
104b0 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22  , objv, "size n"
104c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
104d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
104e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
104f0 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d    if( TCL_ERROR=
10500 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
10510 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
10520 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  3], &n) ){.     
10530 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
10540 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
10550 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c  cannot convert \
10560 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
10570 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
10580 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
10590 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67  0), "\" to integ
105a0 65 72 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  er", (char*)0);.
105b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
105c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
105d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
105e0 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a       if( n<0 ){.
105f0 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75 73              flus
10600 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
10610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
10620 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10630 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f  }else if( n>MAX_
10640 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29  PREPARED_STMTS )
10650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  {.            n 
10660 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  = MAX_PREPARED_S
10670 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20  TMTS;.          
10680 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
10690 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20  >maxStmt = n;.  
106a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
106b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
106c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
106d0 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20  t( interp, "bad 
106e0 6f 70 74 69 6f 6e 20 5c 22 22 2c 0a 20 20 20 20  option \"",.    
106f0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
10700 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10710 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74  2],0), "\": must
10720 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a   be flush or siz
10730 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63  e",.          (c
10740 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
10750 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10760 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
10770 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
10780 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  $db changes.  **
10790 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
107a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
107b0 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
107c0 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
107d0 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a   deleted by.  **
107e0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
107f0 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
10800 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
10810 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  ent, not includi
10820 6e 67 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e  ng.  ** any chan
10830 67 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67  ges made by trig
10840 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20  ger programs..  
10850 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41  */.  case DB_CHA
10860 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
10870 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
10880 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
10890 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
108a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
108b0 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
108c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
108d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
108e0 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
108f0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10900 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
10910 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73  ntObj(pResult, s
10920 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70  qlite3_changes(p
10930 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
10940 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
10950 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a    $db close.  **
10960 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  .  ** Shutdown t
10970 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f  he database.  */
10980 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45  .  case DB_CLOSE
10990 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65  : {.    Tcl_Dele
109a0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
109b0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
109c0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
109d0 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  0));.    break;.
109e0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
109f0 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e     $db collate N
10a00 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  AME SCRIPT.  **.
10a10 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
10a20 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
10a30 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
10a40 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
10a50 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
10a60 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
10a70 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
10a80 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
10a90 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
10aa0 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a  e DB_COLLATE: {.
10ab0 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a      SqlCollate *
10ac0 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68  pCollate;.    ch
10ad0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
10ae0 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20  har *zScript;.  
10af0 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20    int nScript;. 
10b00 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
10b10 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
10b20 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10b30 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
10b40 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
10b50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
10b70 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10b80 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
10b90 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70  , 0);.    zScrip
10ba0 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
10bb0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
10bc0 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20  , &nScript);.   
10bd0 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c   pCollate = (Sql
10be0 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c  Collate*)Tcl_All
10bf0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  oc( sizeof(*pCol
10c00 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20  late) + nScript 
10c10 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
10c20 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74  Collate==0 ) ret
10c30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10c40 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74     pCollate->int
10c50 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
10c60 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78    pCollate->pNex
10c70 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  t = pDb->pCollat
10c80 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  e;.    pCollate-
10c90 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72  >zScript = (char
10ca0 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a  *)&pCollate[1];.
10cb0 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
10cc0 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  e = pCollate;.  
10cd0 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74    memcpy(pCollat
10ce0 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72  e->zScript, zScr
10cf0 69 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b  ipt, nScript+1);
10d00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10d10 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
10d20 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
10d30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
10d40 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
10d50 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
10d60 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
10d70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
10d80 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
10d90 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
10da0 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
10db0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10dc0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10dd0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
10de0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
10df0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
10e00 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
10e10 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
10e20 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
10e30 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
10e40 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
10e50 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
10e60 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
10e70 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
10e80 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
10e90 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
10ea0 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
10eb0 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
10ec0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
10ed0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10ee0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10ef0 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
10f00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10f10 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
10f20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
10f30 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
10f40 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
10f50 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
10f60 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
10f70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
10f80 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
10f90 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
10fa0 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
10fb0 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
10fc0 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
10fd0 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
10fe0 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
10ff0 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
11000 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
11010 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
11020 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
11030 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
11040 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
11050 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
11060 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
11070 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
11080 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
11090 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
110a0 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
110b0 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
110c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
110d0 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
110e0 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
110f0 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
11100 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
11110 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
11120 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
11130 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
11140 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
11150 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
11160 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
11170 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11180 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
11190 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
111a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
111b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
111c0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
111d0 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
111e0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
111f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11200 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
11210 74 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  t, (char*)0);.  
11220 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
11230 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
11240 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  r *zCommit;.    
11250 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
11260 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
11270 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
11280 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d  _Free(pDb->zComm
11290 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
112a0 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c     zCommit = Tcl
112b0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
112c0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
112d0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d  ;.      if( zCom
112e0 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  mit && len>0 ){.
112f0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
11300 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  mmit = Tcl_Alloc
11310 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
11320 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
11330 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69  >zCommit, zCommi
11340 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  t, len+1);.     
11350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11360 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
11370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11380 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
11390 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
113a0 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
113b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
113c0 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
113d0 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
113e0 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
113f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11400 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
11410 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
11420 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
11430 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
11440 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
11450 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
11460 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
11470 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
11480 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
11490 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
114a0 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
114b0 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
114c0 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
114d0 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
114e0 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
114f0 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
11500 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
11510 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
11520 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
11530 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
11540 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
11550 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
11560 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
11570 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
11580 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
11590 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
115a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
115b0 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
115c0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
115d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
115e0 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
115f0 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
11600 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
11610 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
11620 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
11630 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
11640 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
11650 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
11660 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
11670 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
11680 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
11690 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
116a0 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
116b0 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
116c0 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
116d0 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
116e0 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
116f0 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
11700 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
11710 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
11720 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
11730 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
11740 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
11750 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
11760 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
11770 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
11780 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
11790 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
117a0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
117b0 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
117c0 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
117d0 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
117e0 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
117f0 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
11800 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
11810 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
11820 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
11830 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
11840 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
11850 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
11860 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
11870 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
11880 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
11890 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
118a0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
118b0 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
118c0 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
118d0 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
118e0 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
118f0 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
11900 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
11910 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
11920 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
11930 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
11940 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
11950 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
11960 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
11970 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
11980 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
11990 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
119a0 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
119b0 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
119c0 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
119d0 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
119e0 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
119f0 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
11a00 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
11a10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11a20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
11a30 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
11a40 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
11a50 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
11a60 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
11a70 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
11a80 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
11a90 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
11aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11ab0 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
11ac0 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
11ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
11ae0 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
11af0 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
11b00 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11b30 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
11b40 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
11b50 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
11b60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11b70 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
11b80 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
11b90 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11bb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
11bc0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11bf0 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20  bytes in zSep[] 
11c00 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c  */.    int nNull
11c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11c20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11c30 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d  bytes in zNull[]
11c40 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
11c50 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
11c60 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
11c70 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63  atement */.    c
11c80 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20  har *zLine;     
11c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11ca0 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69  single line of i
11cb0 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
11cc0 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
11cd0 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
11ce0 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d        /* zLine[]
11cf0 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20   broken up into 
11d00 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63  columns */.    c
11d10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
11d20 69 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  it;        /* Ho
11d30 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e  w to commit chan
11d40 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  ges */.    FILE 
11d50 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
11d60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
11d70 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
11d80 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20  int lineno = 0; 
11d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11da0 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  ine number of in
11db0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
11dc0 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30  char zLineNum[80
11dd0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ];          /* L
11de0 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74  ine number print
11df0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54   buffer */.    T
11e00 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
11e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
11e20 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  terp result */..
11e30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11e40 7a 53 65 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20  zSep;.    const 
11e50 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20  char *zNull;.   
11e60 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f   if( objc<5 || o
11e70 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54  bjc>7 ){.      T
11e80 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11e90 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
11ea0 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c  .         "CONFL
11eb0 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41  ICT-ALGORITHM TA
11ec0 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45  BLE FILENAME ?SE
11ed0 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
11ee0 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20  DICATOR?");.    
11ef0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11f00 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
11f10 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20  ( objc>=6 ){.   
11f20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65     zSep = Tcl_Ge
11f30 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11f40 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[5], 0);.    
11f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65  }else{.      zSe
11f60 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a  p = "\t";.    }.
11f70 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20      if( objc>=7 
11f80 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  ){.      zNull =
11f90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11fa0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30  omObj(objv[6], 0
11fb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11fc0 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a      zNull = "";.
11fd0 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c      }.    zConfl
11fe0 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ict = Tcl_GetStr
11ff0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12000 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62  2], 0);.    zTab
12010 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
12020 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
12030 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ], 0);.    zFile
12040 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12050 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c  FromObj(objv[4],
12060 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20   0);.    nSep = 
12070 73 74 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a  strlen30(zSep);.
12080 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c      nNull = strl
12090 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20  en30(zNull);.   
120a0 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
120b0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
120c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
120d0 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73  rror: non-null s
120e0 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
120f0 64 20 66 6f 72 20 63 6f 70 79 22 2c 0a 20 20 20  d for copy",.   
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
12120 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12130 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
12140 20 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66   if(strcmp(zConf
12150 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22  lict, "rollback"
12160 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
12170 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
12180 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21  t, "abort"   ) !
12190 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
121a0 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
121b0 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30  "fail"    ) != 0
121c0 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d   &&.       strcm
121d0 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67  p(zConflict, "ig
121e0 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26  nore"  ) != 0 &&
121f0 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
12200 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61  Conflict, "repla
12210 63 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20  ce" ) != 0 ) {. 
12220 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
12230 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
12240 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66  rror: \"", zConf
12250 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  lict,.          
12260 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d    "\", conflict-
12270 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62  algorithm must b
12280 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61  e one of: rollba
12290 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ck, ".          
122a0 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20    "abort, fail, 
122b0 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61  ignore, or repla
122c0 63 65 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ce", (char*)0);.
122d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
122e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
122f0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
12300 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
12310 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
12320 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
12330 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
12340 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12350 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
12360 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
12370 20 22 2c 20 7a 54 61 62 6c 65 2c 20 28 63 68 61   ", zTable, (cha
12380 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
12390 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
123a0 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
123b0 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
123c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
123d0 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
123e0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
123f0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
12400 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
12410 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
12420 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
12430 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
12440 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
12450 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
12460 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
12470 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
12480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
12490 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
124a0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
124b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
124c0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
124d0 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
124e0 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
124f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12500 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
12510 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
12520 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
12530 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
12540 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
12550 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12560 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
12570 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28 63 68  t malloc()", (ch
12580 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
12590 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
125a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
125b0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
125c0 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
125d0 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
125e0 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
125f0 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
12600 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
12610 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
12620 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
12630 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
12640 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
12650 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ',';.      zSql[
12660 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
12670 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20  }.    zSql[j++] 
12680 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b  = ')';.    zSql[
12690 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  j] = 0;.    rc =
126a0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
126b0 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
126c0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
126d0 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
126e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
126f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12700 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
12710 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
12720 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
12730 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
12740 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
12750 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
12760 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12770 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20  R;.    }.    in 
12780 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
12790 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
127a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
127b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
127c0 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
127d0 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
127e0 22 2c 20 7a 46 69 6c 65 2c 20 28 63 68 61 72 2a  ", zFile, (char*
127f0 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
12800 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
12810 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
12820 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12830 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
12840 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
12850 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
12860 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
12870 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
12880 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12890 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
128a0 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
128b0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
128c0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
128d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
128e0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  ROR;.    }.    (
128f0 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
12900 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49  c(pDb->db, "BEGI
12910 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
12920 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d    zCommit = "COM
12930 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28  MIT";.    while(
12940 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f   (zLine = local_
12950 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21  getline(0, in))!
12960 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
12970 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e   *z;.      linen
12980 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c  o++;.      azCol
12990 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20  [0] = zLine;.   
129a0 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c     for(i=0, z=zL
129b0 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ine; *z; z++){. 
129c0 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a         if( *z==z
129d0 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d  Sep[0] && strncm
129e0 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29  p(z, zSep, nSep)
129f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12a00 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   *z = 0;.       
12a10 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
12a20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a    if( i<nCol ){.
12a30 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f              azCo
12a40 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b  l[i] = &z[nSep];
12a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
12a60 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20  = nSep-1;.      
12a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12a90 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20  ( i+1!=nCol ){. 
12aa0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
12ab0 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  r;.        int n
12ac0 45 72 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Err = strlen30(z
12ad0 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20  File) + 200;.   
12ae0 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c       zErr = mall
12af0 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20  oc(nErr);.      
12b00 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
12b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12b20 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a  snprintf(nErr, z
12b30 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Err,.           
12b40 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e    "Error: %s lin
12b50 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
12b60 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
12b70 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
12b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  .             zF
12b90 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f  ile, lineno, nCo
12ba0 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
12bb0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12bc0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
12bd0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
12be0 20 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72         free(zErr
12bf0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12c00 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
12c10 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
12c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12c30 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
12c40 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
12c50 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20         /* check 
12c60 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69  for null data, i
12c70 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75  f so, bind as nu
12c80 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ll */.        if
12c90 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74  ( (nNull>0 && st
12ca0 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a  rcmp(azCol[i], z
12cb0 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20  Null)==0).      
12cc0 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28      || strlen30(
12cd0 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 0a 20 20 20  azCol[i])==0.   
12ce0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12cf0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
12d00 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b  ull(pStmt, i+1);
12d10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12d20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12d30 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
12d40 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d  t, i+1, azCol[i]
12d50 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
12d60 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
12d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12d80 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
12d90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12da0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
12db0 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
12dc0 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
12dd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12de0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
12df0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12e00 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  p,"Error: ", sql
12e10 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
12e20 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
12e30 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
12e40 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
12e50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12e60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12e70 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20  free(azCol);.   
12e80 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
12e90 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
12ea0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76  e(pStmt);.    (v
12eb0 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
12ec0 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69  (pDb->db, zCommi
12ed0 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  t, 0, 0, 0);..  
12ee0 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d    if( zCommit[0]
12ef0 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20   == 'C' ){.     
12f00 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74   /* success, set
12f10 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65   result as numbe
12f20 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
12f30 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52  ssed */.      pR
12f40 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
12f50 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
12f60 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49  ;.      Tcl_SetI
12f70 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c  ntObj(pResult, l
12f80 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  ineno);.      rc
12f90 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
12fa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66  else{.      /* f
12fb0 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c  ailure, append l
12fc0 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c  ineno where fail
12fd0 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
12fe0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
12ff0 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a  eof(zLineNum), z
13000 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e  LineNum,"%d",lin
13010 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  eno);.      Tcl_
13020 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13030 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68  erp,", failed wh
13040 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  ile processing l
13050 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c  ine: ",zLineNum,
13060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13070 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
13080 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
13090 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
130a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
130b0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
130c0 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
130d0 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20  nsion BOOLEAN.  
130e0 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65  **.  ** Turn the
130f0 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69   extension loadi
13100 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72  ng feature on or
13110 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66   off.  It if off
13120 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74   by.  ** default
13130 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13140 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
13150 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65  ENSION: {.#ifnde
13160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
13170 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
13180 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20   int onoff;.    
13190 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
131a0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
131b0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
131c0 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22   objv, "BOOLEAN"
131d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
131e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
131f0 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
13200 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
13210 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
13220 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20  &onoff) ){.     
13230 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13240 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
13250 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
13260 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e  _extension(pDb->
13270 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  db, onoff);.    
13280 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20  break;.#else.   
13290 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
132a0 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e  t(interp, "exten
132b0 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20  sion loading is 
132c0 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f  turned off at co
132d0 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20  mpile-time",.   
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
13300 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13310 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  R;.#endif.  }.. 
13320 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
13330 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20  errorcode.  **. 
13340 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
13350 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64  umeric error cod
13360 65 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72  e that was retur
13370 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20  ned by the most 
13380 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c  recent.  ** call
13390 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
133a0 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ()..  */.  case 
133b0 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a  DB_ERRORCODE: {.
133c0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
133d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
133e0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
133f0 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e  e3_errcode(pDb->
13400 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  db)));.    break
13410 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
13420 20 20 20 20 24 64 62 20 65 78 69 73 74 73 20 24      $db exists $
13430 73 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  sql.  **    $db 
13440 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20  onecolumn $sql. 
13450 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65   **.  ** The one
13460 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73  column method is
13470 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
13480 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e  of:.  **     lin
13490 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73  dex [$db eval $s
134a0 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73  ql] 0.  */.  cas
134b0 65 20 44 42 5f 45 58 49 53 54 53 3a 0a 20 20 63  e DB_EXISTS:.  c
134c0 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
134d0 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
134e0 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *pResult = 0;.  
134f0 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
13500 73 45 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f  sEval;.    if( o
13510 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
13520 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
13530 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
13540 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
13550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13560 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45  ;.    }..    dbE
13570 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20  valInit(&sEval, 
13580 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 2c  pDb, objv[2], 0,
13590 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62   0);.    rc = db
135a0 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
135b0 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
135c0 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
135d0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
135e0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
135f0 20 20 70 52 65 73 75 6c 74 20 3d 20 64 62 45 76    pResult = dbEv
13600 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73  alColumnValue(&s
13610 45 76 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Eval, 0);.      
13620 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
13630 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
13640 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
13650 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
13660 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
13670 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
13680 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  || rc==TCL_OK ){
13690 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
136a0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
136b0 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 3b 0a  bj(rc==TCL_OK);.
136c0 20 20 20 20 7d 0a 20 20 20 20 64 62 45 76 61 6c      }.    dbEval
136d0 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29  Finalize(&sEval)
136e0 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 75 6c  ;.    if( pResul
136f0 74 20 29 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  t ) Tcl_SetObjRe
13700 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
13710 73 75 6c 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  sult);..    if( 
13720 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
13730 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
13740 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OK;.    }.    br
13750 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
13760 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20   **    $db eval 
13770 3f 6f 70 74 69 6f 6e 73 3f 20 24 73 71 6c 20 3f  ?options? $sql ?
13780 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f  array? ?{  ...co
13790 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20  de... }?.  **.  
137a0 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65  ** The SQL state
137b0 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20  ment in $sql is 
137c0 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20  evaluated.  For 
137d0 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61  each row, the va
137e0 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c  lues are.  ** pl
137f0 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73  aced in elements
13800 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61   of the array na
13810 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20  med "array" and 
13820 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78  ...code... is ex
13830 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20  ecuted..  ** If 
13840 22 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64  "array" and "cod
13850 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20  e" are omitted, 
13860 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b  then no callback
13870 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65   is every invoke
13880 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
13890 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  y" is an empty s
138a0 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  tring, then the 
138b0 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65  values are place
138c0 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20  d in variables. 
138d0 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68   ** that have th
138e0 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
138f0 68 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63  he fields extrac
13900 74 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ted by the query
13910 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13920 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69 6e 74  _EVAL: {.    int
13930 20 65 76 61 6c 46 6c 61 67 73 20 3d 20 30 3b 0a   evalFlags = 0;.
13940 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13950 7a 4f 70 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  zOpt;.    while(
13960 20 6f 62 6a 63 3e 33 20 26 26 20 28 7a 4f 70 74   objc>3 && (zOpt
13970 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
13980 28 6f 62 6a 76 5b 32 5d 29 29 21 3d 30 20 26 26  (objv[2]))!=0 &&
13990 20 7a 4f 70 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b   zOpt[0]=='-' ){
139a0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
139b0 70 28 7a 4f 70 74 2c 20 22 2d 77 69 74 68 6f 75  p(zOpt, "-withou
139c0 74 6e 75 6c 6c 73 22 29 3d 3d 30 20 29 7b 0a 20  tnulls")==0 ){. 
139d0 20 20 20 20 20 20 20 65 76 61 6c 46 6c 61 67 73         evalFlags
139e0 20 7c 3d 20 53 51 4c 49 54 45 5f 45 56 41 4c 5f   |= SQLITE_EVAL_
139f0 57 49 54 48 4f 55 54 4e 55 4c 4c 53 3b 0a 20 20  WITHOUTNULLS;.  
13a00 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
13a10 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
13a20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13a30 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  p, "unknown opti
13a40 6f 6e 3a 20 5c 22 22 2c 20 7a 4f 70 74 2c 20 22  on: \"", zOpt, "
13a50 5c 22 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a  \"", (void*)0);.
13a60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
13a70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13a80 7d 0a 20 20 20 20 20 20 6f 62 6a 63 2d 2d 3b 0a  }.      objc--;.
13a90 20 20 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20        objv++;.  
13aa0 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
13ab0 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a  <3 || objc>5 ){.
13ac0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13ad0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13ae0 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
13af0 20 20 20 22 3f 4f 50 54 49 4f 4e 53 3f 20 53 51     "?OPTIONS? SQ
13b00 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f  L ?ARRAY-NAME? ?
13b10 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
13b20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13b30 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
13b40 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
13b50 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74     DbEvalContext
13b60 20 73 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63   sEval;.      Tc
13b70 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63  l_Obj *pRet = Tc
13b80 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
13b90 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
13ba0 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
13bb0 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61  dbEvalInit(&sEva
13bc0 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  l, pDb, objv[2],
13bd0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 77 68   0, 0);.      wh
13be0 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63  ile( TCL_OK==(rc
13bf0 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26 73   = dbEvalStep(&s
13c00 45 76 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20  Eval)) ){.      
13c10 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
13c20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
13c30 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f     dbEvalRowInfo
13c40 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20  (&sEval, &nCol, 
13c50 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  0);.        for(
13c60 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
13c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
13c80 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13c90 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
13ca0 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  et, dbEvalColumn
13cb0 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 69 29  Value(&sEval, i)
13cc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13cd0 20 20 20 7d 0a 20 20 20 20 20 20 64 62 45 76 61     }.      dbEva
13ce0 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c  lFinalize(&sEval
13cf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
13d00 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
13d10 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
13d20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
13d30 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Ret);.        rc
13d40 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20   = TCL_OK;.     
13d50 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63   }.      Tcl_Dec
13d60 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
13d70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13d80 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 32    ClientData cd2
13d90 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62 45 76 61  [2];.      DbEva
13da0 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20  lContext *p;.   
13db0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72     Tcl_Obj *pArr
13dc0 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 63  ay = 0;.      Tc
13dd0 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
13de0 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  .      if( objc>
13df0 3d 35 20 26 26 20 2a 28 63 68 61 72 20 2a 29 54  =5 && *(char *)T
13e00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13e10 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  v[3]) ){.       
13e20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33   pArray = objv[3
13e30 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
13e40 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
13e50 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54  objc-1];.      T
13e60 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
13e70 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 20 20 20  pScript);..     
13e80 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74   p = (DbEvalCont
13e90 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  ext *)Tcl_Alloc(
13ea0 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e  sizeof(DbEvalCon
13eb0 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62  text));.      db
13ec0 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c  EvalInit(p, pDb,
13ed0 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79   objv[2], pArray
13ee0 2c 20 65 76 61 6c 46 6c 61 67 73 29 3b 0a 0a 20  , evalFlags);.. 
13ef0 20 20 20 20 20 63 64 32 5b 30 5d 20 3d 20 28 76       cd2[0] = (v
13f00 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20 20 63  oid *)p;.      c
13f10 64 32 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a 29  d2[1] = (void *)
13f20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20 72  pScript;.      r
13f30 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  c = DbEvalNextCm
13f40 64 28 63 64 32 2c 20 69 6e 74 65 72 70 2c 20 54  d(cd2, interp, T
13f50 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  CL_OK);.    }.  
13f60 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
13f70 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
13f80 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d  function NAME [-
13f90 61 72 67 63 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65  argcount N] [-de
13fa0 74 65 72 6d 69 6e 69 73 74 69 63 5d 20 53 43 52  terministic] SCR
13fb0 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
13fc0 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66  eate a new SQL f
13fd0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
13fe0 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74  AME.  Whenever t
13ff0 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  hat function is.
14000 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76    ** called, inv
14010 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
14020 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
14030 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
14040 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   DB_FUNCTION: {.
14050 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
14060 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
14070 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b   SqlFunc *pFunc;
14080 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
14090 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20  cript;.    char 
140a0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  *zName;.    int 
140b0 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69  nArg = -1;.    i
140c0 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6f 62  nt i;.    if( ob
140d0 6a 63 3c 34 20 29 7b 0a 20 20 20 20 20 20 54 63  jc<4 ){.      Tc
140e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
140f0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
14100 22 4e 41 4d 45 20 3f 53 57 49 54 43 48 45 53 3f  "NAME ?SWITCHES?
14110 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
14120 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14130 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  R;.    }.    for
14140 28 69 3d 33 3b 20 69 3c 28 6f 62 6a 63 2d 31 29  (i=3; i<(objc-1)
14150 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
14160 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63  nst char *z = Tc
14170 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14180 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  [i]);.      int 
14190 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
141a0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26  .      if( n>2 &
141b0 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61  & strncmp(z, "-a
141c0 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29  rgcount",n)==0 )
141d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
141e0 3d 28 6f 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20  =(objc-2) ){.   
141f0 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
14200 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14210 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
14220 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c   an argument: ",
14230 20 7a 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20   z,(char*)0);.  
14240 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
14250 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
14260 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
14270 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
14280 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
14290 2b 31 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65  +1], &nArg) ) re
142a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
142b0 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
142c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
142d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
142e0 28 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72  (interp, "number
142f0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75   of arguments mu
14300 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  st be non-negati
14310 76 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ve",.           
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
14340 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14350 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
14360 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
14370 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
14380 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63  if( n>2 && strnc
14390 6d 70 28 7a 2c 20 22 2d 64 65 74 65 72 6d 69 6e  mp(z, "-determin
143a0 69 73 74 69 63 22 2c 6e 29 3d 3d 30 20 29 7b 0a  istic",n)==0 ){.
143b0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
143c0 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
143d0 49 53 54 49 43 3b 0a 20 20 20 20 20 20 7d 65 6c  ISTIC;.      }el
143e0 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  se{.        Tcl_
143f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14400 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e  erp, "bad option
14410 20 5c 22 22 2c 20 7a 2c 0a 20 20 20 20 20 20 20   \"", z,.       
14420 20 20 20 20 20 22 5c 22 3a 20 6d 75 73 74 20 62       "\": must b
14430 65 20 2d 61 72 67 63 6f 75 6e 74 20 6f 72 20 2d  e -argcount or -
14440 64 65 74 65 72 6d 69 6e 69 73 74 69 63 22 2c 20  deterministic", 
14450 28 63 68 61 72 2a 29 30 0a 20 20 20 20 20 20 20  (char*)0.       
14460 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
14470 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14480 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
14490 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
144a0 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 7a 4e 61  objc-1];.    zNa
144b0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
144c0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
144d0 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63  ], 0);.    pFunc
144e0 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70   = findSqlFunc(p
144f0 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db, zName);.    
14500 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
14510 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14520 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
14530 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
14540 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
14550 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
14560 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75  );.    }.    pFu
14570 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53  nc->pScript = pS
14580 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
14590 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
145a0 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d  ipt);.    pFunc-
145b0 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73  >useEvalObjv = s
145c0 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76  afeToUseEvalObjv
145d0 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
145e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
145f0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
14600 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
14610 6d 65 2c 20 6e 41 72 67 2c 20 66 6c 61 67 73 2c  me, nArg, flags,
14620 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20  .        pFunc, 
14630 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  tclSqlFunc, 0, 0
14640 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14660 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
14670 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  ;.      Tcl_SetR
14680 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
14690 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
146a0 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
146b0 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
146c0 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
146d0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
146e0 20 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f    $db incrblob ?
146f0 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20  -readonly? ?DB? 
14700 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57  TABLE COLUMN ROW
14710 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  ID.  */.  case D
14720 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69  B_INCRBLOB: {.#i
14730 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
14740 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63  _INCRBLOB.    Tc
14750 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
14760 6e 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62  nterp, "incrblob
14770 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
14780 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 28  n this build", (
14790 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
147a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
147b0 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73  #else.    int is
147c0 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20  Readonly = 0;.  
147d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
147e0 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
147f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
14800 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
14810 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar *zColumn;.   
14820 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f   Tcl_WideInt iRo
14830 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  w;..    /* Check
14840 20 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e   for the -readon
14850 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ly option */.   
14860 20 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73   if( objc>3 && s
14870 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
14880 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d  ing(objv[2]), "-
14890 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  readonly")==0 ){
148a0 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
148b0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 1;.    }..  
148c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69    if( objc!=(5+i
148d0 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62  sReadonly) && ob
148e0 6a 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(6+isReadonl
148f0 79 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  y) ){.      Tcl_
14900 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14910 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
14920 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20  -readonly? ?DB? 
14930 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57  TABLE COLUMN ROW
14940 49 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ID");.      retu
14950 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14960 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
14970 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c==(6+isReadonly
14980 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d  ) ){.      zDb =
14990 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
149a0 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20  bjv[2]);.    }. 
149b0 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
149c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f  GetString(objv[o
149d0 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f  bjc-3]);.    zCo
149e0 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74  lumn = Tcl_GetSt
149f0 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32  ring(objv[objc-2
14a00 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c  ]);.    rc = Tcl
14a10 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
14a20 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14a30 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b  objc-1], &iRow);
14a40 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43  ..    if( rc==TC
14a50 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  L_OK ){.      rc
14a60 20 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f   = createIncrblo
14a70 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20  bChannel(.      
14a80 20 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c      interp, pDb,
14a90 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
14aa0 6f 6c 75 6d 6e 2c 20 28 73 71 6c 69 74 65 33 5f  olumn, (sqlite3_
14ab0 69 6e 74 36 34 29 69 52 6f 77 2c 20 69 73 52 65  int64)iRow, isRe
14ac0 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a  adonly.      );.
14ad0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14ae0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
14af0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69  *.  **     $db i
14b00 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20  nterrupt.  **.  
14b10 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65  ** Interrupt the
14b20 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
14b30 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c  e inner-most SQL
14b40 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54   interpreter.  T
14b50 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20  his.  ** causes 
14b60 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
14b70 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
14b80 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49  rror of SQLITE_I
14b90 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20  NTERRUPT..  */. 
14ba0 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55   case DB_INTERRU
14bb0 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  PT: {.    sqlite
14bc0 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d  3_interrupt(pDb-
14bd0 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  >db);.    break;
14be0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
14bf0 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75      $db nullvalu
14c00 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a  e ?STRING?.  **.
14c10 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74    ** Change text
14c20 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c   used when a NUL
14c30 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f  L comes back fro
14c40 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
14c50 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a  If ?STRING?.  **
14c60 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
14c70 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
14c80 74 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f  t string used fo
14c90 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  r NULL is return
14ca0 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49  ed..  ** If STRI
14cb0 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  NG is present, t
14cc0 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65  hen STRING is re
14cd0 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  turned..  **.  *
14ce0 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c  /.  case DB_NULL
14cf0 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28  VALUE: {.    if(
14d00 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
14d10 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
14d20 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14d30 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14d40 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20  NULLVALUE");.   
14d50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14d60 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
14d70 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
14d80 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
14d90 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d     char *zNull =
14da0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
14db0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
14dc0 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
14dd0 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20  pDb->zNull ){.  
14de0 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
14df0 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20  Db->zNull);.    
14e00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e    }.      if( zN
14e10 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ull && len>0 ){.
14e20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
14e30 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ll = Tcl_Alloc( 
14e40 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
14e50 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
14e60 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e  Null, zNull, len
14e70 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
14e80 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30  zNull[len] = '\0
14e90 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ';.      }else{.
14ea0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
14eb0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
14ec0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
14ed0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
14ee0 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
14ef0 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20  Obj(pDb->zNull, 
14f00 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  -1));.    break;
14f10 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
14f20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73      $db last_ins
14f30 65 72 74 5f 72 6f 77 69 64 0a 20 20 2a 2a 0a 20  ert_rowid.  **. 
14f40 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e   ** Return an in
14f50 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
14f60 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65  he ROWID for the
14f70 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
14f80 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ert..  */.  case
14f90 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f   DB_LAST_INSERT_
14fa0 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c  ROWID: {.    Tcl
14fb0 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
14fc0 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72     Tcl_WideInt r
14fd0 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62  owid;.    if( ob
14fe0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
14ff0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
15000 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
15010 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
15020 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15030 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20    }.    rowid = 
15040 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
15050 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64  ert_rowid(pDb->d
15060 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20  b);.    pResult 
15070 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
15080 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
15090 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62  Tcl_SetWideIntOb
150a0 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64  j(pResult, rowid
150b0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
150c0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  }..  /*.  ** The
150d0 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65   DB_ONECOLUMN me
150e0 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e  thod is implemen
150f0 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74  ted together wit
15100 68 20 44 42 5f 45 58 49 53 54 53 2e 0a 20 20 2a  h DB_EXISTS..  *
15110 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70  /..  /*    $db p
15120 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42  rogress ?N CALLB
15130 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
15140 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
15150 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e  callback every N
15160 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
15170 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65   opcodes while e
15180 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75  xecuting.  ** qu
15190 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  eries..  */.  ca
151a0 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20  se DB_PROGRESS: 
151b0 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  {.    if( objc==
151c0 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
151d0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
151e0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
151f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15200 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  , pDb->zProgress
15210 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
15220 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
15230 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
15240 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72      char *zProgr
15250 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ess;.      int l
15260 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b  en;.      int N;
15270 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  .      if( TCL_O
15280 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
15290 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
152a0 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20  v[2], &N) ){.   
152b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
152c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a  ERROR;.      };.
152d0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
152e0 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
152f0 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
15300 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->zProgress);.  
15310 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
15320 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53  gress = Tcl_GetS
15330 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
15340 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[3], &len);.   
15350 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73     if( zProgress
15360 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
15370 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
15380 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ess = Tcl_Alloc(
15390 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
153a0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
153b0 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67  zProgress, zProg
153c0 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  ress, len+1);.  
153d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
153e0 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
153f0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  s = 0;.      }.#
15400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15410 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
15420 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70  BACK.      if( p
15430 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
15440 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
15450 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
15460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
15470 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
15480 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72  pDb->db, N, DbPr
15490 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70  ogressHandler, p
154a0 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
154b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
154c0 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
154d0 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
154e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
154f0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
15500 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
15510 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
15520 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42  , objv, "N CALLB
15530 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
15540 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15550 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
15560 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
15570 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41   profile ?CALLBA
15580 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61  CK?.  **.  ** Ma
15590 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
155a0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41  to invoke the CA
155b0 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61  LLBACK routine a
155c0 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73 74  fter each SQL st
155d0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61  atement.  ** tha
155e0 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20  t has run.  The 
155f0 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
15600 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  and the amount o
15610 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72  f elapse time ar
15620 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20  e.  ** appended 
15630 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f  to CALLBACK befo
15640 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69 73  re the script is
15650 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   run..  */.  cas
15660 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a  e DB_PROFILE: {.
15670 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
15680 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
15690 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
156a0 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
156b0 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
156c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
156d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
156e0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
156f0 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
15700 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
15710 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15720 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66  terp, pDb->zProf
15730 69 6c 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ile, (char*)0);.
15740 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15750 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
15760 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69  Profile;.      i
15770 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
15780 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
15790 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
157a0 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  ree(pDb->zProfil
157b0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
157c0 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c    zProfile = Tcl
157d0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
157e0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
157f0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f  ;.      if( zPro
15800 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b  file && len>0 ){
15810 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
15820 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c  rofile = Tcl_All
15830 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
15840 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
15850 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72  b->zProfile, zPr
15860 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20  ofile, len+1);. 
15870 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15880 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c      pDb->zProfil
15890 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
158a0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
158b0 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
158c0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
158d0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
158e0 50 4f 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20  POINT) && \.    
158f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15900 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 29  OMIT_DEPRECATED)
15910 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
15920 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
15930 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
15940 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
15950 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
15960 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f  e(pDb->db, DbPro
15970 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  fileHandler, pDb
15980 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
159a0 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
159b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
159c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
159d0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
159e0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72  *.  **     $db r
159f0 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20  ekey KEY.  **.  
15a00 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e  ** Change the en
15a10 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20  cryption key on 
15a20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
15a30 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  en database..  *
15a40 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45  /.  case DB_REKE
15a50 59 3a 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  Y: {.#if defined
15a60 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
15a70 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  C) && !defined(S
15a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43  QLITE_OMIT_CODEC
15a90 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 69  _FROM_TCL).    i
15aa0 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69  nt nKey;.    voi
15ab0 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a  d *pKey;.#endif.
15ac0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
15ad0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
15ae0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
15af0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22  , 2, objv, "KEY"
15b00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15b10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15b20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
15b30 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26  ITE_HAS_CODEC) &
15b40 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
15b50 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f  E_OMIT_CODEC_FRO
15b60 4d 5f 54 43 4c 29 0a 20 20 20 20 70 4b 65 79 20  M_TCL).    pKey 
15b70 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
15b80 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
15b90 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 72  ], &nKey);.    r
15ba0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65  c = sqlite3_reke
15bb0 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c  y(pDb->db, pKey,
15bc0 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20   nKey);.    if( 
15bd0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
15be0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15bf0 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
15c00 73 74 72 28 72 63 29 2c 20 28 63 68 61 72 2a 29  str(rc), (char*)
15c10 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
15c20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15c30 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
15c40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
15c50 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41  db restore ?DATA
15c60 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
15c70 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20   **.  ** Open a 
15c80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
15c90 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54  med FILENAME.  T
15ca0 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74  ransfer the cont
15cb0 65 6e 74 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45  ent.  ** of FILE
15cc0 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f  NAME into the lo
15cd0 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54  cal database DAT
15ce0 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20  ABASE (default: 
15cf0 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20  "main")..  */.  
15d00 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45 3a  case DB_RESTORE:
15d10 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
15d20 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20  r *zSrcFile;.   
15d30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
15d40 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  stDb;.    sqlite
15d50 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c  3 *pSrc;.    sql
15d60 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61  ite3_backup *pBa
15d70 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54  ckup;.    int nT
15d80 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20  imeout = 0;..   
15d90 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
15da0 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20        zDestDb = 
15db0 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53  "main";.      zS
15dc0 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  rcFile = Tcl_Get
15dd0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
15de0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
15df0 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
15e00 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47 65  zDestDb = Tcl_Ge
15e10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
15e20 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65  ;.      zSrcFile
15e30 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
15e40 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d  (objv[3]);.    }
15e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
15e60 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15e70 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
15e80 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
15e90 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ME");.      retu
15ea0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15eb0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
15ec0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72  ite3_open_v2(zSr
15ed0 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 0a 20 20  cFile, &pSrc,.  
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
15f00 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 70 44  EN_READONLY | pD
15f10 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  b->openFlags, 0)
15f20 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15f40 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15f50 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
15f60 74 20 6f 70 65 6e 20 73 6f 75 72 63 65 20 64 61  t open source da
15f70 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
15f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
15f90 72 6d 73 67 28 70 53 72 63 29 2c 20 28 63 68 61  rmsg(pSrc), (cha
15fa0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
15fb0 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
15fc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
15fd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15fe0 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
15ff0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
16000 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44 65 73 74  t(pDb->db, zDest
16010 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22  Db, pSrc, "main"
16020 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
16030 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  up==0 ){.      T
16040 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16050 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65  interp, "restore
16060 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
16070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
16080 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
16090 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
160a0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
160b0 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Src);.      retu
160c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
160d0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28    }.    while( (
160e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
160f0 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
16100 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
16110 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
16120 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  || rc==SQLITE_BU
16130 53 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  SY ){.      if( 
16140 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
16150 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
16160 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29  Timeout++ >= 3 )
16170 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16180 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30  sqlite3_sleep(10
16190 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
161a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
161b0 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
161c0 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
161d0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
161e0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
161f0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
16200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
16210 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Y || rc==SQLITE_
16220 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
16230 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16240 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72  (interp, "restor
16250 65 20 66 61 69 6c 65 64 3a 20 73 6f 75 72 63 65  e failed: source
16260 20 64 61 74 61 62 61 73 65 20 62 75 73 79 22 2c   database busy",
16270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16280 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
16290 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
162a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
162b0 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
162c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
162d0 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c  p, "restore fail
162e0 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
162f0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
16300 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
16310 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
16320 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16330 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
16340 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 62  ose(pSrc);.    b
16350 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
16360 20 20 2a 2a 20 20 20 20 20 24 64 62 20 73 74 61    **     $db sta
16370 74 75 73 20 28 73 74 65 70 7c 73 6f 72 74 7c 61  tus (step|sort|a
16380 75 74 6f 69 6e 64 65 78 7c 76 6d 73 74 65 70 29  utoindex|vmstep)
16390 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c  .  **.  ** Displ
163a0 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  ay SQLITE_STMTST
163b0 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
163c0 45 50 20 6f 72 0a 20 20 2a 2a 20 53 51 4c 49 54  EP or.  ** SQLIT
163d0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
163e0 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  T for the most r
163f0 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f  ecent eval..  */
16400 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54 55  .  case DB_STATU
16410 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a  S: {.    int v;.
16420 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16430 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  zOp;.    if( obj
16440 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
16450 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
16460 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
16470 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f  "(step|sort|auto
16480 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20 20 20  index)");.      
16490 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
164a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20  ;.    }.    zOp 
164b0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
164c0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66  objv[2]);.    if
164d0 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73  ( strcmp(zOp, "s
164e0 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tep")==0 ){.    
164f0 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70    v = pDb->nStep
16500 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16510 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72  strcmp(zOp, "sor
16520 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
16530 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a  v = pDb->nSort;.
16540 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
16550 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69  rcmp(zOp, "autoi
16560 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ndex")==0 ){.   
16570 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64     v = pDb->nInd
16580 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ex;.    }else if
16590 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 76  ( strcmp(zOp, "v
165a0 6d 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20  mstep")==0 ){.  
165b0 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 56 4d      v = pDb->nVM
165c0 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Step;.    }else{
165d0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
165e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a  dResult(interp,.
165f0 20 20 20 20 20 20 20 20 20 20 20 20 22 62 61 64              "bad
16600 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c   argument: shoul
16610 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78 2c 20  d be autoindex, 
16620 73 74 65 70 2c 20 73 6f 72 74 20 6f 72 20 76 6d  step, sort or vm
16630 73 74 65 70 22 2c 0a 20 20 20 20 20 20 20 20 20  step",.         
16640 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
16650 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16660 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
16670 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
16680 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
16690 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20 20  IntObj(v));.    
166a0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
166b0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69  .  **     $db ti
166c0 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e  meout MILLESECON
166d0 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c  DS.  **.  ** Del
166e0 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  ay for the numbe
166f0 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
16700 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  s specified when
16710 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65   a file is locke
16720 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
16730 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20  B_TIMEOUT: {.   
16740 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28   int ms;.    if(
16750 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
16760 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
16770 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
16780 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44  jv, "MILLISECOND
16790 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  S");.      retur
167a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
167b0 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
167c0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
167d0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d  erp, objv[2], &m
167e0 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
167f0 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
16800 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
16810 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20  pDb->db, ms);.  
16820 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
16830 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
16840 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20  total_changes.  
16850 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
16860 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
16870 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69  s that were modi
16880 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20  fied, inserted, 
16890 6f 72 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  or deleted.  ** 
168a0 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61  since the databa
168b0 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72  se handle was cr
168c0 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  eated..  */.  ca
168d0 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e  se DB_TOTAL_CHAN
168e0 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
168f0 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
16900 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
16910 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
16920 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
16930 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
16940 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16950 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
16960 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
16970 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
16980 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
16990 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
169a0 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
169b0 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
169c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
169d0 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65   /*    $db trace
169e0 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
169f0 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
16a00 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
16a10 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
16a20 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20  outine for each 
16a30 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
16a40 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75  ** that is execu
16a50 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f  ted.  The text o
16a60 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70  f the SQL is app
16a70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
16a80 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74  K before.  ** it
16a90 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
16aa0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41  */.  case DB_TRA
16ab0 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  CE: {.    if( ob
16ac0 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
16ad0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
16ae0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
16af0 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
16b00 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16b10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
16b20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
16b30 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
16b40 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
16b50 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16b60 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
16b70 54 72 61 63 65 2c 20 28 63 68 61 72 2a 29 30 29  Trace, (char*)0)
16b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16b90 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
16ba0 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69  *zTrace;.      i
16bb0 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
16bc0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
16bd0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
16be0 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a  e(pDb->zTrace);.
16bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
16c00 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  race = Tcl_GetSt
16c10 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
16c20 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
16c30 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20    if( zTrace && 
16c40 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
16c50 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54   pDb->zTrace = T
16c60 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
16c70 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
16c80 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c  cpy(pDb->zTrace,
16c90 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b   zTrace, len+1);
16ca0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16cb0 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
16cc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  e = 0;.      }.#
16cd0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
16ce0 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
16cf0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
16d00 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
16d10 50 4f 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20  POINT) && \.    
16d20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16d30 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 29  OMIT_DEPRECATED)
16d40 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
16d50 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
16d60 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
16d70 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
16d80 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
16d90 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61  b->db, DbTraceHa
16da0 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
16db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16dc0 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
16dd0 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
16de0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
16df0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
16e00 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
16e10 20 74 72 61 63 65 5f 76 32 20 3f 43 41 4c 4c 42   trace_v2 ?CALLB
16e20 41 43 4b 3f 20 3f 4d 41 53 4b 3f 0a 20 20 2a 2a  ACK? ?MASK?.  **
16e30 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
16e40 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
16e50 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
16e60 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20  outine for each 
16e70 74 72 61 63 65 20 65 76 65 6e 74 0a 20 20 2a 2a  trace event.  **
16e80 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 6d 61   matching the ma
16e90 73 6b 20 74 68 61 74 20 69 73 20 67 65 6e 65 72  sk that is gener
16ea0 61 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  ated.  The param
16eb0 65 74 65 72 73 20 61 72 65 20 61 70 70 65 6e 64  eters are append
16ec0 65 64 20 74 6f 0a 20 20 2a 2a 20 43 41 4c 4c 42  ed to.  ** CALLB
16ed0 41 43 4b 20 62 65 66 6f 72 65 20 69 74 20 69 73  ACK before it is
16ee0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a   executed..  */.
16ef0 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 5f    case DB_TRACE_
16f00 56 32 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  V2: {.    if( ob
16f10 6a 63 3e 34 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>4 ){.      Tc
16f20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
16f30 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
16f40 22 3f 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41 53  "?CALLBACK? ?MAS
16f50 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
16f60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16f70 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
16f80 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
16f90 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 29   pDb->zTraceV2 )
16fa0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
16fb0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16fc0 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  p, pDb->zTraceV2
16fd0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
16fe0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
16ff0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
17000 63 65 56 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  ceV2;.      int 
17010 6c 65 6e 3b 0a 20 20 20 20 20 20 54 63 6c 5f 57  len;.      Tcl_W
17020 69 64 65 49 6e 74 20 77 4d 61 73 6b 20 3d 20 30  ideInt wMask = 0
17030 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
17040 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==4 ){.        s
17050 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
17060 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d   *TTYPE_strs[] =
17070 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22 73 74   {.          "st
17080 61 74 65 6d 65 6e 74 22 2c 20 22 70 72 6f 66 69  atement", "profi
17090 6c 65 22 2c 20 22 72 6f 77 22 2c 20 22 63 6c 6f  le", "row", "clo
170a0 73 65 22 2c 20 30 0a 20 20 20 20 20 20 20 20 7d  se", 0.        }
170b0 3b 0a 20 20 20 20 20 20 20 20 65 6e 75 6d 20 54  ;.        enum T
170c0 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20  TYPE_enum {.    
170d0 20 20 20 20 20 20 54 54 59 50 45 5f 53 54 4d 54        TTYPE_STMT
170e0 2c 20 54 54 59 50 45 5f 50 52 4f 46 49 4c 45 2c  , TTYPE_PROFILE,
170f0 20 54 54 59 50 45 5f 52 4f 57 2c 20 54 54 59 50   TTYPE_ROW, TTYP
17100 45 5f 43 4c 4f 53 45 0a 20 20 20 20 20 20 20 20  E_CLOSE.        
17110 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  };.        int i
17120 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43  ;.        if( TC
17130 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c 69 73 74 4f 62  L_OK!=Tcl_ListOb
17140 6a 4c 65 6e 67 74 68 28 69 6e 74 65 72 70 2c 20  jLength(interp, 
17150 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 20 29  objv[3], &len) )
17160 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
17170 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17190 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
171a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
171b0 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20  Tcl_Obj *pObj;. 
171c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 74 74 79           int tty
171d0 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pe;.          if
171e0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c 69  ( TCL_OK!=Tcl_Li
171f0 73 74 4f 62 6a 49 6e 64 65 78 28 69 6e 74 65 72  stObjIndex(inter
17200 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 69 2c 20 26  p, objv[3], i, &
17210 70 4f 62 6a 29 20 29 7b 0a 20 20 20 20 20 20 20  pObj) ){.       
17220 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
17230 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
17240 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
17250 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
17260 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 4f 62  mObj(interp, pOb
17270 6a 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22  j, TTYPE_strs, "
17280 74 72 61 63 65 20 74 79 70 65 22 2c 0a 20 20 20  trace type",.   
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
172b0 2c 20 26 74 74 79 70 65 29 21 3d 54 43 4c 5f 4f  , &ttype)!=TCL_O
172c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
172d0 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 77 54 79   Tcl_WideInt wTy
172e0 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pe;.            
172f0 54 63 6c 5f 4f 62 6a 20 2a 70 45 72 72 6f 72 20  Tcl_Obj *pError 
17300 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
17310 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
17320 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 20 20  ult(interp));.  
17330 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e            Tcl_In
17340 63 72 52 65 66 43 6f 75 6e 74 28 70 45 72 72 6f  crRefCount(pErro
17350 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
17360 69 66 28 20 54 43 4c 5f 4f 4b 3d 3d 54 63 6c 5f  if( TCL_OK==Tcl_
17370 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
17380 6a 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20  j(interp, pObj, 
17390 26 77 54 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &wType) ){.     
173a0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63           Tcl_Dec
173b0 72 52 65 66 43 6f 75 6e 74 28 70 45 72 72 6f 72  rRefCount(pError
173c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
173d0 20 77 4d 61 73 6b 20 7c 3d 20 77 54 79 70 65 3b   wMask |= wType;
173e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
173f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
17400 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
17410 6c 74 28 69 6e 74 65 72 70 2c 20 70 45 72 72 6f  lt(interp, pErro
17420 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
17430 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
17440 6e 74 28 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  nt(pError);.    
17450 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17460 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17490 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 28         switch( (
174a0 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29  enum TTYPE_enum)
174b0 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20  ttype ){.       
174c0 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
174d0 45 5f 53 54 4d 54 3a 20 20 20 20 77 4d 61 73 6b  E_STMT:    wMask
174e0 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45   |= SQLITE_TRACE
174f0 5f 53 54 4d 54 3b 20 20 20 20 62 72 65 61 6b 3b  _STMT;    break;
17500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
17510 61 73 65 20 54 54 59 50 45 5f 50 52 4f 46 49 4c  ase TTYPE_PROFIL
17520 45 3a 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49  E: wMask |= SQLI
17530 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c 45  TE_TRACE_PROFILE
17540 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
17550 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
17560 45 5f 52 4f 57 3a 20 20 20 20 20 77 4d 61 73 6b  E_ROW:     wMask
17570 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45   |= SQLITE_TRACE
17580 5f 52 4f 57 3b 20 20 20 20 20 62 72 65 61 6b 3b  _ROW;     break;
17590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
175a0 61 73 65 20 54 54 59 50 45 5f 43 4c 4f 53 45 3a  ase TTYPE_CLOSE:
175b0 20 20 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49     wMask |= SQLI
175c0 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 3b 20  TE_TRACE_CLOSE; 
175d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
175e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
175f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17610 20 20 77 4d 61 73 6b 20 3d 20 53 51 4c 49 54 45    wMask = SQLITE
17620 5f 54 52 41 43 45 5f 53 54 4d 54 3b 20 2f 2a 20  _TRACE_STMT; /* 
17630 75 73 65 20 74 68 65 20 22 6c 65 67 61 63 79 22  use the "legacy"
17640 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20   default */.    
17650 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
17660 62 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20  b->zTraceV2 ){. 
17670 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
17680 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 29 3b 0a  pDb->zTraceV2);.
17690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
176a0 72 61 63 65 56 32 20 3d 20 54 63 6c 5f 47 65 74  raceV2 = Tcl_Get
176b0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
176c0 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
176d0 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 56 32      if( zTraceV2
176e0 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
176f0 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
17700 56 32 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  V2 = Tcl_Alloc( 
17710 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
17720 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
17730 54 72 61 63 65 56 32 2c 20 7a 54 72 61 63 65 56  TraceV2, zTraceV
17740 32 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  2, len+1);.     
17750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17760 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 3d 20  pDb->zTraceV2 = 
17770 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  0;.      }.#if !
17780 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17790 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64  MIT_TRACE) && !d
177a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
177b0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
177c0 54 29 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  T).      if( pDb
177d0 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20  ->zTraceV2 ){.  
177e0 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
177f0 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
17800 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
17810 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 28 75  e_v2(pDb->db, (u
17820 6e 73 69 67 6e 65 64 29 77 4d 61 73 6b 2c 20 44  nsigned)wMask, D
17830 62 54 72 61 63 65 56 32 48 61 6e 64 6c 65 72 2c  bTraceV2Handler,
17840 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
17850 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
17860 74 65 33 5f 74 72 61 63 65 5f 76 32 28 70 44 62  te3_trace_v2(pDb
17870 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ->db, 0, 0, 0);.
17880 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
17890 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
178a0 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
178b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64   transaction [-d
178c0 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61  eferred|-immedia
178d0 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53  te|-exclusive] S
178e0 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
178f0 53 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  Start a new tran
17900 73 61 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61  saction (if we a
17910 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  re not already i
17920 6e 20 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61  n the midst of a
17930 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
17940 6e 29 20 61 6e 64 20 65 78 65 63 75 74 65 20 74  n) and execute t
17950 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 53 43  he TCL script SC
17960 52 49 50 54 2e 20 20 41 66 74 65 72 20 53 43 52  RIPT.  After SCR
17970 49 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74  IPT.  ** complet
17980 65 73 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69  es, either commi
17990 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
179a0 6e 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63  n or roll it bac
179b0 6b 20 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a  k if SCRIPT.  **
179c0 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
179d0 74 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20  tion.  Or if no 
179e0 6e 65 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77  new transation w
179f0 61 73 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e  as started, do n
17a00 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73  othing..  ** pas
17a10 73 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  s the exception 
17a20 6f 6e 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e  on up the stack.
17a30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
17a40 63 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70  command was insp
17a50 69 72 65 64 20 62 79 20 44 61 76 65 20 54 68 6f  ired by Dave Tho
17a60 6d 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75  mas's talk on Ru
17a70 62 79 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32  by at the.  ** 2
17a80 30 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65  005 O'Reilly Ope
17a90 6e 20 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74  n Source Convent
17aa0 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a  ion (OSCON)..  *
17ab0 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e  /.  case DB_TRAN
17ac0 53 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 54  SACTION: {.    T
17ad0 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
17ae0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
17af0 2a 7a 42 65 67 69 6e 20 3d 20 22 53 41 56 45 50  *zBegin = "SAVEP
17b00 4f 49 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61  OINT _tcl_transa
17b10 63 74 69 6f 6e 22 3b 0a 20 20 20 20 69 66 28 20  ction";.    if( 
17b20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
17b30 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =4 ){.      Tcl_
17b40 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17b50 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b  erp, 2, objv, "[
17b60 54 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a  TYPE] SCRIPT");.
17b70 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
17b80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
17b90 20 20 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61     if( pDb->nTra
17ba0 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 26 26 20 6f  nsaction==0 && o
17bb0 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
17bc0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
17bd0 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20  r *TTYPE_strs[] 
17be0 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66  = {.        "def
17bf0 65 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75  erred",   "exclu
17c00 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61  sive",  "immedia
17c10 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a  te", 0.      };.
17c20 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45        enum TTYPE
17c30 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20  _enum {.        
17c40 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20  TTYPE_DEFERRED, 
17c50 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c  TTYPE_EXCLUSIVE,
17c60 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45   TTYPE_IMMEDIATE
17c70 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
17c80 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20  int ttype;.     
17c90 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
17ca0 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
17cb0 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f   objv[2], TTYPE_
17cc0 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69  strs, "transacti
17cd0 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20  on type",.      
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 20 20 20 20 20 30 2c 20 26 74 74 79 70          0, &ttyp
17d00 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  e) ){.        re
17d10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77        }.      sw
17d30 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50  itch( (enum TTYP
17d40 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a  E_enum)ttype ){.
17d50 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
17d60 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20  PE_DEFERRED:    
17d70 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20  /* no-op */;    
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
17d90 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
17da0 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45   TTYPE_EXCLUSIVE
17db0 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45  :   zBegin = "BE
17dc0 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20  GIN EXCLUSIVE"; 
17dd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
17de0 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44  case TTYPE_IMMED
17df0 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d  IATE:   zBegin =
17e00 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54   "BEGIN IMMEDIAT
17e10 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  E";  break;.    
17e20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53    }.    }.    pS
17e30 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a  cript = objv[obj
17e40 63 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 52 75  c-1];..    /* Ru
17e50 6e 20 74 68 65 20 53 51 4c 69 74 65 20 42 45 47  n the SQLite BEG
17e60 49 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70  IN command to op
17e70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
17e80 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 2a   or savepoint. *
17e90 2f 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62  /.    pDb->disab
17ea0 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72 63  leAuth++;.    rc
17eb0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
17ec0 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c  pDb->db, zBegin,
17ed0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70   0, 0, 0);.    p
17ee0 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d  Db->disableAuth-
17ef0 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  -;.    if( rc!=S
17f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17f10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17f20 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
17f30 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
17f40 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
17f50 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
17f60 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
17f70 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
17f80 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  on++;..    /* If
17f90 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65   using NRE, sche
17fa0 64 75 6c 65 20 61 20 63 61 6c 6c 62 61 63 6b 20  dule a callback 
17fb0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 63  to invoke the sc
17fc0 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74 68  ript pScript, th
17fd0 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73 65 63 6f  en.    ** a seco
17fe0 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 63  nd callback to c
17ff0 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61  ommit (or rollba
18000 63 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63 74  ck) the transact
18010 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74  ion or savepoint
18020 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 61  .    ** opened a
18030 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20 75 73 69  bove. If not usi
18040 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65  ng NRE, evaluate
18050 20 74 68 65 20 73 63 72 69 70 74 20 64 69 72 65   the script dire
18060 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20 20 20 2a  ctly, then.    *
18070 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  * call function 
18080 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 29  DbTransPostCmd()
18090 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72   to commit (or r
180a0 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61  ollback) the tra
180b0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
180c0 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 20 2a  or savepoint.  *
180d0 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73 65 4e  /.    if( DbUseN
180e0 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63  re() ){.      Tc
180f0 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28  l_NRAddCallback(
18100 69 6e 74 65 72 70 2c 20 44 62 54 72 61 6e 73 50  interp, DbTransP
18110 6f 73 74 43 6d 64 2c 20 63 64 2c 20 30 2c 20 30  ostCmd, cd, 0, 0
18120 2c 20 30 29 3b 0a 20 20 20 20 20 20 28 76 6f 69  , 0);.      (voi
18130 64 29 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28  d)Tcl_NREvalObj(
18140 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
18150 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
18160 20 20 20 20 20 20 72 63 20 3d 20 44 62 54 72 61        rc = DbTra
18170 6e 73 50 6f 73 74 43 6d 64 28 26 63 64 2c 20 69  nsPostCmd(&cd, i
18180 6e 74 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c 4f  nterp, Tcl_EvalO
18190 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
181a0 72 69 70 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d  ript, 0));.    }
181b0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
181c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
181d0 62 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20  b unlock_notify 
181e0 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20  ?script?.  */.  
181f0 63 61 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e  case DB_UNLOCK_N
18200 4f 54 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65 66  OTIFY: {.#ifndef
18210 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
18220 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20  NLOCK_NOTIFY.   
18230 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18240 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f 63  t(interp, "unloc
18250 6b 5f 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76 61  k_notify not ava
18260 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
18270 75 69 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20  uild",.         
18280 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
18290 72 2a 29 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  r*)0);.    rc = 
182a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
182b0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
182c0 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
182d0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
182e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
182f0 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f   objv, "?SCRIPT?
18300 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  ");.      rc = T
18310 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
18320 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  lse{.      void 
18330 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69 64 20  (*xNotify)(void 
18340 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 20 20  **, int) = 0;.  
18350 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66      void *pNotif
18360 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20  yArg = 0;..     
18370 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63   if( pDb->pUnloc
18380 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20 20 20  kNotify ){.     
18390 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
183a0 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  unt(pDb->pUnlock
183b0 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20 20 20  Notify);.       
183c0 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
183d0 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ify = 0;.      }
183e0 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ..      if( objc
183f0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ==3 ){.        x
18400 4e 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63  Notify = DbUnloc
18410 6b 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20 20 20  kNotify;.       
18420 20 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 28 76   pNotifyArg = (v
18430 6f 69 64 20 2a 29 70 44 62 3b 0a 20 20 20 20 20  oid *)pDb;.     
18440 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
18450 6f 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b  otify = objv[2];
18460 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
18470 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
18480 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
18490 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
184a0 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  ( sqlite3_unlock
184b0 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64 62 2c  _notify(pDb->db,
184c0 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69 66   xNotify, pNotif
184d0 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20  yArg) ){.       
184e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
184f0 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
18500 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
18510 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
18520 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
18530 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
18540 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
18550 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
18560 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75    **    $db preu
18570 70 64 61 74 65 5f 68 6f 6f 6b 20 63 6f 75 6e 74  pdate_hook count
18580 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65  .  **    $db pre
18590 75 70 64 61 74 65 5f 68 6f 6f 6b 20 68 6f 6f 6b  update_hook hook
185a0 20 3f 53 43 52 49 50 54 3f 0a 20 20 2a 2a 20 20   ?SCRIPT?.  **  
185b0 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f    $db preupdate_
185c0 68 6f 6f 6b 20 6e 65 77 20 49 4e 44 45 58 0a 20  hook new INDEX. 
185d0 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
185e0 64 61 74 65 5f 68 6f 6f 6b 20 6f 6c 64 20 49 4e  date_hook old IN
185f0 44 45 58 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  DEX.  */.  case 
18600 44 42 5f 50 52 45 55 50 44 41 54 45 3a 20 7b 0a  DB_PREUPDATE: {.
18610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
18620 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
18630 48 4f 4f 4b 0a 20 20 20 20 54 63 6c 5f 41 70 70  HOOK.    Tcl_App
18640 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18650 2c 20 22 70 72 65 75 70 64 61 74 65 5f 68 6f 6f  , "preupdate_hoo
18660 6b 20 77 61 73 20 6f 6d 69 74 74 65 64 20 61 74  k was omitted at
18670 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 20   compile-time", 
18680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18690 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
186a0 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52  .    rc = TCL_ER
186b0 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ROR;.#else.    s
186c0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
186d0 20 2a 61 7a 53 75 62 5b 5d 20 3d 20 7b 22 63 6f   *azSub[] = {"co
186e0 75 6e 74 22 2c 20 22 64 65 70 74 68 22 2c 20 22  unt", "depth", "
186f0 68 6f 6f 6b 22 2c 20 22 6e 65 77 22 2c 20 22 6f  hook", "new", "o
18700 6c 64 22 2c 20 30 7d 3b 0a 20 20 20 20 65 6e 75  ld", 0};.    enu
18710 6d 20 44 62 50 72 65 75 70 64 61 74 65 53 75 62  m DbPreupdateSub
18720 43 6d 64 20 7b 0a 20 20 20 20 20 20 50 52 45 5f  Cmd {.      PRE_
18730 43 4f 55 4e 54 2c 20 50 52 45 5f 44 45 50 54 48  COUNT, PRE_DEPTH
18740 2c 20 50 52 45 5f 48 4f 4f 4b 2c 20 50 52 45 5f  , PRE_HOOK, PRE_
18750 4e 45 57 2c 20 50 52 45 5f 4f 4c 44 0a 20 20 20  NEW, PRE_OLD.   
18760 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 53 75 62   };.    int iSub
18770 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  ;..    if( objc<
18780 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
18790 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
187a0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 2, objv, "SU
187b0 42 2d 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 3f  B-COMMAND ?ARGS?
187c0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
187d0 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
187e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
187f0 6a 76 5b 32 5d 2c 20 61 7a 53 75 62 2c 20 22 73  jv[2], azSub, "s
18800 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20  ub-command", 0, 
18810 26 69 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  &iSub) ){.      
18820 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
18840 74 63 68 28 20 28 65 6e 75 6d 20 44 62 50 72 65  tch( (enum DbPre
18850 75 70 64 61 74 65 53 75 62 43 6d 64 29 69 53 75  updateSubCmd)iSu
18860 62 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  b ){.      case 
18870 50 52 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20  PRE_COUNT: {.   
18880 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20       int nCol = 
18890 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
188a0 65 5f 63 6f 75 6e 74 28 70 44 62 2d 3e 64 62 29  e_count(pDb->db)
188b0 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  ;.        Tcl_Se
188c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
188d0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
188e0 28 6e 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20  (nCol));.       
188f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18900 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f  .      case PRE_
18910 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20  HOOK: {.        
18920 69 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20  if( objc>4 ){.  
18930 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
18940 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
18950 20 32 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f 6b 20   2, objv, "hook 
18960 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
18970 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
18980 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
18990 7d 0a 20 20 20 20 20 20 20 20 44 62 48 6f 6f 6b  }.        DbHook
189a0 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c  Cmd(interp, pDb,
189b0 20 28 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62 6a 76   (objc==4 ? objv
189c0 5b 33 5d 20 3a 20 30 29 2c 20 26 70 44 62 2d 3e  [3] : 0), &pDb->
189d0 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b  pPreUpdateHook);
189e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
189f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
18a00 61 73 65 20 50 52 45 5f 44 45 50 54 48 3a 20 7b  ase PRE_DEPTH: {
18a10 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
18a20 20 2a 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20   *pRet;.        
18a30 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
18a40 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f           Tcl_Wro
18a50 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
18a60 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 3, objv, "");.
18a70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18a80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
18a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52      }.        pR
18aa0 65 74 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  et = Tcl_NewIntO
18ab0 62 6a 28 73 71 6c 69 74 65 33 5f 70 72 65 75 70  bj(sqlite3_preup
18ac0 64 61 74 65 5f 64 65 70 74 68 28 70 44 62 2d 3e  date_depth(pDb->
18ad0 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63  db));.        Tc
18ae0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
18af0 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
18b00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18b10 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
18b20 20 50 52 45 5f 4e 45 57 3a 0a 20 20 20 20 20 20   PRE_NEW:.      
18b30 63 61 73 65 20 50 52 45 5f 4f 4c 44 3a 20 7b 0a  case PRE_OLD: {.
18b40 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78          int iIdx
18b50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18b60 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 3b  3_value *pValue;
18b70 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a  .        if( obj
18b80 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
18b90 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
18ba0 67 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62  gs(interp, 3, ob
18bb0 6a 76 2c 20 22 49 4e 44 45 58 22 29 3b 0a 20 20  jv, "INDEX");.  
18bc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
18bd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
18be0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
18bf0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
18c00 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
18c10 5d 2c 20 26 69 49 64 78 29 20 29 7b 0a 20 20 20  ], &iIdx) ){.   
18c20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
18c30 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
18c40 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
18c50 69 53 75 62 3d 3d 50 52 45 5f 4f 4c 44 20 29 7b  iSub==PRE_OLD ){
18c60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
18c70 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
18c80 65 5f 6f 6c 64 28 70 44 62 2d 3e 64 62 2c 20 69  e_old(pDb->db, i
18c90 49 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20  Idx, &pValue);. 
18ca0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18cb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18cc0 69 53 75 62 3d 3d 50 52 45 5f 4e 45 57 20 29 3b  iSub==PRE_NEW );
18cd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
18ce0 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
18cf0 65 5f 6e 65 77 28 70 44 62 2d 3e 64 62 2c 20 69  e_new(pDb->db, i
18d00 49 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20  Idx, &pValue);. 
18d10 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
18d20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18d30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18d40 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a   Tcl_Obj *pObj;.
18d50 20 20 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d            pObj =
18d60 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
18d70 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
18d80 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
18d90 75 65 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ue), -1);.      
18da0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
18db0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 4f 62  sult(interp, pOb
18dc0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
18dd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  e{.          Tcl
18de0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18df0 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
18e00 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
18e10 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
18e20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18e30 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
18e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
18e50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
18e60 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
18e70 48 4f 4f 4b 20 2a 2f 0a 20 20 20 20 62 72 65 61  HOOK */.    brea
18e80 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
18e90 2a 20 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f  *    $db wal_hoo
18ea0 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20  k ?script?.  ** 
18eb0 20 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f     $db update_ho
18ec0 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a  ok ?script?.  **
18ed0 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b      $db rollback
18ee0 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
18ef0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41   */.  case DB_WA
18f00 4c 5f 48 4f 4f 4b 3a 0a 20 20 63 61 73 65 20 44  L_HOOK:.  case D
18f10 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 0a 20  B_UPDATE_HOOK:. 
18f20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43   case DB_ROLLBAC
18f30 4b 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 2f 2a  K_HOOK: {.    /*
18f40 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70   set ppHook to p
18f50 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65 48  oint at pUpdateH
18f60 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b  ook or pRollback
18f70 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20  Hook, depending 
18f80 6f 6e 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65  on.    ** whethe
18f90 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f  r [$db update_ho
18fa0 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c  ok] or [$db roll
18fb0 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69  back_hook] was i
18fc0 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  nvoked..    */. 
18fd0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48     Tcl_Obj **ppH
18fe0 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ook = 0;.    if(
18ff0 20 63 68 6f 69 63 65 3d 3d 44 42 5f 57 41 4c 5f   choice==DB_WAL_
19000 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20  HOOK ) ppHook = 
19010 26 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a  &pDb->pWalHook;.
19020 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
19030 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29  DB_UPDATE_HOOK )
19040 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
19050 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20  pUpdateHook;.   
19060 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
19070 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 20 29 20  ROLLBACK_HOOK ) 
19080 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
19090 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20  RollbackHook;.  
190a0 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
190b0 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
190c0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
190d0 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
190e0 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74  T?");.       ret
190f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19100 20 20 20 7d 0a 0a 20 20 20 20 44 62 48 6f 6f 6b     }..    DbHook
19110 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c  Cmd(interp, pDb,
19120 20 28 6f 62 6a 63 3d 3d 33 20 3f 20 6f 62 6a 76   (objc==3 ? objv
19130 5b 32 5d 20 3a 20 30 29 2c 20 70 70 48 6f 6f 6b  [2] : 0), ppHook
19140 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
19150 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76  }..  /*    $db v
19160 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a  ersion.  **.  **
19170 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73   Return the vers
19180 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ion string for t
19190 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20  his database..  
191a0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52  */.  case DB_VER
191b0 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20  SION: {.    int 
191c0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  i;.    for(i=2; 
191d0 69 3c 6f 62 6a 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<objc; i++){.  
191e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
191f0 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
19200 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20  ring(objv[i]);. 
19210 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
19220 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 24 64   arguments to $d
19230 62 20 76 65 72 73 69 6f 6e 20 61 72 65 20 75 73  b version are us
19240 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ed for testing p
19250 75 72 70 6f 73 65 20 2a 2f 0a 23 69 66 64 65 66  urpose */.#ifdef
19260 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
19270 20 20 20 2f 2a 20 24 64 62 20 76 65 72 73 69 6f     /* $db versio
19280 6e 20 2d 75 73 65 2d 6c 65 67 61 63 79 2d 70 72  n -use-legacy-pr
19290 65 70 61 72 65 20 42 4f 4f 4c 45 41 4e 0a 20 20  epare BOOLEAN.  
192a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
192b0 54 75 72 6e 20 74 68 65 20 75 73 65 20 6f 66 20  Turn the use of 
192c0 6c 65 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70  legacy sqlite3_p
192d0 72 65 70 61 72 65 28 29 20 6f 6e 20 6f 72 20 6f  repare() on or o
192e0 66 66 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ff..      */.   
192f0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
19300 72 67 2c 20 22 2d 75 73 65 2d 6c 65 67 61 63 79  rg, "-use-legacy
19310 2d 70 72 65 70 61 72 65 22 29 3d 3d 30 20 26 26  -prepare")==0 &&
19320 20 69 2b 31 3c 6f 62 6a 63 20 29 7b 0a 20 20 20   i+1<objc ){.   
19330 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
19340 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
19350 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
19360 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 70 44  rp, objv[i], &pD
19370 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72  b->bLegacyPrepar
19380 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
19390 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
193a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
193b0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 20 20 2f    }else..      /
193c0 2a 20 24 64 62 20 76 65 72 73 69 6f 6e 20 2d 6c  * $db version -l
193d0 61 73 74 2d 73 74 6d 74 2d 70 74 72 0a 20 20 20  ast-stmt-ptr.   
193e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 52     **.      ** R
193f0 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 77  eturn a string w
19400 68 69 63 68 20 69 73 20 61 20 68 65 78 20 65 6e  hich is a hex en
19410 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 70 6f  coding of the po
19420 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 20  inter to the.   
19430 20 20 20 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e     ** most recen
19440 74 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 69  t sqlite3_stmt i
19450 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
19460 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  cache..      */.
19470 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
19480 28 7a 41 72 67 2c 20 22 2d 6c 61 73 74 2d 73 74  (zArg, "-last-st
19490 6d 74 2d 70 74 72 22 29 3d 3d 30 20 29 7b 0a 20  mt-ptr")==0 ){. 
194a0 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66         char zBuf
194b0 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  [100];.        s
194c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
194d0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
194e0 75 66 2c 20 22 25 70 22 2c 0a 20 20 20 20 20 20  uf, "%p",.      
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
19510 20 3f 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   ? pDb->stmtList
19520 2d 3e 70 53 74 6d 74 3a 20 30 29 3b 0a 20 20 20  ->pStmt: 0);.   
19530 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
19540 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
19550 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
19560 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
19570 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
19580 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  T */.      {.   
19590 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
195a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
195b0 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a  nknown argument:
195c0 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72 2a   ", zArg, (char*
195d0 29 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )0);.        ret
195e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
195f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19600 20 69 66 28 20 69 3d 3d 32 20 29 7b 20 20 20 0a   if( i==2 ){   .
19610 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
19620 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
19630 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76  r *)sqlite3_libv
19640 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54  ersion(), TCL_ST
19650 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ATIC);.    }.   
19660 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20   break;.  }...  
19670 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  } /* End of the 
19680 53 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74  SWITCH statement
19690 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
196a0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .}..#if SQLITE_T
196b0 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61  CL_NRE./*.** Ada
196c0 70 74 6f 72 20 74 68 61 74 20 70 72 6f 76 69 64  ptor that provid
196d0 65 73 20 61 6e 20 6f 62 6a 43 6d 64 20 69 6e 74  es an objCmd int
196e0 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 4e 52  erface to the NR
196f0 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20 69 6e 74  E-enabled.** int
19700 65 72 66 61 63 65 20 69 6d 70 6c 65 6d 65 6e 74  erface implement
19710 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
19720 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
19730 50 49 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74  PI DbObjCmdAdapt
19740 6f 72 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a  or(.  void *cd,.
19750 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
19760 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
19770 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  ,.  Tcl_Obj *con
19780 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72 65 74  st*objv.){.  ret
19790 75 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62  urn Tcl_NRCallOb
197a0 6a 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 44 62  jProc(interp, Db
197b0 4f 62 6a 43 6d 64 2c 20 63 64 2c 20 6f 62 6a 63  ObjCmd, cd, objc
197c0 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69  , objv);.}.#endi
197d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f  f /* SQLITE_TCL_
197e0 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20  NRE */../*.**   
197f0 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46  sqlite3 DBNAME F
19800 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46  ILENAME ?-vfs VF
19810 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59  SNAME? ?-key KEY
19820 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f  ? ?-readonly BOO
19830 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20  LEAN?.**        
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19850 20 20 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c     ?-create BOOL
19860 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42  EAN? ?-nomutex B
19870 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68  OOLEAN?.**.** Th
19880 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54  is is the main T
19890 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65  cl command.  Whe
198a0 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54  n the "sqlite" T
198b0 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  cl command is.**
198c0 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72   invoked, this r
198d0 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70  outine runs to p
198e0 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d  rocess that comm
198f0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  and..**.** The f
19900 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44  irst argument, D
19910 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62  BNAME, is an arb
19920 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20  itrary name for 
19930 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73  a new.** databas
19940 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  e connection.  T
19950 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61  his command crea
19960 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e  tes a new comman
19970 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d  d named.** DBNAM
19980 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  E that is used t
19990 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63  o control that c
199a0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  onnection.  The 
199b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
199c0 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65  ection is delete
199d0 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d  d when the DBNAM
199e0 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c  E command is del
199f0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
19a00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19a10 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
19a20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19a30 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
19a40 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
19a50 20 44 62 4d 61 69 6e 28 0a 20 20 76 6f 69 64 20   DbMain(.  void 
19a60 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  *cd,.  Tcl_Inter
19a70 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19a80 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19a90 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
19aa0 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20    SqliteDb *p;. 
19ab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
19ac0 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  g;.  char *zErrM
19ad0 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  sg;.  int i;.  c
19ae0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
19af0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19b00 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zVfs = 0;.  int 
19b10 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74  flags;.  Tcl_DSt
19b20 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46  ring translatedF
19b30 69 6c 65 6e 61 6d 65 3b 0a 23 69 66 20 64 65 66  ilename;.#if def
19b40 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
19b50 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e  CODEC) && !defin
19b60 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
19b70 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20  ODEC_FROM_TCL). 
19b80 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b   void *pKey = 0;
19b90 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b  .  int nKey = 0;
19ba0 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63  .#endif.  int rc
19bb0 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61  ;..  /* In norma
19bc0 6c 20 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20  l use, each TCL 
19bd0 69 6e 74 65 72 70 72 65 74 65 72 20 72 75 6e 73  interpreter runs
19be0 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72   in a single thr
19bf0 65 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79  ead.  So.  ** by
19c00 20 64 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e   default, we can
19c10 20 74 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e   turn of mutexin
19c20 67 20 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61  g on SQLite data
19c30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
19c40 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ..  ** However, 
19c50 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
19c60 6f 73 65 73 20 69 74 20 69 73 20 75 73 65 66 75  oses it is usefu
19c70 6c 20 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65  l to have mutexe
19c80 73 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e  s turned.  ** on
19c90 2e 20 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c  .  So, by defaul
19ca0 74 2c 20 6d 75 74 65 78 65 73 20 64 65 66 61 75  t, mutexes defau
19cb0 6c 74 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20  lt off.  But if 
19cc0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20  compiled with.  
19cd0 2a 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45  ** SQLITE_TCL_DE
19ce0 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20  FAULT_FULLMUTEX 
19cf0 74 68 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66  then mutexes def
19d00 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ault on..  */.#i
19d10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f  fdef SQLITE_TCL_
19d20 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45  DEFAULT_FULLMUTE
19d30 58 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  X.  flags = SQLI
19d40 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
19d50 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
19d60 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
19d70 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
19d80 23 65 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20  #else.  flags = 
19d90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19da0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
19db0 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
19dc0 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
19dd0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
19de0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  objc==2 ){.    z
19df0 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
19e00 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
19e10 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  1], 0);.    if( 
19e20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65  strcmp(zArg,"-ve
19e30 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  rsion")==0 ){.  
19e40 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19e50 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69  sult(interp,sqli
19e60 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
19e70 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
19e80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
19e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19ea0 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 73 6f  strcmp(zArg,"-so
19eb0 75 72 63 65 69 64 22 29 3d 3d 30 20 29 7b 0a 20  urceid")==0 ){. 
19ec0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
19ed0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
19ee0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
19ef0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
19f00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19f10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
19f20 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73  trcmp(zArg,"-has
19f30 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23  -codec")==0 ){.#
19f40 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19f50 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
19f60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19f70 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
19f80 54 43 4c 29 0a 20 20 20 20 20 20 54 63 6c 5f 41  TCL).      Tcl_A
19f90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19fa0 72 70 2c 22 31 22 2c 28 63 68 61 72 2a 29 30 29  rp,"1",(char*)0)
19fb0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
19fc0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19fd0 6e 74 65 72 70 2c 22 30 22 2c 28 63 68 61 72 2a  nterp,"0",(char*
19fe0 29 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  )0);.#endif.    
19ff0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a000 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
1a010 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20  (i=3; i+1<objc; 
1a020 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20  i+=2){.    zArg 
1a030 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1a040 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66  objv[i]);.    if
1a050 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
1a060 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20  key")==0 ){.#if 
1a070 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
1a080 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65  AS_CODEC) && !de
1a090 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1a0a0 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c  T_CODEC_FROM_TCL
1a0b0 29 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54  ).      pKey = T
1a0c0 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1a0d0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d  romObj(objv[i+1]
1a0e0 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66  , &nKey);.#endif
1a0f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1a100 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66  trcmp(zArg, "-vf
1a110 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
1a120 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  zVfs = Tcl_GetSt
1a130 72 69 6e 67 28 6f 62 6a 76 5b 69 2b 31 5d 29 3b  ring(objv[i+1]);
1a140 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1a150 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65  trcmp(zArg, "-re
1a160 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  adonly")==0 ){. 
1a170 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
1a180 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
1a190 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
1a1a0 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
1a1b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1a1c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
1a1d0 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
1a1e0 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
1a1f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1a200 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1a210 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  E);.        flag
1a220 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1a230 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
1a240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a250 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
1a260 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
1a270 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
1a280 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1a290 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DWRITE;.      }.
1a2a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1a2b0 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63 72 65  rcmp(zArg, "-cre
1a2c0 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ate")==0 ){.    
1a2d0 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
1a2e0 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
1a2f0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
1a300 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
1a310 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a320 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
1a330 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
1a340 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1a350 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1a360 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1a370 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
1a380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a390 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
1a3a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
1a3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1a3c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
1a3d0 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d  g, "-nomutex")==
1a3e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
1a3f0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
1a400 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
1a410 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
1a420 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  +1], &b) ) retur
1a430 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1a440 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20     if( b ){.    
1a450 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
1a460 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
1a470 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
1a480 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
1a490 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
1a4a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a4b0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
1a4c0 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
1a4d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1a4e0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
1a4f0 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78 22 29 3d  , "-fullmutex")=
1a500 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1a510 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
1a520 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
1a530 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1a540 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
1a550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a560 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
1a570 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
1a580 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
1a590 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TEX;.        fla
1a5a0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
1a5b0 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
1a5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a5d0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1a5e0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
1a5f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1a600 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1a610 41 72 67 2c 20 22 2d 75 72 69 22 29 3d 3d 30 20  Arg, "-uri")==0 
1a620 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
1a630 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
1a640 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
1a650 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
1a660 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
1a670 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
1a680 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
1a690 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
1a6a0 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20  E_OPEN_URI;.    
1a6b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a6c0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1a6d0 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20  E_OPEN_URI;.    
1a6e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1a6f0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
1a700 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
1a710 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22  nknown option: "
1a720 2c 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30  , zArg, (char*)0
1a730 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a740 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1a750 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c  .  }.  if( objc<
1a760 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31  3 || (objc&1)!=1
1a770 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1a780 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1a790 20 31 2c 20 6f 62 6a 76 2c 0a 20 20 20 20 20 20   1, objv,.      
1a7a0 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
1a7b0 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
1a7c0 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
1a7d0 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f  AN? ?-create BOO
1a7e0 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f  LEAN?".      " ?
1a7f0 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
1a800 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f  ? ?-fullmutex BO
1a810 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69 20 42 4f 4f  OLEAN? ?-uri BOO
1a820 4c 45 41 4e 3f 22 0a 23 69 66 20 64 65 66 69 6e  LEAN?".#if defin
1a830 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
1a840 44 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64  DEC) && !defined
1a850 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44  (SQLITE_OMIT_COD
1a860 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20  EC_FROM_TCL).   
1a870 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43     " ?-key CODEC
1a880 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20  KEY?".#endif.   
1a890 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   );.    return T
1a8a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a8b0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
1a8c0 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63   = (SqliteDb*)Tc
1a8d0 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
1a8e0 2a 70 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  *p) );.  memset(
1a8f0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
1a900 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  );.  zFile = Tcl
1a910 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
1a920 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
1a930 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61   zFile = Tcl_Tra
1a940 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69  nslateFileName(i
1a950 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74  nterp, zFile, &t
1a960 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
1a970 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
1a980 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65  e3_open_v2(zFile
1a990 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c  , &p->db, flags,
1a9a0 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53   zVfs);.  Tcl_DS
1a9b0 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73  tringFree(&trans
1a9c0 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
1a9d0 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20    if( p->db ){. 
1a9e0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1a9f0 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
1aa00 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
1aa10 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
1aa20 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1aa30 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1aa40 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
1aa50 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
1aa60 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  >db);.      p->d
1aa70 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  b = 0;.    }.  }
1aa80 65 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73  else{.    zErrMs
1aa90 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
1aaa0 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
1aab0 33 5f 65 72 72 73 74 72 28 72 63 29 29 3b 0a 20  3_errstr(rc));. 
1aac0 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   }.#if defined(S
1aad0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
1aae0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1aaf0 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
1ab00 52 4f 4d 5f 54 43 4c 29 0a 20 20 69 66 28 20 70  ROM_TCL).  if( p
1ab10 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
1ab20 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
1ab30 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a  Key, nKey);.  }.
1ab40 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
1ab50 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  db==0 ){.    Tcl
1ab60 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1ab70 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
1ab80 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54  VOLATILE);.    T
1ab90 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
1aba0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1abb0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
1abc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1abd0 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78  OR;.  }.  p->max
1abe0 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41  Stmt = NUM_PREPA
1abf0 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e  RED_STMTS;.  p->
1ac00 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67  openFlags = flag
1ac10 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1ac20 55 52 49 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70  URI;.  p->interp
1ac30 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72   = interp;.  zAr
1ac40 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
1ac50 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
1ac60 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62 55 73  , 0);.  if( DbUs
1ac70 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 54 63  eNre() ){.    Tc
1ac80 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e  l_NRCreateComman
1ac90 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20  d(interp, zArg, 
1aca0 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72 2c  DbObjCmdAdaptor,
1acb0 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20 20 20   DbObjCmd,.     
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44     (char*)p, DbD
1ace0 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 65 6c  eleteCmd);.  }el
1acf0 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  se{.    Tcl_Crea
1ad00 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
1ad10 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a  erp, zArg, DbObj
1ad20 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44  Cmd, (char*)p, D
1ad30 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d  bDeleteCmd);.  }
1ad40 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1ad50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  ;.}../*.** Provi
1ad60 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49  de a dummy Tcl_I
1ad70 6e 69 74 53 74 75 62 73 20 69 66 20 77 65 20 61  nitStubs if we a
1ad80 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 61 73  re using this as
1ad90 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62   a static.** lib
1ada0 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rary..*/.#ifndef
1adb0 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23   USE_TCL_STUBS.#
1adc0 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74   undef  Tcl_Init
1add0 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54  Stubs.# define T
1ade0 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62  cl_InitStubs(a,b
1adf0 2c 63 29 20 54 43 4c 5f 56 45 52 53 49 4f 4e 0a  ,c) TCL_VERSION.
1ae00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1ae10 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
1ae20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  a PACKAGE_VERSIO
1ae30 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  N macro defined.
1ae40 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a    This will be.*
1ae50 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61  * defined automa
1ae60 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54  tically by the T
1ae70 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75  EA makefile.  Bu
1ae80 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65  t other makefile
1ae90 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69  s.** do not defi
1aea0 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ne it..*/.#ifnde
1aeb0 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  f PACKAGE_VERSIO
1aec0 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41  N.# define PACKA
1aed0 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54  GE_VERSION SQLIT
1aee0 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66  E_VERSION.#endif
1aef0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1af00 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
1af10 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d  **.** This Tcl m
1af20 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f  odule contains o
1af30 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  nly a single new
1af40 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
1af50 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20  ed "sqlite"..** 
1af60 28 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20  (Hence there is 
1af70 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54  no namespace.  T
1af80 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1af90 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65   in using a name
1afa0 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20  space.** if the 
1afb0 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73  extension only s
1afc0 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20  upplies one new 
1afd0 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c  name!)  The "sql
1afe0 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a  ite" command is.
1aff0 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  ** used to open 
1b000 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74  a new SQLite dat
1b010 61 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20  abase.  See the 
1b020 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65  DbMain() routine
1b030 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64   above.** for ad
1b040 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1b050 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1b060 45 58 54 45 52 4e 20 6d 61 63 72 6f 73 20 61 72  EXTERN macros ar
1b070 65 20 72 65 71 75 69 72 65 64 20 62 79 20 54 43  e required by TC
1b080 4c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  L in order to wo
1b090 72 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a  rk on windows..*
1b0a0 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  /.EXTERN int Sql
1b0b0 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
1b0c0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
1b0d0 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 49 6e   int rc = Tcl_In
1b0e0 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
1b0f0 22 38 2e 34 22 2c 20 30 29 20 3f 20 54 43 4c 5f  "8.4", 0) ? TCL_
1b100 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  OK : TCL_ERROR;.
1b110 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
1b120 20 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   ){.    Tcl_Crea
1b130 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
1b140 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
1b150 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
1b160 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a  )DbMain, 0, 0);.
1b170 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33  #ifndef SQLITE_3
1b180 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20 20 20  _SUFFIX_ONLY.   
1b190 20 2f 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22   /* The "sqlite"
1b1a0 20 61 6c 69 61 73 20 69 73 20 75 6e 64 6f 63 75   alias is undocu
1b1b0 6d 65 6e 74 65 64 2e 20 20 49 74 20 69 73 20 68  mented.  It is h
1b1c0 65 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70  ere only to supp
1b1d0 6f 72 74 0a 20 20 20 20 2a 2a 20 6c 65 67 61 63  ort.    ** legac
1b1e0 79 20 73 63 72 69 70 74 73 2e 20 20 41 6c 6c 20  y scripts.  All 
1b1f0 6e 65 77 20 73 63 72 69 70 74 73 20 73 68 6f 75  new scripts shou
1b200 6c 64 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ld use only the 
1b210 22 73 71 6c 69 74 65 33 22 0a 20 20 20 20 2a 2a  "sqlite3".    **
1b220 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20 20 20   command. */.   
1b230 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
1b240 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
1b250 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
1b260 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
1b270 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
1b280 20 20 20 72 63 20 3d 20 54 63 6c 5f 50 6b 67 50     rc = Tcl_PkgP
1b290 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
1b2a0 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47  sqlite3", PACKAG
1b2b0 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a  E_VERSION);.  }.
1b2c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 45    return rc;.}.E
1b2d0 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
1b2e0 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
1b2f0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
1b300 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
1b310 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58  it(interp); }.EX
1b320 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
1b330 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
1b340 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1b350 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
1b360 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
1b370 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55  int Tclsqlite3_U
1b380 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
1b390 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
1b3a0 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
1b3b0 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63 61 75  _OK; }../* Becau
1b3c0 73 65 20 69 74 20 61 63 63 65 73 73 65 73 20 74  se it accesses t
1b3d0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61  he file-system a
1b3e0 6e 64 20 75 73 65 73 20 70 65 72 73 69 73 74 65  nd uses persiste
1b3f0 6e 74 20 73 74 61 74 65 2c 20 53 51 4c 69 74 65  nt state, SQLite
1b400 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
1b410 64 65 72 65 64 20 61 70 70 72 6f 70 72 69 61 74  dered appropriat
1b420 65 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65 72  e for safe inter
1b430 70 72 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  preters.  Hence,
1b440 20 77 65 20 63 61 75 73 65 0a 2a 2a 20 74 68 65   we cause.** the
1b450 20 5f 53 61 66 65 49 6e 69 74 28 29 20 69 6e 74   _SafeInit() int
1b460 65 72 66 61 63 65 73 20 72 65 74 75 72 6e 20 54  erfaces return T
1b470 43 4c 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 45 58 54  CL_ERROR..*/.EXT
1b480 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
1b490 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
1b4a0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
1b4b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20  turn TCL_ERROR; 
1b4c0 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c  }.EXTERN int Sql
1b4d0 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28  ite3_SafeUnload(
1b4e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b4f0 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 72  rp, int flags){r
1b500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b510 7d 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }....#ifndef SQL
1b520 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c  ITE_3_SUFFIX_ONL
1b530 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69  Y.int Sqlite_Ini
1b540 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1b550 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
1b560 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
1b570 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c  p); }.int Tclsql
1b580 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
1b590 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
1b5a0 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
1b5b0 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74  t(interp); }.int
1b5c0 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54   Sqlite_Unload(T
1b5d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b5e0 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
1b5f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
1b600 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e  int Tclsqlite_Un
1b610 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
1b620 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
1b630 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
1b640 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK; }.#endif../*
1b650 0a 2a 2a 20 49 66 20 74 68 65 20 54 43 4c 53 48  .** If the TCLSH
1b660 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
1b670 64 2c 20 61 64 64 20 63 6f 64 65 20 74 6f 20 6d  d, add code to m
1b680 61 6b 65 20 61 20 73 74 61 6e 64 2d 61 6c 6f 6e  ake a stand-alon
1b690 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 23 69  e program..*/.#i
1b6a0 66 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29  f defined(TCLSH)
1b6b0 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65  ../* This is the
1b6c0 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66 6f   main routine fo
1b6d0 72 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 54 43  r an ordinary TC
1b6e0 4c 20 73 68 65 6c 6c 2e 20 20 49 66 20 74 68 65  L shell.  If the
1b6f0 72 65 20 61 72 65 0a 2a 2a 20 61 72 65 20 61 72  re are.** are ar
1b700 67 75 6d 65 6e 74 73 2c 20 72 75 6e 20 74 68 65  guments, run the
1b710 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1b720 61 73 20 61 20 73 63 72 69 70 74 2e 20 20 4f 74  as a script.  Ot
1b730 68 65 72 77 69 73 65 2c 0a 2a 2a 20 72 65 61 64  herwise,.** read
1b740 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 72   TCL commands fr
1b750 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  om standard inpu
1b760 74 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  t.*/.static cons
1b770 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61  t char *tclsh_ma
1b780 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20  in_loop(void){. 
1b790 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b7a0 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d  ar zMainloop[] =
1b7b0 0a 20 20 20 20 22 69 66 20 7b 5b 6c 6c 65 6e 67  .    "if {[lleng
1b7c0 74 68 20 24 61 72 67 76 5d 3e 3d 31 7d 20 7b 5c  th $argv]>=1} {\
1b7d0 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 61 72  n".      "set ar
1b7e0 67 76 30 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  gv0 [lindex $arg
1b7f0 76 20 30 5d 5c 6e 22 0a 20 20 20 20 20 20 22 73  v 0]\n".      "s
1b800 65 74 20 61 72 67 76 20 5b 6c 72 61 6e 67 65 20  et argv [lrange 
1b810 24 61 72 67 76 20 31 20 65 6e 64 5d 5c 6e 22 0a  $argv 1 end]\n".
1b820 20 20 20 20 20 20 22 73 6f 75 72 63 65 20 24 61        "source $a
1b830 72 67 76 30 5c 6e 22 0a 20 20 20 20 22 7d 20 65  rgv0\n".    "} e
1b840 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
1b850 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
1b860 20 20 20 20 20 22 77 68 69 6c 65 20 7b 21 5b 65       "while {![e
1b870 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a  of stdin]} {\n".
1b880 20 20 20 20 20 20 20 20 22 69 66 20 7b 24 6c 69          "if {$li
1b890 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  ne!=\"\"} {\n". 
1b8a0 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d           "puts -
1b8b0 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22  nonewline \"> \"
1b8c0 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 20 65  \n".        "} e
1b8d0 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  lse {\n".       
1b8e0 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c     "puts -nonewl
1b8f0 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20  ine \"% \"\n".  
1b900 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
1b910 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75      "flush stdou
1b920 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 61 70  t\n".        "ap
1b930 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20  pend line [gets 
1b940 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 20 20  stdin]\n".      
1b950 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d    "if {[info com
1b960 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c  plete $line]} {\
1b970 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22 69 66  n".          "if
1b980 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
1b990 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75  l #0 $line} resu
1b9a0 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  lt]} {\n".      
1b9b0 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65        "puts stde
1b9c0 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73  rr \"Error: $res
1b9d0 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20  ult\"\n".       
1b9e0 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72     "} elseif {$r
1b9f0 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  esult!=\"\"} {\n
1ba00 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 70  ".            "p
1ba10 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20  uts $result\n". 
1ba20 20 20 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20           "}\n". 
1ba30 20 20 20 20 20 20 20 20 20 22 73 65 74 20 6c 69           "set li
1ba40 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20 20  ne {}\n".       
1ba50 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
1ba60 20 20 20 20 20 20 20 20 22 61 70 70 65 6e 64 20          "append 
1ba70 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20  line \\n\n".    
1ba80 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
1ba90 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  "}\n".    "}\n".
1baa0 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4d 61    ;.  return zMa
1bab0 69 6e 6c 6f 6f 70 3b 0a 7d 0a 0a 23 64 65 66 69  inloop;.}..#defi
1bac0 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
1bad0 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
1bae0 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
1baf0 61 70 70 20 2a 2f 0a 69 6e 74 20 53 51 4c 49 54  app */.int SQLIT
1bb00 45 5f 43 44 45 43 4c 20 54 43 4c 53 48 5f 4d 41  E_CDECL TCLSH_MA
1bb10 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  IN(int argc, cha
1bb20 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c  r **argv){.  Tcl
1bb30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
1bb40 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
1bb50 74 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 20  t char *zScript 
1bb60 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 41 72 67  = 0;.  char zArg
1bb70 63 5b 33 32 5d 3b 0a 23 69 66 20 64 65 66 69 6e  c[32];.#if defin
1bb80 65 64 28 54 43 4c 53 48 5f 49 4e 49 54 5f 50 52  ed(TCLSH_INIT_PR
1bb90 4f 43 29 0a 20 20 65 78 74 65 72 6e 20 63 6f 6e  OC).  extern con
1bba0 73 74 20 63 68 61 72 20 2a 54 43 4c 53 48 5f 49  st char *TCLSH_I
1bbb0 4e 49 54 5f 50 52 4f 43 28 54 63 6c 5f 49 6e 74  NIT_PROC(Tcl_Int
1bbc0 65 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  erp*);.#endif..#
1bbd0 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  if !defined(_WIN
1bbe0 33 32 5f 57 43 45 29 0a 20 20 69 66 28 20 67 65  32_WCE).  if( ge
1bbf0 74 65 6e 76 28 22 42 52 45 41 4b 22 29 20 29 7b  tenv("BREAK") ){
1bc00 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1bc10 65 72 72 2c 0a 20 20 20 20 20 20 20 20 22 61 74  err,.        "at
1bc20 74 61 63 68 20 64 65 62 75 67 67 65 72 20 74 6f  tach debugger to
1bc30 20 70 72 6f 63 65 73 73 20 25 64 20 61 6e 64 20   process %d and 
1bc40 70 72 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f  press any key to
1bc50 20 63 6f 6e 74 69 6e 75 65 2e 5c 6e 22 2c 0a 20   continue.\n",. 
1bc60 20 20 20 20 20 20 20 47 45 54 50 49 44 28 29 29         GETPID())
1bc70 3b 0a 20 20 20 20 66 67 65 74 63 28 73 74 64 69  ;.    fgetc(stdi
1bc80 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
1bc90 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65    /* Call sqlite
1bca0 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63  3_shutdown() onc
1bcb0 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  e before doing a
1bcc0 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68  nything else. Th
1bcd0 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65  is is to.  ** te
1bce0 73 74 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  st that sqlite3_
1bcf0 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62  shutdown() can b
1bd00 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20  e safely called 
1bd10 62 79 20 61 20 70 72 6f 63 65 73 73 20 62 65 66  by a process bef
1bd20 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ore.  ** sqlite3
1bd30 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73  _initialize() is
1bd40 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
1bd50 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54 63  hutdown();..  Tc
1bd60 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
1bd70 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 54 63 6c  (argv[0]);.  Tcl
1bd80 5f 53 65 74 53 79 73 74 65 6d 45 6e 63 6f 64 69  _SetSystemEncodi
1bd90 6e 67 28 4e 55 4c 4c 2c 20 22 75 74 66 2d 38 22  ng(NULL, "utf-8"
1bda0 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
1bdb0 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
1bdc0 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  ;.  Sqlite3_Init
1bdd0 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 73 71 6c  (interp);..  sql
1bde0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1bdf0 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41 72  zeof(zArgc), zAr
1be00 67 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d 31  gc, "%d", argc-1
1be10 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 28  );.  Tcl_SetVar(
1be20 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a  interp,"argc", z
1be30 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  Argc, TCL_GLOBAL
1be40 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 53 65  _ONLY);.  Tcl_Se
1be50 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
1be60 76 30 22 2c 61 72 67 76 5b 30 5d 2c 54 43 4c 5f  v0",argv[0],TCL_
1be70 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
1be80 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
1be90 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43  p,"argv", "", TC
1bea0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1beb0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
1bec0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  c; i++){.    Tcl
1bed0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _SetVar(interp, 
1bee0 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c  "argv", argv[i],
1bef0 0a 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f  .        TCL_GLO
1bf00 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c  BAL_ONLY | TCL_L
1bf10 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43  IST_ELEMENT | TC
1bf20 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b  L_APPEND_VALUE);
1bf30 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
1bf40 28 54 43 4c 53 48 5f 49 4e 49 54 5f 50 52 4f 43  (TCLSH_INIT_PROC
1bf50 29 0a 20 20 7a 53 63 72 69 70 74 20 3d 20 54 43  ).  zScript = TC
1bf60 4c 53 48 5f 49 4e 49 54 5f 50 52 4f 43 28 69 6e  LSH_INIT_PROC(in
1bf70 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  terp);.#endif.  
1bf80 69 66 28 20 7a 53 63 72 69 70 74 3d 3d 30 20 29  if( zScript==0 )
1bf90 7b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20  {.    zScript = 
1bfa0 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28  tclsh_main_loop(
1bfb0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  );.  }.  if( Tcl
1bfc0 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65  _GlobalEval(inte
1bfd0 72 70 2c 20 7a 53 63 72 69 70 74 29 21 3d 54 43  rp, zScript)!=TC
1bfe0 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  L_OK ){.    cons
1bff0 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20  t char *zInfo = 
1c000 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72  Tcl_GetVar(inter
1c010 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20  p, "errorInfo", 
1c020 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
1c030 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d  ;.    if( zInfo=
1c040 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c  =0 ) zInfo = Tcl
1c050 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
1c060 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 66 70  (interp);.    fp
1c070 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
1c080 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20  : %s\n", *argv, 
1c090 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75  zInfo);.    retu
1c0a0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
1c0b0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1c0c0 2a 20 54 43 4c 53 48 20 2a 2f 0a                 * TCLSH */.