SQLite
Hex Artifact Content
Not logged in

Artifact 1833388c01e3b77f4c712185ee7250b9423ee0981ce6ae7e401e47db0319a696:


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 64 65 66 69 6e 65  MATION.#  define
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 69 6e 63 6c 75 64 65 20  MEAN.#  include 
0700: 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 20 65 6e  <windows.h>.# en
0710: 64 69 66 0a 23 20 64 65 66 69 6e 65 20 47 45 54  dif.# define GET
0720: 50 49 44 20 28 69 6e 74 29 47 65 74 43 75 72 72  PID (int)GetCurr
0730: 65 6e 74 50 72 6f 63 65 73 73 49 64 0a 23 65 6e  entProcessId.#en
0740: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57 69 6e 64 6f  dif../*. * Windo
0750: 77 73 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77  ws needs to know
0760: 20 77 68 69 63 68 20 73 79 6d 62 6f 6c 73 20 74   which symbols t
0770: 6f 20 65 78 70 6f 72 74 2e 20 20 55 6e 69 78 20  o export.  Unix 
0780: 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a 20 42 55 49  does not.. * BUI
0790: 4c 44 5f 73 71 6c 69 74 65 20 73 68 6f 75 6c 64  LD_sqlite should
07a0: 20 62 65 20 75 6e 64 65 66 69 6e 65 64 20 66 6f   be undefined fo
07b0: 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a 23 69 66 64  r Unix.. */.#ifd
07c0: 65 66 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 0a  ef BUILD_sqlite.
07d0: 23 75 6e 64 65 66 20 54 43 4c 5f 53 54 4f 52 41  #undef TCL_STORA
07e0: 47 45 5f 43 4c 41 53 53 0a 23 64 65 66 69 6e 65  GE_CLASS.#define
07f0: 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f 43 4c 41   TCL_STORAGE_CLA
0800: 53 53 20 44 4c 4c 45 58 50 4f 52 54 0a 23 65 6e  SS DLLEXPORT.#en
0810: 64 69 66 20 2f 2a 20 42 55 49 4c 44 5f 73 71 6c  dif /* BUILD_sql
0820: 69 74 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ite */..#define 
0830: 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  NUM_PREPARED_STM
0840: 54 53 20 31 30 0a 23 64 65 66 69 6e 65 20 4d 41  TS 10.#define MA
0850: 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  X_PREPARED_STMTS
0860: 20 31 30 30 0a 0a 2f 2a 20 46 6f 72 77 61 72 64   100../* Forward
0870: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
0880: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0890: 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44 62  qliteDb SqliteDb
08a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c  ;../*.** New SQL
08b0: 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62   functions can b
08c0: 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c  e created as TCL
08d0: 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20   scripts.  Each 
08e0: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  such function.**
08f0: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
0900: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0910: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0920: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
0930: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 46 75  def struct SqlFu
0940: 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74 72 75  nc SqlFunc;.stru
0950: 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20 20 54  ct SqlFunc {.  T
0960: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0970: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
0980: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
0990: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
09a0: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  n */.  Tcl_Obj *
09b0: 70 53 63 72 69 70 74 3b 20 20 20 20 20 2f 2a 20  pScript;     /* 
09c0: 54 68 65 20 54 63 6c 5f 4f 62 6a 20 72 65 70 72  The Tcl_Obj repr
09d0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
09e0: 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71  e script */.  Sq
09f0: 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20  liteDb *pDb;    
0a00: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
0a10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
0a20: 6f 77 6e 73 20 74 68 69 73 20 66 75 6e 63 74 69  owns this functi
0a30: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45  on */.  int useE
0a40: 76 61 6c 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a  valObjv;      /*
0a50: 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20 73   True if it is s
0a60: 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45  afe to use Tcl_E
0a70: 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61  valObjv */.  cha
0a80: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
0a90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
0aa0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
0ab0: 20 53 71 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b   SqlFunc *pNext;
0ac0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
0ad0: 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c  unction on the l
0ae0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
0af0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77  */.};../*.** New
0b00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0b10: 6e 63 65 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  nces function ca
0b20: 6e 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20  n be created as 
0b30: 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61  TCL scripts.  Ea
0b40: 63 68 20 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74  ch such.** funct
0b50: 69 6f 6e 20 69 73 20 64 65 73 63 72 69 62 65 64  ion is described
0b60: 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   by an instance 
0b70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0b80: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74   structure..*/.t
0b90: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71  ypedef struct Sq
0ba0: 6c 43 6f 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c  lCollate SqlColl
0bb0: 61 74 65 3b 0a 73 74 72 75 63 74 20 53 71 6c 43  ate;.struct SqlC
0bc0: 6f 6c 6c 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49  ollate {.  Tcl_I
0bd0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20  nterp *interp;  
0be0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
0bf0: 72 70 72 65 74 20 74 6f 20 65 78 65 63 75 74 65  rpret to execute
0c00: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
0c10: 0a 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74  .  char *zScript
0c20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
0c30: 73 63 72 69 70 74 20 74 6f 20 62 65 20 72 75 6e  script to be run
0c40: 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65   */.  SqlCollate
0c50: 20 2a 70 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e   *pNext;    /* N
0c60: 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  ext function on 
0c70: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  the list of them
0c80: 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   all */.};../*.*
0c90: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
0ca0: 6d 65 6e 74 73 20 61 72 65 20 63 61 63 68 65 64  ments are cached
0cb0: 20 66 6f 72 20 66 61 73 74 65 72 20 65 78 65 63   for faster exec
0cc0: 75 74 69 6f 6e 2e 20 20 45 61 63 68 20 70 72 65  ution.  Each pre
0cd0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
0ce0: 6e 74 20 69 73 20 64 65 73 63 72 69 62 65 64 20  nt is described 
0cf0: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0d00: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0d10: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0d20: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0d30: 50 72 65 70 61 72 65 64 53 74 6d 74 20 53 71 6c  PreparedStmt Sql
0d40: 50 72 65 70 61 72 65 64 53 74 6d 74 3b 0a 73 74  PreparedStmt;.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 7b 0a 20 20 53 71 6c 50 72 65 70  Stmt {.  SqlPrep
0d70: 61 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b  aredStmt *pNext;
0d80: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e    /* Next in lin
0d90: 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71  ked list */.  Sq
0da0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
0db0: 50 72 65 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f  Prev;  /* Previo
0dc0: 75 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a  us on the list *
0dd0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
0de0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
0df0: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0e00: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
0e10: 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nSql;           
0e20: 20 20 20 20 20 2f 2a 20 63 68 61 72 73 20 69 6e       /* chars in
0e30: 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e   zSql[] */.  con
0e40: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20  st char *zSql;  
0e50: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
0e60: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0e70: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72  nt */.  int nPar
0e80: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
0e90: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 50 61   /* Size of apPa
0ea0: 72 6d 20 61 72 72 61 79 20 2a 2f 0a 20 20 54 63  rm array */.  Tc
0eb0: 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20  l_Obj **apParm; 
0ec0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
0ed0: 6f 66 20 72 65 66 65 72 65 6e 63 65 64 20 6f 62  of referenced ob
0ee0: 6a 65 63 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f  ject pointers */
0ef0: 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72  .};..typedef str
0f00: 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  uct IncrblobChan
0f10: 6e 65 6c 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  nel IncrblobChan
0f20: 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72  nel;../*.** Ther
0f30: 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
0f40: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
0f50: 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c  ure for each SQL
0f60: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ite database.** 
0f70: 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70  that has been op
0f80: 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  ened by the SQLi
0f90: 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  te TCL interface
0fa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
0fb0: 6d 6f 64 75 6c 65 20 69 73 20 62 75 69 6c 74 20  module is built 
0fc0: 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
0fd0: 20 64 65 66 69 6e 65 64 20 28 74 6f 20 63 72 65   defined (to cre
0fe0: 61 74 65 20 74 68 65 20 53 51 4c 69 74 65 0a 2a  ate the SQLite.*
0ff0: 2a 20 74 65 73 74 66 69 78 74 75 72 65 20 65 78  * testfixture ex
1000: 65 63 75 74 61 62 6c 65 29 2c 20 74 68 65 6e 20  ecutable), then 
1010: 69 74 20 6d 61 79 20 62 65 20 63 6f 6e 66 69 67  it may be config
1020: 75 72 65 64 20 74 6f 20 75 73 65 20 65 69 74 68  ured to use eith
1030: 65 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72  er.** sqlite3_pr
1040: 65 70 61 72 65 5f 76 32 28 29 20 6f 72 20 73 71  epare_v2() or sq
1050: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
1060: 74 6f 20 70 72 65 70 61 72 65 20 53 51 4c 20 73  to prepare SQL s
1070: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66  tatements..** If
1080: 20 53 71 6c 69 74 65 44 62 2e 62 4c 65 67 61 63   SqliteDb.bLegac
1090: 79 50 72 65 70 61 72 65 20 69 73 20 74 72 75 65  yPrepare is true
10a0: 2c 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  , sqlite3_prepar
10b0: 65 28 29 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  e() is used..*/.
10c0: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20  struct SqliteDb 
10d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10f0: 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74  * The "real" dat
1100: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
1110: 20 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a   MUST BE FIRST *
1120: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1130: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f  interp;        /
1140: 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65  * The interprete
1150: 72 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  r used for this 
1160: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
1170: 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20  ar *zBusy;      
1180: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1190: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f  busy callback ro
11a0: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
11b0: 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  *zCommit;       
11c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
11d0: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
11e0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
11f0: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
1200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1210: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
1220: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
1230: 72 20 2a 7a 54 72 61 63 65 56 32 3b 20 20 20 20  r *zTraceV2;    
1240: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1250: 72 61 63 65 5f 76 32 20 63 61 6c 6c 62 61 63 6b  race_v2 callback
1260: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
1270: 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20 20  ar *zProfile;   
1280: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1290: 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63 6b  profile callback
12a0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
12b0: 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20  ar *zProgress;  
12c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12d0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
12e0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
12f0: 68 61 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20  har *zAuth;     
1300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1310: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
1320: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
1330: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61 62 6c 65  */.  int disable
1340: 41 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Auth;           
1350: 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 61  /* Disable the a
1360: 75 74 68 6f 72 69 7a 65 72 20 69 66 20 69 74 20  uthorizer if it 
1370: 65 78 69 73 74 73 20 2a 2f 0a 20 20 63 68 61 72  exists */.  char
1380: 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20   *zNull;        
1390: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
13a0: 6f 20 73 75 62 73 74 69 74 75 74 65 20 66 6f 72  o substitute for
13b0: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c   an SQL NULL val
13c0: 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20  ue */.  SqlFunc 
13d0: 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20  *pFunc;         
13e0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51     /* List of SQ
13f0: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  L functions */. 
1400: 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74   Tcl_Obj *pUpdat
1410: 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55  eHook;      /* U
1420: 70 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70  pdate hook scrip
1430: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
1440: 54 63 6c 5f 4f 62 6a 20 2a 70 50 72 65 55 70 64  Tcl_Obj *pPreUpd
1450: 61 74 65 48 6f 6f 6b 3b 20 20 20 2f 2a 20 50 72  ateHook;   /* Pr
1460: 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  e-update hook sc
1470: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1480: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c  .  Tcl_Obj *pRol
1490: 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a  lbackHook;    /*
14a0: 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73   Rollback hook s
14b0: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
14c0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57 61  /.  Tcl_Obj *pWa
14d0: 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f  lHook;         /
14e0: 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69 70  * WAL hook scrip
14f0: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
1500: 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b  Tcl_Obj *pUnlock
1510: 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e  Notify;    /* Un
1520: 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69  lock notify scri
1530: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
1540: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
1550: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
1560: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
1570: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
1580: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
15b0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
15c0: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
15d0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
15e0: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
15f0: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
1600: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
1610: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
1620: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
1630: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
1640: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
1650: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
1660: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
1670: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
1680: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
1690: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
16a0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
16b0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
16c0: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
16d0: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16f0: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
1700: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
1710: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1720: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
1730: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1740: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1750: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  annels */.  int 
1760: 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e 49  nStep, nSort, nI
1770: 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61 74 69 73  ndex;  /* Statis
1780: 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65  tics for most re
1790: 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  cent operation *
17a0: 2f 0a 20 20 69 6e 74 20 6e 56 4d 53 74 65 70 3b  /.  int nVMStep;
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17c0: 2a 20 41 6e 6f 74 68 65 72 20 73 74 61 74 69 73  * Another statis
17d0: 74 69 63 20 66 6f 72 20 6d 6f 73 74 20 72 65 63  tic for most rec
17e0: 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ent operation */
17f0: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63 74  .  int nTransact
1800: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
1810: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74 65   Number of neste
1820: 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d 20  d [transaction] 
1830: 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 69 6e 74  methods */.  int
1840: 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20   openFlags;     
1850: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1860: 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 2e 20 20   used to open.  
1870: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  (SQLITE_OPEN_URI
1880: 29 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ) */.#ifdef SQLI
1890: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 62 4c  TE_TEST.  int bL
18a0: 65 67 61 63 79 50 72 65 70 61 72 65 3b 20 20 20  egacyPrepare;   
18b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
18c0: 75 73 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70  use sqlite3_prep
18d0: 61 72 65 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  are() */.#endif.
18e0: 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63 72 62  };..struct Incrb
18f0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20 20 73  lobChannel {.  s
1900: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
1910: 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  ob;      /* sqli
1920: 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20  te3 blob handle 
1930: 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  */.  SqliteDb *p
1940: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1950: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
1960: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1970: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65 6b 3b   */.  int iSeek;
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65 6b 20  /* Current seek 
19a0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63 6c 5f  offset */.  Tcl_
19b0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
19c0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e 65 6c        /* Channel
19d0: 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20   identifier */. 
19e0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
19f0: 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4c 69   *pNext;   /* Li
1a00: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c  nked list of all
1a10: 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63   open incrblob c
1a20: 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49 6e 63  hannels */.  Inc
1a30: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 50  rblobChannel *pP
1a40: 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64  rev;   /* Linked
1a50: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65   list of all ope
1a60: 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  n incrblob chann
1a70: 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  els */.};../*.**
1a80: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
1a90: 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73  g length that is
1aa0: 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74   limited to what
1ab0: 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
1ac0: 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69  n.** lower 30 bi
1ad0: 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73  ts of a 32-bit s
1ae0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
1af0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
1b00: 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68 61 72  len30(const char
1b10: 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   *z){.  const ch
1b20: 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68  ar *z2 = z;.  wh
1b30: 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b  ile( *z2 ){ z2++
1b40: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 78 33  ; }.  return 0x3
1b50: 66 66 66 66 66 66 66 20 26 20 28 69 6e 74 29 28  fffffff & (int)(
1b60: 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 0a 23 69 66  z2 - z);.}...#if
1b70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b80: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
1b90: 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62 6c  Close all incrbl
1ba0: 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65 6e  ob channels open
1bb0: 65 64 20 75 73 69 6e 67 20 64 61 74 61 62 61 73  ed using databas
1bc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62  e connection pDb
1bd0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  ..** This is cal
1be0: 6c 65 64 20 77 68 65 6e 20 73 68 75 74 74 69 6e  led when shuttin
1bf0: 67 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62  g down the datab
1c00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1c10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1c20: 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  loseIncrblobChan
1c30: 6e 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a 70  nels(SqliteDb *p
1c40: 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  Db){.  IncrblobC
1c50: 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e 63  hannel *p;.  Inc
1c60: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e  rblobChannel *pN
1c70: 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 44  ext;..  for(p=pD
1c80: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70 3b  b->pIncrblob; p;
1c90: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
1ca0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
1cb0: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 43  ..    /* Note: C
1cc0: 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74 65  alling unregiste
1cd0: 72 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c 5f  r here call Tcl_
1ce0: 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e 63  Close on the inc
1cf0: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 0a 20  rblob channel,. 
1d00: 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65 6c 65     ** which dele
1d10: 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  tes the Incrblob
1d20: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
1d30: 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e  e at *p. So do n
1d40: 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54  ot.    ** call T
1d50: 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65 2e 0a  cl_Free() here..
1d60: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55      */.    Tcl_U
1d70: 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c  nregisterChannel
1d80: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d  (pDb->interp, p-
1d90: 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d  >channel);.  }.}
1da0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1db0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
1dc0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
1dd0: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1de0: 54 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 43  TCLAPI incrblobC
1df0: 6c 6f 73 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  lose(.  ClientDa
1e00: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
1e10: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e20: 6e 74 65 72 70 0a 29 7b 0a 20 20 49 6e 63 72 62  nterp.){.  Incrb
1e30: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
1e40: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
1e50: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
1e60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
1e70: 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
1e80: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71 6c 69  ->pBlob);.  sqli
1e90: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 44 62  te3 *db = p->pDb
1ea0: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ->db;..  /* Remo
1eb0: 76 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 66  ve the channel f
1ec0: 72 6f 6d 20 74 68 65 20 53 71 6c 69 74 65 44 62  rom the SqliteDb
1ed0: 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e  .pIncrblob list.
1ee0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65   */.  if( p->pNe
1ef0: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
1f00: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
1f10: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Prev;.  }.  if( 
1f20: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
1f30: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
1f40: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
1f50: 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 70 49    if( p->pDb->pI
1f60: 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20  ncrblob==p ){.  
1f70: 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62    p->pDb->pIncrb
1f80: 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  lob = p->pNext;.
1f90: 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74    }..  /* Free t
1fa0: 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  he IncrblobChann
1fb0: 65 6c 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  el structure */.
1fc0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
1fd0: 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63   *)p);..  if( rc
1fe0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ff0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
2000: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2010: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
2020: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
2030: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
2040: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2050: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2060: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
2070: 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72 65 6d  a from an increm
2080: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
2090: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
20a0: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
20b0: 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20  incrblobInput(. 
20c0: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
20d0: 61 6e 63 65 44 61 74 61 2c 0a 20 20 63 68 61 72  anceData,.  char
20e0: 20 2a 62 75 66 2c 0a 20 20 69 6e 74 20 62 75 66   *buf,.  int buf
20f0: 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Size,.  int *err
2100: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
2110: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2120: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
2130: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
2140: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ata;.  int nRead
2150: 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20 20   = bufSize;     
2160: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2170: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
2180: 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20  /.  int nBlob;  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
21b0: 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20  f the blob */.  
21c0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e0: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
21f0: 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20  e */..  nBlob = 
2200: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
2210: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  es(p->pBlob);.  
2220: 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52  if( (p->iSeek+nR
2230: 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ead)>nBlob ){.  
2240: 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d    nRead = nBlob-
2250: 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20  p->iSeek;.  }.  
2260: 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a  if( nRead<=0 ){.
2270: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2280: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
2290: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70  3_blob_read(p->p
22a0: 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75  Blob, (void *)bu
22b0: 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65  f, nRead, p->iSe
22c0: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
22d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22e0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
22f0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  rc;.    return -
2300: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
2310: 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72  ek += nRead;.  r
2320: 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a  eturn nRead;.}..
2330: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
2340: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
2350: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
2360: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
2370: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63  QLITE_TCLAPI inc
2380: 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20 20 43  rblobOutput(.  C
2390: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
23a0: 63 65 44 61 74 61 2c 0a 20 20 43 4f 4e 53 54 20  ceData,.  CONST 
23b0: 63 68 61 72 20 2a 62 75 66 2c 0a 20 20 69 6e 74  char *buf,.  int
23c0: 20 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74 20   toWrite,.  int 
23d0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
23e0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
23f0: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
2400: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
2410: 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e  nceData;.  int n
2420: 57 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b  Write = toWrite;
2430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2440: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
2450: 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c  ite */.  int nBl
2460: 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
2470: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
2480: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20  ize of the blob 
2490: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f    /* sqlite erro
24c0: 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c  r code */..  nBl
24d0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ob = sqlite3_blo
24e0: 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62  b_bytes(p->pBlob
24f0: 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65  );.  if( (p->iSe
2500: 65 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62  ek+nWrite)>nBlob
2510: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
2520: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
2530: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
2540: 20 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65 3c   }.  if( nWrite<
2550: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2560: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
2570: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
2580: 74 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f  te(p->pBlob, (vo
2590: 69 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74 65  id *)buf, nWrite
25a0: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
25b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25c0: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
25d0: 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20  dePtr = EIO;.   
25e0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
25f0: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e  .  p->iSeek += n
2600: 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
2610: 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nWrite;.}../*.**
2620: 20 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65   Seek an increme
2630: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
2640: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2650: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69   SQLITE_TCLAPI i
2660: 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43  ncrblobSeek(.  C
2670: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
2680: 63 65 44 61 74 61 2c 0a 20 20 6c 6f 6e 67 20 6f  ceData,.  long o
2690: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65  ffset,.  int see
26a0: 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72  kMode,.  int *er
26b0: 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20  rorCodePtr.){.  
26c0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
26d0: 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68  *p = (IncrblobCh
26e0: 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65  annel *)instance
26f0: 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28  Data;..  switch(
2700: 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20   seekMode ){.   
2710: 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a   case SEEK_SET:.
2720: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d        p->iSeek =
2730: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62   offset;.      b
2740: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2750: 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70  EEK_CUR:.      p
2760: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65  ->iSeek += offse
2770: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
2780: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e      case SEEK_EN
2790: 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  D:.      p->iSee
27a0: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  k = sqlite3_blob
27b0: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
27c0: 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   + offset;.     
27d0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
27e0: 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42  ault: assert(!"B
27f0: 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20  ad seekMode");. 
2800: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
2810: 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69  iSeek;.}...stati
2820: 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 54 43  c void SQLITE_TC
2830: 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 57 61 74  LAPI incrblobWat
2840: 63 68 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ch(.  ClientData
2850: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20   instanceData,. 
2860: 20 69 6e 74 20 6d 6f 64 65 0a 29 7b 0a 20 20 2f   int mode.){.  /
2870: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 7d 0a 73 74 61  * NO-OP */.}.sta
2880: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2890: 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 48 61  CLAPI incrblobHa
28a0: 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  ndle(.  ClientDa
28b0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
28c0: 0a 20 20 69 6e 74 20 64 69 72 2c 0a 20 20 43 6c  .  int dir,.  Cl
28d0: 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72 0a 29  ientData *hPtr.)
28e0: 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  {.  return TCL_E
28f0: 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RROR;.}..static 
2900: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20  Tcl_ChannelType 
2910: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54  IncrblobChannelT
2920: 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62  ype = {.  "incrb
2930: 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2950: 74 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20  typeName        
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48       */.  TCL_CH
2980: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c  ANNEL_VERSION_2,
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a0: 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20  version         
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
29d0: 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  obClose,        
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f0: 63 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20  closeProc       
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2a20: 6f 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20  obInput,        
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a40: 69 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20 20  inputProc       
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2a70: 6f 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20  obOutput,       
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a90: 6f 75 74 70 75 74 50 72 6f 63 20 20 20 20 20 20  outputProc      
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2ac0: 6f 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20  obSeek,         
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae0: 73 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20  seekProc        
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
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 2f 2a 20               /* 
2b30: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20  setOptionProc   
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b80: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20  getOptionProc   
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2bb0: 6f 62 57 61 74 63 68 2c 20 20 20 20 20 20 20 20  obWatch,        
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bd0: 77 61 74 63 68 50 72 6f 63 20 28 74 68 69 73 20  watchProc (this 
2be0: 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20  is a no-op)     
2bf0: 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c       */.  incrbl
2c00: 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20  obHandle,       
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c20: 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61  getHandleProc (a
2c30: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 72  lways returns er
2c40: 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20  ror) */.  0,    
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c70: 63 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20  close2Proc      
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cc0: 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20  blockModeProc   
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d10: 66 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20 20  flushProc       
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d60: 68 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20  handlerProc     
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20       */.  0,    
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2db0: 77 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20  wideSeekProc    
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a       */.};../*.*
2de0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
2df0: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  ncrblob channel.
2e00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2e10: 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61  reateIncrblobCha
2e20: 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65  nnel(.  Tcl_Inte
2e30: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 53 71  rp *interp,.  Sq
2e40: 6c 69 74 65 44 62 20 2a 70 44 62 2c 0a 20 20 63  liteDb *pDb,.  c
2e50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a  onst char *zDb,.
2e60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2e70: 61 62 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  able,.  const ch
2e80: 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 0a 20 20 73  ar *zColumn,.  s
2e90: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77  qlite_int64 iRow
2ea0: 2c 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ,.  int isReadon
2eb0: 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  ly.){.  Incrblob
2ec0: 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71  Channel *p;.  sq
2ed0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d  lite3 *db = pDb-
2ee0: 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  >db;.  sqlite3_b
2ef0: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
2f00: 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67  t rc;.  int flag
2f10: 73 20 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  s = TCL_READABLE
2f20: 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30  |(isReadonly ? 0
2f30: 20 3a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29   : TCL_WRITABLE)
2f40: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72  ;..  /* This var
2f50: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2f60: 20 6e 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65   name the channe
2f70: 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69  ls: "incrblob_[i
2f80: 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20  ncr count]" */. 
2f90: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e   static int coun
2fa0: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43  t = 0;.  char zC
2fb0: 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72  hannel[64];..  r
2fc0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
2fd0: 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a  _open(db, zDb, z
2fe0: 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
2ff0: 69 52 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c  iRow, !isReadonl
3000: 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66  y, &pBlob);.  if
3010: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3020: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
3030: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
3040: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
3050: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
3060: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
3070: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3080: 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49  R;.  }..  p = (I
3090: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
30a0: 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f  )Tcl_Alloc(sizeo
30b0: 66 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  f(IncrblobChanne
30c0: 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20  l));.  p->iSeek 
30d0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20  = 0;.  p->pBlob 
30e0: 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69  = pBlob;..  sqli
30f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
3100: 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a  eof(zChannel), z
3110: 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c  Channel, "incrbl
3120: 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29  ob_%d", ++count)
3130: 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d  ;.  p->channel =
3140: 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e   Tcl_CreateChann
3150: 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e  el(&IncrblobChan
3160: 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65  nelType, zChanne
3170: 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  l, p, flags);.  
3180: 54 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e  Tcl_RegisterChan
3190: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63  nel(interp, p->c
31a0: 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c  hannel);..  /* L
31b0: 69 6e 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e  ink the new chan
31c0: 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c  nel into the Sql
31d0: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
31e0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e  list. */.  p->pN
31f0: 65 78 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72  ext = pDb->pIncr
3200: 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76  blob;.  p->pPrev
3210: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70   = 0;.  if( p->p
3220: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
3230: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
3240: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63  .  }.  pDb->pInc
3250: 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e  rblob = p;.  p->
3260: 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63  pDb = pDb;..  Tc
3270: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
3280: 72 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f  rp, (char *)Tcl_
3290: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70  GetChannelName(p
32a0: 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f  ->channel), TCL_
32b0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74  VOLATILE);.  ret
32c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
32d0: 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61  lse  /* else cla
32e0: 75 73 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66  use for "#ifndef
32f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
3300: 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66  RBLOB" */.  #def
3310: 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  ine closeIncrblo
3320: 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23  bChannels(pDb).#
3330: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  endif../*.** Loo
3340: 6b 20 61 74 20 74 68 65 20 73 63 72 69 70 74 20  k at the script 
3350: 70 72 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20  prefix in pCmd. 
3360: 20 57 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63   We will be exec
3370: 75 74 69 6e 67 20 74 68 69 73 20 73 63 72 69 70  uting this scrip
3380: 74 0a 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74  t.** after first
3390: 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f   appending one o
33a0: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
33b0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
33c0: 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20  analyzes.** the 
33d0: 73 63 72 69 70 74 20 74 6f 20 73 65 65 20 69 66  script to see if
33e0: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75   it is safe to u
33f0: 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  se Tcl_EvalObjv(
3400: 29 20 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a  ) on the script.
3410: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74  ** rather than t
3420: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
3430: 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54  Tcl_EvalEx().  T
3440: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73  cl_EvalObjv() is
3450: 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e   much.** faster.
3460: 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74  .**.** Scripts t
3470: 68 61 74 20 61 72 65 20 73 61 66 65 20 74 6f 20  hat are safe to 
3480: 75 73 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61  use with Tcl_Eva
3490: 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73  lObjv() consists
34a0: 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   of a.** command
34b0: 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62   name followed b
34c0: 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61  y zero or more a
34d0: 72 67 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f  rguments with no
34e0: 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f   [...] or $.** o
34f0: 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20  r {...} or ; to 
3500: 62 65 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65  be seen anywhere
3510: 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b  .  Most callback
3520: 20 73 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74   scripts consist
3530: 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69  .** of just a si
3540: 6e 67 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e  ngle procedure n
3550: 61 6d 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65  ame and they mee
3560: 74 20 74 68 69 73 20 72 65 71 75 69 72 65 6d 65  t this requireme
3570: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
3580: 74 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  t safeToUseEvalO
3590: 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  bjv(Tcl_Interp *
35a0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20  interp, Tcl_Obj 
35b0: 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20  *pCmd){.  /* We 
35c0: 63 6f 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20  could try to do 
35d0: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54  something with T
35e0: 63 6c 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74  cl_Parse().  But
35f0: 20 77 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64   we will instead
3600: 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20  .  ** just do a 
3610: 73 65 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69  search for forbi
3620: 64 64 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e  dden characters.
3630: 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20    If any of the 
3640: 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63  forbidden.  ** c
3650: 68 61 72 61 63 74 65 72 73 20 61 70 70 65 61 72  haracters appear
3660: 20 69 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c   in pCmd, we wil
3670: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 73 74 72  l report the str
3680: 69 6e 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20  ing as unsafe.. 
3690: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
36a0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *z;.  int n;.  
36b0: 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  z = Tcl_GetStrin
36c0: 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26  gFromObj(pCmd, &
36d0: 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  n);.  while( n--
36e0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20   > 0 ){.    int 
36f0: 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
3700: 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d  if( c=='$' || c=
3710: 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29  ='[' || c==';' )
3720: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3730: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
3740: 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46  .** Find an SqlF
3750: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 69  unc structure wi
3760: 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d  th the given nam
3770: 65 2e 20 20 4f 72 20 63 72 65 61 74 65 20 61 20  e.  Or create a 
3780: 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e  new.** one if an
3790: 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61   existing one ca
37a0: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20  nnot be found.  
37b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
37c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63   to the.** struc
37d0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
37e0: 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c  SqlFunc *findSql
37f0: 46 75 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70  Func(SqliteDb *p
3800: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
3810: 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e  zName){.  SqlFun
3820: 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69  c *p, *pNew;.  i
3830: 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65  nt nName = strle
3840: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 4e  n30(zName);.  pN
3850: 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54  ew = (SqlFunc*)T
3860: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
3870: 28 2a 70 4e 65 77 29 20 2b 20 6e 4e 61 6d 65 20  (*pNew) + nName 
3880: 2b 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a  + 1 );.  pNew->z
3890: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
38a0: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
38b0: 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  (pNew->zName, zN
38c0: 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
38d0: 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e   for(p=pDb->pFun
38e0: 63 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  c; p; p=p->pNext
38f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
3900: 65 33 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a 4e  e3_stricmp(p->zN
3910: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  ame, pNew->zName
3920: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
3930: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e  l_Free((char*)pN
3940: 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ew);.      retur
3950: 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n p;.    }.  }. 
3960: 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20   pNew->interp = 
3970: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70  pDb->interp;.  p
3980: 4e 65 77 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a  New->pDb = pDb;.
3990: 20 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20    pNew->pScript 
39a0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = 0;.  pNew->pNe
39b0: 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b  xt = pDb->pFunc;
39c0: 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20  .  pDb->pFunc = 
39d0: 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70  pNew;.  return p
39e0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
39f0: 65 65 20 61 20 73 69 6e 67 6c 65 20 53 71 6c 50  ee a single SqlP
3a00: 72 65 70 61 72 65 64 53 74 6d 74 20 6f 62 6a 65  reparedStmt obje
3a10: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
3a20: 69 64 20 64 62 46 72 65 65 53 74 6d 74 28 53 71  id dbFreeStmt(Sq
3a30: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
3a40: 53 74 6d 74 29 7b 0a 23 69 66 64 65 66 20 53 51  Stmt){.#ifdef SQ
3a50: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
3a60: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
3a70: 74 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a  t->pStmt)==0 ){.
3a80: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3a90: 61 72 20 2a 29 70 53 74 6d 74 2d 3e 7a 53 71 6c  ar *)pStmt->zSql
3aa0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
3ab0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
3ac0: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pStmt->pStmt);.
3ad0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3ae0: 20 2a 29 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a   *)pStmt);.}../*
3af0: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64  .** Finalize and
3b00: 20 66 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20   free a list of 
3b10: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
3b20: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
3b30: 69 64 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68  id flushStmtCach
3b40: 65 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29  e(SqliteDb *pDb)
3b50: 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  {.  SqlPreparedS
3b60: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 20  tmt *pPreStmt;. 
3b70: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
3b80: 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28   *pNext;..  for(
3b90: 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e  pPreStmt = pDb->
3ba0: 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74  stmtList; pPreSt
3bb0: 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 4e 65  mt; pPreStmt=pNe
3bc0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
3bd0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
3be0: 3b 0a 20 20 20 20 64 62 46 72 65 65 53 74 6d 74  ;.    dbFreeStmt
3bf0: 28 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 0a  (pPreStmt);.  }.
3c00: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30    pDb->nStmt = 0
3c10: 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  ;.  pDb->stmtLas
3c20: 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74  t = 0;.  pDb->st
3c30: 6d 74 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  mtList = 0;.}../
3c40: 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74  *.** TCL calls t
3c50: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68  his procedure wh
3c60: 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61  en an sqlite3 da
3c70: 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69  tabase command i
3c80: 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  s.** deleted..*/
3c90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
3ca0: 49 54 45 5f 54 43 4c 41 50 49 20 44 62 44 65 6c  ITE_TCLAPI DbDel
3cb0: 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62 29  eteCmd(void *db)
3cc0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
3cd0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64  b = (SqliteDb*)d
3ce0: 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43 61  b;.  flushStmtCa
3cf0: 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f 73  che(pDb);.  clos
3d00: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
3d10: 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  s(pDb);.  sqlite
3d20: 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29  3_close(pDb->db)
3d30: 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e  ;.  while( pDb->
3d40: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c  pFunc ){.    Sql
3d50: 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44  Func *pFunc = pD
3d60: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44  b->pFunc;.    pD
3d70: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  b->pFunc = pFunc
3d80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
3d90: 65 72 74 28 20 70 46 75 6e 63 2d 3e 70 44 62 3d  ert( pFunc->pDb=
3da0: 3d 70 44 62 20 29 3b 0a 20 20 20 20 54 63 6c 5f  =pDb );.    Tcl_
3db0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75  DecrRefCount(pFu
3dc0: 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  nc->pScript);.  
3dd0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3de0: 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20  *)pFunc);.  }.  
3df0: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f 6c  while( pDb->pCol
3e00: 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c 43  late ){.    SqlC
3e10: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
3e20: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
3e30: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  ;.    pDb->pColl
3e40: 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e  ate = pCollate->
3e50: 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46  pNext;.    Tcl_F
3e60: 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c 6c  ree((char*)pColl
3e70: 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ate);.  }.  if( 
3e80: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
3e90: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3ea0: 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66  zBusy);.  }.  if
3eb0: 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
3ec0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3ed0: 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a  b->zTrace);.  }.
3ee0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
3ef0: 65 56 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  eV2 ){.    Tcl_F
3f00: 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 56  ree(pDb->zTraceV
3f10: 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  2);.  }.  if( pD
3f20: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
3f30: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3f40: 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d 0a  >zProfile);.  }.
3f50: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
3f60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
3f70: 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20  (pDb->zAuth);.  
3f80: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75  }.  if( pDb->zNu
3f90: 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  ll ){.    Tcl_Fr
3fa0: 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  ee(pDb->zNull);.
3fb0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3fc0: 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20  UpdateHook ){.  
3fd0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3fe0: 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  nt(pDb->pUpdateH
3ff0: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
4000: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
4010: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
4020: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
4030: 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29  >pPreUpdateHook)
4040: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
4050: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29  >pRollbackHook )
4060: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
4070: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c  fCount(pDb->pRol
4080: 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a  lbackHook);.  }.
4090: 20 20 69 66 28 20 70 44 62 2d 3e 70 57 61 6c 48    if( pDb->pWalH
40a0: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
40b0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
40c0: 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20 20 7d 0a  >pWalHook);.  }.
40d0: 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c    if( pDb->pColl
40e0: 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20  ateNeeded ){.   
40f0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4100: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
4110: 65 65 64 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63  eeded);.  }.  Tc
4120: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44  l_Free((char*)pD
4130: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
4140: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4150: 6c 65 64 20 77 68 65 6e 20 61 20 64 61 74 61 62  led when a datab
4160: 61 73 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b  ase file is lock
4170: 65 64 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  ed while trying.
4180: 2a 2a 20 74 6f 20 65 78 65 63 75 74 65 20 53 51  ** to execute SQ
4190: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  L..*/.static int
41a0: 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76   DbBusyHandler(v
41b0: 6f 69 64 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72  oid *cd, int nTr
41c0: 69 65 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  ies){.  SqliteDb
41d0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
41e0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
41f0: 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d  .  char zVal[30]
4200: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
4210: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 56 61  rintf(sizeof(zVa
4220: 6c 29 2c 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20  l), zVal, "%d", 
4230: 6e 54 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20  nTries);.  rc = 
4240: 54 63 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d  Tcl_VarEval(pDb-
4250: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  >interp, pDb->zB
4260: 75 73 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20  usy, " ", zVal, 
4270: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28  (char*)0);.  if(
4280: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
4290: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
42a0: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
42b0: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
42c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
42d0: 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn 1;.}..#ifnde
42e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
42f0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
4300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4310: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73  ne is invoked as
4320: 20 74 68 65 20 27 70 72 6f 67 72 65 73 73 20 63   the 'progress c
4330: 61 6c 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65  allback' for the
4340: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
4350: 61 74 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72  atic int DbProgr
4360: 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  essHandler(void 
4370: 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *cd){.  SqliteDb
4380: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4390: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
43a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
43b0: 3e 7a 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20  >zProgress );.  
43c0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
43d0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
43e0: 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66  zProgress);.  if
43f0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc!=TCL_OK || 
4400: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
4410: 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  ngResult(pDb->in
4420: 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65  terp)) ){.    re
4430: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
4440: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
4450: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4460: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
4470: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
4480: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
4490: 4e 47 5f 50 4f 49 4e 54 29 20 26 26 20 5c 0a 20  NG_POINT) && \. 
44a0: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
44b0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
44c0: 45 44 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ED)./*.** This r
44d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
44e0: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74   by the SQLite t
44f0: 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65  race handler whe
4500: 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62  never a new.** b
4510: 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65  lock of SQL is e
4520: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43  xecuted.  The TC
4530: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
4540: 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75  >zTrace is execu
4550: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
4560: 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c  oid DbTraceHandl
4570: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e  er(void *cd, con
4580: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
4590: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
45a0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
45b0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
45c0: 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr;..  Tcl_DStri
45d0: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
45e0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
45f0: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72  d(&str, pDb->zTr
4600: 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ace, -1);.  Tcl_
4610: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
4620: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29  ment(&str, zSql)
4630: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  ;.  Tcl_Eval(pDb
4640: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
4650: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
4660: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4670: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63  Free(&str);.  Tc
4680: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
4690: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65  b->interp);.}.#e
46a0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
46b0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
46c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
46d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
46e0: 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65  the SQLite trace
46f0: 5f 76 32 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  _v2 handler when
4700: 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 73 75  ever a new.** su
4710: 70 70 6f 72 74 65 64 20 65 76 65 6e 74 20 69 73  pported event is
4720: 20 67 65 6e 65 72 61 74 65 64 2e 20 20 55 6e 73   generated.  Uns
4730: 75 70 70 6f 72 74 65 64 20 65 76 65 6e 74 20 74  upported event t
4740: 79 70 65 73 20 61 72 65 20 69 67 6e 6f 72 65 64  ypes are ignored
4750: 2e 0a 2a 2a 20 54 68 65 20 54 43 4c 20 73 63 72  ..** The TCL scr
4760: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61  ipt in pDb->zTra
4770: 63 65 56 32 20 69 73 20 65 78 65 63 75 74 65 64  ceV2 is executed
4780: 2c 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d  , with the argum
4790: 65 6e 74 73 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ents for.** the 
47a0: 65 76 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  event appended t
47b0: 6f 20 69 74 20 28 61 73 20 6c 69 73 74 20 65 6c  o it (as list el
47c0: 65 6d 65 6e 74 73 29 2e 0a 2a 2f 0a 73 74 61 74  ements)..*/.stat
47d0: 69 63 20 69 6e 74 20 44 62 54 72 61 63 65 56 32  ic int DbTraceV2
47e0: 48 61 6e 64 6c 65 72 28 0a 20 20 75 6e 73 69 67  Handler(.  unsig
47f0: 6e 65 64 20 74 79 70 65 2c 20 2f 2a 20 4f 6e 65  ned type, /* One
4800: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 54   of the SQLITE_T
4810: 52 41 43 45 5f 2a 20 65 76 65 6e 74 20 74 79 70  RACE_* event typ
4820: 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 63  es. */.  void *c
4830: 64 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  d,      /* The o
4840: 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 78 74 20  riginal context 
4850: 64 61 74 61 20 70 6f 69 6e 74 65 72 2e 20 2a 2f  data pointer. */
4860: 0a 20 20 76 6f 69 64 20 2a 70 64 2c 20 20 20 20  .  void *pd,    
4870: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 76 65    /* Primary eve
4880: 6e 74 20 64 61 74 61 2c 20 64 65 70 65 6e 64 73  nt data, depends
4890: 20 6f 6e 20 65 76 65 6e 74 20 74 79 70 65 2e 20   on event type. 
48a0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 78 64 20 20 20  */.  void *xd   
48b0: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 65 76 65      /* Extra eve
48c0: 6e 74 20 64 61 74 61 2c 20 64 65 70 65 6e 64 73  nt data, depends
48d0: 20 6f 6e 20 65 76 65 6e 74 20 74 79 70 65 2e 20   on event type. 
48e0: 2a 2f 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  */.){.  SqliteDb
48f0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4900: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 4f 62 6a  b*)cd;.  Tcl_Obj
4910: 20 2a 70 43 6d 64 3b 0a 0a 20 20 73 77 69 74 63   *pCmd;..  switc
4920: 68 28 20 74 79 70 65 20 29 7b 0a 20 20 20 20 63  h( type ){.    c
4930: 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
4940: 5f 53 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73  _STMT: {.      s
4950: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
4960: 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
4970: 6d 74 20 2a 29 70 64 3b 0a 20 20 20 20 20 20 63  mt *)pd;.      c
4980: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 68 61  har *zSql = (cha
4990: 72 20 2a 29 78 64 3b 0a 0a 20 20 20 20 20 20 70  r *)xd;..      p
49a0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
49b0: 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61  ingObj(pDb->zTra
49c0: 63 65 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ceV2, -1);.     
49d0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
49e0: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54  t(pCmd);.      T
49f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4a00: 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74  Element(pDb->int
4a10: 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20  erp, pCmd,.     
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65            Tcl_Ne
4a40: 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c  wWideIntObj((Tcl
4a50: 5f 57 69 64 65 49 6e 74 29 70 53 74 6d 74 29 29  _WideInt)pStmt))
4a60: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  ;.      Tcl_List
4a70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4a80: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43  (pDb->interp, pC
4a90: 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
4ac0: 4f 62 6a 28 7a 53 71 6c 2c 20 2d 31 29 29 3b 0a  Obj(zSql, -1));.
4ad0: 20 20 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62        Tcl_EvalOb
4ae0: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
4af0: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
4b00: 44 49 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54  DIRECT);.      T
4b10: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4b20: 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c  pCmd);.      Tcl
4b30: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
4b40: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  ->interp);.     
4b50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4b60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
4b70: 41 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20  ACE_PROFILE: {. 
4b80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
4b90: 74 20 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69  t *pStmt = (sqli
4ba0: 74 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 20  te3_stmt *)pd;. 
4bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
4bc0: 36 34 20 6e 73 20 3d 20 28 73 71 6c 69 74 65 33  64 ns = (sqlite3
4bd0: 5f 69 6e 74 36 34 29 78 64 3b 0a 0a 20 20 20 20  _int64)xd;..    
4be0: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77    pCmd = Tcl_New
4bf0: 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a  StringObj(pDb->z
4c00: 54 72 61 63 65 56 32 2c 20 2d 31 29 3b 0a 20 20  TraceV2, -1);.  
4c10: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
4c20: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
4c30: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4c40: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e  endElement(pDb->
4c50: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20  interp, pCmd,.  
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
4c80: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28  _NewWideIntObj((
4c90: 54 63 6c 5f 57 69 64 65 49 6e 74 29 70 53 74 6d  Tcl_WideInt)pStm
4ca0: 74 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c  t));.      Tcl_L
4cb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4cc0: 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ent(pDb->interp,
4cd0: 20 70 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20   pCmd,.         
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64        Tcl_NewWid
4d00: 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64  eIntObj((Tcl_Wid
4d10: 65 49 6e 74 29 6e 73 29 29 3b 0a 20 20 20 20 20  eInt)ns));.     
4d20: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
4d30: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
4d40: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
4d50: 54 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65  T);.      Tcl_De
4d60: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
4d70: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65  ;.      Tcl_Rese
4d80: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
4d90: 65 72 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  erp);.      brea
4da0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4db0: 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52  e SQLITE_TRACE_R
4dc0: 4f 57 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OW: {.      sqli
4dd0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
4de0: 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  = (sqlite3_stmt 
4df0: 2a 29 70 64 3b 0a 0a 20 20 20 20 20 20 70 43 6d  *)pd;..      pCm
4e00: 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  d = Tcl_NewStrin
4e10: 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63 65  gObj(pDb->zTrace
4e20: 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 54  V2, -1);.      T
4e30: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4e40: 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c  pCmd);.      Tcl
4e50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4e60: 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72  ement(pDb->inter
4e70: 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20 20  p, pCmd,.       
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 57          Tcl_NewW
4ea0: 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57  ideIntObj((Tcl_W
4eb0: 69 64 65 49 6e 74 29 70 53 74 6d 74 29 29 3b 0a  ideInt)pStmt));.
4ec0: 20 20 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62        Tcl_EvalOb
4ed0: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
4ee0: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
4ef0: 44 49 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54  DIRECT);.      T
4f00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4f10: 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c  pCmd);.      Tcl
4f20: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
4f30: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  ->interp);.     
4f40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4f50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
4f60: 41 43 45 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20  ACE_CLOSE: {.   
4f70: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
4f80: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 64 3b 0a   (sqlite3 *)pd;.
4f90: 0a 20 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63  .      pCmd = Tc
4fa0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
4fb0: 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31  Db->zTraceV2, -1
4fc0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  );.      Tcl_Inc
4fd0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4fe0: 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
4ff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5000: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  pDb->interp, pCm
5010: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74    Tcl_NewWideInt
5040: 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74  Obj((Tcl_WideInt
5050: 29 64 62 29 29 3b 0a 20 20 20 20 20 20 54 63 6c  )db));.      Tcl
5060: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
5070: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
5080: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
5090: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
50a0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
50b0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
50c0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
50d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
50e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
50f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
5100: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
5110: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5120: 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
5130: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
5140: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26  LOATING_POINT) &
5150: 26 20 5c 0a 20 20 20 20 21 64 65 66 69 6e 65 64  & \.    !defined
5160: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50  (SQLITE_OMIT_DEP
5170: 52 45 43 41 54 45 44 29 0a 2f 2a 0a 2a 2a 20 54  RECATED)./*.** T
5180: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5190: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c  alled by the SQL
51a0: 69 74 65 20 70 72 6f 66 69 6c 65 20 68 61 6e 64  ite profile hand
51b0: 6c 65 72 20 61 66 74 65 72 20 61 20 73 74 61 74  ler after a stat
51c0: 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20 68 61 73  ement.** SQL has
51d0: 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
51e0: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
51f0: 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69 73 20 65  b->zProfile is e
5200: 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  valuated..*/.sta
5210: 74 69 63 20 76 6f 69 64 20 44 62 50 72 6f 66 69  tic void DbProfi
5220: 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  leHandler(void *
5230: 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  cd, const char *
5240: 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f 75 69 6e  zSql, sqlite_uin
5250: 74 36 34 20 74 6d 29 7b 0a 20 20 53 71 6c 69 74  t64 tm){.  Sqlit
5260: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
5270: 74 65 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f  teDb*)cd;.  Tcl_
5280: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 63  DString str;.  c
5290: 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20  har zTm[100];.. 
52a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
52b0: 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c  f(sizeof(zTm)-1,
52c0: 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c 20 74 6d   zTm, "%lld", tm
52d0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
52e0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63  Init(&str);.  Tc
52f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
5300: 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50 72 6f 66  &str, pDb->zProf
5310: 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ile, -1);.  Tcl_
5320: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
5330: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29  ment(&str, zSql)
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 54 6d 29 3b 0a 20 20 54 63 6c 5f 45  r, zTm);.  Tcl_E
5370: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
5380: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
5390: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
53a0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
53b0: 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
53c0: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
53d0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
53e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
53f0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
5400: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5410: 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54 68 65 0a  committed.  The.
5420: 2a 2a 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  ** TCL script in
5430: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73   pDb->zCommit is
5440: 20 65 78 65 63 75 74 65 64 2e 20 20 49 66 20 69   executed.  If i
5450: 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  t returns non-ze
5460: 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74  ro or.** if it t
5470: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
5480: 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  on, the transact
5490: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
54a0: 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  ck instead.** of
54b0: 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
54c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
54d0: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28  DbCommitHandler(
54e0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
54f0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
5500: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
5510: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63  t rc;..  rc = Tc
5520: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
5530: 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  rp, pDb->zCommit
5540: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
5550: 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f  _OK || atoi(Tcl_
5560: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
5570: 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b  pDb->interp)) ){
5580: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
5590: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
55a0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62  ..static void Db
55b0: 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28  RollbackHandler(
55c0: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
55d0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
55e0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
55f0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 61 73  clientData;.  as
5600: 73 65 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  sert(pDb->pRollb
5610: 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20  ackHook);.  if( 
5620: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c  TCL_OK!=Tcl_Eval
5630: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
5640: 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  p, pDb->pRollbac
5650: 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20  kHook, 0) ){.   
5660: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
5670: 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72 70  rror(pDb->interp
5680: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5690: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 68  This procedure h
56a0: 61 6e 64 6c 65 73 20 77 61 6c 5f 68 6f 6f 6b 20  andles wal_hook 
56b0: 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a 2f 0a 73 74  callbacks..*/.st
56c0: 61 74 69 63 20 69 6e 74 20 44 62 57 61 6c 48 61  atic int DbWalHa
56d0: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 63  ndler(.  void *c
56e0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 73 71 6c  lientData,.  sql
56f0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
5700: 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 69  t char *zDb,.  i
5710: 6e 74 20 6e 45 6e 74 72 79 0a 29 7b 0a 20 20 69  nt nEntry.){.  i
5720: 6e 74 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f  nt ret = SQLITE_
5730: 4f 4b 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  OK;.  Tcl_Obj *p
5740: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
5750: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
5760: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c  lientData;.  Tcl
5770: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
5780: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
5790: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 57 61   assert(pDb->pWa
57a0: 6c 48 6f 6f 6b 29 3b 0a 0a 20 20 61 73 73 65 72  lHook);..  asser
57b0: 74 28 20 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29  t( db==pDb->db )
57c0: 3b 0a 20 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c  ;.  p = Tcl_Dupl
57d0: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57  icateObj(pDb->pW
57e0: 61 6c 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49  alHook);.  Tcl_I
57f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a  ncrRefCount(p);.
5800: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5810: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5820: 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  p, p, Tcl_NewStr
5830: 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29  ingObj(zDb, -1))
5840: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5850: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5860: 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49  erp, p, Tcl_NewI
5870: 6e 74 4f 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a  ntObj(nEntry));.
5880: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
5890: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
58a0: 72 70 2c 20 70 2c 20 30 29 0a 20 20 20 7c 7c 20  rp, p, 0).   || 
58b0: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
58c0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
58d0: 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  , Tcl_GetObjResu
58e0: 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74  lt(interp), &ret
58f0: 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42  ).  ){.    Tcl_B
5900: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69  ackgroundError(i
5910: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63  nterp);.  }.  Tc
5920: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5930: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74  );..  return ret
5940: 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
5950: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
5960: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5970: 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
5980: 54 49 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69  TIFY).static voi
5990: 64 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e  d setTestUnlockN
59a0: 6f 74 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e  otifyVars(Tcl_In
59b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
59c0: 74 20 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  t iArg, int nArg
59d0: 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36  ){.  char zBuf[6
59e0: 34 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  4];.  sqlite3_sn
59f0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
5a00: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
5a10: 20 69 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65   iArg);.  Tcl_Se
5a20: 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  tVar(interp, "sq
5a30: 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  lite_unlock_noti
5a40: 66 79 5f 61 72 67 22 2c 20 7a 42 75 66 2c 20 54  fy_arg", zBuf, T
5a50: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
5a60: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
5a70: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
5a80: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41  , zBuf, "%d", nA
5a90: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  rg);.  Tcl_SetVa
5aa0: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
5ab0: 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  e_unlock_notify_
5ac0: 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c  argcount", zBuf,
5ad0: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
5ae0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
5af0: 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63  ine setTestUnloc
5b00: 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c  kNotifyVars(x,y,
5b10: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  z).#endif..#ifde
5b20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5b30: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
5b40: 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f  atic void DbUnlo
5b50: 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a  ckNotify(void **
5b60: 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  apArg, int nArg)
5b70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5b80: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
5b90: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  +){.    const in
5ba0: 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45  t flags = (TCL_E
5bb0: 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45  VAL_GLOBAL|TCL_E
5bc0: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
5bd0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
5be0: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41   (SqliteDb *)apA
5bf0: 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65  rg[i];.    setTe
5c00: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
5c10: 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  rs(pDb->interp, 
5c20: 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73  i, nArg);.    as
5c30: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f  sert( pDb->pUnlo
5c40: 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54  ckNotify);.    T
5c50: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
5c60: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
5c70: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c  UnlockNotify, fl
5c80: 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ags);.    Tcl_De
5c90: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
5ca0: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
5cb0: 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b      pDb->pUnlock
5cc0: 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a  Notify = 0;.  }.
5cd0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
5ce0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
5cf0: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
5d00: 0a 2a 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68  .** Pre-update h
5d10: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ook callback..*/
5d20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
5d30: 72 65 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28  reUpdateHandler(
5d40: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 73 71  .  void *p,.  sq
5d50: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
5d60: 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   op,.  const cha
5d70: 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20  r *zDb,.  const 
5d80: 63 68 61 72 20 2a 7a 54 62 6c 2c 0a 20 20 73 71  char *zTbl,.  sq
5d90: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 31  lite_int64 iKey1
5da0: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
5db0: 20 69 4b 65 79 32 0a 29 7b 0a 20 20 53 71 6c 69   iKey2.){.  Sqli
5dc0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
5dd0: 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c  iteDb *)p;.  Tcl
5de0: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74  _Obj *pCmd;.  st
5df0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5e00: 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c  *azStr[] = {"DEL
5e10: 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20  ETE", "INSERT", 
5e20: 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73  "UPDATE"};..  as
5e30: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45  sert( (SQLITE_DE
5e40: 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29  LETE-1)/9 == 0 )
5e50: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
5e60: 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20  ITE_INSERT-1)/9 
5e70: 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74  == 1 );.  assert
5e80: 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45  ( (SQLITE_UPDATE
5e90: 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 20 20  -1)/9 == 2 );.  
5ea0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 50 72  assert( pDb->pPr
5eb0: 65 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20  eUpdateHook );. 
5ec0: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44 62   assert( db==pDb
5ed0: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
5ee0: 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53  ( op==SQLITE_INS
5ef0: 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54  ERT || op==SQLIT
5f00: 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d  E_UPDATE || op==
5f10: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b  SQLITE_DELETE );
5f20: 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44  ..  pCmd = Tcl_D
5f30: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
5f40: 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29  >pPreUpdateHook)
5f50: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
5f60: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63  ount(pCmd);.  Tc
5f70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5f80: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
5f90: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5fa0: 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f 39 5d  (azStr[(op-1)/9]
5fb0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5fc0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5fd0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5fe0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
5ff0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
6000: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6010: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
6020: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
6030: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
6040: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6050: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
6060: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69  _NewWideIntObj(i
6070: 4b 65 79 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  Key1));.  Tcl_Li
6080: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6090: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
60a0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b  NewWideIntObj(iK
60b0: 65 79 32 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61  ey2));.  Tcl_Eva
60c0: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
60d0: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
60e0: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
60f0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6100: 43 6d 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Cmd);.}.#endif /
6110: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
6120: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
6130: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  /..static void D
6140: 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a  bUpdateHandler(.
6150: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74    void *p,.  int
6160: 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   op,.  const cha
6170: 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20  r *zDb,.  const 
6180: 63 68 61 72 20 2a 7a 54 62 6c 2c 0a 20 20 73 71  char *zTbl,.  sq
6190: 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64  lite_int64 rowid
61a0: 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
61b0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
61c0: 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  *)p;.  Tcl_Obj *
61d0: 70 43 6d 64 3b 0a 20 20 73 74 61 74 69 63 20 63  pCmd;.  static c
61e0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 74 72  onst char *azStr
61f0: 5b 5d 20 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20  [] = {"DELETE", 
6200: 22 49 4e 53 45 52 54 22 2c 20 22 55 50 44 41 54  "INSERT", "UPDAT
6210: 45 22 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  E"};..  assert( 
6220: 28 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31  (SQLITE_DELETE-1
6230: 29 2f 39 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73  )/9 == 0 );.  as
6240: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 49 4e  sert( (SQLITE_IN
6250: 53 45 52 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29  SERT-1)/9 == 1 )
6260: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
6270: 49 54 45 5f 55 50 44 41 54 45 2d 31 29 2f 39 20  ITE_UPDATE-1)/9 
6280: 3d 3d 20 32 20 29 3b 0a 0a 20 20 61 73 73 65 72  == 2 );..  asser
6290: 74 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48  t( pDb->pUpdateH
62a0: 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ook );.  assert(
62b0: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45   op==SQLITE_INSE
62c0: 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  RT || op==SQLITE
62d0: 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53  _UPDATE || op==S
62e0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a  QLITE_DELETE );.
62f0: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75  .  pCmd = Tcl_Du
6300: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
6310: 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  pUpdateHook);.  
6320: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
6330: 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pCmd);.  Tcl_Li
6340: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6350: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
6360: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 53  NewStringObj(azS
6370: 74 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31  tr[(op-1)/9], -1
6380: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
6390: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
63a0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
63b0: 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31  tringObj(zDb, -1
63c0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
63d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
63e0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
63f0: 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d  tringObj(zTbl, -
6400: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
6410: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6420: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
6430: 57 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64  WideIntObj(rowid
6440: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
6450: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
6460: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
6470: 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44  DIRECT);.  Tcl_D
6480: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ecrRefCount(pCmd
6490: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
64a0: 64 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64  d tclCollateNeed
64b0: 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  ed(.  void *pCtx
64c0: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
64d0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f  .  int enc,.  co
64e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
64f0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
6500: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
6510: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
6520: 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f   *pScript = Tcl_
6530: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62  DuplicateObj(pDb
6540: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
6550: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
6560: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
6570: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6580: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53  endElement(0, pS
6590: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
65a0: 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d  ringObj(zName, -
65b0: 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
65c0: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
65d0: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
65e0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
65f0: 74 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f  t(pScript);.}../
6600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6610: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  e is called to e
6620: 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63  valuate an SQL c
6630: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
6640: 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
6650: 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70   using TCL scrip
6660: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6670: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a   tclSqlCollate(.
6680: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20    void *pCtx,.  
6690: 69 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20  int nA,.  const 
66a0: 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20  void *zA,.  int 
66b0: 6e 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  nB,.  const void
66c0: 20 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c   *zB.){.  SqlCol
66d0: 6c 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f  late *p = (SqlCo
66e0: 6c 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20  llate *)pCtx;.  
66f0: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a  Tcl_Obj *pCmd;..
6700: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77    pCmd = Tcl_New
6710: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63  StringObj(p->zSc
6720: 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ript, -1);.  Tcl
6730: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
6740: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
6750: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6760: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
6770: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6780: 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63  j(zA, nA));.  Tc
6790: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
67a0: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
67b0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
67c0: 74 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29  tringObj(zB, nB)
67d0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
67e0: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
67f0: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
6800: 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
6810: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
6820: 20 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54    return (atoi(T
6830: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
6840: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b  lt(p->interp)));
6850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
6860: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6870: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
6880: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  SQL function imp
6890: 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e  lemented.** usin
68a0: 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f  g TCL script..*/
68b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c  .static void tcl
68c0: 53 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  SqlFunc(sqlite3_
68d0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
68e0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
68f0: 74 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29  te3_value**argv)
6900: 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d  {.  SqlFunc *p =
6910: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
6920: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54  ta(context);.  T
6930: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20  cl_Obj *pCmd;.  
6940: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
6950: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20  ..  if( argc==0 
6960: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
6970: 72 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65  re are no argume
6980: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
6990: 69 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ion, call Tcl_Ev
69a0: 61 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20  alObjEx on the. 
69b0: 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a     ** script obj
69c0: 65 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54  ect directly.  T
69d0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54  his allows the T
69e0: 43 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67  CL compiler to g
69f0: 65 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62  enerate.    ** b
6a00: 79 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ytecode for the 
6a10: 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66  command on the f
6a20: 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
6a30: 61 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20  and thus make.  
6a40: 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
6a50: 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68  invocations much
6a60: 20 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20   faster. */.    
6a70: 70 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70  pCmd = p->pScrip
6a80: 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  t;.    Tcl_IncrR
6a90: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
6aa0: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
6ab0: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
6ac0: 20 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54   pCmd, 0);.    T
6ad0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6ae0: 70 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCmd);.  }else{.
6af0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
6b00: 61 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  are arguments to
6b10: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d   the function, m
6b20: 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  ake a shallow co
6b30: 70 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  py of the.    **
6b40: 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20   script object, 
6b50: 6c 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75  lappend the argu
6b60: 6d 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c  ments, then eval
6b70: 75 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20  uate the copy.. 
6b80: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20     **.    ** By 
6b90: 22 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20  "shallow" copy, 
6ba0: 77 65 20 6d 65 61 6e 20 6f 6e 6c 79 20 74 68 65  we mean only the
6bb0: 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f   outer list Tcl_
6bc0: 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65  Obj is duplicate
6bd0: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65  d..    ** The ne
6be0: 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  w Tcl_Obj contai
6bf0: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
6c00: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74  he original list
6c10: 20 65 6c 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a   elements..    *
6c20: 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e  * That way, when
6c30: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
6c40: 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d  is run and shimm
6c50: 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65 6c  ers the first el
6c60: 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20  ement.    ** of 
6c70: 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43  the list to tclC
6c80: 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74  mdNameType, that
6c90: 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65   alternate repre
6ca0: 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20  sentation will. 
6cb0: 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76     ** be preserv
6cc0: 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  ed and reused on
6cd0: 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61   the next invoca
6ce0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
6cf0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b   Tcl_Obj **aArg;
6d00: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
6d10: 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f     if( Tcl_ListO
6d20: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d  bjGetElements(p-
6d30: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72  >interp, p->pScr
6d40: 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72  ipt, &nArg, &aAr
6d50: 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  g) ){.      sqli
6d60: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6d70: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
6d80: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
6d90: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20  >interp), -1);. 
6da0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6db0: 20 7d 0a 20 20 20 20 70 43 6d 64 20 3d 20 54 63   }.    pCmd = Tc
6dc0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72  l_NewListObj(nAr
6dd0: 67 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54 63  g, aArg);.    Tc
6de0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
6df0: 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Cmd);.    for(i=
6e00: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
6e10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
6e20: 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67 76  alue *pIn = argv
6e30: 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  [i];.      Tcl_O
6e40: 62 6a 20 2a 70 56 61 6c 3b 0a 0a 20 20 20 20 20  bj *pVal;..     
6e50: 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20   /* Set pVal to 
6e60: 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68  contain the i'th
6e70: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20   column of this 
6e80: 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77  row. */.      sw
6e90: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
6ea0: 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b  lue_type(pIn) ){
6eb0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
6ec0: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
6ed0: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
6ee0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6ef0: 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20  _bytes(pIn);.   
6f00: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
6f10: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
6f20: 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  j(sqlite3_value_
6f30: 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73  blob(pIn), bytes
6f40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
6f50: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6f60: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
6f70: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
6f80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e         sqlite_in
6f90: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
6fa0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29  value_int64(pIn)
6fb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6fc0: 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26  v>=-2147483647 &
6fd0: 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20  & v<=2147483647 
6fe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
6ff0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Val = Tcl_NewInt
7000: 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20  Obj((int)v);.   
7010: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7020: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
7030: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
7040: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
7050: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
7060: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7070: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
7080: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
7090: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
70a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
70b0: 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20  uble(pIn);.     
70c0: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
70d0: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
70e0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
70f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7100: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7110: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
7120: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
7130: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62  StringObj(p->pDb
7140: 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20  ->zNull, -1);.  
7150: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7170: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
7180: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
7190: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
71a0: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
71b0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
71c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
71d0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
71e0: 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62  lue_text(pIn), b
71f0: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
7200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7210: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7220: 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  rc = Tcl_ListObj
7230: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
7240: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70  >interp, pCmd, p
7250: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
7260: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  rc ){.        Tc
7270: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
7280: 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Cmd);.        sq
7290: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
72a0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
72b0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
72c0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
72d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
72e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
72f0: 20 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76     if( !p->useEv
7300: 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20  alObjv ){.      
7310: 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  /* Tcl_EvalObjEx
7320: 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  () will automati
7330: 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45  cally call Tcl_E
7340: 76 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d  valObjv() if pCm
7350: 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  d.      ** is a 
7360: 6c 69 73 74 20 77 69 74 68 6f 75 74 20 61 20 73  list without a s
7370: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
7380: 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e  tion.  To preven
7390: 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  t this from.    
73a0: 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20    ** happening, 
73b0: 6d 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68  make sure pCmd h
73c0: 61 73 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e  as a valid strin
73d0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
73e0: 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   */.      Tcl_Ge
73f0: 74 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20  tString(pCmd);. 
7400: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63     }.    rc = Tc
7410: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
7420: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
7430: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
7440: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
7450: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a  unt(pCmd);.  }..
7460: 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d    if( rc && rc!=
7470: 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20  TCL_RETURN ){.  
7480: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7490: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
74a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
74b0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
74c0: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
74d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
74e0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
74f0: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  lt(p->interp);. 
7500: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38     int n;.    u8
7510: 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73   *data;.    cons
7520: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
7530: 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f  (pVar->typePtr ?
7540: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
7550: 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20  name : "");.    
7560: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
7570: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62  ];.    if( c=='b
7580: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
7590: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
75a0: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
75b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
75c0: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c  Only return a BL
75d0: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
75e0: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
75f0: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
7600: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73       ** has no s
7610: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
7620: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64  tion. */.      d
7630: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
7640: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
7650: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
7660: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
7670: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61  ob(context, data
7680: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
7690: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
76a0: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
76b0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
76c0: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
76d0: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
76e0: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
76f0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
7700: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
7710: 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  text, n);.    }e
7720: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
7730: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
7740: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
7750: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
7760: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
7770: 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  leFromObj(0, pVa
7780: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r, &r);.      sq
7790: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
77a0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
77b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
77c0: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
77d0: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
77e0: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
77f0: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
7800: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
7810: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54  )==0) ){.      T
7820: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
7830: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
7840: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
7850: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71  r, &v);.      sq
7860: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
7870: 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a  64(context, v);.
7880: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7890: 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65   data = (unsigne
78a0: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  d char *)Tcl_Get
78b0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56  StringFromObj(pV
78c0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
78d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
78e0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
78f0: 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c  r *)data, n, SQL
7900: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
7910: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
7920: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7930: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
7940: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
7950: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
7960: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70  function.  It ap
7970: 70 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e  pends the authen
7980: 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65  tication.** type
7990: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77   code and the tw
79a0: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a  o arguments to z
79b0: 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b  Cmd[] then invok
79c0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
79d0: 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   on the interpre
79e0: 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20  ter.  The reply 
79f0: 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64  is examined to d
7a00: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a  etermine if the.
7a10: 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ** authenticatio
7a20: 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65  n fails or succe
7a30: 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eds..*/.static i
7a40: 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  nt auth_callback
7a50: 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  (.  void *pArg,.
7a60: 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f    int code,.  co
7a70: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c  nst char *zArg1,
7a80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7a90: 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg2,.  const ch
7aa0: 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e  ar *zArg3,.  con
7ab0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 23  st char *zArg4.#
7ac0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
7ad0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
7ae0: 0a 20 20 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  .  ,const char *
7af0: 7a 41 72 67 35 0a 23 65 6e 64 69 66 0a 29 7b 0a  zArg5.#endif.){.
7b00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
7b10: 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ode;.  Tcl_DStri
7b20: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
7b30: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7b40: 7a 52 65 70 6c 79 3b 0a 20 20 2f 2a 20 45 56 49  zReply;.  /* EVI
7b50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 38 35 39  DENCE-OF: R-3859
7b60: 30 2d 36 32 37 36 39 20 54 68 65 20 66 69 72 73  0-62769 The firs
7b70: 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
7b80: 68 65 20 61 75 74 68 6f 72 69 7a 65 72 0a 20 20  he authorizer.  
7b90: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61  ** callback is a
7ba0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74 68 69   copy of the thi
7bb0: 72 64 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  rd parameter to 
7bc0: 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
7bd0: 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
7be0: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 20 20 2a  ) interface..  *
7bf0: 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  /.  SqliteDb *pD
7c00: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70  b = (SqliteDb*)p
7c10: 41 72 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e  Arg;.  if( pDb->
7c20: 64 69 73 61 62 6c 65 41 75 74 68 20 29 20 72 65  disableAuth ) re
7c30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7c40: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
7c50: 46 3a 20 52 2d 35 36 35 31 38 2d 34 34 33 31 30  F: R-56518-44310
7c60: 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   The second para
7c70: 6d 65 74 65 72 20 74 6f 20 74 68 65 20 63 61 6c  meter to the cal
7c80: 6c 62 61 63 6b 20 69 73 20 61 6e 0a 20 20 2a 2a  lback is an.  **
7c90: 20 69 6e 74 65 67 65 72 20 61 63 74 69 6f 6e 20   integer action 
7ca0: 63 6f 64 65 20 74 68 61 74 20 73 70 65 63 69 66  code that specif
7cb0: 69 65 73 20 74 68 65 20 70 61 72 74 69 63 75 6c  ies the particul
7cc0: 61 72 20 61 63 74 69 6f 6e 20 74 6f 20 62 65 0a  ar action to be.
7cd0: 20 20 2a 2a 20 61 75 74 68 6f 72 69 7a 65 64 2e    ** authorized.
7ce0: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 63 6f   */.  switch( co
7cf0: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  de ){.    case S
7d00: 51 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20  QLITE_COPY      
7d10: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
7d20: 22 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62  "SQLITE_COPY"; b
7d30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7d40: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
7d50: 45 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  EX      : zCode=
7d60: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49  "SQLITE_CREATE_I
7d70: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
7d80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
7d90: 45 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20  EATE_TABLE      
7da0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7db0: 43 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62  CREATE_TABLE"; b
7dc0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7dd0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7de0: 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d  P_INDEX : zCode=
7df0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
7e00: 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  EMP_INDEX"; brea
7e10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7e20: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
7e30: 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51  ABLE : zCode="SQ
7e40: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7e50: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
7e60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7e70: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47  CREATE_TEMP_TRIG
7e80: 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  GER: zCode="SQLI
7e90: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
7ea0: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
7eb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7ec0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7ed0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7ee0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
7ef0: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
7f00: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7f10: 54 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20  TE_TRIGGER    : 
7f20: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7f30: 45 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62  EATE_TRIGGER"; b
7f40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7f50: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
7f60: 57 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  W       : zCode=
7f70: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56  "SQLITE_CREATE_V
7f80: 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IEW"; break;.   
7f90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c   case SQLITE_DEL
7fa0: 45 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a  ETE            :
7fb0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
7fc0: 45 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ELETE"; break;. 
7fd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
7fe0: 52 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20  ROP_INDEX       
7ff0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8000: 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72  _DROP_INDEX"; br
8010: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8020: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20  LITE_DROP_TABLE 
8030: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
8040: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
8050: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
8060: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
8070: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a  TEMP_INDEX   : z
8080: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
8090: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62  P_TEMP_INDEX"; b
80a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
80b0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
80c0: 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d  TABLE   : zCode=
80d0: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d  "SQLITE_DROP_TEM
80e0: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
80f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8100: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
8110: 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  ER : zCode="SQLI
8120: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49  TE_DROP_TEMP_TRI
8130: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
8140: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
8150: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20  OP_TEMP_VIEW    
8160: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8170: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b  DROP_TEMP_VIEW";
8180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8190: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49   SQLITE_DROP_TRI
81a0: 47 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64  GGER      : zCod
81b0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
81c0: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
81d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
81e0: 44 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20  DROP_VIEW       
81f0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
8200: 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72  E_DROP_VIEW"; br
8210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8220: 4c 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20  LITE_INSERT     
8230: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
8240: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20  SQLITE_INSERT"; 
8250: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8260: 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20  SQLITE_PRAGMA   
8270: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
8280: 3d 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22  ="SQLITE_PRAGMA"
8290: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
82a0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20  e SQLITE_READ   
82b0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
82c0: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22  de="SQLITE_READ"
82d0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
82e0: 65 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20  e SQLITE_SELECT 
82f0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
8300: 64 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43  de="SQLITE_SELEC
8310: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
8320: 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ase SQLITE_TRANS
8330: 41 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a  ACTION       : z
8340: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41  Code="SQLITE_TRA
8350: 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  NSACTION"; break
8360: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
8370: 45 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 20  E_UPDATE        
8380: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
8390: 49 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65  ITE_UPDATE"; bre
83a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
83b0: 49 54 45 5f 41 54 54 41 43 48 20 20 20 20 20 20  ITE_ATTACH      
83c0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
83d0: 51 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62  QLITE_ATTACH"; b
83e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
83f0: 51 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20 20  QLITE_DETACH    
8400: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
8410: 22 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b  "SQLITE_DETACH";
8420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8430: 20 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41   SQLITE_ALTER_TA
8440: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
8450: 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f  e="SQLITE_ALTER_
8460: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
8470: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
8480: 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
8490: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
84a0: 5f 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  _REINDEX"; break
84b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
84c0: 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20  E_ANALYZE       
84d0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
84e0: 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72  ITE_ANALYZE"; br
84f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8500: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42  LITE_CREATE_VTAB
8510: 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  LE     : zCode="
8520: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54  SQLITE_CREATE_VT
8530: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
8540: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
8550: 4f 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20 20  OP_VTABLE       
8560: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8570: 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62 72  DROP_VTABLE"; br
8580: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8590: 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20  LITE_FUNCTION   
85a0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
85b0: 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22  SQLITE_FUNCTION"
85c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
85d0: 65 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49  e SQLITE_SAVEPOI
85e0: 4e 54 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  NT         : zCo
85f0: 64 65 3d 22 53 51 4c 49 54 45 5f 53 41 56 45 50  de="SQLITE_SAVEP
8600: 4f 49 4e 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  OINT"; break;.  
8610: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
8620: 43 55 52 53 49 56 45 20 20 20 20 20 20 20 20 20  CURSIVE         
8630: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8640: 52 45 43 55 52 53 49 56 45 22 3b 20 62 72 65 61  RECURSIVE"; brea
8650: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 20 20  k;.    default  
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f       : zCode="??
8680: 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ??"; break;.  }.
8690: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
86a0: 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44  t(&str);.  Tcl_D
86b0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74  StringAppend(&st
86c0: 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 2d  r, pDb->zAuth, -
86d0: 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  1);.  Tcl_DStrin
86e0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
86f0: 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20 54  str, zCode);.  T
8700: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
8710: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
8720: 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20 22 22  rg1 ? zArg1 : ""
8730: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
8740: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
8750: 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72 67  tr, zArg2 ? zArg
8760: 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  2 : "");.  Tcl_D
8770: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
8780: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 33 20  ent(&str, zArg3 
8790: 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a 20  ? zArg3 : "");. 
87a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
87b0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
87c0: 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20 3a 20  zArg4 ? zArg4 : 
87d0: 22 22 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  "");.#ifdef SQLI
87e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
87f0: 43 41 54 49 4f 4e 0a 20 20 54 63 6c 5f 44 53 74  CATION.  Tcl_DSt
8800: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
8810: 74 28 26 73 74 72 2c 20 7a 41 72 67 35 20 3f 20  t(&str, zArg5 ? 
8820: 7a 41 72 67 35 20 3a 20 22 22 29 3b 0a 23 65 6e  zArg5 : "");.#en
8830: 64 69 66 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47  dif.  rc = Tcl_G
8840: 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69  lobalEval(pDb->i
8850: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
8860: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
8870: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
8880: 65 28 26 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c  e(&str);.  zRepl
8890: 79 20 3d 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 3f  y = rc==TCL_OK ?
88a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
88b0: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
88c0: 29 20 3a 20 22 53 51 4c 49 54 45 5f 44 45 4e 59  ) : "SQLITE_DENY
88d0: 22 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  ";.  if( strcmp(
88e0: 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f  zReply,"SQLITE_O
88f0: 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  K")==0 ){.    rc
8900: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8910: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
8920: 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f  (zReply,"SQLITE_
8930: 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20  DENY")==0 ){.   
8940: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e   rc = SQLITE_DEN
8950: 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  Y;.  }else if( s
8960: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
8970: 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30  LITE_IGNORE")==0
8980: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
8990: 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65  ITE_IGNORE;.  }e
89a0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39  lse{.    rc = 99
89b0: 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  9;.  }.  return 
89c0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
89d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
89e0: 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  ORIZATION */../*
89f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8a00: 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66   reads a line of
8a10: 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20   text from FILE 
8a20: 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68  in, stores.** th
8a30: 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79  e text in memory
8a40: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
8a50: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75  alloc() and retu
8a60: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
8a70: 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e   to the text.  N
8a80: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
8a90: 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20  at end of file, 
8aa0: 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a  or if malloc().*
8ab0: 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  * fails..**.** T
8ac0: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
8ad0: 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65 22 20  like "readline" 
8ae0: 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c  but no command-l
8af0: 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69  ine editing.** i
8b00: 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f  s done..**.** co
8b10: 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e  pied from shell.
8b20: 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27  c from '.import'
8b30: 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74   command.*/.stat
8b40: 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67  ic char *local_g
8b50: 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 50 72  etline(char *zPr
8b60: 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b  ompt, FILE *in){
8b70: 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a  .  char *zLine;.
8b80: 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69    int nLine;.  i
8b90: 6e 74 20 6e 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d  nt n;..  nLine =
8ba0: 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20   100;.  zLine = 
8bb0: 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b  malloc( nLine );
8bc0: 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20  .  if( zLine==0 
8bd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
8be0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  = 0;.  while( 1 
8bf0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30  ){.    if( n+100
8c00: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
8c10: 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20  nLine = nLine*2 
8c20: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69  + 100;.      zLi
8c30: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
8c40: 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
8c50: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
8c60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
8c70: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
8c80: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
8c90: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
8ca0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
8cb0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
8cc0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
8cd0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
8ce0: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
8cf0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
8d00: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
8d10: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b  ( zLine[n] ){ n+
8d20: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30  +; }.    if( n>0
8d30: 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d   && zLine[n-1]==
8d40: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d  '\n' ){.      n-
8d50: 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e  -;.      zLine[n
8d60: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
8d70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
8d80: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
8d90: 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20   zLine, n+1 );. 
8da0: 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d   return zLine;.}
8db0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
8dc0: 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  nction is part o
8dd0: 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  f the implementa
8de0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d  tion of the comm
8df0: 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62  and:.**.**   $db
8e00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64   transaction [-d
8e10: 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61  eferred|-immedia
8e20: 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53  te|-exclusive] S
8e30: 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 49 74 20 69  CRIPT.**.** It i
8e40: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
8e50: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 73  evaluating the s
8e60: 63 72 69 70 74 20 53 43 52 49 50 54 20 74 6f 20  cript SCRIPT to 
8e70: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
8e80: 63 6b 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  ck.** the transa
8e90: 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
8ea0: 6e 74 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  nt opened by the
8eb0: 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d 20 63   [transaction] c
8ec0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
8ed0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
8ee0: 41 50 49 20 44 62 54 72 61 6e 73 50 6f 73 74 43  API DbTransPostC
8ef0: 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  md(.  ClientData
8f00: 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20 20 20   data[],        
8f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 61             /* da
8f20: 74 61 5b 30 5d 20 69 73 20 74 68 65 20 53 71 6c  ta[0] is the Sql
8f30: 69 74 65 33 44 62 2a 20 66 6f 72 20 24 64 62 20  ite3Db* for $db 
8f40: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
8f50: 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20  *interp,        
8f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c            /* Tcl
8f70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
8f80: 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20    int result    
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
8fb0: 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 53   of evaluating S
8fc0: 43 52 49 50 54 20 2a 2f 0a 29 7b 0a 20 20 73 74  CRIPT */.){.  st
8fd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8fe0: 2a 63 6f 6e 73 74 20 61 7a 45 6e 64 5b 5d 20 3d  *const azEnd[] =
8ff0: 20 7b 0a 20 20 20 20 22 52 45 4c 45 41 53 45 20   {.    "RELEASE 
9000: 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _tcl_transaction
9010: 22 2c 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d  ",        /* rc=
9020: 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61  =TCL_ERROR, nTra
9030: 6e 73 61 63 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20  nsaction!=0 */. 
9040: 20 20 20 22 43 4f 4d 4d 49 54 22 2c 20 20 20 20     "COMMIT",    
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 20 20 20 20 20 2f 2a 20 72 63 21 3d 54 43 4c        /* rc!=TCL
9070: 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63  _ERROR, nTransac
9080: 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20 20 22  tion==0 */.    "
9090: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74 63 6c  ROLLBACK TO _tcl
90a0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b 20 52  _transaction ; R
90b0: 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e  ELEASE _tcl_tran
90c0: 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 52  saction",.    "R
90d0: 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20  OLLBACK"        
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90f0: 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f   /* rc==TCL_ERRO
9100: 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  R, nTransaction=
9110: 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c  =0 */.  };.  Sql
9120: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
9130: 6c 69 74 65 44 62 2a 29 64 61 74 61 5b 30 5d 3b  liteDb*)data[0];
9140: 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75  .  int rc = resu
9150: 6c 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  lt;.  const char
9160: 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e   *zEnd;..  pDb->
9170: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
9180: 20 20 7a 45 6e 64 20 3d 20 61 7a 45 6e 64 5b 28    zEnd = azEnd[(
9190: 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 29 2a 32  rc==TCL_ERROR)*2
91a0: 20 2b 20 28 70 44 62 2d 3e 6e 54 72 61 6e 73 61   + (pDb->nTransa
91b0: 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70  ction==0)];..  p
91c0: 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b  Db->disableAuth+
91d0: 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  +;.  if( sqlite3
91e0: 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
91f0: 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b  End, 0, 0, 0) ){
9200: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
9210: 73 20 61 20 74 72 69 63 6b 79 20 73 63 65 6e 61  s a tricky scena
9220: 72 69 6f 20 74 6f 20 68 61 6e 64 6c 65 2e 20 54  rio to handle. T
9230: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 63  he most likely c
9240: 61 75 73 65 20 6f 66 20 61 6e 0a 20 20 20 20 20  ause of an.     
9250: 20 2a 2a 20 65 72 72 6f 72 20 69 73 20 74 68 61   ** error is tha
9260: 74 20 74 68 65 20 65 78 65 63 28 29 20 61 62 6f  t the exec() abo
9270: 76 65 20 77 61 73 20 61 6e 20 61 74 74 65 6d 70  ve was an attemp
9280: 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  t to commit the.
9290: 20 20 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76        ** top-lev
92a0: 65 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  el transaction t
92b0: 68 61 74 20 72 65 74 75 72 6e 65 64 20 53 51 4c  hat returned SQL
92c0: 49 54 45 5f 42 55 53 59 2e 20 4f 72 2c 20 6c 65  ITE_BUSY. Or, le
92d0: 73 73 20 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 20  ss likely,.     
92e0: 20 2a 2a 20 74 68 61 74 20 61 6e 20 49 4f 2d 65   ** that an IO-e
92f0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
9300: 64 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  d. In either cas
9310: 65 2c 20 74 68 72 6f 77 20 61 20 54 63 6c 20 65  e, throw a Tcl e
9320: 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a  xception.      *
9330: 2a 20 61 6e 64 20 74 72 79 20 74 6f 20 72 6f 6c  * and try to rol
9340: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
9350: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  ction..      **.
9360: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 69 74 20        ** But it 
9370: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 74 68  could also be th
9380: 61 74 20 74 68 65 20 75 73 65 72 20 65 78 65 63  at the user exec
9390: 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uted one or more
93a0: 20 42 45 47 49 4e 2c 0a 20 20 20 20 20 20 2a 2a   BEGIN,.      **
93b0: 20 43 4f 4d 4d 49 54 2c 20 53 41 56 45 50 4f 49   COMMIT, SAVEPOI
93c0: 4e 54 2c 20 52 45 4c 45 41 53 45 20 6f 72 20 52  NT, RELEASE or R
93d0: 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61 6e 64 73  OLLBACK commands
93e0: 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 75 73   that are confus
93f0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
9400: 73 20 6d 65 74 68 6f 64 27 73 20 6c 6f 67 69 63  s method's logic
9410: 2e 20 4e 6f 74 20 63 6c 65 61 72 20 68 6f 77 20  . Not clear how 
9420: 74 68 69 73 20 77 6f 75 6c 64 20 62 65 20 62 65  this would be be
9430: 73 74 20 68 61 6e 64 6c 65 64 2e 0a 20 20 20 20  st handled..    
9440: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21    */.    if( rc!
9450: 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20  =TCL_ERROR ){.  
9460: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9470: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
9480: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
9490: 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
94a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
94b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
94c0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
94d0: 62 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b  b->db, "ROLLBACK
94e0: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
94f0: 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41  .  pDb->disableA
9500: 75 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e  uth--;..  return
9510: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e   rc;.}../*.** Un
9520: 6c 65 73 73 20 53 51 4c 49 54 45 5f 54 45 53 54  less SQLITE_TEST
9530: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 69   is defined, thi
9540: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
9550: 73 69 6d 70 6c 65 20 77 72 61 70 70 65 72 20 61  simple wrapper a
9560: 72 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33  round.** sqlite3
9570: 5f 70 72 65 70 61 72 65 5f 76 32 28 29 2e 20 49  _prepare_v2(). I
9580: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  f SQLITE_TEST is
9590: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 69   defined, then i
95a0: 74 20 75 73 65 73 20 65 69 74 68 65 72 0a 2a 2a  t uses either.**
95b0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
95c0: 5f 76 32 28 29 20 6f 72 20 6c 65 67 61 63 79 20  _v2() or legacy 
95d0: 69 6e 74 65 72 66 61 63 65 20 73 71 6c 69 74 65  interface sqlite
95e0: 33 5f 70 72 65 70 61 72 65 28 29 2c 20 64 65 70  3_prepare(), dep
95f0: 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65  ending.** on whe
9600: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
9610: 5b 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70  [db_use_legacy_p
9620: 72 65 70 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20  repare] command 
9630: 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 74 6f  has been used to
9640: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68  .** configure th
9650: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
9660: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50 72  .static int dbPr
9670: 65 70 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44  epare(.  SqliteD
9680: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
9690: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
96a0: 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  base object */. 
96b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
96c0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
96d0: 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69   /* SQL to compi
96e0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
96f0: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20  stmt **ppStmt,  
9700: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
9710: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
9720: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
9730: 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20  ar **pzOut      
9740: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
9750: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20  Pointer to next 
9760: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
9770: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
9780: 6e 74 20 70 72 65 70 46 6c 61 67 73 20 3d 20 30  nt prepFlags = 0
9790: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
97a0: 54 45 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e  TEST.  if( pDb->
97b0: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 29  bLegacyPrepare )
97c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
97d0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
97e0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
97f0: 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a  ppStmt, pzOut);.
9800: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
9810: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
9820: 20 63 61 63 68 65 20 69 73 20 6c 61 72 67 65 2c   cache is large,
9830: 20 75 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   use the SQLITE_
9840: 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45  PREPARE_PERSISTE
9850: 4e 54 0a 20 20 2a 2a 20 66 6c 61 67 73 2c 20 77  NT.  ** flags, w
9860: 68 69 63 68 20 75 73 65 73 20 6c 65 73 73 20 6c  hich uses less l
9870: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
9880: 20 20 42 75 74 20 69 66 20 74 68 65 20 63 61 63    But if the cac
9890: 68 65 20 69 73 20 73 6d 61 6c 6c 2c 0a 20 20 2a  he is small,.  *
98a0: 2a 20 6f 6d 69 74 20 74 68 61 74 20 66 6c 61 67  * omit that flag
98b0: 20 74 6f 20 6d 61 6b 65 20 66 75 6c 6c 20 75 73   to make full us
98c0: 65 20 6f 66 20 6c 6f 6f 6b 61 73 69 64 65 20 2a  e of lookaside *
98d0: 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78  /.  if( pDb->max
98e0: 53 74 6d 74 3e 35 20 29 20 70 72 65 70 46 6c 61  Stmt>5 ) prepFla
98f0: 67 73 20 3d 20 53 51 4c 49 54 45 5f 50 52 45 50  gs = SQLITE_PREP
9900: 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54 3b 0a  ARE_PERSISTENT;.
9910: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
9920: 33 5f 70 72 65 70 61 72 65 5f 76 33 28 70 44 62  3_prepare_v3(pDb
9930: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
9940: 70 72 65 70 46 6c 61 67 73 2c 20 70 70 53 74 6d  prepFlags, ppStm
9950: 74 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a  t, pzOut);.}../*
9960: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 63  .** Search the c
9970: 61 63 68 65 20 66 6f 72 20 61 20 70 72 65 70 61  ache for a prepa
9980: 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62  red-statement ob
9990: 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
99a0: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  ents the.** firs
99b0: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
99c0: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
99d0: 69 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72 61  inted to by para
99e0: 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a  meter zIn. If.**
99f0: 20 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72 65   no such prepare
9a00: 64 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20  d-statement can 
9a10: 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61  be found, alloca
9a20: 74 65 20 61 6e 64 20 70 72 65 70 61 72 65 20 61  te and prepare a
9a30: 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20   new.** one. In 
9a40: 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e  either case, bin
9a50: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
9a60: 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65  lues of the rele
9a70: 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69  vant Tcl.** vari
9a80: 61 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61  ables to any $va
9a90: 72 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20  r, :var or @var 
9aa0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
9ab0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f   statement. Befo
9ac0: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c  re.** returning,
9ad0: 20 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20   set *ppPreStmt 
9ae0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
9af0: 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65  prepared-stateme
9b00: 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  nt object..**.**
9b10: 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
9b20: 72 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20  r *pzOut is set 
9b30: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
9b40: 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  next SQL stateme
9b50: 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20  nt in.** buffer 
9b60: 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27  zIn, or to the '
9b70: 5c 30 27 20 62 79 74 65 20 61 74 20 74 68 65 20  \0' byte at the 
9b80: 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68  end of zIn if th
9b90: 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78  ere is no.** nex
9ba0: 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  t statement..**.
9bb0: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
9bc0: 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75  , TCL_OK is retu
9bd0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
9be0: 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65   TCL_ERROR is re
9bf0: 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  turned.** and an
9c00: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c   error message l
9c10: 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72  oaded into inter
9c20: 70 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65  preter pDb->inte
9c30: 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rp..*/.static in
9c40: 74 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69  t dbPrepareAndBi
9c50: 6e 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  nd(.  SqliteDb *
9c60: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
9c70: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9c80: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  e object */.  ch
9c90: 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20  ar const *zIn,  
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9cb0: 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20   SQL to compile 
9cc0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
9cd0: 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20  **pzOut,        
9ce0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
9cf0: 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c  nter to next SQL
9d00: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
9d10: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
9d20: 2a 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20 20  **ppPreStmt     
9d30: 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75  /* OUT: Object u
9d40: 73 65 64 20 74 6f 20 63 61 63 68 65 20 73 74 61  sed to cache sta
9d50: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  tement */.){.  c
9d60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
9d70: 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f  = zIn;         /
9d80: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
9d90: 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  st SQL statement
9da0: 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c   in zIn */.  sql
9db0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
9dc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
9dd0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
9de0: 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53  nt object */.  S
9df0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
9e00: 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f  pPreStmt;      /
9e10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63  * Pointer to cac
9e20: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  hed statement */
9e30: 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20  .  int nSql;    
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
9e60: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  zSql in bytes */
9e70: 0a 20 20 69 6e 74 20 6e 56 61 72 20 3d 20 30 3b  .  int nVar = 0;
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9ea0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61  variables in sta
9eb0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
9ec0: 69 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20  iParm = 0;      
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9ee0: 65 78 74 20 66 72 65 65 20 65 6e 74 72 79 20 69  ext free entry i
9ef0: 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 63 68  n apParm */.  ch
9f00: 61 72 20 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ar c;.  int i;. 
9f10: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
9f20: 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72  erp = pDb->inter
9f30: 70 3b 0a 0a 20 20 2a 70 70 50 72 65 53 74 6d 74  p;..  *ppPreStmt
9f40: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 69 6d   = 0;..  /* Trim
9f50: 20 73 70 61 63 65 73 20 66 72 6f 6d 20 74 68 65   spaces from the
9f60: 20 73 74 61 72 74 20 6f 66 20 7a 53 71 6c 20 61   start of zSql a
9f70: 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65  nd calculate the
9f80: 20 72 65 6d 61 69 6e 69 6e 67 20 6c 65 6e 67 74   remaining lengt
9f90: 68 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 28  h. */.  while( (
9fa0: 63 20 3d 20 7a 53 71 6c 5b 30 5d 29 3d 3d 27 20  c = zSql[0])==' 
9fb0: 27 20 7c 7c 20 63 3d 3d 27 5c 74 27 20 7c 7c 20  ' || c=='\t' || 
9fc0: 63 3d 3d 27 5c 72 27 20 7c 7c 20 63 3d 3d 27 5c  c=='\r' || c=='\
9fd0: 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a  n' ){ zSql++; }.
9fe0: 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33    nSql = strlen3
9ff0: 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f 72 28  0(zSql);..  for(
a000: 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e  pPreStmt = pDb->
a010: 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74  stmtList; pPreSt
a020: 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72  mt; pPreStmt=pPr
a030: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  eStmt->pNext){. 
a040: 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65 53     int n = pPreS
a050: 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 69  tmt->nSql;.    i
a060: 66 28 20 6e 53 71 6c 3e 3d 6e 0a 20 20 20 20 20  f( nSql>=n.     
a070: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72     && memcmp(pPr
a080: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
a090: 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  l, n)==0.       
a0a0: 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20   && (zSql[n]==0 
a0b0: 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b  || zSql[n-1]==';
a0c0: 27 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ').    ){.      
a0d0: 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  pStmt = pPreStmt
a0e0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 2a  ->pStmt;.      *
a0f0: 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c 5b 70 50  pzOut = &zSql[pP
a100: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a  reStmt->nSql];..
a110: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20        /* When a 
a120: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a130: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c  nt is found, unl
a140: 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ink it from the.
a150: 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c        ** cache l
a160: 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61  ist.  It will la
a170: 74 65 72 20 62 65 20 61 64 64 65 64 20 62 61 63  ter be added bac
a180: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
a190: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ng.      ** of t
a1a0: 68 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e  he cache list in
a1b0: 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
a1c0: 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d  ent LRU replacem
a1d0: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
a1e0: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
a1f0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
a200: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
a210: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65  ev->pNext = pPre
a220: 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Stmt->pNext;.   
a230: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a240: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
a250: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
a260: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
a270: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70   if( pPreStmt->p
a280: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
a290: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d  pPreStmt->pNext-
a2a0: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
a2b0: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
a2c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a2d0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
a2e0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
a2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44        }.      pD
a300: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
a310: 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33    nVar = sqlite3
a320: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
a330: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
a340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a350: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
a360: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
a370: 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 43  ent was found. C
a380: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74  ompile the SQL t
a390: 65 78 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ext. Also alloca
a3a0: 74 65 0a 20 20 2a 2a 20 61 20 6e 65 77 20 53 71  te.  ** a new Sq
a3b0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 73 74  lPreparedStmt st
a3c0: 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 69  ructure.  */.  i
a3d0: 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  f( pPreStmt==0 )
a3e0: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  {.    int nByte;
a3f0: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
a400: 5f 4f 4b 21 3d 64 62 50 72 65 70 61 72 65 28 70  _OK!=dbPrepare(p
a410: 44 62 2c 20 7a 53 71 6c 2c 20 26 70 53 74 6d 74  Db, zSql, &pStmt
a420: 2c 20 70 7a 4f 75 74 29 20 29 7b 0a 20 20 20 20  , pzOut) ){.    
a430: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
a440: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
a450: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
a460: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
a470: 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  db), -1));.     
a480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a490: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
a4a0: 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   pStmt==0 ){.   
a4b0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
a4c0: 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
a4d0: 65 28 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20  e(pDb->db) ){.  
a4e0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69        /* A compi
a4f0: 6c 65 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e  le-time error in
a500: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
a510: 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  */.        Tcl_S
a520: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a530: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
a540: 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72  gObj(sqlite3_err
a550: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31  msg(pDb->db), -1
a560: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
a570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a590: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d     /* The statem
a5a0: 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e  ent was a no-op.
a5b0: 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68    Continue to th
a5c0: 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  e next statement
a5d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
a5e0: 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20  he SQL string.. 
a5f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a600: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
a610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
a620: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
a630: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Stmt==0 );.    n
a640: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
a650: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
a660: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 6e  nt(pStmt);.    n
a670: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 53 71  Byte = sizeof(Sq
a680: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 29 20 2b  lPreparedStmt) +
a690: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 54 63 6c   nVar*sizeof(Tcl
a6a0: 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20 20 70 50 72  _Obj *);.    pPr
a6b0: 65 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70  eStmt = (SqlPrep
a6c0: 61 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c  aredStmt*)Tcl_Al
a6d0: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  loc(nByte);.    
a6e0: 6d 65 6d 73 65 74 28 70 50 72 65 53 74 6d 74 2c  memset(pPreStmt,
a6f0: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20   0, nByte);..   
a700: 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74   pPreStmt->pStmt
a710: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 70 50   = pStmt;.    pP
a720: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 28  reStmt->nSql = (
a730: 69 6e 74 29 28 2a 70 7a 4f 75 74 20 2d 20 7a 53  int)(*pzOut - zS
a740: 71 6c 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  ql);.    pPreStm
a750: 74 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  t->zSql = sqlite
a760: 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
a770: 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61    pPreStmt->apPa
a780: 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a  rm = (Tcl_Obj **
a790: 29 26 70 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 23  )&pPreStmt[1];.#
a7a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
a7b0: 54 0a 20 20 20 20 69 66 28 20 70 50 72 65 53 74  T.    if( pPreSt
a7c0: 6d 74 2d 3e 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  mt->zSql==0 ){. 
a7d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79       char *zCopy
a7e0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 70 50 72   = Tcl_Alloc(pPr
a7f0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 2b 20 31 29  eStmt->nSql + 1)
a800: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
a810: 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 70 50 72 65  Copy, zSql, pPre
a820: 53 74 6d 74 2d 3e 6e 53 71 6c 29 3b 0a 20 20 20  Stmt->nSql);.   
a830: 20 20 20 7a 43 6f 70 79 5b 70 50 72 65 53 74 6d     zCopy[pPreStm
a840: 74 2d 3e 6e 53 71 6c 5d 20 3d 20 27 5c 30 27 3b  t->nSql] = '\0';
a850: 0a 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d  .      pPreStmt-
a860: 3e 7a 53 71 6c 20 3d 20 7a 43 6f 70 79 3b 0a 20  >zSql = zCopy;. 
a870: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a880: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74    assert( pPreSt
a890: 6d 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mt );.  assert( 
a8a0: 73 74 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d  strlen30(pPreStm
a8b0: 74 2d 3e 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74  t->zSql)==pPreSt
a8c0: 6d 74 2d 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73  mt->nSql );.  as
a8d0: 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28  sert( 0==memcmp(
a8e0: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
a8f0: 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e  zSql, pPreStmt->
a900: 6e 53 71 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42  nSql) );..  /* B
a910: 69 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61  ind values to pa
a920: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65  rameters that be
a930: 67 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 20  gin with $ or : 
a940: 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
a950: 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  =nVar; i++){.   
a960: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
a970: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
a980: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
a990: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69  pStmt, i);.    i
a9a0: 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a  f( zVar!=0 && (z
a9b0: 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a  Var[0]=='$' || z
a9c0: 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a  Var[0]==':' || z
a9d0: 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a  Var[0]=='@') ){.
a9e0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
a9f0: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
aa00: 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61  2Ex(interp, &zVa
aa10: 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r[1], 0, 0);.   
aa20: 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20     if( pVar ){. 
aa30: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
aa40: 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a        u8 *data;.
aa50: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
aa60: 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61  ar *zType = (pVa
aa70: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
aa80: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
aa90: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
aaa0: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
aab0: 20 20 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30        if( zVar[0
aac0: 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20  ]=='@' ||.      
aad0: 20 20 20 20 20 28 63 3d 3d 27 62 27 20 26 26 20       (c=='b' && 
aae0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
aaf0: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
ab00: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20  pVar->bytes==0) 
ab10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
ab20: 4c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65  Load a BLOB type
ab30: 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69   if the Tcl vari
ab40: 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72  able is a bytear
ab50: 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ray and.        
ab60: 20 20 2a 2a 20 69 74 20 68 61 73 20 6e 6f 20 73    ** it has no s
ab70: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
ab80: 74 69 6f 6e 20 6f 72 20 74 68 65 20 68 6f 73 74  tion or the host
ab90: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
aba0: 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67  rameter name beg
abb0: 69 6e 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f  ins with "@". */
abc0: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  .          data 
abd0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
abe0: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
abf0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &n);.          s
ac00: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
ac10: 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c  (pStmt, i, data,
ac20: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
ac30: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  C);.          Tc
ac40: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
ac50: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
ac60: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
ac70: 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [iParm++] = pVar
ac80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ac90: 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74  if( c=='b' && st
aca0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
acb0: 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ean")==0 ){.    
acc0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
acd0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ace0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
acf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
ad00: 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20  d_int(pStmt, i, 
ad10: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
ad20: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
ad30: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
ad40: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
ad50: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b         double r;
ad60: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
ad70: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
ad80: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72  interp, pVar, &r
ad90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ada0: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
adb0: 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20  (pStmt, i, r);. 
adc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
add0: 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63   (c=='w' && strc
ade0: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
adf0: 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  t")==0) ||.     
ae00: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27           (c=='i'
ae10: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
ae20: 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20  ,"int")==0) ){. 
ae30: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64           Tcl_Wid
ae40: 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20  eInt v;.        
ae50: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
ae60: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ae70: 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  pVar, &v);.     
ae80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
ae90: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  d_int64(pStmt, i
aea0: 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , v);.        }e
aeb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
aec0: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
aed0: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
aee0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
aef0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
af00: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
af10: 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68  xt(pStmt, i, (ch
af20: 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51  ar *)data, n, SQ
af30: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
af40: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
af50: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
af60: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
af70: 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d  mt->apParm[iParm
af80: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
af90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
afa0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
afb0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
afc0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  mt, i);.      }.
afd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 72 65      }.  }.  pPre
afe0: 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 69 50  Stmt->nParm = iP
aff0: 61 72 6d 3b 0a 20 20 2a 70 70 50 72 65 53 74 6d  arm;.  *ppPreStm
b000: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 0a 20  t = pPreStmt;.. 
b010: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
b020: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
b030: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66   a statement ref
b040: 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20  erence obtained 
b050: 62 79 20 63 61 6c 6c 69 6e 67 20 64 62 50 72 65  by calling dbPre
b060: 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a  pareAndBind()..*
b070: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
b080: 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61  e exactly one ca
b090: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
b0a0: 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ion for each cal
b0b0: 6c 20 74 6f 0a 2a 2a 20 64 62 50 72 65 70 61 72  l to.** dbPrepar
b0c0: 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 0a 2a  eAndBind()..**.*
b0d0: 2a 20 49 66 20 74 68 65 20 64 69 73 63 61 72 64  * If the discard
b0e0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
b0f0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
b100: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65   statement is de
b110: 6c 65 74 65 64 0a 2a 2a 20 69 6d 6d 65 64 69 61  leted.** immedia
b120: 74 65 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 20  tely. Otherwise 
b130: 69 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  it is added to t
b140: 68 65 20 4c 52 55 20 6c 69 73 74 20 61 6e 64 20  he LRU list and 
b150: 6d 61 79 20 62 65 20 72 65 74 75 72 6e 65 64 0a  may be returned.
b160: 2a 2a 20 62 79 20 61 20 73 75 62 73 65 71 75 65  ** by a subseque
b170: 6e 74 20 63 61 6c 6c 20 74 6f 20 64 62 50 72 65  nt call to dbPre
b180: 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a  pareAndBind()..*
b190: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
b1a0: 52 65 6c 65 61 73 65 53 74 6d 74 28 0a 20 20 53  ReleaseStmt(.  S
b1b0: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20  qliteDb *pDb,   
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b1d0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
b1e0: 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  e */.  SqlPrepar
b1f0: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
b200: 2c 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72  ,      /* Prepar
b210: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e  ed statement han
b220: 64 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 2a  dle to release *
b230: 2f 0a 20 20 69 6e 74 20 64 69 73 63 61 72 64 20  /.  int discard 
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b250: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64      /* True to d
b260: 65 6c 65 74 65 20 28 6e 6f 74 20 63 61 63 68 65  elete (not cache
b270: 29 20 74 68 65 20 70 50 72 65 53 74 6d 74 20 2a  ) the pPreStmt *
b280: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  /.){.  int i;.. 
b290: 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75   /* Free the bou
b2a0: 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c  nd string and bl
b2b0: 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ob parameters */
b2c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
b2d0: 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 3b 20 69  reStmt->nParm; i
b2e0: 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  ++){.    Tcl_Dec
b2f0: 72 52 65 66 43 6f 75 6e 74 28 70 50 72 65 53 74  rRefCount(pPreSt
b300: 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 5d 29 3b 0a  mt->apParm[i]);.
b310: 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e    }.  pPreStmt->
b320: 6e 50 61 72 6d 20 3d 20 30 3b 0a 0a 20 20 69 66  nParm = 0;..  if
b330: 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d  ( pDb->maxStmt<=
b340: 30 20 7c 7c 20 64 69 73 63 61 72 64 20 29 7b 0a  0 || discard ){.
b350: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
b360: 63 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66  che is turned of
b370: 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74  f, deallocated t
b380: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
b390: 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28 70      dbFreeStmt(p
b3a0: 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73  PreStmt);.  }els
b3b0: 65 7b 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  e{.    /* Add th
b3c0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
b3d0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69  ment to the begi
b3e0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63  nning of the cac
b3f0: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  he list. */.    
b400: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
b410: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
b420: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70  .    pPreStmt->p
b430: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
b440: 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20  ( pDb->stmtList 
b450: 29 7b 0a 20 20 20 20 20 70 44 62 2d 3e 73 74 6d  ){.     pDb->stm
b460: 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  tList->pPrev = p
b470: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20  PreStmt;.    }. 
b480: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
b490: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
b4a0: 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61   if( pDb->stmtLa
b4b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  st==0 ){.      a
b4c0: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
b4d0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44  t==0 );.      pD
b4e0: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50  b->stmtLast = pP
b4f0: 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73  reStmt;.    }els
b500: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
b510: 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b   pDb->nStmt>0 );
b520: 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e  .    }.    pDb->
b530: 6e 53 74 6d 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  nStmt++;..    /*
b540: 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20   If we have too 
b550: 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69  many statement i
b560: 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20  n cache, remove 
b570: 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d  the surplus from
b580: 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 64 20  .    ** the end 
b590: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
b5a0: 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  t.  */.    while
b5b0: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62  ( pDb->nStmt>pDb
b5c0: 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20  ->maxStmt ){.   
b5d0: 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74     SqlPreparedSt
b5e0: 6d 74 20 2a 70 4c 61 73 74 20 3d 20 70 44 62 2d  mt *pLast = pDb-
b5f0: 3e 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20 20  >stmtLast;.     
b600: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
b610: 20 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20   pLast->pPrev;. 
b620: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
b630: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  st->pNext = 0;. 
b640: 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d       pDb->nStmt-
b650: 2d 3b 0a 20 20 20 20 20 20 64 62 46 72 65 65 53  -;.      dbFreeS
b660: 74 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20 20 20  tmt(pLast);.    
b670: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
b680: 74 72 75 63 74 75 72 65 20 75 73 65 64 20 77 69  tructure used wi
b690: 74 68 20 64 62 45 76 61 6c 58 58 58 28 29 20 66  th dbEvalXXX() f
b6a0: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
b6b0: 20 20 64 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a    dbEvalInit().*
b6c0: 2a 20 20 20 64 62 45 76 61 6c 53 74 65 70 28 29  *   dbEvalStep()
b6d0: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 46 69 6e 61  .**   dbEvalFina
b6e0: 6c 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45 76  lize().**   dbEv
b6f0: 61 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20  alRowInfo().**  
b700: 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
b710: 75 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ue().*/.typedef 
b720: 73 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e  struct DbEvalCon
b730: 74 65 78 74 20 44 62 45 76 61 6c 43 6f 6e 74 65  text DbEvalConte
b740: 78 74 3b 0a 73 74 72 75 63 74 20 44 62 45 76 61  xt;.struct DbEva
b750: 6c 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c  lContext {.  Sql
b760: 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20  iteDb *pDb;     
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b780: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
b790: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
b7a0: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
b7b0: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68       /* Object h
b7c0: 6f 6c 64 69 6e 67 20 73 74 72 69 6e 67 20 7a 53  olding string zS
b7d0: 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ql */.  const ch
b7e0: 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
b7f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69          /* Remai
b800: 6e 69 6e 67 20 53 51 4c 20 74 6f 20 65 78 65 63  ning SQL to exec
b810: 75 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70  ute */.  SqlPrep
b820: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
b830: 6d 74 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72  mt;      /* Curr
b840: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ent statement */
b850: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b880: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
b890: 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 69   by pStmt */.  i
b8a0: 6e 74 20 65 76 61 6c 46 6c 61 67 73 3b 20 20 20  nt evalFlags;   
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8c0: 2a 20 46 6c 61 67 73 20 75 73 65 64 20 2a 2f 0a  * Flags used */.
b8d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61    Tcl_Obj *pArra
b8e0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
b8f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72    /* Name of arr
b900: 61 79 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  ay variable */. 
b910: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c   Tcl_Obj **apCol
b920: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
b930: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
b940: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a  umn names */.};.
b950: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
b960: 45 56 41 4c 5f 57 49 54 48 4f 55 54 4e 55 4c 4c  EVAL_WITHOUTNULL
b970: 53 20 20 30 78 30 30 30 30 31 20 20 2f 2a 20 55  S  0x00001  /* U
b980: 6e 73 65 74 20 61 72 72 61 79 28 2a 29 20 66 6f  nset array(*) fo
b990: 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  r NULL */../*.**
b9a0: 20 52 65 6c 65 61 73 65 20 61 6e 79 20 63 61 63   Release any cac
b9b0: 68 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  he of column nam
b9c0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  es currently hel
b9d0: 64 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20  d as part of.** 
b9e0: 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  the DbEvalContex
b9f0: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
ba00: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
ba10: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
ba20: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
ba30: 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44 62  seColumnNames(Db
ba40: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b  EvalContext *p){
ba50: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 6f 6c 4e  .  if( p->apColN
ba60: 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ame ){.    int i
ba70: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ba80: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
ba90: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
baa0: 66 43 6f 75 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e  fCount(p->apColN
bab0: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ame[i]);.    }. 
bac0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
bad0: 72 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65  r *)p->apColName
bae0: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e  );.    p->apColN
baf0: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ame = 0;.  }.  p
bb00: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nCol = 0;.}../
bb10: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
bb20: 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  a DbEvalContext 
bb30: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
bb40: 20 49 66 20 70 41 72 72 61 79 20 69 73 20 6e 6f   If pArray is no
bb50: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
bb60: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
bb70: 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72 61 79  e of a Tcl array
bb80: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 54 68  .** variable. Th
bb90: 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20  e "*" member of 
bba0: 74 68 69 73 20 61 72 72 61 79 20 69 73 20 73 65  this array is se
bbb0: 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74  t to a list cont
bbc0: 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61  aining.** the na
bbd0: 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
bbe0: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ns returned by t
bbf0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20  he statement as 
bc00: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
bc10: 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 53 74  call to dbEvalSt
bc20: 65 70 28 29 2c 20 69 6e 20 6f 72 64 65 72 20 66  ep(), in order f
bc30: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
bc40: 74 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e  t. e.g. if the n
bc50: 61 6d 65 73 0a 2a 2a 20 6f 66 20 74 68 65 20 72  ames.** of the r
bc60: 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  eturned columns 
bc70: 61 72 65 20 61 2c 20 62 20 61 6e 64 20 63 2c 20  are a, b and c, 
bc80: 69 74 20 64 6f 65 73 20 74 68 65 20 65 71 75 69  it does the equi
bc90: 76 61 6c 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  valent of the.**
bca0: 20 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a   tcl command:.**
bcb0: 0a 2a 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41  .**     set ${pA
bcc0: 72 72 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d  rray}(*) {a b c}
bcd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bce0: 64 62 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62  dbEvalInit(.  Db
bcf0: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20  EvalContext *p, 
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75   Pointer to stru
bd20: 63 74 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c  cture to initial
bd30: 69 7a 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44  ize */.  SqliteD
bd40: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
bd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
bd60: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
bd70: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20   Tcl_Obj *pSql, 
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 2f 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61   /* Object conta
bda0: 69 6e 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74  ining SQL script
bdb0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
bdc0: 41 72 72 61 79 2c 20 20 20 20 20 20 20 20 20 20  Array,          
bdd0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
bde0: 20 54 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65   Tcl array to se
bdf0: 74 20 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66  t (*) element of
be00: 20 2a 2f 0a 20 20 69 6e 74 20 65 76 61 6c 46 6c   */.  int evalFl
be10: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
be20: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 63        /* Flags c
be30: 6f 6e 74 72 6f 6c 6c 69 6e 67 20 65 76 61 6c 75  ontrolling evalu
be40: 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 6d 65  ation */.){.  me
be50: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
be60: 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29  f(DbEvalContext)
be70: 29 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44  );.  p->pDb = pD
be80: 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 54  b;.  p->zSql = T
be90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 53 71  cl_GetString(pSq
bea0: 6c 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d 20  l);.  p->pSql = 
beb0: 70 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  pSql;.  Tcl_Incr
bec0: 52 65 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b 0a  RefCount(pSql);.
bed0: 20 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a    if( pArray ){.
bee0: 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20      p->pArray = 
bef0: 70 41 72 72 61 79 3b 0a 20 20 20 20 54 63 6c 5f  pArray;.    Tcl_
bf00: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 41 72  IncrRefCount(pAr
bf10: 72 61 79 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65  ray);.  }.  p->e
bf20: 76 61 6c 46 6c 61 67 73 20 3d 20 65 76 61 6c 46  valFlags = evalF
bf30: 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  lags;.}../*.** O
bf40: 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  btain informatio
bf50: 6e 20 61 62 6f 75 74 20 74 68 65 20 72 6f 77 20  n about the row 
bf60: 74 68 61 74 20 74 68 65 20 44 62 45 76 61 6c 43  that the DbEvalC
bf70: 6f 6e 74 65 78 74 20 70 61 73 73 65 64 20 61 73  ontext passed as
bf80: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
bf90: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
bfa0: 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
bfb0: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
bfc0: 6c 52 6f 77 49 6e 66 6f 28 0a 20 20 44 62 45 76  lRowInfo(.  DbEv
bfd0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  alContext *p,   
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
bff0: 76 61 6c 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78  valuation contex
c000: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f  t */.  int *pnCo
c010: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
c020: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
c030: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20  umber of column 
c040: 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  names */.  Tcl_O
c050: 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65  bj ***papColName
c060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
c070: 54 3a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  T: Array of colu
c080: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20  mn names */.){. 
c090: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75   /* Compute colu
c0a0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66  mn names */.  if
c0b0: 28 20 30 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d  ( 0==p->apColNam
c0c0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
c0d0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70  _stmt *pStmt = p
c0e0: 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  ->pPreStmt->pStm
c0f0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  t;.    int i;   
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
c120: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
c130: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c150: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
c160: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
c170: 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c  pStmt */.    Tcl
c180: 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65  _Obj **apColName
c190: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 41 72   = 0;      /* Ar
c1a0: 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ray of column na
c1b0: 6d 65 73 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e  mes */..    p->n
c1c0: 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c  Col = nCol = sql
c1d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
c1e0: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  t(pStmt);.    if
c1f0: 28 20 6e 43 6f 6c 3e 30 20 26 26 20 28 70 61 70  ( nCol>0 && (pap
c200: 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41  ColName || p->pA
c210: 72 72 61 79 29 20 29 7b 0a 20 20 20 20 20 20 61  rray) ){.      a
c220: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f  pColName = (Tcl_
c230: 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Obj**)Tcl_Alloc(
c240: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a   sizeof(Tcl_Obj*
c250: 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  )*nCol );.      
c260: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
c270: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
c280: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 54 63  pColName[i] = Tc
c290: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
c2a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
c2b0: 6d 65 28 70 53 74 6d 74 2c 69 29 2c 20 2d 31 29  me(pStmt,i), -1)
c2c0: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e  ;.        Tcl_In
c2d0: 63 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c  crRefCount(apCol
c2e0: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Name[i]);.      
c2f0: 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c  }.      p->apCol
c300: 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65  Name = apColName
c310: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c320: 49 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  If results are b
c330: 65 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61  eing stored in a
c340: 6e 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  n array variable
c350: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20  , then create.  
c360: 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a    ** the array(*
c370: 29 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74  ) entry for that
c380: 20 61 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20   array.    */.  
c390: 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20    if( p->pArray 
c3a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 74  ){.      Tcl_Int
c3b0: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d  erp *interp = p-
c3c0: 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  >pDb->interp;.  
c3d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f      Tcl_Obj *pCo
c3e0: 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  lList = Tcl_NewO
c3f0: 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
c400: 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c  Obj *pStar = Tcl
c410: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a  _NewStringObj("*
c420: 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66  ", -1);..      f
c430: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
c440: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63  i++){.        Tc
c450: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
c460: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
c470: 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61  ColList, apColNa
c480: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  me[i]);.      }.
c490: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
c4a0: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
c4b0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
c4c0: 61 72 32 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70  ar2(interp, p->p
c4d0: 41 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43  Array, pStar, pC
c4e0: 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  olList, 0);.    
c4f0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c500: 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20 7d  nt(pStar);.    }
c510: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 70 43  .  }..  if( papC
c520: 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70  olName ){.    *p
c530: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61  apColName = p->a
c540: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  pColName;.  }.  
c550: 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20  if( pnCol ){.   
c560: 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f   *pnCol = p->nCo
c570: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
c580: 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43  Return one of TC
c590: 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20  L_OK, TCL_BREAK 
c5a0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66  or TCL_ERROR. If
c5b0: 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a   TCL_ERROR is.**
c5c0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
c5d0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c5e0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
c5f0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 62 65  e interpreter be
c600: 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
c610: 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72  g..**.** A retur
c620: 6e 20 76 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f  n value of TCL_O
c630: 4b 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  K means there is
c640: 20 61 20 72 6f 77 20 6f 66 20 64 61 74 61 20 61   a row of data a
c650: 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a  vailable. The.**
c660: 20 64 61 74 61 20 6d 61 79 20 62 65 20 61 63 63   data may be acc
c670: 65 73 73 65 64 20 75 73 69 6e 67 20 64 62 45 76  essed using dbEv
c680: 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20  alRowInfo() and 
c690: 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
c6a0: 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  e(). This.** is 
c6b0: 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72  analogous to a r
c6c0: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
c6d0: 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ROW from sqlite3
c6e0: 5f 73 74 65 70 28 29 2e 20 49 66 20 54 43 4c 5f  _step(). If TCL_
c6f0: 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75  BREAK.** is retu
c700: 72 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53  rned, then the S
c710: 51 4c 20 73 63 72 69 70 74 20 68 61 73 20 66 69  QL script has fi
c720: 6e 69 73 68 65 64 20 65 78 65 63 75 74 69 6e 67  nished executing
c730: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 0a 2a   and there are.*
c740: 2a 20 6e 6f 20 66 75 72 74 68 65 72 20 72 6f 77  * no further row
c750: 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69  s available. Thi
c760: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
c770: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a  SQLITE_DONE..*/.
c780: 73 74 61 74 69 63 20 69 6e 74 20 64 62 45 76 61  static int dbEva
c790: 6c 53 74 65 70 28 44 62 45 76 61 6c 43 6f 6e 74  lStep(DbEvalCont
c7a0: 65 78 74 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  ext *p){.  const
c7b0: 20 63 68 61 72 20 2a 7a 50 72 65 76 53 71 6c 20   char *zPrevSql 
c7c0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 72  = 0;       /* Pr
c7d0: 65 76 69 6f 75 73 20 76 61 6c 75 65 20 6f 66 20  evious value of 
c7e0: 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a 20 20 77 68  p->zSql */..  wh
c7f0: 69 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20  ile( p->zSql[0] 
c800: 7c 7c 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  || p->pPreStmt )
c810: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
c820: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d    if( p->pPreStm
c830: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50  t==0 ){.      zP
c840: 72 65 76 53 71 6c 20 3d 20 28 70 2d 3e 7a 53 71  revSql = (p->zSq
c850: 6c 3d 3d 7a 50 72 65 76 53 71 6c 20 3f 20 30 20  l==zPrevSql ? 0 
c860: 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  : p->zSql);.    
c870: 20 20 72 63 20 3d 20 64 62 50 72 65 70 61 72 65    rc = dbPrepare
c880: 41 6e 64 42 69 6e 64 28 70 2d 3e 70 44 62 2c 20  AndBind(p->pDb, 
c890: 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 7a 53 71  p->zSql, &p->zSq
c8a0: 6c 2c 20 26 70 2d 3e 70 50 72 65 53 74 6d 74 29  l, &p->pPreStmt)
c8b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c8c0: 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  TCL_OK ) return 
c8d0: 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rc;.    }else{. 
c8e0: 20 20 20 20 20 69 6e 74 20 72 63 73 3b 0a 20 20       int rcs;.  
c8f0: 20 20 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44      SqliteDb *pD
c900: 62 20 3d 20 70 2d 3e 70 44 62 3b 0a 20 20 20 20  b = p->pDb;.    
c910: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
c920: 74 20 2a 70 50 72 65 53 74 6d 74 20 3d 20 70 2d  t *pPreStmt = p-
c930: 3e 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20  >pPreStmt;.     
c940: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
c950: 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Stmt = pPreStmt-
c960: 3e 70 53 74 6d 74 3b 0a 0a 20 20 20 20 20 20 72  >pStmt;..      r
c970: 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  cs = sqlite3_ste
c980: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
c990: 69 66 28 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f  if( rcs==SQLITE_
c9a0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ROW ){.        r
c9b0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
c9c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c9d0: 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20  p->pArray ){.   
c9e0: 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e       dbEvalRowIn
c9f0: 66 6f 28 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  fo(p, 0, 0);.   
ca00: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 73 20 3d     }.      rcs =
ca10: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
ca20: 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 70 44  Stmt);..      pD
ca30: 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71 6c 69 74  b->nStep = sqlit
ca40: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
ca50: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
ca60: 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
ca70: 53 54 45 50 2c 31 29 3b 0a 20 20 20 20 20 20 70  STEP,1);.      p
ca80: 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69  Db->nSort = sqli
ca90: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
caa0: 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d  pStmt,SQLITE_STM
cab0: 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 31 29 3b  TSTATUS_SORT,1);
cac0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 49 6e 64  .      pDb->nInd
cad0: 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ex = sqlite3_stm
cae0: 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53  t_status(pStmt,S
caf0: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
cb00: 5f 41 55 54 4f 49 4e 44 45 58 2c 31 29 3b 0a 20  _AUTOINDEX,1);. 
cb10: 20 20 20 20 20 70 44 62 2d 3e 6e 56 4d 53 74 65       pDb->nVMSte
cb20: 70 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  p = sqlite3_stmt
cb30: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51  _status(pStmt,SQ
cb40: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
cb50: 56 4d 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20 20  VM_STEP,1);.    
cb60: 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d    dbReleaseColum
cb70: 6e 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20 20 20  nNames(p);.     
cb80: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30   p->pPreStmt = 0
cb90: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 73  ;..      if( rcs
cba0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cbb0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72         /* If a r
cbc0: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63  un-time error oc
cbd0: 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65  curs, report the
cbe0: 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20   error and stop 
cbf0: 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20  reading.        
cc00: 2a 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f 0a  ** the SQL.  */.
cc10: 20 20 20 20 20 20 20 20 64 62 52 65 6c 65 61 73          dbReleas
cc20: 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53  eStmt(pDb, pPreS
cc30: 74 6d 74 2c 20 31 29 3b 0a 23 69 66 20 53 51 4c  tmt, 1);.#if SQL
cc40: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 20 20 20  ITE_TEST.       
cc50: 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 62 4c 65   if( p->pDb->bLe
cc60: 67 61 63 79 50 72 65 70 61 72 65 20 26 26 20 72  gacyPrepare && r
cc70: 63 73 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d  cs==SQLITE_SCHEM
cc80: 41 20 26 26 20 7a 50 72 65 76 53 71 6c 20 29 7b  A && zPrevSql ){
cc90: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
cca0: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 65 72 72   the runtime err
ccb0: 6f 72 20 77 61 73 20 61 6e 20 53 51 4c 49 54 45  or was an SQLITE
ccc0: 5f 53 43 48 45 4d 41 2c 20 61 6e 64 20 74 68 65  _SCHEMA, and the
ccd0: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
cce0: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 69 73      ** handle is
ccf0: 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
cd00: 73 65 20 74 68 65 20 6c 65 67 61 63 79 20 73 71  se the legacy sq
cd10: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
cd20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
cd30: 65 72 66 61 63 65 2c 20 72 65 74 72 79 20 70 72  erface, retry pr
cd40: 65 70 61 72 65 28 29 2f 73 74 65 70 28 29 20 6f  epare()/step() o
cd50: 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 73  n the same SQL s
cd60: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
cd70: 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 6e 6c 79      ** This only
cd80: 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 20 49   happens once. I
cd90: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 65 63  f there is a sec
cda0: 6f 6e 64 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ond SQLITE_SCHEM
cdb0: 41 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  A.          ** e
cdc0: 72 72 6f 72 2c 20 74 68 65 20 65 72 72 6f 72 20  rror, the error 
cdd0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
cde0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
cdf0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  */.          p->
ce00: 7a 53 71 6c 20 3d 20 7a 50 72 65 76 53 71 6c 3b  zSql = zPrevSql;
ce10: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
ce20: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  nue;.        }.#
ce30: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 54 63  endif.        Tc
ce40: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_SetObjResult(p
ce50: 44 62 2d 3e 69 6e 74 65 72 70 2c 0a 20 20 20 20  Db->interp,.    
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
ce80: 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ngObj(sqlite3_er
ce90: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d  rmsg(pDb->db), -
cea0: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  1));.        ret
ceb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ced0: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
cee0: 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c  t(pDb, pPreStmt,
cef0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cf00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
cf10: 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  ished */.  retur
cf20: 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a  n TCL_BREAK;.}..
cf30: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72  /*.** Free all r
cf40: 65 73 6f 75 72 63 65 73 20 63 75 72 72 65 6e 74  esources current
cf50: 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 44  ly held by the D
cf60: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
cf70: 75 63 74 75 72 65 20 70 61 73 73 65 64 0a 2a 2a  ucture passed.**
cf80: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
cf90: 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20 73 68  gument. There sh
cfa0: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
cfb0: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
cfc0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
cfd0: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 64 62   each call to db
cfe0: 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  EvalInit()..*/.s
cff0: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
d000: 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76 61 6c  lFinalize(DbEval
d010: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69  Context *p){.  i
d020: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  f( p->pPreStmt )
d030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
d040: 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d  set(p->pPreStmt-
d050: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64 62 52  >pStmt);.    dbR
d060: 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e 70 44  eleaseStmt(p->pD
d070: 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74 2c 20  b, p->pPreStmt, 
d080: 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 53  0);.    p->pPreS
d090: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  tmt = 0;.  }.  i
d0a0: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
d0b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
d0c0: 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79 29 3b  ount(p->pArray);
d0d0: 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d  .    p->pArray =
d0e0: 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65   0;.  }.  Tcl_De
d0f0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53  crRefCount(p->pS
d100: 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61 73 65  ql);.  dbRelease
d110: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a  ColumnNames(p);.
d120: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d130: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
d140: 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75 72 65  cl_Obj structure
d150: 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e 74 20   with ref-count 
d160: 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  0 that contains.
d170: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
d180: 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c   the iCol'th col
d190: 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77 20 63  umn of the row c
d1a0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 65 64  urrently pointed
d1b0: 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20 44 62   to by.** the Db
d1c0: 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75  EvalContext stru
d1d0: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
d1e0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
d1f0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  nt..*/.static Tc
d200: 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43 6f 6c  l_Obj *dbEvalCol
d210: 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61 6c 43  umnValue(DbEvalC
d220: 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 69  ontext *p, int i
d230: 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Col){.  sqlite3_
d240: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
d250: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
d260: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
d270: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
d280: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a  pStmt, iCol) ){.
d290: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d2a0: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
d2b0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
d2c0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
d2d0: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
d2e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d2f0: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
d300: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
d310: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
d320: 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79 74 65  f( !zBlob ) byte
d330: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
d340: 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  urn Tcl_NewByteA
d350: 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c  rrayObj((u8*)zBl
d360: 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  ob, bytes);.    
d370: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
d380: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
d390: 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20     sqlite_int64 
d3a0: 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  v = sqlite3_colu
d3b0: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
d3c0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iCol);.      if(
d3d0: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
d3e0: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
d3f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d400: 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  rn Tcl_NewIntObj
d410: 28 28 69 6e 74 29 76 29 3b 0a 20 20 20 20 20 20  ((int)v);.      
d420: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
d430: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 57 69 64  eturn Tcl_NewWid
d440: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
d450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 61    }.    }.    ca
d460: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
d470: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
d480: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
d490: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
d4a0: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 43  double(pStmt, iC
d4b0: 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol));.    }.    
d4c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
d4d0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
d4e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
d4f0: 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  j(p->pDb->zNull,
d500: 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
d510: 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65  .  return Tcl_Ne
d520: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
d530: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
d540: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f  _text(pStmt, iCo
d550: 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  l), -1);.}../*.*
d560: 2a 20 49 66 20 75 73 69 6e 67 20 54 63 6c 20 76  * If using Tcl v
d570: 65 72 73 69 6f 6e 20 38 2e 36 20 6f 72 20 67 72  ersion 8.6 or gr
d580: 65 61 74 65 72 2c 20 75 73 65 20 74 68 65 20 4e  eater, use the N
d590: 52 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61  R functions to a
d5a0: 76 6f 69 64 0a 2a 2a 20 72 65 63 75 72 73 69 76  void.** recursiv
d5b0: 65 20 65 76 61 6c 75 74 69 6f 6e 20 6f 66 20 73  e evalution of s
d5c0: 63 72 69 70 74 73 20 62 79 20 74 68 65 20 5b 64  cripts by the [d
d5d0: 62 20 65 76 61 6c 5d 20 61 6e 64 20 5b 64 62 20  b eval] and [db 
d5e0: 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e  trans].** comman
d5f0: 64 73 2e 20 45 76 65 6e 20 69 66 20 74 68 65 20  ds. Even if the 
d600: 68 65 61 64 65 72 73 20 75 73 65 64 20 77 68 69  headers used whi
d610: 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  le compiling the
d620: 20 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72   extension.** ar
d630: 65 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 2c 20  e 8.6 or newer, 
d640: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 20 74  the code still t
d650: 65 73 74 73 20 74 68 65 20 54 63 6c 20 76 65 72  ests the Tcl ver
d660: 73 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65 2e  sion at runtime.
d670: 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .** This allows 
d680: 73 74 75 62 73 2d 65 6e 61 62 6c 65 64 20 62 75  stubs-enabled bu
d690: 69 6c 64 73 20 74 6f 20 62 65 20 75 73 65 64 20  ilds to be used 
d6a0: 77 69 74 68 20 6f 6c 64 65 72 20 54 63 6c 20 6c  with older Tcl l
d6b0: 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 23 69 66  ibraries..*/.#if
d6c0: 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49   TCL_MAJOR_VERSI
d6d0: 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a  ON>8 || (TCL_MAJ
d6e0: 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d 38 20 26 26  OR_VERSION==8 &&
d6f0: 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49   TCL_MINOR_VERSI
d700: 4f 4e 3e 3d 36 29 0a 23 20 64 65 66 69 6e 65 20  ON>=6).# define 
d710: 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 31  SQLITE_TCL_NRE 1
d720: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 55 73  .static int DbUs
d730: 65 4e 72 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  eNre(void){.  in
d740: 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a  t major, minor;.
d750: 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e    Tcl_GetVersion
d760: 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c  (&major, &minor,
d770: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
d780: 28 20 28 6d 61 6a 6f 72 3d 3d 38 20 26 26 20 6d  ( (major==8 && m
d790: 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f  inor>=6) || majo
d7a0: 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f  r>8 );.}.#else./
d7b0: 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 75  *.** Compiling u
d7c0: 73 69 6e 67 20 68 65 61 64 65 72 73 20 65 61 72  sing headers ear
d7d0: 6c 69 65 72 20 74 68 61 6e 20 38 2e 36 2e 20 49  lier than 8.6. I
d7e0: 6e 20 74 68 69 73 20 63 61 73 65 20 4e 52 20 63  n this case NR c
d7f0: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
d800: 2c 20 73 6f 20 44 62 55 73 65 4e 72 65 28 29 20  , so DbUseNre() 
d810: 74 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  to always return
d820: 20 7a 65 72 6f 2e 20 41 64 64 20 23 64 65 66 69   zero. Add #defi
d830: 6e 65 73 20 66 6f 72 20 74 68 65 20 6f 74 68 65  nes for the othe
d840: 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78 78 28 29  r.** Tcl_NRxxx()
d850: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70 72   functions to pr
d860: 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
d870: 63 61 75 73 69 6e 67 20 63 6f 6d 70 69 6c 61 74  causing compilat
d880: 69 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 65  ion errors,.** e
d890: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f  ven though the o
d8a0: 6e 6c 79 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  nly invocations 
d8b0: 6f 66 20 74 68 65 6d 20 61 72 65 20 77 69 74 68  of them are with
d8c0: 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 62  in conditional b
d8d0: 6c 6f 63 6b 73 0a 2a 2a 20 6f 66 20 74 68 65 20  locks.** of the 
d8e0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  form:.**.**   if
d8f0: 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 20 7b  ( DbUseNre() ) {
d900: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65 66 69   ... }.*/.# defi
d910: 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52  ne SQLITE_TCL_NR
d920: 45 20 30 0a 23 20 64 65 66 69 6e 65 20 44 62 55  E 0.# define DbU
d930: 73 65 4e 72 65 28 29 20 30 0a 23 20 64 65 66 69  seNre() 0.# defi
d940: 6e 65 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c  ne Tcl_NRAddCall
d950: 62 61 63 6b 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  back(a,b,c,d,e,f
d960: 29 20 28 76 6f 69 64 29 30 0a 23 20 64 65 66 69  ) (void)0.# defi
d970: 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  ne Tcl_NREvalObj
d980: 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69  (a,b,c) 0.# defi
d990: 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43  ne Tcl_NRCreateC
d9a0: 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65  ommand(a,b,c,d,e
d9b0: 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 65 6e 64  ,f) (void)0.#end
d9c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
d9d0: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
d9e0: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
d9f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
da00: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64  mand:.**.**   $d
da10: 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41  b eval SQL ?ARRA
da20: 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f  YNAME? SCRIPT.*/
da30: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
da40: 54 45 5f 54 43 4c 41 50 49 20 44 62 45 76 61 6c  TE_TCLAPI DbEval
da50: 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e  NextCmd(.  Clien
da60: 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20  tData data[],   
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68  /* data[0] is th
da90: 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  e (DbEvalContext
daa0: 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  *) */.  Tcl_Inte
dab0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20  rp *interp,     
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dad0: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20  Tcl interpreter 
dae0: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20  */.  int result 
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
db10: 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b  ult so far */.){
db20: 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75  .  int rc = resu
db30: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
db40: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
db50: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
db60: 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  The first elemen
db70: 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20  t of the data[] 
db80: 61 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  array is a point
db90: 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f  er to a DbEvalCo
dba0: 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63  ntext.  ** struc
dbb0: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75  ture allocated u
dbc0: 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29  sing Tcl_Alloc()
dbd0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  . The second ele
dbe0: 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20  ment of data[]. 
dbf0: 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72   ** is a pointer
dc00: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f   to a Tcl_Obj co
dc10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72  ntaining the scr
dc20: 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65  ipt to run for e
dc30: 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74  ach row.  ** ret
dc40: 75 72 6e 65 64 20 62 79 20 74 68 65 20 71 75 65  urned by the que
dc50: 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65  ries encapsulate
dc60: 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f  d in data[0]. */
dc70: 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  .  DbEvalContext
dc80: 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e   *p = (DbEvalCon
dc90: 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a  text *)data[0];.
dca0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
dcb0: 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29  pt = (Tcl_Obj *)
dcc0: 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f  data[1];.  Tcl_O
dcd0: 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e  bj *pArray = p->
dce0: 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65  pArray;..  while
dcf0: 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  ( (rc==TCL_OK ||
dd00: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
dd10: 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72  E) && TCL_OK==(r
dd20: 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70  c = dbEvalStep(p
dd30: 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  )) ){.    int i;
dd40: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  .    int nCol;. 
dd50: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
dd60: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76  olName;.    dbEv
dd70: 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43  alRowInfo(p, &nC
dd80: 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b  ol, &apColName);
dd90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
dda0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
ddb0: 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20    if( pArray==0 
ddc0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  ){.        Tcl_O
ddd0: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
dde0: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
ddf0: 30 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  0, dbEvalColumnV
de00: 61 6c 75 65 28 70 2c 69 29 2c 20 30 29 3b 0a 20  alue(p,i), 0);. 
de10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
de20: 70 2d 3e 65 76 61 6c 46 6c 61 67 73 20 26 20 53  p->evalFlags & S
de30: 51 4c 49 54 45 5f 45 56 41 4c 5f 57 49 54 48 4f  QLITE_EVAL_WITHO
de40: 55 54 4e 55 4c 4c 53 29 21 3d 30 0a 20 20 20 20  UTNULLS)!=0.    
de50: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
de60: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
de70: 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74  p->pPreStmt->pSt
de80: 6d 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f 4e  mt, i)==SQLITE_N
de90: 55 4c 4c 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ULL .      ){.  
dea0: 20 20 20 20 20 20 54 63 6c 5f 55 6e 73 65 74 56        Tcl_UnsetV
deb0: 61 72 32 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ar2(interp, Tcl_
dec0: 47 65 74 53 74 72 69 6e 67 28 70 41 72 72 61 79  GetString(pArray
ded0: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
dee0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
def0: 74 53 74 72 69 6e 67 28 61 70 43 6f 6c 4e 61 6d  tString(apColNam
df00: 65 5b 69 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20  e[i]), 0);.     
df10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
df20: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
df30: 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61  nterp, pArray, a
df40: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 64 62 45  pColName[i], dbE
df50: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 70  valColumnValue(p
df60: 2c 69 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ,i), 0);.      }
df70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
df80: 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 74 65  he required inte
df90: 72 70 72 65 74 65 72 20 76 61 72 69 61 62 6c 65  rpreter variable
dfa0: 73 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61  s are now popula
dfb0: 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ted with the dat
dfc0: 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
dfd0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49  e current row. I
dfe0: 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68  f using NRE, sch
dff0: 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20  edule callbacks 
e000: 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20  to evaluate.    
e010: 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72 69 70  ** script pScrip
e020: 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b  t, then to invok
e030: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
e040: 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74  again to fetch t
e050: 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72  he next.    ** r
e060: 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20  ow (or clean up 
e070: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  if there is no n
e080: 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73  ext row or the s
e090: 63 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a  cript throws an.
e0a0: 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e      ** exception
e0b0: 29 2e 20 41 66 74 65 72 20 73 63 68 65 64 75 6c  ). After schedul
e0c0: 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
e0d0: 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f  s, return contro
e0e0: 6c 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  l to the.    ** 
e0f0: 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  caller..    **. 
e100: 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69     ** If not usi
e110: 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65  ng NRE, evaluate
e120: 20 70 53 63 72 69 70 74 20 64 69 72 65 63 74 6c   pScript directl
e130: 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77  y and continue w
e140: 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ith the.    ** n
e150: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
e160: 20 74 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29   this while(...)
e170: 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69   loop.  */.    i
e180: 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b  f( DbUseNre() ){
e190: 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64  .      Tcl_NRAdd
e1a0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
e1b0: 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20   DbEvalNextCmd, 
e1c0: 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a  (void*)p, (void*
e1d0: 29 70 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b  )pScript, 0, 0);
e1e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
e1f0: 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65  l_NREvalObj(inte
e200: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
e210: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e220: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
e230: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
e240: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ript, 0);.    }.
e250: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
e260: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
e270: 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69  ;.  dbEvalFinali
e280: 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65  ze(p);.  Tcl_Fre
e290: 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20  e((char *)p);.. 
e2a0: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
e2b0: 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  || rc==TCL_BREAK
e2c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65   ){.    Tcl_Rese
e2d0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
e2e0: 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b  .    rc = TCL_OK
e2f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
e300: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
e310: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
e320: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
e330: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
e340: 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 62 61  following databa
e350: 73 65 0a 2a 2a 20 68 61 6e 64 6c 65 20 73 75 62  se.** handle sub
e360: 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a 2a  -commands:.**.**
e370: 20 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f     $db update_ho
e380: 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20  ok ?SCRIPT?.**  
e390: 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 53   $db wal_hook ?S
e3a0: 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20  CRIPT?.**   $db 
e3b0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 53 43 52  commit_hook ?SCR
e3c0: 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 70 72  IPT?.**   $db pr
e3d0: 65 75 70 64 61 74 65 20 68 6f 6f 6b 20 3f 53 43  eupdate hook ?SC
e3e0: 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  RIPT?.*/.static 
e3f0: 76 6f 69 64 20 44 62 48 6f 6f 6b 43 6d 64 28 0a  void DbHookCmd(.
e400: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e410: 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20  terp,           
e420: 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72    /* Tcl interpr
e430: 65 74 65 72 20 2a 2f 0a 20 20 53 71 6c 69 74 65  eter */.  Sqlite
e440: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
e450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
e460: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
e470: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 2c    Tcl_Obj *pArg,
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 2f 2a 20 53 43 52 49 50 54 20 61 72 67 75    /* SCRIPT argu
e4a0: 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ment (or NULL) *
e4b0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70  /.  Tcl_Obj **pp
e4c0: 48 6f 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20  Hook            
e4d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
e4e0: 6f 20 6d 65 6d 62 65 72 20 6f 66 20 53 71 6c 69  o member of Sqli
e4f0: 74 65 44 62 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  teDb */.){.  sql
e500: 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e  ite3 *db = pDb->
e510: 64 62 3b 0a 0a 20 20 69 66 28 20 2a 70 70 48 6f  db;..  if( *ppHo
e520: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  ok ){.    Tcl_Se
e530: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
e540: 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  p, *ppHook);.   
e550: 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
e560: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
e570: 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
e580: 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b      *ppHook = 0;
e590: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e5a0: 20 70 41 72 67 20 29 7b 0a 20 20 20 20 61 73 73   pArg ){.    ass
e5b0: 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20  ert( !(*ppHook) 
e5c0: 29 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  );.    if( Tcl_G
e5d0: 65 74 43 68 61 72 4c 65 6e 67 74 68 28 70 41 72  etCharLength(pAr
e5e0: 67 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  g)>0 ){.      *p
e5f0: 70 48 6f 6f 6b 20 3d 20 70 41 72 67 3b 0a 20 20  pHook = pArg;.  
e600: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
e610: 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20  ount(*ppHook);. 
e620: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
e630: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
e640: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
e650: 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
e660: 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d  e_hook(db, (pDb-
e670: 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3f  >pPreUpdateHook?
e680: 44 62 50 72 65 55 70 64 61 74 65 48 61 6e 64 6c  DbPreUpdateHandl
e690: 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 23 65 6e  er:0), pDb);.#en
e6a0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 75 70  dif.  sqlite3_up
e6b0: 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70  date_hook(db, (p
e6c0: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f  Db->pUpdateHook?
e6d0: 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a  DbUpdateHandler:
e6e0: 30 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69  0), pDb);.  sqli
e6f0: 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  te3_rollback_hoo
e700: 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70 52 6f 6c  k(db, (pDb->pRol
e710: 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c  lbackHook?DbRoll
e720: 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 20  backHandler:0), 
e730: 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pDb);.  sqlite3_
e740: 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44  wal_hook(db, (pD
e750: 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44 62 57 61  b->pWalHook?DbWa
e760: 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62  lHandler:0), pDb
e770: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
e780: 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
e790: 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61   below creates a
e7a0: 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
e7b0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e   for each.** con
e7c0: 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73  nection it opens
e7d0: 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61   to an SQLite da
e7e0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
e7f0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
e800: 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65  .** whenever one
e810: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
e820: 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f  tion-specific co
e830: 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74  mmands is execut
e840: 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46  ed.** in Tcl.  F
e850: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79  or example, if y
e860: 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20  ou run Tcl code 
e870: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
e880: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64         sqlite3 d
e890: 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65  b1  "my_database
e8a0: 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63  ".**       db1 c
e8b0: 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  lose.**.** The f
e8c0: 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65  irst command ope
e8d0: 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ns a connection 
e8e0: 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62  to the "my_datab
e8f0: 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a  ase" database.**
e900: 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20   and calls that 
e910: 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22  connection "db1"
e920: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f  .  The second co
e930: 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69  mmand causes thi
e940: 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20  s.** subroutine 
e950: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a  to be invoked..*
e960: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
e970: 49 54 45 5f 54 43 4c 41 50 49 20 44 62 4f 62 6a  ITE_TCLAPI DbObj
e980: 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c  Cmd(.  void *cd,
e990: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
e9a0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
e9b0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  c,.  Tcl_Obj *co
e9c0: 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 53 71  nst*objv.){.  Sq
e9d0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
e9e0: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
e9f0: 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74  nt choice;.  int
ea00: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
ea10: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
ea20: 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b  r *DB_strs[] = {
ea30: 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72  .    "authorizer
ea40: 22 2c 20 20 20 20 20 20 20 20 20 22 62 61 63 6b  ",         "back
ea50: 75 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  up",            
ea60: 22 62 75 73 79 22 2c 0a 20 20 20 20 22 63 61 63  "busy",.    "cac
ea70: 68 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  he",            
ea80: 20 20 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20    "changes",    
ea90: 20 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a         "close",.
eaa0: 20 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20      "collate",  
eab0: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61            "colla
eac0: 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 22  tion_needed",  "
ead0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 0a 20 20  commit_hook",.  
eae0: 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 20    "complete",   
eaf0: 20 20 20 20 20 20 20 20 22 63 6f 70 79 22 2c 20          "copy", 
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e               "en
eb10: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
eb20: 69 6f 6e 22 2c 0a 20 20 20 20 22 65 72 72 6f 72  ion",.    "error
eb30: 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20  code",          
eb40: 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20  "eval",         
eb50: 20 20 20 20 20 22 65 78 69 73 74 73 22 2c 0a 20       "exists",. 
eb60: 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20     "function",  
eb70: 20 20 20 20 20 20 20 20 20 22 69 6e 63 72 62 6c           "incrbl
eb80: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 22 69  ob",          "i
eb90: 6e 74 65 72 72 75 70 74 22 2c 0a 20 20 20 20 22  nterrupt",.    "
eba0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
ebb0: 64 22 2c 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22  d",  "nullvalue"
ebc0: 2c 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f  ,         "oneco
ebd0: 6c 75 6d 6e 22 2c 0a 20 20 20 20 22 70 72 65 75  lumn",.    "preu
ebe0: 70 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  pdate",         
ebf0: 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20   "profile",     
ec00: 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22        "progress"
ec10: 2c 0a 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20  ,.    "rekey",  
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 65 73              "res
ec30: 74 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20 20  tore",          
ec40: 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22   "rollback_hook"
ec50: 2c 0a 20 20 20 20 22 73 74 61 74 75 73 22 2c 20  ,.    "status", 
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 69 6d              "tim
ec70: 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20  eout",          
ec80: 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22   "total_changes"
ec90: 2c 0a 20 20 20 20 22 74 72 61 63 65 22 2c 20 20  ,.    "trace",  
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 72 61              "tra
ecb0: 63 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  ce_v2",         
ecc0: 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a   "transaction",.
ecd0: 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69      "unlock_noti
ece0: 66 79 22 2c 20 20 20 20 20 20 22 75 70 64 61 74  fy",      "updat
ecf0: 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22  e_hook",       "
ed00: 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 22 77  version",.    "w
ed10: 61 6c 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 30 0a  al_hook",.    0.
ed20: 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65    };.  enum DB_e
ed30: 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54  num {.    DB_AUT
ed40: 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20  HORIZER,        
ed50: 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20 20  DB_BACKUP,      
ed60: 20 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20 20       DB_BUSY,.  
ed70: 20 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20 20    DB_CACHE,     
ed80: 20 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47          DB_CHANG
ed90: 45 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  ES,          DB_
eda0: 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f  CLOSE,.    DB_CO
edb0: 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20 20  LLATE,          
edc0: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
edd0: 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54 5f  EDED, DB_COMMIT_
ede0: 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f 4d  HOOK,.    DB_COM
edf0: 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20  PLETE,          
ee00: 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20  DB_COPY,        
ee10: 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c       DB_ENABLE_L
ee20: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a 20  OAD_EXTENSION,. 
ee30: 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c     DB_ERRORCODE,
ee40: 20 20 20 20 20 20 20 20 20 44 42 5f 45 56 41 4c           DB_EVAL
ee50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
ee60: 5f 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42 5f  _EXISTS,.    DB_
ee70: 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20 20  FUNCTION,       
ee80: 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20     DB_INCRBLOB, 
ee90: 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45 52          DB_INTER
eea0: 52 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41 53  RUPT,.    DB_LAS
eeb0: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20  T_INSERT_ROWID, 
eec0: 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20  DB_NULLVALUE,   
eed0: 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d       DB_ONECOLUM
eee0: 4e 2c 0a 20 20 20 20 44 42 5f 50 52 45 55 50 44  N,.    DB_PREUPD
eef0: 41 54 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f  ATE,         DB_
ef00: 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20  PROFILE,        
ef10: 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a 20    DB_PROGRESS,. 
ef20: 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20     DB_REKEY,    
ef30: 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 53 54           DB_REST
ef40: 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20 44 42  ORE,          DB
ef50: 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a  _ROLLBACK_HOOK,.
ef60: 20 20 20 20 44 42 5f 53 54 41 54 55 53 2c 20 20      DB_STATUS,  
ef70: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 49 4d            DB_TIM
ef80: 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 44  EOUT,          D
ef90: 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c  B_TOTAL_CHANGES,
efa0: 0a 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20 20  .    DB_TRACE,  
efb0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 52             DB_TR
efc0: 41 43 45 5f 56 32 2c 20 20 20 20 20 20 20 20 20  ACE_V2,         
efd0: 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 0a  DB_TRANSACTION,.
efe0: 20 20 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f      DB_UNLOCK_NO
eff0: 54 49 46 59 2c 20 20 20 20 20 44 42 5f 55 50 44  TIFY,     DB_UPD
f000: 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44  ATE_HOOK,      D
f010: 42 5f 56 45 52 53 49 4f 4e 2c 0a 20 20 20 20 44  B_VERSION,.    D
f020: 42 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20 20 7d 3b  B_WAL_HOOK,.  };
f030: 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76  .  /* don't leav
f040: 65 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61  e trailing comma
f050: 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74  s on DB_enum, it
f060: 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49   confuses the AI
f070: 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a  X xlc compiler *
f080: 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20  /..  if( objc<2 
f090: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
f0a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f0b0: 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d  1, objv, "SUBCOM
f0c0: 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  MAND ...");.    
f0d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f0e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
f0f0: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
f100: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
f110: 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f   DB_strs, "optio
f120: 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20  n", 0, &choice) 
f130: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
f140: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
f150: 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42  switch( (enum DB
f160: 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a  _enum)choice ){.
f170: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74  .  /*    $db aut
f180: 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43  horizer ?CALLBAC
f190: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
f1a0: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
f1b0: 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72  llback to author
f1c0: 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65  ize each SQL ope
f1d0: 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a  ration as it is.
f1e0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20    ** compiled.  
f1f0: 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  5 arguments are 
f200: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
f210: 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  callback before 
f220: 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b  it is.  ** invok
f230: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
f240: 28 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a  (1) The authoriz
f250: 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20  ation type (ex: 
f260: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
f270: 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  BLE, SQLITE_INSE
f280: 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20  RT, ...).  **   
f290: 28 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69  (2) First descri
f2a0: 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65  ptive name (depe
f2b0: 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61  nds on authoriza
f2c0: 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20  tion type).  ** 
f2d0: 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73    (3) Second des
f2e0: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20  criptive name.  
f2f0: 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66  **   (4) Name of
f300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65   the database (e
f310: 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  x: "main", "temp
f320: 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61  ").  **   (5) Na
f330: 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68  me of trigger th
f340: 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20  at is doing the 
f350: 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a  access.  **.  **
f360: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68   The callback sh
f370: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f  ould return on o
f380: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f390: 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f  strings: SQLITE_
f3a0: 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  OK,.  ** SQLITE_
f3b0: 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54  IGNORE, or SQLIT
f3c0: 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68  E_DENY.  Any oth
f3d0: 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
f3e0: 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  is an error..  *
f3f0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d  *.  ** If this m
f400: 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64  ethod is invoked
f410: 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
f420: 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20  ts, the current 
f430: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20  authorization.  
f440: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69  ** callback stri
f450: 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ng is returned..
f460: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41    */.  case DB_A
f470: 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66  UTHORIZER: {.#if
f480: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f490: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
f4a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f4b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68  lt(interp, "auth
f4c0: 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76  orization not av
f4d0: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20  ailable in this 
f4e0: 62 75 69 6c 64 22 2c 0a 20 20 20 20 20 20 20 20  build",.        
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
f500: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
f510: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
f520: 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lse.    if( objc
f530: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
f540: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f550: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
f560: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
f570: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f580: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
f590: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
f5a0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
f5b0: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
f5c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f5d0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74  nterp, pDb->zAut
f5e0: 68 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  h, (char*)0);.  
f5f0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f600: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75  .      char *zAu
f610: 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  th;.      int le
f620: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
f630: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
f640: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
f650: 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zAuth);.      }
f660: 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54  .      zAuth = T
f670: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
f680: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
f690: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  n);.      if( zA
f6a0: 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  uth && len>0 ){.
f6b0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75          pDb->zAu
f6c0: 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  th = Tcl_Alloc( 
f6d0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
f6e0: 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
f6f0: 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e  Auth, zAuth, len
f700: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
f710: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
f720: 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Auth = 0;.      
f730: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
f740: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
f750: 20 20 74 79 70 65 64 65 66 20 69 6e 74 20 28 2a    typedef int (*
f760: 73 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29  sqlite3_auth_cb)
f770: 28 0a 20 20 20 20 20 20 20 20 20 20 20 76 6f 69  (.           voi
f780: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
f790: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 0a  r*,const char*,.
f7a0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
f7b0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
f7c0: 72 2a 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  r*);.        pDb
f7d0: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
f7e0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
f7f0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
f800: 72 28 70 44 62 2d 3e 64 62 2c 28 73 71 6c 69 74  r(pDb->db,(sqlit
f810: 65 33 5f 61 75 74 68 5f 63 62 29 61 75 74 68 5f  e3_auth_cb)auth_
f820: 63 61 6c 6c 62 61 63 6b 2c 70 44 62 29 3b 0a 20  callback,pDb);. 
f830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f840: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
f850: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
f860: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
f870: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
f880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f890: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63 6b    /*    $db back
f8a0: 75 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49  up ?DATABASE? FI
f8b0: 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a  LENAME.  **.  **
f8c0: 20 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65 20   Open or create 
f8d0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
f8e0: 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20  named FILENAME. 
f8f0: 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20   Transfer the.  
f900: 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f  ** content of lo
f910: 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54  cal database DAT
f920: 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20  ABASE (default: 
f930: 22 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68 65  "main") into the
f940: 0a 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64  .  ** FILENAME d
f950: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
f960: 63 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a 20  case DB_BACKUP: 
f970: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
f980: 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20   *zDestFile;.   
f990: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72   const char *zSr
f9a0: 63 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  cDb;.    sqlite3
f9b0: 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c   *pDest;.    sql
f9c0: 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61  ite3_backup *pBa
f9d0: 63 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f  ckup;..    if( o
f9e0: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
f9f0: 7a 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b  zSrcDb = "main";
fa00: 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65  .      zDestFile
fa10: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
fa20: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d  (objv[2]);.    }
fa30: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
fa40: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62   ){.      zSrcDb
fa50: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
fa60: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20  (objv[2]);.     
fa70: 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c   zDestFile = Tcl
fa80: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
fa90: 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  3]);.    }else{.
faa0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
fab0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
fac0: 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41  , objv, "?DATABA
fad0: 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a  SE? FILENAME");.
fae0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
faf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
fb00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
fb10: 70 65 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65  pen_v2(zDestFile
fb20: 2c 20 26 70 44 65 73 74 2c 0a 20 20 20 20 20 20  , &pDest,.      
fb30: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
fb40: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
fb50: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
fb60: 41 54 45 7c 20 70 44 62 2d 3e 6f 70 65 6e 46 6c  ATE| pDb->openFl
fb70: 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ags, 0);.    if(
fb80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fb90: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
fba0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fbb0: 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61   "cannot open ta
fbc0: 72 67 65 74 20 64 61 74 61 62 61 73 65 3a 20 22  rget database: "
fbd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
fbe0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
fbf0: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
fc00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
fc10: 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
fc20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fc30: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61  R;.    }.    pBa
fc40: 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
fc50: 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74  ackup_init(pDest
fc60: 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64  , "main", pDb->d
fc70: 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20  b, zSrcDb);.    
fc80: 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
fc90: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
fca0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fcb0: 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a   "backup failed:
fcc0: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
fcd0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
fce0: 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  est), (char*)0);
fcf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
fd00: 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20  lose(pDest);.   
fd10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fd20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
fd30: 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c  hile(  (rc = sql
fd40: 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
fd50: 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
fd60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20  SQLITE_OK ){}.  
fd70: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
fd80: 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29  _finish(pBackup)
fd90: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
fda0: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
fdb0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
fdc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fdd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
fde0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
fdf0: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
fe00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
fe10: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
fe20: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
fe30: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
fe40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fe50: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
fe60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
fe70: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79    /*    $db busy
fe80: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
fe90: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
fea0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
feb0: 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  if an SQL statem
fec0: 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ent attempts to 
fed0: 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  open.  ** a lock
fee0: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
fef0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
ff00: 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28  _BUSY: {.    if(
ff10: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
ff20: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ff30: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
ff40: 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a  v, "CALLBACK");.
ff50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ff60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
ff70: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
ff80: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
ff90: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
ffa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ffb0: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
ffc0: 42 75 73 79 2c 20 28 63 68 61 72 2a 29 30 29 3b  Busy, (char*)0);
ffd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
ffe0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
fff0: 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74  zBusy;.      int
10000 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
10010 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
10020 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
10030 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20  Db->zBusy);.    
10040 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20    }.      zBusy 
10050 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10060 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
10070 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
10080 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20   zBusy && len>0 
10090 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
100a0 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zBusy = Tcl_Allo
100b0 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
100c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
100d0 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20  ->zBusy, zBusy, 
100e0 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
100f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
10100 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20  ->zBusy = 0;.   
10110 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
10120 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
10130 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
10140 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
10150 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
10160 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
10170 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20   DbBusyHandler, 
10180 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
10190 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
101a0 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
101b0 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
101c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
101d0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
101e0 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65  /*     $db cache
101f0 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20   flush.  **     
10200 24 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e  $db cache size n
10210 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68  .  **.  ** Flush
10220 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
10230 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f  atement cache, o
10240 72 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  r set the maximu
10250 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  m number of.  **
10260 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e   cached statemen
10270 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ts..  */.  case 
10280 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  DB_CACHE: {.    
10290 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20  char *subCmd;.  
102a0 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66    int n;..    if
102b0 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20  ( objc<=2 ){.   
102c0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
102d0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
102e0 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69  bjv, "cache opti
102f0 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20  on ?arg?");.    
10300 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10310 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75  OR;.    }.    su
10320 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74  bCmd = Tcl_GetSt
10330 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a  ringFromObj( obj
10340 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69  v[2], 0 );.    i
10350 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20  f( *subCmd=='f' 
10360 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64  && strcmp(subCmd
10370 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a  ,"flush")==0 ){.
10380 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
10390 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
103a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
103b0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
103c0 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20  flush");.       
103d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
103e0 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
103f0 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d          flushStm
10400 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20  tCache( pDb );. 
10410 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
10420 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73   if( *subCmd=='s
10430 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
10440 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b  md,"size")==0 ){
10450 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
10460 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =4 ){.        Tc
10470 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10480 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10490 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20  "size n");.     
104a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
104b0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
104c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43  {.        if( TC
104d0 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74  L_ERROR==Tcl_Get
104e0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
104f0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20  p, objv[3], &n) 
10500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
10510 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69  _AppendResult( i
10520 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63  nterp, "cannot c
10530 6f 6e 76 65 72 74 20 5c 22 22 2c 0a 20 20 20 20  onvert \"",.    
10540 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
10550 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10560 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20  objv[3],0), "\" 
10570 74 6f 20 69 6e 74 65 67 65 72 22 2c 20 28 63 68  to integer", (ch
10580 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
10590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
105a0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OR;.        }els
105b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
105c0 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   n<0 ){.        
105d0 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
105e0 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20  he( pDb );.     
105f0 20 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20         n = 0;.  
10600 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10610 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44  ( n>MAX_PREPARED
10620 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20  _STMTS ){.      
10630 20 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52        n = MAX_PR
10640 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20  EPARED_STMTS;.  
10650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10660 20 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74      pDb->maxStmt
10670 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = n;.        }.
10680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10690 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
106a0 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72  endResult( inter
106b0 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c  p, "bad option \
106c0 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 54 63  "",.          Tc
106d0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
106e0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22  bj(objv[2],0), "
106f0 5c 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73  \": must be flus
10700 68 20 6f 72 20 73 69 7a 65 22 2c 0a 20 20 20 20  h or size",.    
10710 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
10720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10730 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10740 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10750 20 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e   /*     $db chan
10760 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
10770 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
10780 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
10790 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
107a0 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
107b0 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73   by.  ** the mos
107c0 74 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c  t recent INSERT,
107d0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
107e0 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74  E statement, not
107f0 20 69 6e 63 6c 75 64 69 6e 67 0a 20 20 2a 2a 20   including.  ** 
10800 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
10810 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67   by trigger prog
10820 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  rams..  */.  cas
10830 65 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a  e DB_CHANGES: {.
10840 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
10850 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  sult;.    if( ob
10860 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
10870 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10880 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10890 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
108a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
108b0 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20    }.    pResult 
108c0 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
108d0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
108e0 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
108f0 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63  esult, sqlite3_c
10900 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29  hanges(pDb->db))
10910 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
10920 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c  ..  /*    $db cl
10930 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68  ose.  **.  ** Sh
10940 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62  utdown the datab
10950 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ase.  */.  case 
10960 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20  DB_CLOSE: {.    
10970 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e  Tcl_DeleteComman
10980 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  d(interp, Tcl_Ge
10990 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
109a0 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20  bjv[0], 0));.   
109b0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
109c0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
109d0 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49  ollate NAME SCRI
109e0 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
109f0 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f  ate a new SQL co
10a00 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
10a10 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
10a20 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61  henever.  ** tha
10a30 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  t function is ca
10a40 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
10a50 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
10a60 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
10a70 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c  */.  case DB_COL
10a80 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43  LATE: {.    SqlC
10a90 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
10aa0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
10ab0 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63  e;.    char *zSc
10ac0 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53  ript;.    int nS
10ad0 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f  cript;.    if( o
10ae0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
10af0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10b00 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10b10 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29  , "NAME SCRIPT")
10b20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10b30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10b40 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
10b50 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10b60 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
10b70 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f    zScript = Tcl_
10b80 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10b90 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69  (objv[3], &nScri
10ba0 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  pt);.    pCollat
10bb0 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a  e = (SqlCollate*
10bc0 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
10bd0 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20  of(*pCollate) + 
10be0 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20  nScript + 1 );. 
10bf0 20 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d     if( pCollate=
10c00 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
10c10 45 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c  ERROR;.    pColl
10c20 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  ate->interp = in
10c30 74 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  terp;.    pColla
10c40 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  te->pNext = pDb-
10c50 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70  >pCollate;.    p
10c60 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74  Collate->zScript
10c70 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
10c80 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d  ate[1];.    pDb-
10c90 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c  >pCollate = pCol
10ca0 6c 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79  late;.    memcpy
10cb0 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69  (pCollate->zScri
10cc0 70 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63  pt, zScript, nSc
10cd0 72 69 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28  ript+1);.    if(
10ce0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
10cf0 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64  collation(pDb->d
10d00 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  b, zName, SQLITE
10d10 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70  _UTF8,.        p
10d20 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43  Collate, tclSqlC
10d30 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20  ollate) ){.     
10d40 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
10d50 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
10d60 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
10d70 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  b->db), TCL_VOLA
10d80 54 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74  TILE);.      ret
10d90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10da0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
10db0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
10dc0 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e     $db collation
10dd0 5f 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20  _needed SCRIPT. 
10de0 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
10df0 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74  a new SQL collat
10e00 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ion function cal
10e10 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
10e20 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75  ver.  ** that fu
10e30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
10e40 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
10e50 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
10e60 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
10e70 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49   case DB_COLLATI
10e80 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20  ON_NEEDED: {.   
10e90 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
10ea0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10eb0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10ec0 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22  , objv, "SCRIPT"
10ed0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10ee0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10ef0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43  .    if( pDb->pC
10f00 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a  ollateNeeded ){.
10f10 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
10f20 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
10f30 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
10f40 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c   }.    pDb->pCol
10f50 6c 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c  lateNeeded = Tcl
10f60 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62  _DuplicateObj(ob
10f70 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f  jv[2]);.    Tcl_
10f80 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  IncrRefCount(pDb
10f90 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
10fa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
10fb0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
10fc0 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63  pDb->db, pDb, tc
10fd0 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  lCollateNeeded);
10fe0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10ff0 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d  .  /*    $db com
11000 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41  mit_hook ?CALLBA
11010 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
11020 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
11030 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66  allback just bef
11040 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65  ore committing e
11050 76 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63  very SQL transac
11060 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68  tion..  ** If th
11070 65 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77  e callback throw
11080 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f  s an exception o
11090 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  r returns non-ze
110a0 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ro, then the.  *
110b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
110c0 20 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41   aborted.  If CA
110d0 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70  LLBACK is an emp
110e0 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63  ty string, the c
110f0 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20  allback.  ** is 
11100 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20  disabled..  */. 
11110 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f   case DB_COMMIT_
11120 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20  HOOK: {.    if( 
11130 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
11140 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11150 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11160 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
11170 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11180 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
11190 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
111a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
111b0 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
111c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
111d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
111e0 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 28 63 68 61 72  ->zCommit, (char
111f0 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
11200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
11210 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
11220 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  it;.      int le
11230 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
11240 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
11250 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
11260 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  b->zCommit);.   
11270 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d     }.      zComm
11280 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  it = Tcl_GetStri
11290 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
112a0 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
112b0 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c  if( zCommit && l
112c0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
112d0 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54  pDb->zCommit = T
112e0 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
112f0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
11300 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  cpy(pDb->zCommit
11310 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31  , zCommit, len+1
11320 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11330 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
11340 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
11350 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
11360 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
11370 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
11380 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
11390 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
113a0 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44  _hook(pDb->db, D
113b0 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20  bCommitHandler, 
113c0 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
113d0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
113e0 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70  e3_commit_hook(p
113f0 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
11400 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11410 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
11420 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74  *    $db complet
11430 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e SQL.  **.  ** 
11440 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53  Return TRUE if S
11450 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  QL is a complete
11460 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
11470 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
11480 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  .  ** additional
11490 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20   lines of input 
114a0 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69  are needed.  Thi
114b0 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
114c0 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69  the.  ** built-i
114d0 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65  n "info complete
114e0 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c  " command of Tcl
114f0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
11500 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66  _COMPLETE: {.#if
11510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11520 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63  _COMPLETE.    Tc
11530 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
11540 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65      int isComple
11550 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  te;.    if( objc
11560 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
11570 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11580 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
11590 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74  SQL");.      ret
115a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
115b0 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c     }.    isCompl
115c0 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ete = sqlite3_co
115d0 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53  mplete( Tcl_GetS
115e0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
115f0 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20  v[2], 0) );.    
11600 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
11610 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11620 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42  p);.    Tcl_SetB
11630 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c  ooleanObj(pResul
11640 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a  t, isComplete);.
11650 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
11660 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
11670 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74  db copy conflict
11680 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65  -algorithm table
11690 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52   filename ?SEPAR
116a0 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43  ATOR? ?NULLINDIC
116b0 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ATOR?.  **.  ** 
116c0 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74  Copy data into t
116d0 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61  able from filena
116e0 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75  me, optionally u
116f0 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20  sing SEPARATOR. 
11700 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65   ** as column se
11710 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20  parators.  If a 
11720 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
11730 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f  a null string, o
11740 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65  r the.  ** value
11750 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f   of NULLINDICATO
11760 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73  R, a NULL is ins
11770 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f  erted for the co
11780 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c  lumn..  ** confl
11790 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73  ict-algorithm is
117a0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69   one of the sqli
117b0 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  te conflict algo
117c0 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20  rithms:.  **    
117d0 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c  rollback, abort,
117e0 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72   fail, ignore, r
117f0 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73  eplace.  ** On s
11800 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74  uccess, return t
11810 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  he number of lin
11820 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f  es processed, no
11830 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61  t necessarily sa
11840 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63  me.  ** as 'db c
11850 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63  hanges' due to c
11860 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
11870 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a  m selected..  **
11880 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  .  ** This code 
11890 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20  is basically an 
118a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65  implementation/e
118b0 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20  nhancement of.  
118c0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73  ** the sqlite3 s
118d0 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22  hell.c ".import"
118e0 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20   command..  **. 
118f0 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64   ** This command
11900 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61   usage is equiva
11910 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69  lent to the sqli
11920 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65  te2.x COPY state
11930 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68  ment,.  ** which
11940 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61   imports file da
11950 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ta into a table 
11960 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72  using the Postgr
11970 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66  eSQL COPY file f
11980 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64  ormat:.  **   $d
11990 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f  b copy $conflit_
119a0 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65  algo $table_name
119b0 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c   $filename \t \\
119c0 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  N.  */.  case DB
119d0 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61  _COPY: {.    cha
119e0 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20  r *zTable;      
119f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
11a00 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  rt data into thi
11a10 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  s table */.    c
11a20 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20  har *zFile;     
11a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11a40 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63  e file from whic
11a50 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74  h to extract dat
11a60 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  a */.    char *z
11a70 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20  Conflict;       
11a80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
11a90 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74  lict algorithm t
11aa0 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c  o use */.    sql
11ab0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
11ac0 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74  ;        /* A st
11ad0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
11ae0 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
11af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11b00 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
11b10 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
11b20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
11b50 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72  es in an SQL str
11b60 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
11b70 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11b80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
11b90 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69  ounters */.    i
11ba0 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20  nt nSep;        
11bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11bc0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
11bd0 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69   zSep[] */.    i
11be0 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20  nt nNull;       
11bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11c00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
11c10 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20   zNull[] */.    
11c20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
11c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11c40 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
11c50 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69  */.    char *zLi
11c60 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
11c70 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
11c80 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f  ine of input fro
11c90 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  m the file */.  
11ca0 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20    char **azCol; 
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cc0 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20   zLine[] broken 
11cd0 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20  up into columns 
11ce0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
11cf0 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20  r *zCommit;     
11d00 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d     /* How to com
11d10 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  mit changes */. 
11d20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20     FILE *in;    
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d40 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65  * The input file
11d50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65   */.    int line
11d60 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  no = 0;         
11d70 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
11d80 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65  er of input file
11d90 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69   */.    char zLi
11da0 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20  neNum[80];      
11db0 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
11dc0 65 72 20 70 72 69 6e 74 20 62 75 66 66 65 72 20  er print buffer 
11dd0 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
11de0 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  pResult;        
11df0 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73     /* interp res
11e00 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 6f 6e 73  ult */..    cons
11e10 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20  t char *zSep;.  
11e20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
11e30 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ull;.    if( obj
11e40 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b  c<5 || objc>7 ){
11e50 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11e60 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11e70 32 2c 20 6f 62 6a 76 2c 0a 20 20 20 20 20 20 20  2, objv,.       
11e80 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f    "CONFLICT-ALGO
11e90 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45  RITHM TABLE FILE
11ea0 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f  NAME ?SEPARATOR?
11eb0 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
11ec0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
11ed0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11ee0 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
11ef0 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  6 ){.      zSep 
11f00 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
11f10 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20  romObj(objv[5], 
11f20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
11f30 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22       zSep = "\t"
11f40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11f50 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20  objc>=7 ){.     
11f60 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74   zNull = Tcl_Get
11f70 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
11f80 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[6], 0);.    }
11f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  else{.      zNul
11fa0 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20  l = "";.    }.  
11fb0 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63    zConflict = Tc
11fc0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
11fd0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
11fe0 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c      zTable = Tcl
11ff0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
12000 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
12010 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47     zFile = Tcl_G
12020 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
12030 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  objv[4], 0);.   
12040 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
12050 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c  (zSep);.    nNul
12060 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75  l = strlen30(zNu
12070 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  ll);.    if( nSe
12080 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
12090 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
120a0 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f  nterp,"Error: no
120b0 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72  n-null separator
120c0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
120d0 70 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  py",.           
120e0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
120f0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
12100 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12110 20 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63     }.    if(strc
12120 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72  mp(zConflict, "r
12130 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26  ollback") != 0 &
12140 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
12150 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72  zConflict, "abor
12160 74 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20  t"   ) != 0 &&. 
12170 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f        strcmp(zCo
12180 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20  nflict, "fail"  
12190 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
121a0 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c     strcmp(zConfl
121b0 69 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29  ict, "ignore"  )
121c0 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
121d0 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
121e0 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d  , "replace" ) !=
121f0 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c   0 ) {.      Tcl
12200 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12210 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22  terp, "Error: \"
12220 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 0a 20 20  ", zConflict,.  
12230 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63            "\", c
12240 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
12250 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  m must be one of
12260 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20  : rollback, ".  
12270 20 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74            "abort
12280 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
12290 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 28 63 68  or replace", (ch
122a0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
122b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
122c0 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
122d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
122e0 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
122f0 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  '%q'", zTable);.
12300 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
12310 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
12320 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12330 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63  , "Error: no suc
12340 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62  h table: ", zTab
12350 6c 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  le, (char*)0);. 
12360 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12370 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
12380 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33   nByte = strlen3
12390 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  0(zSql);.    rc 
123a0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
123b0 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
123c0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
123d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
123e0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
123f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
12400 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12410 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c  terp, "Error: ",
12420 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
12430 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a  pDb->db), (char*
12440 29 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  )0);.      nCol 
12450 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
12460 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
12470 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
12480 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
12490 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
124a0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
124b0 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b   if( nCol==0 ) {
124c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
124d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
124e0 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
124f0 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e  ( nByte + 50 + n
12500 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
12510 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   zSql==0 ) {.   
12520 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12530 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
12540 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
12550 28 29 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ()", (char*)0);.
12560 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12570 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12580 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
12590 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71  tf(nByte+50, zSq
125a0 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71  l, "INSERT OR %q
125b0 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45   INTO '%q' VALUE
125c0 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  S(?",.         z
125d0 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65  Conflict, zTable
125e0 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65  );.    j = strle
125f0 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66  n30(zSql);.    f
12600 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=1; i<nCol; 
12610 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  i++){.      zSql
12620 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [j++] = ',';.   
12630 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
12640 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  ?';.    }.    zS
12650 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  ql[j++] = ')';. 
12660 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a     zSql[j] = 0;.
12670 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12680 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
12690 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
126a0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  mt, 0);.    free
126b0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
126c0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
126d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
126e0 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
126f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
12700 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
12710 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
12720 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
12730 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12740 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
12750 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  .    in = fopen(
12760 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  zFile, "rb");.  
12770 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
12780 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
12790 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
127a0 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
127b0 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65  n file: ", zFile
127c0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
127d0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
127e0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
127f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12800 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a  OR;.    }.    az
12810 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69  Col = malloc( si
12820 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28  zeof(azCol[0])*(
12830 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69  nCol+1) );.    i
12840 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a  f( azCol==0 ) {.
12850 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
12860 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12870 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c  Error: can't mal
12880 6c 6f 63 28 29 22 2c 20 28 63 68 61 72 2a 29 30  loc()", (char*)0
12890 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  );.      fclose(
128a0 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
128b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
128c0 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c   }.    (void)sql
128d0 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
128e0 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  b, "BEGIN", 0, 0
128f0 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69  , 0);.    zCommi
12900 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20  t = "COMMIT";.  
12910 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20    while( (zLine 
12920 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
12930 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20  0, in))!=0 ){.  
12940 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
12950 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
12960 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c     azCol[0] = zL
12970 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ine;.      for(i
12980 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b  =0, z=zLine; *z;
12990 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   z++){.        i
129a0 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26  f( *z==zSep[0] &
129b0 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65  & strncmp(z, zSe
129c0 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20  p, nSep)==0 ){. 
129d0 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b           *z = 0;
129e0 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
129f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
12a00 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
12a10 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26      azCol[i] = &
12a20 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20  z[nSep];.       
12a30 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31       z += nSep-1
12a40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12a60 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e        if( i+1!=n
12a70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Col ){.        c
12a80 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
12a90 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74     int nErr = st
12aa0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b 20  rlen30(zFile) + 
12ab0 32 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 72  200;.        zEr
12ac0 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29  r = malloc(nErr)
12ad0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45  ;.        if( zE
12ae0 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
12af0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
12b00 28 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20  (nErr, zErr,.   
12b10 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72            "Error
12b20 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78  : %s line %d: ex
12b30 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
12b40 73 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f  s of data but fo
12b50 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20  und %d",.       
12b60 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e        zFile, lin
12b70 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b  eno, nCol, i+1);
12b80 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
12b90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12ba0 72 70 2c 20 7a 45 72 72 2c 20 28 63 68 61 72 2a  rp, zErr, (char*
12bb0 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  )0);.          f
12bc0 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20  ree(zErr);.     
12bd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f     }.        zCo
12be0 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
12bf0 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
12c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12c10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
12c20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
12c30 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c  * check for null
12c40 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69   data, if so, bi
12c50 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  nd as null */.  
12c60 20 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c        if( (nNull
12c70 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43  >0 && strcmp(azC
12c80 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30  ol[i], zNull)==0
12c90 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  ).          || s
12ca0 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d  trlen30(azCol[i]
12cb0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )==0.        ){.
12cc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12cd0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
12ce0 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  t, i+1);.       
12cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12d00 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
12d10 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20  ext(pStmt, i+1, 
12d20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51  azCol[i], -1, SQ
12d30 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
12d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
12d60 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
12d70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
12d80 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
12d90 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20    free(zLine);. 
12da0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12db0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12dc0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12dd0 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
12de0 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
12df0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
12e00 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  har*)0);.       
12e10 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c   zCommit = "ROLL
12e20 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62  BACK";.        b
12e30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12e40 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43    }.    free(azC
12e50 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28  ol);.    fclose(
12e60 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
12e70 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
12e80 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  ;.    (void)sqli
12e90 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
12ea0 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c  , zCommit, 0, 0,
12eb0 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43   0);..    if( zC
12ec0 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20  ommit[0] == 'C' 
12ed0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63  ){.      /* succ
12ee0 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20  ess, set result 
12ef0 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  as number of lin
12f00 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  es processed */.
12f10 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20        pResult = 
12f20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
12f30 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  (interp);.      
12f40 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
12f50 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  esult, lineno);.
12f60 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
12f70 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
12f80 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20      /* failure, 
12f90 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68  append lineno wh
12fa0 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ere failed */.  
12fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12fc0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
12fd0 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c  eNum), zLineNum,
12fe0 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20  "%d",lineno);.  
12ff0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13000 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66  sult(interp,", f
13010 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63  ailed while proc
13020 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a  essing line: ",z
13030 4c 69 6e 65 4e 75 6d 2c 0a 20 20 20 20 20 20 20  LineNum,.       
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13050 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
13060 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
13070 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
13080 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
13090 20 20 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c      $db enable_l
130a0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f  oad_extension BO
130b0 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OLEAN.  **.  ** 
130c0 54 75 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69  Turn the extensi
130d0 6f 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75  on loading featu
130e0 72 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49  re on or off.  I
130f0 74 20 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a  t if off by.  **
13100 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20   default..  */. 
13110 20 63 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f   case DB_ENABLE_
13120 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20  LOAD_EXTENSION: 
13130 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
13140 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
13150 53 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f  SION.    int ono
13160 66 66 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ff;.    if( objc
13170 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
13180 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13190 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
131a0 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20  BOOLEAN");.     
131b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
131c0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
131d0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
131e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
131f0 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20  bjv[2], &onoff) 
13200 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13210 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61  .    sqlite3_ena
13230 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
13240 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66  on(pDb->db, onof
13250 66 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23  f);.    break;.#
13260 65 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70  else.    Tcl_App
13270 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13280 2c 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61  , "extension loa
13290 64 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  ding is turned o
132a0 66 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ff at compile-ti
132b0 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me",.           
132c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
132d0 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
132e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69  TCL_ERROR;.#endi
132f0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  f.  }..  /*.  **
13300 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64      $db errorcod
13310 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  e.  **.  ** Retu
13320 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65  rn the numeric e
13330 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77  rror code that w
13340 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  as returned by t
13350 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20  he most recent. 
13360 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
13370 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f  te3_exec()..  */
13380 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52  .  case DB_ERROR
13390 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  CODE: {.    Tcl_
133a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
133b0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
133c0 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  bj(sqlite3_errco
133d0 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  de(pDb->db)));. 
133e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
133f0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
13400 65 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a  exists $sql.  **
13410 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d      $db onecolum
13420 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a  n $sql.  **.  **
13430 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d   The onecolumn m
13440 65 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75  ethod is the equ
13450 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a  ivalent of:.  **
13460 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62       lindex [$db
13470 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20   eval $sql] 0.  
13480 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49  */.  case DB_EXI
13490 53 54 53 3a 0a 20 20 63 61 73 65 20 44 42 5f 4f  STS:.  case DB_O
134a0 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  NECOLUMN: {.    
134b0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
134c0 20 3d 20 30 3b 0a 20 20 20 20 44 62 45 76 61 6c   = 0;.    DbEval
134d0 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20  Context sEval;. 
134e0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
134f0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
13500 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
13510 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
13520 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
13530 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13540 0a 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28  .    dbEvalInit(
13550 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a  &sEval, pDb, obj
13560 76 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  v[2], 0, 0);.   
13570 20 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70   rc = dbEvalStep
13580 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66  (&sEval);.    if
13590 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45  ( choice==DB_ONE
135a0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
135b0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
135c0 7b 0a 20 20 20 20 20 20 20 20 70 52 65 73 75 6c  {.        pResul
135d0 74 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  t = dbEvalColumn
135e0 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 30 29  Value(&sEval, 0)
135f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13600 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
13610 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52  ){.        Tcl_R
13620 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
13630 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
13640 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
13650 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d 3d 54  L_BREAK || rc==T
13660 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  CL_OK ){.      p
13670 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77  Result = Tcl_New
13680 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d 54  BooleanObj(rc==T
13690 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  CL_OK);.    }.  
136a0 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
136b0 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66  (&sEval);.    if
136c0 28 20 70 52 65 73 75 6c 74 20 29 20 54 63 6c 5f  ( pResult ) Tcl_
136d0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
136e0 65 72 70 2c 20 70 52 65 73 75 6c 74 29 3b 0a 0a  erp, pResult);..
136f0 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
13700 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 72  BREAK ){.      r
13710 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
13720 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
13730 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
13740 64 62 20 65 76 61 6c 20 3f 6f 70 74 69 6f 6e 73  db eval ?options
13750 3f 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f  ? $sql ?array? ?
13760 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f  {  ...code... }?
13770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53  .  **.  ** The S
13780 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
13790 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65  $sql is evaluate
137a0 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77  d.  For each row
137b0 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  , the values are
137c0 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20  .  ** placed in 
137d0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
137e0 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72  array named "arr
137f0 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e  ay" and ...code.
13800 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  .. is executed..
13810 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20    ** If "array" 
13820 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f  and "code" are o
13830 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20  mitted, then no 
13840 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72  callback is ever
13850 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20  y invoked..  ** 
13860 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e  If "array" is an
13870 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
13880 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61  hen the values a
13890 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72  re placed in var
138a0 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74  iables.  ** that
138b0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
138c0 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64  ame as the field
138d0 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74  s extracted by t
138e0 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
138f0 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b   case DB_EVAL: {
13900 0a 20 20 20 20 69 6e 74 20 65 76 61 6c 46 6c 61  .    int evalFla
13910 67 73 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  gs = 0;.    cons
13920 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20  t char *zOpt;.  
13930 20 20 77 68 69 6c 65 28 20 6f 62 6a 63 3e 33 20    while( objc>3 
13940 26 26 20 28 7a 4f 70 74 20 3d 20 54 63 6c 5f 47  && (zOpt = Tcl_G
13950 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
13960 29 29 21 3d 30 20 26 26 20 7a 4f 70 74 5b 30 5d  ))!=0 && zOpt[0]
13970 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69  =='-' ){.      i
13980 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20  f( strcmp(zOpt, 
13990 22 2d 77 69 74 68 6f 75 74 6e 75 6c 6c 73 22 29  "-withoutnulls")
139a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
139b0 76 61 6c 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  valFlags |= SQLI
139c0 54 45 5f 45 56 41 4c 5f 57 49 54 48 4f 55 54 4e  TE_EVAL_WITHOUTN
139d0 55 4c 4c 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULLS;.      }.  
139e0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
139f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13a00 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
13a10 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5c 22 22 2c  own option: \"",
13a20 20 7a 4f 70 74 2c 20 22 5c 22 22 2c 20 28 76 6f   zOpt, "\"", (vo
13a30 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  id*)0);.        
13a40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13a60 6f 62 6a 63 2d 2d 3b 0a 20 20 20 20 20 20 6f 62  objc--;.      ob
13a70 6a 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  jv++;.    }.    
13a80 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62  if( objc<3 || ob
13a90 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>5 ){.      Tc
13aa0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
13ab0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
13ac0 0a 20 20 20 20 20 20 20 20 20 20 22 3f 4f 50 54  .          "?OPT
13ad0 49 4f 4e 53 3f 20 53 51 4c 20 3f 41 52 52 41 59  IONS? SQL ?ARRAY
13ae0 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22  -NAME? ?SCRIPT?"
13af0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13b00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13b10 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ..    if( objc==
13b20 33 20 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61  3 ){.      DbEva
13b30 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a  lContext sEval;.
13b40 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
13b50 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
13b60 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  ();.      Tcl_In
13b70 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
13b80 3b 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e  ;.      dbEvalIn
13b90 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20  it(&sEval, pDb, 
13ba0 6f 62 6a 76 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a  objv[2], 0, 0);.
13bb0 20 20 20 20 20 20 77 68 69 6c 65 28 20 54 43 4c        while( TCL
13bc0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61  _OK==(rc = dbEva
13bd0 6c 53 74 65 70 28 26 73 45 76 61 6c 29 29 20 29  lStep(&sEval)) )
13be0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
13bf0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
13c00 6c 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61  l;.        dbEva
13c10 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c 2c  lRowInfo(&sEval,
13c20 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20   &nCol, 0);.    
13c30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13c40 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
13c50 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
13c60 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13c70 74 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45 76  terp, pRet, dbEv
13c80 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73  alColumnValue(&s
13c90 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20 20  Eval, i));.     
13ca0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13cb0 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a     dbEvalFinaliz
13cc0 65 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 20  e(&sEval);.     
13cd0 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
13ce0 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  AK ){.        Tc
13cf0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
13d00 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
13d10 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
13d20 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
13d30 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
13d40 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c  t(pRet);.    }el
13d50 73 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e 74  se{.      Client
13d60 44 61 74 61 20 63 64 32 5b 32 5d 3b 0a 20 20 20  Data cd2[2];.   
13d70 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74     DbEvalContext
13d80 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f   *p;.      Tcl_O
13d90 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a  bj *pArray = 0;.
13da0 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
13db0 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69  Script;..      i
13dc0 66 28 20 6f 62 6a 63 3e 3d 35 20 26 26 20 2a 28  f( objc>=5 && *(
13dd0 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
13de0 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b  ring(objv[3]) ){
13df0 0a 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20  .        pArray 
13e00 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20  = objv[3];.     
13e10 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
13e20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
13e30 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
13e40 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
13e50 3b 0a 0a 20 20 20 20 20 20 70 20 3d 20 28 44 62  ;..      p = (Db
13e60 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54 63  EvalContext *)Tc
13e70 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44  l_Alloc(sizeof(D
13e80 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a  bEvalContext));.
13e90 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74        dbEvalInit
13ea0 28 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d  (p, pDb, objv[2]
13eb0 2c 20 70 41 72 72 61 79 2c 20 65 76 61 6c 46 6c  , pArray, evalFl
13ec0 61 67 73 29 3b 0a 0a 20 20 20 20 20 20 63 64 32  ags);..      cd2
13ed0 5b 30 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b  [0] = (void *)p;
13ee0 0a 20 20 20 20 20 20 63 64 32 5b 31 5d 20 3d 20  .      cd2[1] = 
13ef0 28 76 6f 69 64 20 2a 29 70 53 63 72 69 70 74 3b  (void *)pScript;
13f00 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62 45 76  .      rc = DbEv
13f10 61 6c 4e 65 78 74 43 6d 64 28 63 64 32 2c 20 69  alNextCmd(cd2, i
13f20 6e 74 65 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a  nterp, TCL_OK);.
13f30 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
13f40 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
13f50 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e      $db function
13f60 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74   NAME [-argcount
13f70 20 4e 5d 20 5b 2d 64 65 74 65 72 6d 69 6e 69 73   N] [-determinis
13f80 74 69 63 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  tic] SCRIPT.  **
13f90 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
13fa0 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ew SQL function 
13fb0 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
13fc0 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63  enever that func
13fd0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c  tion is.  ** cal
13fe0 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
13ff0 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
14000 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
14010 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43  /.  case DB_FUNC
14020 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20  TION: {.    int 
14030 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 55  flags = SQLITE_U
14040 54 46 38 3b 0a 20 20 20 20 53 71 6c 46 75 6e 63  TF8;.    SqlFunc
14050 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c   *pFunc;.    Tcl
14060 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
14070 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
14080 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d      int nArg = -
14090 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  1;.    int i;.  
140a0 20 20 69 66 28 20 6f 62 6a 63 3c 34 20 29 7b 0a    if( objc<4 ){.
140b0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
140c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
140d0 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 3f 53  , objv, "NAME ?S
140e0 57 49 54 43 48 45 53 3f 20 53 43 52 49 50 54 22  WITCHES? SCRIPT"
140f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14100 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14110 0a 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c  .    for(i=3; i<
14120 28 6f 62 6a 63 2d 31 29 3b 20 69 2b 2b 29 7b 0a  (objc-1); i++){.
14130 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14140 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72   *z = Tcl_GetStr
14150 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20  ing(objv[i]);.  
14160 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
14170 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
14180 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  f( n>2 && strncm
14190 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74 22  p(z, "-argcount"
141a0 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,n)==0 ){.      
141b0 20 20 69 66 28 20 69 3d 3d 28 6f 62 6a 63 2d 32    if( i==(objc-2
141c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
141d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
141e0 69 6e 74 65 72 70 2c 20 22 6f 70 74 69 6f 6e 20  interp, "option 
141f0 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
14200 6d 65 6e 74 3a 20 22 2c 20 7a 2c 28 63 68 61 72  ment: ", z,(char
14210 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *)0);.          
14220 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14240 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
14250 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
14260 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 41  , objv[i+1], &nA
14270 72 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rg) ) return TCL
14280 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
14290 69 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20  if( nArg<0 ){.  
142a0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
142b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
142c0 20 22 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75   "number of argu
142d0 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f  ments must be no
142e0 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20  n-negative",.   
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14300 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
14310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
14320 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14340 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73   i++;.      }els
14350 65 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20  e.      if( n>2 
14360 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  && strncmp(z, "-
14370 64 65 74 65 72 6d 69 6e 69 73 74 69 63 22 2c 6e  deterministic",n
14380 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
14390 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
143a0 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20  DETERMINISTIC;. 
143b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
143c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
143d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
143e0 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 7a 2c  d option \"", z,
143f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
14400 3a 20 6d 75 73 74 20 62 65 20 2d 61 72 67 63 6f  : must be -argco
14410 75 6e 74 20 6f 72 20 2d 64 65 74 65 72 6d 69 6e  unt or -determin
14420 69 73 74 69 63 22 2c 20 28 63 68 61 72 2a 29 30  istic", (char*)0
14430 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
14440 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14450 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
14460 20 20 7d 0a 0a 20 20 20 20 70 53 63 72 69 70 74    }..    pScript
14470 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
14480 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
14490 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
144a0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
144b0 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53     pFunc = findS
144c0 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d  qlFunc(pDb, zNam
144d0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  e);.    if( pFun
144e0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  c==0 ) return TC
144f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28  L_ERROR;.    if(
14500 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
14510 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
14520 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d  rRefCount(pFunc-
14530 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  >pScript);.    }
14540 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72  .    pFunc->pScr
14550 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20  ipt = pScript;. 
14560 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
14570 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
14580 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c    pFunc->useEval
14590 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65  Objv = safeToUse
145a0 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c  EvalObjv(interp,
145b0 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72   pScript);.    r
145c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
145d0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
145e0 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  >db, zName, nArg
145f0 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  , flags,.       
14600 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75   pFunc, tclSqlFu
14610 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
14620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14630 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
14640 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
14650 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
14660 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
14670 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
14680 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
14690 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ILE);.    }.    
146a0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
146b0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
146c0 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c  crblob ?-readonl
146d0 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
146e0 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a  LUMN ROWID.  */.
146f0 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c    case DB_INCRBL
14700 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c  OB: {.#ifdef SQL
14710 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
14720 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  B.    Tcl_Append
14730 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
14740 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61  incrblob not ava
14750 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
14760 75 69 6c 64 22 2c 20 28 63 68 61 72 2a 29 30 29  uild", (char*)0)
14770 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
14780 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
14790 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
147a0 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
147b0 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69  char *zDb = "mai
147c0 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  n";.    const ch
147d0 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
147e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
147f0 75 6d 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  umn;.    Tcl_Wid
14800 65 49 6e 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20  eInt iRow;..    
14810 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
14820 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f   -readonly optio
14830 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a  n */.    if( obj
14840 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63  c>3 && strcmp(Tc
14850 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14860 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  [2]), "-readonly
14870 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
14880 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
14890 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
148a0 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(5+isReadonl
148b0 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69  y) && objc!=(6+i
148c0 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
148d0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
148e0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
148f0 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c  objv, "?-readonl
14900 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
14910 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20  LUMN ROWID");.  
14920 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14930 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
14940 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73   if( objc==(6+is
14950 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
14960 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
14970 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
14980 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c  .    }.    zTabl
14990 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
149a0 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b  g(objv[objc-3]);
149b0 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54  .    zColumn = T
149c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
149d0 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20  v[objc-2]);.    
149e0 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  rc = Tcl_GetWide
149f0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
14a00 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c  p, objv[objc-1],
14a10 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66   &iRow);..    if
14a20 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
14a30 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74        rc = creat
14a40 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
14a50 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65  (.          inte
14a60 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54  rp, pDb, zDb, zT
14a70 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 28  able, zColumn, (
14a80 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69 52  sqlite3_int64)iR
14a90 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20  ow, isReadonly. 
14aa0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
14ab0 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
14ac0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
14ad0 20 20 20 24 64 62 20 69 6e 74 65 72 72 75 70 74     $db interrupt
14ae0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72  .  **.  ** Inter
14af0 72 75 70 74 20 74 68 65 20 65 78 65 63 75 74 69  rupt the executi
14b00 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d  on of the inner-
14b10 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72  most SQL interpr
14b20 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a  eter.  This.  **
14b30 20 63 61 75 73 65 73 20 74 68 65 20 53 51 4c 20   causes the SQL 
14b40 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74  statement to ret
14b50 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20  urn an error of 
14b60 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
14b70 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14b80 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20  _INTERRUPT: {.  
14b90 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
14ba0 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  upt(pDb->db);.  
14bb0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14bc0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
14bd0 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e  nullvalue ?STRIN
14be0 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  G?.  **.  ** Cha
14bf0 6e 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68  nge text used wh
14c00 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20  en a NULL comes 
14c10 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61  back from the da
14c20 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49  tabase. If ?STRI
14c30 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  NG?.  ** is not 
14c40 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68  present, then th
14c50 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67  e current string
14c60 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69   used for NULL i
14c70 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
14c80 20 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72   If STRING is pr
14c90 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49  esent, then STRI
14ca0 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  NG is returned..
14cb0 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
14cc0 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b   DB_NULLVALUE: {
14cd0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
14ce0 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
14cf0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
14d00 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
14d10 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55   objv, "NULLVALU
14d20 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E");.      retur
14d30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14d40 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
14d50 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =3 ){.      int 
14d60 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20  len;.      char 
14d70 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74  *zNull = Tcl_Get
14d80 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
14d90 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
14da0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75      if( pDb->zNu
14db0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ll ){.        Tc
14dc0 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
14dd0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
14de0 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c    if( zNull && l
14df0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
14e00 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c  pDb->zNull = Tcl
14e10 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
14e20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
14e30 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e  y(pDb->zNull, zN
14e40 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  ull, len);.     
14e50 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65     pDb->zNull[le
14e60 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
14e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14e80 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a  pDb->zNull = 0;.
14e90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14ea0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
14eb0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
14ec0 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d  ewStringObj(pDb-
14ed0 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20  >zNull, -1));.  
14ee0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14ef0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
14f00 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
14f10 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  d.  **.  ** Retu
14f20 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
14f30 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
14f40 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
14f50 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
14f60 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
14f70 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
14f80 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
14f90 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57  esult;.    Tcl_W
14fa0 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20  ideInt rowid;.  
14fb0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
14fc0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
14fd0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
14fe0 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
14ff0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15000 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
15010 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
15020 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
15030 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
15040 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
15050 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
15060 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57  p);.    Tcl_SetW
15070 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  ideIntObj(pResul
15080 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62  t, rowid);.    b
15090 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
150a0 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43    ** The DB_ONEC
150b0 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20  OLUMN method is 
150c0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65  implemented toge
150d0 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 58 49  ther with DB_EXI
150e0 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  STS..  */..  /* 
150f0 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20     $db progress 
15100 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  ?N CALLBACK?.  *
15110 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
15120 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
15130 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
15140 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
15150 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
15160 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
15170 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
15180 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
15190 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
151a0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
151b0 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
151c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
151d0 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
151e0 50 72 6f 67 72 65 73 73 2c 20 28 63 68 61 72 2a  Progress, (char*
151f0 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
15200 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
15210 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =4 ){.      char
15220 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20   *zProgress;.   
15230 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
15240 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69    int N;.      i
15250 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
15260 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15270 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e  erp, objv[2], &N
15280 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
15290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
152a0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66       };.      if
152b0 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
152c0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
152d0 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72  Free(pDb->zProgr
152e0 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ess);.      }.  
152f0 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20      zProgress = 
15300 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
15310 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c  mObj(objv[3], &l
15320 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
15330 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e  Progress && len>
15340 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
15350 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63  ->zProgress = Tc
15360 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
15370 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
15380 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  py(pDb->zProgres
15390 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65  s, zProgress, le
153a0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
153b0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
153c0 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  zProgress = 0;. 
153d0 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
153e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
153f0 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20  ESS_CALLBACK.   
15400 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
15410 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
15420 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
15430 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
15440 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
15450 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
15460 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61   N, DbProgressHa
15470 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
15480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15490 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
154a0 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
154b0 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
154c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
154d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
154e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
154f0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
15500 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  "N CALLBACK");. 
15510 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15520 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
15530 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
15540 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65  *    $db profile
15550 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
15560 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
15570 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
15580 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
15590 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65 61 63  outine after eac
155a0 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
155b0 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75    ** that has ru
155c0 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20  n.  The text of 
155d0 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20  the SQL and the 
155e0 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65  amount of elapse
155f0 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61   time are.  ** a
15600 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
15610 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73  ACK before the s
15620 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20  cript is run..  
15630 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
15640 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  FILE: {.    if( 
15650 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
15660 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
15670 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
15680 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
15690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
156a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
156b0 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
156c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
156d0 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
156e0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
156f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
15700 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 28 63 68  b->zProfile, (ch
15710 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
15720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15730 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
15740 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
15750 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
15760 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
15770 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
15780 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20  >zProfile);.    
15790 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69    }.      zProfi
157a0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
157b0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
157c0 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
157d0 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20  if( zProfile && 
157e0 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
157f0 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
15800 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
15810 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
15820 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66  emcpy(pDb->zProf
15830 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c  ile, zProfile, l
15840 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
15850 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
15860 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20  >zProfile = 0;. 
15870 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
15880 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15890 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
158a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
158b0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26  LOATING_POINT) &
158c0 26 20 5c 0a 20 20 20 20 21 64 65 66 69 6e 65 64  & \.    !defined
158d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50  (SQLITE_OMIT_DEP
158e0 52 45 43 41 54 45 44 29 0a 20 20 20 20 20 20 69  RECATED).      i
158f0 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
15900 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
15910 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
15920 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15930 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64  3_profile(pDb->d
15940 62 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64  b, DbProfileHand
15950 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
15960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15970 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
15980 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
15990 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
159a0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
159b0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
159c0 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59     $db rekey KEY
159d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
159e0 65 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e  e the encryption
159f0 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72   key on the curr
15a00 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62  ently open datab
15a10 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
15a20 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 23 69 66   DB_REKEY: {.#if
15a30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15a40 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64  HAS_CODEC) && !d
15a50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15a60 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43  IT_CODEC_FROM_TC
15a70 4c 29 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  L).    int nKey;
15a80 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b  .    void *pKey;
15a90 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
15aa0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
15ab0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
15ac0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
15ad0 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20  v, "KEY");.     
15ae0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15af0 52 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66  R;.    }.#if def
15b00 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
15b10 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e  CODEC) && !defin
15b20 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
15b30 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20  ODEC_FROM_TCL). 
15b40 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
15b50 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
15b60 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79  j(objv[2], &nKey
15b70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
15b80 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64  te3_rekey(pDb->d
15b90 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, pKey, nKey);.
15ba0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
15bb0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
15bc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
15bd0 69 74 65 33 5f 65 72 72 73 74 72 28 72 63 29 2c  ite3_errstr(rc),
15be0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
15bf0 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
15c00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15c10 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15c20 20 2f 2a 20 20 20 20 24 64 62 20 72 65 73 74 6f   /*    $db resto
15c30 72 65 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49  re ?DATABASE? FI
15c40 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a  LENAME.  **.  **
15c50 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
15c60 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
15c70 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
15c80 74 68 65 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  the content.  **
15c90 20 6f 66 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74   of FILENAME int
15ca0 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61  o the local data
15cb0 62 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64  base DATABASE (d
15cc0 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e  efault: "main").
15cd0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15ce0 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63  RESTORE: {.    c
15cf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46  onst char *zSrcF
15d00 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
15d10 68 61 72 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20  har *zDestDb;.  
15d20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b    sqlite3 *pSrc;
15d30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
15d40 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
15d50 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d    int nTimeout =
15d60 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   0;..    if( obj
15d70 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44  c==3 ){.      zD
15d80 65 73 74 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  estDb = "main";.
15d90 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d        zSrcFile =
15da0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15db0 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c  bjv[2]);.    }el
15dc0 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
15dd0 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20  {.      zDestDb 
15de0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
15df0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
15e00 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47  zSrcFile = Tcl_G
15e10 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
15e20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15e30 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
15e40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
15e50 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45  objv, "?DATABASE
15e60 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20  ? FILENAME");.  
15e70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15e80 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
15e90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
15ea0 6e 5f 76 32 28 7a 53 72 63 46 69 6c 65 2c 20 26  n_v2(zSrcFile, &
15eb0 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
15ed0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
15ee0 4e 4c 59 20 7c 20 70 44 62 2d 3e 6f 70 65 6e 46  NLY | pDb->openF
15ef0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66  lags, 0);.    if
15f00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15f10 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
15f20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15f30 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73  , "cannot open s
15f40 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20  ource database: 
15f50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
15f60 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72  lite3_errmsg(pSr
15f70 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
15f80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
15f90 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
15fa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63  ;.    }.    pBac
15fc0 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
15fd0 63 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64  ckup_init(pDb->d
15fe0 62 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63  b, zDestDb, pSrc
15ff0 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69  , "main");.    i
16000 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
16010 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
16020 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16030 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
16040 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
16050 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
16060 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
16070 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16080 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
16090 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
160a0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
160b0 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
160c0 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
160d0 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
160e0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
160f0 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
16100 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
16110 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16120 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
16130 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b     if( nTimeout+
16140 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a  + >= 3 ) break;.
16150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16160 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20  sleep(100);.    
16170 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
16180 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
16190 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
161a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
161b0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
161c0 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
161d0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
161e0 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d  LITE_BUSY || rc=
161f0 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29  =SQLITE_LOCKED )
16200 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
16210 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16220 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64   "restore failed
16230 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  : source databas
16240 65 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20  e busy",.       
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
16270 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
16280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16290 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
162a0 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
162b0 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  ore failed: ",. 
162c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
162d0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
162e0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
162f0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
16300 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
16310 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
16320 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
16330 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
16340 20 24 64 62 20 73 74 61 74 75 73 20 28 73 74 65   $db status (ste
16350 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78  p|sort|autoindex
16360 7c 76 6d 73 74 65 70 29 0a 20 20 2a 2a 0a 20 20  |vmstep).  **.  
16370 2a 2a 20 44 69 73 70 6c 61 79 20 53 51 4c 49 54  ** Display SQLIT
16380 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
16390 4c 53 43 41 4e 5f 53 54 45 50 20 6f 72 0a 20 20  LSCAN_STEP or.  
163a0 2a 2a 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  ** SQLITE_STMTST
163b0 41 54 55 53 5f 53 4f 52 54 20 66 6f 72 20 74 68  ATUS_SORT for th
163c0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 76  e most recent ev
163d0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  al..  */.  case 
163e0 44 42 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20  DB_STATUS: {.   
163f0 20 69 6e 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73   int v;.    cons
16400 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20  t char *zOp;.   
16410 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
16420 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
16430 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
16440 2c 20 6f 62 6a 76 2c 20 22 28 73 74 65 70 7c 73  , objv, "(step|s
16450 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29 22 29  ort|autoindex)")
16460 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
16470 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
16480 20 20 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65      zOp = Tcl_Ge
16490 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
164a0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
164b0 28 7a 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d 30  (zOp, "step")==0
164c0 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44   ){.      v = pD
164d0 62 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65  b->nStep;.    }e
164e0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
164f0 4f 70 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20 29  Op, "sort")==0 )
16500 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
16510 3e 6e 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73  >nSort;.    }els
16520 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70  e if( strcmp(zOp
16530 2c 20 22 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d  , "autoindex")==
16540 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  0 ){.      v = p
16550 44 62 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20  Db->nIndex;.    
16560 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
16570 28 7a 4f 70 2c 20 22 76 6d 73 74 65 70 22 29 3d  (zOp, "vmstep")=
16580 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
16590 70 44 62 2d 3e 6e 56 4d 53 74 65 70 3b 0a 20 20  pDb->nVMStep;.  
165a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
165b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
165c0 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20  interp,.        
165d0 20 20 20 20 22 62 61 64 20 61 72 67 75 6d 65 6e      "bad argumen
165e0 74 3a 20 73 68 6f 75 6c 64 20 62 65 20 61 75 74  t: should be aut
165f0 6f 69 6e 64 65 78 2c 20 73 74 65 70 2c 20 73 6f  oindex, step, so
16600 72 74 20 6f 72 20 76 6d 73 74 65 70 22 2c 0a 20  rt or vmstep",. 
16610 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
16620 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
16630 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16640 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
16650 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
16660 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
16670 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
16680 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
16690 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
166a0 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
166b0 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
166c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
166d0 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
166e0 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
166f0 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
16700 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
16710 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
16720 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
16730 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
16740 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
16750 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
16760 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
16770 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16780 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
16790 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
167a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
167b0 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
167c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
167d0 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
167e0 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
167f0 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
16800 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
16810 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68      $db total_ch
16820 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
16830 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
16840 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
16850 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
16860 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
16870 65 64 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  ed.  ** since th
16880 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
16890 65 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20  e was created.. 
168a0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f   */.  case DB_TO
168b0 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20  TAL_CHANGES: {. 
168c0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
168d0 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ult;.    if( obj
168e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
168f0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
16900 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
16910 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
16920 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16930 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d   }.    pResult =
16940 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
16950 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
16960 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
16970 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f  sult, sqlite3_to
16980 74 61 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  tal_changes(pDb-
16990 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
169a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
169b0 64 62 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41  db trace ?CALLBA
169c0 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61  CK?.  **.  ** Ma
169d0 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
169e0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41  to invoke the CA
169f0 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66  LLBACK routine f
16a00 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  or each SQL stat
16a10 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20  ement.  ** that 
16a20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68  is executed.  Th
16a30 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
16a40 4c 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  L is appended to
16a50 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65   CALLBACK before
16a60 0a 20 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63  .  ** it is exec
16a70 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  uted..  */.  cas
16a80 65 20 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20  e DB_TRACE: {.  
16a90 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
16aa0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
16ab0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
16ac0 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
16ad0 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
16ae0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16af0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
16b00 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
16b10 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
16b20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
16b30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16b40 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 28  , pDb->zTrace, (
16b50 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
16b60 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
16b70 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b     char *zTrace;
16b80 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
16b90 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
16ba0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
16bb0 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
16bc0 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Trace);.      }.
16bd0 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54        zTrace = T
16be0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
16bf0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
16c00 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54  n);.      if( zT
16c10 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b  race && len>0 ){
16c20 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
16c30 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  race = Tcl_Alloc
16c40 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
16c50 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
16c60 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c  >zTrace, zTrace,
16c70 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
16c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
16c90 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20  b->zTrace = 0;. 
16ca0 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
16cb0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16cc0 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
16cd0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
16ce0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26  LOATING_POINT) &
16cf0 26 20 5c 0a 20 20 20 20 21 64 65 66 69 6e 65 64  & \.    !defined
16d00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50  (SQLITE_OMIT_DEP
16d10 52 45 43 41 54 45 44 29 0a 20 20 20 20 20 20 69  RECATED).      i
16d20 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
16d30 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
16d40 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
16d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16d60 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44  trace(pDb->db, D
16d70 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70  bTraceHandler, p
16d80 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
16d90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16da0 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
16db0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
16dc0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
16dd0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
16de0 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 5f 76  *    $db trace_v
16df0 32 20 3f 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41  2 ?CALLBACK? ?MA
16e00 53 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61  SK?.  **.  ** Ma
16e10 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
16e20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41  to invoke the CA
16e30 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66  LLBACK routine f
16e40 6f 72 20 65 61 63 68 20 74 72 61 63 65 20 65 76  or each trace ev
16e50 65 6e 74 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e  ent.  ** matchin
16e60 67 20 74 68 65 20 6d 61 73 6b 20 74 68 61 74 20  g the mask that 
16e70 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20 20 54  is generated.  T
16e80 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  he parameters ar
16e90 65 20 61 70 70 65 6e 64 65 64 20 74 6f 0a 20 20  e appended to.  
16ea0 2a 2a 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f  ** CALLBACK befo
16eb0 72 65 20 69 74 20 69 73 20 65 78 65 63 75 74 65  re it is execute
16ec0 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
16ed0 42 5f 54 52 41 43 45 5f 56 32 3a 20 7b 0a 20 20  B_TRACE_V2: {.  
16ee0 20 20 69 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a    if( objc>4 ){.
16ef0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
16f00 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
16f10 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
16f20 43 4b 3f 20 3f 4d 41 53 4b 3f 22 29 3b 0a 20 20  CK? ?MASK?");.  
16f30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16f40 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
16f50 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
16f60 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
16f70 72 61 63 65 56 32 20 29 7b 0a 20 20 20 20 20 20  raceV2 ){.      
16f80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16f90 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
16fa0 7a 54 72 61 63 65 56 32 2c 20 28 63 68 61 72 2a  zTraceV2, (char*
16fb0 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
16fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
16fd0 61 72 20 2a 7a 54 72 61 63 65 56 32 3b 0a 20 20  ar *zTraceV2;.  
16fe0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
16ff0 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 77     Tcl_WideInt w
17000 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
17010 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
17020 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
17030 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f  nst char *TTYPE_
17040 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  strs[] = {.     
17050 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 22       "statement"
17060 2c 20 22 70 72 6f 66 69 6c 65 22 2c 20 22 72 6f  , "profile", "ro
17070 77 22 2c 20 22 63 6c 6f 73 65 22 2c 20 30 0a 20  w", "close", 0. 
17080 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20         };.      
17090 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75    enum TTYPE_enu
170a0 6d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 54 54  m {.          TT
170b0 59 50 45 5f 53 54 4d 54 2c 20 54 54 59 50 45 5f  YPE_STMT, TTYPE_
170c0 50 52 4f 46 49 4c 45 2c 20 54 54 59 50 45 5f 52  PROFILE, TTYPE_R
170d0 4f 57 2c 20 54 54 59 50 45 5f 43 4c 4f 53 45 0a  OW, TTYPE_CLOSE.
170e0 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
170f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
17100 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
17110 6c 5f 4c 69 73 74 4f 62 6a 4c 65 6e 67 74 68 28  l_ListObjLength(
17120 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
17130 20 26 6c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20   &len) ){.      
17140 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17150 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
17160 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
17170 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20   i<len; i++){.  
17180 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
17190 2a 70 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20 20  *pObj;.         
171a0 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20   int ttype;.    
171b0 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b        if( TCL_OK
171c0 21 3d 54 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64  !=Tcl_ListObjInd
171d0 65 78 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  ex(interp, objv[
171e0 33 5d 2c 20 69 2c 20 26 70 4f 62 6a 29 20 29 7b  3], i, &pObj) ){
171f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
17200 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17210 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17220 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
17230 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
17240 65 72 70 2c 20 70 4f 62 6a 2c 20 54 54 59 50 45  erp, pObj, TTYPE
17250 5f 73 74 72 73 2c 20 22 74 72 61 63 65 20 74 79  _strs, "trace ty
17260 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pe",.           
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65         0, &ttype
17290 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  )!=TCL_OK ){.   
172a0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64           Tcl_Wid
172b0 65 49 6e 74 20 77 54 79 70 65 3b 0a 20 20 20 20  eInt wType;.    
172c0 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
172d0 2a 70 45 72 72 6f 72 20 3d 20 54 63 6c 5f 44 75  *pError = Tcl_Du
172e0 70 6c 69 63 61 74 65 4f 62 6a 28 54 63 6c 5f 47  plicateObj(Tcl_G
172f0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
17300 72 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rp));.          
17310 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
17320 6e 74 28 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  nt(pError);.    
17330 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f          if( TCL_
17340 4f 4b 3d 3d 54 63 6c 5f 47 65 74 57 69 64 65 49  OK==Tcl_GetWideI
17350 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
17360 2c 20 70 4f 62 6a 2c 20 26 77 54 79 70 65 29 20  , pObj, &wType) 
17370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
17380 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
17390 74 28 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20  t(pError);.     
173a0 20 20 20 20 20 20 20 20 20 77 4d 61 73 6b 20 7c           wMask |
173b0 3d 20 77 54 79 70 65 3b 0a 20 20 20 20 20 20 20  = wType;.       
173c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
173d0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65            Tcl_Se
173e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
173f0 70 2c 20 70 45 72 72 6f 72 29 3b 0a 20 20 20 20  p, pError);.    
17400 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65            Tcl_De
17410 63 72 52 65 66 43 6f 75 6e 74 28 70 45 72 72 6f  crRefCount(pErro
17420 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
17430 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17440 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
17450 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
17460 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
17470 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59  witch( (enum TTY
17480 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b  PE_enum)ttype ){
17490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
174a0 61 73 65 20 54 54 59 50 45 5f 53 54 4d 54 3a 20  ase TTYPE_STMT: 
174b0 20 20 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49     wMask |= SQLI
174c0 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3b 20 20  TE_TRACE_STMT;  
174d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
174e0 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
174f0 45 5f 50 52 4f 46 49 4c 45 3a 20 77 4d 61 73 6b  E_PROFILE: wMask
17500 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45   |= SQLITE_TRACE
17510 5f 50 52 4f 46 49 4c 45 3b 20 62 72 65 61 6b 3b  _PROFILE; break;
17520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
17530 61 73 65 20 54 54 59 50 45 5f 52 4f 57 3a 20 20  ase TTYPE_ROW:  
17540 20 20 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49     wMask |= SQLI
17550 54 45 5f 54 52 41 43 45 5f 52 4f 57 3b 20 20 20  TE_TRACE_ROW;   
17560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17570 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
17580 45 5f 43 4c 4f 53 45 3a 20 20 20 77 4d 61 73 6b  E_CLOSE:   wMask
17590 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45   |= SQLITE_TRACE
175a0 5f 43 4c 4f 53 45 3b 20 20 20 62 72 65 61 6b 3b  _CLOSE;   break;
175b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
175c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
175d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
175e0 7b 0a 20 20 20 20 20 20 20 20 77 4d 61 73 6b 20  {.        wMask 
175f0 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53  = SQLITE_TRACE_S
17600 54 4d 54 3b 20 2f 2a 20 75 73 65 20 74 68 65 20  TMT; /* use the 
17610 22 6c 65 67 61 63 79 22 20 64 65 66 61 75 6c 74  "legacy" default
17620 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
17630 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
17640 65 56 32 20 29 7b 0a 20 20 20 20 20 20 20 20 54  eV2 ){.        T
17650 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
17660 61 63 65 56 32 29 3b 0a 20 20 20 20 20 20 7d 0a  aceV2);.      }.
17670 20 20 20 20 20 20 7a 54 72 61 63 65 56 32 20 3d        zTraceV2 =
17680 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
17690 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
176a0 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
176b0 7a 54 72 61 63 65 56 32 20 26 26 20 6c 65 6e 3e  zTraceV2 && len>
176c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
176d0 2d 3e 7a 54 72 61 63 65 56 32 20 3d 20 54 63 6c  ->zTraceV2 = Tcl
176e0 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
176f0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
17700 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c  y(pDb->zTraceV2,
17710 20 7a 54 72 61 63 65 56 32 2c 20 6c 65 6e 2b 31   zTraceV2, len+1
17720 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17730 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72          pDb->zTr
17740 61 63 65 56 32 20 3d 20 30 3b 0a 20 20 20 20 20  aceV2 = 0;.     
17750 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
17760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
17770 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
17780 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
17790 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
177a0 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
177b0 56 32 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  V2 ){.        pD
177c0 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
177d0 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
177e0 74 65 33 5f 74 72 61 63 65 5f 76 32 28 70 44 62  te3_trace_v2(pDb
177f0 2d 3e 64 62 2c 20 28 75 6e 73 69 67 6e 65 64 29  ->db, (unsigned)
17800 77 4d 61 73 6b 2c 20 44 62 54 72 61 63 65 56 32  wMask, DbTraceV2
17810 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
17820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17830 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
17840 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 30 2c  e_v2(pDb->db, 0,
17850 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
17860 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
17870 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
17880 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  *    $db transac
17890 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
178a0 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
178b0 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20  usive] SCRIPT.  
178c0 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20  **.  ** Start a 
178d0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
178e0 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61  (if we are not a
178f0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69  lready in the mi
17900 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72  dst of a.  ** tr
17910 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65  ansaction) and e
17920 78 65 63 75 74 65 20 74 68 65 20 54 43 4c 20 73  xecute the TCL s
17930 63 72 69 70 74 20 53 43 52 49 50 54 2e 20 20 41  cript SCRIPT.  A
17940 66 74 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a  fter SCRIPT.  **
17950 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68   completes, eith
17960 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  er commit the tr
17970 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c  ansaction or rol
17980 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53 43 52  l it back if SCR
17990 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20  IPT.  ** throws 
179a0 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f  an exception.  O
179b0 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e  r if no new tran
179c0 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  sation was start
179d0 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  ed, do nothing..
179e0 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78    ** pass the ex
179f0 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68  ception on up th
17a00 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
17a10 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
17a20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62 79 20  was inspired by 
17a30 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61  Dave Thomas's ta
17a40 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68  lk on Ruby at th
17a50 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65  e.  ** 2005 O'Re
17a60 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65  illy Open Source
17a70 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43   Convention (OSC
17a80 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ON)..  */.  case
17a90 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a   DB_TRANSACTION:
17aa0 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
17ab0 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e  pScript;.    con
17ac0 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20  st char *zBegin 
17ad0 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63  = "SAVEPOINT _tc
17ae0 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a  l_transaction";.
17af0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
17b00 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
17b10 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
17b20 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
17b30 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43  objv, "[TYPE] SC
17b40 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
17b50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17b60 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
17b70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Db->nTransaction
17b80 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29  ==0 && objc==4 )
17b90 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
17ba0 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59 50 45  onst char *TTYPE
17bb0 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  _strs[] = {.    
17bc0 20 20 20 20 22 64 65 66 65 72 72 65 64 22 2c 20      "deferred", 
17bd0 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20    "exclusive",  
17be0 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20  "immediate", 0. 
17bf0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e       };.      en
17c00 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a  um TTYPE_enum {.
17c10 20 20 20 20 20 20 20 20 54 54 59 50 45 5f 44 45          TTYPE_DE
17c20 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58  FERRED, TTYPE_EX
17c30 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49  CLUSIVE, TTYPE_I
17c40 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d  MMEDIATE.      }
17c50 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74 79 70  ;.      int ttyp
17c60 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  e;.      if( Tcl
17c70 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
17c80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17c90 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74  , TTYPE_strs, "t
17ca0 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22  ransaction type"
17cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20  0, &ttype) ){.  
17ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
17cf0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
17d00 20 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65        switch( (e
17d10 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74  num TTYPE_enum)t
17d20 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20  type ){.        
17d30 63 61 73 65 20 54 54 59 50 45 5f 44 45 46 45 52  case TTYPE_DEFER
17d40 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  RED:    /* no-op
17d50 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20   */;            
17d60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17d70 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 45      case TTYPE_E
17d80 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67  XCLUSIVE:   zBeg
17d90 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c  in = "BEGIN EXCL
17da0 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a  USIVE";  break;.
17db0 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
17dc0 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20  PE_IMMEDIATE:   
17dd0 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20  zBegin = "BEGIN 
17de0 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65  IMMEDIATE";  bre
17df0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17e00 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d 20  }.    pScript = 
17e10 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20  objv[objc-1];.. 
17e20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51     /* Run the SQ
17e30 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61  Lite BEGIN comma
17e40 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74 72 61  nd to open a tra
17e50 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
17e60 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44  point. */.    pD
17e70 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b  b->disableAuth++
17e80 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
17e90 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
17ea0 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30   zBegin, 0, 0, 0
17eb0 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61  );.    pDb->disa
17ec0 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69  bleAuth--;.    i
17ed0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17ee0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
17ef0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17f00 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
17f10 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
17f20 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
17f30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17f40 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54     }.    pDb->nT
17f50 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20  ransaction++;.. 
17f60 20 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e     /* If using N
17f70 52 45 2c 20 73 63 68 65 64 75 6c 65 20 61 20 63  RE, schedule a c
17f80 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b  allback to invok
17f90 65 20 74 68 65 20 73 63 72 69 70 74 20 70 53 63  e the script pSc
17fa0 72 69 70 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  ript, then.    *
17fb0 2a 20 61 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62  * a second callb
17fc0 61 63 6b 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f  ack to commit (o
17fd0 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20  r rollback) the 
17fe0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
17ff0 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  avepoint.    ** 
18000 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 20 49 66  opened above. If
18010 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20   not using NRE, 
18020 65 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72  evaluate the scr
18030 69 70 74 20 64 69 72 65 63 74 6c 79 2c 20 74 68  ipt directly, th
18040 65 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66  en.    ** call f
18050 75 6e 63 74 69 6f 6e 20 44 62 54 72 61 6e 73 50  unction DbTransP
18060 6f 73 74 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d  ostCmd() to comm
18070 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29  it (or rollback)
18080 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18090 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  .    ** or savep
180a0 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66  oint.  */.    if
180b0 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
180c0 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43        Tcl_NRAddC
180d0 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
180e0 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20  DbTransPostCmd, 
180f0 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  cd, 0, 0, 0);.  
18100 20 20 20 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52      (void)Tcl_NR
18110 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20  EvalObj(interp, 
18120 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
18130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18140 20 3d 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d   = DbTransPostCm
18150 64 28 26 63 64 2c 20 69 6e 74 65 72 70 2c 20 54  d(&cd, interp, T
18160 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
18170 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29  erp, pScript, 0)
18180 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
18190 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
181a0 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b  **    $db unlock
181b0 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70 74 3f  _notify ?script?
181c0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
181d0 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b  UNLOCK_NOTIFY: {
181e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
181f0 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
18200 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41 70 70  TIFY.    Tcl_App
18210 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18220 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  , "unlock_notify
18230 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
18240 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20  n this build",. 
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
18270 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
18280 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  R;.#else.    if(
18290 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
182a0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
182b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
182c0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
182d0 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
182e0 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
182f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18300 20 20 20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66     void (*xNotif
18310 79 29 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29  y)(void **, int)
18320 20 3d 20 30 3b 0a 20 20 20 20 20 20 76 6f 69 64   = 0;.      void
18330 20 2a 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 30   *pNotifyArg = 0
18340 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ;..      if( pDb
18350 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20  ->pUnlockNotify 
18360 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ){.        Tcl_D
18370 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
18380 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
18390 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55  .        pDb->pU
183a0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b  nlockNotify = 0;
183b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
183c0 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
183d0 20 20 20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d         xNotify =
183e0 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b   DbUnlockNotify;
183f0 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 69 66 79  .        pNotify
18400 41 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 70 44  Arg = (void *)pD
18410 62 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  b;.        pDb->
18420 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
18430 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  objv[2];.       
18440 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
18450 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
18460 74 69 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  tify);.      }..
18470 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
18480 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28  3_unlock_notify(
18490 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79  pDb->db, xNotify
184a0 2c 20 70 4e 6f 74 69 66 79 41 72 67 29 20 29 7b  , pNotifyArg) ){
184b0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
184c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
184d0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
184e0 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
184f0 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63  *)0);.        rc
18500 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
18510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
18520 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
18530 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
18540 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f  $db preupdate_ho
18550 6f 6b 20 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 20  ok count.  **   
18560 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68   $db preupdate_h
18570 6f 6f 6b 20 68 6f 6f 6b 20 3f 53 43 52 49 50 54  ook hook ?SCRIPT
18580 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72  ?.  **    $db pr
18590 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6e 65 77  eupdate_hook new
185a0 20 49 4e 44 45 58 0a 20 20 2a 2a 20 20 20 20 24   INDEX.  **    $
185b0 64 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f  db preupdate_hoo
185c0 6b 20 6f 6c 64 20 49 4e 44 45 58 0a 20 20 2a 2f  k old INDEX.  */
185d0 0a 20 20 63 61 73 65 20 44 42 5f 50 52 45 55 50  .  case DB_PREUP
185e0 44 41 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20  DATE: {.#ifndef 
185f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
18600 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20  EUPDATE_HOOK.   
18610 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18620 74 28 69 6e 74 65 72 70 2c 20 22 70 72 65 75 70  t(interp, "preup
18630 64 61 74 65 5f 68 6f 6f 6b 20 77 61 73 20 6f 6d  date_hook was om
18640 69 74 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  itted at compile
18650 2d 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 20  -time", .       
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
18670 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 63 20  har*)0);.    rc 
18680 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  = TCL_ERROR;.#el
18690 73 65 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  se.    static co
186a0 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 75 62 5b  nst char *azSub[
186b0 5d 20 3d 20 7b 22 63 6f 75 6e 74 22 2c 20 22 64  ] = {"count", "d
186c0 65 70 74 68 22 2c 20 22 68 6f 6f 6b 22 2c 20 22  epth", "hook", "
186d0 6e 65 77 22 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b  new", "old", 0};
186e0 0a 20 20 20 20 65 6e 75 6d 20 44 62 50 72 65 75  .    enum DbPreu
186f0 70 64 61 74 65 53 75 62 43 6d 64 20 7b 0a 20 20  pdateSubCmd {.  
18700 20 20 20 20 50 52 45 5f 43 4f 55 4e 54 2c 20 50      PRE_COUNT, P
18710 52 45 5f 44 45 50 54 48 2c 20 50 52 45 5f 48 4f  RE_DEPTH, PRE_HO
18720 4f 4b 2c 20 50 52 45 5f 4e 45 57 2c 20 50 52 45  OK, PRE_NEW, PRE
18730 5f 4f 4c 44 0a 20 20 20 20 7d 3b 0a 20 20 20 20  _OLD.    };.    
18740 69 6e 74 20 69 53 75 62 3b 0a 0a 20 20 20 20 69  int iSub;..    i
18750 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20  f( objc<3 ){.   
18760 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18770 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
18780 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e  bjv, "SUB-COMMAN
18790 44 20 3f 41 52 47 53 3f 22 29 3b 0a 20 20 20 20  D ?ARGS?");.    
187a0 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  }.    if( Tcl_Ge
187b0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
187c0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61  terp, objv[2], a
187d0 7a 53 75 62 2c 20 22 73 75 62 2d 63 6f 6d 6d 61  zSub, "sub-comma
187e0 6e 64 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29  nd", 0, &iSub) )
187f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
18800 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
18810 0a 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e  .    switch( (en
18820 75 6d 20 44 62 50 72 65 75 70 64 61 74 65 53 75  um DbPreupdateSu
18830 62 43 6d 64 29 69 53 75 62 20 29 7b 0a 20 20 20  bCmd)iSub ){.   
18840 20 20 20 63 61 73 65 20 50 52 45 5f 43 4f 55 4e     case PRE_COUN
18850 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T: {.        int
18860 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
18870 70 72 65 75 70 64 61 74 65 5f 63 6f 75 6e 74 28  preupdate_count(
18880 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  pDb->db);.      
18890 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
188a0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
188b0 65 77 49 6e 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b  ewIntObj(nCol));
188c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
188d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
188e0 61 73 65 20 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a  ase PRE_HOOK: {.
188f0 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63          if( objc
18900 3e 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >4 ){.          
18910 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
18920 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
18930 2c 20 22 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f  , "hook ?SCRIPT?
18940 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ");.          re
18950 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18970 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65    DbHookCmd(inte
18980 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d  rp, pDb, (objc==
18990 34 20 3f 20 6f 62 6a 76 5b 33 5d 20 3a 20 30 29  4 ? objv[3] : 0)
189a0 2c 20 26 70 44 62 2d 3e 70 50 72 65 55 70 64 61  , &pDb->pPreUpda
189b0 74 65 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20  teHook);.       
189c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
189d0 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f  .      case PRE_
189e0 44 45 50 54 48 3a 20 7b 0a 20 20 20 20 20 20 20  DEPTH: {.       
189f0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
18a00 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63          if( objc
18a10 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=3 ){.         
18a20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
18a30 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a  s(interp, 3, obj
18a40 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20  v, "");.        
18a50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18a60 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
18a70 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c        pRet = Tcl
18a80 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
18a90 65 33 5f 70 72 65 75 70 64 61 74 65 5f 64 65 70  e3_preupdate_dep
18aa0 74 68 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  th(pDb->db));.  
18ab0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
18ac0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
18ad0 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  Ret);.        br
18ae0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
18af0 20 20 20 20 63 61 73 65 20 50 52 45 5f 4e 45 57      case PRE_NEW
18b00 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45  :.      case PRE
18b10 5f 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  _OLD: {.        
18b20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 20 20  int iIdx;.      
18b30 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
18b40 2a 70 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  *pValue;.       
18b50 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
18b60 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72            Tcl_Wr
18b70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
18b80 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 49 4e 44  p, 3, objv, "IND
18b90 45 58 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EX");.          
18ba0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18bc0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
18bd0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
18be0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 69 49 64 78  , objv[3], &iIdx
18bf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
18c00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18c10 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
18c20 20 20 20 20 69 66 28 20 69 53 75 62 3d 3d 50 52      if( iSub==PR
18c30 45 5f 4f 4c 44 20 29 7b 0a 20 20 20 20 20 20 20  E_OLD ){.       
18c40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
18c50 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 70 44  preupdate_old(pD
18c60 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56  b->db, iIdx, &pV
18c70 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  alue);.        }
18c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18c90 61 73 73 65 72 74 28 20 69 53 75 62 3d 3d 50 52  assert( iSub==PR
18ca0 45 5f 4e 45 57 20 29 3b 0a 20 20 20 20 20 20 20  E_NEW );.       
18cb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
18cc0 70 72 65 75 70 64 61 74 65 5f 6e 65 77 28 70 44  preupdate_new(pD
18cd0 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56  b->db, iIdx, &pV
18ce0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  alue);.        }
18cf0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ..        if( rc
18d00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18d10 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a           Tcl_Obj
18d20 20 2a 70 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20   *pObj;.        
18d30 20 20 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77    pObj = Tcl_New
18d40 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
18d50 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
18d60 65 78 74 28 70 56 61 6c 75 65 29 2c 20 2d 31 29  ext(pValue), -1)
18d70 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
18d80 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
18d90 65 72 70 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20  erp, pObj);.    
18da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18db0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
18dc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
18dd0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
18de0 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
18df0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
18e00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18e20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
18e30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
18e40 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
18e50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
18e60 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
18e70 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70   wal_hook ?scrip
18e80 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75  t?.  **    $db u
18e90 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69  pdate_hook ?scri
18ea0 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  pt?.  **    $db 
18eb0 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73  rollback_hook ?s
18ec0 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
18ed0 73 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 0a  se DB_WAL_HOOK:.
18ee0 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54 45    case DB_UPDATE
18ef0 5f 48 4f 4f 4b 3a 0a 20 20 63 61 73 65 20 44 42  _HOOK:.  case DB
18f00 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20  _ROLLBACK_HOOK: 
18f10 7b 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70 48  {.    /* set ppH
18f20 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ook to point at 
18f30 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70  pUpdateHook or p
18f40 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65  RollbackHook, de
18f50 70 65 6e 64 69 6e 67 20 6f 6e 0a 20 20 20 20 2a  pending on.    *
18f60 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62 20 75  * whether [$db u
18f70 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b  pdate_hook] or [
18f80 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  $db rollback_hoo
18f90 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a  k] was invoked..
18fa0 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f      */.    Tcl_O
18fb0 62 6a 20 2a 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b  bj **ppHook = 0;
18fc0 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
18fd0 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20 70  =DB_WAL_HOOK ) p
18fe0 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57  pHook = &pDb->pW
18ff0 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20  alHook;.    if( 
19000 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54  choice==DB_UPDAT
19010 45 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20  E_HOOK ) ppHook 
19020 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48  = &pDb->pUpdateH
19030 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  ook;.    if( cho
19040 69 63 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b  ice==DB_ROLLBACK
19050 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d  _HOOK ) ppHook =
19060 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   &pDb->pRollback
19070 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 6f 62  Hook;.    if( ob
19080 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 20 54  jc>3 ){.       T
19090 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
190a0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
190b0 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
190c0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
190d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
190e0 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65    DbHookCmd(inte
190f0 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d  rp, pDb, (objc==
19100 33 20 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20 30 29  3 ? objv[2] : 0)
19110 2c 20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 62  , ppHook);.    b
19120 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
19130 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20     $db version. 
19140 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
19150 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69  the version stri
19160 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ng for this data
19170 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
19180 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a  e DB_VERSION: {.
19190 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
191a0 6f 72 28 69 3d 32 3b 20 69 3c 6f 62 6a 63 3b 20  or(i=2; i<objc; 
191b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
191c0 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 54  t char *zArg = T
191d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
191e0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  v[i]);.      /* 
191f0 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e  Optional argumen
19200 74 73 20 74 6f 20 24 64 62 20 76 65 72 73 69 6f  ts to $db versio
19210 6e 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  n are used for t
19220 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 20 2a  esting purpose *
19230 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19240 54 45 53 54 0a 20 20 20 20 20 20 2f 2a 20 24 64  TEST.      /* $d
19250 62 20 76 65 72 73 69 6f 6e 20 2d 75 73 65 2d 6c  b version -use-l
19260 65 67 61 63 79 2d 70 72 65 70 61 72 65 20 42 4f  egacy-prepare BO
19270 4f 4c 45 41 4e 0a 20 20 20 20 20 20 2a 2a 0a 20  OLEAN.      **. 
19280 20 20 20 20 20 2a 2a 20 54 75 72 6e 20 74 68 65       ** Turn the
19290 20 75 73 65 20 6f 66 20 6c 65 67 61 63 79 20 73   use of legacy s
192a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
192b0 20 6f 6e 20 6f 72 20 6f 66 66 2e 0a 20 20 20 20   on or off..    
192c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
192d0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75 73  trcmp(zArg, "-us
192e0 65 2d 6c 65 67 61 63 79 2d 70 72 65 70 61 72 65  e-legacy-prepare
192f0 22 29 3d 3d 30 20 26 26 20 69 2b 31 3c 6f 62 6a  ")==0 && i+1<obj
19300 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b  c ){.        i++
19310 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63  ;.        if( Tc
19320 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
19330 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
19340 5b 69 5d 2c 20 26 70 44 62 2d 3e 62 4c 65 67 61  [i], &pDb->bLega
19350 63 79 50 72 65 70 61 72 65 29 20 29 7b 0a 20 20  cyPrepare) ){.  
19360 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
19370 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
19380 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
19390 0a 20 20 20 20 20 20 2f 2a 20 24 64 62 20 76 65  .      /* $db ve
193a0 72 73 69 6f 6e 20 2d 6c 61 73 74 2d 73 74 6d 74  rsion -last-stmt
193b0 2d 70 74 72 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -ptr.      **.  
193c0 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20      ** Return a 
193d0 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
193e0 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f  a hex encoding o
193f0 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f  f the pointer to
19400 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 6f   the.      ** mo
19410 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
19420 33 5f 73 74 6d 74 20 69 6e 20 74 68 65 20 73 74  3_stmt in the st
19430 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2e 0a 20  atement cache.. 
19440 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
19450 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
19460 2d 6c 61 73 74 2d 73 74 6d 74 2d 70 74 72 22 29  -last-stmt-ptr")
19470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
19480 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
19490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
194a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
194b0 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 70 22  Buf), zBuf, "%p"
194c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
194d0 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e             pDb->
194e0 73 74 6d 74 4c 69 73 74 20 3f 20 70 44 62 2d 3e  stmtList ? pDb->
194f0 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 3a  stmtList->pStmt:
19500 20 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c   0);.        Tcl
19510 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
19520 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c  p, zBuf, TCL_VOL
19530 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20 7d 65  ATILE);.      }e
19540 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
19550 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 20 20 20  LITE_TEST */.   
19560 20 20 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c     {.        Tcl
19570 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19580 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 61  terp, "unknown a
19590 72 67 75 6d 65 6e 74 3a 20 22 2c 20 7a 41 72 67  rgument: ", zArg
195a0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
195b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
195c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
195d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
195e0 32 20 29 7b 20 20 20 0a 20 20 20 20 20 20 54 63  2 ){   .      Tc
195f0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
19600 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
19610 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
19620 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
19630 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
19640 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64    }...  } /* End
19650 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73   of the SWITCH s
19660 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65  tatement */.  re
19670 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
19680 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f  SQLITE_TCL_NRE./
19690 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61  *.** Adaptor tha
196a0 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62  t provides an ob
196b0 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74  jCmd interface t
196c0 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65  o the NRE-enable
196d0 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69  d.** interface i
196e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
196f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
19700 49 54 45 5f 54 43 4c 41 50 49 20 44 62 4f 62 6a  ITE_TCLAPI DbObj
19710 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20 76 6f  CmdAdaptor(.  vo
19720 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e  id *cd,.  Tcl_In
19730 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19740 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19750 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a  Obj *const*objv.
19760 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  ){.  return Tcl_
19770 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e  NRCallObjProc(in
19780 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20  terp, DbObjCmd, 
19790 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b  cd, objc, objv);
197a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
197b0 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a  ITE_TCL_NRE */..
197c0 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20  /*.**   sqlite3 
197d0 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20  DBNAME FILENAME 
197e0 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f  ?-vfs VFSNAME? ?
197f0 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64  -key KEY? ?-read
19800 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  only BOOLEAN?.**
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65             ?-cre
19830 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e  ate BOOLEAN? ?-n
19840 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a  omutex BOOLEAN?.
19850 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
19860 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61  e main Tcl comma
19870 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73  nd.  When the "s
19880 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61  qlite" Tcl comma
19890 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  nd is.** invoked
198a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
198b0 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74  uns to process t
198c0 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  hat command..**.
198d0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
198e0 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69  ument, DBNAME, i
198f0 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e  s an arbitrary n
19900 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a  ame for a new.**
19910 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
19920 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d  tion.  This comm
19930 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65  and creates a ne
19940 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a  w command named.
19950 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69  ** DBNAME that i
19960 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  s used to contro
19970 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  l that connectio
19980 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  n.  The database
19990 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  .** connection i
199a0 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  s deleted when t
199b0 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e  he DBNAME comman
199c0 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  d is deleted..**
199d0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
199e0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
199f0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
19a00 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a  ase file..**.*/.
19a10 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
19a20 45 5f 54 43 4c 41 50 49 20 44 62 4d 61 69 6e 28  E_TCLAPI DbMain(
19a30 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54  .  void *cd,.  T
19a40 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19a50 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19a60 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a   Tcl_Obj *const*
19a70 6f 62 6a 76 0a 29 7b 0a 20 20 53 71 6c 69 74 65  objv.){.  Sqlite
19a80 44 62 20 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63  Db *p;.  const c
19a90 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61  har *zArg;.  cha
19aa0 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e  r *zErrMsg;.  in
19ab0 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
19ac0 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73  r *zFile;.  cons
19ad0 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30  t char *zVfs = 0
19ae0 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20  ;.  int flags;. 
19af0 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61   Tcl_DString tra
19b00 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b  nslatedFilename;
19b10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19b20 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26  ITE_HAS_CODEC) &
19b30 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
19b40 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f  E_OMIT_CODEC_FRO
19b50 4d 5f 54 43 4c 29 0a 20 20 76 6f 69 64 20 2a 70  M_TCL).  void *p
19b60 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Key = 0;.  int n
19b70 4b 65 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Key = 0;.#endif.
19b80 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
19b90 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c 20 65  In normal use, e
19ba0 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70 72 65  ach TCL interpre
19bb0 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20 73 69  ter runs in a si
19bc0 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 53 6f  ngle thread.  So
19bd0 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  .  ** by default
19be0 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20 6f 66  , we can turn of
19bf0 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53 51 4c   mutexing on SQL
19c00 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ite database con
19c10 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 48  nections..  ** H
19c20 6f 77 65 76 65 72 2c 20 66 6f 72 20 74 65 73 74  owever, for test
19c30 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69 74 20  ing purposes it 
19c40 69 73 20 75 73 65 66 75 6c 20 74 6f 20 68 61 76  is useful to hav
19c50 65 20 6d 75 74 65 78 65 73 20 74 75 72 6e 65 64  e mutexes turned
19c60 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c 20 62  .  ** on.  So, b
19c70 79 20 64 65 66 61 75 6c 74 2c 20 6d 75 74 65 78  y default, mutex
19c80 65 73 20 64 65 66 61 75 6c 74 20 6f 66 66 2e 20  es default off. 
19c90 20 42 75 74 20 69 66 20 63 6f 6d 70 69 6c 65 64   But if compiled
19ca0 20 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c 49 54   with.  ** SQLIT
19cb0 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55  E_TCL_DEFAULT_FU
19cc0 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d 75 74  LLMUTEX then mut
19cd0 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 6e 2e  exes default on.
19ce0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
19cf0 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f  ITE_TCL_DEFAULT_
19d00 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c 61 67  FULLMUTEX.  flag
19d10 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
19d20 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
19d30 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
19d40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
19d50 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a 20 20  LMUTEX;.#else.  
19d60 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
19d70 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
19d80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
19d90 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
19da0 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64 69 66  _NOMUTEX;.#endif
19db0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ..  if( objc==2 
19dc0 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63  ){.    zArg = Tc
19dd0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
19de0 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
19df0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
19e00 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d  Arg,"-version")=
19e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
19e20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19e30 65 72 70 2c 73 71 6c 69 74 65 33 5f 6c 69 62 76  erp,sqlite3_libv
19e40 65 72 73 69 6f 6e 28 29 2c 20 28 63 68 61 72 2a  ersion(), (char*
19e50 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
19e60 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
19e70 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
19e80 41 72 67 2c 22 2d 73 6f 75 72 63 65 69 64 22 29  Arg,"-sourceid")
19e90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
19ea0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19eb0 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 73 6f 75  terp,sqlite3_sou
19ec0 72 63 65 69 64 28 29 2c 20 28 63 68 61 72 2a 29  rceid(), (char*)
19ed0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
19ee0 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
19ef0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41     if( strcmp(zA
19f00 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29  rg,"-has-codec")
19f10 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e  ==0 ){.#if defin
19f20 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
19f30 44 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64  DEC) && !defined
19f40 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44  (SQLITE_OMIT_COD
19f50 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20  EC_FROM_TCL).   
19f60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19f70 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 28  ult(interp,"1",(
19f80 63 68 61 72 2a 29 30 29 3b 0a 23 65 6c 73 65 0a  char*)0);.#else.
19f90 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
19fa0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30  Result(interp,"0
19fb0 22 2c 28 63 68 61 72 2a 29 30 29 3b 0a 23 65 6e  ",(char*)0);.#en
19fc0 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
19fd0 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
19fe0 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b   }.  for(i=3; i+
19ff0 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20  1<objc; i+=2){. 
1a000 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
1a010 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29  tString(objv[i])
1a020 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
1a030 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30  (zArg,"-key")==0
1a040 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
1a050 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1a060 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1a070 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f  LITE_OMIT_CODEC_
1a080 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20  FROM_TCL).      
1a090 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
1a0a0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1a0b0 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29  bjv[i+1], &nKey)
1a0c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1a0d0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
1a0e0 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29  rg, "-vfs")==0 )
1a0f0 7b 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54  {.      zVfs = T
1a100 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a110 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  v[i+1]);.    }el
1a120 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
1a130 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29  rg, "-readonly")
1a140 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1a150 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
1a160 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
1a170 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1a180 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
1a190 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a1a0 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
1a1b0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
1a1c0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
1a1d0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
1a1e0 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
1a1f0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
1a200 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1a210 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
1a220 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
1a230 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   ~SQLITE_OPEN_RE
1a240 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  ADONLY;.        
1a250 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1a260 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a  OPEN_READWRITE;.
1a270 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1a280 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
1a290 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d 3d 30  g, "-create")==0
1a2a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
1a2b0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
1a2c0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
1a2d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
1a2e0 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
1a2f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1a300 20 20 69 66 28 20 62 20 26 26 20 28 66 6c 61 67    if( b && (flag
1a310 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1a320 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  READONLY)==0 ){.
1a330 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
1a340 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1a350 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ATE;.      }else
1a360 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
1a370 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
1a380 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a  CREATE;.      }.
1a390 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1a3a0 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d  rcmp(zArg, "-nom
1a3b0 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  utex")==0 ){.   
1a3c0 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
1a3d0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
1a3e0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
1a3f0 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
1a400 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a410 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
1a420 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
1a430 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1a440 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  _NOMUTEX;.      
1a450 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
1a460 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
1a470 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  X;.      }else{.
1a480 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
1a490 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f   ~SQLITE_OPEN_NO
1a4a0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20  MUTEX;.      }. 
1a4b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1a4c0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c  cmp(zArg, "-full
1a4d0 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  mutex")==0 ){.  
1a4e0 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
1a4f0 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
1a500 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
1a510 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
1a520 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a530 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
1a540 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  b ){.        fla
1a550 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
1a560 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
1a570 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
1a580 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
1a590 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EX;.      }else{
1a5a0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
1a5b0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  = ~SQLITE_OPEN_F
1a5c0 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  ULLMUTEX;.      
1a5d0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1a5e0 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75  strcmp(zArg, "-u
1a5f0 72 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ri")==0 ){.     
1a600 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
1a610 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
1a620 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1a630 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
1a640 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a650 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
1a660 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
1a670 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  |= SQLITE_OPEN_U
1a680 52 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  RI;.      }else{
1a690 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
1a6a0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  = ~SQLITE_OPEN_U
1a6b0 52 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RI;.      }.    
1a6c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
1a6d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a6e0 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  terp, "unknown o
1a6f0 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20  ption: ", zArg, 
1a700 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
1a710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a720 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  R;.    }.  }.  i
1a730 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62  f( objc<3 || (ob
1a740 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20 20  jc&1)!=1 ){.    
1a750 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1a760 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1a770 2c 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45 20  ,.      "HANDLE 
1a780 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56  FILENAME ?-vfs V
1a790 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e  FSNAME? ?-readon
1a7a0 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72  ly BOOLEAN? ?-cr
1a7b0 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20  eate BOOLEAN?". 
1a7c0 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78       " ?-nomutex
1a7d0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c   BOOLEAN? ?-full
1a7e0 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f  mutex BOOLEAN? ?
1a7f0 2d 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23  -uri BOOLEAN?".#
1a800 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1a810 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
1a820 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1a830 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
1a840 54 43 4c 29 0a 20 20 20 20 20 20 22 20 3f 2d 6b  TCL).      " ?-k
1a850 65 79 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65  ey CODECKEY?".#e
1a860 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  ndif.    );.    
1a870 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a880 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20  ;.  }.  zErrMsg 
1a890 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69  = 0;.  p = (Sqli
1a8a0 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  teDb*)Tcl_Alloc(
1a8b0 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
1a8c0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
1a8d0 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69  zeof(*p));.  zFi
1a8e0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
1a8f0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
1a900 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  ], 0);.  zFile =
1a910 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69   Tcl_TranslateFi
1a920 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a  leName(interp, z
1a930 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c 61 74 65  File, &translate
1a940 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63  dFilename);.  rc
1a950 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
1a960 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62  v2(zFile, &p->db
1a970 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  , flags, zVfs);.
1a980 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
1a990 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  e(&translatedFil
1a9a0 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 2d  ename);.  if( p-
1a9b0 3e 64 62 20 29 7b 0a 20 20 20 20 69 66 28 20 53  >db ){.    if( S
1a9c0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1a9d0 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  3_errcode(p->db)
1a9e0 20 29 7b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73   ){.      zErrMs
1a9f0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
1aa00 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
1aa10 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
1aa20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1aa30 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
1aa40 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20      p->db = 0;. 
1aa50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1aa60 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
1aa70 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1aa80 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72  , sqlite3_errstr
1aa90 28 72 63 29 29 3b 0a 20 20 7d 0a 23 69 66 20 64  (rc));.  }.#if d
1aaa0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
1aab0 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66  S_CODEC) && !def
1aac0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1aad0 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29  _CODEC_FROM_TCL)
1aae0 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a  .  if( p->db ){.
1aaf0 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28      sqlite3_key(
1ab00 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  p->db, pKey, nKe
1ab10 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  y);.  }.#endif. 
1ab20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
1ab30 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
1ab40 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d  lt(interp, zErrM
1ab50 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  sg, TCL_VOLATILE
1ab60 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  );.    Tcl_Free(
1ab70 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 73  (char*)p);.    s
1ab80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
1ab90 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Msg);.    return
1aba0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1abb0 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e    p->maxStmt = N
1abc0 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  UM_PREPARED_STMT
1abd0 53 3b 0a 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  S;.  p->openFlag
1abe0 73 20 3d 20 66 6c 61 67 73 20 26 20 53 51 4c 49  s = flags & SQLI
1abf0 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 70  TE_OPEN_URI;.  p
1ac00 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
1ac10 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  p;.  zArg = Tcl_
1ac20 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
1ac30 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
1ac40 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
1ac50 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43 72 65 61  {.    Tcl_NRCrea
1ac60 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
1ac70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64  , zArg, DbObjCmd
1ac80 41 64 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d  Adaptor, DbObjCm
1ac90 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1aca0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1acb0 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
1acc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1acd0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
1ace0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72  mand(interp, zAr
1acf0 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68  g, DbObjCmd, (ch
1ad00 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43  ar*)p, DbDeleteC
1ad10 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  md);.  }.  retur
1ad20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1ad30 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d  ** Provide a dum
1ad40 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  my Tcl_InitStubs
1ad50 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
1ad60 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69   this as a stati
1ad70 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  c.** library..*/
1ad80 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c  .#ifndef USE_TCL
1ad90 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20  _STUBS.# undef  
1ada0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20  Tcl_InitStubs.# 
1adb0 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53  define Tcl_InitS
1adc0 74 75 62 73 28 61 2c 62 2c 63 29 20 54 43 4c 5f  tubs(a,b,c) TCL_
1add0 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a  VERSION.#endif..
1ade0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1adf0 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47  we have a PACKAG
1ae00 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20  E_VERSION macro 
1ae10 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77  defined.  This w
1ae20 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65  ill be.** define
1ae30 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1ae40 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66  by the TEA makef
1ae50 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20  ile.  But other 
1ae60 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20  makefiles.** do 
1ae70 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a  not define it..*
1ae80 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47  /.#ifndef PACKAG
1ae90 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69  E_VERSION.# defi
1aea0 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ne PACKAGE_VERSI
1aeb0 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  ON SQLITE_VERSIO
1aec0 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
1aed0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
1aee0 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  module..**.** Th
1aef0 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f  is Tcl module co
1af00 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69  ntains only a si
1af10 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d  ngle new Tcl com
1af20 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69  mand named "sqli
1af30 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74  te"..** (Hence t
1af40 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73  here is no names
1af50 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20  pace.  There is 
1af60 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e  no point in usin
1af70 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  g a namespace.**
1af80 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f   if the extensio
1af90 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20  n only supplies 
1afa0 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20  one new name!)  
1afb0 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
1afc0 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20  mand is.** used 
1afd0 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51  to open a new SQ
1afe0 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
1aff0 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29  See the DbMain()
1b000 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a   routine above.*
1b010 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
1b020 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
1b030 0a 2a 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d  .** The EXTERN m
1b040 61 63 72 6f 73 20 61 72 65 20 72 65 71 75 69 72  acros are requir
1b050 65 64 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64  ed by TCL in ord
1b060 65 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69  er to work on wi
1b070 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e  ndows..*/.EXTERN
1b080 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69   int Sqlite3_Ini
1b090 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1b0a0 74 65 72 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  terp){.  int rc 
1b0b0 3d 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  = Tcl_InitStubs(
1b0c0 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
1b0d0 29 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c  ) ? TCL_OK : TCL
1b0e0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1b0f0 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
1b100 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
1b110 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
1b120 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a  lite3", (Tcl_Obj
1b130 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
1b140 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
1b150 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
1b160 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20 54 68 65 20  ONLY.    /* The 
1b170 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69  "sqlite" alias i
1b180 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20  s undocumented. 
1b190 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79   It is here only
1b1a0 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 20 20   to support.    
1b1b0 2a 2a 20 6c 65 67 61 63 79 20 73 63 72 69 70 74  ** legacy script
1b1c0 73 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69  s.  All new scri
1b1d0 70 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f  pts should use o
1b1e0 6e 6c 79 20 74 68 65 20 22 73 71 6c 69 74 65 33  nly the "sqlite3
1b1f0 22 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  ".    ** command
1b200 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65  . */.    Tcl_Cre
1b210 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
1b220 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
1b230 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
1b240 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a  )DbMain, 0, 0);.
1b250 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
1b260 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
1b270 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
1b280 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
1b290 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
1b2a0 20 72 63 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e   rc;.}.EXTERN in
1b2b0 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69  t Tclsqlite3_Ini
1b2c0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1b2d0 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
1b2e0 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
1b2f0 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
1b300 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28   Sqlite3_Unload(
1b310 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b320 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
1b330 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
1b340 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
1b350 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63  qlite3_Unload(Tc
1b360 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b370 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
1b380 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a  turn TCL_OK; }..
1b390 2f 2a 20 42 65 63 61 75 73 65 20 69 74 20 61 63  /* Because it ac
1b3a0 63 65 73 73 65 73 20 74 68 65 20 66 69 6c 65 2d  cesses the file-
1b3b0 73 79 73 74 65 6d 20 61 6e 64 20 75 73 65 73 20  system and uses 
1b3c0 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65  persistent state
1b3d0 2c 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e  , SQLite.** is n
1b3e0 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 70  ot considered ap
1b3f0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73 61  propriate for sa
1b400 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 73 2e  fe interpreters.
1b410 20 20 48 65 6e 63 65 2c 20 77 65 20 63 61 75 73    Hence, we caus
1b420 65 0a 2a 2a 20 74 68 65 20 5f 53 61 66 65 49 6e  e.** the _SafeIn
1b430 69 74 28 29 20 69 6e 74 65 72 66 61 63 65 73 20  it() interfaces 
1b440 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b450 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20  ..*/.EXTERN int 
1b460 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74  Sqlite3_SafeInit
1b470 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1b480 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
1b490 5f 45 52 52 4f 52 3b 20 7d 0a 45 58 54 45 52 4e  _ERROR; }.EXTERN
1b4a0 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66   int Sqlite3_Saf
1b4b0 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  eUnload(Tcl_Inte
1b4c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1b4d0 66 6c 61 67 73 29 7b 72 65 74 75 72 6e 20 54 43  flags){return TC
1b4e0 4c 5f 45 52 52 4f 52 3b 7d 0a 0a 0a 0a 23 69 66  L_ERROR;}....#if
1b4f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55  ndef SQLITE_3_SU
1b500 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20 53 71  FFIX_ONLY.int Sq
1b510 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
1b520 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
1b530 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
1b540 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e  it(interp); }.in
1b550 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74  t Tclsqlite_Init
1b560 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1b570 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
1b580 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
1b590 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f  ); }.int Sqlite_
1b5a0 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
1b5b0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
1b5c0 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
1b5d0 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  L_OK; }.int Tcls
1b5e0 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c  qlite_Unload(Tcl
1b5f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b600 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
1b610 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65  urn TCL_OK; }.#e
1b620 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
1b630 68 65 20 54 43 4c 53 48 20 6d 61 63 72 6f 20 69  he TCLSH macro i
1b640 73 20 64 65 66 69 6e 65 64 2c 20 61 64 64 20 63  s defined, add c
1b650 6f 64 65 20 74 6f 20 6d 61 6b 65 20 61 20 73 74  ode to make a st
1b660 61 6e 64 2d 61 6c 6f 6e 65 20 70 72 6f 67 72 61  and-alone progra
1b670 6d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  m..*/.#if define
1b680 64 28 54 43 4c 53 48 29 0a 0a 2f 2a 20 54 68 69  d(TCLSH)../* Thi
1b690 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f  s is the main ro
1b6a0 75 74 69 6e 65 20 66 6f 72 20 61 6e 20 6f 72 64  utine for an ord
1b6b0 69 6e 61 72 79 20 54 43 4c 20 73 68 65 6c 6c 2e  inary TCL shell.
1b6c0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a    If there are.*
1b6d0 2a 20 61 72 65 20 61 72 67 75 6d 65 6e 74 73 2c  * are arguments,
1b6e0 20 72 75 6e 20 74 68 65 20 66 69 72 73 74 20 61   run the first a
1b6f0 72 67 75 6d 65 6e 74 20 61 73 20 61 20 73 63 72  rgument as a scr
1b700 69 70 74 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ipt.  Otherwise,
1b710 0a 2a 2a 20 72 65 61 64 20 54 43 4c 20 63 6f 6d  .** read TCL com
1b720 6d 61 6e 64 73 20 66 72 6f 6d 20 73 74 61 6e 64  mands from stand
1b730 61 72 64 20 69 6e 70 75 74 0a 2a 2f 0a 73 74 61  ard input.*/.sta
1b740 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1b750 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28  tclsh_main_loop(
1b760 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
1b770 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 69 6e  const char zMain
1b780 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20 22 69 66  loop[] =.    "if
1b790 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 76   {[llength $argv
1b7a0 5d 3e 3d 31 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ]>=1} {\n".     
1b7b0 20 22 73 65 74 20 61 72 67 76 30 20 5b 6c 69 6e   "set argv0 [lin
1b7c0 64 65 78 20 24 61 72 67 76 20 30 5d 5c 6e 22 0a  dex $argv 0]\n".
1b7d0 20 20 20 20 20 20 22 73 65 74 20 61 72 67 76 20        "set argv 
1b7e0 5b 6c 72 61 6e 67 65 20 24 61 72 67 76 20 31 20  [lrange $argv 1 
1b7f0 65 6e 64 5d 5c 6e 22 0a 20 20 20 20 20 20 22 73  end]\n".      "s
1b800 6f 75 72 63 65 20 24 61 72 67 76 30 5c 6e 22 0a  ource $argv0\n".
1b810 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1b820 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65  .      "set line
1b830 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20 22 77 68   {}\n".      "wh
1b840 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e  ile {![eof stdin
1b850 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  ]} {\n".        
1b860 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22  "if {$line!=\"\"
1b870 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  } {\n".         
1b880 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
1b890 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"> \"\n".    
1b8a0 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1b8b0 0a 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73  .          "puts
1b8c0 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20   -nonewline \"% 
1b8d0 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d  \"\n".        "}
1b8e0 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 66 6c 75  \n".        "flu
1b8f0 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20  sh stdout\n".   
1b900 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
1b910 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
1b920 22 0a 20 20 20 20 20 20 20 20 22 69 66 20 7b 5b  ".        "if {[
1b930 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c  info complete $l
1b940 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ine]} {\n".     
1b950 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68       "if {[catch
1b960 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69   {uplevel #0 $li
1b970 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e  ne} result]} {\n
1b980 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 70  ".            "p
1b990 75 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72  uts stderr \"Err
1b9a0 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22  or: $result\"\n"
1b9b0 0a 20 20 20 20 20 20 20 20 20 20 22 7d 20 65 6c  .          "} el
1b9c0 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
1b9d0 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
1b9e0 20 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73        "puts $res
1b9f0 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ult\n".         
1ba00 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20 20   "}\n".         
1ba10 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
1ba20 0a 20 20 20 20 20 20 20 20 22 7d 20 65 6c 73 65  .        "} else
1ba30 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20   {\n".          
1ba40 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e  "append line \\n
1ba50 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 5c 6e  \n".        "}\n
1ba60 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20  ".      "}\n".  
1ba70 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72 65    "}\n".  ;.  re
1ba80 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a  turn zMainloop;.
1ba90 7d 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48  }..#define TCLSH
1baa0 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20  _MAIN main   /* 
1bab0 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f  Needed to fake o
1bac0 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69  ut mktclapp */.i
1bad0 6e 74 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  nt SQLITE_CDECL 
1bae0 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61  TCLSH_MAIN(int a
1baf0 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
1bb00 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
1bb10 2a 69 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 69  *interp;.  int i
1bb20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1bb30 7a 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 63  zScript = 0;.  c
1bb40 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 23  har zArgc[32];.#
1bb50 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48  if defined(TCLSH
1bb60 5f 49 4e 49 54 5f 50 52 4f 43 29 0a 20 20 65 78  _INIT_PROC).  ex
1bb70 74 65 72 6e 20 63 6f 6e 73 74 20 63 68 61 72 20  tern const char 
1bb80 2a 54 43 4c 53 48 5f 49 4e 49 54 5f 50 52 4f 43  *TCLSH_INIT_PROC
1bb90 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23  (Tcl_Interp*);.#
1bba0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
1bbb0 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
1bbc0 20 20 69 66 28 20 67 65 74 65 6e 76 28 22 42 52    if( getenv("BR
1bbd0 45 41 4b 22 29 20 29 7b 0a 20 20 20 20 66 70 72  EAK") ){.    fpr
1bbe0 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
1bbf0 20 20 20 20 20 22 61 74 74 61 63 68 20 64 65 62       "attach deb
1bc00 75 67 67 65 72 20 74 6f 20 70 72 6f 63 65 73 73  ugger to process
1bc10 20 25 64 20 61 6e 64 20 70 72 65 73 73 20 61 6e   %d and press an
1bc20 79 20 6b 65 79 20 74 6f 20 63 6f 6e 74 69 6e 75  y key to continu
1bc30 65 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 47  e.\n",.        G
1bc40 45 54 50 49 44 28 29 29 3b 0a 20 20 20 20 66 67  ETPID());.    fg
1bc50 65 74 63 28 73 74 64 69 6e 29 3b 0a 20 20 7d 0a  etc(stdin);.  }.
1bc60 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 61 6c  #endif..  /* Cal
1bc70 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
1bc80 77 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65  wn() once before
1bc90 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
1bca0 65 6c 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f  else. This is to
1bcb0 0a 20 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20  .  ** test that 
1bcc0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1bcd0 28 29 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  () can be safely
1bce0 20 63 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f   called by a pro
1bcf0 63 65 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a  cess before.  **
1bd00 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1bd10 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73  ize() is. */.  s
1bd20 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1bd30 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  );..  Tcl_FindEx
1bd40 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
1bd50 29 3b 0a 20 20 54 63 6c 5f 53 65 74 53 79 73 74  );.  Tcl_SetSyst
1bd60 65 6d 45 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c  emEncoding(NULL,
1bd70 20 22 75 74 66 2d 38 22 29 3b 0a 20 20 69 6e 74   "utf-8");.  int
1bd80 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
1bd90 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69  Interp();.  Sqli
1bda0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
1bdb0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1bdc0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72  rintf(sizeof(zAr
1bdd0 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22  gc), zArgc, "%d"
1bde0 2c 20 61 72 67 63 2d 31 29 3b 0a 20 20 54 63 6c  , argc-1);.  Tcl
1bdf0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1be00 61 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43  argc", zArgc, TC
1be10 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1be20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1be30 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76  erp,"argv0",argv
1be40 5b 30 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  [0],TCL_GLOBAL_O
1be50 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  NLY);.  Tcl_SetV
1be60 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22  ar(interp,"argv"
1be70 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  , "", TCL_GLOBAL
1be80 5f 4f 4e 4c 59 29 3b 0a 20 20 66 6f 72 28 69 3d  _ONLY);.  for(i=
1be90 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
1bea0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1beb0 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20  interp, "argv", 
1bec0 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20  argv[i],.       
1bed0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1bee0 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d   | TCL_LIST_ELEM
1bef0 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44  ENT | TCL_APPEND
1bf00 5f 56 41 4c 55 45 29 3b 0a 20 20 7d 0a 23 69 66  _VALUE);.  }.#if
1bf10 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48 5f 49   defined(TCLSH_I
1bf20 4e 49 54 5f 50 52 4f 43 29 0a 20 20 7a 53 63 72  NIT_PROC).  zScr
1bf30 69 70 74 20 3d 20 54 43 4c 53 48 5f 49 4e 49 54  ipt = TCLSH_INIT
1bf40 5f 50 52 4f 43 28 69 6e 74 65 72 70 29 3b 0a 23  _PROC(interp);.#
1bf50 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 53 63 72  endif.  if( zScr
1bf60 69 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  ipt==0 ){.    zS
1bf70 63 72 69 70 74 20 3d 20 74 63 6c 73 68 5f 6d 61  cript = tclsh_ma
1bf80 69 6e 5f 6c 6f 6f 70 28 29 3b 0a 20 20 7d 0a 20  in_loop();.  }. 
1bf90 20 69 66 28 20 54 63 6c 5f 47 6c 6f 62 61 6c 45   if( Tcl_GlobalE
1bfa0 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 53 63 72  val(interp, zScr
1bfb0 69 70 74 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ipt)!=TCL_OK ){.
1bfc0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1bfd0 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56  zInfo = Tcl_GetV
1bfe0 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f  ar(interp, "erro
1bff0 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42  rInfo", TCL_GLOB
1c000 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  AL_ONLY);.    if
1c010 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e  ( zInfo==0 ) zIn
1c020 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  fo = Tcl_GetStri
1c030 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
1c040 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
1c050 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
1c060 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
1c070 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c080 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1c090 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20  #endif /* TCLSH 
1c0a0 2a 2f 0a                                         */.