/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 8370ce15f97277304e7a17c47e18d47c1a31701fcd213eded727d09c547da2fc:


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 20 20 20 20 22  ",             "
ea50: 62 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20 20  backup",        
ea60: 20 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a          "busy",.
ea70: 20 20 20 20 22 63 61 63 68 65 22 2c 20 20 20 20      "cache",    
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
ea90: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
eaa0: 20 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a         "close",.
eab0: 20 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20      "collate",  
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
ead0: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22  ollation_needed"
eae0: 2c 20 20 20 20 20 20 22 63 6f 6d 6d 69 74 5f 68  ,      "commit_h
eaf0: 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c  ook",.    "compl
eb00: 65 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ete",           
eb10: 20 20 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20      "copy",     
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 64 65               "de
eb30: 73 65 72 69 61 6c 69 7a 65 22 2c 0a 20 20 20 20  serialize",.    
eb40: 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  "enable_load_ext
eb50: 65 6e 73 69 6f 6e 22 2c 20 20 22 65 72 72 6f 72  ension",  "error
eb60: 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20  code",          
eb70: 20 20 20 22 65 76 61 6c 22 2c 0a 20 20 20 20 22     "eval",.    "
eb80: 65 78 69 73 74 73 22 2c 20 20 20 20 20 20 20 20  exists",        
eb90: 20 20 20 20 20 20 20 20 20 22 66 75 6e 63 74 69           "functi
eba0: 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  on",            
ebb0: 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 0a 20 20    "incrblob",.  
ebc0: 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 20 20    "interrupt",  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 22 6c 61 73              "las
ebe0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c  t_insert_rowid",
ebf0: 20 20 20 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22       "nullvalue"
ec00: 2c 0a 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e  ,.    "onecolumn
ec10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ec20: 22 70 72 65 75 70 64 61 74 65 22 2c 20 20 20 20  "preupdate",    
ec30: 20 20 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c           "profil
ec40: 65 22 2c 0a 20 20 20 20 22 70 72 6f 67 72 65 73  e",.    "progres
ec50: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
ec60: 20 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20    "rekey",      
ec70: 20 20 20 20 20 20 20 20 20 20 20 22 72 65 73 74             "rest
ec80: 6f 72 65 22 2c 0a 20 20 20 20 22 72 6f 6c 6c 62  ore",.    "rollb
ec90: 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20  ack_hook",      
eca0: 20 20 20 20 22 73 65 72 69 61 6c 69 7a 65 22 2c      "serialize",
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 74               "st
ecc0: 61 74 75 73 22 2c 0a 20 20 20 20 22 74 69 6d 65  atus",.    "time
ecd0: 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  out",           
ece0: 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e       "total_chan
ecf0: 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 22 74  ges",         "t
ed00: 72 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61 63  race",.    "trac
ed10: 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  e_v2",          
ed20: 20 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f       "transactio
ed30: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 75  n",           "u
ed40: 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 0a 20  nlock_notify",. 
ed50: 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22     "update_hook"
ed60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 76 65  ,            "ve
ed70: 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20  rsion",         
ed80: 20 20 20 20 20 20 22 77 61 6c 5f 68 6f 6f 6b 22        "wal_hook"
ed90: 2c 0a 20 20 20 20 30 20 20 20 20 20 20 20 20 20  ,.    0         
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
edb0: 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65    };.  enum DB_e
edc0: 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54  num {.    DB_AUT
edd0: 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20  HORIZER,        
ede0: 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20      DB_BACKUP,  
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
ee00: 42 55 53 59 2c 0a 20 20 20 20 44 42 5f 43 41 43  BUSY,.    DB_CAC
ee10: 48 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  HE,             
ee20: 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20      DB_CHANGES, 
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
ee40: 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f  CLOSE,.    DB_CO
ee50: 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20 20  LLATE,          
ee60: 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f       DB_COLLATIO
ee70: 4e 5f 4e 45 45 44 45 44 2c 20 20 20 20 20 44 42  N_NEEDED,     DB
ee80: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20  _COMMIT_HOOK,.  
ee90: 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20    DB_COMPLETE,  
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
eeb0: 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  OPY,            
eec0: 20 20 20 20 20 44 42 5f 44 45 53 45 52 49 41 4c       DB_DESERIAL
eed0: 49 5a 45 2c 0a 20 20 20 20 44 42 5f 45 4e 41 42  IZE,.    DB_ENAB
eee0: 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
eef0: 4e 2c 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c  N, DB_ERRORCODE,
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45              DB_E
ef10: 56 41 4c 2c 0a 20 20 20 20 44 42 5f 45 58 49 53  VAL,.    DB_EXIS
ef20: 54 53 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  TS,             
ef30: 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20     DB_FUNCTION, 
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 49              DB_I
ef50: 4e 43 52 42 4c 4f 42 2c 0a 20 20 20 20 44 42 5f  NCRBLOB,.    DB_
ef60: 49 4e 54 45 52 52 55 50 54 2c 20 20 20 20 20 20  INTERRUPT,      
ef70: 20 20 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49         DB_LAST_I
ef80: 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20 20 20 20  NSERT_ROWID,    
ef90: 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 0a 20 20  DB_NULLVALUE,.  
efa0: 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20    DB_ONECOLUMN, 
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 50              DB_P
efc0: 52 45 55 50 44 41 54 45 2c 20 20 20 20 20 20 20  REUPDATE,       
efd0: 20 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c       DB_PROFILE,
efe0: 0a 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53  .    DB_PROGRESS
eff0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44  ,              D
f000: 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20 20  B_REKEY,        
f010: 20 20 20 20 20 20 20 20 44 42 5f 52 45 53 54 4f          DB_RESTO
f020: 52 45 2c 0a 20 20 20 20 44 42 5f 52 4f 4c 4c 42  RE,.    DB_ROLLB
f030: 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20  ACK_HOOK,       
f040: 20 20 44 42 5f 53 45 52 49 41 4c 49 5a 45 2c 20    DB_SERIALIZE, 
f050: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 53 54             DB_ST
f060: 41 54 55 53 2c 0a 20 20 20 20 44 42 5f 54 49 4d  ATUS,.    DB_TIM
f070: 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20  EOUT,           
f080: 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41      DB_TOTAL_CHA
f090: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 44 42 5f  NGES,        DB_
f0a0: 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f 54 52  TRACE,.    DB_TR
f0b0: 41 43 45 5f 56 32 2c 20 20 20 20 20 20 20 20 20  ACE_V2,         
f0c0: 20 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54       DB_TRANSACT
f0d0: 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 44 42  ION,          DB
f0e0: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 0a  _UNLOCK_NOTIFY,.
f0f0: 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f      DB_UPDATE_HO
f100: 4f 4b 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  OK,           DB
f110: 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20  _VERSION,       
f120: 20 20 20 20 20 20 20 44 42 5f 57 41 4c 5f 48 4f         DB_WAL_HO
f130: 4f 4b 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e  OK.  };.  /* don
f140: 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e  't leave trailin
f150: 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65  g commas on DB_e
f160: 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73  num, it confuses
f170: 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d   the AIX xlc com
f180: 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  piler */..  if( 
f190: 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
f1a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f1b0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
f1c0: 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  "SUBCOMMAND ..."
f1d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f1e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
f1f0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
f200: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
f210: 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c  bjv[1], DB_strs,
f220: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63   "option", 0, &c
f230: 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65  hoice) ){.    re
f240: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f250: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28    }..  switch( (
f260: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f  enum DB_enum)cho
f270: 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20  ice ){..  /*    
f280: 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f  $db authorizer ?
f290: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
f2a0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
f2b0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f  iven callback to
f2c0: 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20   authorize each 
f2d0: 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  SQL operation as
f2e0: 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70   it is.  ** comp
f2f0: 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e  iled.  5 argumen
f300: 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20  ts are appended 
f310: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
f320: 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a  before it is.  *
f330: 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a  * invoked:.  **.
f340: 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61    **   (1) The a
f350: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
f360: 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52  e (ex: SQLITE_CR
f370: 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49  EATE_TABLE, SQLI
f380: 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a  TE_INSERT, ...).
f390: 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74    **   (2) First
f3a0: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
f3b0: 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75  e (depends on au
f3c0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
f3d0: 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63  ).  **   (3) Sec
f3e0: 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20  ond descriptive 
f3f0: 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20  name.  **   (4) 
f400: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
f410: 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  base (ex: "main"
f420: 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20  , "temp").  **  
f430: 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69   (5) Name of tri
f440: 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69  gger that is doi
f450: 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20  ng the access.  
f460: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
f470: 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75  back should retu
f480: 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  rn on of the fol
f490: 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20  lowing strings: 
f4a0: 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20  SQLITE_OK,.  ** 
f4b0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f  SQLITE_IGNORE, o
f4c0: 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20  r SQLITE_DENY.  
f4d0: 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
f4e0: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72   value is an err
f4f0: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  or..  **.  ** If
f500: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   this method is 
f510: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20  invoked with no 
f520: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63  arguments, the c
f530: 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61  urrent authoriza
f540: 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61  tion.  ** callba
f550: 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ck string is ret
f560: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  urned..  */.  ca
f570: 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52  se DB_AUTHORIZER
f580: 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
f590: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
f5a0: 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70  TION.    Tcl_App
f5b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f5c0: 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  , "authorization
f5d0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
f5e0: 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20  n this build",. 
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
f610: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f620: 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
f630: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
f640: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f650: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f660: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
f670: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f680: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f690: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
f6a0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
f6b0: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
f6c0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
f6d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
f6e0: 62 2d 3e 7a 41 75 74 68 2c 20 28 63 68 61 72 2a  b->zAuth, (char*
f6f0: 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
f700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
f710: 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20  ar *zAuth;.     
f720: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
f730: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
f740: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
f750: 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a  ee(pDb->zAuth);.
f760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41        }.      zA
f770: 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  uth = Tcl_GetStr
f780: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f790: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
f7a0: 20 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65   if( zAuth && le
f7b0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
f7c0: 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f  Db->zAuth = Tcl_
f7d0: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
f7e0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
f7f0: 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75  (pDb->zAuth, zAu
f800: 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  th, len+1);.    
f810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f820: 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b   pDb->zAuth = 0;
f830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f840: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
f850: 0a 20 20 20 20 20 20 20 20 74 79 70 65 64 65 66  .        typedef
f860: 20 69 6e 74 20 28 2a 73 71 6c 69 74 65 33 5f 61   int (*sqlite3_a
f870: 75 74 68 5f 63 62 29 28 0a 20 20 20 20 20 20 20  uth_cb)(.       
f880: 20 20 20 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f      void*,int,co
f890: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
f8a0: 63 68 61 72 2a 2c 0a 20 20 20 20 20 20 20 20 20  char*,.         
f8b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f    const char*,co
f8c0: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
f8d0: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
f8e0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
f8f0: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
f900: 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62  thorizer(pDb->db
f910: 2c 28 73 71 6c 69 74 65 33 5f 61 75 74 68 5f 63  ,(sqlite3_auth_c
f920: 62 29 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c  b)auth_callback,
f930: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
f940: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
f950: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
f960: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
f970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f980: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
f990: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
f9a0: 64 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42  db backup ?DATAB
f9b0: 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20  ASE? FILENAME.  
f9c0: 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20  **.  ** Open or 
f9d0: 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
f9e0: 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c  e file named FIL
f9f0: 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72  ENAME.  Transfer
fa00: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e   the.  ** conten
fa10: 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62  t of local datab
fa20: 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65  ase DATABASE (de
fa30: 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69  fault: "main") i
fa40: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c  nto the.  ** FIL
fa50: 45 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a  ENAME database..
fa60: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42    */.  case DB_B
fa70: 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e  ACKUP: {.    con
fa80: 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69  st char *zDestFi
fa90: 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
faa0: 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20  ar *zSrcDb;.    
fab0: 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a  sqlite3 *pDest;.
fac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
fad0: 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20  up *pBackup;..  
fae0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
faf0: 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20  .      zSrcDb = 
fb00: 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44  "main";.      zD
fb10: 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  estFile = Tcl_Ge
fb20: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
fb30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fb40: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
fb50: 20 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65   zSrcDb = Tcl_Ge
fb60: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
fb70: 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c  ;.      zDestFil
fb80: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
fb90: 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
fba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
fbb0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
fbc0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
fbd0: 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
fbe0: 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
fbf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fc00: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
fc10: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44  lite3_open_v2(zD
fc20: 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 2c  estFile, &pDest,
fc30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc40: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
fc50: 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
fc60: 50 45 4e 5f 43 52 45 41 54 45 7c 20 70 44 62 2d  PEN_CREATE| pDb-
fc70: 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a  >openFlags, 0);.
fc80: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
fc90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
fca0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
fcb0: 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20  interp, "cannot 
fcc0: 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61 74 61  open target data
fcd0: 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20  base: ",.       
fce0: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
fcf0: 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72  sg(pDest), (char
fd00: 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
fd10: 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
fd20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
fd30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fd40: 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
fd50: 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
fd60: 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c  t(pDest, "main",
fd70: 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62   pDb->db, zSrcDb
fd80: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
fd90: 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  up==0 ){.      T
fda0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
fdb0: 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20  interp, "backup 
fdc0: 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20  failed: ",.     
fdd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
fde0: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
fdf0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
fe00: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
fe10: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
fe20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fe30: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72  }.    while(  (r
fe40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
fe50: 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
fe60: 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
fe70: 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33   ){}.    sqlite3
fe80: 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
fe90: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
fea0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
feb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
fec0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
fed0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
fee0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fef0: 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a   "backup failed:
ff00: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
ff10: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
ff20: 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  est), (char*)0);
ff30: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
ff40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ff50: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
ff60: 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  Dest);.    break
ff70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
ff80: 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43  db busy ?CALLBAC
ff90: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
ffa0: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
ffb0: 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c  llback if an SQL
ffc0: 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d   statement attem
ffd0: 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  pts to open.  **
ffe0: 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61   a locked databa
fff0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
10000 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a  case DB_BUSY: {.
10010 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
10020 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
10030 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10040 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42   2, objv, "CALLB
10050 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
10060 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10070 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
10080 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
10090 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
100a0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
100b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
100c0 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 28 63 68   pDb->zBusy, (ch
100d0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
100e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
100f0 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20   char *zBusy;.  
10100 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
10110 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
10120 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
10130 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
10140 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10150 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74   zBusy = Tcl_Get
10160 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10170 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
10180 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26 26      if( zBusy &&
10190 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
101a0 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54    pDb->zBusy = T
101b0 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
101c0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
101d0 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20  cpy(pDb->zBusy, 
101e0 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20  zBusy, len+1);. 
101f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10200 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
10210 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
10220 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
10230 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
10240 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
10250 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10260 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
10270 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61  Db->db, DbBusyHa
10280 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
10290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
102a0 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
102b0 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
102c0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
102d0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
102e0 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
102f0 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20  b cache flush.  
10300 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65  **     $db cache
10310 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a   size n.  **.  *
10320 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65 70  * Flush the prep
10330 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63  ared statement c
10340 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68 65  ache, or set the
10350 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
10360 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20 73  of.  ** cached s
10370 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
10380 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45 3a    case DB_CACHE:
10390 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75 62   {.    char *sub
103a0 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  Cmd;.    int n;.
103b0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32  .    if( objc<=2
103c0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
103d0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
103e0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63  p, 1, objv, "cac
103f0 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22  he option ?arg?"
10400 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10410 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10420 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54 63  .    subCmd = Tc
10430 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10440 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29  bj( objv[2], 0 )
10450 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43 6d  ;.    if( *subCm
10460 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d 70  d=='f' && strcmp
10470 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22 29  (subCmd,"flush")
10480 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
10490 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
104a0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
104b0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
104c0 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a  objv, "flush");.
104d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
104e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
104f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
10500 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
10510 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Db );.      }.  
10520 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75 62    }else if( *sub
10530 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72 63  Cmd=='s' && strc
10540 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65 22  mp(subCmd,"size"
10550 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
10560 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
10570 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10580 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10590 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29   objv, "size n")
105a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
105b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
105c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
105d0 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d   if( TCL_ERROR==
105e0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
105f0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
10600 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  ], &n) ){.      
10610 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10620 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 63  sult( interp, "c
10630 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22  annot convert \"
10640 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10650 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
10660 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30  romObj(objv[3],0
10670 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65  ), "\" to intege
10680 72 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  r", (char*)0);. 
10690 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
106a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
106b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
106c0 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20      if( n<0 ){. 
106d0 20 20 20 20 20 20 20 20 20 20 20 66 6c 75 73 68             flush
106e0 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
106f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  ;.            n 
10700 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
10710 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50  else if( n>MAX_P
10720 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b  REPARED_STMTS ){
10730 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
10740 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54   MAX_PREPARED_ST
10750 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MTS;.          }
10760 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
10770 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20  maxStmt = n;.   
10780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
107a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
107b0 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f  ( interp, "bad o
107c0 70 74 69 6f 6e 20 5c 22 22 2c 0a 20 20 20 20 20  ption \"",.     
107d0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
107e0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
107f0 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20  ],0), "\": must 
10800 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65  be flush or size
10810 22 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68  ",.          (ch
10820 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
10830 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10840 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
10850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24  .  }..  /*     $
10860 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a  db changes.  **.
10870 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
10880 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
10890 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65  hat were modifie
108a0 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20  d, inserted, or 
108b0 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20  deleted by.  ** 
108c0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
108d0 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
108e0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
108f0 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  nt, not includin
10900 67 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67  g.  ** any chang
10910 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  es made by trigg
10920 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a  er programs..  *
10930 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e  /.  case DB_CHAN
10940 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
10950 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
10960 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10970 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10980 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10990 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
109a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
109b0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
109c0 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
109d0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
109e0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
109f0 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
10a00 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
10a10 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
10a20 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
10a30 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a   $db close.  **.
10a40 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68    ** Shutdown th
10a50 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
10a60 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a    case DB_CLOSE:
10a70 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74   {.    Tcl_Delet
10a80 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
10a90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10aa0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10ab0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
10ac0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10ad0 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41    $db collate NA
10ae0 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
10af0 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
10b00 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
10b10 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
10b20 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
10b30 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
10b40 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
10b50 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
10b60 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
10b70 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
10b80 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   DB_COLLATE: {. 
10b90 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
10ba0 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61  Collate;.    cha
10bb0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
10bc0 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
10bd0 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
10be0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
10bf0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
10c00 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10c10 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
10c20 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
10c30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10c40 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
10c50 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
10c60 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
10c70 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
10c80 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
10c90 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
10ca0 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
10cb0 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43  pCollate = (SqlC
10cc0 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f  ollate*)Tcl_Allo
10cd0 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c  c( sizeof(*pColl
10ce0 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  ate) + nScript +
10cf0 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
10d00 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75  ollate==0 ) retu
10d10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10d20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65    pCollate->inte
10d30 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
10d40 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
10d50 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
10d60 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
10d70 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
10d80 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20  )&pCollate[1];. 
10d90 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
10da0 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   = pCollate;.   
10db0 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65   memcpy(pCollate
10dc0 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69  ->zScript, zScri
10dd0 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a  pt, nScript+1);.
10de0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
10df0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
10e00 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
10e10 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
10e20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20        pCollate, 
10e30 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29  tclSqlCollate) )
10e40 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  {.      Tcl_SetR
10e50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
10e60 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
10e70 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
10e80 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
10e90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10ea0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10eb0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10ec0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
10ed0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53  llation_needed S
10ee0 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
10ef0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
10f00 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
10f10 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
10f20 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20    Whenever.  ** 
10f30 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
10f40 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
10f50 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
10f60 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
10f70 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
10f80 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  COLLATION_NEEDED
10f90 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
10fa0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
10fb0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10fc0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
10fd0 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
10fe0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11000 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
11010 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ded ){.      Tcl
11020 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
11030 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
11040 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  d);.    }.    pD
11050 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
11060 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  d = Tcl_Duplicat
11070 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  eObj(objv[2]);. 
11080 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
11090 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  unt(pDb->pCollat
110a0 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71  eNeeded);.    sq
110b0 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
110c0 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20  needed(pDb->db, 
110d0 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e  pDb, tclCollateN
110e0 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61  eeded);.    brea
110f0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
11100 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20  $db commit_hook 
11110 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
11120 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
11130 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a  given callback j
11140 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ust before commi
11150 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20  tting every SQL 
11160 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
11170 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63  * If the callbac
11180 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  k throws an exce
11190 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73  ption or returns
111a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
111b0 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  the.  ** transac
111c0 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e  tion is aborted.
111d0 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73    If CALLBACK is
111e0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
111f0 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20  , the callback. 
11200 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e   ** is disabled.
11210 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11220 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20  COMMIT_HOOK: {. 
11230 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
11240 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11250 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11260 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
11270 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
11280 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11290 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
112a0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
112b0 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
112c0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
112d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
112e0 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  rp, pDb->zCommit
112f0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
11300 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
11310 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
11320 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20   *zCommit;.     
11330 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
11340 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
11350 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
11360 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  Free(pDb->zCommi
11370 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
11380 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f    zCommit = Tcl_
11390 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
113a0 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
113b0 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  .      if( zComm
113c0 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  it && len>0 ){. 
113d0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
113e0 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  mit = Tcl_Alloc(
113f0 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
11400 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
11410 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74  zCommit, zCommit
11420 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
11430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
11440 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b  Db->zCommit = 0;
11450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11460 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
11470 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
11480 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
11490 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
114a0 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62  _commit_hook(pDb
114b0 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61  ->db, DbCommitHa
114c0 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
114d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
114e0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
114f0 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30  _hook(pDb->db, 0
11500 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
11510 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
11520 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
11530 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a  complete SQL.  *
11540 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52  *.  ** Return TR
11550 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63  UE if SQL is a c
11560 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74  omplete SQL stat
11570 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46  ement.  Return F
11580 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64  ALSE if.  ** add
11590 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66  itional lines of
115a0 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65   input are neede
115b0 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  d.  This is simi
115c0 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  lar to the.  ** 
115d0 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63  built-in "info c
115e0 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64  omplete" command
115f0 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20   of Tcl..  */.  
11600 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45  case DB_COMPLETE
11610 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
11620 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
11630 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
11640 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69  esult;.    int i
11650 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69  sComplete;.    i
11660 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
11670 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
11680 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
11690 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20  objv, "SQL");.  
116a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
116b0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
116c0 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c  isComplete = sql
116d0 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54  ite3_complete( T
116e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
116f0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20  Obj(objv[2], 0) 
11700 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
11710 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
11720 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
11730 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_SetBooleanObj
11740 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70  (pResult, isComp
11750 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  lete);.#endif.  
11760 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11770 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63  /*    $db copy c
11780 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
11790 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65  m table filename
117a0 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55   ?SEPARATOR? ?NU
117b0 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a  LLINDICATOR?.  *
117c0 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61  *.  ** Copy data
117d0 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d   into table from
117e0 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f   filename, optio
117f0 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41  nally using SEPA
11800 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f  RATOR.  ** as co
11810 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e  lumn separators.
11820 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f    If a column co
11830 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74  ntains a null st
11840 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a  ring, or the.  *
11850 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49  * value of NULLI
11860 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c  NDICATOR, a NULL
11870 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72   is inserted for
11880 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a   the column..  *
11890 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  * conflict-algor
118a0 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74  ithm is one of t
118b0 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69  he sqlite confli
118c0 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20  ct algorithms:. 
118d0 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c   **    rollback,
118e0 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67   abort, fail, ig
118f0 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20  nore, replace.  
11900 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
11910 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
11920 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
11930 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61  sed, not necessa
11940 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61  rily same.  ** a
11950 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64  s 'db changes' d
11960 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61  ue to conflict-a
11970 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65  lgorithm selecte
11980 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
11990 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61  s code is basica
119a0 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  lly an implement
119b0 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e  ation/enhancemen
119c0 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
119d0 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e  lite3 shell.c ".
119e0 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e  import" command.
119f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
11a00 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73  command usage is
11a10 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
11a20 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50  he sqlite2.x COP
11a30 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a  Y statement,.  *
11a40 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20  * which imports 
11a50 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61  file data into a
11a60 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65   table using the
11a70 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59   PostgreSQL COPY
11a80 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20   file format:.  
11a90 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63  **   $db copy $c
11aa0 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62  onflit_algo $tab
11ab0 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d  le_name $filenam
11ac0 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20  e \t \\N.  */.  
11ad0 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a  case DB_COPY: {.
11ae0 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65      char *zTable
11af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11b00 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
11b10 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a  nto this table *
11b20 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c  /.    char *zFil
11b30 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11b40 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
11b50 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72  om which to extr
11b60 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  act data */.    
11b70 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b  char *zConflict;
11b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11b90 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  he conflict algo
11ba0 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  rithm to use */.
11bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
11bc0 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
11bd0 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a  /* A statement *
11be0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
11c10 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
11c20 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
11c30 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
11c40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11c50 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20   of bytes in an 
11c60 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  SQL string */.  
11c70 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c90 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
11ca0 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20  /.    int nSep; 
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
11cd0 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a  ytes in zSep[] *
11ce0 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b  /.    int nNull;
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
11d10 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20  ytes in zNull[] 
11d20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
11d30 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11d40 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61     /* An SQL sta
11d50 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68  tement */.    ch
11d60 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20  ar *zLine;      
11d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
11d80 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e  ingle line of in
11d90 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  put from the fil
11da0 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a  e */.    char **
11db0 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  azCol;          
11dc0 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20       /* zLine[] 
11dd0 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63  broken up into c
11de0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 6f  olumns */.    co
11df0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69  nst char *zCommi
11e00 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  t;        /* How
11e10 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67   to commit chang
11e20 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a  es */.    FILE *
11e30 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
11e40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70        /* The inp
11e50 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  ut file */.    i
11e60 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20  nt lineno = 0;  
11e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
11e80 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70  ne number of inp
11e90 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  ut file */.    c
11ea0 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d  har zLineNum[80]
11eb0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ;          /* Li
11ec0 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20  ne number print 
11ed0 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63  buffer */.    Tc
11ee0 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20  l_Obj *pResult; 
11ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74            /* int
11f00 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20  erp result */.. 
11f10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11f20 53 65 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Sep;.    const c
11f30 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20  har *zNull;.    
11f40 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62  if( objc<5 || ob
11f50 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>7 ){.      Tc
11f60 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
11f70 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 0a  nterp, 2, objv,.
11f80 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49           "CONFLI
11f90 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42  CT-ALGORITHM TAB
11fa0 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50  LE FILENAME ?SEP
11fb0 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44  ARATOR? ?NULLIND
11fc0 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20  ICATOR?");.     
11fd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11fe0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
11ff0 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20   objc>=6 ){.    
12000 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74    zSep = Tcl_Get
12010 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
12020 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[5], 0);.    }
12030 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70  else{.      zSep
12040 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20   = "\t";.    }. 
12050 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29     if( objc>=7 )
12060 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20  {.      zNull = 
12070 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12080 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29  mObj(objv[6], 0)
12090 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
120a0 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20     zNull = "";. 
120b0 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69     }.    zConfli
120c0 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ct = Tcl_GetStri
120d0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
120e0 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c  ], 0);.    zTabl
120f0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
12100 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
12110 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  , 0);.    zFile 
12120 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
12130 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20  romObj(objv[4], 
12140 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73  0);.    nSep = s
12150 74 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a 20  trlen30(zSep);. 
12160 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65     nNull = strle
12170 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20  n30(zNull);.    
12180 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
12190 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
121a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
121b0 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65  ror: non-null se
121c0 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64  parator required
121d0 20 66 6f 72 20 63 6f 70 79 22 2c 0a 20 20 20 20   for copy",.    
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
12200 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12210 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12220 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c  if(strcmp(zConfl
12230 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29  ict, "rollback")
12240 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
12250 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
12260 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d  , "abort"   ) !=
12270 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
12280 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
12290 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20  fail"    ) != 0 
122a0 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
122b0 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e  (zConflict, "ign
122c0 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a  ore"  ) != 0 &&.
122d0 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
122e0 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63  onflict, "replac
122f0 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20  e" ) != 0 ) {.  
12300 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12310 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
12320 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c  ror: \"", zConfl
12330 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ict,.           
12340 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61   "\", conflict-a
12350 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65  lgorithm must be
12360 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63   one of: rollbac
12370 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  k, ".           
12380 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69   "abort, fail, i
12390 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63  gnore, or replac
123a0 65 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  e", (char*)0);. 
123b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
123c0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
123d0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
123e0 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
123f0 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54  * FROM '%q'", zT
12400 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  able);.    if( z
12410 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
12420 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
12430 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
12440 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20   no such table: 
12450 22 2c 20 7a 54 61 62 6c 65 2c 20 28 63 68 61 72  ", zTable, (char
12460 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
12470 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12480 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
12490 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
124a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
124b0 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
124c0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
124d0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
124e0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
124f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12500 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12510 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
12520 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
12530 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
12540 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
12550 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
12560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f  }else{.      nCo
12570 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
12580 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
12590 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
125a0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
125b0 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c  t);.    if( nCol
125c0 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65  ==0 ) {.      re
125d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
125e0 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
125f0 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b   malloc( nByte +
12600 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a   50 + nCol*2 );.
12610 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
12620 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
12630 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12640 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74  p, "Error: can't
12650 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28 63 68 61   malloc()", (cha
12660 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
12670 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12680 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12690 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b  _snprintf(nByte+
126a0 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52  50, zSql, "INSER
126b0 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71  T OR %q INTO '%q
126c0 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20  ' VALUES(?",.   
126d0 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c        zConflict,
126e0 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20   zTable);.    j 
126f0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29  = strlen30(zSql)
12700 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
12710 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
12720 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
12730 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  ,';.      zSql[j
12740 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d  ++] = '?';.    }
12750 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d  .    zSql[j++] =
12760 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a   ')';.    zSql[j
12770 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  ] = 0;.    rc = 
12780 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
12790 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  pDb->db, zSql, -
127a0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
127b0 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20     free(zSql);. 
127c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
127d0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
127e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
127f0 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
12800 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
12810 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
12820 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
12830 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
12840 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
12860 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72   fopen(zFile, "r
12870 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  b");.    if( in=
12880 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
12890 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
128a0 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
128b0 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22  not open file: "
128c0 2c 20 7a 46 69 6c 65 2c 20 28 63 68 61 72 2a 29  , zFile, (char*)
128d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
128e0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
128f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12900 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
12910 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c  .    azCol = mal
12920 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f  loc( sizeof(azCo
12930 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29  l[0])*(nCol+1) )
12940 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d  ;.    if( azCol=
12950 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
12960 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12970 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
12980 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28  n't malloc()", (
12990 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
129a0 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
129b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
129c0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76  OR;.    }.    (v
129d0 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
129e0 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e  (pDb->db, "BEGIN
129f0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
12a00 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d   zCommit = "COMM
12a10 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  IT";.    while( 
12a20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67  (zLine = local_g
12a30 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d  etline(0, in))!=
12a40 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
12a50 2a 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f  *z;.      lineno
12a60 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b  ++;.      azCol[
12a70 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20  0] = zLine;.    
12a80 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69    for(i=0, z=zLi
12a90 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  ne; *z; z++){.  
12aa0 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53        if( *z==zS
12ab0 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70  ep[0] && strncmp
12ac0 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d  (z, zSep, nSep)=
12ad0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12ae0 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
12af0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
12b00 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20   if( i<nCol ){. 
12b10 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c             azCol
12b20 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a  [i] = &z[nSep];.
12b30 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d              z +=
12b40 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20   nSep-1;.       
12b50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12b70 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20   i+1!=nCol ){.  
12b80 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
12b90 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45  ;.        int nE
12ba0 72 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46  rr = strlen30(zF
12bb0 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20  ile) + 200;.    
12bc0 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f      zErr = mallo
12bd0 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20  c(nErr);.       
12be0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
12bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
12c00 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45  nprintf(nErr, zE
12c10 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
12c20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65   "Error: %s line
12c30 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64   %d: expected %d
12c40 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
12c50 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a   but found %d",.
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
12c70 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c  le, lineno, nCol
12c80 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
12c90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12ca0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
12cb0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
12cc0 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29        free(zErr)
12cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12ce0 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
12cf0 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
12d00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
12d10 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
12d20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
12d30 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66        /* check f
12d40 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66  or null data, if
12d50 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c   so, bind as nul
12d60 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  l */.        if(
12d70 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72   (nNull>0 && str
12d80 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e  cmp(azCol[i], zN
12d90 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  ull)==0).       
12da0 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28 61     || strlen30(a
12db0 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 0a 20 20 20 20  zCol[i])==0.    
12dc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
12dd0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
12de0 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a  ll(pStmt, i+1);.
12df0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12e00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12e10 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
12e20 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  , i+1, azCol[i],
12e30 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
12e40 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
12e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12e60 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
12e70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12e80 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
12e90 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c  );.      free(zL
12ea0 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
12eb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12ec0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
12ed0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12ee0 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69  ,"Error: ", sqli
12ef0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
12f00 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
12f10 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
12f20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
12f30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12f40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
12f50 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
12f60 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
12f70 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
12f80 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f  (pStmt);.    (vo
12f90 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
12fa0 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74  pDb->db, zCommit
12fb0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  , 0, 0, 0);..   
12fc0 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20   if( zCommit[0] 
12fd0 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20  == 'C' ){.      
12fe0 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20  /* success, set 
12ff0 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72  result as number
13000 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
13010 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  sed */.      pRe
13020 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
13030 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
13040 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  .      Tcl_SetIn
13050 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69  tObj(pResult, li
13060 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  neno);.      rc 
13070 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
13080 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61  lse{.      /* fa
13090 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69  ilure, append li
130a0 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65  neno where faile
130b0 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
130c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
130d0 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c  of(zLineNum), zL
130e0 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65  ineNum,"%d",line
130f0 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  no);.      Tcl_A
13100 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13110 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69  rp,", failed whi
13120 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69  le processing li
13130 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 0a  ne: ",zLineNum,.
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
13160 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
13170 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13180 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
13190 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
131a0 64 65 73 65 72 69 61 6c 69 7a 65 20 3f 44 41 54  deserialize ?DAT
131b0 41 42 41 53 45 3f 20 56 41 4c 55 45 0a 20 20 2a  ABASE? VALUE.  *
131c0 2a 0a 20 20 2a 2a 20 52 65 6f 70 65 6e 20 44 41  *.  ** Reopen DA
131d0 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 20  TABASE (default 
131e0 22 6d 61 69 6e 22 29 20 75 73 69 6e 67 20 74 68  "main") using th
131f0 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 24 56 41  e content in $VA
13200 4c 55 45 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  LUE.  */.  case 
13210 44 42 5f 44 45 53 45 52 49 41 4c 49 5a 45 3a 20  DB_DESERIALIZE: 
13220 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
13230 5f 45 4e 41 42 4c 45 5f 4d 45 4d 44 42 0a 20 20  _ENABLE_MEMDB.  
13240 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13250 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 45 4d 44  lt(interp, "MEMD
13260 42 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  B not available 
13270 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 0a  in this build",.
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
132a0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
132b0 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f  OR;.#else.    co
132c0 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
132d0 61 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  a;.    Tcl_Obj *
132e0 70 56 61 6c 75 65 3b 0a 20 20 20 20 75 6e 73 69  pValue;.    unsi
132f0 67 6e 65 64 20 63 68 61 72 20 2a 70 42 41 3b 0a  gned char *pBA;.
13300 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
13310 72 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 69 6e  r *pData;.    in
13320 74 20 6c 65 6e 2c 20 78 72 63 3b 0a 20 20 20 20  t len, xrc;.    
13330 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
13340 20 29 7b 0a 20 20 20 20 20 20 7a 53 63 68 65 6d   ){.      zSchem
13350 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 56 61  a = 0;.      pVa
13360 6c 75 65 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  lue = objv[2];. 
13370 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
13380 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 53  c==4 ){.      zS
13390 63 68 65 6d 61 20 3d 20 54 63 6c 5f 47 65 74 53  chema = Tcl_GetS
133a0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
133b0 20 20 20 20 20 20 70 56 61 6c 75 65 20 3d 20 6f        pValue = o
133c0 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73  bjv[3];.    }els
133d0 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
133e0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
133f0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54  , 2, objv, "?DAT
13400 41 42 41 53 45 3f 20 56 41 4c 55 45 22 29 3b 0a  ABASE? VALUE");.
13410 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
13420 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
13430 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 41  k;.    }.    pBA
13440 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
13450 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 6c 75  rayFromObj(pValu
13460 65 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 70 44  e, &len);.    pD
13470 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
13480 6c 6c 6f 63 36 34 28 20 6c 65 6e 20 29 3b 0a 20  lloc64( len );. 
13490 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20     if( pData==0 
134a0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
134b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
134c0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
134d0 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
134e0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
134f0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
13500 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74       memcpy(pDat
13510 61 2c 20 70 42 41 2c 20 6c 65 6e 29 3b 0a 20 20  a, pBA, len);.  
13520 20 20 20 20 78 72 63 20 3d 20 73 71 6c 69 74 65      xrc = sqlite
13530 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 70 44  3_deserialize(pD
13540 62 2d 3e 64 62 2c 20 7a 53 63 68 65 6d 61 2c 20  b->db, zSchema, 
13550 70 44 61 74 61 2c 20 6c 65 6e 2c 20 6c 65 6e 2c  pData, len, len,
13560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13570 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c   SQLITE_DESERIAL
13580 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45 20  IZE_FREEONCLOSE 
13590 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
135a0 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41    SQLITE_DESERIA
135b0 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45 29  LIZE_RESIZEABLE)
135c0 3b 0a 20 20 20 20 20 20 69 66 28 20 78 72 63 20  ;.      if( xrc 
135d0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
135e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
135f0 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
13600 65 74 20 4d 45 4d 44 42 20 63 6f 6e 74 65 6e 74  et MEMDB content
13610 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
13620 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
13630 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
13640 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
13650 72 65 61 6b 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a  reak; .  }..  /*
13660 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e 61  .  **    $db ena
13670 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
13680 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a  on BOOLEAN.  **.
13690 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65 78    ** Turn the ex
136a0 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
136b0 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66  feature on or of
136c0 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62 79  f.  It if off by
136d0 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20  .  ** default.. 
136e0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 4e   */.  case DB_EN
136f0 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
13700 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  ION: {.#ifndef S
13710 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
13720 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e  EXTENSION.    in
13730 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28  t onoff;.    if(
13740 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
13750 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
13760 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
13770 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a  jv, "BOOLEAN");.
13780 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13790 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
137a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
137b0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
137c0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
137d0 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  off) ){.      re
137e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
137f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13800 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
13810 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  tension(pDb->db,
13820 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65   onoff);.    bre
13830 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54 63  ak;.#else.    Tc
13840 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13850 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69 6f  nterp, "extensio
13860 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75 72  n loading is tur
13870 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70 69  ned off at compi
13880 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20 20  le-time",.      
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
138a0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
138b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
138c0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
138d0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72  .  **    $db err
138e0 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a  orcode.  **.  **
138f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65   Return the nume
13900 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74  ric error code t
13910 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64  hat was returned
13920 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
13930 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f  ent.  ** call to
13940 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
13950 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13960 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20  ERRORCODE: {.   
13970 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
13980 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
13990 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
139a0 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
139b0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
139c0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
139d0 20 24 64 62 20 65 78 69 73 74 73 20 24 73 71 6c   $db exists $sql
139e0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65  .  **    $db one
139f0 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a  column $sql.  **
13a00 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c  .  ** The onecol
13a10 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68  umn method is th
13a20 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a  e equivalent of:
13a30 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78  .  **     lindex
13a40 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d   [$db eval $sql]
13a50 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44   0.  */.  case D
13a60 42 5f 45 58 49 53 54 53 3a 0a 20 20 63 61 73 65  B_EXISTS:.  case
13a70 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b   DB_ONECOLUMN: {
13a80 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
13a90 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 44  esult = 0;.    D
13aa0 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
13ab0 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  al;.    if( objc
13ac0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
13ad0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13ae0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
13af0 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74  SQL");.      ret
13b00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13b10 20 20 20 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c     }..    dbEval
13b20 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62  Init(&sEval, pDb
13b30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 2c 20 30 29  , objv[2], 0, 0)
13b40 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 45 76 61  ;.    rc = dbEva
13b50 6c 53 74 65 70 28 26 73 45 76 61 6c 29 3b 0a 20  lStep(&sEval);. 
13b60 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
13b70 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20  B_ONECOLUMN ){. 
13b80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
13b90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
13ba0 52 65 73 75 6c 74 20 3d 20 64 62 45 76 61 6c 43  Result = dbEvalC
13bb0 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61  olumnValue(&sEva
13bc0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 0);.      }el
13bd0 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42  se if( rc==TCL_B
13be0 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  REAK ){.        
13bf0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
13c00 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 7d  interp);.      }
13c10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
13c20 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 7c 7c 20  c==TCL_BREAK || 
13c30 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
13c40 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
13c50 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
13c60 72 63 3d 3d 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20  rc==TCL_OK);.   
13c70 20 7d 0a 20 20 20 20 64 62 45 76 61 6c 46 69 6e   }.    dbEvalFin
13c80 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20  alize(&sEval);. 
13c90 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 20 29     if( pResult )
13ca0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
13cb0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c  t(interp, pResul
13cc0 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  t);..    if( rc=
13cd0 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
13ce0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
13cf0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
13d00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
13d10 20 20 20 20 24 64 62 20 65 76 61 6c 20 3f 6f 70      $db eval ?op
13d20 74 69 6f 6e 73 3f 20 24 73 71 6c 20 3f 61 72 72  tions? $sql ?arr
13d30 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e  ay? ?{  ...code.
13d40 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .. }?.  **.  ** 
13d50 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  The SQL statemen
13d60 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61  t in $sql is eva
13d70 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63  luated.  For eac
13d80 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65  h row, the value
13d90 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65  s are.  ** place
13da0 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66  d in elements of
13db0 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64   the array named
13dc0 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e   "array" and ...
13dd0 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75  code... is execu
13de0 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72  ted..  ** If "ar
13df0 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20  ray" and "code" 
13e00 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65  are omitted, the
13e10 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73  n no callback is
13e20 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a   every invoked..
13e30 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20    ** If "array" 
13e40 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  is an empty stri
13e50 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ng, then the val
13e60 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69  ues are placed i
13e70 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  n variables.  **
13e80 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73   that have the s
13e90 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
13ea0 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64  fields extracted
13eb0 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20   by the query.. 
13ec0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 56   */.  case DB_EV
13ed0 41 4c 3a 20 7b 0a 20 20 20 20 69 6e 74 20 65 76  AL: {.    int ev
13ee0 61 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  alFlags = 0;.   
13ef0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
13f00 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6f 62  t;.    while( ob
13f10 6a 63 3e 33 20 26 26 20 28 7a 4f 70 74 20 3d 20  jc>3 && (zOpt = 
13f20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13f30 6a 76 5b 32 5d 29 29 21 3d 30 20 26 26 20 7a 4f  jv[2]))!=0 && zO
13f40 70 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  pt[0]=='-' ){.  
13f50 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
13f60 4f 70 74 2c 20 22 2d 77 69 74 68 6f 75 74 6e 75  Opt, "-withoutnu
13f70 6c 6c 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lls")==0 ){.    
13f80 20 20 20 20 65 76 61 6c 46 6c 61 67 73 20 7c 3d      evalFlags |=
13f90 20 53 51 4c 49 54 45 5f 45 56 41 4c 5f 57 49 54   SQLITE_EVAL_WIT
13fa0 48 4f 55 54 4e 55 4c 4c 53 3b 0a 20 20 20 20 20  HOUTNULLS;.     
13fb0 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20   }.      else{. 
13fc0 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
13fd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13fe0 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
13ff0 20 5c 22 22 2c 20 7a 4f 70 74 2c 20 22 5c 22 22   \"", zOpt, "\""
14000 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20  , (void*)0);.   
14010 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14020 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
14030 20 20 20 20 20 6f 62 6a 63 2d 2d 3b 0a 20 20 20       objc--;.   
14040 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20 20 20 7d     objv++;.    }
14050 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20  .    if( objc<3 
14060 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20  || objc>5 ){.   
14070 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
14080 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
14090 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bjv, .          
140a0 22 3f 4f 50 54 49 4f 4e 53 3f 20 53 51 4c 20 3f  "?OPTIONS? SQL ?
140b0 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52  ARRAY-NAME? ?SCR
140c0 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  IPT?");.      re
140d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
140e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f      }..    if( o
140f0 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
14100 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45  DbEvalContext sE
14110 76 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  val;.      Tcl_O
14120 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e  bj *pRet = Tcl_N
14130 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
14140 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
14150 70 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62 45  pRet);.      dbE
14160 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20  valInit(&sEval, 
14170 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 2c  pDb, objv[2], 0,
14180 20 30 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65   0);.      while
14190 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20  ( TCL_OK==(rc = 
141a0 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76 61  dbEvalStep(&sEva
141b0 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  l)) ){.        i
141c0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt i;.        in
141d0 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
141e0 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26 73  dbEvalRowInfo(&s
141f0 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b  Eval, &nCol, 0);
14200 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
14210 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
14220 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69            Tcl_Li
14230 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14240 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
14250 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
14260 75 65 28 26 73 45 76 61 6c 2c 20 69 29 29 3b 0a  ue(&sEval, i));.
14270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14280 7d 0a 20 20 20 20 20 20 64 62 45 76 61 6c 46 69  }.      dbEvalFi
14290 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a  nalize(&sEval);.
142a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
142b0 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
142c0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
142d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
142e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
142f0 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  TCL_OK;.      }.
14300 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
14310 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
14320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 43    }else{.      C
14330 6c 69 65 6e 74 44 61 74 61 20 63 64 32 5b 32 5d  lientData cd2[2]
14340 3b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f  ;.      DbEvalCo
14350 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20 20 20 20  ntext *p;.      
14360 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20  Tcl_Obj *pArray 
14370 3d 20 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  = 0;.      Tcl_O
14380 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 0a 20 20  bj *pScript;..  
14390 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20      if( objc>=5 
143a0 26 26 20 2a 28 63 68 61 72 20 2a 29 54 63 6c 5f  && *(char *)Tcl_
143b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
143c0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  ]) ){.        pA
143d0 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  rray = objv[3];.
143e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
143f0 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a  cript = objv[obj
14400 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f  c-1];.      Tcl_
14410 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
14420 72 69 70 74 29 3b 0a 0a 20 20 20 20 20 20 70 20  ript);..      p 
14430 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  = (DbEvalContext
14440 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a   *)Tcl_Alloc(siz
14450 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  eof(DbEvalContex
14460 74 29 29 3b 0a 20 20 20 20 20 20 64 62 45 76 61  t));.      dbEva
14470 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c 20 6f 62  lInit(p, pDb, ob
14480 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79 2c 20 65  jv[2], pArray, e
14490 76 61 6c 46 6c 61 67 73 29 3b 0a 0a 20 20 20 20  valFlags);..    
144a0 20 20 63 64 32 5b 30 5d 20 3d 20 28 76 6f 69 64    cd2[0] = (void
144b0 20 2a 29 70 3b 0a 20 20 20 20 20 20 63 64 32 5b   *)p;.      cd2[
144c0 31 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 53 63  1] = (void *)pSc
144d0 72 69 70 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ript;.      rc =
144e0 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 63   DbEvalNextCmd(c
144f0 64 32 2c 20 69 6e 74 65 72 70 2c 20 54 43 4c 5f  d2, interp, TCL_
14500 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  OK);.    }.    b
14510 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
14520 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e    **     $db fun
14530 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67  ction NAME [-arg
14540 63 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65 74 65 72  count N] [-deter
14550 6d 69 6e 69 73 74 69 63 5d 20 53 43 52 49 50 54  ministic] SCRIPT
14560 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74  .  **.  ** Creat
14570 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63  e a new SQL func
14580 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
14590 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61 74  .  Whenever that
145a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a   function is.  *
145b0 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  * called, invoke
145c0 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
145d0 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
145e0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
145f0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
14600 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c   int flags = SQL
14610 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 53 71  ITE_UTF8;.    Sq
14620 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  lFunc *pFunc;.  
14630 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
14640 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  pt;.    char *zN
14650 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ame;.    int nAr
14660 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  g = -1;.    int 
14670 69 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  i;.    if( objc<
14680 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
14690 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
146a0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 2, objv, "NA
146b0 4d 45 20 3f 53 57 49 54 43 48 45 53 3f 20 53 43  ME ?SWITCHES? SC
146c0 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
146d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
146e0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
146f0 33 3b 20 69 3c 28 6f 62 6a 63 2d 31 29 3b 20 69  3; i<(objc-1); i
14700 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
14710 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47   char *z = Tcl_G
14720 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
14730 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
14740 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
14750 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73      if( n>2 && s
14760 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63  trncmp(z, "-argc
14770 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20  ount",n)==0 ){. 
14780 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28 6f         if( i==(o
14790 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20 20 20 20  bjc-2) ){.      
147a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
147b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6f 70  sult(interp, "op
147c0 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
147d0 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c 20 7a 2c   argument: ", z,
147e0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
147f0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14800 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
14810 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c  .        if( Tcl
14820 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
14830 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
14840 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72  , &nArg) ) retur
14850 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14860 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30 20       if( nArg<0 
14870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
14880 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14890 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66  terp, "number of
148a0 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74 20   arguments must 
148b0 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22  be non-negative"
148c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
148e0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
148f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14900 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
14910 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
14920 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
14930 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28   n>2 && strncmp(
14940 7a 2c 20 22 2d 64 65 74 65 72 6d 69 6e 69 73 74  z, "-determinist
14950 69 63 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  ic",n)==0 ){.   
14960 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
14970 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
14980 49 43 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  IC;.      }else{
14990 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
149a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
149b0 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22  , "bad option \"
149c0 22 2c 20 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  ", z,.          
149d0 20 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 2d    "\": must be -
149e0 61 72 67 63 6f 75 6e 74 20 6f 72 20 2d 64 65 74  argcount or -det
149f0 65 72 6d 69 6e 69 73 74 69 63 22 2c 20 28 63 68  erministic", (ch
14a00 61 72 2a 29 30 0a 20 20 20 20 20 20 20 20 29 3b  ar*)0.        );
14a10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14a20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
14a30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53   }.    }..    pS
14a40 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a  cript = objv[obj
14a50 63 2d 31 5d 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  c-1];.    zName 
14a60 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
14a70 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
14a80 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20  0);.    pFunc = 
14a90 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c  findSqlFunc(pDb,
14aa0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
14ab0 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75   pFunc==0 ) retu
14ac0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14ad0 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63    if( pFunc->pSc
14ae0 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63  ript ){.      Tc
14af0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
14b00 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Func->pScript);.
14b10 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d      }.    pFunc-
14b20 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72 69  >pScript = pScri
14b30 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  pt;.    Tcl_Incr
14b40 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
14b50 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73  );.    pFunc->us
14b60 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65  eEvalObjv = safe
14b70 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e  ToUseEvalObjv(in
14b80 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a  terp, pScript);.
14b90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14ba0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14bb0 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
14bc0 20 6e 41 72 67 2c 20 66 6c 61 67 73 2c 0a 20 20   nArg, flags,.  
14bd0 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c        pFunc, tcl
14be0 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
14bf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
14c10 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
14c20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
14c30 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
14c40 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
14c50 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
14c60 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d  VOLATILE);.    }
14c70 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
14c80 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
14c90 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65  db incrblob ?-re
14ca0 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42  adonly? ?DB? TAB
14cb0 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a  LE COLUMN ROWID.
14cc0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49    */.  case DB_I
14cd0 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65  NCRBLOB: {.#ifde
14ce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
14cf0 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41  CRBLOB.    Tcl_A
14d00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14d10 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f  rp, "incrblob no
14d20 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
14d30 68 69 73 20 62 75 69 6c 64 22 2c 20 28 63 68 61  his build", (cha
14d40 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
14d50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
14d60 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61  se.    int isRea
14d70 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63  donly = 0;.    c
14d80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
14d90 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e   "main";.    con
14da0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b  st char *zTable;
14db0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14dc0 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 54 63  *zColumn;.    Tc
14dd0 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77 3b 0a  l_WideInt iRow;.
14de0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
14df0 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20  r the -readonly 
14e00 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  option */.    if
14e10 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72 63  ( objc>3 && strc
14e20 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
14e30 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61  (objv[2]), "-rea
14e40 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20  donly")==0 ){.  
14e50 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
14e60 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
14e70 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65  f( objc!=(5+isRe
14e80 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21  adonly) && objc!
14e90 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(6+isReadonly) 
14ea0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
14eb0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14ec0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65  , 2, objv, "?-re
14ed0 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42  adonly? ?DB? TAB
14ee0 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22  LE COLUMN ROWID"
14ef0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14f00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14f10 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ..    if( objc==
14f20 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29  (6+isReadonly) )
14f30 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63  {.      zDb = Tc
14f40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14f50 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [2]);.    }.    
14f60 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74  zTable = Tcl_Get
14f70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63  String(objv[objc
14f80 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d  -3]);.    zColum
14f90 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  n = Tcl_GetStrin
14fa0 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b  g(objv[objc-2]);
14fb0 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65  .    rc = Tcl_Ge
14fc0 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
14fd0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a  interp, objv[obj
14fe0 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20  c-1], &iRow);.. 
14ff0 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f     if( rc==TCL_O
15000 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
15010 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68  createIncrblobCh
15020 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20 20  annel(.         
15030 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a 44   interp, pDb, zD
15040 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75  b, zTable, zColu
15050 6d 6e 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  mn, (sqlite3_int
15060 36 34 29 69 52 6f 77 2c 20 69 73 52 65 61 64 6f  64)iRow, isReado
15070 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  nly.      );.   
15080 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
15090 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
150a0 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 74 65   **     $db inte
150b0 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rrupt.  **.  ** 
150c0 49 6e 74 65 72 72 75 70 74 20 74 68 65 20 65 78  Interrupt the ex
150d0 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ecution of the i
150e0 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e  nner-most SQL in
150f0 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 69 73  terpreter.  This
15100 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65  .  ** causes the
15110 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
15120 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
15130 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45  r of SQLITE_INTE
15140 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61  RRUPT..  */.  ca
15150 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50 54 3a  se DB_INTERRUPT:
15160 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69   {.    sqlite3_i
15170 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e 64 62  nterrupt(pDb->db
15180 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
15190 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
151a0 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f   $db nullvalue ?
151b0 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a  STRING?.  **.  *
151c0 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20 75 73  * Change text us
151d0 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  ed when a NULL c
151e0 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  omes back from t
151f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
15200 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73  ?STRING?.  ** is
15210 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
15220 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  en the current s
15230 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e  tring used for N
15240 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
15250 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20  .  ** If STRING 
15260 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
15270 20 53 54 52 49 4e 47 20 69 73 20 72 65 74 75 72   STRING is retur
15280 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20  ned..  **.  */. 
15290 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c   case DB_NULLVAL
152a0 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  UE: {.    if( ob
152b0 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
152c0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
152d0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
152e0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c  p, 2, objv, "NUL
152f0 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20  LVALUE");.      
15300 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15320 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
15330 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
15340 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63  char *zNull = Tc
15350 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
15360 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
15370 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
15380 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  ->zNull ){.     
15390 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
153a0 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  >zNull);.      }
153b0 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c  .      if( zNull
153c0 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
153d0 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20       pDb->zNull 
153e0 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
153f0 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
15400 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c  memcpy(pDb->zNul
15410 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a  l, zNull, len);.
15420 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
15430 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  ll[len] = '\0';.
15440 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15450 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20       pDb->zNull 
15460 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
15470 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   }.    Tcl_SetOb
15480 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
15490 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
154a0 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29  (pDb->zNull, -1)
154b0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
154c0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
154d0 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74   $db last_insert
154e0 5f 72 6f 77 69 64 0a 20 20 2a 2a 0a 20 20 2a 2a  _rowid.  **.  **
154f0 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
15500 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
15510 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f  ROWID for the mo
15520 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74  st recent insert
15530 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
15540 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
15550 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ID: {.    Tcl_Ob
15560 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
15570 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69  Tcl_WideInt rowi
15580 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  d;.    if( objc!
15590 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
155a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
155b0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
155c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
155d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
155e0 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c  .    rowid = sql
155f0 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
15600 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b  _rowid(pDb->db);
15610 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
15620 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
15630 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
15640 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70  _SetWideIntObj(p
15650 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a  Result, rowid);.
15660 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
15670 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42    /*.  ** The DB
15680 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f  _ONECOLUMN metho
15690 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  d is implemented
156a0 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44   together with D
156b0 42 5f 45 58 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a  B_EXISTS..  */..
156c0 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67    /*    $db prog
156d0 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b  ress ?N CALLBACK
156e0 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
156f0 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
15700 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69  lback every N vi
15710 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70  rtual machine op
15720 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63  codes while exec
15730 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69  uting.  ** queri
15740 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  es..  */.  case 
15750 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20  DB_PROGRESS: {. 
15760 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29     if( objc==2 )
15770 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
15780 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
15790 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
157a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
157b0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 28  Db->zProgress, (
157c0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
157d0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
157e0 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
157f0 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
15800 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
15810 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20  .      int N;.  
15820 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
15830 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
15840 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
15850 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20  ], &N) ){.      
15860 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15870 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  OR;.      };.   
15880 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
15890 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
158a0 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
158b0 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
158c0 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65   }.      zProgre
158d0 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ss = Tcl_GetStri
158e0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
158f0 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
15900 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26  if( zProgress &&
15910 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
15920 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
15930 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
15940 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
15950 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
15960 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73  ogress, zProgres
15970 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  s, len+1);.     
15980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15990 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
159a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
159b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
159c0 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
159d0 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  K.      if( pDb-
159e0 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
159f0 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
15a00 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
15a10 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67      sqlite3_prog
15a20 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62  ress_handler(pDb
15a30 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72  ->db, N, DbProgr
15a40 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  essHandler, pDb)
15a50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
15a70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
15a80 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30  pDb->db, 0, 0, 0
15a90 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
15aa0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
15ab0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
15ac0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
15ad0 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b  bjv, "N CALLBACK
15ae0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
15af0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15b00 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
15b10 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
15b20 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  ofile ?CALLBACK?
15b30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
15b40 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
15b50 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
15b60 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65  ACK routine afte
15b70 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  r each SQL state
15b80 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68  ment.  ** that h
15b90 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78  as run.  The tex
15ba0 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64  t of the SQL and
15bb0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65   the amount of e
15bc0 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20  lapse time are. 
15bd0 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20   ** appended to 
15be0 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
15bf0 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72 75  the script is ru
15c00 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
15c10 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20  B_PROFILE: {.   
15c20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
15c30 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
15c40 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
15c50 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
15c60 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
15c70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15c80 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
15c90 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
15ca0 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
15cb0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
15cc0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15cd0 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  p, pDb->zProfile
15ce0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
15cf0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
15d00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f        char *zPro
15d10 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  file;.      int 
15d20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
15d30 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
15d40 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
15d50 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b  (pDb->zProfile);
15d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
15d70 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65  Profile = Tcl_Ge
15d80 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
15d90 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
15da0 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c       if( zProfil
15db0 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
15dc0 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66        pDb->zProf
15dd0 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ile = Tcl_Alloc(
15de0 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
15df0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
15e00 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69  zProfile, zProfi
15e10 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  le, len+1);.    
15e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15e30 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
15e40 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20   0;.      }.#if 
15e50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15e60 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
15e70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15e80 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15e90 4e 54 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65  NT) && \.    !de
15ea0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15eb0 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20 20  T_DEPRECATED).  
15ec0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
15ed0 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
15ee0 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
15ef0 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
15f00 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
15f10 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c  Db->db, DbProfil
15f20 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  eHandler, pDb);.
15f30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15f40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
15f50 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  file(pDb->db, 0,
15f60 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
15f70 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
15f80 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
15f90 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65   **     $db reke
15fa0 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y KEY.  **.  ** 
15fb0 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79  Change the encry
15fc0 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65  ption key on the
15fd0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
15fe0 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
15ff0 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20   case DB_REKEY: 
16000 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
16010 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
16020 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
16030 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52  TE_OMIT_CODEC_FR
16040 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 69 6e 74 20  OM_TCL).    int 
16050 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a  nKey;.    void *
16060 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pKey;.#endif.   
16070 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
16080 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
16090 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
160a0 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a  , objv, "KEY");.
160b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
160c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69  _ERROR;.    }.#i
160d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
160e0 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21  _HAS_CODEC) && !
160f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
16100 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54  MIT_CODEC_FROM_T
16110 43 4c 29 0a 20 20 20 20 70 4b 65 79 20 3d 20 54  CL).    pKey = T
16120 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
16130 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
16140 26 6e 4b 65 79 29 3b 0a 20 20 20 20 72 63 20 3d  &nKey);.    rc =
16150 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70   sqlite3_rekey(p
16160 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b  Db->db, pKey, nK
16170 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ey);.    if( rc 
16180 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
16190 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
161a0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72  , sqlite3_errstr
161b0 28 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  (rc), (char*)0);
161c0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
161d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERROR;.    }.#en
161e0 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
161f0 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
16200 72 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53  restore ?DATABAS
16210 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a  E? FILENAME.  **
16220 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  .  ** Open a dat
16230 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64  abase file named
16240 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e   FILENAME.  Tran
16250 73 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74  sfer the content
16260 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d  .  ** of FILENAM
16270 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  E into the local
16280 20 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41   database DATABA
16290 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61  SE (default: "ma
162a0 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  in")..  */.  cas
162b0 65 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  e DB_RESTORE: {.
162c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
162d0 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f  zSrcFile;.    co
162e0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44  nst char *zDestD
162f0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
16300 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
16310 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
16320 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
16330 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
16340 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
16350 20 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61     zDestDb = "ma
16360 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46  in";.      zSrcF
16370 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
16380 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
16390 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
163a0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==4 ){.      zDe
163b0 73 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  stDb = Tcl_GetSt
163c0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
163d0 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
163e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
163f0 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[3]);.    }els
16400 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
16410 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16420 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54  , 2, objv, "?DAT
16430 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22  ABASE? FILENAME"
16440 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16450 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
16460 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16470 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69  3_open_v2(zSrcFi
16480 6c 65 2c 20 26 70 53 72 63 2c 0a 20 20 20 20 20  le, &pSrc,.     
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
164b0 52 45 41 44 4f 4e 4c 59 20 7c 20 70 44 62 2d 3e  READONLY | pDb->
164c0 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
164d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
164e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
164f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16500 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
16510 70 65 6e 20 73 6f 75 72 63 65 20 64 61 74 61 62  pen source datab
16520 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  ase: ",.        
16530 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
16540 67 28 70 53 72 63 29 2c 20 28 63 68 61 72 2a 29  g(pSrc), (char*)
16550 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
16560 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20  3_close(pSrc);. 
16570 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16580 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
16590 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74   pBackup = sqlit
165a0 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70  e3_backup_init(p
165b0 44 62 2d 3e 64 62 2c 20 7a 44 65 73 74 44 62 2c  Db->db, zDestDb,
165c0 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a   pSrc, "main");.
165d0 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d      if( pBackup=
165e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
165f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16600 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61  erp, "restore fa
16610 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  iled: ",.       
16620 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
16630 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
16640 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
16650 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
16660 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16670 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
16680 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
16690 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
166a0 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
166b0 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  0))==SQLITE_OK. 
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
166d0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
166e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
166f0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
16700 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d          if( nTim
16710 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72  eout++ >= 3 ) br
16720 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eak;.        sql
16730 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b  ite3_sleep(100);
16740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16750 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
16760 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
16770 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
16780 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
16790 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
167a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
167b0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
167c0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43  | rc==SQLITE_LOC
167d0 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  KED ){.      Tcl
167e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
167f0 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66  terp, "restore f
16800 61 69 6c 65 64 3a 20 73 6f 75 72 63 65 20 64 61  ailed: source da
16810 74 61 62 61 73 65 20 62 75 73 79 22 2c 0a 20 20  tabase busy",.  
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
16840 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
16850 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
16860 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
16870 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16880 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
16890 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
168a0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
168b0 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
168c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
168d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
168e0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
168f0 28 70 53 72 63 29 3b 0a 20 20 20 20 62 72 65 61  (pSrc);.    brea
16900 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
16910 2a 20 20 20 20 20 24 64 62 20 73 65 72 69 61 6c  *     $db serial
16920 69 7a 65 20 3f 44 41 54 41 42 41 53 45 3f 0a 20  ize ?DATABASE?. 
16930 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
16940 61 20 73 65 72 69 61 6c 69 7a 61 74 69 6f 6e 20  a serialization 
16950 6f 66 20 61 20 64 61 74 61 62 61 73 65 2e 20 20  of a database.  
16960 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
16970 53 45 52 49 41 4c 49 5a 45 3a 20 7b 0a 23 69 66  SERIALIZE: {.#if
16980 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
16990 4c 45 5f 4d 45 4d 44 42 0a 20 20 20 20 54 63 6c  LE_MEMDB.    Tcl
169a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
169b0 74 65 72 70 2c 20 22 4d 45 4d 44 42 20 6e 6f 74  terp, "MEMDB not
169c0 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
169d0 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20 20  is build",.     
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169f0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
16a00 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  c = TCL_ERROR;.#
16a10 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 63  else.    const c
16a20 68 61 72 20 2a 7a 53 63 68 65 6d 61 20 3d 20 6f  har *zSchema = o
16a30 62 6a 63 3e 3d 33 20 3f 20 54 63 6c 5f 47 65 74  bjc>=3 ? Tcl_Get
16a40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 20  String(objv[2]) 
16a50 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 73 71  : "main";.    sq
16a60 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d  lite3_int64 sz =
16a70 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   0;.    unsigned
16a80 20 63 68 61 72 20 2a 70 44 61 74 61 3b 0a 20 20   char *pData;.  
16a90 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
16aa0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
16ab0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
16ac0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
16ad0 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 22  jv, "?DATABASE?"
16ae0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
16af0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
16b00 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 65  se{.      int ne
16b10 65 64 46 72 65 65 3b 0a 20 20 20 20 20 20 70 44  edFree;.      pD
16b20 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 73 65  ata = sqlite3_se
16b30 72 69 61 6c 69 7a 65 28 70 44 62 2d 3e 64 62 2c  rialize(pDb->db,
16b40 20 7a 53 63 68 65 6d 61 2c 20 26 73 7a 2c 20 53   zSchema, &sz, S
16b50 51 4c 49 54 45 5f 53 45 52 49 41 4c 49 5a 45 5f  QLITE_SERIALIZE_
16b60 4e 4f 43 4f 50 59 29 3b 0a 20 20 20 20 20 20 69  NOCOPY);.      i
16b70 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
16b80 20 20 20 20 6e 65 65 64 46 72 65 65 20 3d 20 30      needFree = 0
16b90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16ba0 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 73         pData = s
16bb0 71 6c 69 74 65 33 5f 73 65 72 69 61 6c 69 7a 65  qlite3_serialize
16bc0 28 70 44 62 2d 3e 64 62 2c 20 7a 53 63 68 65 6d  (pDb->db, zSchem
16bd0 61 2c 20 26 73 7a 2c 20 30 29 3b 0a 20 20 20 20  a, &sz, 0);.    
16be0 20 20 20 20 6e 65 65 64 46 72 65 65 20 3d 20 31      needFree = 1
16bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16c00 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
16c10 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
16c20 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70 44 61  ByteArrayObj(pDa
16c30 74 61 2c 73 7a 29 29 3b 0a 20 20 20 20 20 20 69  ta,sz));.      i
16c40 66 28 20 6e 65 65 64 46 72 65 65 20 29 20 73 71  f( needFree ) sq
16c50 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
16c60 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
16c70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16c80 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
16c90 62 20 73 74 61 74 75 73 20 28 73 74 65 70 7c 73  b status (step|s
16ca0 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 7c 76 6d  ort|autoindex|vm
16cb0 73 74 65 70 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  step).  **.  ** 
16cc0 44 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f 53  Display SQLITE_S
16cd0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
16ce0 41 4e 5f 53 54 45 50 20 6f 72 0a 20 20 2a 2a 20  AN_STEP or.  ** 
16cf0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
16d00 53 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20 6d  S_SORT for the m
16d10 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c 2e  ost recent eval.
16d20 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
16d30 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e  STATUS: {.    in
16d40 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t v;.    const c
16d50 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66  har *zOp;.    if
16d60 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
16d70 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16d80 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
16d90 62 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72 74  bjv, "(step|sort
16da0 7c 61 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20  |autoindex)");. 
16db0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16dc0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
16dd0 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74   zOp = Tcl_GetSt
16de0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
16df0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
16e00 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b  p, "step")==0 ){
16e10 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e  .      v = pDb->
16e20 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65  nStep;.    }else
16e30 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
16e40 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20   "sort")==0 ){. 
16e50 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53       v = pDb->nS
16e60 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ort;.    }else i
16e70 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
16e80 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29  autoindex")==0 )
16e90 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
16ea0 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  >nIndex;.    }el
16eb0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f  se if( strcmp(zO
16ec0 70 2c 20 22 76 6d 73 74 65 70 22 29 3d 3d 30 20  p, "vmstep")==0 
16ed0 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62  ){.      v = pDb
16ee0 2d 3e 6e 56 4d 53 74 65 70 3b 0a 20 20 20 20 7d  ->nVMStep;.    }
16ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
16f00 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16f10 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  erp,.           
16f20 20 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20   "bad argument: 
16f30 73 68 6f 75 6c 64 20 62 65 20 61 75 74 6f 69 6e  should be autoin
16f40 64 65 78 2c 20 73 74 65 70 2c 20 73 6f 72 74 20  dex, step, sort 
16f50 6f 72 20 76 6d 73 74 65 70 22 2c 0a 20 20 20 20  or vmstep",.    
16f60 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
16f70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16f80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
16f90 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
16fa0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
16fb0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b  l_NewIntObj(v));
16fc0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
16fd0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
16fe0 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45  db timeout MILLE
16ff0 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a  SECONDS.  **.  *
17000 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20  * Delay for the 
17010 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
17020 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64  econds specified
17030 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20   when a file is 
17040 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  locked..  */.  c
17050 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20  ase DB_TIMEOUT: 
17060 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20  {.    int ms;.  
17070 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
17080 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
17090 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
170a0 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53  2, objv, "MILLIS
170b0 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20  ECONDS");.      
170c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
170d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
170e0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
170f0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
17100 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
17110 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17120 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
17130 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73  eout(pDb->db, ms
17140 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
17150 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
17160 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   $db total_chang
17170 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
17180 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
17190 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
171a0 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
171b0 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 0a  ted, or deleted.
171c0 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64    ** since the d
171d0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
171e0 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  as created..  */
171f0 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c  .  case DB_TOTAL
17200 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
17210 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
17220 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
17230 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
17240 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
17250 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
17260 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
17270 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
17280 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
17290 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
172a0 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
172b0 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
172c0 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
172d0 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
172e0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
172f0 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
17300 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
17310 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
17320 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
17330 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
17340 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
17350 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
17360 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
17370 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
17380 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
17390 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
173a0 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
173b0 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
173c0 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
173d0 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
173e0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
173f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
17400 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
17410 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
17420 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
17430 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17440 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
17450 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
17460 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
17470 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
17480 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
17490 44 62 2d 3e 7a 54 72 61 63 65 2c 20 28 63 68 61  Db->zTrace, (cha
174a0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r*)0);.      }. 
174b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
174c0 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20  char *zTrace;.  
174d0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
174e0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
174f0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
17500 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
17510 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
17520 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f     zTrace = Tcl_
17530 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
17540 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
17550 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63  .      if( zTrac
17560 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
17570 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
17580 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
17590 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
175a0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54    memcpy(pDb->zT
175b0 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65  race, zTrace, le
175c0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
175d0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
175e0 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  zTrace = 0;.    
175f0 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
17600 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
17610 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
17620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
17630 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26 26 20 5c  TING_POINT) && \
17640 0a 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51  .    !defined(SQ
17650 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
17660 41 54 45 44 29 0a 20 20 20 20 20 20 69 66 28 20  ATED).      if( 
17670 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
17680 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
17690 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
176a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
176b0 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
176c0 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
176d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
176e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
176f0 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
17700 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
17710 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
17720 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
17730 20 20 24 64 62 20 74 72 61 63 65 5f 76 32 20 3f    $db trace_v2 ?
17740 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f  CALLBACK? ?MASK?
17750 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
17760 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
17770 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
17780 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
17790 65 61 63 68 20 74 72 61 63 65 20 65 76 65 6e 74  each trace event
177a0 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 74  .  ** matching t
177b0 68 65 20 6d 61 73 6b 20 74 68 61 74 20 69 73 20  he mask that is 
177c0 67 65 6e 65 72 61 74 65 64 2e 20 20 54 68 65 20  generated.  The 
177d0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 61  parameters are a
177e0 70 70 65 6e 64 65 64 20 74 6f 0a 20 20 2a 2a 20  ppended to.  ** 
177f0 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
17800 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
17810 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
17820 52 41 43 45 5f 56 32 3a 20 7b 0a 20 20 20 20 69  RACE_V2: {.    i
17830 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20  f( objc>4 ){.   
17840 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
17850 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
17860 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
17870 20 3f 4d 41 53 4b 3f 22 29 3b 0a 20 20 20 20 20   ?MASK?");.     
17880 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17890 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
178a0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
178b0 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
178c0 65 56 32 20 29 7b 0a 20 20 20 20 20 20 20 20 54  eV2 ){.        T
178d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
178e0 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72  interp, pDb->zTr
178f0 61 63 65 56 32 2c 20 28 63 68 61 72 2a 29 30 29  aceV2, (char*)0)
17900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
17910 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
17920 2a 7a 54 72 61 63 65 56 32 3b 0a 20 20 20 20 20  *zTraceV2;.     
17930 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
17940 54 63 6c 5f 57 69 64 65 49 6e 74 20 77 4d 61 73  Tcl_WideInt wMas
17950 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  k = 0;.      if(
17960 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
17970 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
17980 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72   char *TTYPE_str
17990 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
179a0 20 20 22 73 74 61 74 65 6d 65 6e 74 22 2c 20 22    "statement", "
179b0 70 72 6f 66 69 6c 65 22 2c 20 22 72 6f 77 22 2c  profile", "row",
179c0 20 22 63 6c 6f 73 65 22 2c 20 30 0a 20 20 20 20   "close", 0.    
179d0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 65      };.        e
179e0 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b  num TTYPE_enum {
179f0 0a 20 20 20 20 20 20 20 20 20 20 54 54 59 50 45  .          TTYPE
17a00 5f 53 54 4d 54 2c 20 54 54 59 50 45 5f 50 52 4f  _STMT, TTYPE_PRO
17a10 46 49 4c 45 2c 20 54 54 59 50 45 5f 52 4f 57 2c  FILE, TTYPE_ROW,
17a20 20 54 54 59 50 45 5f 43 4c 4f 53 45 0a 20 20 20   TTYPE_CLOSE.   
17a30 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
17a40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69  int i;.        i
17a50 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c  f( TCL_OK!=Tcl_L
17a60 69 73 74 4f 62 6a 4c 65 6e 67 74 68 28 69 6e 74  istObjLength(int
17a70 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6c  erp, objv[3], &l
17a80 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  en) ){.         
17a90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17aa0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
17ab0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
17ac0 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  len; i++){.     
17ad0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f       Tcl_Obj *pO
17ae0 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  bj;.          in
17af0 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 20  t ttype;.       
17b00 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
17b10 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28  cl_ListObjIndex(
17b20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
17b30 20 69 2c 20 26 70 4f 62 6a 29 20 29 7b 0a 20 20   i, &pObj) ){.  
17b40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17b50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17b70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
17b80 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
17b90 2c 20 70 4f 62 6a 2c 20 54 54 59 50 45 5f 73 74  , pObj, TTYPE_st
17ba0 72 73 2c 20 22 74 72 61 63 65 20 74 79 70 65 22  rs, "trace type"
17bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bd0 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 21 3d      0, &ttype)!=
17be0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
17bf0 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
17c00 74 20 77 54 79 70 65 3b 0a 20 20 20 20 20 20 20  t wType;.       
17c10 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45       Tcl_Obj *pE
17c20 72 72 6f 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  rror = Tcl_Dupli
17c30 63 61 74 65 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  cateObj(Tcl_GetO
17c40 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
17c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
17c60 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
17c70 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  pError);.       
17c80 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 3d       if( TCL_OK=
17c90 3d 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46  =Tcl_GetWideIntF
17ca0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
17cb0 4f 62 6a 2c 20 26 77 54 79 70 65 29 20 29 7b 0a  Obj, &wType) ){.
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
17cd0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
17ce0 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  Error);.        
17cf0 20 20 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20 77        wMask |= w
17d00 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
17d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17d20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
17d30 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
17d40 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  pError);.       
17d50 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
17d60 65 66 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b  efCount(pError);
17d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
17d80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
17da0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
17db0 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74              swit
17dc0 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
17dd0 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
17de0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
17df0 20 54 54 59 50 45 5f 53 54 4d 54 3a 20 20 20 20   TTYPE_STMT:    
17e00 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f  wMask |= SQLITE_
17e10 54 52 41 43 45 5f 53 54 4d 54 3b 20 20 20 20 62  TRACE_STMT;    b
17e20 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
17e30 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 50      case TTYPE_P
17e40 52 4f 46 49 4c 45 3a 20 77 4d 61 73 6b 20 7c 3d  ROFILE: wMask |=
17e50 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52   SQLITE_TRACE_PR
17e60 4f 46 49 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20  OFILE; break;.  
17e70 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
17e80 20 54 54 59 50 45 5f 52 4f 57 3a 20 20 20 20 20   TTYPE_ROW:     
17e90 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f  wMask |= SQLITE_
17ea0 54 52 41 43 45 5f 52 4f 57 3b 20 20 20 20 20 62  TRACE_ROW;     b
17eb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
17ec0 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 43      case TTYPE_C
17ed0 4c 4f 53 45 3a 20 20 20 77 4d 61 73 6b 20 7c 3d  LOSE:   wMask |=
17ee0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c   SQLITE_TRACE_CL
17ef0 4f 53 45 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OSE;   break;.  
17f00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17f20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
17f30 20 20 20 20 20 20 20 77 4d 61 73 6b 20 3d 20 53         wMask = S
17f40 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
17f50 3b 20 2f 2a 20 75 73 65 20 74 68 65 20 22 6c 65  ; /* use the "le
17f60 67 61 63 79 22 20 64 65 66 61 75 6c 74 20 2a 2f  gacy" default */
17f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17f80 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  f( pDb->zTraceV2
17f90 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
17fa0 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
17fb0 56 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  V2);.      }.   
17fc0 20 20 20 7a 54 72 61 63 65 56 32 20 3d 20 54 63     zTraceV2 = Tc
17fd0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
17fe0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
17ff0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72  );.      if( zTr
18000 61 63 65 56 32 20 26 26 20 6c 65 6e 3e 30 20 29  aceV2 && len>0 )
18010 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
18020 54 72 61 63 65 56 32 20 3d 20 54 63 6c 5f 41 6c  TraceV2 = Tcl_Al
18030 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
18040 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
18050 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 7a 54  Db->zTraceV2, zT
18060 72 61 63 65 56 32 2c 20 6c 65 6e 2b 31 29 3b 0a  raceV2, len+1);.
18070 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18080 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
18090 56 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  V2 = 0;.      }.
180a0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
180b0 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
180c0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
180d0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
180e0 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66  _POINT).      if
180f0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20  ( pDb->zTraceV2 
18100 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
18110 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
18120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18130 5f 74 72 61 63 65 5f 76 32 28 70 44 62 2d 3e 64  _trace_v2(pDb->d
18140 62 2c 20 28 75 6e 73 69 67 6e 65 64 29 77 4d 61  b, (unsigned)wMa
18150 73 6b 2c 20 44 62 54 72 61 63 65 56 32 48 61 6e  sk, DbTraceV2Han
18160 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
18170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18180 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76   sqlite3_trace_v
18190 32 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c  2(pDb->db, 0, 0,
181a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
181b0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
181c0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
181d0 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
181e0 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
181f0 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
18200 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
18210 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
18220 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
18230 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
18240 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
18250 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
18260 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
18270 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
18280 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
18290 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
182a0 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
182b0 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
182c0 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
182d0 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
182e0 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
182f0 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
18300 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
18310 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
18320 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
18330 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
18340 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
18350 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
18360 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
18370 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
18380 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
18390 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
183a0 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
183b0 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
183c0 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
183d0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
183e0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
183f0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
18400 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
18410 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
18420 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74  SAVEPOINT _tcl_t
18430 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
18440 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
18450 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
18460 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
18470 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
18480 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50  v, "[TYPE] SCRIP
18490 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
184a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
184b0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d   }..    if( pDb-
184c0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
184d0 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20   && objc==4 ){. 
184e0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
184f0 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
18500 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
18510 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
18520 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
18530 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
18540 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
18550 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
18560 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
18570 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
18580 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
18590 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
185a0 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
185b0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
185c0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
185d0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
185e0 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
185f0 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
18620 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
18630 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18640 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
18650 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
18660 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
18670 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
18680 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
18690 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
186a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
186b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
186c0 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
186d0 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
186e0 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
186f0 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
18700 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
18710 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
18720 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
18730 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
18740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18750 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
18760 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20  v[objc-1];..    
18770 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69 74  /* Run the SQLit
18780 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20  e BEGIN command 
18790 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61  to open a transa
187a0 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
187b0 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  nt. */.    pDb->
187c0 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
187d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
187e0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
187f0 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
18800 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
18810 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20  Auth--;.    if( 
18820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18830 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
18840 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18850 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
18860 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
18870 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
18880 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
18890 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e  }.    pDb->nTran
188a0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20  saction++;..    
188b0 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  /* If using NRE,
188c0 20 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c   schedule a call
188d0 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74  back to invoke t
188e0 68 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70  he script pScrip
188f0 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  t, then.    ** a
18900 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b   second callback
18910 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72   to commit (or r
18920 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61  ollback) the tra
18930 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
18940 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65  point.    ** ope
18950 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f  ned above. If no
18960 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61  t using NRE, eva
18970 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
18980 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a   directly, then.
18990 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63      ** call func
189a0 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74  tion DbTransPost
189b0 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20  Cmd() to commit 
189c0 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  (or rollback) th
189d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
189e0 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
189f0 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44  t.  */.    if( D
18a00 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
18a10 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c     Tcl_NRAddCall
18a20 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54  back(interp, DbT
18a30 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c  ransPostCmd, cd,
18a40 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
18a50 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76 61   (void)Tcl_NREva
18a60 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63  lObj(interp, pSc
18a70 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ript, 0);.    }e
18a80 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
18a90 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 26  DbTransPostCmd(&
18aa0 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f  cd, interp, Tcl_
18ab0 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
18ac0 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b 0a  , pScript, 0));.
18ad0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
18ae0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
18af0 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f     $db unlock_no
18b00 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20 20  tify ?script?.  
18b10 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e 4c  */.  case DB_UNL
18b20 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69  OCK_NOTIFY: {.#i
18b30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
18b40 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
18b50 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  Y.    Tcl_Append
18b60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18b70 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f  unlock_notify no
18b80 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
18b90 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20  his build",.    
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
18bc0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
18bd0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
18be0 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
18bf0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
18c00 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
18c10 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
18c20 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72  RIPT?");.      r
18c30 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
18c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18c50 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29 28  void (*xNotify)(
18c60 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20  void **, int) = 
18c70 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  0;.      void *p
18c80 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a  NotifyArg = 0;..
18c90 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
18ca0 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a  UnlockNotify ){.
18cb0 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
18cc0 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
18cd0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20  nlockNotify);.  
18ce0 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f        pDb->pUnlo
18cf0 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20  ckNotify = 0;.  
18d00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
18d10 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
18d20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62      xNotify = Db
18d30 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20  UnlockNotify;.  
18d40 20 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67        pNotifyArg
18d50 20 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a   = (void *)pDb;.
18d60 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e          pDb->pUn
18d70 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a  lockNotify = obj
18d80 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63  v[2];.        Tc
18d90 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
18da0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
18db0 79 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  y);.      }..   
18dc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75     if( sqlite3_u
18dd0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62  nlock_notify(pDb
18de0 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70  ->db, xNotify, p
18df0 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20 20  NotifyArg) ){.  
18e00 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
18e10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
18e20 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
18e30 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
18e40 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
18e50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
18e60 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
18e70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
18e80 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
18e90 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20   preupdate_hook 
18ea0 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 20 20 24 64  count.  **    $d
18eb0 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  b preupdate_hook
18ec0 20 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 20   hook ?SCRIPT?. 
18ed0 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
18ee0 64 61 74 65 5f 68 6f 6f 6b 20 6e 65 77 20 49 4e  date_hook new IN
18ef0 44 45 58 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  DEX.  **    $db 
18f00 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6f  preupdate_hook o
18f10 6c 64 20 49 4e 44 45 58 0a 20 20 2a 2f 0a 20 20  ld INDEX.  */.  
18f20 63 61 73 65 20 44 42 5f 50 52 45 55 50 44 41 54  case DB_PREUPDAT
18f30 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
18f40 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
18f50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 54 63  DATE_HOOK.    Tc
18f60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18f70 6e 74 65 72 70 2c 20 22 70 72 65 75 70 64 61 74  nterp, "preupdat
18f80 65 5f 68 6f 6f 6b 20 77 61 73 20 6f 6d 69 74 74  e_hook was omitt
18f90 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
18fa0 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  me", .          
18fb0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
18fc0 2a 29 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  *)0);.    rc = T
18fd0 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
18fe0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
18ff0 20 63 68 61 72 20 2a 61 7a 53 75 62 5b 5d 20 3d   char *azSub[] =
19000 20 7b 22 63 6f 75 6e 74 22 2c 20 22 64 65 70 74   {"count", "dept
19010 68 22 2c 20 22 68 6f 6f 6b 22 2c 20 22 6e 65 77  h", "hook", "new
19020 22 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b 0a 20 20  ", "old", 0};.  
19030 20 20 65 6e 75 6d 20 44 62 50 72 65 75 70 64 61    enum DbPreupda
19040 74 65 53 75 62 43 6d 64 20 7b 0a 20 20 20 20 20  teSubCmd {.     
19050 20 50 52 45 5f 43 4f 55 4e 54 2c 20 50 52 45 5f   PRE_COUNT, PRE_
19060 44 45 50 54 48 2c 20 50 52 45 5f 48 4f 4f 4b 2c  DEPTH, PRE_HOOK,
19070 20 50 52 45 5f 4e 45 57 2c 20 50 52 45 5f 4f 4c   PRE_NEW, PRE_OL
19080 44 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  D.    };.    int
19090 20 69 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20   iSub;..    if( 
190a0 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 20 20  objc<3 ){.      
190b0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
190c0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
190d0 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f  , "SUB-COMMAND ?
190e0 41 52 47 53 3f 22 29 3b 0a 20 20 20 20 7d 0a 20  ARGS?");.    }. 
190f0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
19100 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
19110 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 7a 53 75  p, objv[2], azSu
19120 62 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22  b, "sub-command"
19130 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20  , 0, &iSub) ){. 
19140 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
19150 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
19160 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
19170 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43 6d  DbPreupdateSubCm
19180 64 29 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20  d)iSub ){.      
19190 63 61 73 65 20 50 52 45 5f 43 4f 55 4e 54 3a 20  case PRE_COUNT: 
191a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
191b0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  ol = sqlite3_pre
191c0 75 70 64 61 74 65 5f 63 6f 75 6e 74 28 70 44 62  update_count(pDb
191d0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 54  ->db);.        T
191e0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
191f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
19200 6e 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20  ntObj(nCol));.  
19210 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19220 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
19230 20 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20   PRE_HOOK: {.   
19240 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34 20       if( objc>4 
19250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
19260 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
19270 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
19280 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 22 29 3b  hook ?SCRIPT?");
19290 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
192a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
192b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 44       }.        D
192c0 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c  bHookCmd(interp,
192d0 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f   pDb, (objc==4 ?
192e0 20 6f 62 6a 76 5b 33 5d 20 3a 20 30 29 2c 20 26   objv[3] : 0), &
192f0 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
19300 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ook);.        br
19310 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
19320 20 20 20 20 63 61 73 65 20 50 52 45 5f 44 45 50      case PRE_DEP
19330 54 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 54 63  TH: {.        Tc
19340 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 20  l_Obj *pRet;.   
19350 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
19360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
19370 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
19380 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20  nterp, 3, objv, 
19390 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "");.          r
193a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
193b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
193c0 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
193d0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
193e0 70 72 65 75 70 64 61 74 65 5f 64 65 70 74 68 28  preupdate_depth(
193f0 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  pDb->db));.     
19400 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
19410 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
19420 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
19430 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19440 20 63 61 73 65 20 50 52 45 5f 4e 45 57 3a 0a 20   case PRE_NEW:. 
19450 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 4f 4c       case PRE_OL
19460 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  D: {.        int
19470 20 69 49 64 78 3b 0a 20 20 20 20 20 20 20 20 73   iIdx;.        s
19480 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
19490 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  alue;.        if
194a0 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
194b0 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
194c0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
194d0 33 2c 20 6f 62 6a 76 2c 20 22 49 4e 44 45 58 22  3, objv, "INDEX"
194e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
194f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19510 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
19520 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
19530 62 6a 76 5b 33 5d 2c 20 26 69 49 64 78 29 20 29  bjv[3], &iIdx) )
19540 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
19550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19560 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
19570 20 69 66 28 20 69 53 75 62 3d 3d 50 52 45 5f 4f   if( iSub==PRE_O
19580 4c 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LD ){.          
19590 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
195a0 75 70 64 61 74 65 5f 6f 6c 64 28 70 44 62 2d 3e  update_old(pDb->
195b0 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75  db, iIdx, &pValu
195c0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
195d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
195e0 65 72 74 28 20 69 53 75 62 3d 3d 50 52 45 5f 4e  ert( iSub==PRE_N
195f0 45 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EW );.          
19600 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
19610 75 70 64 61 74 65 5f 6e 65 77 28 70 44 62 2d 3e  update_new(pDb->
19620 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75  db, iIdx, &pValu
19630 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  e);.        }.. 
19640 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
19650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19660 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
19670 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Obj;.          p
19680 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Obj = Tcl_NewStr
19690 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
196a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
196b0 28 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b 0a 20  (pValue), -1);. 
196c0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
196d0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
196e0 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20 20 20 20  , pObj);.       
196f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19700 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19710 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
19720 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
19730 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
19740 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
19750 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
19760 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19770 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
19780 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
19790 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20 20  DATE_HOOK */.   
197a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
197b0 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 77 61  *.  **    $db wa
197c0 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  l_hook ?script?.
197d0 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61    **    $db upda
197e0 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  te_hook ?script?
197f0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c  .  **    $db rol
19800 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69  lback_hook ?scri
19810 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  pt?.  */.  case 
19820 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 0a 20 20 63  DB_WAL_HOOK:.  c
19830 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f  ase DB_UPDATE_HO
19840 4f 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f 52 4f  OK:.  case DB_RO
19850 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 20  LLBACK_HOOK: {. 
19860 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b     /* set ppHook
19870 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70   to point at pUp
19880 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c  dateHook or pRol
19890 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e  lbackHook, depen
198a0 64 69 6e 67 20 6f 6e 0a 20 20 20 20 2a 2a 20 77  ding on.    ** w
198b0 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61  hether [$db upda
198c0 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62  te_hook] or [$db
198d0 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20   rollback_hook] 
198e0 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20  was invoked..   
198f0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
19900 2a 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20  **ppHook = 0;.  
19910 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
19920 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20 70 70 48 6f  _WAL_HOOK ) ppHo
19930 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48  ok = &pDb->pWalH
19940 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  ook;.    if( cho
19950 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48  ice==DB_UPDATE_H
19960 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26  OOK ) ppHook = &
19970 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
19980 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
19990 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f  ==DB_ROLLBACK_HO
199a0 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70  OK ) ppHook = &p
199b0 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
199c0 6b 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  k;.    if( objc>
199d0 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f  3 ){.       Tcl_
199e0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
199f0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
19a00 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
19a10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19a20 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 44  OR;.    }..    D
19a30 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c  bHookCmd(interp,
19a40 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 33 20 3f   pDb, (objc==3 ?
19a50 20 6f 62 6a 76 5b 32 5d 20 3a 20 30 29 2c 20 70   objv[2] : 0), p
19a60 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 62 72 65 61  pHook);.    brea
19a70 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
19a80 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  $db version.  **
19a90 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
19aa0 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20   version string 
19ab0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
19ac0 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
19ad0 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20  B_VERSION: {.   
19ae0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
19af0 69 3d 32 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 2b  i=2; i<objc; i++
19b00 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
19b10 68 61 72 20 2a 7a 41 72 67 20 3d 20 54 63 6c 5f  har *zArg = Tcl_
19b20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
19b30 5d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 74  ]);.      /* Opt
19b40 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20  ional arguments 
19b50 74 6f 20 24 64 62 20 76 65 72 73 69 6f 6e 20 61  to $db version a
19b60 72 65 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  re used for test
19b70 69 6e 67 20 70 75 72 70 6f 73 65 20 2a 2f 0a 23  ing purpose */.#
19b80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
19b90 54 0a 20 20 20 20 20 20 2f 2a 20 24 64 62 20 76  T.      /* $db v
19ba0 65 72 73 69 6f 6e 20 2d 75 73 65 2d 6c 65 67 61  ersion -use-lega
19bb0 63 79 2d 70 72 65 70 61 72 65 20 42 4f 4f 4c 45  cy-prepare BOOLE
19bc0 41 4e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  AN.      **.    
19bd0 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 75 73    ** Turn the us
19be0 65 20 6f 66 20 6c 65 67 61 63 79 20 73 71 6c 69  e of legacy sqli
19bf0 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 6f 6e  te3_prepare() on
19c00 20 6f 72 20 6f 66 66 2e 0a 20 20 20 20 20 20 2a   or off..      *
19c10 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  /.      if( strc
19c20 6d 70 28 7a 41 72 67 2c 20 22 2d 75 73 65 2d 6c  mp(zArg, "-use-l
19c30 65 67 61 63 79 2d 70 72 65 70 61 72 65 22 29 3d  egacy-prepare")=
19c40 3d 30 20 26 26 20 69 2b 31 3c 6f 62 6a 63 20 29  =0 && i+1<objc )
19c50 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  {.        i++;. 
19c60 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47         if( Tcl_G
19c70 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
19c80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d  (interp, objv[i]
19c90 2c 20 26 70 44 62 2d 3e 62 4c 65 67 61 63 79 50  , &pDb->bLegacyP
19ca0 72 65 70 61 72 65 29 20 29 7b 0a 20 20 20 20 20  repare) ){.     
19cb0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
19cc0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
19cd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20  .      }else..  
19ce0 20 20 20 20 2f 2a 20 24 64 62 20 76 65 72 73 69      /* $db versi
19cf0 6f 6e 20 2d 6c 61 73 74 2d 73 74 6d 74 2d 70 74  on -last-stmt-pt
19d00 72 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  r.      **.     
19d10 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72   ** Return a str
19d20 69 6e 67 20 77 68 69 63 68 20 69 73 20 61 20 68  ing which is a h
19d30 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  ex encoding of t
19d40 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
19d50 65 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20  e.      ** most 
19d60 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
19d70 74 6d 74 20 69 6e 20 74 68 65 20 73 74 61 74 65  tmt in the state
19d80 6d 65 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20  ment cache..    
19d90 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
19da0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6c 61  trcmp(zArg, "-la
19db0 73 74 2d 73 74 6d 74 2d 70 74 72 22 29 3d 3d 30  st-stmt-ptr")==0
19dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
19dd0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20   zBuf[100];.    
19de0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
19df0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
19e00 29 2c 20 7a 42 75 66 2c 20 22 25 70 22 2c 0a 20  ), zBuf, "%p",. 
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
19e30 74 4c 69 73 74 20 3f 20 70 44 62 2d 3e 73 74 6d  tList ? pDb->stm
19e40 74 4c 69 73 74 2d 3e 70 53 74 6d 74 3a 20 30 29  tList->pStmt: 0)
19e50 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  ;.        Tcl_Se
19e60 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
19e70 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  zBuf, TCL_VOLATI
19e80 4c 45 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  LE);.      }else
19e90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19ea0 45 5f 54 45 53 54 20 2a 2f 0a 20 20 20 20 20 20  E_TEST */.      
19eb0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
19ec0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19ed0 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75  p, "unknown argu
19ee0 6d 65 6e 74 3a 20 22 2c 20 7a 41 72 67 2c 20 28  ment: ", zArg, (
19ef0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
19f00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19f10 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
19f20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 32 20 29  }.    if( i==2 )
19f30 7b 20 20 20 0a 20 20 20 20 20 20 54 63 6c 5f 53  {   .      Tcl_S
19f40 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
19f50 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
19f60 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54  _libversion(), T
19f70 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
19f80 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
19f90 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66  ...  } /* End of
19fa0 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74   the SWITCH stat
19fb0 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72  ement */.  retur
19fc0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  n rc;.}..#if SQL
19fd0 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a  ITE_TCL_NRE./*.*
19fe0 2a 20 41 64 61 70 74 6f 72 20 74 68 61 74 20 70  * Adaptor that p
19ff0 72 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d  rovides an objCm
1a000 64 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74  d interface to t
1a010 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a  he NRE-enabled.*
1a020 2a 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c  * interface impl
1a030 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ementation..*/.s
1a040 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1a050 5f 54 43 4c 41 50 49 20 44 62 4f 62 6a 43 6d 64  _TCLAPI DbObjCmd
1a060 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64 20  Adaptor(.  void 
1a070 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  *cd,.  Tcl_Inter
1a080 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a090 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1a0a0 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
1a0b0 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43    return Tcl_NRC
1a0c0 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72  allObjProc(inter
1a0d0 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c  p, DbObjCmd, cd,
1a0e0 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a   objc, objv);.}.
1a0f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a100 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a  _TCL_NRE */../*.
1a110 2a 2a 20 49 73 73 75 65 20 74 68 65 20 75 73 61  ** Issue the usa
1a120 67 65 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  ge message when 
1a130 74 68 65 20 22 73 71 6c 69 74 65 33 22 20 63 6f  the "sqlite3" co
1a140 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1a150 61 72 65 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74  are.** incorrect
1a160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a170 73 71 6c 69 74 65 43 6d 64 55 73 61 67 65 28 0a  sqliteCmdUsage(.
1a180 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1a190 74 65 72 70 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp,.  Tcl_Obj 
1a1a0 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20  *const*objv.){. 
1a1b0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1a1c0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1a1d0 76 2c 0a 20 20 20 20 22 48 41 4e 44 4c 45 20 3f  v,.    "HANDLE ?
1a1e0 46 49 4c 45 4e 41 4d 45 3f 20 3f 2d 76 66 73 20  FILENAME? ?-vfs 
1a1f0 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f  VFSNAME? ?-reado
1a200 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63  nly BOOLEAN? ?-c
1a210 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a  reate BOOLEAN?".
1a220 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20      " ?-nomutex 
1a230 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d  BOOLEAN? ?-fullm
1a240 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  utex BOOLEAN? ?-
1a250 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69  uri BOOLEAN?".#i
1a260 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1a270 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21  _HAS_CODEC) && !
1a280 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1a290 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54  MIT_CODEC_FROM_T
1a2a0 43 4c 29 0a 20 20 20 20 22 20 3f 2d 6b 65 79 20  CL).    " ?-key 
1a2b0 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69  CODECKEY?".#endi
1a2c0 66 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  f.  );.  return 
1a2d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
1a2e0 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42  .**   sqlite3 DB
1a2f0 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NAME FILENAME ?-
1a300 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b  vfs VFSNAME? ?-k
1a310 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e  ey KEY? ?-readon
1a320 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20  ly BOOLEAN?.**  
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a340 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74           ?-creat
1a350 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d  e BOOLEAN? ?-nom
1a360 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  utex BOOLEAN?.**
1a370 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
1a380 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  main Tcl command
1a390 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  .  When the "sql
1a3a0 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  ite" Tcl command
1a3b0 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20   is.** invoked, 
1a3c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
1a3d0 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61  s to process tha
1a3e0 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  t command..**.**
1a3f0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1a400 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20  ent, DBNAME, is 
1a410 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d  an arbitrary nam
1a420 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64  e for a new.** d
1a430 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a440 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  on.  This comman
1a450 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  d creates a new 
1a460 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a  command named.**
1a470 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20   DBNAME that is 
1a480 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
1a490 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  that connection.
1a4a0 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a    The database.*
1a4b0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
1a4c0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1a4d0 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20   DBNAME command 
1a4e0 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
1a4f0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1a500 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
1a510 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1a520 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  e file..**.*/.st
1a530 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1a540 54 43 4c 41 50 49 20 44 62 4d 61 69 6e 28 0a 20  TCLAPI DbMain(. 
1a550 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c   void *cd,.  Tcl
1a560 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1a570 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1a580 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
1a590 6a 76 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  jv.){.  SqliteDb
1a5a0 20 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   *p;.  const cha
1a5b0 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20  r *zArg;.  char 
1a5c0 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20  *zErrMsg;.  int 
1a5d0 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
1a5e0 2a 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  *zFile = 0;.  co
1a5f0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
1a600 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   0;.  int flags;
1a610 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74  .  Tcl_DString t
1a620 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
1a630 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
1a640 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
1a650 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1a660 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
1a670 52 4f 4d 5f 54 43 4c 29 0a 20 20 76 6f 69 64 20  ROM_TCL).  void 
1a680 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  *pKey = 0;.  int
1a690 20 6e 4b 65 79 20 3d 20 30 3b 0a 23 65 6e 64 69   nKey = 0;.#endi
1a6a0 66 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  f.  int rc;..  /
1a6b0 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c  * In normal use,
1a6c0 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70   each TCL interp
1a6d0 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20  reter runs in a 
1a6e0 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20  single thread.  
1a6f0 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75  So.  ** by defau
1a700 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20  lt, we can turn 
1a710 6f 66 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20  off mutexing on 
1a720 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
1a730 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a  connections..  *
1a740 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74  * However, for t
1a750 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
1a760 69 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20  it is useful to 
1a770 68 61 76 65 20 6d 75 74 65 78 65 73 20 74 75 72  have mutexes tur
1a780 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f  ned.  ** on.  So
1a790 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75  , by default, mu
1a7a0 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66  texes default of
1a7b0 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69  f.  But if compi
1a7c0 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51  led with.  ** SQ
1a7d0 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54  LITE_TCL_DEFAULT
1a7e0 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20  _FULLMUTEX then 
1a7f0 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20  mutexes default 
1a800 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  on..  */.#ifdef 
1a810 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55  SQLITE_TCL_DEFAU
1a820 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66  LT_FULLMUTEX.  f
1a830 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
1a840 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1a850 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1a860 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
1a870 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65  FULLMUTEX;.#else
1a880 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  .  flags = SQLIT
1a890 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1a8a0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
1a8b0 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
1a8c0 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e  PEN_NOMUTEX;.#en
1a8d0 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  dif..  if( objc=
1a8e0 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  =2 ){.    zArg =
1a8f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1a900 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
1a910 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
1a920 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e  p(zArg,"-version
1a930 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
1a940 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a950 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 6c  interp,sqlite3_l
1a960 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 28 63 68  ibversion(), (ch
1a970 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
1a980 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
1a990 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
1a9a0 70 28 7a 41 72 67 2c 22 2d 73 6f 75 72 63 65 69  p(zArg,"-sourcei
1a9b0 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  d")==0 ){.      
1a9c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a9d0 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f  (interp,sqlite3_
1a9e0 73 6f 75 72 63 65 69 64 28 29 2c 20 28 63 68 61  sourceid(), (cha
1a9f0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
1aa00 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
1aa10 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
1aa20 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65  (zArg,"-has-code
1aa30 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65  c")==0 ){.#if de
1aa40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
1aa50 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69  _CODEC) && !defi
1aa60 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1aa70 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a  CODEC_FROM_TCL).
1aa80 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
1aa90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31  Result(interp,"1
1aaa0 22 2c 28 63 68 61 72 2a 29 30 29 3b 0a 23 65 6c  ",(char*)0);.#el
1aab0 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  se.      Tcl_App
1aac0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1aad0 2c 22 30 22 2c 28 63 68 61 72 2a 29 30 29 3b 0a  ,"0",(char*)0);.
1aae0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
1aaf0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
1ab00 7d 0a 20 20 20 20 69 66 28 20 7a 41 72 67 5b 30  }.    if( zArg[0
1ab10 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20  ]=='-' ) return 
1ab20 73 71 6c 69 74 65 43 6d 64 55 73 61 67 65 28 69  sqliteCmdUsage(i
1ab30 6e 74 65 72 70 2c 20 6f 62 6a 76 29 3b 0a 20 20  nterp, objv);.  
1ab40 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6f  }.  for(i=2; i<o
1ab50 62 6a 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  bjc; i++){.    z
1ab60 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
1ab70 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20  ing(objv[i]);.  
1ab80 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 21 3d 27    if( zArg[0]!='
1ab90 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  -' ){.      if( 
1aba0 7a 46 69 6c 65 21 3d 30 20 29 20 72 65 74 75 72  zFile!=0 ) retur
1abb0 6e 20 73 71 6c 69 74 65 43 6d 64 55 73 61 67 65  n sqliteCmdUsage
1abc0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 29 3b 0a  (interp, objv);.
1abd0 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 7a 41        zFile = zA
1abe0 72 67 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  rg;.      contin
1abf0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
1ac00 28 20 69 3d 3d 6f 62 6a 63 2d 31 20 29 20 72 65  ( i==objc-1 ) re
1ac10 74 75 72 6e 20 73 71 6c 69 74 65 43 6d 64 55 73  turn sqliteCmdUs
1ac20 61 67 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  age(interp, objv
1ac30 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  );.    i++;.    
1ac40 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
1ac50 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69  "-key")==0 ){.#i
1ac60 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ac70 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21  _HAS_CODEC) && !
1ac80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ac90 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54  MIT_CODEC_FROM_T
1aca0 43 4c 29 0a 20 20 20 20 20 20 70 4b 65 79 20 3d  CL).      pKey =
1acb0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
1acc0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 5d  yFromObj(objv[i]
1acd0 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66  , &nKey);.#endif
1ace0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1acf0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66  trcmp(zArg, "-vf
1ad00 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
1ad10 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  zVfs = Tcl_GetSt
1ad20 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20  ring(objv[i]);. 
1ad30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1ad40 63 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65 61 64  cmp(zArg, "-read
1ad50 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  only")==0 ){.   
1ad60 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
1ad70 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
1ad80 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
1ad90 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29 20 29  , objv[i], &b) )
1ada0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1adb0 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
1adc0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
1add0 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
1ade0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1adf0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
1ae00 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
1ae10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1ae20 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
1ae30 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
1ae40 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
1ae50 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
1ae60 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
1ae70 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1ae80 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
1ae90 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1aea0 28 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22  (zArg, "-create"
1aeb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
1aec0 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
1aed0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
1aee0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1aef0 76 5b 69 5d 2c 20 26 62 29 20 29 20 72 65 74 75  v[i], &b) ) retu
1af00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1af10 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c      if( b && (fl
1af20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1af30 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29  N_READONLY)==0 )
1af40 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
1af50 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  |= SQLITE_OPEN_C
1af60 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c  REATE;.      }el
1af70 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
1af80 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
1af90 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
1afa0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1afb0 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e  strcmp(zArg, "-n
1afc0 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  omutex")==0 ){. 
1afd0 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
1afe0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
1aff0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
1b000 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29  rp, objv[i], &b)
1b010 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b020 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
1b030 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
1b040 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1b050 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  _NOMUTEX;.      
1b060 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
1b070 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
1b080 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  X;.      }else{.
1b090 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
1b0a0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f   ~SQLITE_OPEN_NO
1b0b0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20  MUTEX;.      }. 
1b0c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1b0d0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c  cmp(zArg, "-full
1b0e0 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  mutex")==0 ){.  
1b0f0 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
1b100 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
1b110 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
1b120 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29 20  p, objv[i], &b) 
1b130 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b140 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
1b150 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
1b160 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
1b170 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
1b180 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
1b190 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
1b1a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b1b0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
1b1c0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c  ~SQLITE_OPEN_FUL
1b1d0 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a  LMUTEX;.      }.
1b1e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1b1f0 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75 72 69  rcmp(zArg, "-uri
1b200 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
1b210 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
1b220 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
1b230 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1b240 6a 76 5b 69 5d 2c 20 26 62 29 20 29 20 72 65 74  jv[i], &b) ) ret
1b250 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b260 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
1b270 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
1b280 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
1b290 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b2a0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
1b2b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
1b2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1b2d0 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
1b2e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b2f0 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "unknown optio
1b300 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61  n: ", zArg, (cha
1b310 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
1b320 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b330 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 4d     }.  }.  zErrM
1b340 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53  sg = 0;.  p = (S
1b350 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c  qliteDb*)Tcl_All
1b360 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
1b370 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
1b380 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1b390 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 20 7a  if( zFile==0 ) z
1b3a0 46 69 6c 65 20 3d 20 22 22 3b 0a 20 20 7a 46 69  File = "";.  zFi
1b3b0 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61  le = Tcl_Transla
1b3c0 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72  teFileName(inter
1b3d0 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73  p, zFile, &trans
1b3e0 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
1b3f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
1b400 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70  pen_v2(zFile, &p
1b410 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66  ->db, flags, zVf
1b420 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  s);.  Tcl_DStrin
1b430 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65  gFree(&translate
1b440 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  dFilename);.  if
1b450 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69  ( p->db ){.    i
1b460 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1b470 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
1b480 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 45  >db) ){.      zE
1b490 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
1b4a0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
1b4b0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
1b4c0 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db));.      sqli
1b4d0 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
1b4e0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20 3d 20  ;.      p->db = 
1b4f0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
1b500 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  {.    zErrMsg = 
1b510 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1b520 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
1b530 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 23  rstr(rc));.  }.#
1b540 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1b550 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
1b560 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b570 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
1b580 54 43 4c 29 0a 20 20 69 66 28 20 70 2d 3e 64 62  TCL).  if( p->db
1b590 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1b5a0 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c  key(p->db, pKey,
1b5b0 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64   nKey);.  }.#end
1b5c0 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
1b5d0 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
1b5e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1b5f0 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
1b600 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
1b610 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
1b620 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b630 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
1b640 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b650 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74    }.  p->maxStmt
1b660 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f   = NUM_PREPARED_
1b670 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 6f 70 65 6e  STMTS;.  p->open
1b680 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 20 26 20  Flags = flags & 
1b690 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
1b6a0 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
1b6b0 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20  nterp;.  zArg = 
1b6c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1b6d0 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1b6e0 3b 0a 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  ;.  if( DbUseNre
1b6f0 28 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52  () ){.    Tcl_NR
1b700 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1b710 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
1b720 6a 43 6d 64 41 64 61 70 74 6f 72 2c 20 44 62 4f  jCmdAdaptor, DbO
1b730 62 6a 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  bjCmd,.         
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b750 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
1b760 65 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eCmd);.  }else{.
1b770 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
1b780 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
1b790 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c   zArg, DbObjCmd,
1b7a0 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c   (char*)p, DbDel
1b7b0 65 74 65 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72  eteCmd);.  }.  r
1b7c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b7d0 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61  ./*.** Provide a
1b7e0 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53   dummy Tcl_InitS
1b7f0 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75  tubs if we are u
1b800 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  sing this as a s
1b810 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79  tatic.** library
1b820 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45  ..*/.#ifndef USE
1b830 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64  _TCL_STUBS.# und
1b840 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ef  Tcl_InitStub
1b850 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49  s.# define Tcl_I
1b860 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 20  nitStubs(a,b,c) 
1b870 54 43 4c 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  TCL_VERSION.#end
1b880 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
1b890 75 72 65 20 77 65 20 68 61 76 65 20 61 20 50 41  ure we have a PA
1b8a0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61  CKAGE_VERSION ma
1b8b0 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68  cro defined.  Th
1b8c0 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  is will be.** de
1b8d0 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61  fined automatica
1b8e0 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41 20 6d  lly by the TEA m
1b8f0 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74  akefile.  But ot
1b900 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a  her makefiles.**
1b910 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69   do not define i
1b920 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41  t..*/.#ifndef PA
1b930 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20  CKAGE_VERSION.# 
1b940 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56  define PACKAGE_V
1b950 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45  ERSION SQLITE_VE
1b960 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RSION.#endif../*
1b970 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
1b980 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a  his module..**.*
1b990 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c  * This Tcl modul
1b9a0 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
1b9b0 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c  a single new Tcl
1b9c0 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22   command named "
1b9d0 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e  sqlite"..** (Hen
1b9e0 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ce there is no n
1b9f0 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65  amespace.  There
1ba00 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1ba10 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63  using a namespac
1ba20 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65  e.** if the exte
1ba30 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c  nsion only suppl
1ba40 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65  ies one new name
1ba50 21 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22  !)  The "sqlite"
1ba60 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75   command is.** u
1ba70 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  sed to open a ne
1ba80 77 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  w SQLite databas
1ba90 65 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61  e.  See the DbMa
1baa0 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f  in() routine abo
1bab0 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  ve.** for additi
1bac0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1bad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58 54 45  ..**.** The EXTE
1bae0 52 4e 20 6d 61 63 72 6f 73 20 61 72 65 20 72 65  RN macros are re
1baf0 71 75 69 72 65 64 20 62 79 20 54 43 4c 20 69 6e  quired by TCL in
1bb00 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 6f   order to work o
1bb10 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58  n windows..*/.EX
1bb20 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
1bb30 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1bb40 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 69 6e 74   *interp){.  int
1bb50 20 72 63 20 3d 20 54 63 6c 5f 49 6e 69 74 53 74   rc = Tcl_InitSt
1bb60 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34  ubs(interp, "8.4
1bb70 22 2c 20 30 29 20 3f 20 54 43 4c 5f 4f 4b 20 3a  ", 0) ? TCL_OK :
1bb80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1bb90 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
1bba0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
1bbb0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
1bbc0 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
1bbd0 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
1bbe0 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  ain, 0, 0);.#ifn
1bbf0 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46  def SQLITE_3_SUF
1bc00 46 49 58 5f 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20  FIX_ONLY.    /* 
1bc10 54 68 65 20 22 73 71 6c 69 74 65 22 20 61 6c 69  The "sqlite" ali
1bc20 61 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74  as is undocument
1bc30 65 64 2e 20 20 49 74 20 69 73 20 68 65 72 65 20  ed.  It is here 
1bc40 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f 72 74 0a  only to support.
1bc50 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 73 63      ** legacy sc
1bc60 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20  ripts.  All new 
1bc70 73 63 72 69 70 74 73 20 73 68 6f 75 6c 64 20 75  scripts should u
1bc80 73 65 20 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c  se only the "sql
1bc90 69 74 65 33 22 0a 20 20 20 20 2a 2a 20 63 6f 6d  ite3".    ** com
1bca0 6d 61 6e 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  mand. */.    Tcl
1bcb0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
1bcc0 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
1bcd0 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  e", (Tcl_ObjCmdP
1bce0 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
1bcf0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0);.#endif.    r
1bd00 63 20 3d 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  c = Tcl_PkgProvi
1bd10 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
1bd20 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  te3", PACKAGE_VE
1bd30 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20 20 72 65  RSION);.  }.  re
1bd40 74 75 72 6e 20 72 63 3b 0a 7d 0a 45 58 54 45 52  turn rc;.}.EXTER
1bd50 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
1bd60 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1bd70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
1bd80 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
1bd90 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
1bda0 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c   int Sqlite3_Unl
1bdb0 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
1bdc0 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
1bdd0 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
1bde0 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
1bdf0 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61  Tclsqlite3_Unloa
1be00 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
1be10 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
1be20 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
1be30 20 7d 0a 0a 2f 2a 20 42 65 63 61 75 73 65 20 69   }../* Because i
1be40 74 20 61 63 63 65 73 73 65 73 20 74 68 65 20 66  t accesses the f
1be50 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64 20 75  ile-system and u
1be60 73 65 73 20 70 65 72 73 69 73 74 65 6e 74 20 73  ses persistent s
1be70 74 61 74 65 2c 20 53 51 4c 69 74 65 0a 2a 2a 20  tate, SQLite.** 
1be80 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
1be90 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  d appropriate fo
1bea0 72 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  r safe interpret
1beb0 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ers.  Hence, we 
1bec0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 5f 53 61  cause.** the _Sa
1bed0 66 65 49 6e 69 74 28 29 20 69 6e 74 65 72 66 61  feInit() interfa
1bee0 63 65 73 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ces return TCL_E
1bef0 52 52 4f 52 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20  RROR..*/.EXTERN 
1bf00 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65  int Sqlite3_Safe
1bf10 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1bf20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
1bf30 20 54 43 4c 5f 45 52 52 4f 52 3b 20 7d 0a 45 58   TCL_ERROR; }.EX
1bf40 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
1bf50 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f  _SafeUnload(Tcl_
1bf60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1bf70 69 6e 74 20 66 6c 61 67 73 29 7b 72 65 74 75 72  int flags){retur
1bf80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 7d 0a 0a 0a  n TCL_ERROR;}...
1bf90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bfa0 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e  3_SUFFIX_ONLY.in
1bfb0 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
1bfc0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1bfd0 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
1bfe0 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
1bff0 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
1c000 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1c010 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
1c020 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
1c030 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c  terp); }.int Sql
1c040 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  ite_Unload(Tcl_I
1c050 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1c060 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
1c070 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20  n TCL_OK; }.int 
1c080 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64  Tclsqlite_Unload
1c090 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1c0a0 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
1c0b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1c0c0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1c0d0 49 66 20 74 68 65 20 54 43 4c 53 48 20 6d 61 63  If the TCLSH mac
1c0e0 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ro is defined, a
1c0f0 64 64 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20  dd code to make 
1c100 61 20 73 74 61 6e 64 2d 61 6c 6f 6e 65 20 70 72  a stand-alone pr
1c110 6f 67 72 61 6d 2e 0a 2a 2f 0a 23 69 66 20 64 65  ogram..*/.#if de
1c120 66 69 6e 65 64 28 54 43 4c 53 48 29 0a 0a 2f 2a  fined(TCLSH)../*
1c130 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   This is the mai
1c140 6e 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 6e  n routine for an
1c150 20 6f 72 64 69 6e 61 72 79 20 54 43 4c 20 73 68   ordinary TCL sh
1c160 65 6c 6c 2e 20 20 49 66 20 74 68 65 72 65 20 61  ell.  If there a
1c170 72 65 0a 2a 2a 20 61 72 65 20 61 72 67 75 6d 65  re.** are argume
1c180 6e 74 73 2c 20 72 75 6e 20 74 68 65 20 66 69 72  nts, run the fir
1c190 73 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61  st argument as a
1c1a0 20 73 63 72 69 70 74 2e 20 20 4f 74 68 65 72 77   script.  Otherw
1c1b0 69 73 65 2c 0a 2a 2a 20 72 65 61 64 20 54 43 4c  ise,.** read TCL
1c1c0 20 63 6f 6d 6d 61 6e 64 73 20 66 72 6f 6d 20 73   commands from s
1c1d0 74 61 6e 64 61 72 64 20 69 6e 70 75 74 0a 2a 2f  tandard input.*/
1c1e0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1c1f0 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c  ar *tclsh_main_l
1c200 6f 6f 70 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  oop(void){.  sta
1c210 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
1c220 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20  Mainloop[] =.   
1c230 20 22 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24   "if {[llength $
1c240 61 72 67 76 5d 3e 3d 31 7d 20 7b 5c 6e 22 0a 20  argv]>=1} {\n". 
1c250 20 20 20 20 20 22 73 65 74 20 61 72 67 76 30 20       "set argv0 
1c260 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 30 5d  [lindex $argv 0]
1c270 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 61  \n".      "set a
1c280 72 67 76 20 5b 6c 72 61 6e 67 65 20 24 61 72 67  rgv [lrange $arg
1c290 76 20 31 20 65 6e 64 5d 5c 6e 22 0a 20 20 20 20  v 1 end]\n".    
1c2a0 20 20 22 73 6f 75 72 63 65 20 24 61 72 67 76 30    "source $argv0
1c2b0 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20  \n".    "} else 
1c2c0 7b 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20  {\n".      "set 
1c2d0 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20  line {}\n".     
1c2e0 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73   "while {![eof s
1c2f0 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  tdin]} {\n".    
1c300 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d      "if {$line!=
1c310 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
1c320 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
1c330 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a  wline \"> \"\n".
1c340 20 20 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20          "} else 
1c350 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22  {\n".          "
1c360 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1c370 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20  \"% \"\n".      
1c380 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20    "}\n".        
1c390 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
1c3a0 0a 20 20 20 20 20 20 20 20 22 61 70 70 65 6e 64  .        "append
1c3b0 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69   line [gets stdi
1c3c0 6e 5d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 69  n]\n".        "i
1c3d0 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  f {[info complet
1c3e0 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20  e $line]} {\n". 
1c3f0 20 20 20 20 20 20 20 20 20 22 69 66 20 7b 5b 63           "if {[c
1c400 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30  atch {uplevel #0
1c410 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d   $line} result]}
1c420 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20   {\n".          
1c430 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c    "puts stderr \
1c440 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c  "Error: $result\
1c450 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22  "\n".          "
1c460 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c  } elseif {$resul
1c470 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20  t!=\"\"} {\n".  
1c480 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20            "puts 
1c490 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20  $result\n".     
1c4a0 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20       "}\n".     
1c4b0 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
1c4c0 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 20  }\n".        "} 
1c4d0 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
1c4e0 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
1c4f0 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 20 20   \\n\n".        
1c500 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  "}\n".      "}\n
1c510 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a  ".    "}\n".  ;.
1c520 20 20 72 65 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f    return zMainlo
1c530 6f 70 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 54  op;.}..#define T
1c540 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20  CLSH_MAIN main  
1c550 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61   /* Needed to fa
1c560 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20  ke out mktclapp 
1c570 2a 2f 0a 69 6e 74 20 53 51 4c 49 54 45 5f 43 44  */.int SQLITE_CD
1c580 45 43 4c 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69  ECL TCLSH_MAIN(i
1c590 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
1c5a0 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  argv){.  Tcl_Int
1c5b0 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 69  erp *interp;.  i
1c5c0 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
1c5d0 61 72 20 2a 7a 53 63 72 69 70 74 20 3d 20 30 3b  ar *zScript = 0;
1c5e0 0a 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32  .  char zArgc[32
1c5f0 5d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54  ];.#if defined(T
1c600 43 4c 53 48 5f 49 4e 49 54 5f 50 52 4f 43 29 0a  CLSH_INIT_PROC).
1c610 20 20 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63    extern const c
1c620 68 61 72 20 2a 54 43 4c 53 48 5f 49 4e 49 54 5f  har *TCLSH_INIT_
1c630 50 52 4f 43 28 54 63 6c 5f 49 6e 74 65 72 70 2a  PROC(Tcl_Interp*
1c640 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  );.#endif..#if !
1c650 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
1c660 43 45 29 0a 20 20 69 66 28 20 67 65 74 65 6e 76  CE).  if( getenv
1c670 28 22 42 52 45 41 4b 22 29 20 29 7b 0a 20 20 20  ("BREAK") ){.   
1c680 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1c690 0a 20 20 20 20 20 20 20 20 22 61 74 74 61 63 68  .        "attach
1c6a0 20 64 65 62 75 67 67 65 72 20 74 6f 20 70 72 6f   debugger to pro
1c6b0 63 65 73 73 20 25 64 20 61 6e 64 20 70 72 65 73  cess %d and pres
1c6c0 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 63 6f 6e  s any key to con
1c6d0 74 69 6e 75 65 2e 5c 6e 22 2c 0a 20 20 20 20 20  tinue.\n",.     
1c6e0 20 20 20 47 45 54 50 49 44 28 29 29 3b 0a 20 20     GETPID());.  
1c6f0 20 20 66 67 65 74 63 28 73 74 64 69 6e 29 3b 0a    fgetc(stdin);.
1c700 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1c710 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68   Call sqlite3_sh
1c720 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20 62 65  utdown() once be
1c730 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
1c740 69 6e 67 20 65 6c 73 65 2e 20 54 68 69 73 20 69  ing else. This i
1c750 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74 20 74  s to.  ** test t
1c760 68 61 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  hat sqlite3_shut
1c770 64 6f 77 6e 28 29 20 63 61 6e 20 62 65 20 73 61  down() can be sa
1c780 66 65 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 61  fely called by a
1c790 20 70 72 6f 63 65 73 73 20 62 65 66 6f 72 65 0a   process before.
1c7a0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1c7b0 74 69 61 6c 69 7a 65 28 29 20 69 73 2e 20 2a 2f  tialize() is. */
1c7c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  .  sqlite3_shutd
1c7d0 6f 77 6e 28 29 3b 0a 0a 20 20 54 63 6c 5f 46 69  own();..  Tcl_Fi
1c7e0 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61 72 67  ndExecutable(arg
1c7f0 76 5b 30 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74  v[0]);.  Tcl_Set
1c800 53 79 73 74 65 6d 45 6e 63 6f 64 69 6e 67 28 4e  SystemEncoding(N
1c810 55 4c 4c 2c 20 22 75 74 66 2d 38 22 29 3b 0a 20  ULL, "utf-8");. 
1c820 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72   interp = Tcl_Cr
1c830 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20  eateInterp();.  
1c840 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
1c850 65 72 70 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  erp);..  sqlite3
1c860 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1c870 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20  (zArgc), zArgc, 
1c880 22 25 64 22 2c 20 61 72 67 63 2d 31 29 3b 0a 20  "%d", argc-1);. 
1c890 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1c8a0 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67 63  rp,"argc", zArgc
1c8b0 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
1c8c0 59 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  Y);.  Tcl_SetVar
1c8d0 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c  (interp,"argv0",
1c8e0 61 72 67 76 5b 30 5d 2c 54 43 4c 5f 47 4c 4f 42  argv[0],TCL_GLOB
1c8f0 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f  AL_ONLY);.  Tcl_
1c900 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
1c910 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c  rgv", "", TCL_GL
1c920 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 66 6f  OBAL_ONLY);.  fo
1c930 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=1; i<argc; i
1c940 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ++){.    Tcl_Set
1c950 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67  Var(interp, "arg
1c960 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20  v", argv[i],.   
1c970 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f       TCL_GLOBAL_
1c980 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f  ONLY | TCL_LIST_
1c990 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50  ELEMENT | TCL_AP
1c9a0 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 7d  PEND_VALUE);.  }
1c9b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c  .#if defined(TCL
1c9c0 53 48 5f 49 4e 49 54 5f 50 52 4f 43 29 0a 20 20  SH_INIT_PROC).  
1c9d0 7a 53 63 72 69 70 74 20 3d 20 54 43 4c 53 48 5f  zScript = TCLSH_
1c9e0 49 4e 49 54 5f 50 52 4f 43 28 69 6e 74 65 72 70  INIT_PROC(interp
1c9f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
1ca00 7a 53 63 72 69 70 74 3d 3d 30 20 29 7b 0a 20 20  zScript==0 ){.  
1ca10 20 20 7a 53 63 72 69 70 74 20 3d 20 74 63 6c 73    zScript = tcls
1ca20 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29 3b 0a 20  h_main_loop();. 
1ca30 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 6c 6f   }.  if( Tcl_Glo
1ca40 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  balEval(interp, 
1ca50 7a 53 63 72 69 70 74 29 21 3d 54 43 4c 5f 4f 4b  zScript)!=TCL_OK
1ca60 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1ca70 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f  ar *zInfo = Tcl_
1ca80 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  GetVar(interp, "
1ca90 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f  errorInfo", TCL_
1caa0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
1cab0 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29    if( zInfo==0 )
1cac0 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74   zInfo = Tcl_Get
1cad0 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
1cae0 65 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  erp);.    fprint
1caf0 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73  f(stderr,"%s: %s
1cb00 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66  \n", *argv, zInf
1cb10 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  o);.    return 1
1cb20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1cb30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43  ;.}.#endif /* TC
1cb40 4c 53 48 20 2a 2f 0a                             LSH */.