/ Hex Artifact Content
Login

Artifact e0bf71a6d24b8c23393c000abffab05979bbca2a72d0b0f79260e2cf1527fda5:


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 73 69  2).# include <si
0680: 67 6e 61 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  gnal.h>.# includ
0690: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 64  e <unistd.h>.# d
06a0: 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65 74  efine GETPID get
06b0: 70 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69 6e  pid.#elif !defin
06c0: 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 23  ed(_WIN32_WCE).#
06d0: 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41   ifndef SQLITE_A
06e0: 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20 69  MALGAMATION.#  i
06f0: 66 6e 64 65 66 20 57 49 4e 33 32 5f 4c 45 41 4e  fndef WIN32_LEAN
0700: 5f 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 20 64 65  _AND_MEAN.#   de
0710: 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f  fine WIN32_LEAN_
0720: 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 65 6e 64 69  AND_MEAN.#  endi
0730: 66 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 77 69  f.#  include <wi
0740: 6e 64 6f 77 73 2e 68 3e 0a 23 20 65 6e 64 69 66  ndows.h>.# endif
0750: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68  .# include <io.h
0760: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0770: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0780: 23 20 64 65 66 69 6e 65 20 47 45 54 50 49 44 20  # define GETPID 
0790: 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50  (int)GetCurrentP
07a0: 72 6f 63 65 73 73 49 64 0a 23 65 6e 64 69 66 0a  rocessId.#endif.
07b0: 0a 2f 2a 0a 20 2a 20 57 69 6e 64 6f 77 73 20 6e  ./*. * Windows n
07c0: 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 69  eeds to know whi
07d0: 63 68 20 73 79 6d 62 6f 6c 73 20 74 6f 20 65 78  ch symbols to ex
07e0: 70 6f 72 74 2e 20 20 55 6e 69 78 20 64 6f 65 73  port.  Unix does
07f0: 20 6e 6f 74 2e 0a 20 2a 20 42 55 49 4c 44 5f 73   not.. * BUILD_s
0800: 71 6c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20  qlite should be 
0810: 75 6e 64 65 66 69 6e 65 64 20 66 6f 72 20 55 6e  undefined for Un
0820: 69 78 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 42  ix.. */.#ifdef B
0830: 55 49 4c 44 5f 73 71 6c 69 74 65 0a 23 75 6e 64  UILD_sqlite.#und
0840: 65 66 20 54 43 4c 5f 53 54 4f 52 41 47 45 5f 43  ef TCL_STORAGE_C
0850: 4c 41 53 53 0a 23 64 65 66 69 6e 65 20 54 43 4c  LASS.#define TCL
0860: 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 20 44  _STORAGE_CLASS D
0870: 4c 4c 45 58 50 4f 52 54 0a 23 65 6e 64 69 66 20  LLEXPORT.#endif 
0880: 2f 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20  /* BUILD_sqlite 
0890: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f  */..#define NUM_
08a0: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31  PREPARED_STMTS 1
08b0: 30 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 52  0.#define MAX_PR
08c0: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 31 30 30  EPARED_STMTS 100
08d0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
08e0: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 74 79 70 65  laration */.type
08f0: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 69 74  def struct Sqlit
0900: 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a 0a 2f  eDb SqliteDb;../
0910: 2a 0a 2a 2a 20 4e 65 77 20 53 51 4c 20 66 75 6e  *.** New SQL fun
0920: 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 72  ctions can be cr
0930: 65 61 74 65 64 20 61 73 20 54 43 4c 20 73 63 72  eated as TCL scr
0940: 69 70 74 73 2e 20 20 45 61 63 68 20 73 75 63 68  ipts.  Each such
0950: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
0960: 64 65 73 63 72 69 62 65 64 20 62 79 20 61 6e 20  described by an 
0970: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0980: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0990: 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ure..*/.typedef 
09a0: 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20 53  struct SqlFunc S
09b0: 71 6c 46 75 6e 63 3b 0a 73 74 72 75 63 74 20 53  qlFunc;.struct S
09c0: 71 6c 46 75 6e 63 20 7b 0a 20 20 54 63 6c 5f 49  qlFunc {.  Tcl_I
09d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20  nterp *interp;  
09e0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
09f0: 72 70 72 65 74 20 74 6f 20 65 78 65 63 75 74 65  rpret to execute
0a00: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
0a10: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
0a20: 69 70 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ipt;     /* The 
0a30: 54 63 6c 5f 4f 62 6a 20 72 65 70 72 65 73 65 6e  Tcl_Obj represen
0a40: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  tation of the sc
0a50: 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 69 74 65  ript */.  Sqlite
0a60: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
0a70: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
0a80: 65 63 74 69 6f 6e 20 74 68 61 74 20 6f 77 6e 73  ection that owns
0a90: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
0aa0: 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c 4f  /.  int useEvalO
0ab0: 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  bjv;      /* Tru
0ac0: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
0ad0: 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f  to use Tcl_EvalO
0ae0: 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  bjv */.  char *z
0af0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Name;          /
0b00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  * Name of this f
0b10: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c  unction */.  Sql
0b20: 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20  Func *pNext;    
0b30: 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74     /* Next funct
0b40: 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ion on the list 
0b50: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d  of them all */.}
0b60: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c  ;../*.** New col
0b70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
0b80: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65   function can be
0b90: 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20   created as TCL 
0ba0: 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73  scripts.  Each s
0bb0: 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  uch.** function 
0bc0: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0bd0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0be0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0bf0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0c00: 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c  ef struct SqlCol
0c10: 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b  late SqlCollate;
0c20: 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61  .struct SqlColla
0c30: 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  te {.  Tcl_Inter
0c40: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
0c50: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
0c60: 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  t to execute the
0c70: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
0c80: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20  har *zScript;   
0c90: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69       /* The scri
0ca0: 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  pt to be run */.
0cb0: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e    SqlCollate *pN
0cc0: 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  ext;    /* Next 
0cd0: 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  function on the 
0ce0: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
0cf0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
0d00: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
0d10: 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f 72  s are cached for
0d20: 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69 6f   faster executio
0d30: 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72 65  n.  Each prepare
0d40: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69  d.** statement i
0d50: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
0d60: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0d70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0d80: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
0d90: 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  f struct SqlPrep
0da0: 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65 70  aredStmt SqlPrep
0db0: 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63 74  aredStmt;.struct
0dc0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0dd0: 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64   {.  SqlPrepared
0de0: 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  Stmt *pNext;  /*
0df0: 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64 20   Next in linked 
0e00: 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  list */.  SqlPre
0e10: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 76  paredStmt *pPrev
0e20: 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6f  ;  /* Previous o
0e30: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
0e40: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0e50: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  tmt;     /* The 
0e60: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0e70: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c  nt */.  int nSql
0e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0e90: 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53 71   /* chars in zSq
0ea0: 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  l[] */.  const c
0eb0: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
0ec0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
0ed0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
0ee0: 2f 0a 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20  /.  int nParm;  
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f00: 53 69 7a 65 20 6f 66 20 61 70 50 61 72 6d 20 61  Size of apParm a
0f10: 72 72 61 79 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  rray */.  Tcl_Ob
0f20: 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20 20  j **apParm;     
0f30: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
0f40: 65 66 65 72 65 6e 63 65 64 20 6f 62 6a 65 63 74  eferenced object
0f50: 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 7d 3b 0a   pointers */.};.
0f60: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0f70: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
0f80: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 3b  IncrblobChannel;
0f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ../*.** There is
0fa0: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
0fb0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0fc0: 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20  for each SQLite 
0fd0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74  database.** that
0fe0: 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
0ff0: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54   by the SQLite T
1000: 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  CL interface..**
1010: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64 75  .** If this modu
1020: 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74 68  le is built with
1030: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66   SQLITE_TEST def
1040: 69 6e 65 64 20 28 74 6f 20 63 72 65 61 74 65 20  ined (to create 
1050: 74 68 65 20 53 51 4c 69 74 65 0a 2a 2a 20 74 65  the SQLite.** te
1060: 73 74 66 69 78 74 75 72 65 20 65 78 65 63 75 74  stfixture execut
1070: 61 62 6c 65 29 2c 20 74 68 65 6e 20 69 74 20 6d  able), then it m
1080: 61 79 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64  ay be configured
1090: 20 74 6f 20 75 73 65 20 65 69 74 68 65 72 0a 2a   to use either.*
10a0: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
10b0: 65 5f 76 32 28 29 20 6f 72 20 73 71 6c 69 74 65  e_v2() or sqlite
10c0: 33 5f 70 72 65 70 61 72 65 28 29 20 74 6f 20 70  3_prepare() to p
10d0: 72 65 70 61 72 65 20 53 51 4c 20 73 74 61 74 65  repare SQL state
10e0: 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 53 71 6c  ments..** If Sql
10f0: 69 74 65 44 62 2e 62 4c 65 67 61 63 79 50 72 65  iteDb.bLegacyPre
1100: 70 61 72 65 20 69 73 20 74 72 75 65 2c 20 73 71  pare is true, sq
1110: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
1120: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 72 75  is used..*/.stru
1130: 63 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20  ct SqliteDb {.  
1140: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
1150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1160: 65 20 22 72 65 61 6c 22 20 64 61 74 61 62 61 73  e "real" databas
1170: 65 20 73 74 72 75 63 74 75 72 65 2e 20 4d 55 53  e structure. MUS
1180: 54 20 42 45 20 46 49 52 53 54 20 2a 2f 0a 20 20  T BE FIRST */.  
1190: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11a0: 72 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  rp;        /* Th
11b0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 75 73  e interpreter us
11c0: 65 64 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ed for this data
11d0: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
11e0: 7a 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20  zBusy;          
11f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 75 73 79       /* The busy
1200: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
1210: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  e */.  char *zCo
1220: 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
1230: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 69 74 20    /* The commit 
1240: 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hook callback ro
1250: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
1260: 2a 7a 54 72 61 63 65 3b 20 20 20 20 20 20 20 20  *zTrace;        
1270: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61        /* The tra
1280: 63 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  ce callback rout
1290: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
12a0: 54 72 61 63 65 56 32 3b 20 20 20 20 20 20 20 20  TraceV2;        
12b0: 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65      /* The trace
12c0: 5f 76 32 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  _v2 callback rou
12d0: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
12e0: 7a 50 72 6f 66 69 6c 65 3b 20 20 20 20 20 20 20  zProfile;       
12f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 66       /* The prof
1300: 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ile callback rou
1310: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
1320: 7a 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20  zProgress;      
1330: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 67       /* The prog
1340: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f  ress callback ro
1350: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
1360: 2a 7a 41 75 74 68 3b 20 20 20 20 20 20 20 20 20  *zAuth;         
1370: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
1380: 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62  horization callb
1390: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
13a0: 20 69 6e 74 20 64 69 73 61 62 6c 65 41 75 74 68   int disableAuth
13b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
13c0: 69 73 61 62 6c 65 20 74 68 65 20 61 75 74 68 6f  isable the autho
13d0: 72 69 7a 65 72 20 69 66 20 69 74 20 65 78 69 73  rizer if it exis
13e0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ts */.  char *zN
13f0: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
1400: 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 73 75     /* Text to su
1410: 62 73 74 69 74 75 74 65 20 66 6f 72 20 61 6e 20  bstitute for an 
1420: 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  SQL NULL value *
1430: 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75  /.  SqlFunc *pFu
1440: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nc;            /
1450: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 66 75  * List of SQL fu
1460: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 54 63 6c  nctions */.  Tcl
1470: 5f 4f 62 6a 20 2a 70 55 70 64 61 74 65 48 6f 6f  _Obj *pUpdateHoo
1480: 6b 3b 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  k;      /* Updat
1490: 65 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69  e hook script (i
14a0: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f  f any) */.  Tcl_
14b0: 4f 62 6a 20 2a 70 50 72 65 55 70 64 61 74 65 48  Obj *pPreUpdateH
14c0: 6f 6f 6b 3b 20 20 20 2f 2a 20 50 72 65 2d 75 70  ook;   /* Pre-up
14d0: 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70 74  date hook script
14e0: 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54   (if any) */.  T
14f0: 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62 61 63  cl_Obj *pRollbac
1500: 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52 6f 6c  kHook;    /* Rol
1510: 6c 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72 69 70  lback hook scrip
1520: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
1530: 54 63 6c 5f 4f 62 6a 20 2a 70 57 61 6c 48 6f 6f  Tcl_Obj *pWalHoo
1540: 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 41  k;         /* WA
1550: 4c 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69  L hook script (i
1560: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f  f any) */.  Tcl_
1570: 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b 4e 6f 74 69  Obj *pUnlockNoti
1580: 66 79 3b 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  fy;    /* Unlock
1590: 20 6e 6f 74 69 66 79 20 73 63 72 69 70 74 20 28   notify script (
15a0: 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c  if any) */.  Sql
15b0: 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74  Collate *pCollat
15c0: 65 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  e;      /* List 
15d0: 6f 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  of SQL collation
15e0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
15f0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1610: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73  turn code of mos
1620: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
1630: 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c  _exec() */.  Tcl
1640: 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65  _Obj *pCollateNe
1650: 65 64 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61  eded;   /* Colla
1660: 74 69 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69  tion needed scri
1670: 70 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  pt */.  SqlPrepa
1680: 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73  redStmt *stmtLis
1690: 74 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72  t; /* List of pr
16a0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16b0: 73 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65  s*/.  SqlPrepare
16c0: 64 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b  dStmt *stmtLast;
16d0: 20 2f 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65   /* Last stateme
16e0: 6e 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  nt in the list *
16f0: 2f 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b  /.  int maxStmt;
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1710: 2a 20 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d  * The next maxim
1720: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d  um number of stm
1730: 74 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  tList */.  int n
1740: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
1750: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1760: 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  of statements in
1770: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 49   stmtList */.  I
1780: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1790: 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e  pIncrblob;/* Lin
17a0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  ked list of open
17b0: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
17c0: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65  ls */.  int nSte
17d0: 70 2c 20 6e 53 6f 72 74 2c 20 6e 49 6e 64 65 78  p, nSort, nIndex
17e0: 3b 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73  ;  /* Statistics
17f0: 20 66 6f 72 20 6d 6f 73 74 20 72 65 63 65 6e 74   for most recent
1800: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
1810: 69 6e 74 20 6e 56 4d 53 74 65 70 3b 20 20 20 20  int nVMStep;    
1820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1830: 6f 74 68 65 72 20 73 74 61 74 69 73 74 69 63 20  other statistic 
1840: 66 6f 72 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  for most recent 
1850: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
1860: 6e 74 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  nt nTransaction;
1870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1880: 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 5b 74  ber of nested [t
1890: 72 61 6e 73 61 63 74 69 6f 6e 5d 20 6d 65 74 68  ransaction] meth
18a0: 6f 64 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65  ods */.  int ope
18b0: 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  nFlags;         
18c0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 75 73 65      /* Flags use
18d0: 64 20 74 6f 20 6f 70 65 6e 2e 20 20 28 53 51 4c  d to open.  (SQL
18e0: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 2a 2f  ITE_OPEN_URI) */
18f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1900: 45 53 54 0a 20 20 69 6e 74 20 62 4c 65 67 61 63  EST.  int bLegac
1910: 79 50 72 65 70 61 72 65 3b 20 20 20 20 20 20 20  yPrepare;       
1920: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
1930: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
1940: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  ) */.#endif.};..
1950: 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43  struct IncrblobC
1960: 68 61 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74  hannel {.  sqlit
1970: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20  e3_blob *pBlob; 
1980: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20       /* sqlite3 
1990: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  blob handle */. 
19a0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20   SqliteDb *pDb; 
19b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
19c0: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
19d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
19e0: 20 20 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20    int iSeek;    
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1a00: 75 72 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73  urrent seek offs
1a10: 65 74 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e  et */.  Tcl_Chan
1a20: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20  nel channel;    
1a30: 20 20 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65    /* Channel ide
1a40: 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63  ntifier */.  Inc
1a50: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e  rblobChannel *pN
1a60: 65 78 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64  ext;   /* Linked
1a70: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65   list of all ope
1a80: 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  n incrblob chann
1a90: 65 6c 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  els */.  Incrblo
1aa0: 62 43 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b  bChannel *pPrev;
1ab0: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
1ac0: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e  t of all open in
1ad0: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20  crblob channels 
1ae0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
1af0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65  pute a string le
1b00: 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d  ngth that is lim
1b10: 69 74 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e  ited to what can
1b20: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   be stored in.**
1b30: 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f   lower 30 bits o
1b40: 66 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65  f a 32-bit signe
1b50: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  d integer..*/.st
1b60: 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33  atic int strlen3
1b70: 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  0(const char *z)
1b80: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1b90: 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28  z2 = z;.  while(
1ba0: 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a   *z2 ){ z2++; }.
1bb0: 20 20 72 65 74 75 72 6e 20 30 78 33 66 66 66 66    return 0x3ffff
1bc0: 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d  fff & (int)(z2 -
1bd0: 20 7a 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66   z);.}...#ifndef
1be0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1bf0: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  RBLOB./*.** Clos
1c00: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63  e all incrblob c
1c10: 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75  hannels opened u
1c20: 73 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  sing database co
1c30: 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a  nnection pDb..**
1c40: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
1c50: 77 68 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f  when shutting do
1c60: 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  wn the database 
1c70: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
1c80: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
1c90: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
1ca0: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b  (SqliteDb *pDb){
1cb0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1cc0: 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f  el *p;.  Incrblo
1cd0: 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b  bChannel *pNext;
1ce0: 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70  ..  for(p=pDb->p
1cf0: 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70  Incrblob; p; p=p
1d00: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
1d10: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
1d20: 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69    /* Note: Calli
1d30: 6e 67 20 75 6e 72 65 67 69 73 74 65 72 20 68 65  ng unregister he
1d40: 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73  re call Tcl_Clos
1d50: 65 20 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f  e on the incrblo
1d60: 62 20 63 68 61 6e 6e 65 6c 2c 0a 20 20 20 20 2a  b channel,.    *
1d70: 2a 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20  * which deletes 
1d80: 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  the IncrblobChan
1d90: 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 61 74  nel structure at
1da0: 20 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20   *p. So do not. 
1db0: 20 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46     ** call Tcl_F
1dc0: 72 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20 20  ree() here..    
1dd0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65 67  */.    Tcl_Unreg
1de0: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44 62  isterChannel(pDb
1df0: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61  ->interp, p->cha
1e00: 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  nnel);.  }.}../*
1e10: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63  .** Close an inc
1e20: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
1e30: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
1e40: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1e50: 50 49 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65  PI incrblobClose
1e60: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  (.  ClientData i
1e70: 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 54  nstanceData,.  T
1e80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1e90: 70 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  p.){.  IncrblobC
1ea0: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1eb0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1ec0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1ed0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1ee0: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42  blob_close(p->pB
1ef0: 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  lob);.  sqlite3 
1f00: 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62  *db = p->pDb->db
1f10: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  ;..  /* Remove t
1f20: 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20  he channel from 
1f30: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
1f40: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
1f50: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
1f60: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
1f70: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
1f80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1f90: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
1fa0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
1fb0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
1fc0: 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62  ( p->pDb->pIncrb
1fd0: 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d  lob==p ){.    p-
1fe0: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20  >pDb->pIncrblob 
1ff0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
2000: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 49  .  /* Free the I
2010: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
2020: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54 63  tructure */.  Tc
2030: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
2040: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
2050: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
2060: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
2070: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
2080: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
2090: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
20a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20b0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
20c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20d0: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
20e0: 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  om an incrementa
20f0: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
2100: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2110: 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63 72  LITE_TCLAPI incr
2120: 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43 6c 69  blobInput(.  Cli
2130: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2140: 44 61 74 61 2c 0a 20 20 63 68 61 72 20 2a 62 75  Data,.  char *bu
2150: 66 2c 0a 20 20 69 6e 74 20 62 75 66 53 69 7a 65  f,.  int bufSize
2160: 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f  ,.  int *errorCo
2170: 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62  dePtr.){.  Incrb
2180: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20  lobChannel *p = 
2190: 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  (IncrblobChannel
21a0: 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b   *)instanceData;
21b0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 62  .  int nRead = b
21c0: 75 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ufSize;         
21d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21e0: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
21f0: 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2210: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2220: 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20  e blob */.  int 
2230: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2240: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2250: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
2260: 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  nBlob = sqli
2270: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
2280: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  ->pBlob);.  if( 
2290: 28 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29  (p->iSeek+nRead)
22a0: 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52  >nBlob ){.    nR
22b0: 65 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69  ead = nBlob-p->i
22c0: 53 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Seek;.  }.  if( 
22d0: 6e 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20  nRead<=0 ){.    
22e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
22f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
2300: 6f 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62  ob_read(p->pBlob
2310: 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e  , (void *)buf, n
2320: 52 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  Read, p->iSeek);
2330: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2340: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
2350: 6f 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a  orCodePtr = rc;.
2360: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
2370: 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b   }..  p->iSeek +
2380: 3d 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75 72  = nRead;.  retur
2390: 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nRead;.}../*.*
23a0: 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20  * Write data to 
23b0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
23c0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
23d0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
23e0: 45 5f 54 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f  E_TCLAPI incrblo
23f0: 62 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e  bOutput(.  Clien
2400: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
2410: 74 61 2c 0a 20 20 43 4f 4e 53 54 20 63 68 61 72  ta,.  CONST char
2420: 20 2a 62 75 66 2c 0a 20 20 69 6e 74 20 74 6f 57   *buf,.  int toW
2430: 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  rite,.  int *err
2440: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
2450: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2460: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
2470: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
2480: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ata;.  int nWrit
2490: 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20  e = toWrite;    
24a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24b0: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
24c0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
24f0: 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20  of the blob */. 
2500: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2520: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
2530: 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d  de */..  nBlob =
2540: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
2550: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  tes(p->pBlob);. 
2560: 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e   if( (p->iSeek+n
2570: 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a  Write)>nBlob ){.
2580: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2590: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20  r = EINVAL;.    
25a0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
25b0: 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29   if( nWrite<=0 )
25c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
25d0: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
25e0: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70  te3_blob_write(p
25f0: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
2600: 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d  )buf, nWrite, p-
2610: 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72  >iSeek);.  if( r
2620: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2630: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2640: 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74  r = EIO;.    ret
2650: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70  urn -1;.  }..  p
2660: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74  ->iSeek += nWrit
2670: 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69  e;.  return nWri
2680: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  te;.}../*.** See
2690: 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  k an incremental
26a0: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a   blob channel..*
26b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
26c0: 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63 72 62  ITE_TCLAPI incrb
26d0: 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e  lobSeek(.  Clien
26e0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
26f0: 74 61 2c 0a 20 20 6c 6f 6e 67 20 6f 66 66 73 65  ta,.  long offse
2700: 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64  t,.  int seekMod
2710: 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  e,.  int *errorC
2720: 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72  odePtr.){.  Incr
2730: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d  blobChannel *p =
2740: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
2750: 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  l *)instanceData
2760: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 73 65 65  ;..  switch( see
2770: 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73  kMode ){.    cas
2780: 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20 20  e SEEK_SET:.    
2790: 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66 66    p->iSeek = off
27a0: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
27b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f  ;.    case SEEK_
27c0: 43 55 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53  CUR:.      p->iS
27d0: 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20  eek += offset;. 
27e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27f0: 63 61 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a 20  case SEEK_END:. 
2800: 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20       p->iSeek = 
2810: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
2820: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f  es(p->pBlob) + o
2830: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65  ffset;.      bre
2840: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
2850: 3a 20 61 73 73 65 72 74 28 21 22 42 61 64 20 73  : assert(!"Bad s
2860: 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a  eekMode");.  }..
2870: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 53 65 65    return p->iSee
2880: 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  k;.}...static vo
2890: 69 64 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  id SQLITE_TCLAPI
28a0: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 28 0a   incrblobWatch(.
28b0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
28c0: 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 69 6e 74  tanceData,.  int
28d0: 20 6d 6f 64 65 0a 29 7b 0a 20 20 2f 2a 20 4e 4f   mode.){.  /* NO
28e0: 2d 4f 50 20 2a 2f 0a 7d 0a 73 74 61 74 69 63 20  -OP */.}.static 
28f0: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2900: 49 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  I incrblobHandle
2910: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  (.  ClientData i
2920: 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 69  nstanceData,.  i
2930: 6e 74 20 64 69 72 2c 0a 20 20 43 6c 69 65 6e 74  nt dir,.  Client
2940: 44 61 74 61 20 2a 68 50 74 72 0a 29 7b 0a 20 20  Data *hPtr.){.  
2950: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2960: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f  ;.}..static Tcl_
2970: 43 68 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72  ChannelType Incr
2980: 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20  blobChannelType 
2990: 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22  = {.  "incrblob"
29a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65           /* type
29c0: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45   */.  TCL_CHANNE
29f0: 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20  L_VERSION_2,    
2a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73           /* vers
2a10: 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c   */.  incrblobCl
2a40: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
2a60: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e   */.  incrblobIn
2a90: 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  put,            
2aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75           /* inpu
2ab0: 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  tProc           
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75   */.  incrblobOu
2ae0: 74 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  tput,           
2af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70           /* outp
2b00: 75 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  utProc          
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65   */.  incrblobSe
2b30: 65 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ek,             
2b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b           /* seek
2b50: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f           /* setO
2ba0: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f           /* getO
2bf0: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61   */.  incrblobWa
2c20: 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
2c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63           /* watc
2c40: 68 50 72 6f 63 20 28 74 68 69 73 20 69 73 20 61  hProc (this is a
2c50: 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20   no-op)         
2c60: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61   */.  incrblobHa
2c70: 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  ndle,           
2c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48           /* getH
2c90: 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79  andleProc (alway
2ca0: 73 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29  s returns error)
2cb0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
2ce0: 65 32 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  e2Proc          
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63           /* bloc
2d30: 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20  kModeProc       
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73           /* flus
2d80: 68 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  hProc           
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64           /* hand
2dd0: 6c 65 72 50 72 6f 63 20 20 20 20 20 20 20 20 20  lerProc         
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65           /* wide
2e20: 53 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20  SeekProc        
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e40: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72   */.};../*.** Cr
2e50: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62  eate a new incrb
2e60: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
2e70: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
2e80: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
2e90: 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  (.  Tcl_Interp *
2ea0: 69 6e 74 65 72 70 2c 0a 20 20 53 71 6c 69 74 65  interp,.  Sqlite
2eb0: 44 62 20 2a 70 44 62 2c 0a 20 20 63 6f 6e 73 74  Db *pDb,.  const
2ec0: 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f   char *zDb,.  co
2ed0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
2ee0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2ef0: 7a 43 6f 6c 75 6d 6e 2c 0a 20 20 73 71 6c 69 74  zColumn,.  sqlit
2f00: 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20  e_int64 iRow,.  
2f10: 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29  int isReadonly.)
2f20: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2f30: 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  nel *p;.  sqlite
2f40: 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b  3 *db = pDb->db;
2f50: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
2f60: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63  *pBlob;.  int rc
2f70: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
2f80: 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73  TCL_READABLE|(is
2f90: 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54  Readonly ? 0 : T
2fa0: 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20  CL_WRITABLE);.. 
2fb0: 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c   /* This variabl
2fc0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d  e is used to nam
2fd0: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20  e the channels: 
2fe0: 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20  "incrblob_[incr 
2ff0: 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61  count]" */.  sta
3000: 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20  tic int count = 
3010: 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e  0;.  char zChann
3020: 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20  el[64];..  rc = 
3030: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
3040: 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c  n(db, zDb, zTabl
3050: 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77  e, zColumn, iRow
3060: 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26  , !isReadonly, &
3070: 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63  pBlob);.  if( rc
3080: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
3090: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
30a0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
30b0: 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
30c0: 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
30d0: 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74  LATILE);.    ret
30e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
30f0: 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62   }..  p = (Incrb
3100: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c  lobChannel *)Tcl
3110: 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e  _Alloc(sizeof(In
3120: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b  crblobChannel));
3130: 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b  .  p->iSeek = 0;
3140: 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42  .  p->pBlob = pB
3150: 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  lob;..  sqlite3_
3160: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3170: 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e  zChannel), zChan
3180: 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25  nel, "incrblob_%
3190: 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20  d", ++count);.  
31a0: 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  p->channel = Tcl
31b0: 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26  _CreateChannel(&
31c0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54  IncrblobChannelT
31d0: 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70  ype, zChannel, p
31e0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f  , flags);.  Tcl_
31f0: 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28  RegisterChannel(
3200: 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e  interp, p->chann
3210: 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  el);..  /* Link 
3220: 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20  the new channel 
3230: 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44  into the SqliteD
3240: 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74  b.pIncrblob list
3250: 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20  . */.  p->pNext 
3260: 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  = pDb->pIncrblob
3270: 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30  ;.  p->pPrev = 0
3280: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
3290: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
32a0: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d  ->pPrev = p;.  }
32b0: 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  .  pDb->pIncrblo
32c0: 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20  b = p;.  p->pDb 
32d0: 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65  = pDb;..  Tcl_Se
32e0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
32f0: 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43  (char *)Tcl_GetC
3300: 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68  hannelName(p->ch
3310: 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41  annel), TCL_VOLA
3320: 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
3330: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20  TCL_OK;.}.#else 
3340: 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20   /* else clause 
3350: 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c  for "#ifndef SQL
3360: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
3370: 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  B" */.  #define 
3380: 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61  closeIncrblobCha
3390: 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69  nnels(pDb).#endi
33a0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74  f../*.** Look at
33b0: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66   the script pref
33c0: 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20  ix in pCmd.  We 
33d0: 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e  will be executin
33e0: 67 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a  g this script.**
33f0: 20 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70   after first app
3400: 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f  ending one or mo
3410: 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  re arguments.  T
3420: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
3430: 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69  yzes.** the scri
3440: 70 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  pt to see if it 
3450: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
3460: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e  cl_EvalObjv() on
3470: 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72   the script.** r
3480: 61 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d  ather than the m
3490: 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f  ore general Tcl_
34a0: 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45  EvalEx().  Tcl_E
34b0: 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63  valObjv() is muc
34c0: 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  h.** faster..**.
34d0: 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20  ** Scripts that 
34e0: 61 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20  are safe to use 
34f0: 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  with Tcl_EvalObj
3500: 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  v() consists of 
3510: 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d  a.** command nam
3520: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  e followed by ze
3530: 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ro or more argum
3540: 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e  ents with no [..
3550: 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e  .] or $.** or {.
3560: 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73  ..} or ; to be s
3570: 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d  een anywhere.  M
3580: 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  ost callback scr
3590: 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20  ipts consist.** 
35a0: 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  of just a single
35b0: 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20   procedure name 
35c0: 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68  and they meet th
35d0: 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a  is requirement..
35e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
35f0: 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
3600: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3610: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  rp, Tcl_Obj *pCm
3620: 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c  d){.  /* We coul
3630: 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65  d try to do some
3640: 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50  thing with Tcl_P
3650: 61 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20  arse().  But we 
3660: 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a  will instead.  *
3670: 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72  * just do a sear
3680: 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e  ch for forbidden
3690: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66   characters.  If
36a0: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62   any of the forb
36b0: 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61  idden.  ** chara
36c0: 63 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20  cters appear in 
36d0: 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65  pCmd, we will re
36e0: 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  port the string 
36f0: 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a  as unsafe..  */.
3700: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
3710: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20  .  int n;.  z = 
3720: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3730: 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a  mObj(pCmd, &n);.
3740: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
3750: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20   ){.    int c = 
3760: 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  *(z++);.    if( 
3770: 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27  c=='$' || c=='['
3780: 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74   || c==';' ) ret
3790: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
37a0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
37b0: 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20  Find an SqlFunc 
37c0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74  structure with t
37d0: 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20  he given name.  
37e0: 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a  Or create a new.
37f0: 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69  ** one if an exi
3800: 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74  sting one cannot
3810: 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75   be found.  Retu
3820: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
3830: 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  the.** structure
3840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46  ..*/.static SqlF
3850: 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63  unc *findSqlFunc
3860: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20  (SqliteDb *pDb, 
3870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3880: 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70  e){.  SqlFunc *p
3890: 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  , *pNew;.  int n
38a0: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Name = strlen30(
38b0: 7a 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d  zName);.  pNew =
38c0: 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41   (SqlFunc*)Tcl_A
38d0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
38e0: 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20  ew) + nName + 1 
38f0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  );.  pNew->zName
3900: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
3910: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
3920: 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  w->zName, zName,
3930: 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72   nName+1);.  for
3940: 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70  (p=pDb->pFunc; p
3950: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
3960: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
3970: 74 72 69 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c  tricmp(p->zName,
3980: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30   pNew->zName)==0
3990: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72   ){.      Tcl_Fr
39a0: 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b  ee((char*)pNew);
39b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b  .      return p;
39c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
39d0: 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  w->interp = pDb-
39e0: 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d  >interp;.  pNew-
39f0: 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 4e  >pDb = pDb;.  pN
3a00: 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b  ew->pScript = 0;
3a10: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
3a20: 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70   pDb->pFunc;.  p
3a30: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77  Db->pFunc = pNew
3a40: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
3a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
3a60: 20 73 69 6e 67 6c 65 20 53 71 6c 50 72 65 70 61   single SqlPrepa
3a70: 72 65 64 53 74 6d 74 20 6f 62 6a 65 63 74 2e 0a  redStmt object..
3a80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
3a90: 62 46 72 65 65 53 74 6d 74 28 53 71 6c 50 72 65  bFreeStmt(SqlPre
3aa0: 70 61 72 65 64 53 74 6d 74 20 2a 70 53 74 6d 74  paredStmt *pStmt
3ab0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
3ac0: 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
3ad0: 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 2d 3e 70  te3_sql(pStmt->p
3ae0: 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Stmt)==0 ){.    
3af0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tcl_Free((char *
3b00: 29 70 53 74 6d 74 2d 3e 7a 53 71 6c 29 3b 0a 20  )pStmt->zSql);. 
3b10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
3b20: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
3b30: 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 54 63  mt->pStmt);.  Tc
3b40: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
3b50: 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
3b60: 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 66 72 65  Finalize and fre
3b70: 65 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65 70  e a list of prep
3b80: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a  ared statements.
3b90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
3ba0: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 53 71  lushStmtCache(Sq
3bb0: 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20  liteDb *pDb){.  
3bc0: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3bd0: 2a 70 50 72 65 53 74 6d 74 3b 0a 20 20 53 71 6c  *pPreStmt;.  Sql
3be0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
3bf0: 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65  ext;..  for(pPre
3c00: 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
3c10: 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20  List; pPreStmt; 
3c20: 70 50 72 65 53 74 6d 74 3d 70 4e 65 78 74 29 7b  pPreStmt=pNext){
3c30: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 72  .    pNext = pPr
3c40: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
3c50: 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 50 72    dbFreeStmt(pPr
3c60: 65 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 70 44  eStmt);.  }.  pD
3c70: 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  b->nStmt = 0;.  
3c80: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
3c90: 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  0;.  pDb->stmtLi
3ca0: 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  st = 0;.}../*.**
3cb0: 20 54 43 4c 20 63 61 6c 6c 73 20 74 68 69 73 20   TCL calls this 
3cc0: 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20 61  procedure when a
3cd0: 6e 20 73 71 6c 69 74 65 33 20 64 61 74 61 62 61  n sqlite3 databa
3ce0: 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  se command is.**
3cf0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
3d00: 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f  tic void SQLITE_
3d10: 54 43 4c 41 50 49 20 44 62 44 65 6c 65 74 65 43  TCLAPI DbDeleteC
3d20: 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20  md(void *db){.  
3d30: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
3d40: 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20  (SqliteDb*)db;. 
3d50: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
3d60: 70 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63  pDb);.  closeInc
3d70: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44  rblobChannels(pD
3d80: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  b);.  sqlite3_cl
3d90: 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  ose(pDb->db);.  
3da0: 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e  while( pDb->pFun
3db0: 63 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  c ){.    SqlFunc
3dc0: 20 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70   *pFunc = pDb->p
3dd0: 46 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70  Func;.    pDb->p
3de0: 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e  Func = pFunc->pN
3df0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
3e00: 20 70 46 75 6e 63 2d 3e 70 44 62 3d 3d 70 44 62   pFunc->pDb==pDb
3e10: 20 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   );.    Tcl_Decr
3e20: 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
3e30: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63  pScript);.    Tc
3e40: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46  l_Free((char*)pF
3e50: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  unc);.  }.  whil
3e60: 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  e( pDb->pCollate
3e70: 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61   ){.    SqlColla
3e80: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70  te *pCollate = p
3e90: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
3ea0: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
3eb0: 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78  = pCollate->pNex
3ec0: 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  t;.    Tcl_Free(
3ed0: 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29  (char*)pCollate)
3ee0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3ef0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63  >zBusy ){.    Tc
3f00: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
3f10: 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  y);.  }.  if( pD
3f20: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
3f30: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3f40: 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66  Trace);.  }.  if
3f50: 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20  ( pDb->zTraceV2 
3f60: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3f70: 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 29 3b 0a  pDb->zTraceV2);.
3f80: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
3f90: 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54  Profile ){.    T
3fa0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
3fb0: 6f 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  ofile);.  }.  if
3fc0: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
3fd0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3fe0: 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zAuth);.  }.  
3ff0: 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29  if( pDb->zNull )
4000: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
4010: 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  Db->zNull);.  }.
4020: 20 20 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61    if( pDb->pUpda
4030: 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63  teHook ){.    Tc
4040: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
4050: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29  Db->pUpdateHook)
4060: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
4070: 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 20  >pPreUpdateHook 
4080: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
4090: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 50 72  efCount(pDb->pPr
40a0: 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  eUpdateHook);.  
40b0: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52 6f  }.  if( pDb->pRo
40c0: 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20  llbackHook ){.  
40d0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
40e0: 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  nt(pDb->pRollbac
40f0: 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  kHook);.  }.  if
4100: 28 20 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 20  ( pDb->pWalHook 
4110: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
4120: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 57 61  efCount(pDb->pWa
4130: 6c 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  lHook);.  }.  if
4140: 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  ( pDb->pCollateN
4150: 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63 6c  eeded ){.    Tcl
4160: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
4170: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
4180: 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72  d);.  }.  Tcl_Fr
4190: 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a  ee((char*)pDb);.
41a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
41b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
41c0: 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
41d0: 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77  file is locked w
41e0: 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
41f0: 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a  o execute SQL..*
4200: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42  /.static int DbB
4210: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
4220: 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73 29  *cd, int nTries)
4230: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
4240: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
4250: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  d;.  int rc;.  c
4260: 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20  har zVal[30];.. 
4270: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4280: 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20  f(sizeof(zVal), 
4290: 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69  zVal, "%d", nTri
42a0: 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  es);.  rc = Tcl_
42b0: 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  VarEval(pDb->int
42c0: 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c  erp, pDb->zBusy,
42d0: 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61   " ", zVal, (cha
42e0: 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r*)0);.  if( rc!
42f0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
4300: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
4310: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
4320: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4330: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
4340: 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
4350: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
4360: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
4370: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4380: 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68 65  s invoked as the
4390: 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62   'progress callb
43a0: 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61 74  ack' for the dat
43b0: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
43c0: 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73 48   int DbProgressH
43d0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
43e0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
43f0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
4400: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
4410: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50 72  assert( pDb->zPr
4420: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20 3d  ogress );.  rc =
4430: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4440: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
4450: 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72 63  gress);.  if( rc
4460: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
4470: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
4480: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4490: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
44a0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
44b0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
44c0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
44d0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
44e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
44f0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
4500: 4f 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20 21  OINT) && \.    !
4510: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4520: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a  MIT_DEPRECATED).
4530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4540: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
4550: 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65  the SQLite trace
4560: 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65   handler wheneve
4570: 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b  r a new.** block
4580: 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63 75   of SQL is execu
4590: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
45a0: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72  ript in pDb->zTr
45b0: 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64 2e  ace is executed.
45c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
45d0: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76  DbTraceHandler(v
45e0: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
45f0: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71  har *zSql){.  Sq
4600: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4610: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4620: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4630: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
4640: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
4650: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
4660: 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  tr, pDb->zTrace,
4670: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
4680: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
4690: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
46a0: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
46b0: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
46c0: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
46d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
46e0: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
46f0: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
4700: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
4710: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4720: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
4730: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4740: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4750: 53 51 4c 69 74 65 20 74 72 61 63 65 5f 76 32 20  SQLite trace_v2 
4760: 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65 72  handler whenever
4770: 20 61 20 6e 65 77 0a 2a 2a 20 73 75 70 70 6f 72   a new.** suppor
4780: 74 65 64 20 65 76 65 6e 74 20 69 73 20 67 65 6e  ted event is gen
4790: 65 72 61 74 65 64 2e 20 20 55 6e 73 75 70 70 6f  erated.  Unsuppo
47a0: 72 74 65 64 20 65 76 65 6e 74 20 74 79 70 65 73  rted event types
47b0: 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a   are ignored..**
47c0: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
47d0: 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  in pDb->zTraceV2
47e0: 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 77 69   is executed, wi
47f0: 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  th the arguments
4800: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 65 76 65 6e   for.** the even
4810: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 69 74  t appended to it
4820: 20 28 61 73 20 6c 69 73 74 20 65 6c 65 6d 65 6e   (as list elemen
4830: 74 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ts)..*/.static i
4840: 6e 74 20 44 62 54 72 61 63 65 56 32 48 61 6e 64  nt DbTraceV2Hand
4850: 6c 65 72 28 0a 20 20 75 6e 73 69 67 6e 65 64 20  ler(.  unsigned 
4860: 74 79 70 65 2c 20 2f 2a 20 4f 6e 65 20 6f 66 20  type, /* One of 
4870: 74 68 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  the SQLITE_TRACE
4880: 5f 2a 20 65 76 65 6e 74 20 74 79 70 65 73 2e 20  _* event types. 
4890: 2a 2f 0a 20 20 76 6f 69 64 20 2a 63 64 2c 20 20  */.  void *cd,  
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69      /* The origi
48b0: 6e 61 6c 20 63 6f 6e 74 65 78 74 20 64 61 74 61  nal context data
48c0: 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 20 20 76   pointer. */.  v
48d0: 6f 69 64 20 2a 70 64 2c 20 20 20 20 20 20 2f 2a  oid *pd,      /*
48e0: 20 50 72 69 6d 61 72 79 20 65 76 65 6e 74 20 64   Primary event d
48f0: 61 74 61 2c 20 64 65 70 65 6e 64 73 20 6f 6e 20  ata, depends on 
4900: 65 76 65 6e 74 20 74 79 70 65 2e 20 2a 2f 0a 20  event type. */. 
4910: 20 76 6f 69 64 20 2a 78 64 20 20 20 20 20 20 20   void *xd       
4920: 2f 2a 20 45 78 74 72 61 20 65 76 65 6e 74 20 64  /* Extra event d
4930: 61 74 61 2c 20 64 65 70 65 6e 64 73 20 6f 6e 20  ata, depends on 
4940: 65 76 65 6e 74 20 74 79 70 65 2e 20 2a 2f 0a 29  event type. */.)
4950: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
4960: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
4970: 64 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  d;.  Tcl_Obj *pC
4980: 6d 64 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 74  md;..  switch( t
4990: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
49a0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d  SQLITE_TRACE_STM
49b0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
49c0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
49d0: 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a   (sqlite3_stmt *
49e0: 29 70 64 3b 0a 20 20 20 20 20 20 63 68 61 72 20  )pd;.      char 
49f0: 2a 7a 53 71 6c 20 3d 20 28 63 68 61 72 20 2a 29  *zSql = (char *)
4a00: 78 64 3b 0a 0a 20 20 20 20 20 20 70 43 6d 64 20  xd;..      pCmd 
4a10: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
4a20: 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  bj(pDb->zTraceV2
4a30: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c  , -1);.      Tcl
4a40: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
4a50: 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c  md);.      Tcl_L
4a60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4a70: 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ent(pDb->interp,
4a80: 20 70 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20   pCmd,.         
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64        Tcl_NewWid
4ab0: 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64  eIntObj((Tcl_Wid
4ac0: 65 49 6e 74 29 70 53 74 6d 74 29 29 3b 0a 20 20  eInt)pStmt));.  
4ad0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4ae0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62  ppendElement(pDb
4af0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a  ->interp, pCmd,.
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
4b20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4b30: 7a 53 71 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20  zSql, -1));.    
4b40: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
4b50: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  pDb->interp, pCm
4b60: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
4b70: 43 54 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44  CT);.      Tcl_D
4b80: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ecrRefCount(pCmd
4b90: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73  );.      Tcl_Res
4ba0: 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  etResult(pDb->in
4bb0: 74 65 72 70 29 3b 0a 20 20 20 20 20 20 62 72 65  terp);.      bre
4bc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4bd0: 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  se SQLITE_TRACE_
4be0: 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  PROFILE: {.     
4bf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
4c00: 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f  Stmt = (sqlite3_
4c10: 73 74 6d 74 20 2a 29 70 64 3b 0a 20 20 20 20 20  stmt *)pd;.     
4c20: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
4c30: 73 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e  s = *(sqlite3_in
4c40: 74 36 34 2a 29 78 64 3b 0a 0a 20 20 20 20 20 20  t64*)xd;..      
4c50: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pCmd = Tcl_NewSt
4c60: 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72  ringObj(pDb->zTr
4c70: 61 63 65 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20  aceV2, -1);.    
4c80: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4c90: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20  nt(pCmd);.      
4ca0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4cb0: 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e  dElement(pDb->in
4cc0: 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20  terp, pCmd,.    
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e             Tcl_N
4cf0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 54 63  ewWideIntObj((Tc
4d00: 6c 5f 57 69 64 65 49 6e 74 29 70 53 74 6d 74 29  l_WideInt)pStmt)
4d10: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  );.      Tcl_Lis
4d20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4d30: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  t(pDb->interp, p
4d40: 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cmd,.           
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49      Tcl_NewWideI
4d70: 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65 49  ntObj((Tcl_WideI
4d80: 6e 74 29 6e 73 29 29 3b 0a 20 20 20 20 20 20 54  nt)ns));.      T
4d90: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
4da0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
4db0: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
4dc0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  ;.      Tcl_Decr
4dd0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
4de0: 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52        Tcl_ResetR
4df0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
4e00: 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  p);.      break;
4e10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4e20: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57  SQLITE_TRACE_ROW
4e30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4e40: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
4e50: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29  (sqlite3_stmt *)
4e60: 70 64 3b 0a 0a 20 20 20 20 20 20 70 43 6d 64 20  pd;..      pCmd 
4e70: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
4e80: 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  bj(pDb->zTraceV2
4e90: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c  , -1);.      Tcl
4ea0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
4eb0: 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c  md);.      Tcl_L
4ec0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4ed0: 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ent(pDb->interp,
4ee0: 20 70 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20   pCmd,.         
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64        Tcl_NewWid
4f10: 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64  eIntObj((Tcl_Wid
4f20: 65 49 6e 74 29 70 53 74 6d 74 29 29 3b 0a 20 20  eInt)pStmt));.  
4f30: 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45      Tcl_EvalObjE
4f40: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
4f50: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
4f60: 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63 6c  RECT);.      Tcl
4f70: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
4f80: 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 52  md);.      Tcl_R
4f90: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
4fa0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 62  interp);.      b
4fb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4fc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43  case SQLITE_TRAC
4fd0: 45 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 20  E_CLOSE: {.     
4fe0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
4ff0: 73 71 6c 69 74 65 33 20 2a 29 70 64 3b 0a 0a 20  sqlite3 *)pd;.. 
5000: 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f       pCmd = Tcl_
5010: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62  NewStringObj(pDb
5020: 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b  ->zTraceV2, -1);
5030: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
5040: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5050: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
5060: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44  AppendElement(pD
5070: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
5080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
50b0: 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 64  j((Tcl_WideInt)d
50c0: 62 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 45  b));.      Tcl_E
50d0: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
50e0: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
50f0: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
5100: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
5110: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5120: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
5130: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
5140: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5150: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5160: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
5170: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
5180: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5190: 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
51a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
51b0: 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26 26 20  ATING_POINT) && 
51c0: 5c 0a 20 20 20 20 21 64 65 66 69 6e 65 64 28 53  \.    !defined(S
51d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
51e0: 43 41 54 45 44 29 0a 2f 2a 0a 2a 2a 20 54 68 69  CATED)./*.** Thi
51f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5200: 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  led by the SQLit
5210: 65 20 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65  e profile handle
5220: 72 20 61 66 74 65 72 20 61 20 73 74 61 74 65 6d  r after a statem
5230: 65 6e 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65  ent.** SQL has e
5240: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43  xecuted.  The TC
5250: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
5260: 3e 7a 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61  >zProfile is eva
5270: 6c 75 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  luated..*/.stati
5280: 63 20 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65  c void DbProfile
5290: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
52a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
52b0: 71 6c 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ql, sqlite_uint6
52c0: 34 20 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44  4 tm){.  SqliteD
52d0: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
52e0: 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53  Db*)cd;.  Tcl_DS
52f0: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61  tring str;.  cha
5300: 72 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73  r zTm[100];..  s
5310: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
5320: 73 69 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a  sizeof(zTm)-1, z
5330: 54 6d 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b  Tm, "%lld", tm);
5340: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
5350: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
5360: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
5370: 74 72 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  tr, pDb->zProfil
5380: 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  e, -1);.  Tcl_DS
5390: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
53a0: 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a  nt(&str, zSql);.
53b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
53c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
53d0: 20 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61   zTm);.  Tcl_Eva
53e0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
53f0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
5400: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
5410: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
5420: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
5430: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
5440: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5450: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5460: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
5470: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
5480: 6d 6d 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a  mmitted.  The.**
5490: 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70   TCL script in p
54a0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65  Db->zCommit is e
54b0: 78 65 63 75 74 65 64 2e 20 20 49 66 20 69 74 20  xecuted.  If it 
54c0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
54d0: 20 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72   or.** if it thr
54e0: 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
54f0: 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
5500: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
5510: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62   instead.** of b
5520: 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  eing committed..
5530: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
5540: 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f  CommitHandler(vo
5550: 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74  id *cd){.  Sqlit
5560: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
5570: 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20  teDb*)cd;.  int 
5580: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f  rc;..  rc = Tcl_
5590: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
55a0: 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b  , pDb->zCommit);
55b0: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
55c0: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
55d0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
55e0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
55f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
5600: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5610: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f  static void DbRo
5620: 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f  llbackHandler(vo
5630: 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b  id *clientData){
5640: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
5650: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c   = (SqliteDb*)cl
5660: 69 65 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65  ientData;.  asse
5670: 72 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  rt(pDb->pRollbac
5680: 6b 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43  kHook);.  if( TC
5690: 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62  L_OK!=Tcl_EvalOb
56a0: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
56b0: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
56c0: 6f 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54  ook, 0) ){.    T
56d0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
56e0: 6f 72 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  or(pDb->interp);
56f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
5700: 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 6e  is procedure han
5710: 64 6c 65 73 20 77 61 6c 5f 68 6f 6f 6b 20 63 61  dles wal_hook ca
5720: 6c 6c 62 61 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  llbacks..*/.stat
5730: 69 63 20 69 6e 74 20 44 62 57 61 6c 48 61 6e 64  ic int DbWalHand
5740: 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  ler(.  void *cli
5750: 65 6e 74 44 61 74 61 2c 0a 20 20 73 71 6c 69 74  entData,.  sqlit
5760: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
5770: 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 69 6e 74  char *zDb,.  int
5780: 20 6e 45 6e 74 72 79 0a 29 7b 0a 20 20 69 6e 74   nEntry.){.  int
5790: 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   ret = SQLITE_OK
57a0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b 0a  ;.  Tcl_Obj *p;.
57b0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
57c0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69  = (SqliteDb*)cli
57d0: 65 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c 5f 49  entData;.  Tcl_I
57e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20  nterp *interp = 
57f0: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 61  pDb->interp;.  a
5800: 73 73 65 72 74 28 70 44 62 2d 3e 70 57 61 6c 48  ssert(pDb->pWalH
5810: 6f 6f 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ook);..  assert(
5820: 20 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a   db==pDb->db );.
5830: 20 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63    p = Tcl_Duplic
5840: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c  ateObj(pDb->pWal
5850: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
5860: 72 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20  rRefCount(p);.  
5870: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5880: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5890: 20 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   p, Tcl_NewStrin
58a0: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
58b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
58c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
58d0: 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  p, p, Tcl_NewInt
58e0: 4f 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20  Obj(nEntry));.  
58f0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
5900: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
5910: 2c 20 70 2c 20 30 29 0a 20 20 20 7c 7c 20 54 43  , p, 0).   || TC
5920: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
5930: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
5940: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
5950: 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29 0a  (interp), &ret).
5960: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
5970: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
5980: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
5990: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b  DecrRefCount(p);
59a0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
59b0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
59c0: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
59d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
59e0: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
59f0: 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  FY).static void 
5a00: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
5a10: 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74 65  ifyVars(Tcl_Inte
5a20: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
5a30: 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  iArg, int nArg){
5a40: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34 5d  .  char zBuf[64]
5a50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
5a60: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
5a70: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 69  ), zBuf, "%d", i
5a80: 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  Arg);.  Tcl_SetV
5a90: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
5aa0: 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  te_unlock_notify
5ab0: 5f 61 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c  _arg", zBuf, TCL
5ac0: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
5ad0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
5ae0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
5af0: 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41 72 67  zBuf, "%d", nArg
5b00: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 28  );.  Tcl_SetVar(
5b10: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
5b20: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72  unlock_notify_ar
5b30: 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c 20 54  gcount", zBuf, T
5b40: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
5b50: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
5b60: 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e  e setTestUnlockN
5b70: 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c 7a 29  otifyVars(x,y,z)
5b80: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
5b90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
5ba0: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74  LOCK_NOTIFY.stat
5bb0: 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f 63 6b  ic void DbUnlock
5bc0: 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a 61 70  Notify(void **ap
5bd0: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a  Arg, int nArg){.
5be0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
5bf0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
5c00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
5c10: 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45 56 41  flags = (TCL_EVA
5c20: 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41  L_GLOBAL|TCL_EVA
5c30: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 53  L_DIRECT);.    S
5c40: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
5c50: 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41 72 67  SqliteDb *)apArg
5c60: 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65 73 74  [i];.    setTest
5c70: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
5c80: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 69 2c  (pDb->interp, i,
5c90: 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73 73 65   nArg);.    asse
5ca0: 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  rt( pDb->pUnlock
5cb0: 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54 63 6c  Notify);.    Tcl
5cc0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
5cd0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 55 6e  interp, pDb->pUn
5ce0: 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c 61 67  lockNotify, flag
5cf0: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  s);.    Tcl_Decr
5d00: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
5d10: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20  nlockNotify);.  
5d20: 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f    pDb->pUnlockNo
5d30: 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tify = 0;.  }.}.
5d40: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
5d50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
5d60: 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a  UPDATE_HOOK./*.*
5d70: 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  * Pre-update hoo
5d80: 6b 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  k callback..*/.s
5d90: 74 61 74 69 63 20 76 6f 69 64 20 44 62 50 72 65  tatic void DbPre
5da0: 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20  UpdateHandler(. 
5db0: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 73 71 6c 69   void *p,.  sqli
5dc0: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 6f  te3 *db,.  int o
5dd0: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
5de0: 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zDb,.  const ch
5df0: 61 72 20 2a 7a 54 62 6c 2c 0a 20 20 73 71 6c 69  ar *zTbl,.  sqli
5e00: 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 31 2c 0a  te_int64 iKey1,.
5e10: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
5e20: 4b 65 79 32 0a 29 7b 0a 20 20 53 71 6c 69 74 65  Key2.){.  Sqlite
5e30: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
5e40: 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f  eDb *)p;.  Tcl_O
5e50: 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74 61 74  bj *pCmd;.  stat
5e60: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
5e70: 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c 45 54  zStr[] = {"DELET
5e80: 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20 22 55  E", "INSERT", "U
5e90: 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73 73 65  PDATE"};..  asse
5ea0: 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45 4c 45  rt( (SQLITE_DELE
5eb0: 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29 3b 0a  TE-1)/9 == 0 );.
5ec0: 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54    assert( (SQLIT
5ed0: 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20 3d 3d  E_INSERT-1)/9 ==
5ee0: 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   1 );.  assert( 
5ef0: 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45 2d 31  (SQLITE_UPDATE-1
5f00: 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 20 20 61 73  )/9 == 2 );.  as
5f10: 73 65 72 74 28 20 70 44 62 2d 3e 70 50 72 65 55  sert( pDb->pPreU
5f20: 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61  pdateHook );.  a
5f30: 73 73 65 72 74 28 20 64 62 3d 3d 70 44 62 2d 3e  ssert( db==pDb->
5f40: 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
5f50: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op==SQLITE_INSER
5f60: 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  T || op==SQLITE_
5f70: 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51  UPDATE || op==SQ
5f80: 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a  LITE_DELETE );..
5f90: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70    pCmd = Tcl_Dup
5fa0: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
5fb0: 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  PreUpdateHook);.
5fc0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5fd0: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f  nt(pCmd);.  Tcl_
5fe0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5ff0: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
6000: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61  l_NewStringObj(a
6010: 7a 53 74 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c 20  zStr[(op-1)/9], 
6020: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
6030: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6040: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
6050: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20  wStringObj(zDb, 
6060: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
6070: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6080: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
6090: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c  wStringObj(zTbl,
60a0: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
60b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
60c0: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
60d0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b 65  ewWideIntObj(iKe
60e0: 79 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  y1));.  Tcl_List
60f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6100: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
6110: 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b 65 79  wWideIntObj(iKey
6120: 32 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  2));.  Tcl_EvalO
6130: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
6140: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
6150: 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
6160: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
6170: 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  d);.}.#endif /* 
6180: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
6190: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
61a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 55  .static void DbU
61b0: 70 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20  pdateHandler(.  
61c0: 76 6f 69 64 20 2a 70 2c 0a 20 20 69 6e 74 20 6f  void *p,.  int o
61d0: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
61e0: 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zDb,.  const ch
61f0: 61 72 20 2a 7a 54 62 6c 2c 0a 20 20 73 71 6c 69  ar *zTbl,.  sqli
6200: 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a 29  te_int64 rowid.)
6210: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
6220: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
6230: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  p;.  Tcl_Obj *pC
6240: 6d 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  md;.  static con
6250: 73 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d  st char *azStr[]
6260: 20 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49   = {"DELETE", "I
6270: 4e 53 45 52 54 22 2c 20 22 55 50 44 41 54 45 22  NSERT", "UPDATE"
6280: 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53  };..  assert( (S
6290: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f  QLITE_DELETE-1)/
62a0: 39 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65  9 == 0 );.  asse
62b0: 72 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45  rt( (SQLITE_INSE
62c0: 52 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a  RT-1)/9 == 1 );.
62d0: 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54    assert( (SQLIT
62e0: 45 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d  E_UPDATE-1)/9 ==
62f0: 20 32 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28   2 );..  assert(
6300: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
6310: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  k );.  assert( o
6320: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  p==SQLITE_INSERT
6330: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55   || op==SQLITE_U
6340: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c  PDATE || op==SQL
6350: 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20  ITE_DELETE );.. 
6360: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c   pCmd = Tcl_Dupl
6370: 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55  icateObj(pDb->pU
6380: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63  pdateHook);.  Tc
6390: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
63a0: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  Cmd);.  Tcl_List
63b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
63c0: 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65  (0, pCmd, Tcl_Ne
63d0: 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72  wStringObj(azStr
63e0: 5b 28 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29  [(op-1)/9], -1))
63f0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
6400: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
6410: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
6420: 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29  ingObj(zDb, -1))
6430: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
6440: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
6450: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
6460: 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29  ingObj(zTbl, -1)
6470: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
6480: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
6490: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69   pCmd, Tcl_NewWi
64a0: 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29  deIntObj(rowid))
64b0: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
64c0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
64d0: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
64e0: 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63  RECT);.  Tcl_Dec
64f0: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
6500: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
6510: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
6520: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
6530: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
6540: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73   int enc,.  cons
6550: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
6560: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
6570: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
6580: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
6590: 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75  pScript = Tcl_Du
65a0: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
65b0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
65c0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
65d0: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
65e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
65f0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
6600: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
6610: 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29  ngObj(zName, -1)
6620: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
6630: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
6640: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54  pScript, 0);.  T
6650: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6660: 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pScript);.}../*.
6670: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6680: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
6690: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c  luate an SQL col
66a0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
66b0: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
66c0: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
66d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
66e0: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20  clSqlCollate(.  
66f0: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
6700: 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nA,.  const vo
6710: 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
6720: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
6730: 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61  zB.){.  SqlColla
6740: 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c  te *p = (SqlColl
6750: 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  ate *)pCtx;.  Tc
6760: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
6770: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pCmd = Tcl_NewSt
6780: 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69  ringObj(p->zScri
6790: 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  pt, -1);.  Tcl_I
67a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
67b0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
67c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
67d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
67e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
67f0: 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f  zA, nA));.  Tcl_
6800: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6810: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
6820: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
6830: 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b  ingObj(zB, nB));
6840: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
6850: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
6860: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
6870: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
6880: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6890: 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c  return (atoi(Tcl
68a0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
68b0: 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d  (p->interp)));.}
68c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
68d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
68e0: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51  o evaluate an SQ
68f0: 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  L function imple
6900: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
6910: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
6920: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71  tatic void tclSq
6930: 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  lFunc(sqlite3_co
6940: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
6950: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
6960: 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a  3_value**argv){.
6970: 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73    SqlFunc *p = s
6980: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
6990: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c  (context);.  Tcl
69a0: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e  _Obj *pCmd;.  in
69b0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
69c0: 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b    if( argc==0 ){
69d0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
69e0: 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74   are no argument
69f0: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
6a00: 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c  n, call Tcl_Eval
6a10: 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20  ObjEx on the.   
6a20: 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63   ** script objec
6a30: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
6a40: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c  s allows the TCL
6a50: 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e   compiler to gen
6a60: 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74  erate.    ** byt
6a70: 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f  ecode for the co
6a80: 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72  mmand on the fir
6a90: 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  st invocation an
6aa0: 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20  d thus make.    
6ab0: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  ** subsequent in
6ac0: 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66  vocations much f
6ad0: 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43  aster. */.    pC
6ae0: 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b  md = p->pScript;
6af0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
6b00: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
6b10: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
6b20: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
6b30: 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  Cmd, 0);.    Tcl
6b40: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
6b50: 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  md);.  }else{.  
6b60: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
6b70: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
6b80: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  he function, mak
6b90: 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79  e a shallow copy
6ba0: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   of the.    ** s
6bb0: 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61  cript object, la
6bc0: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
6bd0: 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  nts, then evalua
6be0: 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  te the copy..   
6bf0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73   **.    ** By "s
6c00: 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65  hallow" copy, we
6c10: 20 6d 65 61 6e 20 6f 6e 6c 79 20 74 68 65 20 6f   mean only the o
6c20: 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62  uter list Tcl_Ob
6c30: 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e  j is duplicated.
6c40: 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  .    ** The new 
6c50: 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73  Tcl_Obj contains
6c60: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
6c70: 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65   original list e
6c80: 6c 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  lements..    ** 
6c90: 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54  That way, when T
6ca0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73  cl_EvalObjv() is
6cb0: 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72   run and shimmer
6cc0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  s the first elem
6cd0: 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ent.    ** of th
6ce0: 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64  e list to tclCmd
6cf0: 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61  NameType, that a
6d00: 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65 73 65  lternate represe
6d10: 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ntation will.   
6d20: 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65 64   ** be preserved
6d30: 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74   and reused on t
6d40: 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69  he next invocati
6d50: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  on..    */.    T
6d60: 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20  cl_Obj **aArg;. 
6d70: 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
6d80: 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a   if( Tcl_ListObj
6d90: 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69  GetElements(p->i
6da0: 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70  nterp, p->pScrip
6db0: 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29  t, &nArg, &aArg)
6dc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6dd0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
6de0: 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53  ontext, Tcl_GetS
6df0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
6e00: 6e 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20 20 20  nterp), -1);.   
6e10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
6e20: 0a 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f  .    pCmd = Tcl_
6e30: 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c  NewListObj(nArg,
6e40: 20 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f   aArg);.    Tcl_
6e50: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
6e60: 64 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  d);.    for(i=0;
6e70: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
6e80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6e90: 75 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69  ue *pIn = argv[i
6ea0: 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  ];.      Tcl_Obj
6eb0: 20 2a 70 56 61 6c 3b 0a 0a 20 20 20 20 20 20 2f   *pVal;..      /
6ec0: 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f  * Set pVal to co
6ed0: 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63  ntain the i'th c
6ee0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f  olumn of this ro
6ef0: 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  w. */.      swit
6f00: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
6f10: 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a 20  e_type(pIn) ){. 
6f20: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
6f30: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
6f40: 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d       int bytes =
6f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
6f60: 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20  ytes(pIn);.     
6f70: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
6f80: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
6f90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6fa0: 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b  ob(pIn), bytes);
6fb0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6fc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6fd0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6fe0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
6ff0: 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36       sqlite_int6
7000: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  4 v = sqlite3_va
7010: 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a  lue_int64(pIn);.
7020: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
7030: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
7040: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
7050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61  .            pVa
7060: 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  l = Tcl_NewIntOb
7070: 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20 20 20  j((int)v);.     
7080: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7090: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
70a0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
70b0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
70c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
70d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
70e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
70f0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
7100: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
7110: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
7120: 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  le(pIn);.       
7130: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
7140: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
7150: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
7180: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
7190: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
71a0: 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e  ringObj(p->pDb->
71b0: 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  zNull, -1);.    
71c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
71d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
71e0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
71f0: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
7200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
7210: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
7220: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
7230: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
7240: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
7250: 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74  e_text(pIn), byt
7260: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
7270: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
7290: 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70   = Tcl_ListObjAp
72a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
72b0: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61  nterp, pCmd, pVa
72c0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
72d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
72e0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
72f0: 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
7300: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7310: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
7320: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
7330: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20  >interp), -1);. 
7340: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
7350: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7360: 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c   if( !p->useEval
7370: 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Objv ){.      /*
7380: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29   Tcl_EvalObjEx()
7390: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
73a0: 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  lly call Tcl_Eva
73b0: 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a  lObjv() if pCmd.
73c0: 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69        ** is a li
73d0: 73 74 20 77 69 74 68 6f 75 74 20 61 20 73 74 72  st without a str
73e0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
73f0: 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20  on.  To prevent 
7400: 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  this from.      
7410: 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61  ** happening, ma
7420: 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68 61 73  ke sure pCmd has
7430: 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20   a valid string 
7440: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a  representation *
7450: 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  /.      Tcl_GetS
7460: 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20  tring(pCmd);.   
7470: 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f   }.    rc = Tcl_
7480: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
7490: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
74a0: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
74b0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
74c0: 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20  t(pCmd);.  }..  
74d0: 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 54 43  if( rc && rc!=TC
74e0: 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20  L_RETURN ){.    
74f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7500: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
7510: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
7520: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
7530: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7540: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20  Tcl_Obj *pVar = 
7550: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
7560: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20  (p->interp);.   
7570: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a   int n;.    u8 *
7580: 64 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20  data;.    const 
7590: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70  char *zType = (p
75a0: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
75b0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
75c0: 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20 63 68  me : "");.    ch
75d0: 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b  ar c = zType[0];
75e0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20  .    if( c=='b' 
75f0: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
7600: 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20  "bytearray")==0 
7610: 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d  && pVar->bytes==
7620: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  0 ){.      /* On
7630: 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42  ly return a BLOB
7640: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
7650: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
7660: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
7670: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72     ** has no str
7680: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
7690: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74  on. */.      dat
76a0: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
76b0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72  rrayFromObj(pVar
76c0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
76d0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
76e0: 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20  (context, data, 
76f0: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
7700: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
7710: 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74  if( c=='b' && st
7720: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
7730: 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ean")==0 ){.    
7740: 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
7750: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29  Obj(0, pVar, &n)
7760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
7770: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
7780: 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, n);.    }els
7790: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
77a0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
77b0: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
77c0: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
77d0: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
77e0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
77f0: 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &r);.      sqli
7800: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
7810: 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20  e(context, r);. 
7820: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
7830: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
7840: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
7850: 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  =0) ||.         
7860: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
7870: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
7880: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  =0) ){.      Tcl
7890: 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20  _WideInt v;.    
78a0: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
78b0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
78c0: 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &v);.      sqli
78d0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
78e0: 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20  (context, v);.  
78f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
7900: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
7910: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
7920: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
7930: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
7940: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7950: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20  (context, (char 
7960: 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  *)data, n, SQLIT
7970: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
7980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
7990: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
79a0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  UTHORIZATION./*.
79b0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61  ** This is the a
79c0: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75  uthentication fu
79d0: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65  nction.  It appe
79e0: 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69  nds the authenti
79f0: 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63  cation.** type c
7a00: 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20  ode and the two 
7a10: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d  arguments to zCm
7a20: 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73  d[] then invokes
7a30: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f   the result.** o
7a40: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
7a50: 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73  r.  The reply is
7a60: 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74   examined to det
7a70: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a  ermine if the.**
7a80: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
7a90: 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64  fails or succeed
7aa0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7ab0: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a   auth_callback(.
7ac0: 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20    void *pArg,.  
7ad0: 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73  int code,.  cons
7ae0: 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20  t char *zArg1,. 
7af0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
7b00: 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g2,.  const char
7b10: 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74   *zArg3,.  const
7b20: 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 23 69 66   char *zArg4.#if
7b30: 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  def SQLITE_USER_
7b40: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
7b50: 20 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41   ,const char *zA
7b60: 72 67 35 0a 23 65 6e 64 69 66 0a 29 7b 0a 20 20  rg5.#endif.){.  
7b70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 64  const char *zCod
7b80: 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  e;.  Tcl_DString
7b90: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   str;.  int rc;.
7ba0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
7bb0: 65 70 6c 79 3b 0a 20 20 2f 2a 20 45 56 49 44 45  eply;.  /* EVIDE
7bc0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 38 35 39 30 2d  NCE-OF: R-38590-
7bd0: 36 32 37 36 39 20 54 68 65 20 66 69 72 73 74 20  62769 The first 
7be0: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65  parameter to the
7bf0: 20 61 75 74 68 6f 72 69 7a 65 72 0a 20 20 2a 2a   authorizer.  **
7c00: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 63   callback is a c
7c10: 6f 70 79 20 6f 66 20 74 68 65 20 74 68 69 72 64  opy of the third
7c20: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
7c30: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73  e.  ** sqlite3_s
7c40: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 29 20  et_authorizer() 
7c50: 69 6e 74 65 72 66 61 63 65 2e 0a 20 20 2a 2f 0a  interface..  */.
7c60: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
7c70: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72  = (SqliteDb*)pAr
7c80: 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69  g;.  if( pDb->di
7c90: 73 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75  sableAuth ) retu
7ca0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
7cb0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
7cc0: 20 52 2d 35 36 35 31 38 2d 34 34 33 31 30 20 54   R-56518-44310 T
7cd0: 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
7ce0: 74 65 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ter to the callb
7cf0: 61 63 6b 20 69 73 20 61 6e 0a 20 20 2a 2a 20 69  ack is an.  ** i
7d00: 6e 74 65 67 65 72 20 61 63 74 69 6f 6e 20 63 6f  nteger action co
7d10: 64 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  de that specifie
7d20: 73 20 74 68 65 20 70 61 72 74 69 63 75 6c 61 72  s the particular
7d30: 20 61 63 74 69 6f 6e 20 74 6f 20 62 65 0a 20 20   action to be.  
7d40: 2a 2a 20 61 75 74 68 6f 72 69 7a 65 64 2e 20 2a  ** authorized. *
7d50: 2f 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65  /.  switch( code
7d60: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
7d70: 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20  ITE_COPY        
7d80: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7d90: 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65  QLITE_COPY"; bre
7da0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7db0: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
7dc0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7dd0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
7de0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
7df0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7e00: 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20  TE_TABLE      : 
7e10: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7e20: 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65  EATE_TABLE"; bre
7e30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7e40: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7e50: 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53  INDEX : zCode="S
7e60: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7e70: 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  P_INDEX"; break;
7e80: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7e90: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
7ea0: 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49  LE : zCode="SQLI
7eb0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
7ec0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
7ed0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
7ee0: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
7ef0: 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45  R: zCode="SQLITE
7f00: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  _CREATE_TEMP_TRI
7f10: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
7f20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
7f30: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20  EATE_TEMP_VIEW  
7f40: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7f50: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7f60: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7f70: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
7f80: 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43  _TRIGGER    : zC
7f90: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
7fa0: 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  TE_TRIGGER"; bre
7fb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7fc0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20  ITE_CREATE_VIEW 
7fd0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7fe0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
7ff0: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
8000: 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  ase SQLITE_DELET
8010: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
8020: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c  Code="SQLITE_DEL
8030: 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ETE"; break;.   
8040: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
8050: 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a  P_INDEX        :
8060: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
8070: 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  ROP_INDEX"; brea
8080: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8090: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20  TE_DROP_TABLE   
80a0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
80b0: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22  LITE_DROP_TABLE"
80c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
80d0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
80e0: 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f  MP_INDEX   : zCo
80f0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
8100: 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  TEMP_INDEX"; bre
8110: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8120: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
8130: 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  BLE   : zCode="S
8140: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
8150: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
8160: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
8170: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
8180: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8190: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  _DROP_TEMP_TRIGG
81a0: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
81b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
81c0: 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20  _TEMP_VIEW    : 
81d0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
81e0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  OP_TEMP_VIEW"; b
81f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
8200: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47  QLITE_DROP_TRIGG
8210: 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  ER      : zCode=
8220: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49  "SQLITE_DROP_TRI
8230: 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20  GGER"; break;.  
8240: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
8250: 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 20  OP_VIEW         
8260: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8270: 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61  DROP_VIEW"; brea
8280: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8290: 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20  TE_INSERT       
82a0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
82b0: 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72  LITE_INSERT"; br
82c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
82d0: 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20  LITE_PRAGMA     
82e0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
82f0: 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20  SQLITE_PRAGMA"; 
8300: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8310: 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20  SQLITE_READ     
8320: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
8330: 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20  ="SQLITE_READ"; 
8340: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8350: 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20  SQLITE_SELECT   
8360: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
8370: 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22  ="SQLITE_SELECT"
8380: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
8390: 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  e SQLITE_TRANSAC
83a0: 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f  TION       : zCo
83b0: 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53  de="SQLITE_TRANS
83c0: 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a  ACTION"; break;.
83d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
83e0: 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20  UPDATE          
83f0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
8400: 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b  E_UPDATE"; break
8410: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
8420: 45 5f 41 54 54 41 43 48 20 20 20 20 20 20 20 20  E_ATTACH        
8430: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
8440: 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65  ITE_ATTACH"; bre
8450: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8460: 49 54 45 5f 44 45 54 41 43 48 20 20 20 20 20 20  ITE_DETACH      
8470: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
8480: 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62  QLITE_DETACH"; b
8490: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
84a0: 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c  QLITE_ALTER_TABL
84b0: 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d  E       : zCode=
84c0: 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41  "SQLITE_ALTER_TA
84d0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
84e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49   case SQLITE_REI
84f0: 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 3a  NDEX           :
8500: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52   zCode="SQLITE_R
8510: 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  EINDEX"; break;.
8520: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8530: 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20  ANALYZE         
8540: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
8550: 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61  E_ANALYZE"; brea
8560: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8570: 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45  TE_CREATE_VTABLE
8580: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
8590: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42  LITE_CREATE_VTAB
85a0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
85b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
85c0: 5f 56 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20  _VTABLE       : 
85d0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
85e0: 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61  OP_VTABLE"; brea
85f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8600: 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20  TE_FUNCTION     
8610: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
8620: 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20  LITE_FUNCTION"; 
8630: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8640: 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
8650: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
8660: 3d 22 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49  ="SQLITE_SAVEPOI
8670: 4e 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  NT"; break;.    
8680: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 43 55  case SQLITE_RECU
8690: 52 53 49 56 45 20 20 20 20 20 20 20 20 20 3a 20  RSIVE         : 
86a0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
86b0: 43 55 52 53 49 56 45 22 3b 20 62 72 65 61 6b 3b  CURSIVE"; break;
86c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 20 20 20 20  .    default    
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f     : zCode="????
86f0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  "; break;.  }.  
8700: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
8710: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74  &str);.  Tcl_DSt
8720: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
8730: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29   pDb->zAuth, -1)
8740: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
8750: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
8760: 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c  r, zCode);.  Tcl
8770: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
8780: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
8790: 31 20 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b  1 ? zArg1 : "");
87a0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
87b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
87c0: 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20  , zArg2 ? zArg2 
87d0: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
87e0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
87f0: 74 28 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20  t(&str, zArg3 ? 
8800: 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54  zArg3 : "");.  T
8810: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
8820: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
8830: 72 67 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22  rg4 ? zArg4 : ""
8840: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
8850: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
8860: 54 49 4f 4e 0a 20 20 54 63 6c 5f 44 53 74 72 69  TION.  Tcl_DStri
8870: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
8880: 26 73 74 72 2c 20 7a 41 72 67 35 20 3f 20 7a 41  &str, zArg5 ? zA
8890: 72 67 35 20 3a 20 22 22 29 3b 0a 23 65 6e 64 69  rg5 : "");.#endi
88a0: 66 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f  f.  rc = Tcl_Glo
88b0: 62 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  balEval(pDb->int
88c0: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
88d0: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
88e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
88f0: 26 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20  &str);.  zReply 
8900: 3d 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 3f 20 54  = rc==TCL_OK ? T
8910: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
8920: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 20  lt(pDb->interp) 
8930: 3a 20 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 3b  : "SQLITE_DENY";
8940: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  .  if( strcmp(zR
8950: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22  eply,"SQLITE_OK"
8960: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
8970: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
8980: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
8990: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45  Reply,"SQLITE_DE
89a0: 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  NY")==0 ){.    r
89b0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b  c = SQLITE_DENY;
89c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
89d0: 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49  cmp(zReply,"SQLI
89e0: 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29  TE_IGNORE")==0 )
89f0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
8a00: 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73  E_IGNORE;.  }els
8a10: 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b  e{.    rc = 999;
8a20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8a30: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
8a40: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
8a50: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
8a60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
8a70: 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74  eads a line of t
8a80: 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ext from FILE in
8a90: 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20  , stores.** the 
8aa0: 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  text in memory o
8ab0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
8ac0: 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e  loc() and return
8ad0: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
8ae0: 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c  o the text.  NUL
8af0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 74  L is returned at
8b00: 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72   end of file, or
8b10: 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20   if malloc().** 
8b20: 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fails..**.** The
8b30: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69   interface is li
8b40: 6b 65 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75  ke "readline" bu
8b50: 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  t no command-lin
8b60: 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20  e editing.** is 
8b70: 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69  done..**.** copi
8b80: 65 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20  ed from shell.c 
8b90: 66 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63  from '.import' c
8ba0: 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63  ommand.*/.static
8bb0: 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74   char *local_get
8bc0: 6c 69 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d  line(char *zProm
8bd0: 70 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20  pt, FILE *in){. 
8be0: 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20   char *zLine;.  
8bf0: 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74  int nLine;.  int
8c00: 20 6e 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31   n;..  nLine = 1
8c10: 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61  00;.  zLine = ma
8c20: 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20  lloc( nLine );. 
8c30: 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20   if( zLine==0 ) 
8c40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20  return 0;.  n = 
8c50: 30 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  0;.  while( 1 ){
8c60: 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e  .    if( n+100>n
8c70: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c  Line ){.      nL
8c80: 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20  ine = nLine*2 + 
8c90: 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  100;.      zLine
8ca0: 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65   = realloc(zLine
8cb0: 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  , nLine);.      
8cc0: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
8cd0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
8ce0: 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c     if( fgets(&zL
8cf0: 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20  ine[n], nLine - 
8d00: 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n, in)==0 ){.   
8d10: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
8d20: 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e         free(zLin
8d30: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
8d40: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
8d50: 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30      zLine[n] = 0
8d60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8d70: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
8d80: 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b  zLine[n] ){ n++;
8d90: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
8da0: 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c  & zLine[n-1]=='\
8db0: 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b  n' ){.      n--;
8dc0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20  .      zLine[n] 
8dd0: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
8de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c  ;.    }.  }.  zL
8df0: 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a  ine = realloc( z
8e00: 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72  Line, n+1 );.  r
8e10: 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a  eturn zLine;.}..
8e20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
8e30: 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
8e40: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
8e50: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e  on of the comman
8e60: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 74  d:.**.**   $db t
8e70: 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
8e80: 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
8e90: 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
8ea0: 49 50 54 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  IPT.**.** It is 
8eb0: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 65 76  invoked after ev
8ec0: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 73 63 72  aluating the scr
8ed0: 69 70 74 20 53 43 52 49 50 54 20 74 6f 20 63 6f  ipt SCRIPT to co
8ee0: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
8ef0: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
8f00: 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74  ion or savepoint
8f10: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 5b   opened by the [
8f20: 74 72 61 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d  transaction] com
8f30: 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
8f40: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
8f50: 49 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64  I DbTransPostCmd
8f60: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64  (.  ClientData d
8f70: 61 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20  ata[],          
8f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61           /* data
8f90: 5b 30 5d 20 69 73 20 74 68 65 20 53 71 6c 69 74  [0] is the Sqlit
8fa0: 65 33 44 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f  e3Db* for $db */
8fb0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
8fc0: 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20  nterp,          
8fd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69          /* Tcl i
8fe0: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
8ff0: 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20 20  int result      
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
9020: 66 20 65 76 61 6c 75 61 74 69 6e 67 20 53 43 52  f evaluating SCR
9030: 49 50 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  IPT */.){.  stat
9040: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
9050: 6f 6e 73 74 20 61 7a 45 6e 64 5b 5d 20 3d 20 7b  onst azEnd[] = {
9060: 0a 20 20 20 20 22 52 45 4c 45 41 53 45 20 5f 74  .    "RELEASE _t
9070: 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c  cl_transaction",
9080: 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54          /* rc==T
9090: 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73  CL_ERROR, nTrans
90a0: 61 63 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20  action!=0 */.   
90b0: 20 22 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20 20   "COMMIT",      
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90d0: 20 20 20 20 2f 2a 20 72 63 21 3d 54 43 4c 5f 45      /* rc!=TCL_E
90e0: 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69  RROR, nTransacti
90f0: 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20 20 22 52 4f  on==0 */.    "RO
9100: 4c 4c 42 41 43 4b 20 54 4f 20 5f 74 63 6c 5f 74  LLBACK TO _tcl_t
9110: 72 61 6e 73 61 63 74 69 6f 6e 20 3b 20 52 45 4c  ransaction ; REL
9120: 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61  EASE _tcl_transa
9130: 63 74 69 6f 6e 22 2c 0a 20 20 20 20 22 52 4f 4c  ction",.    "ROL
9140: 4c 42 41 43 4b 22 20 20 20 20 20 20 20 20 20 20  LBACK"          
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9160: 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c  * rc==TCL_ERROR,
9170: 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30   nTransaction==0
9180: 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c 69 74   */.  };.  Sqlit
9190: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
91a0: 74 65 44 62 2a 29 64 61 74 61 5b 30 5d 3b 0a 20  teDb*)data[0];. 
91b0: 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74   int rc = result
91c0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
91d0: 7a 45 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54  zEnd;..  pDb->nT
91e0: 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
91f0: 7a 45 6e 64 20 3d 20 61 7a 45 6e 64 5b 28 72 63  zEnd = azEnd[(rc
9200: 3d 3d 54 43 4c 5f 45 52 52 4f 52 29 2a 32 20 2b  ==TCL_ERROR)*2 +
9210: 20 28 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74   (pDb->nTransact
9220: 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70 44 62  ion==0)];..  pDb
9230: 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b  ->disableAuth++;
9240: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65  .  if( sqlite3_e
9250: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e  xec(pDb->db, zEn
9260: 64 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20  d, 0, 0, 0) ){. 
9270: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
9280: 61 20 74 72 69 63 6b 79 20 73 63 65 6e 61 72 69  a tricky scenari
9290: 6f 20 74 6f 20 68 61 6e 64 6c 65 2e 20 54 68 65  o to handle. The
92a0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 63 61 75   most likely cau
92b0: 73 65 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 2a  se of an.      *
92c0: 2a 20 65 72 72 6f 72 20 69 73 20 74 68 61 74 20  * error is that 
92d0: 74 68 65 20 65 78 65 63 28 29 20 61 62 6f 76 65  the exec() above
92e0: 20 77 61 73 20 61 6e 20 61 74 74 65 6d 70 74 20   was an attempt 
92f0: 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
9300: 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c      ** top-level
9310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
9320: 74 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  t returned SQLIT
9330: 45 5f 42 55 53 59 2e 20 4f 72 2c 20 6c 65 73 73  E_BUSY. Or, less
9340: 20 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 20 20 2a   likely,.      *
9350: 2a 20 74 68 61 74 20 61 6e 20 49 4f 2d 65 72 72  * that an IO-err
9360: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
9370: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
9380: 20 74 68 72 6f 77 20 61 20 54 63 6c 20 65 78 63   throw a Tcl exc
9390: 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  eption.      ** 
93a0: 61 6e 64 20 74 72 79 20 74 6f 20 72 6f 6c 6c 62  and try to rollb
93b0: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
93c0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ion..      **.  
93d0: 20 20 20 20 2a 2a 20 42 75 74 20 69 74 20 63 6f      ** But it co
93e0: 75 6c 64 20 61 6c 73 6f 20 62 65 20 74 68 61 74  uld also be that
93f0: 20 74 68 65 20 75 73 65 72 20 65 78 65 63 75 74   the user execut
9400: 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 42  ed one or more B
9410: 45 47 49 4e 2c 0a 20 20 20 20 20 20 2a 2a 20 43  EGIN,.      ** C
9420: 4f 4d 4d 49 54 2c 20 53 41 56 45 50 4f 49 4e 54  OMMIT, SAVEPOINT
9430: 2c 20 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c  , RELEASE or ROL
9440: 4c 42 41 43 4b 20 63 6f 6d 6d 61 6e 64 73 20 74  LBACK commands t
9450: 68 61 74 20 61 72 65 20 63 6f 6e 66 75 73 69 6e  hat are confusin
9460: 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
9470: 6d 65 74 68 6f 64 27 73 20 6c 6f 67 69 63 2e 20  method's logic. 
9480: 4e 6f 74 20 63 6c 65 61 72 20 68 6f 77 20 74 68  Not clear how th
9490: 69 73 20 77 6f 75 6c 64 20 62 65 20 62 65 73 74  is would be best
94a0: 20 68 61 6e 64 6c 65 64 2e 0a 20 20 20 20 20 20   handled..      
94b0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54  */.    if( rc!=T
94c0: 43 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  CL_ERROR ){.    
94d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
94e0: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
94f0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
9500: 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
9510: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
9520: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
9530: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
9540: 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  >db, "ROLLBACK",
9550: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
9560: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
9570: 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  h--;..  return r
9580: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  c;.}../*.** Unle
9590: 73 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  ss SQLITE_TEST i
95a0: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20  s defined, this 
95b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69  function is a si
95c0: 6d 70 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f  mple wrapper aro
95d0: 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70  und.** sqlite3_p
95e0: 72 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20  repare_v2(). If 
95f0: 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
9600: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20  efined, then it 
9610: 75 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73  uses either.** s
9620: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
9630: 32 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e  2() or legacy in
9640: 74 65 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f  terface sqlite3_
9650: 70 72 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e  prepare(), depen
9660: 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68  ding.** on wheth
9670: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64  er or not the [d
9680: 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
9690: 70 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61  pare] command ha
96a0: 73 20 62 65 65 6e 20 75 73 65 64 20 74 6f 0a 2a  s been used to.*
96b0: 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * configure the 
96c0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
96d0: 74 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70  tatic int dbPrep
96e0: 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20  are(.  SqliteDb 
96f0: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
9700: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
9710: 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  se object */.  c
9720: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9740: 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65  * SQL to compile
9750: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
9760: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
9770: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72        /* OUT: Pr
9780: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9790: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
97a0: 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20   **pzOut        
97b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
97c0: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51  inter to next SQ
97d0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  L statement */.)
97e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
97f0: 20 70 72 65 70 46 6c 61 67 73 20 3d 20 30 3b 0a   prepFlags = 0;.
9800: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
9810: 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e 62 4c  ST.  if( pDb->bL
9820: 65 67 61 63 79 50 72 65 70 61 72 65 20 29 7b 0a  egacyPrepare ){.
9830: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
9840: 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e  e3_prepare(pDb->
9850: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
9860: 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20 20  Stmt, pzOut);.  
9870: 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 49 66  }.#endif.  /* If
9880: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
9890: 61 63 68 65 20 69 73 20 6c 61 72 67 65 2c 20 75  ache is large, u
98a0: 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 50 52  se the SQLITE_PR
98b0: 45 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54  EPARE_PERSISTENT
98c0: 0a 20 20 2a 2a 20 66 6c 61 67 73 2c 20 77 68 69  .  ** flags, whi
98d0: 63 68 20 75 73 65 73 20 6c 65 73 73 20 6c 6f 6f  ch uses less loo
98e0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20  kaside memory.  
98f0: 42 75 74 20 69 66 20 74 68 65 20 63 61 63 68 65  But if the cache
9900: 20 69 73 20 73 6d 61 6c 6c 2c 0a 20 20 2a 2a 20   is small,.  ** 
9910: 6f 6d 69 74 20 74 68 61 74 20 66 6c 61 67 20 74  omit that flag t
9920: 6f 20 6d 61 6b 65 20 66 75 6c 6c 20 75 73 65 20  o make full use 
9930: 6f 66 20 6c 6f 6f 6b 61 73 69 64 65 20 2a 2f 0a  of lookaside */.
9940: 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74    if( pDb->maxSt
9950: 6d 74 3e 35 20 29 20 70 72 65 70 46 6c 61 67 73  mt>5 ) prepFlags
9960: 20 3d 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52   = SQLITE_PREPAR
9970: 45 5f 50 45 52 53 49 53 54 45 4e 54 3b 0a 0a 20  E_PERSISTENT;.. 
9980: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
9990: 70 72 65 70 61 72 65 5f 76 33 28 70 44 62 2d 3e  prepare_v3(pDb->
99a0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 72  db, zSql, -1, pr
99b0: 65 70 46 6c 61 67 73 2c 20 70 70 53 74 6d 74 2c  epFlags, ppStmt,
99c0: 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzOut);.}../*.*
99d0: 2a 20 53 65 61 72 63 68 20 74 68 65 20 63 61 63  * Search the cac
99e0: 68 65 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  he for a prepare
99f0: 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65  d-statement obje
9a00: 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
9a10: 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ts the.** first 
9a20: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
9a30: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
9a40: 74 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d 65  ted to by parame
9a50: 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e  ter zIn. If.** n
9a60: 6f 20 73 75 63 68 20 70 72 65 70 61 72 65 64 2d  o such prepared-
9a70: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65  statement can be
9a80: 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65   found, allocate
9a90: 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 20 6e   and prepare a n
9aa0: 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69  ew.** one. In ei
9ab0: 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64 20  ther case, bind 
9ac0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
9ad0: 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61  es of the releva
9ae0: 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62  nt Tcl.** variab
9af0: 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72 2c  les to any $var,
9b00: 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76 61   :var or @var va
9b10: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73  riables in the s
9b20: 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65  tatement. Before
9b30: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20 73  .** returning, s
9b40: 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74 6f  et *ppPreStmt to
9b50: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 72   point to the pr
9b60: 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74  epared-statement
9b70: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f   object..**.** O
9b80: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
9b90: 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pzOut is set to
9ba0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
9bb0: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
9bc0: 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49   in.** buffer zI
9bd0: 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c 30  n, or to the '\0
9be0: 27 20 62 79 74 65 20 61 74 20 74 68 65 20 65 6e  ' byte at the en
9bf0: 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65 72  d of zIn if ther
9c00: 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20  e is no.** next 
9c10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
9c20: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
9c30: 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  TCL_OK is return
9c40: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 54  ed. Otherwise, T
9c50: 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75  CL_ERROR is retu
9c60: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  rned.** and an e
9c70: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f 61  rror message loa
9c80: 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70 72  ded into interpr
9c90: 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72 70  eter pDb->interp
9ca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9cb0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9cc0: 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  (.  SqliteDb *pD
9cd0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
9ce0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9cf0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
9d00: 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20   const *zIn,    
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9d20: 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f  QL to compile */
9d30: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
9d40: 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20  pzOut,          
9d50: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
9d60: 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73  er to next SQL s
9d70: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71  tatement */.  Sq
9d80: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 2a  lPreparedStmt **
9d90: 70 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f 2a  ppPreStmt     /*
9da0: 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73 65   OUT: Object use
9db0: 64 20 74 6f 20 63 61 63 68 65 20 73 74 61 74 65  d to cache state
9dc0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ment */.){.  con
9dd0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
9de0: 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  zIn;         /* 
9df0: 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74  Pointer to first
9e00: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
9e10: 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  n zIn */.  sqlit
9e20: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
9e30: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 72   0;        /* Pr
9e40: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9e50: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c   object */.  Sql
9e60: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
9e70: 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20  reStmt;      /* 
9e80: 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68 65  Pointer to cache
9e90: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
9ea0: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ec0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
9ed0: 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ql in bytes */. 
9ee0: 20 69 6e 74 20 6e 56 61 72 20 3d 20 30 3b 20 20   int nVar = 0;  
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
9f10: 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74 65  riables in state
9f20: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ment */.  int iP
9f30: 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  arm = 0;        
9f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
9f50: 74 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e 20  t free entry in 
9f60: 61 70 50 61 72 6d 20 2a 2f 0a 20 20 63 68 61 72  apParm */.  char
9f70: 20 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54   c;.  int i;.  T
9f80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9f90: 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b  p = pDb->interp;
9fa0: 0a 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d  ..  *ppPreStmt =
9fb0: 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 69 6d 20 73   0;..  /* Trim s
9fc0: 70 61 63 65 73 20 66 72 6f 6d 20 74 68 65 20 73  paces from the s
9fd0: 74 61 72 74 20 6f 66 20 7a 53 71 6c 20 61 6e 64  tart of zSql and
9fe0: 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 72   calculate the r
9ff0: 65 6d 61 69 6e 69 6e 67 20 6c 65 6e 67 74 68 2e  emaining length.
a000: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 28 63 20   */.  while( (c 
a010: 3d 20 7a 53 71 6c 5b 30 5d 29 3d 3d 27 20 27 20  = zSql[0])==' ' 
a020: 7c 7c 20 63 3d 3d 27 5c 74 27 20 7c 7c 20 63 3d  || c=='\t' || c=
a030: 3d 27 5c 72 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27  ='\r' || c=='\n'
a040: 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20   ){ zSql++; }.  
a050: 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSql = strlen30(
a060: 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f 72 28 70 50  zSql);..  for(pP
a070: 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74  reStmt = pDb->st
a080: 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74  mtList; pPreStmt
a090: 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53  ; pPreStmt=pPreS
a0a0: 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  tmt->pNext){.   
a0b0: 20 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d   int n = pPreStm
a0c0: 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28  t->nSql;.    if(
a0d0: 20 6e 53 71 6c 3e 3d 6e 0a 20 20 20 20 20 20 20   nSql>=n.       
a0e0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53   && memcmp(pPreS
a0f0: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
a100: 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26   n)==0.        &
a110: 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c  & (zSql[n]==0 ||
a120: 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29   zSql[n-1]==';')
a130: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 53  .    ){.      pS
a140: 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  tmt = pPreStmt->
a150: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 2a 70 7a  pStmt;.      *pz
a160: 4f 75 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65  Out = &zSql[pPre
a170: 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20  Stmt->nSql];..  
a180: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72      /* When a pr
a190: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a1a0: 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e   is found, unlin
a1b0: 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20  k it from the.  
a1c0: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73      ** cache lis
a1d0: 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65  t.  It will late
a1e0: 72 20 62 65 20 61 64 64 65 64 20 62 61 63 6b 20  r be added back 
a1f0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
a200: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
a210: 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f   cache list in o
a220: 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
a230: 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e  t LRU replacemen
a240: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
a250: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e    if( pPreStmt->
a260: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
a270: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
a280: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74  ->pNext = pPreSt
a290: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mt->pNext;.     
a2a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a2b0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
a2c0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
a2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a2e0: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  f( pPreStmt->pNe
a2f0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  xt ){.        pP
a300: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70  reStmt->pNext->p
a310: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d  Prev = pPreStmt-
a320: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65  >pPrev;.      }e
a330: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
a340: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72  ->stmtLast = pPr
a350: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
a360: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 62 2d      }.      pDb-
a370: 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20  >nStmt--;.      
a380: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
a390: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
a3a0: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
a3b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a3c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70   }..  /* If no p
a3d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a3e0: 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 43 6f 6d  t was found. Com
a3f0: 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78  pile the SQL tex
a400: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
a410: 0a 20 20 2a 2a 20 61 20 6e 65 77 20 53 71 6c 50  .  ** a new SqlP
a420: 72 65 70 61 72 65 64 53 74 6d 74 20 73 74 72 75  reparedStmt stru
a430: 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28  cture.  */.  if(
a440: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a   pPreStmt==0 ){.
a450: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a      int nByte;..
a460: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
a470: 4b 21 3d 64 62 50 72 65 70 61 72 65 28 70 44 62  K!=dbPrepare(pDb
a480: 2c 20 7a 53 71 6c 2c 20 26 70 53 74 6d 74 2c 20  , zSql, &pStmt, 
a490: 70 7a 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20  pzOut) ){.      
a4a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
a4b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
a4c0: 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
a4d0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
a4e0: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 72  ), -1));.      r
a4f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a500: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
a510: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
a520: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a530: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
a540: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
a550: 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65      /* A compile
a560: 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74  -time error in t
a570: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  he statement. */
a580: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
a590: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
a5a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
a5b0: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
a5c0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29  g(pDb->db), -1))
a5d0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
a5e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
a5f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a600: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e   /* The statemen
a610: 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  t was a no-op.  
a620: 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20  Continue to the 
a630: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  next statement. 
a640: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
a650: 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20   SQL string..   
a660: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a670: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
a680: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a690: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74    assert( pPreSt
a6a0: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 56 61  mt==0 );.    nVa
a6b0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
a6c0: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
a6d0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 6e 42 79  (pStmt);.    nBy
a6e0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 53 71 6c 50  te = sizeof(SqlP
a6f0: 72 65 70 61 72 65 64 53 74 6d 74 29 20 2b 20 6e  reparedStmt) + n
a700: 56 61 72 2a 73 69 7a 65 6f 66 28 54 63 6c 5f 4f  Var*sizeof(Tcl_O
a710: 62 6a 20 2a 29 3b 0a 20 20 20 20 70 50 72 65 53  bj *);.    pPreS
a720: 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72  tmt = (SqlPrepar
a730: 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f  edStmt*)Tcl_Allo
a740: 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 6d 65  c(nByte);.    me
a750: 6d 73 65 74 28 70 50 72 65 53 74 6d 74 2c 20 30  mset(pPreStmt, 0
a760: 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20 70  , nByte);..    p
a770: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d  PreStmt->pStmt =
a780: 20 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 72 65   pStmt;.    pPre
a790: 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 28 69 6e  Stmt->nSql = (in
a7a0: 74 29 28 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c  t)(*pzOut - zSql
a7b0: 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  );.    pPreStmt-
a7c0: 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  >zSql = sqlite3_
a7d0: 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
a7e0: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
a7f0: 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26   = (Tcl_Obj **)&
a800: 70 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 23 69 66  pPreStmt[1];.#if
a810: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
a820: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
a830: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ->zSql==0 ){.   
a840: 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d     char *zCopy =
a850: 20 54 63 6c 5f 41 6c 6c 6f 63 28 70 50 72 65 53   Tcl_Alloc(pPreS
a860: 74 6d 74 2d 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a  tmt->nSql + 1);.
a870: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f        memcpy(zCo
a880: 70 79 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74  py, zSql, pPreSt
a890: 6d 74 2d 3e 6e 53 71 6c 29 3b 0a 20 20 20 20 20  mt->nSql);.     
a8a0: 20 7a 43 6f 70 79 5b 70 50 72 65 53 74 6d 74 2d   zCopy[pPreStmt-
a8b0: 3e 6e 53 71 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20  >nSql] = '\0';. 
a8c0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a       pPreStmt->z
a8d0: 53 71 6c 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20  Sql = zCopy;.   
a8e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
a8f0: 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74  assert( pPreStmt
a900: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
a910: 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74 2d  rlen30(pPreStmt-
a920: 3e 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74  >zSql)==pPreStmt
a930: 2d 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73 65  ->nSql );.  asse
a940: 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50  rt( 0==memcmp(pP
a950: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
a960: 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  ql, pPreStmt->nS
a970: 71 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e  ql) );..  /* Bin
a980: 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61  d values to para
a990: 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69  meters that begi
a9a0: 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f  n with $ or : */
a9b0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e  .  for(i=1; i<=n
a9c0: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Var; i++){.    c
a9d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20  onst char *zVar 
a9e0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
a9f0: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53  arameter_name(pS
aa00: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  tmt, i);.    if(
aa10: 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61   zVar!=0 && (zVa
aa20: 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61  r[0]=='$' || zVa
aa30: 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56 61  r[0]==':' || zVa
aa40: 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20 20  r[0]=='@') ){.  
aa50: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
aa60: 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45  r = Tcl_GetVar2E
aa70: 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b  x(interp, &zVar[
aa80: 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  1], 0, 0);.     
aa90: 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20   if( pVar ){.   
aaa0: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
aab0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
aac0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
aad0: 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d   *zType = (pVar-
aae0: 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d  >typePtr ? pVar-
aaf0: 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a  >typePtr->name :
ab00: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 63 20   "");.        c 
ab10: 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20  = zType[0];.    
ab20: 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d      if( zVar[0]=
ab30: 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20  ='@' ||.        
ab40: 20 20 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74     (c=='b' && st
ab50: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65  rcmp(zType,"byte
ab60: 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56  array")==0 && pV
ab70: 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b  ar->bytes==0) ){
ab80: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  .          /* Lo
ab90: 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69  ad a BLOB type i
aba0: 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62  f the Tcl variab
abb0: 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61  le is a bytearra
abc0: 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  y and.          
abd0: 2a 2a 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72  ** it has no str
abe0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
abf0: 6f 6e 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20  on or the host. 
ac00: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61           ** para
ac10: 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e  meter name begin
ac20: 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20  s with "@". */. 
ac30: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
ac40: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
ac50: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
ac60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ac70: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
ac80: 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e  Stmt, i, data, n
ac90: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
aca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
acb0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
acc0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  r);.          pP
acd0: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69  reStmt->apParm[i
ace0: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
acf0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
ad00: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
ad10: 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61  mp(zType,"boolea
ad20: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
ad30: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
ad40: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
ad50: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
ad60: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
ad70: 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29  int(pStmt, i, n)
ad80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ad90: 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
ada0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62  rcmp(zType,"doub
adb0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
adc0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
add0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
ade0: 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  DoubleFromObj(in
adf0: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b  terp, pVar, &r);
ae00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ae10: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
ae20: 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20  Stmt, i, r);.   
ae30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
ae40: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
ae50: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
ae60: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
ae70: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
ae80: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
ae90: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
aea0: 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49         Tcl_WideI
aeb0: 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20  nt v;.          
aec0: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
aed0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
aee0: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
aef0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
af00: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20  int64(pStmt, i, 
af10: 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  v);.        }els
af20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  e{.          dat
af30: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
af40: 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
af50: 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ngFromObj(pVar, 
af60: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &n);.          s
af70: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
af80: 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72  (pStmt, i, (char
af90: 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49   *)data, n, SQLI
afa0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
afb0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
afc0: 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20  fCount(pVar);.  
afd0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
afe0: 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b  ->apParm[iParm++
aff0: 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20  ] = pVar;.      
b000: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
b010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b020: 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
b030: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
b040: 20 20 7d 0a 20 20 7d 0a 20 20 70 50 72 65 53 74    }.  }.  pPreSt
b050: 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72  mt->nParm = iPar
b060: 6d 3b 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20  m;.  *ppPreStmt 
b070: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72  = pPreStmt;..  r
b080: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b090: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
b0a0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72   statement refer
b0b0: 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
b0c0: 20 63 61 6c 6c 69 6e 67 20 64 62 50 72 65 70 61   calling dbPrepa
b0d0: 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20  reAndBind()..** 
b0e0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
b0f0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c  exactly one call
b100: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
b110: 6e 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20  n for each call 
b120: 74 6f 0a 2a 2a 20 64 62 50 72 65 70 61 72 65 41  to.** dbPrepareA
b130: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20  ndBind()..**.** 
b140: 49 66 20 74 68 65 20 64 69 73 63 61 72 64 20 70  If the discard p
b150: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
b160: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 73  zero, then the s
b170: 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 6c 65  tatement is dele
b180: 74 65 64 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ted.** immediate
b190: 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74  ly. Otherwise it
b1a0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
b1b0: 20 4c 52 55 20 6c 69 73 74 20 61 6e 64 20 6d 61   LRU list and ma
b1c0: 79 20 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a  y be returned.**
b1d0: 20 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74   by a subsequent
b1e0: 20 63 61 6c 6c 20 74 6f 20 64 62 50 72 65 70 61   call to dbPrepa
b1f0: 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a  reAndBind()..*/.
b200: 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65  static void dbRe
b210: 6c 65 61 73 65 53 74 6d 74 28 0a 20 20 53 71 6c  leaseStmt(.  Sql
b220: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b240: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
b250: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
b260: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 2c 20  Stmt *pPreStmt, 
b270: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
b280: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
b290: 65 20 74 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e to release */.
b2a0: 20 20 69 6e 74 20 64 69 73 63 61 72 64 20 20 20    int discard   
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c    /* True to del
b2d0: 65 74 65 20 28 6e 6f 74 20 63 61 63 68 65 29 20  ete (not cache) 
b2e0: 74 68 65 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a  the pPreStmt */.
b2f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
b300: 2a 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64  * Free the bound
b310: 20 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62   string and blob
b320: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
b330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 65   for(i=0; i<pPre
b340: 53 74 6d 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b  Stmt->nParm; i++
b350: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
b360: 65 66 43 6f 75 6e 74 28 70 50 72 65 53 74 6d 74  efCount(pPreStmt
b370: 2d 3e 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20  ->apParm[i]);.  
b380: 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50  }.  pPreStmt->nP
b390: 61 72 6d 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  arm = 0;..  if( 
b3a0: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20  pDb->maxStmt<=0 
b3b0: 7c 7c 20 64 69 73 63 61 72 64 20 29 7b 0a 20 20  || discard ){.  
b3c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
b3d0: 65 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c  e is turned off,
b3e0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65   deallocated the
b3f0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
b400: 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 50 72    dbFreeStmt(pPr
b410: 65 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  eStmt);.  }else{
b420: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
b430: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
b440: 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  nt to the beginn
b450: 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65  ing of the cache
b460: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50   list. */.    pP
b470: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20  reStmt->pNext = 
b480: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
b490: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
b4a0: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
b4b0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
b4c0: 0a 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c  .     pDb->stmtL
b4d0: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ist->pPrev = pPr
b4e0: 65 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20  eStmt;.    }.   
b4f0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
b500: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 69   pPreStmt;.    i
b510: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
b520: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
b530: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d  ert( pDb->nStmt=
b540: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  =0 );.      pDb-
b550: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
b560: 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Stmt;.    }else{
b570: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b580: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
b590: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53     }.    pDb->nS
b5a0: 74 6d 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49  tmt++;..    /* I
b5b0: 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61  f we have too ma
b5c0: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ny statement in 
b5d0: 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68  cache, remove th
b5e0: 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 0a 20  e surplus from. 
b5f0: 20 20 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66     ** the end of
b600: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e   the cache list.
b610: 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
b620: 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e  pDb->nStmt>pDb->
b630: 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  maxStmt ){.     
b640: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
b650: 20 2a 70 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73   *pLast = pDb->s
b660: 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 70  tmtLast;.      p
b670: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
b680: 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Last->pPrev;.   
b690: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
b6a0: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
b6b0: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b     pDb->nStmt--;
b6c0: 0a 20 20 20 20 20 20 64 62 46 72 65 65 53 74 6d  .      dbFreeStm
b6d0: 74 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a  t(pLast);.    }.
b6e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72    }.}../*.** Str
b6f0: 75 63 74 75 72 65 20 75 73 65 64 20 77 69 74 68  ucture used with
b700: 20 64 62 45 76 61 6c 58 58 58 28 29 20 66 75 6e   dbEvalXXX() fun
b710: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ctions:.**.**   
b720: 64 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a 2a 20  dbEvalInit().** 
b730: 20 20 64 62 45 76 61 6c 53 74 65 70 28 29 0a 2a    dbEvalStep().*
b740: 2a 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69  *   dbEvalFinali
b750: 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  ze().**   dbEval
b760: 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20 20 64  RowInfo().**   d
b770: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
b780: 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ().*/.typedef st
b790: 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65  ruct DbEvalConte
b7a0: 78 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  xt DbEvalContext
b7b0: 3b 0a 73 74 72 75 63 74 20 44 62 45 76 61 6c 43  ;.struct DbEvalC
b7c0: 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c 69 74  ontext {.  Sqlit
b7d0: 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20  eDb *pDb;       
b7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
b7f0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
b800: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c  .  Tcl_Obj *pSql
b810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b820: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68 6f 6c     /* Object hol
b830: 64 69 6e 67 20 73 74 72 69 6e 67 20 7a 53 71 6c  ding string zSql
b840: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
b850: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
b860: 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69        /* Remaini
b870: 6e 67 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74  ng SQL to execut
b880: 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  e */.  SqlPrepar
b890: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
b8a0: 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  ;      /* Curren
b8b0: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  t statement */. 
b8c0: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
b8f0: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
b900: 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  y pStmt */.  int
b910: 20 65 76 61 6c 46 6c 61 67 73 3b 20 20 20 20 20   evalFlags;     
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b930: 46 6c 61 67 73 20 75 73 65 64 20 2a 2f 0a 20 20  Flags used */.  
b940: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b  Tcl_Obj *pArray;
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79  /* Name of array
b970: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54   variable */.  T
b980: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61  cl_Obj **apColNa
b990: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
b9a0: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  * Array of colum
b9b0: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 23  n names */.};..#
b9c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 56  define SQLITE_EV
b9d0: 41 4c 5f 57 49 54 48 4f 55 54 4e 55 4c 4c 53 20  AL_WITHOUTNULLS 
b9e0: 20 30 78 30 30 30 30 31 20 20 2f 2a 20 55 6e 73   0x00001  /* Uns
b9f0: 65 74 20 61 72 72 61 79 28 2a 29 20 66 6f 72 20  et array(*) for 
ba00: 4e 55 4c 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  NULL */../*.** R
ba10: 65 6c 65 61 73 65 20 61 6e 79 20 63 61 63 68 65  elease any cache
ba20: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
ba30: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
ba40: 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  as part of.** th
ba50: 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e DbEvalContext 
ba60: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
ba70: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
ba80: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
ba90: 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65  c void dbRelease
baa0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76  ColumnNames(DbEv
bab0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
bac0: 20 69 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d   if( p->apColNam
bad0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
bae0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
baf0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
bb00: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
bb10: 6f 75 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d  ount(p->apColNam
bb20: 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
bb30: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
bb40: 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b  *)p->apColName);
bb50: 0a 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d  .    p->apColNam
bb60: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  e = 0;.  }.  p->
bb70: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
bb80: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
bb90: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
bba0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
bbb0: 66 20 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20  f pArray is not 
bbc0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f  NULL, then it co
bbd0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
bbe0: 6f 66 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a  of a Tcl array.*
bbf0: 2a 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  * variable. The 
bc00: 22 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  "*" member of th
bc10: 69 73 20 61 72 72 61 79 20 69 73 20 73 65 74 20  is array is set 
bc20: 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69  to a list contai
bc30: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  ning.** the name
bc40: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
bc50: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
bc60: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61   statement as pa
bc70: 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61  rt of each.** ca
bc80: 6c 6c 20 74 6f 20 64 62 45 76 61 6c 53 74 65 70  ll to dbEvalStep
bc90: 28 29 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f  (), in order fro
bca0: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
bcb0: 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d   e.g. if the nam
bcc0: 65 73 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74  es.** of the ret
bcd0: 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  urned columns ar
bce0: 65 20 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74  e a, b and c, it
bcf0: 20 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61   does the equiva
bd00: 6c 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  lent of the.** t
bd10: 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  cl command:.**.*
bd20: 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72  *     set ${pArr
bd30: 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a  ay}(*) {a b c}.*
bd40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
bd50: 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76  EvalInit(.  DbEv
bd60: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  alContext *p,   
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
bd80: 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74  ointer to struct
bd90: 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ure to initializ
bda0: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
bdb0: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
bdc0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
bdd0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54  se handle */.  T
bde0: 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20  cl_Obj *pSql,   
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be00: 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  * Object contain
be10: 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a  ing SQL script *
be20: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
be30: 72 61 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  ray,            
be40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54      /* Name of T
be50: 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20  cl array to set 
be60: 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a  (*) element of *
be70: 2f 0a 20 20 69 6e 74 20 65 76 61 6c 46 6c 61 67  /.  int evalFlag
be80: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
be90: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 63 6f 6e      /* Flags con
bea0: 74 72 6f 6c 6c 69 6e 67 20 65 76 61 6c 75 61 74  trolling evaluat
beb0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73  ion */.){.  mems
bec0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
bed0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b  DbEvalContext));
bee0: 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b  .  p->pDb = pDb;
bef0: 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 54 63 6c  .  p->zSql = Tcl
bf00: 5f 47 65 74 53 74 72 69 6e 67 28 70 53 71 6c 29  _GetString(pSql)
bf10: 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d 20 70 53  ;.  p->pSql = pS
bf20: 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ql;.  Tcl_IncrRe
bf30: 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b 0a 20 20  fCount(pSql);.  
bf40: 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20 20  if( pArray ){.  
bf50: 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 70 41    p->pArray = pA
bf60: 72 72 61 79 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  rray;.    Tcl_In
bf70: 63 72 52 65 66 43 6f 75 6e 74 28 70 41 72 72 61  crRefCount(pArra
bf80: 79 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 76 61  y);.  }.  p->eva
bf90: 6c 46 6c 61 67 73 20 3d 20 65 76 61 6c 46 6c 61  lFlags = evalFla
bfa0: 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  gs;.}../*.** Obt
bfb0: 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ain information 
bfc0: 61 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68  about the row th
bfd0: 61 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  at the DbEvalCon
bfe0: 74 65 78 74 20 70 61 73 73 65 64 20 61 73 20 74  text passed as t
bff0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  he.** first argu
c000: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70  ment currently p
c010: 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  oints to..*/.sta
c020: 74 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52  tic void dbEvalR
c030: 6f 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c  owInfo(.  DbEval
c040: 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20  Context *p,     
c050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
c060: 6c 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20  luation context 
c070: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c  */.  int *pnCol,
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
c0a0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ber of column na
c0b0: 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  mes */.  Tcl_Obj
c0c0: 20 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20   ***papColName  
c0d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
c0e0: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
c0f0: 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f   names */.){.  /
c100: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e  * Compute column
c110: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20   names */.  if( 
c120: 30 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20  0==p->apColName 
c130: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
c140: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e  tmt *pStmt = p->
c150: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b  pPreStmt->pStmt;
c160: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
c190: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
c1a0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1c0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
c1d0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53  s returned by pS
c1e0: 74 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  tmt */.    Tcl_O
c1f0: 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d  bj **apColName =
c200: 20 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61   0;      /* Arra
c210: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
c220: 73 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f  s */..    p->nCo
c230: 6c 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74  l = nCol = sqlit
c240: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
c250: 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
c260: 6e 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f  nCol>0 && (papCo
c270: 6c 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72  lName || p->pArr
c280: 61 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43  ay) ){.      apC
c290: 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62  olName = (Tcl_Ob
c2a0: 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  j**)Tcl_Alloc( s
c2b0: 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a  izeof(Tcl_Obj*)*
c2c0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f  nCol );.      fo
c2d0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
c2e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43  ++){.        apC
c2f0: 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 54 63 6c 5f  olName[i] = Tcl_
c300: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
c310: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
c320: 28 70 53 74 6d 74 2c 69 29 2c 20 2d 31 29 3b 0a  (pStmt,i), -1);.
c330: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
c340: 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61  RefCount(apColNa
c350: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  me[i]);.      }.
c360: 20 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61        p->apColNa
c370: 6d 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a  me = apColName;.
c380: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c390: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
c3a0: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  ng stored in an 
c3b0: 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20  array variable, 
c3c0: 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20  then create.    
c3d0: 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20  ** the array(*) 
c3e0: 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61  entry for that a
c3f0: 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rray.    */.    
c400: 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b  if( p->pArray ){
c410: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  .      Tcl_Inter
c420: 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e 70  p *interp = p->p
c430: 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  Db->interp;.    
c440: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c    Tcl_Obj *pColL
c450: 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ist = Tcl_NewObj
c460: 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  ();.      Tcl_Ob
c470: 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e  j *pStar = Tcl_N
c480: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c  ewStringObj("*",
c490: 20 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72   -1);..      for
c4a0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
c4b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  +){.        Tcl_
c4c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
c4d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f  ment(interp, pCo
c4e0: 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65  lList, apColName
c4f0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
c500: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
c510: 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20  ount(pStar);.   
c520: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
c530: 32 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41 72  2(interp, p->pAr
c540: 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c  ray, pStar, pCol
c550: 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  List, 0);.      
c560: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c570: 28 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20  (pStar);.    }. 
c580: 20 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f 6c   }..  if( papCol
c590: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61 70  Name ){.    *pap
c5a0: 43 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70 43  ColName = p->apC
c5b0: 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66  olName;.  }.  if
c5c0: 28 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 2a  ( pnCol ){.    *
c5d0: 70 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b  pnCol = p->nCol;
c5e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
c5f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c 5f  turn one of TCL_
c600: 4f 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f 72  OK, TCL_BREAK or
c610: 20 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20 54   TCL_ERROR. If T
c620: 43 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72  CL_ERROR is.** r
c630: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61 6e  eturned, then an
c640: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
c650: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
c660: 69 6e 74 65 72 70 72 65 74 65 72 20 62 65 66 6f  interpreter befo
c670: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
c680: 0a 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e 20  .**.** A return 
c690: 76 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b 20  value of TCL_OK 
c6a0: 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 61  means there is a
c6b0: 20 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76 61   row of data ava
c6c0: 69 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 64  ilable. The.** d
c6d0: 61 74 61 20 6d 61 79 20 62 65 20 61 63 63 65 73  ata may be acces
c6e0: 73 65 64 20 75 73 69 6e 67 20 64 62 45 76 61 6c  sed using dbEval
c6f0: 52 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64 62  RowInfo() and db
c700: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
c710: 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e  ). This.** is an
c720: 61 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65 74  alogous to a ret
c730: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52 4f  urn of SQLITE_RO
c740: 57 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73  W from sqlite3_s
c750: 74 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42 52  tep(). If TCL_BR
c760: 45 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  EAK.** is return
c770: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ed, then the SQL
c780: 20 73 63 72 69 70 74 20 68 61 73 20 66 69 6e 69   script has fini
c790: 73 68 65 64 20 65 78 65 63 75 74 69 6e 67 20 61  shed executing a
c7a0: 6e 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  nd there are.** 
c7b0: 6e 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73 20  no further rows 
c7c0: 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 20  available. This 
c7d0: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51  is similar to SQ
c7e0: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73 74  LITE_DONE..*/.st
c7f0: 61 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c 53  atic int dbEvalS
c800: 74 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  tep(DbEvalContex
c810: 74 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  t *p){.  const c
c820: 68 61 72 20 2a 7a 50 72 65 76 53 71 6c 20 3d 20  har *zPrevSql = 
c830: 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76  0;       /* Prev
c840: 69 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 70 2d  ious value of p-
c850: 3e 7a 53 71 6c 20 2a 2f 0a 0a 20 20 77 68 69 6c  >zSql */..  whil
c860: 65 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c  e( p->zSql[0] ||
c870: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a   p->pPreStmt ){.
c880: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
c890: 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 3d  if( p->pPreStmt=
c8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 72 65  =0 ){.      zPre
c8b0: 76 53 71 6c 20 3d 20 28 70 2d 3e 7a 53 71 6c 3d  vSql = (p->zSql=
c8c0: 3d 7a 50 72 65 76 53 71 6c 20 3f 20 30 20 3a 20  =zPrevSql ? 0 : 
c8d0: 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  p->zSql);.      
c8e0: 72 63 20 3d 20 64 62 50 72 65 70 61 72 65 41 6e  rc = dbPrepareAn
c8f0: 64 42 69 6e 64 28 70 2d 3e 70 44 62 2c 20 70 2d  dBind(p->pDb, p-
c900: 3e 7a 53 71 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c  >zSql, &p->zSql,
c910: 20 26 70 2d 3e 70 50 72 65 53 74 6d 74 29 3b 0a   &p->pPreStmt);.
c920: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 54 43        if( rc!=TC
c930: 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
c940: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c950: 20 20 20 69 6e 74 20 72 63 73 3b 0a 20 20 20 20     int rcs;.    
c960: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
c970: 3d 20 70 2d 3e 70 44 62 3b 0a 20 20 20 20 20 20  = p->pDb;.      
c980: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
c990: 2a 70 50 72 65 53 74 6d 74 20 3d 20 70 2d 3e 70  *pPreStmt = p->p
c9a0: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 73  PreStmt;.      s
c9b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
c9c0: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  mt = pPreStmt->p
c9d0: 53 74 6d 74 3b 0a 0a 20 20 20 20 20 20 72 63 73  Stmt;..      rcs
c9e0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
c9f0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  pStmt);.      if
ca00: 28 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 52 4f  ( rcs==SQLITE_RO
ca10: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  W ){.        ret
ca20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
ca30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
ca40: 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20  >pArray ){.     
ca50: 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f     dbEvalRowInfo
ca60: 28 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  (p, 0, 0);.     
ca70: 20 7d 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73   }.      rcs = s
ca80: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
ca90: 6d 74 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d  mt);..      pDb-
caa0: 3e 6e 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33  >nStep = sqlite3
cab0: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
cac0: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
cad0: 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
cae0: 45 50 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  EP,1);.      pDb
caf0: 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65  ->nSort = sqlite
cb00: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
cb10: 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53  tmt,SQLITE_STMTS
cb20: 54 41 54 55 53 5f 53 4f 52 54 2c 31 29 3b 0a 20  TATUS_SORT,1);. 
cb30: 20 20 20 20 20 70 44 62 2d 3e 6e 49 6e 64 65 78       pDb->nIndex
cb40: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
cb50: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c  status(pStmt,SQL
cb60: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
cb70: 55 54 4f 49 4e 44 45 58 2c 31 29 3b 0a 20 20 20  UTOINDEX,1);.   
cb80: 20 20 20 70 44 62 2d 3e 6e 56 4d 53 74 65 70 20     pDb->nVMStep 
cb90: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
cba0: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
cbb0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d  TE_STMTSTATUS_VM
cbc0: 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20 20 20 20  _STEP,1);.      
cbd0: 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e  dbReleaseColumnN
cbe0: 61 6d 65 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ames(p);.      p
cbf0: 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a  ->pPreStmt = 0;.
cc00: 0a 20 20 20 20 20 20 69 66 28 20 72 63 73 21 3d  .      if( rcs!=
cc10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cc20: 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e       /* If a run
cc30: 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75  -time error occu
cc40: 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65  rs, report the e
cc50: 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65  rror and stop re
cc60: 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  ading.        **
cc70: 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f 0a 20 20   the SQL.  */.  
cc80: 20 20 20 20 20 20 64 62 52 65 6c 65 61 73 65 53        dbReleaseS
cc90: 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d  tmt(pDb, pPreStm
cca0: 74 2c 20 31 29 3b 0a 23 69 66 20 53 51 4c 49 54  t, 1);.#if SQLIT
ccb0: 45 5f 54 45 53 54 0a 20 20 20 20 20 20 20 20 69  E_TEST.        i
ccc0: 66 28 20 70 2d 3e 70 44 62 2d 3e 62 4c 65 67 61  f( p->pDb->bLega
ccd0: 63 79 50 72 65 70 61 72 65 20 26 26 20 72 63 73  cyPrepare && rcs
cce0: 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  ==SQLITE_SCHEMA 
ccf0: 26 26 20 7a 50 72 65 76 53 71 6c 20 29 7b 0a 20  && zPrevSql ){. 
cd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
cd10: 68 65 20 72 75 6e 74 69 6d 65 20 65 72 72 6f 72  he runtime error
cd20: 20 77 61 73 20 61 6e 20 53 51 4c 49 54 45 5f 53   was an SQLITE_S
cd30: 43 48 45 4d 41 2c 20 61 6e 64 20 74 68 65 20 64  CHEMA, and the d
cd40: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
cd50: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 69 73 20 63    ** handle is c
cd60: 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
cd70: 20 74 68 65 20 6c 65 67 61 63 79 20 73 71 6c 69   the legacy sqli
cd80: 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 20 20  te3_prepare().  
cd90: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
cda0: 66 61 63 65 2c 20 72 65 74 72 79 20 70 72 65 70  face, retry prep
cdb0: 61 72 65 28 29 2f 73 74 65 70 28 29 20 6f 6e 20  are()/step() on 
cdc0: 74 68 65 20 73 61 6d 65 20 53 51 4c 20 73 74 61  the same SQL sta
cdd0: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
cde0: 20 20 2a 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    ** This only h
cdf0: 61 70 70 65 6e 73 20 6f 6e 63 65 2e 20 49 66 20  appens once. If 
ce00: 74 68 65 72 65 20 69 73 20 61 20 73 65 63 6f 6e  there is a secon
ce10: 64 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 0a  d SQLITE_SCHEMA.
ce20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72            ** err
ce30: 6f 72 2c 20 74 68 65 20 65 72 72 6f 72 20 77 69  or, the error wi
ce40: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
ce50: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f  o the caller. */
ce60: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  .          p->zS
ce70: 71 6c 20 3d 20 7a 50 72 65 76 53 71 6c 3b 0a 20  ql = zPrevSql;. 
ce80: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
ce90: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  e;.        }.#en
cea0: 64 69 66 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  dif.        Tcl_
ceb0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 44 62  SetObjResult(pDb
cec0: 2d 3e 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20  ->interp,.      
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
cef0: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
cf00: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29  sg(pDb->db), -1)
cf10: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
cf20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
cf30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf40: 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28    dbReleaseStmt(
cf50: 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 30  pDb, pPreStmt, 0
cf60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cf70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 73  .  }..  /* Finis
cf80: 68 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  hed */.  return 
cf90: 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a  TCL_BREAK;.}../*
cfa0: 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72 65 73  .** Free all res
cfb0: 6f 75 72 63 65 73 20 63 75 72 72 65 6e 74 6c 79  ources currently
cfc0: 20 68 65 6c 64 20 62 79 20 74 68 65 20 44 62 45   held by the DbE
cfd0: 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63  valContext struc
cfe0: 74 75 72 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  ture passed.** a
cff0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
d000: 6d 65 6e 74 2e 20 54 68 65 72 65 20 73 68 6f 75  ment. There shou
d010: 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  ld be exactly on
d020: 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  e call to this f
d030: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65  unction.** for e
d040: 61 63 68 20 63 61 6c 6c 20 74 6f 20 64 62 45 76  ach call to dbEv
d050: 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  alInit()..*/.sta
d060: 74 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 46  tic void dbEvalF
d070: 69 6e 61 6c 69 7a 65 28 44 62 45 76 61 6c 43 6f  inalize(DbEvalCo
d080: 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69 66 28  ntext *p){.  if(
d090: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a   p->pPreStmt ){.
d0a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
d0b0: 74 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70  t(p->pPreStmt->p
d0c0: 53 74 6d 74 29 3b 0a 20 20 20 20 64 62 52 65 6c  Stmt);.    dbRel
d0d0: 65 61 73 65 53 74 6d 74 28 70 2d 3e 70 44 62 2c  easeStmt(p->pDb,
d0e0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 2c 20 30 29   p->pPreStmt, 0)
d0f0: 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 53 74 6d  ;.    p->pPreStm
d100: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
d110: 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20   p->pArray ){.  
d120: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
d130: 6e 74 28 70 2d 3e 70 41 72 72 61 79 29 3b 0a 20  nt(p->pArray);. 
d140: 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 30     p->pArray = 0
d150: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72  ;.  }.  Tcl_Decr
d160: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 71 6c  RefCount(p->pSql
d170: 29 3b 0a 20 20 64 62 52 65 6c 65 61 73 65 43 6f  );.  dbReleaseCo
d180: 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a 7d 0a  lumnNames(p);.}.
d190: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
d1a0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63 6c  pointer to a Tcl
d1b0: 5f 4f 62 6a 20 73 74 72 75 63 74 75 72 65 20 77  _Obj structure w
d1c0: 69 74 68 20 72 65 66 2d 63 6f 75 6e 74 20 30 20  ith ref-count 0 
d1d0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
d1e0: 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
d1f0: 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d  he iCol'th colum
d200: 6e 20 6f 66 20 74 68 65 20 72 6f 77 20 63 75 72  n of the row cur
d210: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 65 64 20 74  rently pointed t
d220: 6f 20 62 79 0a 2a 2a 20 74 68 65 20 44 62 45 76  o by.** the DbEv
d230: 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  alContext struct
d240: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
d250: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
d260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
d270: 4f 62 6a 20 2a 64 62 45 76 61 6c 43 6f 6c 75 6d  Obj *dbEvalColum
d280: 6e 56 61 6c 75 65 28 44 62 45 76 61 6c 43 6f 6e  nValue(DbEvalCon
d290: 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  text *p, int iCo
d2a0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  l){.  sqlite3_st
d2b0: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70  mt *pStmt = p->p
d2c0: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
d2d0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
d2e0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
d2f0: 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20  tmt, iCol) ){.  
d300: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
d310: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
d320: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
d330: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
d340: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
d350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c   const char *zBl
d360: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
d370: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
d380: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iCol);.      if(
d390: 20 21 7a 42 6c 6f 62 20 29 20 62 79 74 65 73 20   !zBlob ) bytes 
d3a0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
d3b0: 6e 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  n Tcl_NewByteArr
d3c0: 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62  ayObj((u8*)zBlob
d3d0: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 7d 0a  , bytes);.    }.
d3e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d3f0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
d400: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20   sqlite_int64 v 
d410: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
d420: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 43  _int64(pStmt, iC
d430: 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76  ol);.      if( v
d440: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
d450: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
d460: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d470: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28   Tcl_NewIntObj((
d480: 69 6e 74 29 76 29 3b 0a 20 20 20 20 20 20 7d 65  int)v);.      }e
d490: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
d4a0: 75 72 6e 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  urn Tcl_NewWideI
d4b0: 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20  ntObj(v);.      
d4c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  }.    }.    case
d4d0: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
d4e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
d4f0: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 73  l_NewDoubleObj(s
d500: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
d510: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c  uble(pStmt, iCol
d520: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ));.    }.    ca
d530: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
d540: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
d550: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
d560: 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d  p->pDb->zNull, -
d570: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  1);.    }.  }.. 
d580: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53   return Tcl_NewS
d590: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
d5a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
d5b0: 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ext(pStmt, iCol)
d5c0: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
d5d0: 49 66 20 75 73 69 6e 67 20 54 63 6c 20 76 65 72  If using Tcl ver
d5e0: 73 69 6f 6e 20 38 2e 36 20 6f 72 20 67 72 65 61  sion 8.6 or grea
d5f0: 74 65 72 2c 20 75 73 65 20 74 68 65 20 4e 52 20  ter, use the NR 
d600: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61 76 6f  functions to avo
d610: 69 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 20  id.** recursive 
d620: 65 76 61 6c 75 74 69 6f 6e 20 6f 66 20 73 63 72  evalution of scr
d630: 69 70 74 73 20 62 79 20 74 68 65 20 5b 64 62 20  ipts by the [db 
d640: 65 76 61 6c 5d 20 61 6e 64 20 5b 64 62 20 74 72  eval] and [db tr
d650: 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73  ans].** commands
d660: 2e 20 45 76 65 6e 20 69 66 20 74 68 65 20 68 65  . Even if the he
d670: 61 64 65 72 73 20 75 73 65 64 20 77 68 69 6c 65  aders used while
d680: 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 65   compiling the e
d690: 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  xtension.** are 
d6a0: 38 2e 36 20 6f 72 20 6e 65 77 65 72 2c 20 74 68  8.6 or newer, th
d6b0: 65 20 63 6f 64 65 20 73 74 69 6c 6c 20 74 65 73  e code still tes
d6c0: 74 73 20 74 68 65 20 54 63 6c 20 76 65 72 73 69  ts the Tcl versi
d6d0: 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a  on at runtime..*
d6e0: 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 74  * This allows st
d6f0: 75 62 73 2d 65 6e 61 62 6c 65 64 20 62 75 69 6c  ubs-enabled buil
d700: 64 73 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ds to be used wi
d710: 74 68 20 6f 6c 64 65 72 20 54 63 6c 20 6c 69 62  th older Tcl lib
d720: 72 61 72 69 65 73 2e 0a 2a 2f 0a 23 69 66 20 54  raries..*/.#if T
d730: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
d740: 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a 4f 52  >8 || (TCL_MAJOR
d750: 5f 56 45 52 53 49 4f 4e 3d 3d 38 20 26 26 20 54  _VERSION==8 && T
d760: 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e  CL_MINOR_VERSION
d770: 3e 3d 36 29 0a 23 20 64 65 66 69 6e 65 20 53 51  >=6).# define SQ
d780: 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 31 0a 73  LITE_TCL_NRE 1.s
d790: 74 61 74 69 63 20 69 6e 74 20 44 62 55 73 65 4e  tatic int DbUseN
d7a0: 72 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  re(void){.  int 
d7b0: 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a 20 20  major, minor;.  
d7c0: 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e 28 26  Tcl_GetVersion(&
d7d0: 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c 20 30  major, &minor, 0
d7e0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 28 20  , 0);.  return( 
d7f0: 28 6d 61 6a 6f 72 3d 3d 38 20 26 26 20 6d 69 6e  (major==8 && min
d800: 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f 72 3e  or>=6) || major>
d810: 38 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 0a  8 );.}.#else./*.
d820: 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 75 73 69  ** Compiling usi
d830: 6e 67 20 68 65 61 64 65 72 73 20 65 61 72 6c 69  ng headers earli
d840: 65 72 20 74 68 61 6e 20 38 2e 36 2e 20 49 6e 20  er than 8.6. In 
d850: 74 68 69 73 20 63 61 73 65 20 4e 52 20 63 61 6e  this case NR can
d860: 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
d870: 73 6f 20 44 62 55 73 65 4e 72 65 28 29 20 74 6f  so DbUseNre() to
d880: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a   always return z
d890: 65 72 6f 2e 20 41 64 64 20 23 64 65 66 69 6e 65  ero. Add #define
d8a0: 73 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 0a  s for the other.
d8b0: 2a 2a 20 54 63 6c 5f 4e 52 78 78 78 28 29 20 66  ** Tcl_NRxxx() f
d8c0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70 72 65 76  unctions to prev
d8d0: 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 63 61  ent them from ca
d8e0: 75 73 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f  using compilatio
d8f0: 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 65 76 65  n errors,.** eve
d900: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f 6e 6c  n though the onl
d910: 79 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66  y invocations of
d920: 20 74 68 65 6d 20 61 72 65 20 77 69 74 68 69 6e   them are within
d930: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 62 6c 6f   conditional blo
d940: 63 6b 73 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  cks.** of the fo
d950: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  rm:.**.**   if( 
d960: 44 62 55 73 65 4e 72 65 28 29 20 29 20 7b 20 2e  DbUseNre() ) { .
d970: 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  .. }.*/.# define
d980: 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20   SQLITE_TCL_NRE 
d990: 30 0a 23 20 64 65 66 69 6e 65 20 44 62 55 73 65  0.# define DbUse
d9a0: 4e 72 65 28 29 20 30 0a 23 20 64 65 66 69 6e 65  Nre() 0.# define
d9b0: 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61   Tcl_NRAddCallba
d9c0: 63 6b 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  ck(a,b,c,d,e,f) 
d9d0: 28 76 6f 69 64 29 30 0a 23 20 64 65 66 69 6e 65  (void)0.# define
d9e0: 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 61   Tcl_NREvalObj(a
d9f0: 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69 6e 65  ,b,c) 0.# define
da00: 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d   Tcl_NRCreateCom
da10: 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  mand(a,b,c,d,e,f
da20: 29 20 28 76 6f 69 64 29 30 0a 23 65 6e 64 69 66  ) (void)0.#endif
da30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
da40: 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
da50: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
da60: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61  ion of the comma
da70: 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20  nd:.**.**   $db 
da80: 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e  eval SQL ?ARRAYN
da90: 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73  AME? SCRIPT.*/.s
daa0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
dab0: 5f 54 43 4c 41 50 49 20 44 62 45 76 61 6c 4e 65  _TCLAPI DbEvalNe
dac0: 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44  xtCmd(.  ClientD
dad0: 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20  ata data[],     
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
daf0: 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20   data[0] is the 
db00: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29  (DbEvalContext*)
db10: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
db20: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20   *interp,       
db30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63             /* Tc
db40: 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  l interpreter */
db50: 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20  .  int result   
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
db80: 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20  t so far */.){. 
db90: 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74   int rc = result
dba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dbb0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dbc0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
dbd0: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
dbe0: 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20 61 72  of the data[] ar
dbf0: 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
dc00: 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e 74   to a DbEvalCont
dc10: 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ext.  ** structu
dc20: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  re allocated usi
dc30: 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20  ng Tcl_Alloc(). 
dc40: 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  The second eleme
dc50: 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a  nt of data[].  *
dc60: 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  * is a pointer t
dc70: 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74  o a Tcl_Obj cont
dc80: 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70  aining the scrip
dc90: 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63  t to run for eac
dca0: 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72  h row.  ** retur
dcb0: 6e 65 64 20 62 79 20 74 68 65 20 71 75 65 72 69  ned by the queri
dcc0: 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65 64 20  es encapsulated 
dcd0: 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20  in data[0]. */. 
dce0: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a   DbEvalContext *
dcf0: 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65  p = (DbEvalConte
dd00: 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20  xt *)data[0];.  
dd10: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
dd20: 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61   = (Tcl_Obj *)da
dd30: 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  ta[1];.  Tcl_Obj
dd40: 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e 70 41   *pArray = p->pA
dd50: 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20  rray;..  while( 
dd60: 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72  (rc==TCL_OK || r
dd70: 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29  c==TCL_CONTINUE)
dd80: 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20   && TCL_OK==(rc 
dd90: 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70 29 29  = dbEvalStep(p))
dda0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ddb0: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
ddc0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c   Tcl_Obj **apCol
ddd0: 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76 61 6c  Name;.    dbEval
dde0: 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c  RowInfo(p, &nCol
ddf0: 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20  , &apColName);. 
de00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
de10: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
de20: 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b  if( pArray==0 ){
de30: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
de40: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
de50: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c  apColName[i], 0,
de60: 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
de70: 75 65 28 70 2c 69 29 2c 20 30 29 3b 0a 20 20 20  ue(p,i), 0);.   
de80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
de90: 3e 65 76 61 6c 46 6c 61 67 73 20 26 20 53 51 4c  >evalFlags & SQL
dea0: 49 54 45 5f 45 56 41 4c 5f 57 49 54 48 4f 55 54  ITE_EVAL_WITHOUT
deb0: 4e 55 4c 4c 53 29 21 3d 30 0a 20 20 20 20 20 20  NULLS)!=0.      
dec0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
ded0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 2d  3_column_type(p-
dee0: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
def0: 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  , i)==SQLITE_NUL
df00: 4c 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  L .      ){.    
df10: 20 20 20 20 54 63 6c 5f 55 6e 73 65 74 56 61 72      Tcl_UnsetVar
df20: 32 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  2(interp, Tcl_Ge
df30: 74 53 74 72 69 6e 67 28 70 41 72 72 61 79 29 2c  tString(pArray),
df40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
df50: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
df60: 74 72 69 6e 67 28 61 70 43 6f 6c 4e 61 6d 65 5b  tring(apColName[
df70: 69 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  i]), 0);.      }
df80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63  else{.        Tc
df90: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
dfa0: 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43  erp, pArray, apC
dfb0: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 64 62 45 76 61  olName[i], dbEva
dfc0: 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 70 2c 69  lColumnValue(p,i
dfd0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ), 0);.      }. 
dfe0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
dff0: 20 72 65 71 75 69 72 65 64 20 69 6e 74 65 72 70   required interp
e000: 72 65 74 65 72 20 76 61 72 69 61 62 6c 65 73 20  reter variables 
e010: 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65  are now populate
e020: 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 0a  d with the data.
e030: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
e040: 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20  current row. If 
e050: 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64  using NRE, sched
e060: 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f  ule callbacks to
e070: 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a   evaluate.    **
e080: 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c   script pScript,
e090: 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20   then to invoke 
e0a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
e0b0: 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65  ain to fetch the
e0c0: 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77   next.    ** row
e0d0: 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69 66   (or clean up if
e0e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78   there is no nex
e0f0: 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63 72  t row or the scr
e100: 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20 20  ipt throws an.  
e110: 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e    ** exception).
e120: 20 41 66 74 65 72 20 73 63 68 65 64 75 6c 69 6e   After schedulin
e130: 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c  g the callbacks,
e140: 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20   return control 
e150: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  to the.    ** ca
e160: 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ller..    **.   
e170: 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67   ** If not using
e180: 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70   NRE, evaluate p
e190: 53 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 20  Script directly 
e1a0: 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74  and continue wit
e1b0: 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78  h the.    ** nex
e1c0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
e1d0: 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  his while(...) l
e1e0: 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  oop.  */.    if(
e1f0: 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20   DbUseNre() ){. 
e200: 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61       Tcl_NRAddCa
e210: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44  llback(interp, D
e220: 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76  bEvalNextCmd, (v
e230: 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70  oid*)p, (void*)p
e240: 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20  Script, 0, 0);. 
e250: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
e260: 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70  NREvalObj(interp
e270: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
e280: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e290: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
e2a0: 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
e2b0: 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  pt, 0);.    }.  
e2c0: 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  }..  Tcl_DecrRef
e2d0: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
e2e0: 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
e2f0: 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28  (p);.  Tcl_Free(
e300: 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69  (char *)p);..  i
e310: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc==TCL_OK ||
e320: 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
e330: 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  {.    Tcl_ResetR
e340: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
e350: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
e360: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
e380: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
e390: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
e3a0: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ations of the fo
e3b0: 6c 6c 6f 77 69 6e 67 20 64 61 74 61 62 61 73 65  llowing database
e3c0: 0a 2a 2a 20 68 61 6e 64 6c 65 20 73 75 62 2d 63  .** handle sub-c
e3d0: 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  ommands:.**.**  
e3e0: 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
e3f0: 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24   ?SCRIPT?.**   $
e400: 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 53 43 52  db wal_hook ?SCR
e410: 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 63 6f  IPT?.**   $db co
e420: 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 53 43 52 49 50  mmit_hook ?SCRIP
e430: 54 3f 0a 2a 2a 20 20 20 24 64 62 20 70 72 65 75  T?.**   $db preu
e440: 70 64 61 74 65 20 68 6f 6f 6b 20 3f 53 43 52 49  pdate hook ?SCRI
e450: 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  PT?.*/.static vo
e460: 69 64 20 44 62 48 6f 6f 6b 43 6d 64 28 0a 20 20  id DbHookCmd(.  
e470: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e480: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
e490: 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74  /* Tcl interpret
e4a0: 65 72 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62  er */.  SqliteDb
e4b0: 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20   *pDb,          
e4c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
e4d0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
e4e0: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 2c 20 20  Tcl_Obj *pArg,  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 2f 2a 20 53 43 52 49 50 54 20 61 72 67 75 6d 65  /* SCRIPT argume
e510: 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  nt (or NULL) */.
e520: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f    Tcl_Obj **ppHo
e530: 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ok              
e540: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
e550: 6d 65 6d 62 65 72 20 6f 66 20 53 71 6c 69 74 65  member of Sqlite
e560: 44 62 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  Db */.){.  sqlit
e570: 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62  e3 *db = pDb->db
e580: 3b 0a 0a 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b  ;..  if( *ppHook
e590: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
e5a0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
e5b0: 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 69   *ppHook);.    i
e5c0: 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
e5d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
e5e0: 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
e5f0: 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
e600: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
e610: 41 72 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Arg ){.    asser
e620: 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b  t( !(*ppHook) );
e630: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
e640: 43 68 61 72 4c 65 6e 67 74 68 28 70 41 72 67 29  CharLength(pArg)
e650: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 48  >0 ){.      *ppH
e660: 6f 6f 6b 20 3d 20 70 41 72 67 3b 0a 20 20 20 20  ook = pArg;.    
e670: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
e680: 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
e690: 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
e6a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
e6b0: 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 73 71  UPDATE_HOOK.  sq
e6c0: 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
e6d0: 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70  hook(db, (pDb->p
e6e0: 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62  PreUpdateHook?Db
e6f0: 50 72 65 55 70 64 61 74 65 48 61 6e 64 6c 65 72  PreUpdateHandler
e700: 3a 30 29 2c 20 70 44 62 29 3b 0a 23 65 6e 64 69  :0), pDb);.#endi
e710: 66 0a 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61  f.  sqlite3_upda
e720: 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62  te_hook(db, (pDb
e730: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62  ->pUpdateHook?Db
e740: 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29  UpdateHandler:0)
e750: 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , pDb);.  sqlite
e760: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
e770: 64 62 2c 20 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  db, (pDb->pRollb
e780: 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61  ackHook?DbRollba
e790: 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44  ckHandler:0), pD
e7a0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  b);.  sqlite3_wa
e7b0: 6c 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d  l_hook(db, (pDb-
e7c0: 3e 70 57 61 6c 48 6f 6f 6b 3f 44 62 57 61 6c 48  >pWalHook?DbWalH
e7d0: 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b  andler:0), pDb);
e7e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73  .}../*.** The "s
e7f0: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62  qlite" command b
e800: 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e  elow creates a n
e810: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66  ew Tcl command f
e820: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65  or each.** conne
e830: 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74  ction it opens t
e840: 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  o an SQLite data
e850: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
e860: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a  ine is invoked.*
e870: 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f  * whenever one o
e880: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
e890: 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d  on-specific comm
e8a0: 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65 64  ands is executed
e8b0: 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72  .** in Tcl.  For
e8c0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75   example, if you
e8d0: 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69   run Tcl code li
e8e0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
e8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 31       sqlite3 db1
e900: 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a    "my_database".
e910: 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f  **       db1 clo
e920: 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  se.**.** The fir
e930: 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73  st command opens
e940: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
e950: 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73   the "my_databas
e960: 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61  e" database.** a
e970: 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f  nd calls that co
e980: 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20  nnection "db1". 
e990: 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d   The second comm
e9a0: 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a  and causes this.
e9b0: 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  ** subroutine to
e9c0: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a   be invoked..*/.
e9d0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
e9e0: 45 5f 54 43 4c 41 50 49 20 44 62 4f 62 6a 43 6d  E_TCLAPI DbObjCm
e9f0: 64 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20  d(.  void *cd,. 
ea00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ea10: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
ea20: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  .  Tcl_Obj *cons
ea30: 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 53 71 6c 69  t*objv.){.  Sqli
ea40: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
ea50: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
ea60: 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20 72   choice;.  int r
ea70: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74  c = TCL_OK;.  st
ea80: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
ea90: 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  *DB_strs[] = {. 
eaa0: 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72 22 2c     "authorizer",
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62 61               "ba
eac0: 63 6b 75 70 22 2c 20 20 20 20 20 20 20 20 20 20  ckup",          
ead0: 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20 20        "busy",.  
eae0: 20 20 22 63 61 63 68 65 22 2c 20 20 20 20 20 20    "cache",      
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68 61              "cha
eb00: 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
eb10: 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a 20 20       "close",.  
eb20: 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20    "collate",    
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c              "col
eb40: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20  lation_needed", 
eb50: 20 20 20 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f       "commit_hoo
eb60: 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74  k",.    "complet
eb70: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
eb80: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
eb90: 20 20 20 20 20 20 20 20 20 20 20 22 64 65 73 65             "dese
eba0: 72 69 61 6c 69 7a 65 22 2c 0a 20 20 20 20 22 65  rialize",.    "e
ebb0: 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
ebc0: 73 69 6f 6e 22 2c 20 20 22 65 72 72 6f 72 63 6f  sion",  "errorco
ebd0: 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  de",            
ebe0: 20 22 65 76 61 6c 22 2c 0a 20 20 20 20 22 65 78   "eval",.    "ex
ebf0: 69 73 74 73 22 2c 20 20 20 20 20 20 20 20 20 20  ists",          
ec00: 20 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f 6e         "function
ec10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ec20: 22 69 6e 63 72 62 6c 6f 62 22 2c 0a 20 20 20 20  "incrblob",.    
ec30: 22 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20  "interrupt",    
ec40: 20 20 20 20 20 20 20 20 20 20 22 6c 61 73 74 5f            "last_
ec50: 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20  insert_rowid",  
ec60: 20 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 0a     "nullvalue",.
ec70: 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c      "onecolumn",
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
ec90: 72 65 75 70 64 61 74 65 22 2c 20 20 20 20 20 20  reupdate",      
eca0: 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c 65 22         "profile"
ecb0: 2c 0a 20 20 20 20 22 70 72 6f 67 72 65 73 73 22  ,.    "progress"
ecc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ecd0: 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20  "rekey",        
ece0: 20 20 20 20 20 20 20 20 20 22 72 65 73 74 6f 72           "restor
ecf0: 65 22 2c 0a 20 20 20 20 22 72 6f 6c 6c 62 61 63  e",.    "rollbac
ed00: 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20  k_hook",        
ed10: 20 20 22 73 65 72 69 61 6c 69 7a 65 22 2c 20 20    "serialize",  
ed20: 20 20 20 20 20 20 20 20 20 20 20 22 73 74 61 74             "stat
ed30: 75 73 22 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75  us",.    "timeou
ed40: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
ed50: 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65     "total_change
ed60: 73 22 2c 20 20 20 20 20 20 20 20 20 22 74 72 61  s",         "tra
ed70: 63 65 22 2c 0a 20 20 20 20 22 74 72 61 63 65 5f  ce",.    "trace_
ed80: 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  v2",            
ed90: 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22     "transaction"
eda0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 6c  ,           "unl
edb0: 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 0a 20 20 20  ock_notify",.   
edc0: 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20   "update_hook", 
edd0: 20 20 20 20 20 20 20 20 20 20 20 22 76 65 72 73             "vers
ede0: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ion",           
edf0: 20 20 20 20 22 77 61 6c 5f 68 6f 6f 6b 22 2c 0a      "wal_hook",.
ee00: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
ee20: 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75  };.  enum DB_enu
ee30: 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48 4f  m {.    DB_AUTHO
ee40: 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20 20 20  RIZER,          
ee50: 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20    DB_BACKUP,    
ee60: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 42 55             DB_BU
ee70: 53 59 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45  SY,.    DB_CACHE
ee80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ee90: 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20 20    DB_CHANGES,   
eea0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c             DB_CL
eeb0: 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c  OSE,.    DB_COLL
eec0: 41 54 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  ATE,            
eed0: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f     DB_COLLATION_
eee0: 4e 45 45 44 45 44 2c 20 20 20 20 20 44 42 5f 43  NEEDED,     DB_C
eef0: 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20  OMMIT_HOOK,.    
ef00: 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20  DB_COMPLETE,    
ef10: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 50            DB_COP
ef20: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,              
ef30: 20 20 20 44 42 5f 44 45 53 45 52 49 41 4c 49 5a     DB_DESERIALIZ
ef40: 45 2c 0a 20 20 20 20 44 42 5f 45 4e 41 42 4c 45  E,.    DB_ENABLE
ef50: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c  _LOAD_EXTENSION,
ef60: 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20   DB_ERRORCODE,  
ef70: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 56 41            DB_EVA
ef80: 4c 2c 0a 20 20 20 20 44 42 5f 45 58 49 53 54 53  L,.    DB_EXISTS
ef90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
efa0: 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20   DB_FUNCTION,   
efb0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 43            DB_INC
efc0: 52 42 4c 4f 42 2c 0a 20 20 20 20 44 42 5f 49 4e  RBLOB,.    DB_IN
efd0: 54 45 52 52 55 50 54 2c 20 20 20 20 20 20 20 20  TERRUPT,        
efe0: 20 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53       DB_LAST_INS
eff0: 45 52 54 5f 52 4f 57 49 44 2c 20 20 20 20 44 42  ERT_ROWID,    DB
f000: 5f 4e 55 4c 4c 56 41 4c 55 45 2c 0a 20 20 20 20  _NULLVALUE,.    
f010: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20  DB_ONECOLUMN,   
f020: 20 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 45            DB_PRE
f030: 55 50 44 41 54 45 2c 20 20 20 20 20 20 20 20 20  UPDATE,         
f040: 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 0a 20     DB_PROFILE,. 
f050: 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20     DB_PROGRESS, 
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
f070: 52 45 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20  REKEY,          
f080: 20 20 20 20 20 20 44 42 5f 52 45 53 54 4f 52 45        DB_RESTORE
f090: 2c 0a 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43  ,.    DB_ROLLBAC
f0a0: 4b 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20 20 20  K_HOOK,         
f0b0: 44 42 5f 53 45 52 49 41 4c 49 5a 45 2c 20 20 20  DB_SERIALIZE,   
f0c0: 20 20 20 20 20 20 20 20 20 44 42 5f 53 54 41 54           DB_STAT
f0d0: 55 53 2c 0a 20 20 20 20 44 42 5f 54 49 4d 45 4f  US,.    DB_TIMEO
f0e0: 55 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  UT,             
f0f0: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
f100: 45 53 2c 20 20 20 20 20 20 20 20 44 42 5f 54 52  ES,        DB_TR
f110: 41 43 45 2c 0a 20 20 20 20 44 42 5f 54 52 41 43  ACE,.    DB_TRAC
f120: 45 5f 56 32 2c 20 20 20 20 20 20 20 20 20 20 20  E_V2,           
f130: 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f     DB_TRANSACTIO
f140: 4e 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 55  N,          DB_U
f150: 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 0a 20 20  NLOCK_NOTIFY,.  
f160: 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b    DB_UPDATE_HOOK
f170: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 56  ,           DB_V
f180: 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
f190: 20 20 20 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b       DB_WAL_HOOK
f1a0: 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74  .  };.  /* don't
f1b0: 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20   leave trailing 
f1c0: 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75  commas on DB_enu
f1d0: 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74  m, it confuses t
f1e0: 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69  he AIX xlc compi
f1f0: 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ler */..  if( ob
f200: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
f210: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f220: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
f230: 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b  UBCOMMAND ...");
f240: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f250: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
f260: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
f270: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
f280: 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22  v[1], DB_strs, "
f290: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f  option", 0, &cho
f2a0: 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ice) ){.    retu
f2b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f2c0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e  }..  switch( (en
f2d0: 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63  um DB_enum)choic
f2e0: 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64  e ){..  /*    $d
f2f0: 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41  b authorizer ?CA
f300: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
f310: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
f320: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  en callback to a
f330: 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51  uthorize each SQ
f340: 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69  L operation as i
f350: 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  t is.  ** compil
f360: 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73  ed.  5 arguments
f370: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
f380: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65   the callback be
f390: 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20  fore it is.  ** 
f3a0: 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20  invoked:.  **.  
f3b0: 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74  **   (1) The aut
f3c0: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20  horization type 
f3d0: 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41  (ex: SQLITE_CREA
f3e0: 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45  TE_TABLE, SQLITE
f3f0: 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20  _INSERT, ...).  
f400: 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64  **   (2) First d
f410: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20  escriptive name 
f420: 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68  (depends on auth
f430: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a  orization type).
f440: 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e    **   (3) Secon
f450: 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  d descriptive na
f460: 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61  me.  **   (4) Na
f470: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
f480: 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20  se (ex: "main", 
f490: 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28  "temp").  **   (
f4a0: 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  5) Name of trigg
f4b0: 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67  er that is doing
f4c0: 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a   the access.  **
f4d0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  .  ** The callba
f4e0: 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ck should return
f4f0: 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f   on of the follo
f500: 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51  wing strings: SQ
f510: 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51  LITE_OK,.  ** SQ
f520: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20  LITE_IGNORE, or 
f530: 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e  SQLITE_DENY.  An
f540: 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
f550: 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72  alue is an error
f560: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
f570: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e  his method is in
f580: 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72  voked with no ar
f590: 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72  guments, the cur
f5a0: 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69  rent authorizati
f5b0: 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  on.  ** callback
f5c0: 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
f5d0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
f5e0: 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20   DB_AUTHORIZER: 
f5f0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
f600: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
f610: 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ON.    Tcl_Appen
f620: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f630: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e  "authorization n
f640: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
f650: 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20  this build",.   
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
f680: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f690: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  R;.#else.    if(
f6a0: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
f6b0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f6c0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
f6d0: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
f6e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
f6f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
f700: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
f710: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
f720: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
f730: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f740: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
f750: 3e 7a 41 75 74 68 2c 20 28 63 68 61 72 2a 29 30  >zAuth, (char*)0
f760: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f770: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
f780: 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69   *zAuth;.      i
f790: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
f7a0: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
f7b0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
f7c0: 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20  (pDb->zAuth);.  
f7d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74      }.      zAut
f7e0: 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  h = Tcl_GetStrin
f7f0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
f800: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
f810: 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e  f( zAuth && len>
f820: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
f830: 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c  ->zAuth = Tcl_Al
f840: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
f850: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
f860: 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68  Db->zAuth, zAuth
f870: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
f880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
f890: 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20  Db->zAuth = 0;. 
f8a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f8b0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
f8c0: 20 20 20 20 20 20 20 74 79 70 65 64 65 66 20 69         typedef i
f8d0: 6e 74 20 28 2a 73 71 6c 69 74 65 33 5f 61 75 74  nt (*sqlite3_aut
f8e0: 68 5f 63 62 29 28 0a 20 20 20 20 20 20 20 20 20  h_cb)(.         
f8f0: 20 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73    void*,int,cons
f900: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
f910: 61 72 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ar*,.           
f920: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
f930: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
f940: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
f950: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
f960: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
f970: 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 28  orizer(pDb->db,(
f980: 73 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29  sqlite3_auth_cb)
f990: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 70 44  auth_callback,pD
f9a0: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
f9b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f9c0: 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
f9d0: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
f9e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
f9f0: 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
fa00: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
fa10: 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41 53   backup ?DATABAS
fa20: 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a  E? FILENAME.  **
fa30: 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72  .  ** Open or cr
fa40: 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
fa50: 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e  file named FILEN
fa60: 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74  AME.  Transfer t
fa70: 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  he.  ** content 
fa80: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  of local databas
fa90: 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61  e DATABASE (defa
faa0: 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74  ult: "main") int
fab0: 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e  o the.  ** FILEN
fac0: 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20 20  AME database..  
fad0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41 43  */.  case DB_BAC
fae0: 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74  KUP: {.    const
faf0: 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65   char *zDestFile
fb00: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
fb10: 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73 71   *zSrcDb;.    sq
fb20: 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20  lite3 *pDest;.  
fb30: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
fb40: 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20   *pBackup;..    
fb50: 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
fb60: 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22 6d       zSrcDb = "m
fb70: 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65 73  ain";.      zDes
fb80: 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  tFile = Tcl_GetS
fb90: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
fba0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
fbb0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a  jc==4 ){.      z
fbc0: 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74 53  SrcDb = Tcl_GetS
fbd0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
fbe0: 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
fbf0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
fc00: 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65  objv[3]);.    }e
fc10: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
fc20: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
fc30: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44  rp, 2, objv, "?D
fc40: 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d  ATABASE? FILENAM
fc50: 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E");.      retur
fc60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
fc70: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
fc80: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73  te3_open_v2(zDes
fc90: 74 46 69 6c 65 2c 20 26 70 44 65 73 74 2c 0a 20  tFile, &pDest,. 
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
fcb0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
fcc0: 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
fcd0: 4e 5f 43 52 45 41 54 45 7c 20 70 44 62 2d 3e 6f  N_CREATE| pDb->o
fce0: 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
fcf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fd00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
fd10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fd20: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  terp, "cannot op
fd30: 65 6e 20 74 61 72 67 65 74 20 64 61 74 61 62 61  en target databa
fd40: 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  se: ",.         
fd50: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
fd60: 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29  (pDest), (char*)
fd70: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
fd80: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
fd90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
fda0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
fdb0: 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
fdc0: 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
fdd0: 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70  pDest, "main", p
fde0: 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b  Db->db, zSrcDb);
fdf0: 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70  .    if( pBackup
fe00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
fe10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fe20: 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61  terp, "backup fa
fe30: 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  iled: ",.       
fe40: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
fe50: 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72  sg(pDest), (char
fe60: 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
fe70: 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
fe80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
fe90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fea0: 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20      while(  (rc 
feb0: 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
fec0: 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
fed0: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
fee0: 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  {}.    sqlite3_b
fef0: 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
ff00: 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
ff10: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
ff20: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
ff30: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
ff40: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ff50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ff60: 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22  backup failed: "
ff70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
ff80: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
ff90: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
ffa0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
ffb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
ffc0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
ffd0: 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  st);.    break;.
ffe0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
fff0: 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f   busy ?CALLBACK?
10000 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
10010 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
10020 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73  back if an SQL s
10030 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74  tatement attempt
10040 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  s to open.  ** a
10050 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65   locked database
10060 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61   file..  */.  ca
10070 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20  se DB_BUSY: {.  
10080 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
10090 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
100a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
100b0 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43  , objv, "CALLBAC
100c0 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
100d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
100e0 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
100f0 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
10100 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
10110 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10120 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
10130 44 62 2d 3e 7a 42 75 73 79 2c 20 28 63 68 61 72  Db->zBusy, (char
10140 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
10150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
10160 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20  har *zBusy;.    
10170 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
10180 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
10190 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
101a0 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b  ree(pDb->zBusy);
101b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
101c0 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  Busy = Tcl_GetSt
101d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
101e0 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
101f0 20 20 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c    if( zBusy && l
10200 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
10210 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c  pDb->zBusy = Tcl
10220 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
10230 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
10240 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42  y(pDb->zBusy, zB
10250 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  usy, len+1);.   
10260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10270 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30    pDb->zBusy = 0
10280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10290 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
102a0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
102b0 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
102c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
102d0 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62  busy_handler(pDb
102e0 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64  ->db, DbBusyHand
102f0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
10300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10310 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
10320 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  dler(pDb->db, 0,
10330 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10340 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
10350 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20  }..  /*     $db 
10360 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a  cache flush.  **
10370 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20 73       $db cache s
10380 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize n.  **.  ** 
10390 46 6c 75 73 68 20 74 68 65 20 70 72 65 70 61 72  Flush the prepar
103a0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63  ed statement cac
103b0 68 65 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d  he, or set the m
103c0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
103d0 0a 20 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61  .  ** cached sta
103e0 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
103f0 63 61 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b  case DB_CACHE: {
10400 0a 20 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d  .    char *subCm
10410 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20  d;.    int n;.. 
10420 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29     if( objc<=2 )
10430 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
10440 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10450 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65   1, objv, "cache
10460 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b   option ?arg?");
10470 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10480 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10490 20 20 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f     subCmd = Tcl_
104a0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
104b0 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a  ( objv[2], 0 );.
104c0 20 20 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d      if( *subCmd=
104d0 3d 27 66 27 20 26 26 20 73 74 72 63 6d 70 28 73  ='f' && strcmp(s
104e0 75 62 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d  ubCmd,"flush")==
104f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 ){.      if( o
10500 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
10510 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10520 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10530 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20  jv, "flush");.  
10540 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10550 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
10560 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75  lse{.        flu
10570 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62  shStmtCache( pDb
10580 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
10590 7d 65 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d  }else if( *subCm
105a0 64 3d 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70  d=='s' && strcmp
105b0 28 73 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d  (subCmd,"size")=
105c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
105d0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
105e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
105f0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10600 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a  bjv, "size n");.
10610 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
10620 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
10630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
10640 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63  f( TCL_ERROR==Tc
10650 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
10660 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
10670 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &n) ){.        
10680 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10690 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e  lt( interp, "can
106a0 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c  not convert \"",
106b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
106c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
106d0 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c  mObj(objv[3],0),
106e0 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22   "\" to integer"
106f0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
10700 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
10710 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
10720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10730 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
10740 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53 74           flushSt
10750 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a  mtCache( pDb );.
10760 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
10770 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
10780 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45  se if( n>MAX_PRE
10790 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20  PARED_STMTS ){. 
107a0 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d             n = M
107b0 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  AX_PREPARED_STMT
107c0 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  S;.          }. 
107d0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61           pDb->ma
107e0 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20  xStmt = n;.     
107f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
10810 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20  l_AppendResult( 
10820 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74  interp, "bad opt
10830 69 6f 6e 20 5c 22 22 2c 0a 20 20 20 20 20 20 20  ion \"",.       
10840 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
10850 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
10860 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  0), "\": must be
10870 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c   flush or size",
10880 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
10890 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
108a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
108b0 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
108c0 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
108d0 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20   changes.  **.  
108e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
108f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
10900 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
10910 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
10920 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68  leted by.  ** th
10930 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e  e most recent IN
10940 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
10950 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
10960 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a  , not including.
10970 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73    ** any changes
10980 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72   made by trigger
10990 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a   programs..  */.
109a0 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45    case DB_CHANGE
109b0 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
109c0 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
109d0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
109e0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
109f0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10a00 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
10a10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10a20 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
10a30 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
10a40 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
10a50 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
10a60 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
10a70 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d  te3_changes(pDb-
10a80 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  >db));.    break
10a90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
10aa0 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20  db close.  **.  
10ab0 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
10ac0 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
10ad0 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b  case DB_CLOSE: {
10ae0 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43  .    Tcl_DeleteC
10af0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54  ommand(interp, T
10b00 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10b10 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29  Obj(objv[0], 0))
10b20 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
10b30 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
10b40 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45  $db collate NAME
10b50 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
10b60 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
10b70 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
10b80 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
10b90 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a  E.  Whenever.  *
10ba0 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
10bb0 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  is called, invok
10bc0 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
10bd0 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
10be0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
10bf0 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  B_COLLATE: {.   
10c00 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
10c10 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20  llate;.    char 
10c20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
10c30 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69   *zScript;.    i
10c40 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20  nt nScript;.    
10c50 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
10c60 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10c70 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10c80 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52   objv, "NAME SCR
10c90 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
10ca0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10cb0 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
10cc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10cd0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
10ce0 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
10cf0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10d00 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
10d10 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43  nScript);.    pC
10d20 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c  ollate = (SqlCol
10d30 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  late*)Tcl_Alloc(
10d40 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74   sizeof(*pCollat
10d50 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31  e) + nScript + 1
10d60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
10d70 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  late==0 ) return
10d80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10d90 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70  pCollate->interp
10da0 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70   = interp;.    p
10db0 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d  Collate->pNext =
10dc0 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a   pDb->pCollate;.
10dd0 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53      pCollate->zS
10de0 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26  cript = (char*)&
10df0 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20  pCollate[1];.   
10e00 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d   pDb->pCollate =
10e10 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d   pCollate;.    m
10e20 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e  emcpy(pCollate->
10e30 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74  zScript, zScript
10e40 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20  , nScript+1);.  
10e50 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72    if( sqlite3_cr
10e60 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70  eate_collation(p
10e70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53  Db->db, zName, S
10e80 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20  QLITE_UTF8,.    
10e90 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63      pCollate, tc
10ea0 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a  lSqlCollate) ){.
10eb0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
10ec0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
10ed0 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
10ee0 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
10ef0 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
10f00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10f10 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
10f20 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
10f30 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
10f40 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52  ation_needed SCR
10f50 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
10f60 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63  eate a new SQL c
10f70 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
10f80 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
10f90 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68  Whenever.  ** th
10fa0 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  at function is c
10fb0 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
10fc0 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
10fd0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
10fe0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
10ff0 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20  LLATION_NEEDED: 
11000 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
11010 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
11020 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11030 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 2, objv, "SC
11040 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
11050 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11060 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44      }.    if( pD
11070 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
11080 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  d ){.      Tcl_D
11090 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
110a0 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
110b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
110c0 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
110d0 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
110e0 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  bj(objv[2]);.   
110f0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
11100 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
11110 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  eeded);.    sqli
11120 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
11130 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44  eded(pDb->db, pD
11140 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  b, tclCollateNee
11150 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ded);.    break;
11160 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
11170 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43  b commit_hook ?C
11180 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
11190 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
111a0 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73  ven callback jus
111b0 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
111c0 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72  ing every SQL tr
111d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
111e0 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  If the callback 
111f0 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
11200 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e  ion or returns n
11210 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
11220 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
11230 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20  on is aborted.  
11240 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61  If CALLBACK is a
11250 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
11260 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a  the callback.  *
11270 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20  * is disabled.. 
11280 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
11290 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20  MMIT_HOOK: {.   
112a0 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
112b0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
112c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
112d0 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
112e0 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
112f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11300 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
11310 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
11320 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
11330 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
11340 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11350 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20  , pDb->zCommit, 
11360 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
11370 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11380 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11390 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69  zCommit;.      i
113a0 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
113b0 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
113c0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
113d0 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29  ee(pDb->zCommit)
113e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
113f0 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65  zCommit = Tcl_Ge
11400 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11410 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
11420 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74       if( zCommit
11430 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
11440 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69       pDb->zCommi
11450 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  t = Tcl_Alloc( l
11460 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
11470 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 43    memcpy(pDb->zC
11480 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20  ommit, zCommit, 
11490 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
114a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
114b0 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20  ->zCommit = 0;. 
114c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
114d0 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
114e0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
114f0 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
11500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
11510 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e  ommit_hook(pDb->
11520 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  db, DbCommitHand
11530 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
11540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11550 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
11560 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ook(pDb->db, 0, 
11570 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
11580 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
11590 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
115a0 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a  mplete SQL.  **.
115b0 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45    ** Return TRUE
115c0 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d   if SQL is a com
115d0 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d  plete SQL statem
115e0 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ent.  Return FAL
115f0 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74  SE if.  ** addit
11600 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69  ional lines of i
11610 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e  nput are needed.
11620 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61    This is simila
11630 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75  r to the.  ** bu
11640 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d  ilt-in "info com
11650 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f  plete" command o
11660 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61  f Tcl..  */.  ca
11670 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20  se DB_COMPLETE: 
11680 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
11690 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20  _OMIT_COMPLETE. 
116a0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
116b0 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43  ult;.    int isC
116c0 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28  omplete;.    if(
116d0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
116e0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
116f0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
11700 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20  jv, "SQL");.    
11710 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11720 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73  OR;.    }.    is
11730 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74  Complete = sqlit
11740 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c  e3_complete( Tcl
11750 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11760 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b  j(objv[2], 0) );
11770 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
11780 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
11790 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
117a0 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70  _SetBooleanObj(p
117b0 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65  Result, isComple
117c0 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  te);.#endif.    
117d0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
117e0 20 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f 6e      $db copy con
117f0 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
11800 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f  table filename ?
11810 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c  SEPARATOR? ?NULL
11820 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a  INDICATOR?.  **.
11830 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 69    ** Copy data i
11840 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20 66  nto table from f
11850 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61  ilename, optiona
11860 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52 41  lly using SEPARA
11870 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75  TOR.  ** as colu
11880 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20  mn separators.  
11890 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  If a column cont
118a0 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72 69  ains a null stri
118b0 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng, or the.  ** 
118c0 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44  value of NULLIND
118d0 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69  ICATOR, a NULL i
118e0 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74  s inserted for t
118f0 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20  he column..  ** 
11900 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
11910 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  hm is one of the
11920 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74   sqlite conflict
11930 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a   algorithms:.  *
11940 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  *    rollback, a
11950 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f  bort, fail, igno
11960 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  re, replace.  **
11970 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
11980 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
11990 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65  f lines processe
119a0 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  d, not necessari
119b0 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20  ly same.  ** as 
119c0 27 64 62 20 63 68 61 6e 67 65 73 27 20 64 75 65  'db changes' due
119d0 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67   to conflict-alg
119e0 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64 2e  orithm selected.
119f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
11a00 63 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c 6c  code is basicall
11a10 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  y an implementat
11a20 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20  ion/enhancement 
11a30 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
11a40 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d  te3 shell.c ".im
11a50 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20  port" command.. 
11a60 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
11a70 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20 65  mmand usage is e
11a80 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
11a90 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59 20   sqlite2.x COPY 
11aa0 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  statement,.  ** 
11ab0 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66 69  which imports fi
11ac0 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74  le data into a t
11ad0 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 50  able using the P
11ae0 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20 66  ostgreSQL COPY f
11af0 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a  ile format:.  **
11b00 20 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f 6e     $db copy $con
11b10 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65  flit_algo $table
11b20 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20  _name $filename 
11b30 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61  \t \\N.  */.  ca
11b40 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20  se DB_COPY: {.  
11b50 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20    char *zTable; 
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b70 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
11b80 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
11b90 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b      char *zFile;
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d  /* The file from
11bc0 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61 63   which to extrac
11bd0 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63 68  t data */.    ch
11be0 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20  ar *zConflict;  
11bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11c00 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   conflict algori
11c10 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  thm to use */.  
11c20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11c30 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a  pStmt;        /*
11c40 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a   A statement */.
11c50 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
11c80 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
11c90 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  e */.    int nBy
11ca0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
11cb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11cc0 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51  f bytes in an SQ
11cd0 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  L string */.    
11ce0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11d00 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
11d10 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20      int nSep;   
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
11d40 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a  es in zSep[] */.
11d50 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20      int nNull;  
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
11d80 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f  es in zNull[] */
11d90 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65   /* An SQL state
11dc0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  ment */.    char
11dd0 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20   *zLine;        
11de0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
11df0 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75  gle line of inpu
11e00 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  t from the file 
11e10 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  */.    char **az
11e20 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
11e30 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72     /* zLine[] br
11e40 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c  oken up into col
11e50 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  umns */.    cons
11e60 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b  t char *zCommit;
11e70 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
11e80 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73  o commit changes
11e90 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e   */.    FILE *in
11ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11eb0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74      /* The input
11ec0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
11ed0 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20   lineno = 0;    
11ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
11ef0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   number of input
11f00 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61   file */.    cha
11f10 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20  r zLineNum[80]; 
11f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
11f30 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75   number print bu
11f40 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ffer */.    Tcl_
11f50 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20  Obj *pResult;   
11f60 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72          /* inter
11f70 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20  p result */..   
11f80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
11f90 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  p;.    const cha
11fa0 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  r *zNull;.    if
11fb0 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63  ( objc<5 || objc
11fc0 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >7 ){.      Tcl_
11fd0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
11fe0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 0a 20 20  erp, 2, objv,.  
11ff0 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43 54         "CONFLICT
12000 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45  -ALGORITHM TABLE
12010 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52   FILENAME ?SEPAR
12020 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43  ATOR? ?NULLINDIC
12030 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20 72  ATOR?");.      r
12040 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12050 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
12060 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20  bjc>=6 ){.      
12070 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSep = Tcl_GetSt
12080 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
12090 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  [5], 0);.    }el
120a0 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d  se{.      zSep =
120b0 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20   "\t";.    }.   
120c0 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a   if( objc>=7 ){.
120d0 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63        zNull = Tc
120e0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
120f0 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a  bj(objv[6], 0);.
12100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12110 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20   zNull = "";.   
12120 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74   }.    zConflict
12130 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12140 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
12150 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20   0);.    zTable 
12160 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
12170 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
12180 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  0);.    zFile = 
12190 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
121a0 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29  mObj(objv[4], 0)
121b0 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72  ;.    nSep = str
121c0 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20 20  len30(zSep);.   
121d0 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 33   nNull = strlen3
121e0 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66  0(zNull);.    if
121f0 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( nSep==0 ){.   
12200 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12210 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
12220 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61  r: non-null sepa
12230 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
12240 6f 72 20 63 6f 70 79 22 2c 0a 20 20 20 20 20 20  or copy",.      
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
12270 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12280 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
12290 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63  (strcmp(zConflic
122a0 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21  t, "rollback") !
122b0 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
122c0 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
122d0 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30  "abort"   ) != 0
122e0 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d   &&.       strcm
122f0 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61  p(zConflict, "fa
12300 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26  il"    ) != 0 &&
12310 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
12320 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72  Conflict, "ignor
12330 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  e"  ) != 0 &&.  
12340 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
12350 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22  flict, "replace"
12360 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20   ) != 0 ) {.    
12370 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12380 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
12390 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63  r: \"", zConflic
123a0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  t,.            "
123b0 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67  \", conflict-alg
123c0 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f  orithm must be o
123d0 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c  ne of: rollback,
123e0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
123f0 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
12400 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22  ore, or replace"
12410 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
12420 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12430 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
12440 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
12450 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
12460 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61 62  FROM '%q'", zTab
12470 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  le);.    if( zSq
12480 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  l==0 ){.      Tc
12490 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
124a0 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e  nterp, "Error: n
124b0 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
124c0 20 7a 54 61 62 6c 65 2c 20 28 63 68 61 72 2a 29   zTable, (char*)
124d0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
124e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
124f0 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74  }.    nByte = st
12500 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
12510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
12520 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20  repare(pDb->db, 
12530 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
12540 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12550 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
12560 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12570 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12580 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
12590 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
125a0 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
125b0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
125c0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  nCol = 0;.    }e
125d0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  lse{.      nCol 
125e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
125f0 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
12600 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12610 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
12620 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d  ;.    if( nCol==
12630 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  0 ) {.      retu
12640 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12650 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d    }.    zSql = m
12660 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35  alloc( nByte + 5
12670 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20  0 + nCol*2 );.  
12680 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
12690 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
126a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
126b0 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d   "Error: can't m
126c0 61 6c 6c 6f 63 28 29 22 2c 20 28 63 68 61 72 2a  alloc()", (char*
126d0 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
126e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
126f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
12700 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30  nprintf(nByte+50
12710 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20  , zSql, "INSERT 
12720 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20  OR %q INTO '%q' 
12730 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20  VALUES(?",.     
12740 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a      zConflict, z
12750 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
12760 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
12770 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
12780 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
12790 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
127a0 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
127b0 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
127c0 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
127d0 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
127e0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
127f0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44  lite3_prepare(pD
12800 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
12810 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
12820 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20   free(zSql);.   
12830 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12840 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12850 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
12860 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
12870 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
12880 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73  har*)0);.      s
12890 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
128a0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
128b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
128c0 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
128d0 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
128e0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
128f0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
12900 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12910 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  p, "Error: canno
12920 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
12930 7a 46 69 6c 65 2c 20 28 63 68 61 72 2a 29 30 29  zFile, (char*)0)
12940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12950 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
12960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
12970 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
12980 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f     azCol = mallo
12990 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b  c( sizeof(azCol[
129a0 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a  0])*(nCol+1) );.
129b0 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30      if( azCol==0
129c0 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
129d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
129e0 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
129f0 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28 63 68  t malloc()", (ch
12a00 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 66 63  ar*)0);.      fc
12a10 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
12a20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69  ;.    }.    (voi
12a40 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
12a50 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c  Db->db, "BEGIN",
12a60 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a   0, 0, 0);.    z
12a70 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54  Commit = "COMMIT
12a80 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  ";.    while( (z
12a90 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74  Line = local_get
12aa0 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20  line(0, in))!=0 
12ab0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
12ac0 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  ;.      lineno++
12ad0 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d  ;.      azCol[0]
12ae0 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20   = zLine;.      
12af0 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65  for(i=0, z=zLine
12b00 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  ; *z; z++){.    
12b10 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70      if( *z==zSep
12b20 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  [0] && strncmp(z
12b30 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30  , zSep, nSep)==0
12b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a   ){.          *z
12b50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12b60 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  i++;.          i
12b70 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20  f( i<nCol ){.   
12b80 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69           azCol[i
12b90 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20  ] = &z[nSep];.  
12ba0 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e            z += n
12bb0 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  Sep-1;.         
12bc0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
12bd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
12be0 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  +1!=nCol ){.    
12bf0 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
12c00 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72          int nErr
12c10 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46 69 6c   = strlen30(zFil
12c20 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20 20  e) + 200;.      
12c30 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28    zErr = malloc(
12c40 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 69  nErr);.        i
12c50 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
12c60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
12c70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72 72  rintf(nErr, zErr
12c80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
12c90 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25  Error: %s line %
12ca0 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
12cb0 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62  olumns of data b
12cc0 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20  ut found %d",.  
12cd0 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
12ce0 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20  , lineno, nCol, 
12cf0 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
12d00 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
12d10 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 28  (interp, zErr, (
12d20 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
12d30 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b 0a      free(zErr);.
12d40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12d50 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
12d60 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
12d70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
12d80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12d90 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
12da0 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f 72      /* check for
12db0 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20 73   null data, if s
12dc0 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c 20  o, bind as null 
12dd0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
12de0 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63 6d  nNull>0 && strcm
12df0 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c  p(azCol[i], zNul
12e00 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  l)==0).         
12e10 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28 61 7a 43   || strlen30(azC
12e20 6f 6c 5b 69 5d 29 3d 3d 30 0a 20 20 20 20 20 20  ol[i])==0.      
12e30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
12e40 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
12e50 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20  (pStmt, i+1);.  
12e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
12e80 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
12e90 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d  i+1, azCol[i], -
12ea0 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
12eb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12ec0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12ed0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
12ee0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12ef0 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
12f00 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e  .      free(zLin
12f10 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
12f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12f30 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
12f40 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
12f50 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  Error: ", sqlite
12f60 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
12f70 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
12f80 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
12f90 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20  "ROLLBACK";.    
12fa0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12fb0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
12fc0 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63  e(azCol);.    fc
12fd0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71  lose(in);.    sq
12fe0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
12ff0 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64  Stmt);.    (void
13000 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
13010 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20  b->db, zCommit, 
13020 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69  0, 0, 0);..    i
13030 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d  f( zCommit[0] ==
13040 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a   'C' ){.      /*
13050 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65   success, set re
13060 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f  sult as number o
13070 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65  f lines processe
13080 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75  d */.      pResu
13090 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
130a0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
130b0 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f       Tcl_SetIntO
130c0 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65  bj(pResult, line
130d0 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
130e0 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  TCL_OK;.    }els
130f0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c  e{.      /* fail
13100 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65  ure, append line
13110 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20  no where failed 
13120 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
13130 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
13140 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e  (zLineNum), zLin
13150 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f  eNum,"%d",lineno
13160 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
13170 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13180 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65  ,", failed while
13190 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65   processing line
131a0 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 0a 20 20  : ",zLineNum,.  
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131c0 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
131d0 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
131e0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
131f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13200 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 64 65  .  **     $db de
13210 73 65 72 69 61 6c 69 7a 65 20 3f 44 41 54 41 42  serialize ?DATAB
13220 41 53 45 3f 20 56 41 4c 55 45 0a 20 20 2a 2a 0a  ASE? VALUE.  **.
13230 20 20 2a 2a 20 52 65 6f 70 65 6e 20 44 41 54 41    ** Reopen DATA
13240 42 41 53 45 20 28 64 65 66 61 75 6c 74 20 22 6d  BASE (default "m
13250 61 69 6e 22 29 20 75 73 69 6e 67 20 74 68 65 20  ain") using the 
13260 63 6f 6e 74 65 6e 74 20 69 6e 20 24 56 41 4c 55  content in $VALU
13270 45 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  E.  */.  case DB
13280 5f 44 45 53 45 52 49 41 4c 49 5a 45 3a 20 7b 0a  _DESERIALIZE: {.
13290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
132a0 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a  NABLE_DESERIALIZ
132b0 45 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  E.    Tcl_Append
132c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
132d0 4d 45 4d 44 42 20 6e 6f 74 20 61 76 61 69 6c 61  MEMDB not availa
132e0 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
132f0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
13300 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13310 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  0);.    rc = TCL
13320 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
13330 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
13340 63 68 65 6d 61 3b 0a 20 20 20 20 54 63 6c 5f 4f  chema;.    Tcl_O
13350 62 6a 20 2a 70 56 61 6c 75 65 3b 0a 20 20 20 20  bj *pValue;.    
13360 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
13370 42 41 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  BA;.    unsigned
13380 20 63 68 61 72 20 2a 70 44 61 74 61 3b 0a 20 20   char *pData;.  
13390 20 20 69 6e 74 20 6c 65 6e 2c 20 78 72 63 3b 0a    int len, xrc;.
133a0 20 20 20 20 0a 20 20 20 20 69 66 28 20 6f 62 6a      .    if( obj
133b0 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 53  c==3 ){.      zS
133c0 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
133d0 20 70 56 61 6c 75 65 20 3d 20 6f 62 6a 76 5b 32   pValue = objv[2
133e0 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ];.    }else if(
133f0 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
13400 20 20 7a 53 63 68 65 6d 61 20 3d 20 54 63 6c 5f    zSchema = Tcl_
13410 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
13420 5d 29 3b 0a 20 20 20 20 20 20 70 56 61 6c 75 65  ]);.      pValue
13430 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20   = objv[3];.    
13440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
13450 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13460 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
13470 3f 44 41 54 41 42 41 53 45 3f 20 56 41 4c 55 45  ?DATABASE? VALUE
13480 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  ");.      rc = T
13490 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
134a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
134b0 20 70 42 41 20 3d 20 54 63 6c 5f 47 65 74 42 79   pBA = Tcl_GetBy
134c0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70  teArrayFromObj(p
134d0 56 61 6c 75 65 2c 20 26 6c 65 6e 29 3b 0a 20 20  Value, &len);.  
134e0 20 20 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65    pData = sqlite
134f0 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6c 65 6e 20  3_malloc64( len 
13500 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  );.    if( pData
13510 3d 3d 30 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ==0 && len>0 ){.
13520 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
13530 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
13540 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20  out of memory", 
13550 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
13560 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
13570 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13580 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65    if( len>0 ) me
13590 6d 63 70 79 28 70 44 61 74 61 2c 20 70 42 41 2c  mcpy(pData, pBA,
135a0 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 78 72 63   len);.      xrc
135b0 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72   = sqlite3_deser
135c0 69 61 6c 69 7a 65 28 70 44 62 2d 3e 64 62 2c 20  ialize(pDb->db, 
135d0 7a 53 63 68 65 6d 61 2c 20 70 44 61 74 61 2c 20  zSchema, pData, 
135e0 6c 65 6e 2c 20 6c 65 6e 2c 0a 20 20 20 20 20 20  len, len,.      
135f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
13600 5f 44 45 53 45 52 49 41 4c 49 5a 45 5f 46 52 45  _DESERIALIZE_FRE
13610 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
13620 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
13630 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 5f 52 45  E_DESERIALIZE_RE
13640 53 49 5a 45 41 42 4c 45 29 3b 0a 20 20 20 20 20  SIZEABLE);.     
13650 20 69 66 28 20 78 72 63 20 29 7b 0a 20 20 20 20   if( xrc ){.    
13660 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13670 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
13680 61 62 6c 65 20 74 6f 20 73 65 74 20 4d 45 4d 44  able to set MEMD
13690 42 20 63 6f 6e 74 65 6e 74 22 2c 20 28 63 68 61  B content", (cha
136a0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 72  r*)0);.        r
136b0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
136c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
136d0 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 20 0a  dif.    break; .
136e0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
136f0 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61    $db enable_loa
13700 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c  d_extension BOOL
13710 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75  EAN.  **.  ** Tu
13720 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  rn the extension
13730 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65   loading feature
13740 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20   on or off.  It 
13750 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64  if off by.  ** d
13760 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63  efault..  */.  c
13770 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f  ase DB_ENABLE_LO
13780 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a  AD_EXTENSION: {.
13790 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
137a0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
137b0 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66  ON.    int onoff
137c0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
137d0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
137e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
137f0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f  rp, 2, objv, "BO
13800 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72  OLEAN");.      r
13810 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13820 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
13830 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
13840 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13850 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b  v[2], &onoff) ){
13860 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13870 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
13880 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
13890 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
138a0 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29  (pDb->db, onoff)
138b0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c  ;.    break;.#el
138c0 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  se.    Tcl_Appen
138d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
138e0 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69  "extension loadi
138f0 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  ng is turned off
13900 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
13910 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
13920 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
13930 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
13940 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a  L_ERROR;.#endif.
13950 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
13960 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a    $db errorcode.
13970 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
13980 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72   the numeric err
13990 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61 73  or code that was
139a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
139b0 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a   most recent.  *
139c0 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
139d0 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20  3_exec()..  */. 
139e0 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f   case DB_ERRORCO
139f0 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  DE: {.    Tcl_Se
13a00 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
13a10 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
13a20 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  (sqlite3_errcode
13a30 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
13a40 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
13a50 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 78  *.  **    $db ex
13a60 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20  ists $sql.  **  
13a70 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20    $db onecolumn 
13a80 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  $sql.  **.  ** T
13a90 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74  he onecolumn met
13aa0 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69 76  hod is the equiv
13ab0 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20  alent of:.  **  
13ac0 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65     lindex [$db e
13ad0 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f  val $sql] 0.  */
13ae0 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53 54  .  case DB_EXIST
13af0 53 3a 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45  S:.  case DB_ONE
13b00 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 54 63  COLUMN: {.    Tc
13b10 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 20 3d  l_Obj *pResult =
13b20 20 30 3b 0a 20 20 20 20 44 62 45 76 61 6c 43 6f   0;.    DbEvalCo
13b30 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20  ntext sEval;.   
13b40 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
13b50 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13b60 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13b70 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a  , objv, "SQL");.
13b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13b90 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
13ba0 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73     dbEvalInit(&s
13bb0 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  Eval, pDb, objv[
13bc0 32 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  2], 0, 0);.    r
13bd0 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26  c = dbEvalStep(&
13be0 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  sEval);.    if( 
13bf0 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f  choice==DB_ONECO
13c00 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  LUMN ){.      if
13c10 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
13c20 20 20 20 20 20 20 20 20 70 52 65 73 75 6c 74 20          pResult 
13c30 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  = dbEvalColumnVa
13c40 6c 75 65 28 26 73 45 76 61 6c 2c 20 30 29 3b 0a  lue(&sEval, 0);.
13c50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13c60 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
13c70 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52 65 73  .        Tcl_Res
13c80 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
13c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13ca0 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  lse if( rc==TCL_
13cb0 42 52 45 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c  BREAK || rc==TCL
13cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65  _OK ){.      pRe
13cd0 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f  sult = Tcl_NewBo
13ce0 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c  oleanObj(rc==TCL
13cf0 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _OK);.    }.    
13d00 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26  dbEvalFinalize(&
13d10 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  sEval);.    if( 
13d20 70 52 65 73 75 6c 74 20 29 20 54 63 6c 5f 53 65  pResult ) Tcl_Se
13d30 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
13d40 70 2c 20 70 52 65 73 75 6c 74 29 3b 0a 0a 20 20  p, pResult);..  
13d50 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
13d60 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAK ){.      rc 
13d70 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  = TCL_OK;.    }.
13d80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
13d90 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
13da0 20 65 76 61 6c 20 3f 6f 70 74 69 6f 6e 73 3f 20   eval ?options? 
13db0 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20  $sql ?array? ?{ 
13dc0 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20   ...code... }?. 
13dd0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
13de0 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73   statement in $s
13df0 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  ql is evaluated.
13e00 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20    For each row, 
13e10 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20  the values are. 
13e20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c   ** placed in el
13e30 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ements of the ar
13e40 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79  ray named "array
13e50 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  " and ...code...
13e60 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
13e70 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e  ** If "array" an
13e80 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69  d "code" are omi
13e90 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61  tted, then no ca
13ea0 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20  llback is every 
13eb0 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66  invoked..  ** If
13ec0 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65   "array" is an e
13ed0 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65  mpty string, the
13ee0 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  n the values are
13ef0 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61   placed in varia
13f00 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68  bles.  ** that h
13f10 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ave the same nam
13f20 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20  e as the fields 
13f30 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65  extracted by the
13f40 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63   query..  */.  c
13f50 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20  ase DB_EVAL: {. 
13f60 20 20 20 69 6e 74 20 65 76 61 6c 46 6c 61 67 73     int evalFlags
13f70 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
13f80 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
13f90 77 68 69 6c 65 28 20 6f 62 6a 63 3e 33 20 26 26  while( objc>3 &&
13fa0 20 28 7a 4f 70 74 20 3d 20 54 63 6c 5f 47 65 74   (zOpt = Tcl_Get
13fb0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
13fc0 21 3d 30 20 26 26 20 7a 4f 70 74 5b 30 5d 3d 3d  !=0 && zOpt[0]==
13fd0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '-' ){.      if(
13fe0 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 22 2d   strcmp(zOpt, "-
13ff0 77 69 74 68 6f 75 74 6e 75 6c 6c 73 22 29 3d 3d  withoutnulls")==
14000 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 76 61  0 ){.        eva
14010 6c 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  lFlags |= SQLITE
14020 5f 45 56 41 4c 5f 57 49 54 48 4f 55 54 4e 55 4c  _EVAL_WITHOUTNUL
14030 4c 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LS;.      }.    
14040 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
14050 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14060 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77  (interp, "unknow
14070 6e 20 6f 70 74 69 6f 6e 3a 20 5c 22 22 2c 20 7a  n option: \"", z
14080 4f 70 74 2c 20 22 5c 22 22 2c 20 28 76 6f 69 64  Opt, "\"", (void
14090 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  *)0);.        re
140a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
140b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62        }.      ob
140c0 6a 63 2d 2d 3b 0a 20 20 20 20 20 20 6f 62 6a 76  jc--;.      objv
140d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
140e0 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63  ( objc<3 || objc
140f0 3e 35 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >5 ){.      Tcl_
14100 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14110 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20  erp, 2, objv, . 
14120 20 20 20 20 20 20 20 20 20 22 3f 4f 50 54 49 4f           "?OPTIO
14130 4e 53 3f 20 53 51 4c 20 3f 41 52 52 41 59 2d 4e  NS? SQL ?ARRAY-N
14140 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b  AME? ?SCRIPT?");
14150 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
14160 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
14170 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
14180 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43  ){.      DbEvalC
14190 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20  ontext sEval;.  
141a0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
141b0 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
141c0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
141d0 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
141e0 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74        dbEvalInit
141f0 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62  (&sEval, pDb, ob
14200 6a 76 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a 20 20  jv[2], 0, 0);.  
14210 20 20 20 20 77 68 69 6c 65 28 20 54 43 4c 5f 4f      while( TCL_O
14220 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53  K==(rc = dbEvalS
14230 74 65 70 28 26 73 45 76 61 6c 29 29 20 29 7b 0a  tep(&sEval)) ){.
14240 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
14250 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
14260 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52  .        dbEvalR
14270 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20 26  owInfo(&sEval, &
14280 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  nCol, 0);.      
14290 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
142a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
142b0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
142c0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
142d0 72 70 2c 20 70 52 65 74 2c 20 64 62 45 76 61 6c  rp, pRet, dbEval
142e0 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76  ColumnValue(&sEv
142f0 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20  al, i));.       
14300 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14310 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
14320 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 20 20 69  &sEval);.      i
14330 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
14340 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
14350 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
14360 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20  erp, pRet);.    
14370 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
14380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
14390 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
143a0 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRet);.    }else
143b0 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61  {.      ClientDa
143c0 74 61 20 63 64 32 5b 32 5d 3b 0a 20 20 20 20 20  ta cd2[2];.     
143d0 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a   DbEvalContext *
143e0 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  p;.      Tcl_Obj
143f0 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20   *pArray = 0;.  
14400 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
14410 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69 66 28  ript;..      if(
14420 20 6f 62 6a 63 3e 3d 35 20 26 26 20 2a 28 63 68   objc>=5 && *(ch
14430 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  ar *)Tcl_GetStri
14440 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a 20  ng(objv[3]) ){. 
14450 20 20 20 20 20 20 20 70 41 72 72 61 79 20 3d 20         pArray = 
14460 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 7d  objv[3];.      }
14470 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
14480 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20   objv[objc-1];. 
14490 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
144a0 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
144b0 0a 20 20 20 20 20 20 70 20 3d 20 28 44 62 45 76  .      p = (DbEv
144c0 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54 63 6c 5f  alContext *)Tcl_
144d0 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 62 45  Alloc(sizeof(DbE
144e0 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  valContext));.  
144f0 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 70      dbEvalInit(p
14500 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20  , pDb, objv[2], 
14510 70 41 72 72 61 79 2c 20 65 76 61 6c 46 6c 61 67  pArray, evalFlag
14520 73 29 3b 0a 0a 20 20 20 20 20 20 63 64 32 5b 30  s);..      cd2[0
14530 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a 20  ] = (void *)p;. 
14540 20 20 20 20 20 63 64 32 5b 31 5d 20 3d 20 28 76       cd2[1] = (v
14550 6f 69 64 20 2a 29 70 53 63 72 69 70 74 3b 0a 20  oid *)pScript;. 
14560 20 20 20 20 20 72 63 20 3d 20 44 62 45 76 61 6c       rc = DbEval
14570 4e 65 78 74 43 6d 64 28 63 64 32 2c 20 69 6e 74  NextCmd(cd2, int
14580 65 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20  erp, TCL_OK);.  
14590 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
145a0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
145b0 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e    $db function N
145c0 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e  AME [-argcount N
145d0 5d 20 5b 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  ] [-deterministi
145e0 63 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  c] SCRIPT.  **. 
145f0 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
14600 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61   SQL function ca
14610 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
14620 65 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69  ever that functi
14630 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65  on is.  ** calle
14640 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
14650 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
14660 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
14670 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49    case DB_FUNCTI
14680 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20 66 6c  ON: {.    int fl
14690 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  ags = SQLITE_UTF
146a0 38 3b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a  8;.    SqlFunc *
146b0 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f  pFunc;.    Tcl_O
146c0 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20  bj *pScript;.   
146d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
146e0 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b    int nArg = -1;
146f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14700 69 66 28 20 6f 62 6a 63 3c 34 20 29 7b 0a 20 20  if( objc<4 ){.  
14710 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
14720 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
14730 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 3f 53 57 49  objv, "NAME ?SWI
14740 54 43 48 45 53 3f 20 53 43 52 49 50 54 22 29 3b  TCHES? SCRIPT");
14750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
14760 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
14770 20 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 28 6f     for(i=3; i<(o
14780 62 6a 63 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20  bjc-1); i++){.  
14790 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
147a0 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  z = Tcl_GetStrin
147b0 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20  g(objv[i]);.    
147c0 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
147d0 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  30(z);.      if(
147e0 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28   n>2 && strncmp(
147f0 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74 22 2c 6e  z, "-argcount",n
14800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
14810 69 66 28 20 69 3d 3d 28 6f 62 6a 63 2d 32 29 20  if( i==(objc-2) 
14820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
14830 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14840 74 65 72 70 2c 20 22 6f 70 74 69 6f 6e 20 72 65  terp, "option re
14850 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
14860 6e 74 3a 20 22 2c 20 7a 2c 28 63 68 61 72 2a 29  nt: ", z,(char*)
14870 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
14880 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
148a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
148b0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
148c0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 41 72 67  objv[i+1], &nArg
148d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
148e0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
148f0 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20  ( nArg<0 ){.    
14900 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
14910 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
14920 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
14930 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d  nts must be non-
14940 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20  negative",.     
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
14970 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
14980 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
149a0 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  ++;.      }else.
149b0 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26        if( n>2 &&
149c0 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 64 65   strncmp(z, "-de
149d0 74 65 72 6d 69 6e 69 73 74 69 63 22 2c 6e 29 3d  terministic",n)=
149e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  =0 ){.        fl
149f0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 44 45  ags |= SQLITE_DE
14a00 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 20  TERMINISTIC;.   
14a10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14a20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14a30 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
14a40 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 7a 2c 0a 20  option \"", z,. 
14a50 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 3a 20             "\": 
14a60 6d 75 73 74 20 62 65 20 2d 61 72 67 63 6f 75 6e  must be -argcoun
14a70 74 20 6f 72 20 2d 64 65 74 65 72 6d 69 6e 69 73  t or -determinis
14a80 74 69 63 22 2c 20 28 63 68 61 72 2a 29 30 0a 20  tic", (char*)0. 
14a90 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
14aa0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14ab0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
14ac0 7d 0a 0a 20 20 20 20 70 53 63 72 69 70 74 20 3d  }..    pScript =
14ad0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20   objv[objc-1];. 
14ae0 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
14af0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
14b00 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
14b10 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c   pFunc = findSql
14b20 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29  Func(pDb, zName)
14b30 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d  ;.    if( pFunc=
14b40 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  =0 ) return TCL_
14b50 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70  ERROR;.    if( p
14b60 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b  Func->pScript ){
14b70 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
14b80 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70  efCount(pFunc->p
14b90 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20  Script);.    }. 
14ba0 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70     pFunc->pScrip
14bb0 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20  t = pScript;.   
14bc0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
14bd0 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20  t(pScript);.    
14be0 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62  pFunc->useEvalOb
14bf0 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76  jv = safeToUseEv
14c00 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70  alObjv(interp, p
14c10 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20  Script);.    rc 
14c20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
14c30 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64  _function(pDb->d
14c40 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
14c50 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 70  flags,.        p
14c60 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63  Func, tclSqlFunc
14c70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
14c80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14c90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
14ca0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63  _ERROR;.      Tc
14cb0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
14cc0 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
14cd0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
14ce0 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
14cf0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  E);.    }.    br
14d00 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
14d10 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72   **     $db incr
14d20 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f  blob ?-readonly?
14d30 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55   ?DB? TABLE COLU
14d40 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20  MN ROWID.  */.  
14d50 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42  case DB_INCRBLOB
14d60 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
14d70 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
14d80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14d90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e  sult(interp, "in
14da0 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c  crblob not avail
14db0 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
14dc0 6c 64 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ld", (char*)0);.
14dd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14de0 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
14df0 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d  int isReadonly =
14e00 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
14e10 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22  ar *zDb = "main"
14e20 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14e30 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f   *zTable;.    co
14e40 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
14e50 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49  n;.    Tcl_WideI
14e60 6e 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a  nt iRow;..    /*
14e70 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d   Check for the -
14e80 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20  readonly option 
14e90 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  */.    if( objc>
14ea0 33 20 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f  3 && strcmp(Tcl_
14eb0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
14ec0 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29  ]), "-readonly")
14ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52  ==0 ){.      isR
14ee0 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
14ef0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
14f00 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(5+isReadonly)
14f10 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52   && objc!=(6+isR
14f20 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadonly) ){.    
14f30 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
14f40 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
14f50 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f  jv, "?-readonly?
14f60 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55   ?DB? TABLE COLU
14f70 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20  MN ROWID");.    
14f80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14f90 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
14fa0 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65  f( objc==(6+isRe
14fb0 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adonly) ){.     
14fc0 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
14fd0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
14fe0 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20     }.    zTable 
14ff0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
15000 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20  objv[objc-3]);. 
15010 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c     zColumn = Tcl
15020 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
15030 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63  objc-2]);.    rc
15040 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e   = Tcl_GetWideIn
15050 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
15060 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26   objv[objc-1], &
15070 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  iRow);..    if( 
15080 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
15090 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 49      rc = createI
150a0 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a  ncrblobChannel(.
150b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70            interp
150c0 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62  , pDb, zDb, zTab
150d0 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 28 73 71  le, zColumn, (sq
150e0 6c 69 74 65 33 5f 69 6e 74 36 34 29 69 52 6f 77  lite3_int64)iRow
150f0 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20  , isReadonly.   
15100 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
15110 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
15120 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
15130 20 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20   $db interrupt. 
15140 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75   **.  ** Interru
15150 70 74 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  pt the execution
15160 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f   of the inner-mo
15170 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74  st SQL interpret
15180 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63  er.  This.  ** c
15190 61 75 73 65 73 20 74 68 65 20 53 51 4c 20 73 74  auses the SQL st
151a0 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72  atement to retur
151b0 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51  n an error of SQ
151c0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a  LITE_INTERRUPT..
151d0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49    */.  case DB_I
151e0 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20  NTERRUPT: {.    
151f0 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
15200 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  t(pDb->db);.    
15210 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
15220 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75  .  **     $db nu
15230 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f  llvalue ?STRING?
15240 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
15250 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e  e text used when
15260 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61   a NULL comes ba
15270 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ck from the data
15280 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47  base. If ?STRING
15290 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72  ?.  ** is not pr
152a0 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  esent, then the 
152b0 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75  current string u
152c0 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20  sed for NULL is 
152d0 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49  returned..  ** I
152e0 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73  f STRING is pres
152f0 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47  ent, then STRING
15300 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
15310 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  **.  */.  case D
15320 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20  B_NULLVALUE: {. 
15330 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
15340 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
15350 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
15360 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
15370 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22  bjv, "NULLVALUE"
15380 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15390 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
153a0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
153b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   ){.      int le
153c0 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  n;.      char *z
153d0 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  Null = Tcl_GetSt
153e0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
153f0 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
15400 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c    if( pDb->zNull
15410 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
15420 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  Free(pDb->zNull)
15430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15440 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e  if( zNull && len
15450 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
15460 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41  b->zNull = Tcl_A
15470 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
15480 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
15490 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c  pDb->zNull, zNul
154a0 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  l, len);.       
154b0 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d   pDb->zNull[len]
154c0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
154d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
154e0 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  b->zNull = 0;.  
154f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15500 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
15510 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
15520 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a  StringObj(pDb->z
15530 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Null, -1));.    
15540 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
15550 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61  .  **     $db la
15560 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 0a  st_insert_rowid.
15570 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
15580 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
15590 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66  h is the ROWID f
155a0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
155b0 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a  nt insert..  */.
155c0 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49    case DB_LAST_I
155d0 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20  NSERT_ROWID: {. 
155e0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
155f0 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  ult;.    Tcl_Wid
15600 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20  eInt rowid;.    
15610 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
15620 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
15630 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
15640 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
15650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15660 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f  OR;.    }.    ro
15670 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wid = sqlite3_la
15680 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
15690 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52  pDb->db);.    pR
156a0 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
156b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
156c0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64  ;.    Tcl_SetWid
156d0 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  eIntObj(pResult,
156e0 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65   rowid);.    bre
156f0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
15700 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c  ** The DB_ONECOL
15710 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d  UMN method is im
15720 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68  plemented togeth
15730 65 72 20 77 69 74 68 20 44 42 5f 45 58 49 53 54  er with DB_EXIST
15740 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20  S..  */..  /*   
15750 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e   $db progress ?N
15760 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a   CALLBACK?.  **.
15770 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
15780 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65  given callback e
15790 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d  very N virtual m
157a0 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77  achine opcodes w
157b0 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20  hile executing. 
157c0 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
157d0 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47  /.  case DB_PROG
157e0 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20  RESS: {.    if( 
157f0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
15800 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
15810 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
15820 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15830 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
15840 6f 67 72 65 73 73 2c 20 28 63 68 61 72 2a 29 30  ogress, (char*)0
15850 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15860 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
15870 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
15880 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20  zProgress;.     
15890 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
158a0 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28  int N;.      if(
158b0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
158c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
158d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20  p, objv[2], &N) 
158e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
158f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15900 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20     };.      if( 
15910 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
15920 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
15930 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  ee(pDb->zProgres
15940 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
15950 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63    zProgress = Tc
15960 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
15970 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e  bj(objv[3], &len
15980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72  );.      if( zPr
15990 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20  ogress && len>0 
159a0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
159b0 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
159c0 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
159d0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
159e0 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c  (pDb->zProgress,
159f0 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b   zProgress, len+
15a00 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
15a10 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
15a20 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
15a30 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
15a40 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
15a50 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20  S_CALLBACK.     
15a60 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
15a70 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
15a80 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
15a90 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
15aa0 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
15ab0 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e  ndler(pDb->db, N
15ac0 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  , DbProgressHand
15ad0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
15ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15af0 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
15b00 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
15b10 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
15b20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
15b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
15b40 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15b50 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
15b60 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20   CALLBACK");.   
15b70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15b80 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
15b90 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
15ba0 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f     $db profile ?
15bb0 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
15bc0 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
15bd0 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
15be0 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
15bf0 74 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20  tine after each 
15c00 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
15c10 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e  ** that has run.
15c20 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
15c30 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d  e SQL and the am
15c40 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74  ount of elapse t
15c50 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70  ime are.  ** app
15c60 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
15c70 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72  K before the scr
15c80 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f  ipt is run..  */
15c90 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49  .  case DB_PROFI
15ca0 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  LE: {.    if( ob
15cb0 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
15cc0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15cd0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
15ce0 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
15cf0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15d00 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
15d10 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
15d20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
15d30 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
15d40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15d50 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
15d60 3e 7a 50 72 6f 66 69 6c 65 2c 20 28 63 68 61 72  >zProfile, (char
15d70 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
15d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
15d90 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20  har *zProfile;. 
15da0 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
15db0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
15dc0 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
15dd0 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
15de0 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20  Profile);.      
15df0 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65  }.      zProfile
15e00 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
15e10 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
15e20 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
15e30 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65  ( zProfile && le
15e40 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
15e50 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54  Db->zProfile = T
15e60 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
15e70 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
15e80 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  cpy(pDb->zProfil
15e90 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e  e, zProfile, len
15ea0 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
15eb0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
15ec0 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20  Profile = 0;.   
15ed0 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
15ee0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
15ef0 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
15f00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
15f10 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26 26 20  ATING_POINT) && 
15f20 5c 0a 20 20 20 20 21 64 65 66 69 6e 65 64 28 53  \.    !defined(S
15f30 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
15f40 43 41 54 45 44 29 0a 20 20 20 20 20 20 69 66 28  CATED).      if(
15f50 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
15f60 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
15f70 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
15f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15f90 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
15fa0 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65   DbProfileHandle
15fb0 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
15fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
15fd0 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44  lite3_profile(pD
15fe0 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
15ff0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
16000 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
16010 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
16020 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20   $db rekey KEY. 
16030 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20   **.  ** Change 
16040 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b  the encryption k
16050 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ey on the curren
16060 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73  tly open databas
16070 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
16080 42 5f 52 45 4b 45 59 3a 20 7b 0a 23 69 66 20 64  B_REKEY: {.#if d
16090 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
160a0 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66  S_CODEC) && !def
160b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
160c0 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29  _CODEC_FROM_TCL)
160d0 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  .    int nKey;. 
160e0 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 23     void *pKey;.#
160f0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f 62  endif.    if( ob
16100 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
16110 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16120 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
16130 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72   "KEY");.      r
16140 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16150 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
16160 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
16170 44 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64  DEC) && !defined
16180 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44  (SQLITE_OMIT_COD
16190 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20  EC_FROM_TCL).   
161a0 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42   pKey = Tcl_GetB
161b0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
161c0 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b  objv[2], &nKey);
161d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
161e0 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c  3_rekey(pDb->db,
161f0 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
16200 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
16210 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16220 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
16230 65 33 5f 65 72 72 73 74 72 28 72 63 29 2c 20 28  e3_errstr(rc), (
16240 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
16250 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
16260 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
16270 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
16280 2a 20 20 20 20 24 64 62 20 72 65 73 74 6f 72 65  *    $db restore
16290 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45   ?DATABASE? FILE
162a0 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  NAME.  **.  ** O
162b0 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
162c0 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41  ile named FILENA
162d0 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ME.  Transfer th
162e0 65 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 6f  e content.  ** o
162f0 66 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74 6f 20  f FILENAME into 
16300 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62 61  the local databa
16310 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66  se DATABASE (def
16320 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e 0a 20  ault: "main").. 
16330 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45   */.  case DB_RE
16340 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63 6f 6e  STORE: {.    con
16350 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c  st char *zSrcFil
16360 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
16370 72 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20 20 20  r *zDestDb;.    
16380 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20  sqlite3 *pSrc;. 
16390 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
163a0 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20  p *pBackup;.    
163b0 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30  int nTimeout = 0
163c0 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  ;..    if( objc=
163d0 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73  =3 ){.      zDes
163e0 74 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  tDb = "main";.  
163f0 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54      zSrcFile = T
16400 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16410 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[2]);.    }else
16420 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
16430 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20        zDestDb = 
16440 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
16450 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a 53  jv[2]);.      zS
16460 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  rcFile = Tcl_Get
16470 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
16480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16490 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
164a0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
164b0 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20  jv, "?DATABASE? 
164c0 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20  FILENAME");.    
164d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
164e0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
164f0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
16500 76 32 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53  v2(zSrcFile, &pS
16510 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16530 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16540 59 20 7c 20 70 44 62 2d 3e 6f 70 65 6e 46 6c 61  Y | pDb->openFla
16550 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gs, 0);.    if( 
16560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16570 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
16580 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16590 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75  "cannot open sou
165a0 72 63 65 20 64 61 74 61 62 61 73 65 3a 20 22 2c  rce database: ",
165b0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
165c0 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63 29  te3_errmsg(pSrc)
165d0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
165e0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
165f0 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (pSrc);.      re
16600 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16610 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b 75      }.    pBacku
16620 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  p = sqlite3_back
16630 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c  up_init(pDb->db,
16640 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c 20   zDestDb, pSrc, 
16650 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28  "main");.    if(
16660 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20   pBackup==0 ){. 
16670 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
16680 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72  esult(interp, "r
16690 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22  estore failed: "
166a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
166b0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
166c0 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
166d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
166e0 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20  lose(pSrc);.    
166f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16700 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  OR;.    }.    wh
16710 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
16720 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
16730 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
16740 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
16750 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c        || rc==SQL
16760 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
16770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16780 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
16790 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20   if( nTimeout++ 
167a0 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  >= 3 ) break;.  
167b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
167c0 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20  eep(100);.      
167d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
167e0 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73  te3_backup_finis
167f0 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20  h(pBackup);.    
16800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
16810 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ONE ){.      rc 
16820 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
16830 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
16840 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53  TE_BUSY || rc==S
16850 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
16860 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
16870 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
16880 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
16890 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20  source database 
168a0 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20 20  busy",.         
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
168c0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
168d0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
168e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
168f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16900 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72  (interp, "restor
16910 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  e failed: ",.   
16920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16930 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
16940 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
16950 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
16960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16970 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
16980 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
16990 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
169a0 64 62 20 73 65 72 69 61 6c 69 7a 65 20 3f 44 41  db serialize ?DA
169b0 54 41 42 41 53 45 3f 0a 20 20 2a 2a 0a 20 20 2a  TABASE?.  **.  *
169c0 2a 20 52 65 74 75 72 6e 20 61 20 73 65 72 69 61  * Return a seria
169d0 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 61 20 64 61  lization of a da
169e0 74 61 62 61 73 65 2e 20 20 0a 20 20 2a 2f 0a 20  tabase.  .  */. 
169f0 20 63 61 73 65 20 44 42 5f 53 45 52 49 41 4c 49   case DB_SERIALI
16a00 5a 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  ZE: {.#ifndef SQ
16a10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
16a20 52 49 41 4c 49 5a 45 0a 20 20 20 20 54 63 6c 5f  RIALIZE.    Tcl_
16a30 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16a40 65 72 70 2c 20 22 4d 45 4d 44 42 20 6e 6f 74 20  erp, "MEMDB not 
16a50 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69  available in thi
16a60 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20 20 20  s build",.      
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16a80 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 63  char*)0);.    rc
16a90 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65   = TCL_ERROR;.#e
16aa0 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  lse.    const ch
16ab0 61 72 20 2a 7a 53 63 68 65 6d 61 20 3d 20 6f 62  ar *zSchema = ob
16ac0 6a 63 3e 3d 33 20 3f 20 54 63 6c 5f 47 65 74 53  jc>=3 ? Tcl_GetS
16ad0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 20 3a  tring(objv[2]) :
16ae0 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 73 71 6c   "main";.    sql
16af0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20  ite3_int64 sz = 
16b00 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  0;.    unsigned 
16b10 63 68 61 72 20 2a 70 44 61 74 61 3b 0a 20 20 20  char *pData;.   
16b20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
16b30 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
16b40 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
16b50 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
16b60 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 22 29  v, "?DATABASE?")
16b70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
16b80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
16b90 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 65  e{.      int nee
16ba0 64 46 72 65 65 3b 0a 20 20 20 20 20 20 70 44 61  dFree;.      pDa
16bb0 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 73 65 72  ta = sqlite3_ser
16bc0 69 61 6c 69 7a 65 28 70 44 62 2d 3e 64 62 2c 20  ialize(pDb->db, 
16bd0 7a 53 63 68 65 6d 61 2c 20 26 73 7a 2c 20 53 51  zSchema, &sz, SQ
16be0 4c 49 54 45 5f 53 45 52 49 41 4c 49 5a 45 5f 4e  LITE_SERIALIZE_N
16bf0 4f 43 4f 50 59 29 3b 0a 20 20 20 20 20 20 69 66  OCOPY);.      if
16c00 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( pData ){.     
16c10 20 20 20 6e 65 65 64 46 72 65 65 20 3d 20 30 3b     needFree = 0;
16c20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16c30 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 73 71        pData = sq
16c40 6c 69 74 65 33 5f 73 65 72 69 61 6c 69 7a 65 28  lite3_serialize(
16c50 70 44 62 2d 3e 64 62 2c 20 7a 53 63 68 65 6d 61  pDb->db, zSchema
16c60 2c 20 26 73 7a 2c 20 30 29 3b 0a 20 20 20 20 20  , &sz, 0);.     
16c70 20 20 20 6e 65 65 64 46 72 65 65 20 3d 20 31 3b     needFree = 1;
16c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
16c90 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
16ca0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
16cb0 79 74 65 41 72 72 61 79 4f 62 6a 28 70 44 61 74  yteArrayObj(pDat
16cc0 61 2c 73 7a 29 29 3b 0a 20 20 20 20 20 20 69 66  a,sz));.      if
16cd0 28 20 6e 65 65 64 46 72 65 65 20 29 20 73 71 6c  ( needFree ) sql
16ce0 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29  ite3_free(pData)
16cf0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
16d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
16d10 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
16d20 20 73 74 61 74 75 73 20 28 73 74 65 70 7c 73 6f   status (step|so
16d30 72 74 7c 61 75 74 6f 69 6e 64 65 78 7c 76 6d 73  rt|autoindex|vms
16d40 74 65 70 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  tep).  **.  ** D
16d50 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f 53 54  isplay SQLITE_ST
16d60 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
16d70 4e 5f 53 54 45 50 20 6f 72 0a 20 20 2a 2a 20 53  N_STEP or.  ** S
16d80 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
16d90 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20 6d 6f  _SORT for the mo
16da0 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a  st recent eval..
16db0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 53    */.  case DB_S
16dc0 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74  TATUS: {.    int
16dd0 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   v;.    const ch
16de0 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28  ar *zOp;.    if(
16df0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
16e00 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
16e10 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
16e20 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72 74 7c  jv, "(step|sort|
16e30 61 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20  autoindex)");.  
16e40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16e50 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
16e60 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zOp = Tcl_GetStr
16e70 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
16e80 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70    if( strcmp(zOp
16e90 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a  , "step")==0 ){.
16ea0 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e        v = pDb->n
16eb0 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Step;.    }else 
16ec0 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20  if( strcmp(zOp, 
16ed0 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "sort")==0 ){.  
16ee0 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f      v = pDb->nSo
16ef0 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rt;.    }else if
16f00 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61  ( strcmp(zOp, "a
16f10 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b  utoindex")==0 ){
16f20 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e  .      v = pDb->
16f30 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  nIndex;.    }els
16f40 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70  e if( strcmp(zOp
16f50 2c 20 22 76 6d 73 74 65 70 22 29 3d 3d 30 20 29  , "vmstep")==0 )
16f60 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
16f70 3e 6e 56 4d 53 74 65 70 3b 0a 20 20 20 20 7d 65  >nVMStep;.    }e
16f80 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  lse{.      Tcl_A
16f90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16fa0 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rp,.            
16fb0 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73  "bad argument: s
16fc0 68 6f 75 6c 64 20 62 65 20 61 75 74 6f 69 6e 64  hould be autoind
16fd0 65 78 2c 20 73 74 65 70 2c 20 73 6f 72 74 20 6f  ex, step, sort o
16fe0 72 20 76 6d 73 74 65 70 22 2c 0a 20 20 20 20 20  r vmstep",.     
16ff0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
17000 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
17010 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
17020 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
17030 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
17040 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a  _NewIntObj(v));.
17050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
17060 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
17070 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53  b timeout MILLES
17080 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a  ECONDS.  **.  **
17090 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e   Delay for the n
170a0 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
170b0 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20  conds specified 
170c0 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c  when a file is l
170d0 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ocked..  */.  ca
170e0 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b  se DB_TIMEOUT: {
170f0 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20  .    int ms;.   
17100 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
17110 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
17120 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
17130 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
17140 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72  CONDS");.      r
17150 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17160 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
17170 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17180 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17190 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
171a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
171b0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
171c0 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29  out(pDb->db, ms)
171d0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
171e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
171f0 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  $db total_change
17200 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  s.  **.  ** Retu
17210 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17220 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
17230 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74  modified, insert
17240 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 0a 20  ed, or deleted. 
17250 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61   ** since the da
17260 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
17270 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a  s created..  */.
17280 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f    case DB_TOTAL_
17290 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54  CHANGES: {.    T
172a0 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
172b0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
172c0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
172d0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
172e0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
172f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
17300 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
17310 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
17320 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
17330 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
17340 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
17350 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  , sqlite3_total_
17360 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29  changes(pDb->db)
17370 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
17380 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
17390 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  race ?CALLBACK?.
173a0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
173b0 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
173c0 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
173d0 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65  CK routine for e
173e0 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
173f0 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65  t.  ** that is e
17400 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
17410 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73  xt of the SQL is
17420 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c   appended to CAL
17430 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a  LBACK before.  *
17440 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  * it is executed
17450 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
17460 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66  _TRACE: {.    if
17470 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
17480 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17490 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
174a0 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
174b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
174c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
174d0 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
174e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
174f0 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
17500 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
17510 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
17520 62 2d 3e 7a 54 72 61 63 65 2c 20 28 63 68 61 72  b->zTrace, (char
17530 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
17540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
17550 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
17560 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
17570 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
17580 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
17590 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
175a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
175b0 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
175c0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
175d0 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
175e0 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
175f0 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
17600 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
17610 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
17620 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
17630 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72   memcpy(pDb->zTr
17640 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e  ace, zTrace, len
17650 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
17660 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
17670 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
17680 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
17690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
176a0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
176b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
176c0 49 4e 47 5f 50 4f 49 4e 54 29 20 26 26 20 5c 0a  ING_POINT) && \.
176d0 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
176e0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
176f0 54 45 44 29 0a 20 20 20 20 20 20 69 66 28 20 70  TED).      if( p
17700 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
17710 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
17720 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
17730 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
17740 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61  e(pDb->db, DbTra
17750 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  ceHandler, pDb);
17760 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17770 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
17780 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ace(pDb->db, 0, 
17790 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
177a0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
177b0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
177c0 20 24 64 62 20 74 72 61 63 65 5f 76 32 20 3f 43   $db trace_v2 ?C
177d0 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f 0a  ALLBACK? ?MASK?.
177e0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61    **.  ** Make a
177f0 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69  rrangements to i
17800 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41  nvoke the CALLBA
17810 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65  CK routine for e
17820 61 63 68 20 74 72 61 63 65 20 65 76 65 6e 74 0a  ach trace event.
17830 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 74 68    ** matching th
17840 65 20 6d 61 73 6b 20 74 68 61 74 20 69 73 20 67  e mask that is g
17850 65 6e 65 72 61 74 65 64 2e 20 20 54 68 65 20 70  enerated.  The p
17860 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 61 70  arameters are ap
17870 70 65 6e 64 65 64 20 74 6f 0a 20 20 2a 2a 20 43  pended to.  ** C
17880 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 69  ALLBACK before i
17890 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  t is executed.. 
178a0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52   */.  case DB_TR
178b0 41 43 45 5f 56 32 3a 20 7b 0a 20 20 20 20 69 66  ACE_V2: {.    if
178c0 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20 20  ( objc>4 ){.    
178d0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
178e0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
178f0 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 20  jv, "?CALLBACK? 
17900 3f 4d 41 53 4b 3f 22 29 3b 0a 20 20 20 20 20 20  ?MASK?");.      
17910 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17920 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
17930 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
17940 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
17950 56 32 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  V2 ){.        Tc
17960 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17970 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61  nterp, pDb->zTra
17980 63 65 56 32 2c 20 28 63 68 61 72 2a 29 30 29 3b  ceV2, (char*)0);
17990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
179a0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
179b0 7a 54 72 61 63 65 56 32 3b 0a 20 20 20 20 20 20  zTraceV2;.      
179c0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 54  int len;.      T
179d0 63 6c 5f 57 69 64 65 49 6e 74 20 77 4d 61 73 6b  cl_WideInt wMask
179e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
179f0 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
17a00 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
17a10 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73  char *TTYPE_strs
17a20 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
17a30 20 22 73 74 61 74 65 6d 65 6e 74 22 2c 20 22 70   "statement", "p
17a40 72 6f 66 69 6c 65 22 2c 20 22 72 6f 77 22 2c 20  rofile", "row", 
17a50 22 63 6c 6f 73 65 22 2c 20 30 0a 20 20 20 20 20  "close", 0.     
17a60 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 65 6e     };.        en
17a70 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a  um TTYPE_enum {.
17a80 20 20 20 20 20 20 20 20 20 20 54 54 59 50 45 5f            TTYPE_
17a90 53 54 4d 54 2c 20 54 54 59 50 45 5f 50 52 4f 46  STMT, TTYPE_PROF
17aa0 49 4c 45 2c 20 54 54 59 50 45 5f 52 4f 57 2c 20  ILE, TTYPE_ROW, 
17ab0 54 54 59 50 45 5f 43 4c 4f 53 45 0a 20 20 20 20  TTYPE_CLOSE.    
17ac0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 69      };.        i
17ad0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66  nt i;.        if
17ae0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c 69  ( TCL_OK!=Tcl_Li
17af0 73 74 4f 62 6a 4c 65 6e 67 74 68 28 69 6e 74 65  stObjLength(inte
17b00 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65  rp, objv[3], &le
17b10 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
17b20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17b30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17b40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
17b50 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  en; i++){.      
17b60 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62      Tcl_Obj *pOb
17b70 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  j;.          int
17b80 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20   ttype;.        
17b90 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
17ba0 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28 69  l_ListObjIndex(i
17bb0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
17bc0 69 2c 20 26 70 4f 62 6a 29 20 29 7b 0a 20 20 20  i, &pObj) ){.   
17bd0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17be0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
17bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17c00 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
17c10 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
17c20 20 70 4f 62 6a 2c 20 54 54 59 50 45 5f 73 74 72   pObj, TTYPE_str
17c30 73 2c 20 22 74 72 61 63 65 20 74 79 70 65 22 2c  s, "trace type",
17c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c60 20 20 20 30 2c 20 26 74 74 79 70 65 29 21 3d 54     0, &ttype)!=T
17c70 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  CL_OK ){.       
17c80 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74       Tcl_WideInt
17c90 20 77 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   wType;.        
17ca0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 72      Tcl_Obj *pEr
17cb0 72 6f 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  ror = Tcl_Duplic
17cc0 61 74 65 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62  ateObj(Tcl_GetOb
17cd0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29  jResult(interp))
17ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  ;.            Tc
17cf0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
17d00 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  Error);.        
17d10 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 3d 3d      if( TCL_OK==
17d20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
17d30 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 4f  omObj(interp, pO
17d40 62 6a 2c 20 26 77 54 79 70 65 29 20 29 7b 0a 20  bj, &wType) ){. 
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
17d60 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 45  _DecrRefCount(pE
17d70 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rror);.         
17d80 20 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20 77 54       wMask |= wT
17d90 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ype;.           
17da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17db0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
17dc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
17dd0 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  Error);.        
17de0 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
17df0 66 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b 0a  fCount(pError);.
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
17e10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17e20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17e30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17e40 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
17e50 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65  h( (enum TTYPE_e
17e60 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20  num)ttype ){.   
17e70 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
17e80 54 54 59 50 45 5f 53 54 4d 54 3a 20 20 20 20 77  TTYPE_STMT:    w
17e90 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54  Mask |= SQLITE_T
17ea0 52 41 43 45 5f 53 54 4d 54 3b 20 20 20 20 62 72  RACE_STMT;    br
17eb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
17ec0 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 50 52     case TTYPE_PR
17ed0 4f 46 49 4c 45 3a 20 77 4d 61 73 6b 20 7c 3d 20  OFILE: wMask |= 
17ee0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f  SQLITE_TRACE_PRO
17ef0 46 49 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20  FILE; break;.   
17f00 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
17f10 54 54 59 50 45 5f 52 4f 57 3a 20 20 20 20 20 77  TTYPE_ROW:     w
17f20 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54  Mask |= SQLITE_T
17f30 52 41 43 45 5f 52 4f 57 3b 20 20 20 20 20 62 72  RACE_ROW;     br
17f40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
17f50 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 43 4c     case TTYPE_CL
17f60 4f 53 45 3a 20 20 20 77 4d 61 73 6b 20 7c 3d 20  OSE:   wMask |= 
17f70 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
17f80 53 45 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  SE;   break;.   
17f90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17fc0 20 20 20 20 20 20 77 4d 61 73 6b 20 3d 20 53 51        wMask = SQ
17fd0 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3b  LITE_TRACE_STMT;
17fe0 20 2f 2a 20 75 73 65 20 74 68 65 20 22 6c 65 67   /* use the "leg
17ff0 61 63 79 22 20 64 65 66 61 75 6c 74 20 2a 2f 0a  acy" default */.
18000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18010 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20  ( pDb->zTraceV2 
18020 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
18030 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 56  ree(pDb->zTraceV
18040 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
18050 20 20 7a 54 72 61 63 65 56 32 20 3d 20 54 63 6c    zTraceV2 = Tcl
18060 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
18070 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
18080 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61  ;.      if( zTra
18090 63 65 56 32 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ceV2 && len>0 ){
180a0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
180b0 72 61 63 65 56 32 20 3d 20 54 63 6c 5f 41 6c 6c  raceV2 = Tcl_All
180c0 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
180d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
180e0 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 7a 54 72  b->zTraceV2, zTr
180f0 61 63 65 56 32 2c 20 6c 65 6e 2b 31 29 3b 0a 20  aceV2, len+1);. 
18100 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18110 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 56      pDb->zTraceV
18120 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  2 = 0;.      }.#
18130 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
18140 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
18150 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
18160 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
18170 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28  POINT).      if(
18180 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 29   pDb->zTraceV2 )
18190 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
181a0 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
181b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
181c0 74 72 61 63 65 5f 76 32 28 70 44 62 2d 3e 64 62  trace_v2(pDb->db
181d0 2c 20 28 75 6e 73 69 67 6e 65 64 29 77 4d 61 73  , (unsigned)wMas
181e0 6b 2c 20 44 62 54 72 61 63 65 56 32 48 61 6e 64  k, DbTraceV2Hand
181f0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
18200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18210 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32  sqlite3_trace_v2
18220 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  (pDb->db, 0, 0, 
18230 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
18240 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  if.    }.    bre
18250 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
18260 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e   $db transaction
18270 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d   [-deferred|-imm
18280 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76  ediate|-exclusiv
18290 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  e] SCRIPT.  **. 
182a0 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20   ** Start a new 
182b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20  transaction (if 
182c0 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
182d0 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74 20  dy in the midst 
182e0 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61  of a.  ** transa
182f0 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63 75  ction) and execu
18300 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  te the TCL scrip
18310 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65 72  t SCRIPT.  After
18320 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d   SCRIPT.  ** com
18330 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20 63  pletes, either c
18340 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
18350 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74  ction or roll it
18360 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54 0a   back if SCRIPT.
18370 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20 65    ** throws an e
18380 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66  xception.  Or if
18390 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74 69   no new transati
183a0 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  on was started, 
183b0 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a  do nothing..  **
183c0 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70 74   pass the except
183d0 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73 74  ion on up the st
183e0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
183f0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  his command was 
18400 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76 65  inspired by Dave
18410 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f   Thomas's talk o
18420 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20 20  n Ruby at the.  
18430 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c 79  ** 2005 O'Reilly
18440 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e   Open Source Con
18450 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e  vention (OSCON).
18460 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
18470 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20  TRANSACTION: {. 
18480 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72     Tcl_Obj *pScr
18490 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ipt;.    const c
184a0 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22 53  har *zBegin = "S
184b0 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74 72  AVEPOINT _tcl_tr
184c0 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20  ansaction";.    
184d0 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
184e0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
184f0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
18500 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
18510 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54  , "[TYPE] SCRIPT
18520 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
18530 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
18540 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  }..    if( pDb->
18550 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20  nTransaction==0 
18560 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  && objc==4 ){.  
18570 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
18580 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72   char *TTYPE_str
18590 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
185a0 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22 65  "deferred",   "e
185b0 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d  xclusive",  "imm
185c0 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20  ediate", 0.     
185d0 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54   };.      enum T
185e0 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20  TYPE_enum {.    
185f0 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52 52      TTYPE_DEFERR
18600 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53  ED, TTYPE_EXCLUS
18610 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44  IVE, TTYPE_IMMED
18620 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20  IATE.      };.  
18630 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20      int ttype;. 
18640 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
18650 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
18660 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54  erp, objv[2], TT
18670 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73  YPE_strs, "trans
18680 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20  action type",.  
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26              0, &
186b0 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20  ttype) ){.      
186c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
186d0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
186e0 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
186f0 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65  TTYPE_enum)ttype
18700 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
18710 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a   TTYPE_DEFERRED:
18720 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b      /* no-op */;
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18740 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
18750 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55  case TTYPE_EXCLU
18760 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d  SIVE:   zBegin =
18770 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
18780 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  E";  break;.    
18790 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 49      case TTYPE_I
187a0 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67  MMEDIATE:   zBeg
187b0 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45  in = "BEGIN IMME
187c0 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a  DIATE";  break;.
187d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
187e0 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
187f0 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20 2f  [objc-1];..    /
18800 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69 74 65  * Run the SQLite
18810 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20 74   BEGIN command t
18820 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  o open a transac
18830 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e  tion or savepoin
18840 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 64  t. */.    pDb->d
18850 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20  isableAuth++;.  
18860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
18870 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65  xec(pDb->db, zBe
18880 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  gin, 0, 0, 0);. 
18890 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41     pDb->disableA
188a0 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72  uth--;.    if( r
188b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
188c0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
188d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
188e0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
188f0 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
18900 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18910 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
18920 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73  .    pDb->nTrans
18930 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f  action++;..    /
18940 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20  * If using NRE, 
18950 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c 62  schedule a callb
18960 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ack to invoke th
18970 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74  e script pScript
18980 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20  , then.    ** a 
18990 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20  second callback 
189a0 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f  to commit (or ro
189b0 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e  llback) the tran
189c0 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70  saction or savep
189d0 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  oint.    ** open
189e0 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74  ed above. If not
189f0 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c   using NRE, eval
18a00 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20  uate the script 
18a10 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20  directly, then. 
18a20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74     ** call funct
18a30 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74 43  ion DbTransPostC
18a40 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28  md() to commit (
18a50 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65  or rollback) the
18a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
18a70 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
18a80 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62  .  */.    if( Db
18a90 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
18aa0 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62    Tcl_NRAddCallb
18ab0 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54 72  ack(interp, DbTr
18ac0 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20  ansPostCmd, cd, 
18ad0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
18ae0 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76 61 6c  (void)Tcl_NREval
18af0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72  Obj(interp, pScr
18b00 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ipt, 0);.    }el
18b10 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44  se{.      rc = D
18b20 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 26 63  bTransPostCmd(&c
18b30 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 45  d, interp, Tcl_E
18b40 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
18b50 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b 0a 20   pScript, 0));. 
18b60 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
18b70 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
18b80 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f 74    $db unlock_not
18b90 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ify ?script?.  *
18ba0 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e 4c 4f  /.  case DB_UNLO
18bb0 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69 66  CK_NOTIFY: {.#if
18bc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
18bd0 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
18be0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18bf0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
18c00 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f 74  nlock_notify not
18c10 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
18c20 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20 20  is build",.     
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
18c50 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  c = TCL_ERROR;.#
18c60 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a  else.    if( obj
18c70 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
18c80 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
18c90 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
18ca0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52  , 2, objv, "?SCR
18cb0 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 63  IPT?");.      rc
18cc0 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
18cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
18ce0 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29 28 76  oid (*xNotify)(v
18cf0 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30  oid **, int) = 0
18d00 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4e  ;.      void *pN
18d10 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20  otifyArg = 0;.. 
18d20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 55       if( pDb->pU
18d30 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20  nlockNotify ){. 
18d40 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
18d50 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e  efCount(pDb->pUn
18d60 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20  lockNotify);.   
18d70 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63       pDb->pUnloc
18d80 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 20  kNotify = 0;.   
18d90 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
18da0 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
18db0 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62 55     xNotify = DbU
18dc0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20  nlockNotify;.   
18dd0 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67 20       pNotifyArg 
18de0 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20  = (void *)pDb;. 
18df0 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
18e00 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76  ockNotify = objv
18e10 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  [2];.        Tcl
18e20 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _IncrRefCount(pD
18e30 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
18e40 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
18e50 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 6e    if( sqlite3_un
18e60 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d  lock_notify(pDb-
18e70 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e  >db, xNotify, pN
18e80 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20 20 20  otifyArg) ){.   
18e90 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
18ea0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
18eb0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
18ec0 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
18ed0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
18ee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
18ef0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
18f00 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
18f10 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
18f20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 63  preupdate_hook c
18f30 6f 75 6e 74 0a 20 20 2a 2a 20 20 20 20 24 64 62  ount.  **    $db
18f40 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20   preupdate_hook 
18f50 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 20 20  hook ?SCRIPT?.  
18f60 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64  **    $db preupd
18f70 61 74 65 5f 68 6f 6f 6b 20 6e 65 77 20 49 4e 44  ate_hook new IND
18f80 45 58 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70  EX.  **    $db p
18f90 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6f 6c  reupdate_hook ol
18fa0 64 20 49 4e 44 45 58 0a 20 20 2a 2f 0a 20 20 63  d INDEX.  */.  c
18fb0 61 73 65 20 44 42 5f 50 52 45 55 50 44 41 54 45  ase DB_PREUPDATE
18fc0 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
18fd0 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
18fe0 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 54 63 6c  ATE_HOOK.    Tcl
18ff0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19000 74 65 72 70 2c 20 22 70 72 65 75 70 64 61 74 65  terp, "preupdate
19010 5f 68 6f 6f 6b 20 77 61 73 20 6f 6d 69 74 74 65  _hook was omitte
19020 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
19030 65 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  e", .           
19040 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
19050 29 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43  )0);.    rc = TC
19060 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
19070 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
19080 63 68 61 72 20 2a 61 7a 53 75 62 5b 5d 20 3d 20  char *azSub[] = 
19090 7b 22 63 6f 75 6e 74 22 2c 20 22 64 65 70 74 68  {"count", "depth
190a0 22 2c 20 22 68 6f 6f 6b 22 2c 20 22 6e 65 77 22  ", "hook", "new"
190b0 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b 0a 20 20 20  , "old", 0};.   
190c0 20 65 6e 75 6d 20 44 62 50 72 65 75 70 64 61 74   enum DbPreupdat
190d0 65 53 75 62 43 6d 64 20 7b 0a 20 20 20 20 20 20  eSubCmd {.      
190e0 50 52 45 5f 43 4f 55 4e 54 2c 20 50 52 45 5f 44  PRE_COUNT, PRE_D
190f0 45 50 54 48 2c 20 50 52 45 5f 48 4f 4f 4b 2c 20  EPTH, PRE_HOOK, 
19100 50 52 45 5f 4e 45 57 2c 20 50 52 45 5f 4f 4c 44  PRE_NEW, PRE_OLD
19110 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
19120 69 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 6f  iSub;..    if( o
19130 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc<3 ){.      T
19140 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
19150 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
19160 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f 41   "SUB-COMMAND ?A
19170 52 47 53 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20  RGS?");.    }.  
19180 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
19190 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
191a0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 7a 53 75 62  , objv[2], azSub
191b0 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c  , "sub-command",
191c0 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20 20   0, &iSub) ){.  
191d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
191e0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
191f0 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44   switch( (enum D
19200 62 50 72 65 75 70 64 61 74 65 53 75 62 43 6d 64  bPreupdateSubCmd
19210 29 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63  )iSub ){.      c
19220 61 73 65 20 50 52 45 5f 43 4f 55 4e 54 3a 20 7b  ase PRE_COUNT: {
19230 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
19240 6c 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75  l = sqlite3_preu
19250 70 64 61 74 65 5f 63 6f 75 6e 74 28 70 44 62 2d  pdate_count(pDb-
19260 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 54 63  >db);.        Tc
19270 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
19280 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
19290 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20 20  tObj(nCol));.   
192a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
192b0 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
192c0 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  PRE_HOOK: {.    
192d0 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34 20 29      if( objc>4 )
192e0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
192f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
19300 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 68  erp, 2, objv, "h
19310 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a  ook ?SCRIPT?");.
19320 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19330 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
19340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 44 62      }.        Db
19350 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20  HookCmd(interp, 
19360 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f 20  pDb, (objc==4 ? 
19370 6f 62 6a 76 5b 33 5d 20 3a 20 30 29 2c 20 26 70  objv[3] : 0), &p
19380 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
19390 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ok);.        bre
193a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
193b0 20 20 20 63 61 73 65 20 50 52 45 5f 44 45 50 54     case PRE_DEPT
193c0 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  H: {.        Tcl
193d0 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 20 20  _Obj *pRet;.    
193e0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
193f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
19400 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
19410 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22  terp, 3, objv, "
19420 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ");.          re
19430 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19450 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
19460 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 70  IntObj(sqlite3_p
19470 72 65 75 70 64 61 74 65 5f 64 65 70 74 68 28 70  reupdate_depth(p
19480 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  Db->db));.      
19490 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
194a0 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
194b0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
194c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
194d0 63 61 73 65 20 50 52 45 5f 4e 45 57 3a 0a 20 20  case PRE_NEW:.  
194e0 20 20 20 20 63 61 73 65 20 50 52 45 5f 4f 4c 44      case PRE_OLD
194f0 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
19500 69 49 64 78 3b 0a 20 20 20 20 20 20 20 20 73 71  iIdx;.        sq
19510 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
19520 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  lue;.        if(
19530 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
19540 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
19550 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 33  umArgs(interp, 3
19560 2c 20 6f 62 6a 76 2c 20 22 49 4e 44 45 58 22 29  , objv, "INDEX")
19570 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
19580 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
195a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
195b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
195c0 6a 76 5b 33 5d 2c 20 26 69 49 64 78 29 20 29 7b  jv[3], &iIdx) ){
195d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
195e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
195f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
19600 69 66 28 20 69 53 75 62 3d 3d 50 52 45 5f 4f 4c  if( iSub==PRE_OL
19610 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
19620 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75  c = sqlite3_preu
19630 70 64 61 74 65 5f 6f 6c 64 28 70 44 62 2d 3e 64  pdate_old(pDb->d
19640 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75 65  b, iIdx, &pValue
19650 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
19660 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
19670 72 74 28 20 69 53 75 62 3d 3d 50 52 45 5f 4e 45  rt( iSub==PRE_NE
19680 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  W );.          r
19690 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75  c = sqlite3_preu
196a0 70 64 61 74 65 5f 6e 65 77 28 70 44 62 2d 3e 64  pdate_new(pDb->d
196b0 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75 65  b, iIdx, &pValue
196c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
196d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
196e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
196f0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f       Tcl_Obj *pO
19700 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  bj;.          pO
19710 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  bj = Tcl_NewStri
19720 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
19730 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
19740 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b 0a 20 20  pValue), -1);.  
19750 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
19760 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
19770 20 70 4f 62 6a 29 3b 0a 20 20 20 20 20 20 20 20   pObj);.        
19780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
19790 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
197a0 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
197b0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
197c0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
197d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
197e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
197f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19800 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19810 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
19820 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20 20 20  ATE_HOOK */.    
19830 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
19840 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 77 61 6c  .  **    $db wal
19850 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
19860 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
19870 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
19880 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
19890 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
198a0 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
198b0 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 0a 20 20 63 61  B_WAL_HOOK:.  ca
198c0 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  se DB_UPDATE_HOO
198d0 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c  K:.  case DB_ROL
198e0 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  LBACK_HOOK: {.  
198f0 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20    /* set ppHook 
19900 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64  to point at pUpd
19910 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c  ateHook or pRoll
19920 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64  backHook, depend
19930 69 6e 67 20 6f 6e 0a 20 20 20 20 2a 2a 20 77 68  ing on.    ** wh
19940 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74  ether [$db updat
19950 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20  e_hook] or [$db 
19960 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77  rollback_hook] w
19970 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20  as invoked..    
19980 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
19990 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20  *ppHook = 0;.   
199a0 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
199b0 57 41 4c 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f  WAL_HOOK ) ppHoo
199c0 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48 6f  k = &pDb->pWalHo
199d0 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69  ok;.    if( choi
199e0 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f  ce==DB_UPDATE_HO
199f0 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70  OK ) ppHook = &p
19a00 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b  Db->pUpdateHook;
19a10 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
19a20 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f  =DB_ROLLBACK_HOO
19a30 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44  K ) ppHook = &pD
19a40 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
19a50 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  ;.    if( objc>3
19a60 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57   ){.       Tcl_W
19a70 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
19a80 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
19a90 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
19aa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19ab0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 44 62  R;.    }..    Db
19ac0 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20  HookCmd(interp, 
19ad0 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 33 20 3f 20  pDb, (objc==3 ? 
19ae0 6f 62 6a 76 5b 32 5d 20 3a 20 30 29 2c 20 70 70  objv[2] : 0), pp
19af0 48 6f 6f 6b 29 3b 0a 20 20 20 20 62 72 65 61 6b  Hook);.    break
19b00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
19b10 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  db version.  **.
19b20 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
19b30 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
19b40 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
19b50 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
19b60 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20  _VERSION: {.    
19b70 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
19b80 3d 32 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 2b 29  =2; i<objc; i++)
19b90 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
19ba0 61 72 20 2a 7a 41 72 67 20 3d 20 54 63 6c 5f 47  ar *zArg = Tcl_G
19bb0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
19bc0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 74 69  );.      /* Opti
19bd0 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 74  onal arguments t
19be0 6f 20 24 64 62 20 76 65 72 73 69 6f 6e 20 61 72  o $db version ar
19bf0 65 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  e used for testi
19c00 6e 67 20 70 75 72 70 6f 73 65 20 2a 2f 0a 23 69  ng purpose */.#i
19c10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
19c20 0a 20 20 20 20 20 20 2f 2a 20 24 64 62 20 76 65  .      /* $db ve
19c30 72 73 69 6f 6e 20 2d 75 73 65 2d 6c 65 67 61 63  rsion -use-legac
19c40 79 2d 70 72 65 70 61 72 65 20 42 4f 4f 4c 45 41  y-prepare BOOLEA
19c50 4e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  N.      **.     
19c60 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 75 73 65   ** Turn the use
19c70 20 6f 66 20 6c 65 67 61 63 79 20 73 71 6c 69 74   of legacy sqlit
19c80 65 33 5f 70 72 65 70 61 72 65 28 29 20 6f 6e 20  e3_prepare() on 
19c90 6f 72 20 6f 66 66 2e 0a 20 20 20 20 20 20 2a 2f  or off..      */
19ca0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
19cb0 70 28 7a 41 72 67 2c 20 22 2d 75 73 65 2d 6c 65  p(zArg, "-use-le
19cc0 67 61 63 79 2d 70 72 65 70 61 72 65 22 29 3d 3d  gacy-prepare")==
19cd0 30 20 26 26 20 69 2b 31 3c 6f 62 6a 63 20 29 7b  0 && i+1<objc ){
19ce0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
19cf0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
19d00 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
19d10 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c  interp, objv[i],
19d20 20 26 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72   &pDb->bLegacyPr
19d30 65 70 61 72 65 29 20 29 7b 0a 20 20 20 20 20 20  epare) ){.      
19d40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19d50 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
19d60 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20        }else..   
19d70 20 20 20 2f 2a 20 24 64 62 20 76 65 72 73 69 6f     /* $db versio
19d80 6e 20 2d 6c 61 73 74 2d 73 74 6d 74 2d 70 74 72  n -last-stmt-ptr
19d90 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19da0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69  ** Return a stri
19db0 6e 67 20 77 68 69 63 68 20 69 73 20 61 20 68 65  ng which is a he
19dc0 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  x encoding of th
19dd0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
19de0 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 72  .      ** most r
19df0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
19e00 6d 74 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  mt in the statem
19e10 65 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20  ent cache..     
19e20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74   */.      if( st
19e30 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6c 61 73  rcmp(zArg, "-las
19e40 74 2d 73 74 6d 74 2d 70 74 72 22 29 3d 3d 30 20  t-stmt-ptr")==0 
19e50 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
19e60 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 20  zBuf[100];.     
19e70 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
19e80 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
19e90 2c 20 7a 42 75 66 2c 20 22 25 70 22 2c 0a 20 20  , zBuf, "%p",.  
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
19ec0 4c 69 73 74 20 3f 20 70 44 62 2d 3e 73 74 6d 74  List ? pDb->stmt
19ed0 4c 69 73 74 2d 3e 70 53 74 6d 74 3a 20 30 29 3b  List->pStmt: 0);
19ee0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
19ef0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19f00 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  Buf, TCL_VOLATIL
19f10 45 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  E);.      }else.
19f20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19f30 5f 54 45 53 54 20 2a 2f 0a 20 20 20 20 20 20 7b  _TEST */.      {
19f40 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
19f50 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19f60 2c 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d  , "unknown argum
19f70 65 6e 74 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63  ent: ", zArg, (c
19f80 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  har*)0);.       
19f90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19fa0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
19fb0 0a 20 20 20 20 69 66 28 20 69 3d 3d 32 20 29 7b  .    if( i==2 ){
19fc0 20 20 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65     .      Tcl_Se
19fd0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
19fe0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
19ff0 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43  libversion(), TC
1a000 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  L_STATIC);.    }
1a010 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
1a020 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
1a030 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65  the SWITCH state
1a040 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ment */.  return
1a050 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
1a060 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a  TE_TCL_NRE./*.**
1a070 20 41 64 61 70 74 6f 72 20 74 68 61 74 20 70 72   Adaptor that pr
1a080 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64  ovides an objCmd
1a090 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   interface to th
1a0a0 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a  e NRE-enabled.**
1a0b0 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65   interface imple
1a0c0 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
1a0d0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1a0e0 54 43 4c 41 50 49 20 44 62 4f 62 6a 43 6d 64 41  TCLAPI DbObjCmdA
1a0f0 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64 20 2a  daptor(.  void *
1a100 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
1a110 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1a120 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1a130 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20  *const*objv.){. 
1a140 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61   return Tcl_NRCa
1a150 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72 70  llObjProc(interp
1a160 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c 20  , DbObjCmd, cd, 
1a170 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23  objc, objv);.}.#
1a180 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a190 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a  TCL_NRE */../*.*
1a1a0 2a 20 49 73 73 75 65 20 74 68 65 20 75 73 61 67  * Issue the usag
1a1b0 65 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 74  e message when t
1a1c0 68 65 20 22 73 71 6c 69 74 65 33 22 20 63 6f 6d  he "sqlite3" com
1a1d0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 61  mand arguments a
1a1e0 72 65 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 2e  re.** incorrect.
1a1f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1a200 71 6c 69 74 65 43 6d 64 55 73 61 67 65 28 0a 20  qliteCmdUsage(. 
1a210 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1a220 65 72 70 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp,.  Tcl_Obj *
1a230 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20  const*objv.){.  
1a240 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1a250 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1a260 2c 0a 20 20 20 20 22 48 41 4e 44 4c 45 20 3f 46  ,.    "HANDLE ?F
1a270 49 4c 45 4e 41 4d 45 3f 20 3f 2d 76 66 73 20 56  ILENAME? ?-vfs V
1a280 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e  FSNAME? ?-readon
1a290 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72  ly BOOLEAN? ?-cr
1a2a0 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20  eate BOOLEAN?". 
1a2b0 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42     " ?-nomutex B
1a2c0 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75  OOLEAN? ?-fullmu
1a2d0 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75  tex BOOLEAN? ?-u
1a2e0 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66  ri BOOLEAN?".#if
1a2f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a300 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64  HAS_CODEC) && !d
1a310 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1a320 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43  IT_CODEC_FROM_TC
1a330 4c 29 0a 20 20 20 20 22 20 3f 2d 6b 65 79 20 43  L).    " ?-key C
1a340 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66  ODECKEY?".#endif
1a350 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
1a360 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
1a370 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
1a380 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  AME FILENAME ?-v
1a390 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65  fs VFSNAME? ?-ke
1a3a0 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c  y KEY? ?-readonl
1a3b0 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20  y BOOLEAN?.**   
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3d0 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65          ?-create
1a3e0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75   BOOLEAN? ?-nomu
1a3f0 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a  tex BOOLEAN?.**.
1a400 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d  ** This is the m
1a410 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e  ain Tcl command.
1a420 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69    When the "sqli
1a430 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  te" Tcl command 
1a440 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74  is.** invoked, t
1a450 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
1a460 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74   to process that
1a470 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
1a480 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1a490 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61  nt, DBNAME, is a
1a4a0 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65  n arbitrary name
1a4b0 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61   for a new.** da
1a4c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a4d0 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  n.  This command
1a4e0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63   creates a new c
1a4f0 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20  ommand named.** 
1a500 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75  DBNAME that is u
1a510 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  sed to control t
1a520 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  hat connection. 
1a530 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   The database.**
1a540 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64   connection is d
1a550 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
1a560 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69  DBNAME command i
1a570 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
1a580 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
1a590 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
1a5a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a5b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61   file..**.*/.sta
1a5c0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1a5d0 43 4c 41 50 49 20 44 62 4d 61 69 6e 28 0a 20 20  CLAPI DbMain(.  
1a5e0 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f  void *cd,.  Tcl_
1a5f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a600 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1a610 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
1a620 76 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  v.){.  SqliteDb 
1a630 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p;.  const char
1a640 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a   *zArg;.  char *
1a650 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69  zErrMsg;.  int i
1a660 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1a670 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e  zFile = 0;.  con
1a680 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
1a690 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a  0;.  int flags;.
1a6a0 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72    Tcl_DString tr
1a6b0 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65  anslatedFilename
1a6c0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
1a6d0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
1a6e0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1a6f0 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52  TE_OMIT_CODEC_FR
1a700 4f 4d 5f 54 43 4c 29 0a 20 20 76 6f 69 64 20 2a  OM_TCL).  void *
1a710 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pKey = 0;.  int 
1a720 6e 4b 65 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  nKey = 0;.#endif
1a730 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1a740 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c 20   In normal use, 
1a750 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70 72  each TCL interpr
1a760 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20 73  eter runs in a s
1a770 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 53  ingle thread.  S
1a780 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75 6c  o.  ** by defaul
1a790 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20 6f  t, we can turn o
1a7a0 66 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53  ff mutexing on S
1a7b0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63  QLite database c
1a7c0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  onnections..  **
1a7d0 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74 65   However, for te
1a7e0 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69  sting purposes i
1a7f0 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 68  t is useful to h
1a800 61 76 65 20 6d 75 74 65 78 65 73 20 74 75 72 6e  ave mutexes turn
1a810 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c  ed.  ** on.  So,
1a820 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75 74   by default, mut
1a830 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66 66  exes default off
1a840 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69 6c  .  But if compil
1a850 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c  ed with.  ** SQL
1a860 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f  ITE_TCL_DEFAULT_
1a870 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d  FULLMUTEX then m
1a880 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f  utexes default o
1a890 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
1a8a0 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c  QLITE_TCL_DEFAUL
1a8b0 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c  T_FULLMUTEX.  fl
1a8c0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
1a8d0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
1a8e0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1a8f0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   | SQLITE_OPEN_F
1a900 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a  ULLMUTEX;.#else.
1a910 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
1a920 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1a930 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
1a940 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
1a950 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64  EN_NOMUTEX;.#end
1a960 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  if..  if( objc==
1a970 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  2 ){.    zArg = 
1a980 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1a990 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1a9a0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
1a9b0 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22  (zArg,"-version"
1a9c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
1a9d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a9e0 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 6c 69  nterp,sqlite3_li
1a9f0 62 76 65 72 73 69 6f 6e 28 29 2c 20 28 63 68 61  bversion(), (cha
1aa00 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
1aa10 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
1aa20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
1aa30 28 7a 41 72 67 2c 22 2d 73 6f 75 72 63 65 69 64  (zArg,"-sourceid
1aa40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
1aa50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1aa60 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 73  interp,sqlite3_s
1aa70 6f 75 72 63 65 69 64 28 29 2c 20 28 63 68 61 72  ourceid(), (char
1aa80 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
1aa90 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
1aaa0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1aab0 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63  zArg,"-has-codec
1aac0 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  ")==0 ){.#if def
1aad0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
1aae0 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e  CODEC) && !defin
1aaf0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
1ab00 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20  ODEC_FROM_TCL). 
1ab10 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
1ab20 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22  esult(interp,"1"
1ab30 2c 28 63 68 61 72 2a 29 30 29 3b 0a 23 65 6c 73  ,(char*)0);.#els
1ab40 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  e.      Tcl_Appe
1ab50 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ab60 22 30 22 2c 28 63 68 61 72 2a 29 30 29 3b 0a 23  "0",(char*)0);.#
1ab70 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
1ab80 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
1ab90 0a 20 20 20 20 69 66 28 20 7a 41 72 67 5b 30 5d  .    if( zArg[0]
1aba0 3d 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 73  =='-' ) return s
1abb0 71 6c 69 74 65 43 6d 64 55 73 61 67 65 28 69 6e  qliteCmdUsage(in
1abc0 74 65 72 70 2c 20 6f 62 6a 76 29 3b 0a 20 20 7d  terp, objv);.  }
1abd0 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6f 62  .  for(i=2; i<ob
1abe0 6a 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 41  jc; i++){.    zA
1abf0 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
1ac00 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20  ng(objv[i]);.   
1ac10 20 69 66 28 20 7a 41 72 67 5b 30 5d 21 3d 27 2d   if( zArg[0]!='-
1ac20 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
1ac30 46 69 6c 65 21 3d 30 20 29 20 72 65 74 75 72 6e  File!=0 ) return
1ac40 20 73 71 6c 69 74 65 43 6d 64 55 73 61 67 65 28   sqliteCmdUsage(
1ac50 69 6e 74 65 72 70 2c 20 6f 62 6a 76 29 3b 0a 20  interp, objv);. 
1ac60 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 7a 41 72       zFile = zAr
1ac70 67 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  g;.      continu
1ac80 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1ac90 20 69 3d 3d 6f 62 6a 63 2d 31 20 29 20 72 65 74   i==objc-1 ) ret
1aca0 75 72 6e 20 73 71 6c 69 74 65 43 6d 64 55 73 61  urn sqliteCmdUsa
1acb0 67 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 29  ge(interp, objv)
1acc0 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69  ;.    i++;.    i
1acd0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
1ace0 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66  -key")==0 ){.#if
1acf0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ad00 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64  HAS_CODEC) && !d
1ad10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ad20 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43  IT_CODEC_FROM_TC
1ad30 4c 29 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  L).      pKey = 
1ad40 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1ad50 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 5d 2c  FromObj(objv[i],
1ad60 20 26 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a   &nKey);.#endif.
1ad70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1ad80 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66 73  rcmp(zArg, "-vfs
1ad90 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
1ada0 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Vfs = Tcl_GetStr
1adb0 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20  ing(objv[i]);.  
1adc0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1add0 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f  mp(zArg, "-reado
1ade0 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
1adf0 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
1ae00 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
1ae10 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
1ae20 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29 20 29 20   objv[i], &b) ) 
1ae30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ae40 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
1ae50 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
1ae60 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
1ae70 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
1ae80 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
1ae90 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
1aea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1aeb0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1aec0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
1aed0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
1aee0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
1aef0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
1af00 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1af10 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1af20 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1af30 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29  zArg, "-create")
1af40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1af50 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
1af60 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
1af70 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1af80 5b 69 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  [i], &b) ) retur
1af90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1afa0 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c 61     if( b && (fla
1afb0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1afc0 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _READONLY)==0 ){
1afd0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
1afe0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  = SQLITE_OPEN_CR
1aff0 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EATE;.      }els
1b000 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
1b010 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
1b020 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d  _CREATE;.      }
1b030 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1b040 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f  trcmp(zArg, "-no
1b050 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  mutex")==0 ){.  
1b060 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
1b070 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
1b080 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
1b090 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29 20  p, objv[i], &b) 
1b0a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b0b0 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
1b0c0 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
1b0d0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
1b0e0 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20  NOMUTEX;.       
1b0f0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1b100 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
1b110 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b120 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
1b130 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d  ~SQLITE_OPEN_NOM
1b140 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTEX;.      }.  
1b150 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1b160 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d  mp(zArg, "-fullm
1b170 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  utex")==0 ){.   
1b180 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
1b190 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
1b1a0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
1b1b0 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29 20 29  , objv[i], &b) )
1b1c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b1d0 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
1b1e0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
1b1f0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  |= SQLITE_OPEN_F
1b200 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  ULLMUTEX;.      
1b210 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
1b220 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
1b230 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b240 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
1b250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
1b260 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20  MUTEX;.      }. 
1b270 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1b280 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75 72 69 22  cmp(zArg, "-uri"
1b290 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
1b2a0 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
1b2b0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
1b2c0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1b2d0 76 5b 69 5d 2c 20 26 62 29 20 29 20 72 65 74 75  v[i], &b) ) retu
1b2e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b2f0 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
1b300 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
1b310 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
1b320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b330 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
1b340 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
1b350 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1b360 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
1b370 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b380 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
1b390 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72  : ", zArg, (char
1b3a0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
1b3b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b3c0 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73    }.  }.  zErrMs
1b3d0 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71  g = 0;.  p = (Sq
1b3e0 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f  liteDb*)Tcl_Allo
1b3f0 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
1b400 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1b410 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
1b420 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 20 7a 46  f( zFile==0 ) zF
1b430 69 6c 65 20 3d 20 22 22 3b 0a 20 20 7a 46 69 6c  ile = "";.  zFil
1b440 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74  e = Tcl_Translat
1b450 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70  eFileName(interp
1b460 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c  , zFile, &transl
1b470 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  atedFilename);. 
1b480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
1b490 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d  en_v2(zFile, &p-
1b4a0 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73  >db, flags, zVfs
1b4b0 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
1b4c0 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64  Free(&translated
1b4d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
1b4e0 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69 66   p->db ){.    if
1b4f0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1b500 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e  ite3_errcode(p->
1b510 64 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 45 72  db) ){.      zEr
1b520 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
1b530 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
1b540 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
1b550 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b));.      sqlit
1b560 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b  e3_close(p->db);
1b570 0a 20 20 20 20 20 20 70 2d 3e 64 62 20 3d 20 30  .      p->db = 0
1b580 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1b590 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
1b5a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1b5b0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
1b5c0 73 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 23 69  str(rc));.  }.#i
1b5d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1b5e0 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21  _HAS_CODEC) && !
1b5f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b600 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54  MIT_CODEC_FROM_T
1b610 43 4c 29 0a 20 20 69 66 28 20 70 2d 3e 64 62 20  CL).  if( p->db 
1b620 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  ){.    sqlite3_k
1b630 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  ey(p->db, pKey, 
1b640 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nKey);.  }.#endi
1b650 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  f.  if( p->db==0
1b660 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
1b670 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
1b680 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54  rrMsg, TCL_VOLAT
1b690 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72  ILE);.    Tcl_Fr
1b6a0 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20  ee((char*)p);.  
1b6b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1b6c0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
1b6d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b6e0 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20   }.  p->maxStmt 
1b6f0 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53  = NUM_PREPARED_S
1b700 54 4d 54 53 3b 0a 20 20 70 2d 3e 6f 70 65 6e 46  TMTS;.  p->openF
1b710 6c 61 67 73 20 3d 20 66 6c 61 67 73 20 26 20 53  lags = flags & S
1b720 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
1b730 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e    p->interp = in
1b740 74 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54  terp;.  zArg = T
1b750 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
1b760 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
1b770 0a 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28  .  if( DbUseNre(
1b780 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43  ) ){.    Tcl_NRC
1b790 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1b7a0 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a  erp, zArg, DbObj
1b7b0 43 6d 64 41 64 61 70 74 6f 72 2c 20 44 62 4f 62  CmdAdaptor, DbOb
1b7c0 6a 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  jCmd,.          
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1b7e0 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65  har*)p, DbDelete
1b7f0 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
1b800 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1b810 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1b820 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20  zArg, DbObjCmd, 
1b830 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65  (char*)p, DbDele
1b840 74 65 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65  teCmd);.  }.  re
1b850 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b860 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20  /*.** Provide a 
1b870 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74  dummy Tcl_InitSt
1b880 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73  ubs if we are us
1b890 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74  ing this as a st
1b8a0 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e  atic.** library.
1b8b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f  .*/.#ifndef USE_
1b8c0 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65  TCL_STUBS.# unde
1b8d0 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f  Tcl_InitStubs
1b8e0 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e  .# define Tcl_In
1b8f0 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 20 54  itStubs(a,b,c) T
1b900 43 4c 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69  CL_VERSION.#endi
1b910 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  f../*.** Make su
1b920 72 65 20 77 65 20 68 61 76 65 20 61 20 50 41 43  re we have a PAC
1b930 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63  KAGE_VERSION mac
1b940 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69  ro defined.  Thi
1b950 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66  s will be.** def
1b960 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ined automatical
1b970 6c 79 20 62 79 20 74 68 65 20 54 45 41 20 6d 61  ly by the TEA ma
1b980 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68  kefile.  But oth
1b990 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20  er makefiles.** 
1b9a0 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74  do not define it
1b9b0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43  ..*/.#ifndef PAC
1b9c0 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64  KAGE_VERSION.# d
1b9d0 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45  efine PACKAGE_VE
1b9e0 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52  RSION SQLITE_VER
1b9f0 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  SION.#endif../*.
1ba00 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
1ba10 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a  is module..**.**
1ba20 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65   This Tcl module
1ba30 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61   contains only a
1ba40 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20   single new Tcl 
1ba50 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73  command named "s
1ba60 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63  qlite"..** (Henc
1ba70 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61  e there is no na
1ba80 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65 20  mespace.  There 
1ba90 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75  is no point in u
1baa0 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65  sing a namespace
1bab0 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e  .** if the exten
1bac0 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69  sion only suppli
1bad0 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21  es one new name!
1bae0 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22 20  )  The "sqlite" 
1baf0 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73  command is.** us
1bb00 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  ed to open a new
1bb10 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
1bb20 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61 69  .  See the DbMai
1bb30 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76  n() routine abov
1bb40 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  e.** for additio
1bb50 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1bb60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58 54 45 52  .**.** The EXTER
1bb70 4e 20 6d 61 63 72 6f 73 20 61 72 65 20 72 65 71  N macros are req
1bb80 75 69 72 65 64 20 62 79 20 54 43 4c 20 69 6e 20  uired by TCL in 
1bb90 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 6f 6e  order to work on
1bba0 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54   windows..*/.EXT
1bbb0 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
1bbc0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1bbd0 2a 69 6e 74 65 72 70 29 7b 0a 20 20 69 6e 74 20  *interp){.  int 
1bbe0 72 63 20 3d 20 54 63 6c 5f 49 6e 69 74 53 74 75  rc = Tcl_InitStu
1bbf0 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22  bs(interp, "8.4"
1bc00 2c 20 30 29 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20  , 0) ? TCL_OK : 
1bc10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1bc20 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
1bc30 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1bc40 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1bc50 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f  "sqlite3", (Tcl_
1bc60 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
1bc70 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  in, 0, 0);.#ifnd
1bc80 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46  ef SQLITE_3_SUFF
1bc90 49 58 5f 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20 54  IX_ONLY.    /* T
1bca0 68 65 20 22 73 71 6c 69 74 65 22 20 61 6c 69 61  he "sqlite" alia
1bcb0 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65  s is undocumente
1bcc0 64 2e 20 20 49 74 20 69 73 20 68 65 72 65 20 6f  d.  It is here o
1bcd0 6e 6c 79 20 74 6f 20 73 75 70 70 6f 72 74 0a 20  nly to support. 
1bce0 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 73 63 72     ** legacy scr
1bcf0 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20 73  ipts.  All new s
1bd00 63 72 69 70 74 73 20 73 68 6f 75 6c 64 20 75 73  cripts should us
1bd10 65 20 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c 69  e only the "sqli
1bd20 74 65 33 22 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  te3".    ** comm
1bd30 61 6e 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  and. */.    Tcl_
1bd40 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1bd50 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
1bd60 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
1bd70 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
1bd80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63  );.#endif.    rc
1bd90 20 3d 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64   = Tcl_PkgProvid
1bda0 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
1bdb0 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52  e3", PACKAGE_VER
1bdc0 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  SION);.  }.  ret
1bdd0 75 72 6e 20 72 63 3b 0a 7d 0a 45 58 54 45 52 4e  urn rc;.}.EXTERN
1bde0 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
1bdf0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1be00 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
1be10 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
1be20 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20  terp); }.EXTERN 
1be30 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f  int Sqlite3_Unlo
1be40 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
1be50 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
1be60 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
1be70 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
1be80 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64  clsqlite3_Unload
1be90 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1bea0 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
1beb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1bec0 7d 0a 0a 2f 2a 20 42 65 63 61 75 73 65 20 69 74  }../* Because it
1bed0 20 61 63 63 65 73 73 65 73 20 74 68 65 20 66 69   accesses the fi
1bee0 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64 20 75 73  le-system and us
1bef0 65 73 20 70 65 72 73 69 73 74 65 6e 74 20 73 74  es persistent st
1bf00 61 74 65 2c 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ate, SQLite.** i
1bf10 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1bf20 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
1bf30 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65   safe interprete
1bf40 72 73 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63  rs.  Hence, we c
1bf50 61 75 73 65 0a 2a 2a 20 74 68 65 20 5f 53 61 66  ause.** the _Saf
1bf60 65 49 6e 69 74 28 29 20 69 6e 74 65 72 66 61 63  eInit() interfac
1bf70 65 73 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  es return TCL_ER
1bf80 52 4f 52 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69  ROR..*/.EXTERN i
1bf90 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49  nt Sqlite3_SafeI
1bfa0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1bfb0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
1bfc0 54 43 4c 5f 45 52 52 4f 52 3b 20 7d 0a 45 58 54  TCL_ERROR; }.EXT
1bfd0 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
1bfe0 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  SafeUnload(Tcl_I
1bff0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1c000 6e 74 20 66 6c 61 67 73 29 7b 72 65 74 75 72 6e  nt flags){return
1c010 20 54 43 4c 5f 45 52 52 4f 52 3b 7d 0a 0a 0a 0a   TCL_ERROR;}....
1c020 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33  #ifndef SQLITE_3
1c030 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74  _SUFFIX_ONLY.int
1c040 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c   Sqlite_Init(Tcl
1c050 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1c060 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
1c070 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
1c080 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49  .int Tclsqlite_I
1c090 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1c0a0 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
1c0b0 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
1c0c0 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69  erp); }.int Sqli
1c0d0 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  te_Unload(Tcl_In
1c0e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
1c0f0 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
1c100 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54   TCL_OK; }.int T
1c110 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28  clsqlite_Unload(
1c120 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c130 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
1c140 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
1c150 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1c160 66 20 74 68 65 20 54 43 4c 53 48 20 6d 61 63 72  f the TCLSH macr
1c170 6f 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 64  o is defined, ad
1c180 64 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 61  d code to make a
1c190 20 73 74 61 6e 64 2d 61 6c 6f 6e 65 20 70 72 6f   stand-alone pro
1c1a0 67 72 61 6d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  gram..*/.#if def
1c1b0 69 6e 65 64 28 54 43 4c 53 48 29 0a 0a 2f 2a 20  ined(TCLSH)../* 
1c1c0 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
1c1d0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 6e 20   routine for an 
1c1e0 6f 72 64 69 6e 61 72 79 20 54 43 4c 20 73 68 65  ordinary TCL she
1c1f0 6c 6c 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ll.  If there ar
1c200 65 0a 2a 2a 20 61 72 65 20 61 72 67 75 6d 65 6e  e.** are argumen
1c210 74 73 2c 20 72 75 6e 20 74 68 65 20 66 69 72 73  ts, run the firs
1c220 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20 61 20  t argument as a 
1c230 73 63 72 69 70 74 2e 20 20 4f 74 68 65 72 77 69  script.  Otherwi
1c240 73 65 2c 0a 2a 2a 20 72 65 61 64 20 54 43 4c 20  se,.** read TCL 
1c250 63 6f 6d 6d 61 6e 64 73 20 66 72 6f 6d 20 73 74  commands from st
1c260 61 6e 64 61 72 64 20 69 6e 70 75 74 0a 2a 2f 0a  andard input.*/.
1c270 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1c280 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f  r *tclsh_main_lo
1c290 6f 70 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  op(void){.  stat
1c2a0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d  ic const char zM
1c2b0 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20  ainloop[] =.    
1c2c0 22 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61  "if {[llength $a
1c2d0 72 67 76 5d 3e 3d 31 7d 20 7b 5c 6e 22 0a 20 20  rgv]>=1} {\n".  
1c2e0 20 20 20 20 22 73 65 74 20 61 72 67 76 30 20 5b      "set argv0 [
1c2f0 6c 69 6e 64 65 78 20 24 61 72 67 76 20 30 5d 5c  lindex $argv 0]\
1c300 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 61 72  n".      "set ar
1c310 67 76 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 76  gv [lrange $argv
1c320 20 31 20 65 6e 64 5d 5c 6e 22 0a 20 20 20 20 20   1 end]\n".     
1c330 20 22 73 6f 75 72 63 65 20 24 61 72 67 76 30 5c   "source $argv0\
1c340 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
1c350 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c  \n".      "set l
1c360 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20  ine {}\n".      
1c370 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74  "while {![eof st
1c380 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  din]} {\n".     
1c390 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
1c3a0 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
1c3b0 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77      "puts -nonew
1c3c0 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20  line \"> \"\n". 
1c3d0 20 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b         "} else {
1c3e0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22 70  \n".          "p
1c3f0 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
1c400 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20  "% \"\n".       
1c410 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22   "}\n".        "
1c420 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a  flush stdout\n".
1c430 20 20 20 20 20 20 20 20 22 61 70 70 65 6e 64 20          "append 
1c440 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
1c450 5d 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 69 66  ]\n".        "if
1c460 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65   {[info complete
1c470 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20   $line]} {\n".  
1c480 20 20 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61          "if {[ca
1c490 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
1c4a0 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
1c4b0 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  {\n".           
1c4c0 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22   "puts stderr \"
1c4d0 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22  Error: $result\"
1c4e0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22 7d  \n".          "}
1c4f0 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
1c500 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
1c510 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24           "puts $
1c520 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20  result\n".      
1c530 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
1c540 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d      "set line {}
1c550 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 20 65  \n".        "} e
1c560 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  lse {\n".       
1c570 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20     "append line 
1c580 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  \\n\n".        "
1c590 7d 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22  }\n".      "}\n"
1c5a0 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20  .    "}\n".  ;. 
1c5b0 20 72 65 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f   return zMainloo
1c5c0 70 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 54 43  p;.}..#define TC
1c5d0 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20  LSH_MAIN main   
1c5e0 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b  /* Needed to fak
1c5f0 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a  e out mktclapp *
1c600 2f 0a 69 6e 74 20 53 51 4c 49 54 45 5f 43 44 45  /.int SQLITE_CDE
1c610 43 4c 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  CL TCLSH_MAIN(in
1c620 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
1c630 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
1c640 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 69 6e  rp *interp;.  in
1c650 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
1c660 72 20 2a 7a 53 63 72 69 70 74 20 3d 20 30 3b 0a  r *zScript = 0;.
1c670 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d    char zArgc[32]
1c680 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 43  ;.#if defined(TC
1c690 4c 53 48 5f 49 4e 49 54 5f 50 52 4f 43 29 0a 20  LSH_INIT_PROC). 
1c6a0 20 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68   extern const ch
1c6b0 61 72 20 2a 54 43 4c 53 48 5f 49 4e 49 54 5f 50  ar *TCLSH_INIT_P
1c6c0 52 4f 43 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  ROC(Tcl_Interp*)
1c6d0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
1c6e0 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
1c6f0 45 29 0a 20 20 69 66 28 20 67 65 74 65 6e 76 28  E).  if( getenv(
1c700 22 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 42 52  "SQLITE_DEBUG_BR
1c710 45 41 4b 22 29 20 29 7b 0a 20 20 20 20 69 66 28  EAK") ){.    if(
1c720 20 69 73 61 74 74 79 28 30 29 20 26 26 20 69 73   isatty(0) && is
1c730 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20 20  atty(2) ){.     
1c740 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1c750 0a 20 20 20 20 20 20 20 20 20 20 22 61 74 74 61  .          "atta
1c760 63 68 20 64 65 62 75 67 67 65 72 20 74 6f 20 70  ch debugger to p
1c770 72 6f 63 65 73 73 20 25 64 20 61 6e 64 20 70 72  rocess %d and pr
1c780 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 63  ess any key to c
1c790 6f 6e 74 69 6e 75 65 2e 5c 6e 22 2c 0a 20 20 20  ontinue.\n",.   
1c7a0 20 20 20 20 20 20 20 47 45 54 50 49 44 28 29 29         GETPID())
1c7b0 3b 0a 20 20 20 20 20 20 66 67 65 74 63 28 73 74  ;.      fgetc(st
1c7c0 64 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  din);.    }else{
1c7d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
1c7e0 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
1c7f0 57 49 4e 33 32 29 0a 20 20 20 20 20 20 44 65 62  WIN32).      Deb
1c800 75 67 42 72 65 61 6b 28 29 3b 0a 23 65 6c 69 66  ugBreak();.#elif
1c810 20 64 65 66 69 6e 65 64 28 53 49 47 54 52 41 50   defined(SIGTRAP
1c820 29 0a 20 20 20 20 20 20 72 61 69 73 65 28 53 49  ).      raise(SI
1c830 47 54 52 41 50 29 3b 0a 23 65 6e 64 69 66 0a 20  GTRAP);.#endif. 
1c840 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1c850 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74  .  /* Call sqlit
1c860 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e  e3_shutdown() on
1c870 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  ce before doing 
1c880 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54  anything else. T
1c890 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74  his is to.  ** t
1c8a0 65 73 74 20 74 68 61 74 20 73 71 6c 69 74 65 33  est that sqlite3
1c8b0 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20  _shutdown() can 
1c8c0 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64  be safely called
1c8d0 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 62 65   by a process be
1c8e0 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  fore.  ** sqlite
1c8f0 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
1c900 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  s. */.  sqlite3_
1c910 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54  shutdown();..  T
1c920 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c  cl_FindExecutabl
1c930 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 54 63  e(argv[0]);.  Tc
1c940 6c 5f 53 65 74 53 79 73 74 65 6d 45 6e 63 6f 64  l_SetSystemEncod
1c950 69 6e 67 28 4e 55 4c 4c 2c 20 22 75 74 66 2d 38  ing(NULL, "utf-8
1c960 22 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54  ");.  interp = T
1c970 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28  cl_CreateInterp(
1c980 29 3b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69  );.  Sqlite3_Ini
1c990 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 73 71  t(interp);..  sq
1c9a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1c9b0 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41  izeof(zArgc), zA
1c9c0 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d  rgc, "%d", argc-
1c9d0 31 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  1);.  Tcl_SetVar
1c9e0 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20  (interp,"argc", 
1c9f0 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41  zArgc, TCL_GLOBA
1ca00 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 53  L_ONLY);.  Tcl_S
1ca10 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
1ca20 67 76 30 22 2c 61 72 67 76 5b 30 5d 2c 54 43 4c  gv0",argv[0],TCL
1ca30 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
1ca40 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1ca50 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
1ca60 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1ca70 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
1ca80 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  gc; i++){.    Tc
1ca90 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
1caa0 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d   "argv", argv[i]
1cab0 2c 0a 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c  ,.        TCL_GL
1cac0 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
1cad0 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
1cae0 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
1caf0 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  ;.  }.#if define
1cb00 64 28 54 43 4c 53 48 5f 49 4e 49 54 5f 50 52 4f  d(TCLSH_INIT_PRO
1cb10 43 29 0a 20 20 7a 53 63 72 69 70 74 20 3d 20 54  C).  zScript = T
1cb20 43 4c 53 48 5f 49 4e 49 54 5f 50 52 4f 43 28 69  CLSH_INIT_PROC(i
1cb30 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20  nterp);.#endif. 
1cb40 20 69 66 28 20 7a 53 63 72 69 70 74 3d 3d 30 20   if( zScript==0 
1cb50 29 7b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  ){.    zScript =
1cb60 20 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70   tclsh_main_loop
1cb70 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  ();.  }.  if( Tc
1cb80 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74  l_GlobalEval(int
1cb90 65 72 70 2c 20 7a 53 63 72 69 70 74 29 21 3d 54  erp, zScript)!=T
1cba0 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  CL_OK ){.    con
1cbb0 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d  st char *zInfo =
1cbc0 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65   Tcl_GetVar(inte
1cbd0 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c  rp, "errorInfo",
1cbe0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1cbf0 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  );.    if( zInfo
1cc00 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63  ==0 ) zInfo = Tc
1cc10 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1cc20 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 66  t(interp);.    f
1cc30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
1cc40 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c  s: %s\n", *argv,
1cc50 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74   zInfo);.    ret
1cc60 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
1cc70 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1cc80 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a              /* TCLSH */.