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

Artifact a65eb317f8b83f7ae546f88db56600f9a39550688d70501b8eb0cc3a4b4960c9:


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 2a 0a 2a 2a 20 56 61 72 69 61  ure..**.** Varia
09a0: 62 6c 65 20 65 54 79 70 65 20 6d 61 79 20 62 65  ble eType may be
09b0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
09c0: 4e 54 45 47 45 52 2c 20 53 51 4c 49 54 45 5f 46  NTEGER, SQLITE_F
09d0: 4c 4f 41 54 2c 20 53 51 4c 49 54 45 5f 54 45 58  LOAT, SQLITE_TEX
09e0: 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 4c 4f  T,.** SQLITE_BLO
09f0: 42 20 6f 72 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  B or SQLITE_NULL
0a00: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
0a10: 45 5f 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  E_NULL, then the
0a20: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
0a30: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  ** attempts to d
0a40: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 79 70  etermine the typ
0a50: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  e of the result 
0a60: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 54 63 6c  based on the Tcl
0a70: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 49 66 20 69   object..** If i
0a80: 74 20 69 73 20 53 51 4c 49 54 45 5f 54 45 58 54  t is SQLITE_TEXT
0a90: 20 6f 72 20 53 51 4c 49 54 45 5f 42 4c 4f 42 2c   or SQLITE_BLOB,
0aa0: 20 74 68 65 6e 20 61 20 74 65 78 74 20 28 73 71   then a text (sq
0ab0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
0ac0: 74 28 29 29 0a 2a 2a 20 6f 72 20 62 6c 6f 62 20  t()).** or blob 
0ad0: 28 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  (sqlite3_result_
0ae0: 62 6c 6f 62 28 29 29 20 69 73 20 72 65 74 75 72  blob()) is retur
0af0: 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 53 51  ned. If it is SQ
0b00: 4c 49 54 45 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  LITE_INTEGER.** 
0b10: 6f 72 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 2c  or SQLITE_FLOAT,
0b20: 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
0b30: 20 69 73 20 6d 61 64 65 20 74 6f 20 72 65 74 75   is made to retu
0b40: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  rn an integer or
0b50: 20 66 6c 6f 61 74 0a 2a 2a 20 76 61 6c 75 65 2c   float.** value,
0b60: 20 66 61 6c 6c 69 6e 67 20 62 61 63 6b 20 74 6f   falling back to
0b70: 20 66 6c 6f 61 74 20 61 6e 64 20 74 68 65 6e 20   float and then 
0b80: 74 65 78 74 20 69 66 20 74 68 69 73 20 69 73 20  text if this is 
0b90: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f  not possible..*/
0ba0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0bb0: 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b  SqlFunc SqlFunc;
0bc0: 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20  .struct SqlFunc 
0bd0: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
0be0: 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65  interp;   /* The
0bf0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74   TCL interpret t
0c00: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75  o execute the fu
0c10: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
0c20: 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20  Obj *pScript;   
0c30: 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a    /* The Tcl_Obj
0c40: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
0c50: 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f  of the script */
0c60: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
0c70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
0c80: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
0c90: 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 66  that owns this f
0ca0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
0cb0: 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20   useEvalObjv;   
0cc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74     /* True if it
0cd0: 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20   is safe to use 
0ce0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a  Tcl_EvalObjv */.
0cf0: 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
0d00: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
0d10: 6f 66 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  of value to retu
0d20: 72 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  rn */.  char *zN
0d30: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ame;          /*
0d40: 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20 66 75   Name of this fu
0d50: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71 6c 46  nction */.  SqlF
0d60: 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  unc *pNext;     
0d70: 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69    /* Next functi
0d80: 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  on on the list o
0d90: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b  f them all */.};
0da0: 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f 6c 6c  ../*.** New coll
0db0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
0dc0: 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  function can be 
0dd0: 63 72 65 61 74 65 64 20 61 73 20 54 43 4c 20 73  created as TCL s
0de0: 63 72 69 70 74 73 2e 20 20 45 61 63 68 20 73 75  cripts.  Each su
0df0: 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ch.** function i
0e00: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61  s described by a
0e10: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0e20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0e30: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
0e40: 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c  f struct SqlColl
0e50: 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65 3b 0a  ate SqlCollate;.
0e60: 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74  struct SqlCollat
0e70: 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  e {.  Tcl_Interp
0e80: 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54   *interp;   /* T
0e90: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
0ea0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
0eb0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  function */.  ch
0ec0: 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20 20 20  ar *zScript;    
0ed0: 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72 69 70      /* The scrip
0ee0: 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a 20  t to be run */. 
0ef0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 4e 65   SqlCollate *pNe
0f00: 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 66  xt;    /* Next f
0f10: 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c  unction on the l
0f20: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
0f30: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  */.};../*.** Pre
0f40: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
0f50: 20 61 72 65 20 63 61 63 68 65 64 20 66 6f 72 20   are cached for 
0f60: 66 61 73 74 65 72 20 65 78 65 63 75 74 69 6f 6e  faster execution
0f70: 2e 20 20 45 61 63 68 20 70 72 65 70 61 72 65 64  .  Each prepared
0f80: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73  .** statement is
0f90: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 61 6e   described by an
0fa0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0fb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0fc0: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
0fd0: 20 73 74 72 75 63 74 20 53 71 6c 50 72 65 70 61   struct SqlPrepa
0fe0: 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65 70 61  redStmt SqlPrepa
0ff0: 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63 74 20  redStmt;.struct 
1000: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
1010: 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  {.  SqlPreparedS
1020: 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20  tmt *pNext;  /* 
1030: 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64 20 6c  Next in linked l
1040: 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70  ist */.  SqlPrep
1050: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 76 3b  aredStmt *pPrev;
1060: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6f 6e    /* Previous on
1070: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 73   the list */.  s
1080: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1090: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  mt;     /* The p
10a0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
10b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b  t */.  int nSql;
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d0: 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53 71 6c  /* chars in zSql
10e0: 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  [] */.  const ch
10f0: 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
1100: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
1110: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
1120: 0a 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20 20 20  .  int nParm;   
1130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1140: 69 7a 65 20 6f 66 20 61 70 50 61 72 6d 20 61 72  ize of apParm ar
1150: 72 61 79 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ray */.  Tcl_Obj
1160: 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20 20 20   **apParm;      
1170: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
1180: 66 65 72 65 6e 63 65 64 20 6f 62 6a 65 63 74 20  ferenced object 
1190: 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 7d 3b 0a 0a  pointers */.};..
11a0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
11b0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 49  ncrblobChannel I
11c0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 3b 0a  ncrblobChannel;.
11d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  ./*.** There is 
11e0: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
11f0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
1200: 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20 64  or each SQLite d
1210: 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20  atabase.** that 
1220: 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
1230: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54 43  by the SQLite TC
1240: 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  L interface..**.
1250: 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64 75 6c  ** If this modul
1260: 65 20 69 73 20 62 75 69 6c 74 20 77 69 74 68 20  e is built with 
1270: 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66 69  SQLITE_TEST defi
1280: 6e 65 64 20 28 74 6f 20 63 72 65 61 74 65 20 74  ned (to create t
1290: 68 65 20 53 51 4c 69 74 65 0a 2a 2a 20 74 65 73  he SQLite.** tes
12a0: 74 66 69 78 74 75 72 65 20 65 78 65 63 75 74 61  tfixture executa
12b0: 62 6c 65 29 2c 20 74 68 65 6e 20 69 74 20 6d 61  ble), then it ma
12c0: 79 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64 20  y be configured 
12d0: 74 6f 20 75 73 65 20 65 69 74 68 65 72 0a 2a 2a  to use either.**
12e0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
12f0: 5f 76 32 28 29 20 6f 72 20 73 71 6c 69 74 65 33  _v2() or sqlite3
1300: 5f 70 72 65 70 61 72 65 28 29 20 74 6f 20 70 72  _prepare() to pr
1310: 65 70 61 72 65 20 53 51 4c 20 73 74 61 74 65 6d  epare SQL statem
1320: 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 53 71 6c 69  ents..** If Sqli
1330: 74 65 44 62 2e 62 4c 65 67 61 63 79 50 72 65 70  teDb.bLegacyPrep
1340: 61 72 65 20 69 73 20 74 72 75 65 2c 20 73 71 6c  are is true, sql
1350: 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 69  ite3_prepare() i
1360: 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 72 75 63  s used..*/.struc
1370: 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73  t SqliteDb {.  s
1380: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13a0: 20 22 72 65 61 6c 22 20 64 61 74 61 62 61 73 65   "real" database
13b0: 20 73 74 72 75 63 74 75 72 65 2e 20 4d 55 53 54   structure. MUST
13c0: 20 42 45 20 46 49 52 53 54 20 2a 2f 0a 20 20 54   BE FIRST */.  T
13d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13e0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p;        /* The
13f0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 75 73 65   interpreter use
1400: 64 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  d for this datab
1410: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ase */.  char *z
1420: 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 20  Busy;           
1430: 20 20 20 20 2f 2a 20 54 68 65 20 62 75 73 79 20      /* The busy 
1440: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
1450: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d   */.  char *zCom
1460: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
1470: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 69 74 20 68   /* The commit h
1480: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ook callback rou
1490: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
14a0: 7a 54 72 61 63 65 3b 20 20 20 20 20 20 20 20 20  zTrace;         
14b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63       /* The trac
14c0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
14d0: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  ne */.  char *zT
14e0: 72 61 63 65 56 32 3b 20 20 20 20 20 20 20 20 20  raceV2;         
14f0: 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 5f     /* The trace_
1500: 76 32 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  v2 callback rout
1510: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
1520: 50 72 6f 66 69 6c 65 3b 20 20 20 20 20 20 20 20  Profile;        
1530: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 66 69      /* The profi
1540: 6c 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  le callback rout
1550: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
1560: 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20  Progress;       
1570: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 67 72      /* The progr
1580: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ess callback rou
1590: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
15a0: 7a 42 69 6e 64 46 61 6c 6c 62 61 63 6b 3b 20 20  zBindFallback;  
15b0: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b       /* Callback
15c0: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 61 20   to invoke on a 
15d0: 62 69 6e 64 69 6e 67 20 6d 69 73 73 20 2a 2f 0a  binding miss */.
15e0: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20    char *zAuth;  
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1600: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
1610: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
1620: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61  ne */.  int disa
1630: 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20 20  bleAuth;        
1640: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68     /* Disable th
1650: 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66 20  e authorizer if 
1660: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 63  it exists */.  c
1670: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20  har *zNull;     
1680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1690: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
16a0: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
16b0: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
16c0: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
16d0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
16e0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a   SQL functions *
16f0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70  /.  Tcl_Obj *pUp
1700: 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f  dateHook;      /
1710: 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  * Update hook sc
1720: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1730: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 50 72 65  .  Tcl_Obj *pPre
1740: 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 2f 2a  UpdateHook;   /*
1750: 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   Pre-update hook
1760: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1770: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1780: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20  RollbackHook;   
1790: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f   /* Rollback hoo
17a0: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
17b0: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
17c0: 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20  pWalHook;       
17d0: 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63    /* WAL hook sc
17e0: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
17f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c  .  Tcl_Obj *pUnl
1800: 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a  ockNotify;    /*
1810: 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73   Unlock notify s
1820: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1830: 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
1840: 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f  pCollate;      /
1850: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
1860: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
1870: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
18a0: 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   of most recent 
18b0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a  sqlite3_exec() *
18c0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f  /.  Tcl_Obj *pCo
18d0: 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f  llateNeeded;   /
18e0: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
18f0: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
1900: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
1910: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
1920: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
1930: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
1940: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1950: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
1960: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
1970: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
1980: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
1990: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
19a0: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
19b0: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
19c0: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e0: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
19f0: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
1a00: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1a10: 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62  annel *pIncrblob
1a20: 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20  ;/* Linked list 
1a30: 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  of open incrblob
1a40: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69   channels */.  i
1a50: 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c  nt nStep, nSort,
1a60: 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61   nIndex;  /* Sta
1a70: 74 69 73 74 69 63 73 20 66 6f 72 20 6d 6f 73 74  tistics for most
1a80: 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f   recent operatio
1a90: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 4d 53 74  n */.  int nVMSt
1aa0: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
1ab0: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 73 74 61    /* Another sta
1ac0: 74 69 73 74 69 63 20 66 6f 72 20 6d 6f 73 74 20  tistic for most 
1ad0: 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e  recent operation
1ae0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   */.  int nTrans
1af0: 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  action;         
1b00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
1b10: 73 74 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f  sted [transactio
1b20: 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20  n] methods */.  
1b30: 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20  int openFlags;  
1b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1b50: 61 67 73 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  ags used to open
1b60: 2e 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  .  (SQLITE_OPEN_
1b70: 55 52 49 29 20 2a 2f 0a 23 69 66 64 65 66 20 53  URI) */.#ifdef S
1b80: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
1b90: 20 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 3b   bLegacyPrepare;
1ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1bb0: 74 6f 20 75 73 65 20 73 71 6c 69 74 65 33 5f 70  to use sqlite3_p
1bc0: 72 65 70 61 72 65 28 29 20 2a 2f 0a 23 65 6e 64  repare() */.#end
1bd0: 69 66 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e  if.};..struct In
1be0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a  crblobChannel {.
1bf0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
1c00: 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73  pBlob;      /* s
1c10: 71 6c 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64  qlite3 blob hand
1c20: 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62  le */.  SqliteDb
1c30: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
1c40: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
1c50: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1c60: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ion */.  int iSe
1c70: 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ek;             
1c80: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65     /* Current se
1c90: 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54  ek offset */.  T
1ca0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e  cl_Channel chann
1cb0: 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  el;      /* Chan
1cc0: 6e 65 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a  nel identifier *
1cd0: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1ce0: 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a  nel *pNext;   /*
1cf0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1d00: 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f  all open incrblo
1d10: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20  b channels */.  
1d20: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1d30: 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e  *pPrev;   /* Lin
1d40: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
1d50: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1d60: 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  annels */.};../*
1d70: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
1d80: 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74  ring length that
1d90: 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77   is limited to w
1da0: 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  hat can be store
1db0: 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30  d in.** lower 30
1dc0: 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69   bits of a 32-bi
1dd0: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
1de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1df0: 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63  strlen30(const c
1e00: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74  har *z){.  const
1e10: 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20   char *z2 = z;. 
1e20: 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a   while( *z2 ){ z
1e30: 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  2++; }.  return 
1e40: 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e  0x3fffffff & (in
1e50: 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 0a  t)(z2 - z);.}...
1e60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e70: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a  MIT_INCRBLOB./*.
1e80: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63  ** Close all inc
1e90: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f  rblob channels o
1ea0: 70 65 6e 65 64 20 75 73 69 6e 67 20 64 61 74 61  pened using data
1eb0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1ec0: 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pDb..** This is 
1ed0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 73 68 75 74  called when shut
1ee0: 74 69 6e 67 20 64 6f 77 6e 20 74 68 65 20 64 61  ting down the da
1ef0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1f00: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1f10: 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43  d closeIncrblobC
1f20: 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65 44 62  hannels(SqliteDb
1f30: 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c   *pDb){.  Incrbl
1f40: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20  obChannel *p;.  
1f50: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1f60: 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70  *pNext;..  for(p
1f70: 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b  =pDb->pIncrblob;
1f80: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
1f90: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
1fa0: 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  xt;..    /* Note
1fb0: 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69  : Calling unregi
1fc0: 73 74 65 72 20 68 65 72 65 20 63 61 6c 6c 20 54  ster here call T
1fd0: 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20  cl_Close on the 
1fe0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1ff0: 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 64  ,.    ** which d
2000: 65 6c 65 74 65 73 20 74 68 65 20 49 6e 63 72 62  eletes the Incrb
2010: 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63  lobChannel struc
2020: 74 75 72 65 20 61 74 20 2a 70 2e 20 53 6f 20 64  ture at *p. So d
2030: 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c  o not.    ** cal
2040: 6c 20 54 63 6c 5f 46 72 65 65 28 29 20 68 65 72  l Tcl_Free() her
2050: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  e..    */.    Tc
2060: 6c 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e  l_UnregisterChan
2070: 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  nel(pDb->interp,
2080: 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20   p->channel);.  
2090: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
20a0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
20b0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f  blob channel..*/
20c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
20d0: 54 45 5f 54 43 4c 41 50 49 20 69 6e 63 72 62 6c  TE_TCLAPI incrbl
20e0: 6f 62 43 6c 6f 73 65 28 0a 20 20 43 6c 69 65 6e  obClose(.  Clien
20f0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
2100: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2110: 20 2a 69 6e 74 65 72 70 0a 29 7b 0a 20 20 49 6e   *interp.){.  In
2120: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
2130: 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e   = (IncrblobChan
2140: 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61  nel *)instanceDa
2150: 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  ta;.  int rc = s
2160: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
2170: 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73  e(p->pBlob);.  s
2180: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
2190: 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52  pDb->db;..  /* R
21a0: 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e 65  emove the channe
21b0: 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69 74  l from the Sqlit
21c0: 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69  eDb.pIncrblob li
21d0: 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  st. */.  if( p->
21e0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
21f0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
2200: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
2210: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
2220: 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
2230: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
2240: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62 2d   }.  if( p->pDb-
2250: 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b  >pIncrblob==p ){
2260: 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e  .    p->pDb->pIn
2270: 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78  crblob = p->pNex
2280: 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65  t;.  }..  /* Fre
2290: 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68  e the IncrblobCh
22a0: 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20  annel structure 
22b0: 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63  */.  Tcl_Free((c
22c0: 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28  har *)p);..  if(
22d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22e0: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
22f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
2300: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
2310: 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  sg(db), TCL_VOLA
2320: 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72  TILE);.    retur
2330: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2340: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
2360: 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63  data from an inc
2370: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
2380: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
2390: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
23a0: 50 49 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74  PI incrblobInput
23b0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  (.  ClientData i
23c0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 63  nstanceData,.  c
23d0: 68 61 72 20 2a 62 75 66 2c 0a 20 20 69 6e 74 20  har *buf,.  int 
23e0: 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a  bufSize,.  int *
23f0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
2400: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
2410: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
2420: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
2430: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52  ceData;.  int nR
2440: 65 61 64 20 3d 20 62 75 66 53 69 7a 65 3b 20 20  ead = bufSize;  
2450: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2460: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
2470: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  d */.  int nBlob
2480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2490: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
24a0: 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f  e of the blob */
24b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  /* sqlite error 
24e0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62  code */..  nBlob
24f0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2500: 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b  bytes(p->pBlob);
2510: 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b  .  if( (p->iSeek
2520: 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b  +nRead)>nBlob ){
2530: 0a 20 20 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c  .    nRead = nBl
2540: 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d  ob-p->iSeek;.  }
2550: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 3d 30 20  .  if( nRead<=0 
2560: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2570: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
2580: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
2590: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
25a0: 29 62 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e  )buf, nRead, p->
25b0: 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63  iSeek);.  if( rc
25c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25d0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
25e0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
25f0: 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  n -1;.  }..  p->
2600: 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a  iSeek += nRead;.
2610: 20 20 72 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a    return nRead;.
2620: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
2630: 61 74 61 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d  ata to an increm
2640: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
2650: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
2660: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2670: 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a  incrblobOutput(.
2680: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
2690: 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 43 4f 4e  tanceData,.  CON
26a0: 53 54 20 63 68 61 72 20 2a 62 75 66 2c 0a 20 20  ST char *buf,.  
26b0: 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20 69  int toWrite,.  i
26c0: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  nt *errorCodePtr
26d0: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
26e0: 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72  annel *p = (Incr
26f0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e  blobChannel *)in
2700: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e  stanceData;.  in
2710: 74 20 6e 57 72 69 74 65 20 3d 20 74 6f 57 72 69  t nWrite = toWri
2720: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  te;        /* Nu
2730: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
2740: 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20   write */.  int 
2750: 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
2760: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2770: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  l size of the bl
2780: 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ob */.  int rc; 
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65       /* sqlite e
27b0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  rror code */..  
27c0: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
27d0: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
27e0: 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  lob);.  if( (p->
27f0: 69 53 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e 42  iSeek+nWrite)>nB
2800: 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f  lob ){.    *erro
2810: 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41  rCodePtr = EINVA
2820: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  L;.    return -1
2830: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 57 72 69  ;.  }.  if( nWri
2840: 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  te<=0 ){.    ret
2850: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  urn 0;.  }..  rc
2860: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2870: 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c 20  write(p->pBlob, 
2880: 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57 72  (void *)buf, nWr
2890: 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a  ite, p->iSeek);.
28a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f  _OK ){.    *erro
28c0: 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a  rCodePtr = EIO;.
28d0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
28e0: 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b   }..  p->iSeek +
28f0: 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  = nWrite;.  retu
2900: 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a  rn nWrite;.}../*
2910: 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63 72  .** Seek an incr
2920: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
2930: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
2940: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2950: 49 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a  I incrblobSeek(.
2960: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
2970: 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 6c 6f 6e  tanceData,.  lon
2980: 67 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20  g offset,.  int 
2990: 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20  seekMode,.  int 
29a0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b  *errorCodePtr.){
29b0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
29c0: 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  el *p = (Incrblo
29d0: 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61  bChannel *)insta
29e0: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69 74  nceData;..  swit
29f0: 63 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a  ch( seekMode ){.
2a00: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53 45      case SEEK_SE
2a10: 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  T:.      p->iSee
2a20: 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  k = offset;.    
2a30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2a40: 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20  e SEEK_CUR:.    
2a50: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66    p->iSeek += of
2a60: 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  fset;.      brea
2a70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b  k;.    case SEEK
2a80: 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69  _END:.      p->i
2a90: 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62  Seek = sqlite3_b
2aa0: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c  lob_bytes(p->pBl
2ab0: 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20  ob) + offset;.  
2ac0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2ad0: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
2ae0: 21 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22 29  !"Bad seekMode")
2af0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2b00: 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74  p->iSeek;.}...st
2b10: 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45  atic void SQLITE
2b20: 5f 54 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62  _TCLAPI incrblob
2b30: 57 61 74 63 68 28 0a 20 20 43 6c 69 65 6e 74 44  Watch(.  ClientD
2b40: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2b50: 2c 0a 20 20 69 6e 74 20 6d 6f 64 65 0a 29 7b 0a  ,.  int mode.){.
2b60: 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 7d 0a    /* NO-OP */.}.
2b70: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2b80: 45 5f 54 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f  E_TCLAPI incrblo
2b90: 62 48 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e  bHandle(.  Clien
2ba0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
2bb0: 74 61 2c 0a 20 20 69 6e 74 20 64 69 72 2c 0a 20  ta,.  int dir,. 
2bc0: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 50 74   ClientData *hPt
2bd0: 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  r.){.  return TC
2be0: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74  L_ERROR;.}..stat
2bf0: 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79  ic Tcl_ChannelTy
2c00: 70 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  pe IncrblobChann
2c10: 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e  elType = {.  "in
2c20: 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  crblob",        
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20 20 20 20  /* typeName     
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c          */.  TCL
2c70: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
2c80: 5f 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  _2,             
2c90: 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20 20 20 20  /* version      
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2cc0: 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20  rblobClose,     
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20 20 20  /* closeProc    
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2d10: 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20 20 20  rblobInput,     
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20 20 20 20  /* inputProc    
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2d60: 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20 20 20  rblobOutput,    
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63 20 20 20  /* outputProc   
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2db0: 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20 20 20  rblobSeek,      
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20 20 20 20  /* seekProc     
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 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 20 20 20 20 20 20 20                  
2e20: 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63  /* setOptionProc
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e40: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63  /* getOptionProc
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2ea0: 72 62 6c 6f 62 57 61 74 63 68 2c 20 20 20 20 20  rblobWatch,     
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 2f 2a 20 77 61 74 63 68 50 72 6f 63 20 28 74 68  /* watchProc (th
2ed0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20  is is a no-op)  
2ee0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63          */.  inc
2ef0: 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20  rblobHandle,    
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50 72 6f 63  /* getHandleProc
2f20: 20 28 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73   (always returns
2f30: 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20   error) */.  0, 
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20 20 20  /* close2Proc   
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63  /* blockModeProc
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20 20 20 20  /* flushProc    
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63 20 20  /* handlerProc  
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20          */.  0, 
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 2f 2a 20 77 69 64 65 53 65 65 6b 50 72 6f 63 20  /* wideSeekProc 
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f          */.};../
30d0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
30e0: 77 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  w incrblob chann
30f0: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
3100: 74 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62  t createIncrblob
3110: 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49  Channel(.  Tcl_I
3120: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
3130: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 0a   SqliteDb *pDb,.
3140: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
3150: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
3160: 2a 7a 54 61 62 6c 65 2c 0a 20 20 63 6f 6e 73 74  *zTable,.  const
3170: 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 0a   char *zColumn,.
3180: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
3190: 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52 65 61  Row,.  int isRea
31a0: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62  donly.){.  Incrb
31b0: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20  lobChannel *p;. 
31c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
31d0: 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65  Db->db;.  sqlite
31e0: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
31f0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66   int rc;.  int f
3200: 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41 44 41  lags = TCL_READA
3210: 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20  BLE|(isReadonly 
3220: 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54 41 42  ? 0 : TCL_WRITAB
3230: 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  LE);..  /* This 
3240: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
3250: 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63 68 61   to name the cha
3260: 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62  nnels: "incrblob
3270: 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a  _[incr count]" *
3280: 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  /.  static int c
3290: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  ount = 0;.  char
32a0: 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a   zChannel[64];..
32b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
32c0: 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62  lob_open(db, zDb
32d0: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
32e0: 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65 61 64  n, iRow, !isRead
32f0: 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20  only, &pBlob);. 
3300: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3310: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
3320: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
3330: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
3340: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
3350: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
3360: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3370: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  RROR;.  }..  p =
3380: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
3390: 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  l *)Tcl_Alloc(si
33a0: 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68 61  zeof(IncrblobCha
33b0: 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65  nnel));.  p->iSe
33c0: 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c  ek = 0;.  p->pBl
33d0: 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73  ob = pBlob;..  s
33e0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
33f0: 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29  sizeof(zChannel)
3400: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63  , zChannel, "inc
3410: 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75  rblob_%d", ++cou
3420: 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65  nt);.  p->channe
3430: 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68  l = Tcl_CreateCh
3440: 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43  annel(&IncrblobC
3450: 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61  hannelType, zCha
3460: 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b  nnel, p, flags);
3470: 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72 43  .  Tcl_RegisterC
3480: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70  hannel(interp, p
3490: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f  ->channel);..  /
34a0: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 63  * Link the new c
34b0: 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20  hannel into the 
34c0: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
34d0: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  ob list. */.  p-
34e0: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 49  >pNext = pDb->pI
34f0: 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50  ncrblob;.  p->pP
3500: 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
3510: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
3520: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
3530: 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70   p;.  }.  pDb->p
3540: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20  Incrblob = p;.  
3550: 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20  p->pDb = pDb;.. 
3560: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
3570: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54  nterp, (char *)T
3580: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
3590: 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54  e(p->channel), T
35a0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
35b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
35c0: 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20  .#else  /* else 
35d0: 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69 66 6e  clause for "#ifn
35e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35f0: 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23  INCRBLOB" */.  #
3600: 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72  define closeIncr
3610: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
3620: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
3630: 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69  Look at the scri
3640: 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d  pt prefix in pCm
3650: 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65  d.  We will be e
3660: 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73 63  xecuting this sc
3670: 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69  ript.** after fi
3680: 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e  rst appending on
3690: 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  e or more argume
36a0: 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  nts.  This routi
36b0: 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74  ne analyzes.** t
36c0: 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65 65  he script to see
36d0: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
36e0: 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62  o use Tcl_EvalOb
36f0: 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69  jv() on the scri
3700: 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  pt.** rather tha
3710: 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  n the more gener
3720: 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e  al Tcl_EvalEx().
3730: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29    Tcl_EvalObjv()
3740: 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74   is much.** fast
3750: 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74  er..**.** Script
3760: 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65 20  s that are safe 
3770: 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f  to use with Tcl_
3780: 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69  EvalObjv() consi
3790: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d  sts of a.** comm
37a0: 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65  and name followe
37b0: 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  d by zero or mor
37c0: 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68  e arguments with
37d0: 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a   no [...] or $.*
37e0: 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20  * or {...} or ; 
37f0: 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68  to be seen anywh
3800: 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62  ere.  Most callb
3810: 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73  ack scripts cons
3820: 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61  ist.** of just a
3830: 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72   single procedur
3840: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20  e name and they 
3850: 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69 72  meet this requir
3860: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
3870: 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76   int safeToUseEv
3880: 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72  alObjv(Tcl_Inter
3890: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
38a0: 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20  bj *pCmd){.  /* 
38b0: 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20  We could try to 
38c0: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  do something wit
38d0: 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20  h Tcl_Parse().  
38e0: 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74  But we will inst
38f0: 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f  ead.  ** just do
3900: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f   a search for fo
3910: 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74 65  rbidden characte
3920: 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  rs.  If any of t
3930: 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a  he forbidden.  *
3940: 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70 70  * characters app
3950: 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20  ear in pCmd, we 
3960: 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  will report the 
3970: 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65  string as unsafe
3980: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
3990: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
39a0: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
39b0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64  ringFromObj(pCmd
39c0: 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20  , &n);.  while( 
39d0: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69  n-- > 0 ){.    i
39e0: 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20  nt c = *(z++);. 
39f0: 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c     if( c=='$' ||
3a00: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b   c=='[' || c==';
3a10: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
3a20: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
3a30: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53  ./*.** Find an S
3a40: 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72 65  qlFunc structure
3a50: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
3a60: 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65  name.  Or create
3a70: 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66   a new.** one if
3a80: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65   an existing one
3a90: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
3aa0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
3ab0: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  ter to the.** st
3ac0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
3ad0: 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64  ic SqlFunc *find
3ae0: 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62  SqlFunc(SqliteDb
3af0: 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61   *pDb, const cha
3b00: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c  r *zName){.  Sql
3b10: 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a  Func *p, *pNew;.
3b20: 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 74    int nName = st
3b30: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
3b40: 20 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63   pNew = (SqlFunc
3b50: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
3b60: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 4e 61  eof(*pNew) + nNa
3b70: 6d 65 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65 77  me + 1 );.  pNew
3b80: 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
3b90: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d  )&pNew[1];.  mem
3ba0: 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c  cpy(pNew->zName,
3bb0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
3bc0: 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70  ;.  for(p=pDb->p
3bd0: 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Func; p; p=p->pN
3be0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 73 71  ext){.    if( sq
3bf0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 2d  lite3_stricmp(p-
3c00: 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e  >zName, pNew->zN
3c10: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
3c20: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
3c30: 29 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65  )pNew);.      re
3c40: 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20  turn p;.    }.  
3c50: 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70  }.  pNew->interp
3c60: 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a   = pDb->interp;.
3c70: 20 20 70 4e 65 77 2d 3e 70 44 62 20 3d 20 70 44    pNew->pDb = pD
3c80: 62 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72 69  b;.  pNew->pScri
3c90: 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  pt = 0;.  pNew->
3ca0: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75  pNext = pDb->pFu
3cb0: 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63  nc;.  pDb->pFunc
3cc0: 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
3cd0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3ce0: 20 46 72 65 65 20 61 20 73 69 6e 67 6c 65 20 53   Free a single S
3cf0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 6f  qlPreparedStmt o
3d00: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
3d10: 20 76 6f 69 64 20 64 62 46 72 65 65 53 74 6d 74   void dbFreeStmt
3d20: 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74  (SqlPreparedStmt
3d30: 20 2a 70 53 74 6d 74 29 7b 0a 23 69 66 64 65 66   *pStmt){.#ifdef
3d40: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
3d50: 66 28 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  f( sqlite3_sql(p
3d60: 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3d 3d 30 20  Stmt->pStmt)==0 
3d70: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3d80: 28 63 68 61 72 20 2a 29 70 53 74 6d 74 2d 3e 7a  (char *)pStmt->z
3d90: 53 71 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Sql);.  }.#endif
3da0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
3db0: 69 7a 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  ize(pStmt->pStmt
3dc0: 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63  );.  Tcl_Free((c
3dd0: 68 61 72 20 2a 29 70 53 74 6d 74 29 3b 0a 7d 0a  har *)pStmt);.}.
3de0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  ./*.** Finalize 
3df0: 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20  and free a list 
3e00: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
3e10: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
3e20: 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43   void flushStmtC
3e30: 61 63 68 65 28 53 71 6c 69 74 65 44 62 20 2a 70  ache(SqliteDb *p
3e40: 44 62 29 7b 0a 20 20 53 71 6c 50 72 65 70 61 72  Db){.  SqlPrepar
3e50: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
3e60: 3b 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  ;.  SqlPreparedS
3e70: 74 6d 74 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66  tmt *pNext;..  f
3e80: 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44  or(pPreStmt = pD
3e90: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72  b->stmtList; pPr
3ea0: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
3eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
3ec0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
3ed0: 65 78 74 3b 0a 20 20 20 20 64 62 46 72 65 65 53  ext;.    dbFreeS
3ee0: 74 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a 20  tmt(pPreStmt);. 
3ef0: 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20   }.  pDb->nStmt 
3f00: 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74  = 0;.  pDb->stmt
3f10: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d  Last = 0;.  pDb-
3f20: 3e 73 74 6d 74 4c 69 73 74 20 3d 20 30 3b 0a 7d  >stmtList = 0;.}
3f30: 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c  ../*.** TCL call
3f40: 73 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  s this procedure
3f50: 20 77 68 65 6e 20 61 6e 20 73 71 6c 69 74 65 33   when an sqlite3
3f60: 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e   database comman
3f70: 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e  d is.** deleted.
3f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3f90: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62  SQLITE_TCLAPI Db
3fa0: 44 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a  DeleteCmd(void *
3fb0: 64 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  db){.  SqliteDb 
3fc0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
3fd0: 2a 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d  *)db;.  flushStm
3fe0: 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63  tCache(pDb);.  c
3ff0: 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  loseIncrblobChan
4000: 6e 65 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c  nels(pDb);.  sql
4010: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e  ite3_close(pDb->
4020: 64 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44  db);.  while( pD
4030: 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20  b->pFunc ){.    
4040: 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d  SqlFunc *pFunc =
4050: 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20   pDb->pFunc;.   
4060: 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46   pDb->pFunc = pF
4070: 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  unc->pNext;.    
4080: 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 70  assert( pFunc->p
4090: 44 62 3d 3d 70 44 62 20 29 3b 0a 20 20 20 20 54  Db==pDb );.    T
40a0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
40b0: 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
40c0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
40d0: 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d  har*)pFunc);.  }
40e0: 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70  .  while( pDb->p
40f0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53  Collate ){.    S
4100: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
4110: 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ate = pDb->pColl
4120: 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  ate;.    pDb->pC
4130: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
4140: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  e->pNext;.    Tc
4150: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43  l_Free((char*)pC
4160: 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69  ollate);.  }.  i
4170: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
4180: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
4190: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20  b->zBusy);.  }. 
41a0: 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
41b0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
41c0: 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
41d0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54   }.  if( pDb->zT
41e0: 72 61 63 65 56 32 20 29 7b 0a 20 20 20 20 54 63  raceV2 ){.    Tc
41f0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
4200: 63 65 56 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ceV2);.  }.  if(
4210: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
4220: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
4230: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
4240: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42   }.  if( pDb->zB
4250: 69 6e 64 46 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  indFallback ){. 
4260: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
4270: 3e 7a 42 69 6e 64 46 61 6c 6c 62 61 63 6b 29 3b  >zBindFallback);
4280: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
4290: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c  zAuth ){.    Tcl
42a0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
42b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
42c0: 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54  ->zNull ){.    T
42d0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75  cl_Free(pDb->zNu
42e0: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ll);.  }.  if( p
42f0: 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20  Db->pUpdateHook 
4300: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
4310: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70  efCount(pDb->pUp
4320: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20  dateHook);.  }. 
4330: 20 69 66 28 20 70 44 62 2d 3e 70 50 72 65 55 70   if( pDb->pPreUp
4340: 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  dateHook ){.    
4350: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4360: 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65  (pDb->pPreUpdate
4370: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
4380: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
4390: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
43a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
43b0: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
43c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
43d0: 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  pWalHook ){.    
43e0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
43f0: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b  (pDb->pWalHook);
4400: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
4410: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29  pCollateNeeded )
4420: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
4430: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
4440: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d  lateNeeded);.  }
4450: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
4460: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
4470: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4480: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4490: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
44a0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
44b0: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
44c0: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
44d0: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
44e0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e  ler(void *cd, in
44f0: 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c  t nTries){.  Sql
4500: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
4510: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
4520: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61  t rc;.  char zVa
4530: 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  l[30];..  sqlite
4540: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
4550: 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22  f(zVal), zVal, "
4560: 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20  %d", nTries);.  
4570: 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c  rc = Tcl_VarEval
4580: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
4590: 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a  b->zBusy, " ", z
45a0: 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Val, (char*)0);.
45b0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
45c0: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
45d0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
45e0: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
45f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4600: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
4610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4620: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
4630: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
4640: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
4650: 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72  ed as the 'progr
4660: 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f  ess callback' fo
4670: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  r the database..
4680: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
4690: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  ProgressHandler(
46a0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
46b0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
46c0: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
46d0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
46e0: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
46f0: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
4700: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
4710: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b  pDb->zProgress);
4720: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
4730: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
4740: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
4750: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
4760: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4770: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
4780: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
4790: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
47a0: 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
47b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
47c0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26  LOATING_POINT) &
47d0: 26 20 5c 0a 20 20 20 20 21 64 65 66 69 6e 65 64  & \.    !defined
47e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50  (SQLITE_OMIT_DEP
47f0: 52 45 43 41 54 45 44 29 0a 2f 2a 0a 2a 2a 20 54  RECATED)./*.** T
4800: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4810: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c  alled by the SQL
4820: 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65  ite trace handle
4830: 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77  r whenever a new
4840: 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c  .** block of SQL
4850: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
4860: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
4870: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20   pDb->zTrace is 
4880: 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  executed..*/.sta
4890: 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63 65  tic void DbTrace
48a0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
48b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
48c0: 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  ql){.  SqliteDb 
48d0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
48e0: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
48f0: 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f  ing str;..  Tcl_
4900: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4910: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4920: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
4930: 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20  ->zTrace, -1);. 
4940: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4950: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
4960: 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61  zSql);.  Tcl_Eva
4970: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
4980: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
4990: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
49a0: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
49b0: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
49c0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
49d0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
49e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
49f0: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RACE./*.** This 
4a00: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4a10: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
4a20: 74 72 61 63 65 5f 76 32 20 68 61 6e 64 6c 65 72  trace_v2 handler
4a30: 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a   whenever a new.
4a40: 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 65 76 65  ** supported eve
4a50: 6e 74 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  nt is generated.
4a60: 20 20 55 6e 73 75 70 70 6f 72 74 65 64 20 65 76    Unsupported ev
4a70: 65 6e 74 20 74 79 70 65 73 20 61 72 65 20 69 67  ent types are ig
4a80: 6e 6f 72 65 64 2e 0a 2a 2a 20 54 68 65 20 54 43  nored..** The TC
4a90: 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d  L script in pDb-
4aa0: 3e 7a 54 72 61 63 65 56 32 20 69 73 20 65 78 65  >zTraceV2 is exe
4ab0: 63 75 74 65 64 2c 20 77 69 74 68 20 74 68 65 20  cuted, with the 
4ac0: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 0a 2a 2a  arguments for.**
4ad0: 20 74 68 65 20 65 76 65 6e 74 20 61 70 70 65 6e   the event appen
4ae0: 64 65 64 20 74 6f 20 69 74 20 28 61 73 20 6c 69  ded to it (as li
4af0: 73 74 20 65 6c 65 6d 65 6e 74 73 29 2e 0a 2a 2f  st elements)..*/
4b00: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54 72  .static int DbTr
4b10: 61 63 65 56 32 48 61 6e 64 6c 65 72 28 0a 20 20  aceV2Handler(.  
4b20: 75 6e 73 69 67 6e 65 64 20 74 79 70 65 2c 20 2f  unsigned type, /
4b30: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c  * One of the SQL
4b40: 49 54 45 5f 54 52 41 43 45 5f 2a 20 65 76 65 6e  ITE_TRACE_* even
4b50: 74 20 74 79 70 65 73 2e 20 2a 2f 0a 20 20 76 6f  t types. */.  vo
4b60: 69 64 20 2a 63 64 2c 20 20 20 20 20 20 2f 2a 20  id *cd,      /* 
4b70: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  The original con
4b80: 74 65 78 74 20 64 61 74 61 20 70 6f 69 6e 74 65  text data pointe
4b90: 72 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 64  r. */.  void *pd
4ba0: 2c 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72  ,      /* Primar
4bb0: 79 20 65 76 65 6e 74 20 64 61 74 61 2c 20 64 65  y event data, de
4bc0: 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74 20 74  pends on event t
4bd0: 79 70 65 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ype. */.  void *
4be0: 78 64 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  xd       /* Extr
4bf0: 61 20 65 76 65 6e 74 20 64 61 74 61 2c 20 64 65  a event data, de
4c00: 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74 20 74  pends on event t
4c10: 79 70 65 2e 20 2a 2f 0a 29 7b 0a 20 20 53 71 6c  ype. */.){.  Sql
4c20: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
4c30: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54 63  liteDb*)cd;.  Tc
4c40: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
4c50: 73 77 69 74 63 68 28 20 74 79 70 65 20 29 7b 0a  switch( type ){.
4c60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4c70: 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a 20 20  TRACE_STMT: {.  
4c80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
4c90: 20 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74   *pStmt = (sqlit
4ca0: 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 20 20  e3_stmt *)pd;.  
4cb0: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
4cc0: 20 28 63 68 61 72 20 2a 29 78 64 3b 0a 0a 20 20   (char *)xd;..  
4cd0: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
4ce0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d  ewStringObj(pDb-
4cf0: 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b 0a  >zTraceV2, -1);.
4d00: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
4d10: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4d20: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4d30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62  ppendElement(pDb
4d40: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a  ->interp, pCmd,.
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
4d70: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
4d80: 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70 53  ((Tcl_WideInt)pS
4d90: 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63 6c  tmt));.      Tcl
4da0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4db0: 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72  ement(pDb->inter
4dc0: 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20 20  p, pCmd,.       
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53          Tcl_NewS
4df0: 74 72 69 6e 67 4f 62 6a 28 7a 53 71 6c 2c 20 2d  tringObj(zSql, -
4e00: 31 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 45  1));.      Tcl_E
4e10: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
4e20: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
4e30: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
4e40: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
4e50: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
4e60: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
4e70: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
4e80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e90: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
4ea0: 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c 45  TE_TRACE_PROFILE
4eb0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4ec0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
4ed0: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29  (sqlite3_stmt *)
4ee0: 70 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pd;.      sqlite
4ef0: 33 5f 69 6e 74 36 34 20 6e 73 20 3d 20 2a 28 73  3_int64 ns = *(s
4f00: 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 78 64  qlite3_int64*)xd
4f10: 3b 0a 0a 20 20 20 20 20 20 70 43 6d 64 20 3d 20  ;..      pCmd = 
4f20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4f30: 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20  (pDb->zTraceV2, 
4f40: 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  -1);.      Tcl_I
4f50: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
4f60: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  );.      Tcl_Lis
4f70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4f80: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  t(pDb->interp, p
4f90: 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cmd,.           
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49      Tcl_NewWideI
4fc0: 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65 49  ntObj((Tcl_WideI
4fd0: 6e 74 29 70 53 74 6d 74 29 29 3b 0a 20 20 20 20  nt)pStmt));.    
4fe0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4ff0: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e  endElement(pDb->
5000: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20  interp, pCmd,.  
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
5030: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28  _NewWideIntObj((
5040: 54 63 6c 5f 57 69 64 65 49 6e 74 29 6e 73 29 29  Tcl_WideInt)ns))
5050: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 45 76 61 6c  ;.      Tcl_Eval
5060: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
5070: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
5080: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 20  L_DIRECT);.     
5090: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
50a0: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54  t(pCmd);.      T
50b0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
50c0: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20  Db->interp);.   
50d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
50e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
50f0: 54 52 41 43 45 5f 52 4f 57 3a 20 7b 0a 20 20 20  TRACE_ROW: {.   
5100: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
5110: 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  *pStmt = (sqlite
5120: 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 0a 20 20  3_stmt *)pd;..  
5130: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
5140: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d  ewStringObj(pDb-
5150: 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b 0a  >zTraceV2, -1);.
5160: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
5170: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5180: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62  ppendElement(pDb
51a0: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a  ->interp, pCmd,.
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
51d0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
51e0: 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70 53  ((Tcl_WideInt)pS
51f0: 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63 6c  tmt));.      Tcl
5200: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
5210: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
5220: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
5230: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
5240: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5250: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
5260: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
5270: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5280: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
5290: 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45  LITE_TRACE_CLOSE
52a0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
52b0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
52c0: 20 2a 29 70 64 3b 0a 0a 20 20 20 20 20 20 70 43   *)pd;..      pC
52d0: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  md = Tcl_NewStri
52e0: 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63  ngObj(pDb->zTrac
52f0: 65 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  eV2, -1);.      
5300: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5310: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63  (pCmd);.      Tc
5320: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5330: 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65  lement(pDb->inte
5340: 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20  rp, pCmd,.      
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77           Tcl_New
5370: 57 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f  WideIntObj((Tcl_
5380: 57 69 64 65 49 6e 74 29 64 62 29 29 3b 0a 20 20  WideInt)db));.  
5390: 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45      Tcl_EvalObjE
53a0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
53b0: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
53c0: 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63 6c  RECT);.      Tcl
53d0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
53e0: 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 52  md);.      Tcl_R
53f0: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
5400: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 62  interp);.      b
5410: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5420: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5430: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
5440: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5450: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
5460: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5470: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
5480: 4f 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20 21  OINT) && \.    !
5490: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
54a0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a  MIT_DEPRECATED).
54b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
54c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
54d0: 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69  the SQLite profi
54e0: 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72  le handler after
54f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
5500: 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64  SQL has executed
5510: 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70  .  The TCL scrip
5520: 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69  t in pDb->zProfi
5530: 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  le is evaluated.
5540: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5550: 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
5560: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
5570: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c   char *zSql, sql
5580: 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a  ite_uint64 tm){.
5590: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
55a0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
55b0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
55c0: 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31  tr;.  char zTm[1
55d0: 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  00];..  sqlite3_
55e0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
55f0: 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c  zTm)-1, zTm, "%l
5600: 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f  ld", tm);.  Tcl_
5610: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
5620: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
5630: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
5640: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b  ->zProfile, -1);
5650: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
5660: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
5670: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44  , zSql);.  Tcl_D
5680: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
5690: 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a  ent(&str, zTm);.
56a0: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
56b0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
56c0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
56d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
56e0: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
56f0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
5700: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  >interp);.}.#end
5710: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
5720: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5730: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
5740: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
5750: 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63  .  The.** TCL sc
5760: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f  ript in pDb->zCo
5770: 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64  mmit is executed
5780: 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  .  If it returns
5790: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20   non-zero or.** 
57a0: 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20  if it throws an 
57b0: 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74  exception, the t
57c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
57d0: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61  lled back instea
57e0: 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f  d.** of being co
57f0: 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmitted..*/.stat
5800: 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48  ic int DbCommitH
5810: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
5820: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
5830: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
5840: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
5850: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
5860: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
5870: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  zCommit);.  if( 
5880: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
5890: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
58a0: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
58b0: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
58c0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
58d0: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
58e0: 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48  void DbRollbackH
58f0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69  andler(void *cli
5900: 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69  entData){.  Sqli
5910: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
5920: 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74  iteDb*)clientDat
5930: 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d  a;.  assert(pDb-
5940: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
5950: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
5960: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
5970: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
5980: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29  RollbackHook, 0)
5990: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
59a0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d  groundError(pDb-
59b0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a  >interp);.  }.}.
59c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63  ./*.** This proc
59d0: 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20 77 61  edure handles wa
59e0: 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73  l_hook callbacks
59f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5a00: 44 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20  DbWalHandler(.  
5a10: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
5a20: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
5a30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5a40: 44 62 2c 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  Db,.  int nEntry
5a50: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  .){.  int ret = 
5a60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c  SQLITE_OK;.  Tcl
5a70: 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74  _Obj *p;.  Sqlit
5a80: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
5a90: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
5aa0: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
5ab0: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
5ac0: 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70  terp;.  assert(p
5ad0: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a  Db->pWalHook);..
5ae0: 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44    assert( db==pD
5af0: 62 2d 3e 64 62 20 29 3b 0a 20 20 70 20 3d 20 54  b->db );.  p = T
5b00: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
5b10: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
5b20: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5b30: 6e 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  nt(p);.  Tcl_Lis
5b40: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5b50: 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c  t(interp, p, Tcl
5b60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44  _NewStringObj(zD
5b70: 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  b, -1));.  Tcl_L
5b80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5b90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54  ent(interp, p, T
5ba0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e  cl_NewIntObj(nEn
5bb0: 74 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c  try));.  if( TCL
5bc0: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
5bd0: 45 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29  Ex(interp, p, 0)
5be0: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
5bf0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
5c00: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
5c10: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
5c20: 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20 20  ), &ret).  ){.  
5c30: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
5c40: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20  Error(interp);. 
5c50: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
5c60: 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74  Count(p);..  ret
5c70: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20  urn ret;.}..#if 
5c80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
5c90: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
5ca0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
5cb0: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61  LOCK_NOTIFY).sta
5cc0: 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73 74  tic void setTest
5cd0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
5ce0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
5cf0: 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20 69  erp, int iArg, i
5d00: 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61 72  nt nArg){.  char
5d10: 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 71 6c   zBuf[64];.  sql
5d20: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5d30: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
5d40: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
5d50: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
5d60: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
5d70: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
5d80: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
5d90: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 71 6c 69 74 65  _ONLY);.  sqlite
5da0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
5db0: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
5dc0: 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63  %d", nArg);.  Tc
5dd0: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
5de0: 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f   "sqlite_unlock_
5df0: 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22  notify_argcount"
5e00: 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42  , zBuf, TCL_GLOB
5e10: 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73  AL_ONLY);.}.#els
5e20: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 54 65  e.# define setTe
5e30: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
5e40: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
5e50: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5e60: 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
5e70: 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64  TIFY.static void
5e80: 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28   DbUnlockNotify(
5e90: 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e  void **apArg, in
5ea0: 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69  t nArg){.  int i
5eb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5ec0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Arg; i++){.    c
5ed0: 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
5ee0: 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41   (TCL_EVAL_GLOBA
5ef0: 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  L|TCL_EVAL_DIREC
5f00: 54 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62  T);.    SqliteDb
5f10: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5f20: 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20  b *)apArg[i];.  
5f30: 20 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e    setTestUnlockN
5f40: 6f 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69  otifyVars(pDb->i
5f50: 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b  nterp, i, nArg);
5f60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
5f70: 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29  ->pUnlockNotify)
5f80: 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ;.    Tcl_EvalOb
5f90: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
5fa0: 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
5fb0: 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ify, flags);.   
5fc0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5fd0: 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
5fe0: 74 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e  tify);.    pDb->
5ff0: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
6000: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
6010: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6020: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
6030: 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d 75  HOOK./*.** Pre-u
6040: 70 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c 62  pdate hook callb
6050: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
6060: 6f 69 64 20 44 62 50 72 65 55 70 64 61 74 65 48  oid DbPreUpdateH
6070: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
6080: 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p,.  sqlite3 *db
6090: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
60a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
60b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
60c0: 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  l,.  sqlite_int6
60d0: 34 20 69 4b 65 79 31 2c 0a 20 20 73 71 6c 69 74  4 iKey1,.  sqlit
60e0: 65 5f 69 6e 74 36 34 20 69 4b 65 79 32 0a 29 7b  e_int64 iKey2.){
60f0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
6100: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
6110: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
6120: 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  d;.  static cons
6130: 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20  t char *azStr[] 
6140: 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49 4e  = {"DELETE", "IN
6150: 53 45 52 54 22 2c 20 22 55 50 44 41 54 45 22 7d  SERT", "UPDATE"}
6160: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  ;..  assert( (SQ
6170: 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f 39  LITE_DELETE-1)/9
6180: 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65 72   == 0 );.  asser
6190: 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45 52  t( (SQLITE_INSER
61a0: 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a 20  T-1)/9 == 1 );. 
61b0: 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
61c0: 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d 20  _UPDATE-1)/9 == 
61d0: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
61e0: 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
61f0: 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ok );.  assert( 
6200: 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a 20  db==pDb->db );. 
6210: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
6220: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
6230: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
6240: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
6250: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
6260: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
6270: 62 6a 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61  bj(pDb->pPreUpda
6280: 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49  teHook);.  Tcl_I
6290: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
62a0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
62b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
62c0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
62d0: 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f  ringObj(azStr[(o
62e0: 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20  p-1)/9], -1));. 
62f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6300: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
6310: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
6320: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
6330: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6340: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
6350: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
6360: 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a  Obj(zTbl, -1));.
6370: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6380: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
6390: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
63a0: 6e 74 4f 62 6a 28 69 4b 65 79 31 29 29 3b 0a 20  ntObj(iKey1));. 
63b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
63c0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
63d0: 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  d, Tcl_NewWideIn
63e0: 74 4f 62 6a 28 69 4b 65 79 32 29 29 3b 0a 20 20  tObj(iKey2));.  
63f0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
6400: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
6410: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
6420: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
6430: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 23  Count(pCmd);.}.#
6440: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6450: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
6460: 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61 74 69 63  _HOOK */..static
6470: 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48 61   void DbUpdateHa
6480: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  ndler(.  void *p
6490: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
64a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
64b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
64c0: 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  l,.  sqlite_int6
64d0: 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c  4 rowid.){.  Sql
64e0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
64f0: 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63  liteDb *)p;.  Tc
6500: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73  l_Obj *pCmd;.  s
6510: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6520: 20 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45   *azStr[] = {"DE
6530: 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c  LETE", "INSERT",
6540: 20 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61   "UPDATE"};..  a
6550: 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44  ssert( (SQLITE_D
6560: 45 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20  ELETE-1)/9 == 0 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  );.  assert( (SQ
6580: 4c 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39  LITE_INSERT-1)/9
6590: 20 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72   == 1 );.  asser
65a0: 74 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54  t( (SQLITE_UPDAT
65b0: 45 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 0a  E-1)/9 == 2 );..
65c0: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
65d0: 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20  UpdateHook );.  
65e0: 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49  assert( op==SQLI
65f0: 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d  TE_INSERT || op=
6600: 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c  =SQLITE_UPDATE |
6610: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  | op==SQLITE_DEL
6620: 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d  ETE );..  pCmd =
6630: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
6640: 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  j(pDb->pUpdateHo
6650: 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  ok);.  Tcl_IncrR
6660: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
6670: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6680: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
6690: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
66a0: 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29  Obj(azStr[(op-1)
66b0: 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  /9], -1));.  Tcl
66c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
66d0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
66e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
66f0: 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  zDb, -1));.  Tcl
6700: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6710: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
6720: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6730: 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zTbl, -1));.  Tc
6740: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6750: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
6760: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
6770: 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c  j(rowid));.  Tcl
6780: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
6790: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
67a0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
67b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
67c0: 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61  nt(pCmd);.}..sta
67d0: 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c  tic void tclColl
67e0: 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69  ateNeeded(.  voi
67f0: 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74  d *pCtx,.  sqlit
6800: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e  e3 *db,.  int en
6810: 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c,.  const char 
6820: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69  *zName.){.  Sqli
6830: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
6840: 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20  iteDb *)pCtx;.  
6850: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
6860: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
6870: 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  Obj(pDb->pCollat
6880: 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f  eNeeded);.  Tcl_
6890: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
68a0: 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ript);.  Tcl_Lis
68b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
68c0: 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63  t(0, pScript, Tc
68d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
68e0: 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63  Name, -1));.  Tc
68f0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
6900: 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  >interp, pScript
6910: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
6920: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
6930: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
6940: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6950: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
6960: 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  n SQL collation 
6970: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
6980: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43  nted.** using TC
6990: 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  L script..*/.sta
69a0: 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f  tic int tclSqlCo
69b0: 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70  llate(.  void *p
69c0: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20  Ctx,.  int nA,. 
69d0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c   const void *zA,
69e0: 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e  .  int nB,.  con
69f0: 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20  st void *zB.){. 
6a00: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d   SqlCollate *p =
6a10: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70   (SqlCollate *)p
6a20: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
6a30: 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  pCmd;..  pCmd = 
6a40: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6a50: 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29  (p->zScript, -1)
6a60: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
6a70: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63  ount(pCmd);.  Tc
6a80: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6a90: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
6aa0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
6ab0: 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29  tringObj(zA, nA)
6ac0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
6ad0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
6ae0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
6af0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6b00: 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f  zB, nB));.  Tcl_
6b10: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
6b20: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
6b30: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
6b40: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6b50: 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCmd);.  return 
6b60: 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72  (atoi(Tcl_GetStr
6b70: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
6b80: 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erp)));.}../*.**
6b90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6ba0: 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75   called to evalu
6bb0: 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  ate an SQL funct
6bc0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
6bd0: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
6be0: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
6bf0: 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73  oid tclSqlFunc(s
6c00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6c10: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
6c20: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
6c30: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75  **argv){.  SqlFu
6c40: 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  nc *p = sqlite3_
6c50: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
6c60: 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  t);.  Tcl_Obj *p
6c70: 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Cmd;.  int i;.  
6c80: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61  int rc;..  if( a
6c90: 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rgc==0 ){.    /*
6ca0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
6cb0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
6cc0: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c  e function, call
6cd0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f   Tcl_EvalObjEx o
6ce0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72  n the.    ** scr
6cf0: 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63  ipt object direc
6d00: 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  tly.  This allow
6d10: 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c  s the TCL compil
6d20: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20  er to generate. 
6d30: 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66     ** bytecode f
6d40: 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f  or the command o
6d50: 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
6d60: 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20  cation and thus 
6d70: 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73  make.    ** subs
6d80: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
6d90: 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  ns much faster. 
6da0: 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d  */.    pCmd = p-
6db0: 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63  >pScript;.    Tc
6dc0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
6dd0: 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  Cmd);.    rc = T
6de0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
6df0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29  interp, pCmd, 0)
6e00: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
6e10: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6e20: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
6e30: 20 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d   there are argum
6e40: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
6e50: 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61  tion, make a sha
6e60: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65  llow copy of the
6e70: 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f  .    ** script o
6e80: 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74  bject, lappend t
6e90: 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  he arguments, th
6ea0: 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
6eb0: 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  copy..    **.   
6ec0: 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22   ** By "shallow"
6ed0: 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 6f   copy, we mean o
6ee0: 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69  nly the outer li
6ef0: 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75  st Tcl_Obj is du
6f00: 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a  plicated..    **
6f10: 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a   The new Tcl_Obj
6f20: 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
6f30: 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  rs to the origin
6f40: 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  al list elements
6f50: 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  ..    ** That wa
6f60: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
6f70: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
6f80: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
6f90: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
6fa0: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
6fb0: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
6fc0: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
6fd0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
6fe0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
6ff0: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
7000: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
7010: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
7020: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
7030: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
7040: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
7050: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
7060: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
7070: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
7080: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
7090: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
70a0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
70b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
70c0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
70d0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75   -1);.      retu
70e0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rn;.    }.    pC
70f0: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
7100: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
7110: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
7120: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
7130: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
7140: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
7150: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
7160: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
7170: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
7180: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ..      /* Set p
7190: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
71a0: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
71b0: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
71c0: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
71d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
71e0: 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pIn) ){.        
71f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
7200: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
7210: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
7220: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
7230: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
7240: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  al = Tcl_NewByte
7250: 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33  ArrayObj(sqlite3
7260: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29  _value_blob(pIn)
7270: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
7280: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7290: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
72a0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
72b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  : {.          sq
72c0: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
72d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
72e0: 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  64(pIn);.       
72f0: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
7300: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
7310: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
7320: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
7330: 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29  _NewIntObj((int)
7340: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
7350: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7360: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57   pVal = Tcl_NewW
7370: 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  ideIntObj(v);.  
7380: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7390: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
73a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
73b0: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
73c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  {.          doub
73d0: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  le r = sqlite3_v
73e0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29  alue_double(pIn)
73f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
7400: 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65   = Tcl_NewDouble
7410: 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20  Obj(r);.        
7420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7430: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
7440: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
7450: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
7460: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7470: 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20  (p->pDb->zNull, 
7480: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  -1);.          b
7490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
74a0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
74b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
74c0: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
74d0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
74e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
74f0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
7500: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  gObj((char *)sql
7510: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7520: 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20  pIn), bytes);.  
7530: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7550: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  .      rc = Tcl_
7560: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7570: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
7580: 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20  pCmd, pVal);.   
7590: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
75a0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
75b0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
75c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
75d0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
75e0: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
75f0: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
7600: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
7610: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
7620: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
7630: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
7640: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
7650: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
7660: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
7670: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
7680: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
7690: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
76a0: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
76b0: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
76c0: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
76d0: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
76e0: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
76f0: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
7700: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
7710: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
7720: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
7730: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
7740: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
7750: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
7760: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
7770: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
7780: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
7790: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
77a0: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
77b0: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
77c0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
77d0: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
77e0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
77f0: 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20 20 7d 65  terp), -1);.  }e
7800: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  lse{.    Tcl_Obj
7810: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
7820: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
7830: 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  erp);.    int n;
7840: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20  .    u8 *data;. 
7850: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7860: 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79  Type = (pVar->ty
7870: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
7880: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
7890: 29 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  );.    char c = 
78a0: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 6e  zType[0];.    in
78b0: 74 20 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  t eType = p->eTy
78c0: 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 65 54 79  pe;..    if( eTy
78d0: 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
78e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ){.      if( c==
78f0: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
7900: 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29  ype,"bytearray")
7910: 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74  ==0 && pVar->byt
7920: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
7930: 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20   /* Only return 
7940: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
7950: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
7960: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
7970: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  nd.        ** ha
7980: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
7990: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  esentation. */. 
79a0: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 53         eType = S
79b0: 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 20 20  QLITE_BLOB;.    
79c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
79d0: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
79e0: 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d  ype,"boolean")==
79f0: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
7a00: 7c 7c 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74  || (c=='w' && st
7a10: 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65  rcmp(zType,"wide
7a20: 49 6e 74 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  Int")==0).      
7a30: 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 27 69         || (c=='i
7a40: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
7a50: 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 0a 20 20  e,"int")==0) .  
7a60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 65      ){.        e
7a70: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  Type = SQLITE_IN
7a80: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 7d 65 6c  TEGER;.      }el
7a90: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
7aa0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
7ab0: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
7ac0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 53 51        eType = SQ
7ad0: 4c 49 54 45 5f 46 4c 4f 41 54 3b 0a 20 20 20 20  LITE_FLOAT;.    
7ae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7af0: 20 65 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f   eType = SQLITE_
7b00: 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TEXT;.      }.  
7b10: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28    }..    switch(
7b20: 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   eType ){.      
7b30: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
7b40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61  : {.        data
7b50: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
7b60: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
7b70: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71   &n);.        sq
7b80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
7b90: 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c  b(context, data,
7ba0: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
7bb0: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 62  IENT);.        b
7bc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7bd0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7be0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
7bf0: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
7c00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43  ;.        if( TC
7c10: 4c 5f 4f 4b 3d 3d 54 63 6c 5f 47 65 74 57 69 64  L_OK==Tcl_GetWid
7c20: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  eIntFromObj(0, p
7c30: 56 61 72 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  Var, &v) ){.    
7c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7c50: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
7c60: 78 74 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20  xt, v);.        
7c70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7c80: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61   }.        /* fa
7c90: 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll-through */.  
7ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
7cb0: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
7cc0: 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20  .        double 
7cd0: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54  r;.        if( T
7ce0: 43 4c 5f 4f 4b 3d 3d 54 63 6c 5f 47 65 74 44 6f  CL_OK==Tcl_GetDo
7cf0: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  ubleFromObj(0, p
7d00: 56 61 72 2c 20 26 72 29 20 29 7b 0a 20 20 20 20  Var, &r) ){.    
7d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7d20: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
7d30: 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  ext, r);.       
7d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7d50: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66    }.        /* f
7d60: 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all-through */. 
7d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
7d80: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
7d90: 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  data = (unsigned
7da0: 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53   char *)Tcl_GetS
7db0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61  tringFromObj(pVa
7dc0: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
7dd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
7de0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
7df0: 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51  ar *)data, n, SQ
7e00: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
7e10: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
7e30: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
7e40: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
7e50: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68  IZATION./*.** Th
7e60: 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e  is is the authen
7e70: 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  tication functio
7e80: 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74  n.  It appends t
7e90: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
7ea0: 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61  n.** type code a
7eb0: 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d  nd the two argum
7ec0: 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74  ents to zCmd[] t
7ed0: 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  hen invokes the 
7ee0: 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65  result.** on the
7ef0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54   interpreter.  T
7f00: 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d  he reply is exam
7f10: 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  ined to determin
7f20: 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68  e if the.** auth
7f30: 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73  entication fails
7f40: 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f   or succeeds..*/
7f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68  .static int auth
7f60: 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  _callback(.  voi
7f70: 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63  d *pArg,.  int c
7f80: 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode,.  const cha
7f90: 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73  r *zArg1,.  cons
7fa0: 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20  t char *zArg2,. 
7fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
7fc0: 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g3,.  const char
7fd0: 20 2a 7a 41 72 67 34 0a 23 69 66 64 65 66 20 53   *zArg4.#ifdef S
7fe0: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
7ff0: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e  NTICATION.  ,con
8000: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 35 0a 23  st char *zArg5.#
8010: 65 6e 64 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74  endif.){.  const
8020: 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20   char *zCode;.  
8030: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
8040: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
8050: 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b  st char *zReply;
8060: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
8070: 46 3a 20 52 2d 33 38 35 39 30 2d 36 32 37 36 39  F: R-38590-62769
8080: 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
8090: 65 74 65 72 20 74 6f 20 74 68 65 20 61 75 74 68  eter to the auth
80a0: 6f 72 69 7a 65 72 0a 20 20 2a 2a 20 63 61 6c 6c  orizer.  ** call
80b0: 62 61 63 6b 20 69 73 20 61 20 63 6f 70 79 20 6f  back is a copy o
80c0: 66 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61  f the third para
80d0: 6d 65 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  meter to the.  *
80e0: 2a 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75  * sqlite3_set_au
80f0: 74 68 6f 72 69 7a 65 72 28 29 20 69 6e 74 65 72  thorizer() inter
8100: 66 61 63 65 2e 0a 20 20 2a 2f 0a 20 20 53 71 6c  face..  */.  Sql
8110: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
8120: 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 20 20  liteDb*)pArg;.  
8130: 69 66 28 20 70 44 62 2d 3e 64 69 73 61 62 6c 65  if( pDb->disable
8140: 41 75 74 68 20 29 20 72 65 74 75 72 6e 20 53 51  Auth ) return SQ
8150: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 45  LITE_OK;..  /* E
8160: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36  VIDENCE-OF: R-56
8170: 35 31 38 2d 34 34 33 31 30 20 54 68 65 20 73 65  518-44310 The se
8180: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 74  cond parameter t
8190: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69  o the callback i
81a0: 73 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65  s an.  ** intege
81b0: 72 20 61 63 74 69 6f 6e 20 63 6f 64 65 20 74 68  r action code th
81c0: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65  at specifies the
81d0: 20 70 61 72 74 69 63 75 6c 61 72 20 61 63 74 69   particular acti
81e0: 6f 6e 20 74 6f 20 62 65 0a 20 20 2a 2a 20 61 75  on to be.  ** au
81f0: 74 68 6f 72 69 7a 65 64 2e 20 2a 2f 0a 20 20 73  thorized. */.  s
8200: 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20  witch( code ){. 
8210: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
8220: 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20  OPY             
8230: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8240: 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20  _COPY"; break;. 
8250: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
8260: 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20  REATE_INDEX     
8270: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8280: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20  _CREATE_INDEX"; 
8290: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
82a0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
82b0: 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  BLE      : zCode
82c0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
82d0: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
82e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
82f0: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
8300: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8310: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
8320: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
8330: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
8340: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20  TE_TEMP_TABLE : 
8350: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
8360: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
8370: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
8380: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
8390: 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43  TEMP_TRIGGER: zC
83a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
83b0: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
83c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
83d0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
83e0: 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f  TEMP_VIEW  : zCo
83f0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
8400: 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  E_TEMP_VIEW"; br
8410: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8420: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
8430: 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  GER    : zCode="
8440: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
8450: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
8460: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
8470: 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20  REATE_VIEW      
8480: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8490: 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62  _CREATE_VIEW"; b
84a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
84b0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20  QLITE_DELETE    
84c0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
84d0: 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b  "SQLITE_DELETE";
84e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
84f0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
8500: 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  EX        : zCod
8510: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  e="SQLITE_DROP_I
8520: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
8530: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
8540: 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20  OP_TABLE        
8550: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8560: 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  DROP_TABLE"; bre
8570: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8580: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
8590: 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  DEX   : zCode="S
85a0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
85b0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
85c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
85d0: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20  ROP_TEMP_TABLE  
85e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
85f0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
8600: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
8610: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
8620: 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43  EMP_TRIGGER : zC
8630: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
8640: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
8650: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8660: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
8670: 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65  _VIEW    : zCode
8680: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
8690: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
86a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
86b0: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20  _DROP_TRIGGER   
86c0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
86d0: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22  TE_DROP_TRIGGER"
86e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
86f0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  e SQLITE_DROP_VI
8700: 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  EW         : zCo
8710: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
8720: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
8730: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
8740: 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
8750: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8760: 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a  INSERT"; break;.
8770: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8780: 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20  PRAGMA          
8790: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
87a0: 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b  E_PRAGMA"; break
87b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
87c0: 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  E_READ          
87d0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
87e0: 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b  ITE_READ"; break
87f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
8800: 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  E_SELECT        
8810: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
8820: 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65  ITE_SELECT"; bre
8830: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8840: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20  ITE_TRANSACTION 
8850: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
8860: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
8870: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  N"; break;.    c
8880: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
8890: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
88a0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44  Code="SQLITE_UPD
88b0: 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATE"; break;.   
88c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54   case SQLITE_ATT
88d0: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
88e0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
88f0: 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  TTACH"; break;. 
8900: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
8910: 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  ETACH           
8920: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8930: 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _DETACH"; break;
8940: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8950: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
8960: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8970: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b  TE_ALTER_TABLE";
8980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8990: 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20   SQLITE_REINDEX 
89a0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
89b0: 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e="SQLITE_REINDE
89c0: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
89d0: 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  ase SQLITE_ANALY
89e0: 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ZE           : z
89f0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41  Code="SQLITE_ANA
8a00: 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LYZE"; break;.  
8a10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
8a20: 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20  EATE_VTABLE     
8a30: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8a40: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20  CREATE_VTABLE"; 
8a50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8a60: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
8a70: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
8a80: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  ="SQLITE_DROP_VT
8a90: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
8aa0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
8ab0: 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20  NCTION          
8ac0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8ad0: 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  FUNCTION"; break
8ae0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
8af0: 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20  E_SAVEPOINT     
8b00: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
8b10: 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20  ITE_SAVEPOINT"; 
8b20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8b30: 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45  SQLITE_RECURSIVE
8b40: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
8b50: 3d 22 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  ="SQLITE_RECURSI
8b60: 56 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  VE"; break;.    
8b70: 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20  default         
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
8b90: 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72  zCode="????"; br
8ba0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  eak;.  }.  Tcl_D
8bb0: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
8bc0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
8bd0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
8be0: 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54  >zAuth, -1);.  T
8bf0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
8c00: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43  Element(&str, zC
8c10: 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  ode);.  Tcl_DStr
8c20: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
8c30: 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a  (&str, zArg1 ? z
8c40: 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63  Arg1 : "");.  Tc
8c50: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
8c60: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72  lement(&str, zAr
8c70: 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29  g2 ? zArg2 : "")
8c80: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
8c90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
8ca0: 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33  r, zArg3 ? zArg3
8cb0: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
8cc0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
8cd0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f  nt(&str, zArg4 ?
8ce0: 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 23 69   zArg4 : "");.#i
8cf0: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
8d00: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
8d10: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
8d20: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
8d30: 20 7a 41 72 67 35 20 3f 20 7a 41 72 67 35 20 3a   zArg5 ? zArg5 :
8d40: 20 22 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72   "");.#endif.  r
8d50: 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76  c = Tcl_GlobalEv
8d60: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
8d70: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
8d80: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
8d90: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
8da0: 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d  ;.  zReply = rc=
8db0: 3d 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65  =TCL_OK ? Tcl_Ge
8dc0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
8dd0: 62 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22 53 51  b->interp) : "SQ
8de0: 4c 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66  LITE_DENY";.  if
8df0: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
8e00: 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20  "SQLITE_OK")==0 
8e10: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
8e20: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
8e30: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
8e40: 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d  ,"SQLITE_DENY")=
8e50: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
8e60: 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65  QLITE_DENY;.  }e
8e70: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
8e80: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47  Reply,"SQLITE_IG
8e90: 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20  NORE")==0 ){.   
8ea0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e   rc = SQLITE_IGN
8eb0: 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ORE;.  }else{.  
8ec0: 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a    rc = 999;.  }.
8ed0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
8ee0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8ef0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
8f00: 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ON */../*.** Thi
8f10: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
8f20: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
8f30: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
8f40: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
8f50: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
8f60: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
8f70: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
8f80: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
8f90: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
8fa0: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
8fb0: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
8fc0: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
8fd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
8fe0: 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72  rface is like "r
8ff0: 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20  eadline" but no 
9000: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69  command-line edi
9010: 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e  ting.** is done.
9020: 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72  .**.** copied fr
9030: 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20  om shell.c from 
9040: 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e  '.import' comman
9050: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  d.*/.static char
9060: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
9070: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46  char *zPrompt, F
9080: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
9090: 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e   *zLine;.  int n
90a0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  Line;.  int n;..
90b0: 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20    nLine = 100;. 
90c0: 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28   zLine = malloc(
90d0: 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20   nLine );.  if( 
90e0: 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72  zLine==0 ) retur
90f0: 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  n 0;.  n = 0;.  
9100: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
9110: 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20  if( n+100>nLine 
9120: 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d  ){.      nLine =
9130: 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a   nLine*2 + 100;.
9140: 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65        zLine = re
9150: 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69  alloc(zLine, nLi
9160: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ne);.      if( z
9170: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
9180: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
9190: 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e  ( fgets(&zLine[n
91a0: 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e  ], nLine - n, in
91b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
91c0: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
91d0: 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20    free(zLine);. 
91e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
91f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
9200: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
9210: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9220: 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
9230: 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  [n] ){ n++; }.  
9240: 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69    if( n>0 && zLi
9250: 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b  ne[n-1]=='\n' ){
9260: 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  .      n--;.    
9270: 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a    zLine[n] = 0;.
9280: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9290: 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d   }.  }.  zLine =
92a0: 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c   realloc( zLine,
92b0: 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e   n+1 );.  return
92c0: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   zLine;.}.../*.*
92d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
92e0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
92f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
9300: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a   the command:.**
9310: 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73 61  .**   $db transa
9320: 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64  ction [-deferred
9330: 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63  |-immediate|-exc
9340: 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 2a  lusive] SCRIPT.*
9350: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
9360: 65 64 20 61 66 74 65 72 20 65 76 61 6c 75 61 74  ed after evaluat
9370: 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 53  ing the script S
9380: 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20  CRIPT to commit 
9390: 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74  or rollback.** t
93a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
93b0: 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e  r savepoint open
93c0: 65 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e 73  ed by the [trans
93d0: 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e  action] command.
93e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
93f0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62 54  QLITE_TCLAPI DbT
9400: 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43  ransPostCmd(.  C
9410: 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d  lientData data[]
9420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9430: 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69      /* data[0] i
9440: 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a  s the Sqlite3Db*
9450: 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63   for $db */.  Tc
9460: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9480: 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70     /* Tcl interp
9490: 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  reter */.  int r
94a0: 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94c0: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61  /* Result of eva
94d0: 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a  luating SCRIPT *
94e0: 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
94f0: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20  nst char *const 
9500: 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  azEnd[] = {.    
9510: 22 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72  "RELEASE _tcl_tr
9520: 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20  ansaction",     
9530: 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52     /* rc==TCL_ER
9540: 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f  ROR, nTransactio
9550: 6e 21 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d  n!=0 */.    "COM
9560: 4d 49 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  MIT",           
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9580: 2a 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c  * rc!=TCL_ERROR,
9590: 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30   nTransaction==0
95a0: 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43   */.    "ROLLBAC
95b0: 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61  K TO _tcl_transa
95c0: 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20  ction ; RELEASE 
95d0: 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _tcl_transaction
95e0: 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b  ",.    "ROLLBACK
95f0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d            /* rc=
9610: 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61  =TCL_ERROR, nTra
9620: 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20  nsaction==0 */. 
9630: 20 7d 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   };.  SqliteDb *
9640: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
9650: 29 64 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20  )data[0];.  int 
9660: 72 63 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63  rc = result;.  c
9670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b  onst char *zEnd;
9680: 0a 0a 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61  ..  pDb->nTransa
9690: 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20  ction--;.  zEnd 
96a0: 3d 20 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c  = azEnd[(rc==TCL
96b0: 5f 45 52 52 4f 52 29 2a 32 20 2b 20 28 70 44 62  _ERROR)*2 + (pDb
96c0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
96d0: 30 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73  0)];..  pDb->dis
96e0: 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66  ableAuth++;.  if
96f0: 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  ( sqlite3_exec(p
9700: 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c  Db->db, zEnd, 0,
9710: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
9720: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 72 69  /* This is a tri
9730: 63 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f 20  cky scenario to 
9740: 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74  handle. The most
9750: 20 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f 66   likely cause of
9760: 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72   an.      ** err
9770: 6f 72 20 69 73 20 74 68 61 74 20 74 68 65 20 65  or is that the e
9780: 78 65 63 28 29 20 61 62 6f 76 65 20 77 61 73 20  xec() above was 
9790: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f  an attempt to co
97a0: 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 20 20 2a  mmit the.      *
97b0: 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e  * top-level tran
97c0: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65 74  saction that ret
97d0: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55 53  urned SQLITE_BUS
97e0: 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65  Y. Or, less like
97f0: 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ly,.      ** tha
9800: 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61  t an IO-error ha
9810: 73 20 6f 63 63 75 72 72 65 64 2e 20 49 6e 20 65  s occurred. In e
9820: 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 72 6f  ither case, thro
9830: 77 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f  w a Tcl exceptio
9840: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  n.      ** and t
9850: 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ry to rollback t
9860: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
9870: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
9880: 2a 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20 61  * But it could a
9890: 6c 73 6f 20 62 65 20 74 68 61 74 20 74 68 65 20  lso be that the 
98a0: 75 73 65 72 20 65 78 65 63 75 74 65 64 20 6f 6e  user executed on
98b0: 65 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c  e or more BEGIN,
98c0: 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54  .      ** COMMIT
98d0: 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c  , SAVEPOINT, REL
98e0: 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EASE or ROLLBACK
98f0: 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 61   commands that a
9900: 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20  re confusing.   
9910: 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f     ** this metho
9920: 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63  d's logic. Not c
9930: 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20 77 6f  lear how this wo
9940: 75 6c 64 20 62 65 20 62 65 73 74 20 68 61 6e 64  uld be best hand
9950: 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
9960: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45 52    if( rc!=TCL_ER
9970: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ROR ){.      Tcl
9980: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9990: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
99a0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
99b0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
99c0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
99d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
99e0: 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  3_exec(pDb->db, 
99f0: 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
9a00: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  , 0);.  }.  pDb-
9a10: 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a  >disableAuth--;.
9a20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9a30: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 53 51  ./*.** Unless SQ
9a40: 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66  LITE_TEST is def
9a50: 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ined, this funct
9a60: 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ion is a simple 
9a70: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a  wrapper around.*
9a80: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
9a90: 65 5f 76 32 28 29 2e 20 49 66 20 53 51 4c 49 54  e_v2(). If SQLIT
9aa0: 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65  E_TEST is define
9ab0: 64 2c 20 74 68 65 6e 20 69 74 20 75 73 65 73 20  d, then it uses 
9ac0: 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65  either.** sqlite
9ad0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f  3_prepare_v2() o
9ae0: 72 20 6c 65 67 61 63 79 20 69 6e 74 65 72 66 61  r legacy interfa
9af0: 63 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ce sqlite3_prepa
9b00: 72 65 28 29 2c 20 64 65 70 65 6e 64 69 6e 67 0a  re(), depending.
9b10: 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ** on whether or
9b20: 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f 75 73 65   not the [db_use
9b30: 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5d  _legacy_prepare]
9b40: 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 62 65 65   command has bee
9b50: 6e 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e  n used to.** con
9b60: 66 69 67 75 72 65 20 74 68 65 20 63 6f 6e 6e 65  figure the conne
9b70: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
9b80: 20 69 6e 74 20 64 62 50 72 65 70 61 72 65 28 0a   int dbPrepare(.
9b90: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c    SqliteDb *pDb,
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62    /* Database ob
9bc0: 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
9bd0: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
9be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
9bf0: 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20   to compile */. 
9c00: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
9c10: 70 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20  ppStmt,         
9c20: 20 2f 2a 20 4f 55 54 3a 20 50 72 65 70 61 72 65   /* OUT: Prepare
9c30: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
9c40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
9c50: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
9c60: 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72   /* OUT: Pointer
9c70: 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61   to next SQL sta
9c80: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 75  tement */.){.  u
9c90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 65 70  nsigned int prep
9ca0: 46 6c 61 67 73 20 3d 20 30 3b 0a 23 69 66 64 65  Flags = 0;.#ifde
9cb0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
9cc0: 69 66 28 20 70 44 62 2d 3e 62 4c 65 67 61 63 79  if( pDb->bLegacy
9cd0: 50 72 65 70 61 72 65 20 29 7b 0a 20 20 20 20 72  Prepare ){.    r
9ce0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72  eturn sqlite3_pr
9cf0: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
9d00: 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
9d10: 20 70 7a 4f 75 74 29 3b 0a 20 20 7d 0a 23 65 6e   pzOut);.  }.#en
9d20: 64 69 66 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  dif.  /* If the 
9d30: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20  statement cache 
9d40: 69 73 20 6c 61 72 67 65 2c 20 75 73 65 20 74 68  is large, use th
9d50: 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45  e SQLITE_PREPARE
9d60: 5f 50 45 52 53 49 53 54 45 4e 54 0a 20 20 2a 2a  _PERSISTENT.  **
9d70: 20 66 6c 61 67 73 2c 20 77 68 69 63 68 20 75 73   flags, which us
9d80: 65 73 20 6c 65 73 73 20 6c 6f 6f 6b 61 73 69 64  es less lookasid
9d90: 65 20 6d 65 6d 6f 72 79 2e 20 20 42 75 74 20 69  e memory.  But i
9da0: 66 20 74 68 65 20 63 61 63 68 65 20 69 73 20 73  f the cache is s
9db0: 6d 61 6c 6c 2c 0a 20 20 2a 2a 20 6f 6d 69 74 20  mall,.  ** omit 
9dc0: 74 68 61 74 20 66 6c 61 67 20 74 6f 20 6d 61 6b  that flag to mak
9dd0: 65 20 66 75 6c 6c 20 75 73 65 20 6f 66 20 6c 6f  e full use of lo
9de0: 6f 6b 61 73 69 64 65 20 2a 2f 0a 20 20 69 66 28  okaside */.  if(
9df0: 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3e 35 20   pDb->maxStmt>5 
9e00: 29 20 70 72 65 70 46 6c 61 67 73 20 3d 20 53 51  ) prepFlags = SQ
9e10: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45 52  LITE_PREPARE_PER
9e20: 53 49 53 54 45 4e 54 3b 0a 0a 20 20 72 65 74 75  SISTENT;..  retu
9e30: 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  rn sqlite3_prepa
9e40: 72 65 5f 76 33 28 70 44 62 2d 3e 64 62 2c 20 7a  re_v3(pDb->db, z
9e50: 53 71 6c 2c 20 2d 31 2c 20 70 72 65 70 46 6c 61  Sql, -1, prepFla
9e60: 67 73 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75  gs, ppStmt, pzOu
9e70: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  t);.}../*.** Sea
9e80: 72 63 68 20 74 68 65 20 63 61 63 68 65 20 66 6f  rch the cache fo
9e90: 72 20 61 20 70 72 65 70 61 72 65 64 2d 73 74 61  r a prepared-sta
9ea0: 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 68  tement object th
9eb0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
9ec0: 65 0a 2a 2a 20 66 69 72 73 74 20 53 51 4c 20 73  e.** first SQL s
9ed0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
9ee0: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
9ef0: 6f 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 7a  o by parameter z
9f00: 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20 73 75 63  In. If.** no suc
9f10: 68 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65  h prepared-state
9f20: 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e  ment can be foun
9f30: 64 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  d, allocate and 
9f40: 70 72 65 70 61 72 65 20 61 20 6e 65 77 0a 2a 2a  prepare a new.**
9f50: 20 6f 6e 65 2e 20 49 6e 20 65 69 74 68 65 72 20   one. In either 
9f60: 63 61 73 65 2c 20 62 69 6e 64 20 74 68 65 20 63  case, bind the c
9f70: 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 6f 66  urrent values of
9f80: 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 54 63   the relevant Tc
9f90: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74  l.** variables t
9fa0: 6f 20 61 6e 79 20 24 76 61 72 2c 20 3a 76 61 72  o any $var, :var
9fb0: 20 6f 72 20 40 76 61 72 20 76 61 72 69 61 62 6c   or @var variabl
9fc0: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
9fd0: 65 6e 74 2e 20 42 65 66 6f 72 65 0a 2a 2a 20 72  ent. Before.** r
9fe0: 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70  eturning, set *p
9ff0: 70 50 72 65 53 74 6d 74 20 74 6f 20 70 6f 69 6e  pPreStmt to poin
a000: 74 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  t to the prepare
a010: 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65  d-statement obje
a020: 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74  ct..**.** Output
a030: 20 70 61 72 61 6d 65 74 65 72 20 2a 70 7a 4f 75   parameter *pzOu
a040: 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  t is set to poin
a050: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 53 51  t to the next SQ
a060: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a  L statement in.*
a070: 2a 20 62 75 66 66 65 72 20 7a 49 6e 2c 20 6f 72  * buffer zIn, or
a080: 20 74 6f 20 74 68 65 20 27 5c 30 27 20 62 79 74   to the '\0' byt
a090: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
a0a0: 7a 49 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  zIn if there is 
a0b0: 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73 74 61 74 65  no.** next state
a0c0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ment..**.** If s
a0d0: 75 63 63 65 73 73 66 75 6c 2c 20 54 43 4c 5f 4f  uccessful, TCL_O
a0e0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
a0f0: 74 68 65 72 77 69 73 65 2c 20 54 43 4c 5f 45 52  therwise, TCL_ER
a100: 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ROR is returned.
a110: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
a120: 6d 65 73 73 61 67 65 20 6c 6f 61 64 65 64 20 69  message loaded i
a130: 6e 74 6f 20 69 6e 74 65 72 70 72 65 74 65 72 20  nto interpreter 
a140: 70 44 62 2d 3e 69 6e 74 65 72 70 2e 0a 2a 2f 0a  pDb->interp..*/.
a150: 73 74 61 74 69 63 20 69 6e 74 20 64 62 50 72 65  static int dbPre
a160: 70 61 72 65 41 6e 64 42 69 6e 64 28 0a 20 20 53  pareAndBind(.  S
a170: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20  qliteDb *pDb,   
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a190: 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a 65 63  * Database objec
a1a0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  t */.  char cons
a1b0: 74 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20 20 20  t *zIn,         
a1c0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f         /* SQL to
a1d0: 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20 63 68   compile */.  ch
a1e0: 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 4f 75 74  ar const **pzOut
a1f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
a200: 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
a210: 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   next SQL statem
a220: 65 6e 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70  ent */.  SqlPrep
a230: 61 72 65 64 53 74 6d 74 20 2a 2a 70 70 50 72 65  aredStmt **ppPre
a240: 53 74 6d 74 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Stmt     /* OUT:
a250: 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
a260: 63 61 63 68 65 20 73 74 61 74 65 6d 65 6e 74 20  cache statement 
a270: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
a280: 61 72 20 2a 7a 53 71 6c 20 3d 20 7a 49 6e 3b 20  ar *zSql = zIn; 
a290: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
a2a0: 65 72 20 74 6f 20 66 69 72 73 74 20 53 51 4c 20  er to first SQL 
a2b0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 49 6e  statement in zIn
a2c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
a2d0: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
a2e0: 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
a2f0: 64 20 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65  d statement obje
a300: 63 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  ct */.  SqlPrepa
a310: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
a320: 74 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  t;      /* Point
a330: 65 72 20 74 6f 20 63 61 63 68 65 64 20 73 74 61  er to cached sta
a340: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
a350: 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nSql;           
a360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a370: 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e  ength of zSql in
a380: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
a390: 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nVar = 0;       
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a3b0: 75 6d 62 65 72 20 6f 66 20 76 61 72 69 61 62 6c  umber of variabl
a3c0: 65 73 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  es in statement 
a3d0: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  */.  int iParm =
a3e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
a3f0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65       /* Next fre
a400: 65 20 65 6e 74 72 79 20 69 6e 20 61 70 50 61 72  e entry in apPar
a410: 6d 20 2a 2f 0a 20 20 63 68 61 72 20 63 3b 0a 20  m */.  char c;. 
a420: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 65   int i;.  int ne
a430: 65 64 52 65 73 75 6c 74 52 65 73 65 74 20 3d 20  edResultReset = 
a440: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  0;        /* Nee
a450: 64 20 74 6f 20 69 6e 76 6f 6b 65 20 54 63 6c 5f  d to invoke Tcl_
a460: 52 65 73 65 74 52 65 73 75 6c 74 28 29 20 2a 2f  ResetResult() */
a470: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
a480: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
a490: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
a4a0: 65 74 75 72 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  eturn */.  Tcl_I
a4b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20  nterp *interp = 
a4c0: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20 20  pDb->interp;..  
a4d0: 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a  *ppPreStmt = 0;.
a4e0: 0a 20 20 2f 2a 20 54 72 69 6d 20 73 70 61 63 65  .  /* Trim space
a4f0: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  s from the start
a500: 20 6f 66 20 7a 53 71 6c 20 61 6e 64 20 63 61 6c   of zSql and cal
a510: 63 75 6c 61 74 65 20 74 68 65 20 72 65 6d 61 69  culate the remai
a520: 6e 69 6e 67 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a  ning length. */.
a530: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 53    while( (c = zS
a540: 71 6c 5b 30 5d 29 3d 3d 27 20 27 20 7c 7c 20 63  ql[0])==' ' || c
a550: 3d 3d 27 5c 74 27 20 7c 7c 20 63 3d 3d 27 5c 72  =='\t' || c=='\r
a560: 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 29 7b 20  ' || c=='\n' ){ 
a570: 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e 53 71 6c  zSql++; }.  nSql
a580: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
a590: 29 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65 53 74  );..  for(pPreSt
a5a0: 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
a5b0: 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50  st; pPreStmt; pP
a5c0: 72 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d  reStmt=pPreStmt-
a5d0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
a5e0: 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e   n = pPreStmt->n
a5f0: 53 71 6c 3b 0a 20 20 20 20 69 66 28 20 6e 53 71  Sql;.    if( nSq
a600: 6c 3e 3d 6e 0a 20 20 20 20 20 20 20 20 26 26 20  l>=n.        && 
a610: 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d  memcmp(pPreStmt-
a620: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d  >zSql, zSql, n)=
a630: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a  =0.        && (z
a640: 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71  Sql[n]==0 || zSq
a650: 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20  l[n-1]==';').   
a660: 20 29 7b 0a 20 20 20 20 20 20 70 53 74 6d 74 20   ){.      pStmt 
a670: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  = pPreStmt->pStm
a680: 74 3b 0a 20 20 20 20 20 20 2a 70 7a 4f 75 74 20  t;.      *pzOut 
a690: 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74  = &zSql[pPreStmt
a6a0: 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20  ->nSql];..      
a6b0: 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70 61 72  /* When a prepar
a6c0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ed statement is 
a6d0: 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74  found, unlink it
a6e0: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
a6f0: 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20  ** cache list.  
a700: 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65  It will later be
a710: 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74   added back to t
a720: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
a730: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63     ** of the cac
a740: 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72  he list in order
a750: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52   to implement LR
a760: 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20  U replacement.. 
a770: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
a780: 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  ( pPreStmt->pPre
a790: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72  v ){.        pPr
a7a0: 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e  eStmt->pPrev->pN
a7b0: 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ext = pPreStmt->
a7c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
a7d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
a7e0: 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65  >stmtList = pPre
a7f0: 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Stmt->pNext;.   
a800: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a810: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29  PreStmt->pNext )
a820: 7b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74  {.        pPreSt
a830: 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  mt->pNext->pPrev
a840: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
a850: 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ev;.      }else{
a860: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74  .        pDb->st
a870: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
a880: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
a890: 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74  }.      pDb->nSt
a8a0: 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 56 61 72  mt--;.      nVar
a8b0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
a8c0: 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
a8d0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72  pStmt);.      br
a8e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
a8f0: 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61    /* If no prepa
a900: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61  red statement wa
a910: 73 20 66 6f 75 6e 64 2e 20 43 6f 6d 70 69 6c 65  s found. Compile
a920: 20 74 68 65 20 53 51 4c 20 74 65 78 74 2e 20 41   the SQL text. A
a930: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  lso allocate.  *
a940: 2a 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70 61  * a new SqlPrepa
a950: 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75 72  redStmt structur
a960: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72  e.  */.  if( pPr
a970: 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eStmt==0 ){.    
a980: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
a990: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 64  if( SQLITE_OK!=d
a9a0: 62 50 72 65 70 61 72 65 28 70 44 62 2c 20 7a 53  bPrepare(pDb, zS
a9b0: 71 6c 2c 20 26 70 53 74 6d 74 2c 20 70 7a 4f 75  ql, &pStmt, pzOu
a9c0: 74 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  t) ){.      Tcl_
a9d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
a9e0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
a9f0: 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ngObj(sqlite3_er
aa00: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d  rmsg(pDb->db), -
aa10: 31 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  1));.      retur
aa20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
aa30: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74   }.    if( pStmt
aa40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
aa50: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
aa60: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
aa70: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
aa80: 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  /* A compile-tim
aa90: 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73  e error in the s
aaa0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20  tatement. */.   
aab0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
aac0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
aad0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
aae0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
aaf0: 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20  b->db), -1));.  
ab00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ab10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
ab20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
ab30: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61  The statement wa
ab40: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74  s a no-op.  Cont
ab50: 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74  inue to the next
ab60: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
ab70: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c     ** in the SQL
ab80: 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20   string..       
ab90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
aba0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20  rn TCL_OK;.     
abb0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
abc0: 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d  sert( pPreStmt==
abd0: 30 20 29 3b 0a 20 20 20 20 6e 56 61 72 20 3d 20  0 );.    nVar = 
abe0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
abf0: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
ac00: 6d 74 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  mt);.    nByte =
ac10: 20 73 69 7a 65 6f 66 28 53 71 6c 50 72 65 70 61   sizeof(SqlPrepa
ac20: 72 65 64 53 74 6d 74 29 20 2b 20 6e 56 61 72 2a  redStmt) + nVar*
ac30: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a  sizeof(Tcl_Obj *
ac40: 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20  );.    pPreStmt 
ac50: 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  = (SqlPreparedSt
ac60: 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42  mt*)Tcl_Alloc(nB
ac70: 79 74 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  yte);.    memset
ac80: 28 70 50 72 65 53 74 6d 74 2c 20 30 2c 20 6e 42  (pPreStmt, 0, nB
ac90: 79 74 65 29 3b 0a 0a 20 20 20 20 70 50 72 65 53  yte);..    pPreS
aca0: 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  tmt->pStmt = pSt
acb0: 6d 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  mt;.    pPreStmt
acc0: 2d 3e 6e 53 71 6c 20 3d 20 28 69 6e 74 29 28 2a  ->nSql = (int)(*
acd0: 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29 3b 0a 20  pzOut - zSql);. 
ace0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71     pPreStmt->zSq
acf0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
ad00: 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 72 65  pStmt);.    pPre
ad10: 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20 3d 20 28  Stmt->apParm = (
ad20: 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50 72 65  Tcl_Obj **)&pPre
ad30: 53 74 6d 74 5b 31 5d 3b 0a 23 69 66 64 65 66 20  Stmt[1];.#ifdef 
ad40: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
ad50: 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53  if( pPreStmt->zS
ad60: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ql==0 ){.      c
ad70: 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 54 63 6c  har *zCopy = Tcl
ad80: 5f 41 6c 6c 6f 63 28 70 50 72 65 53 74 6d 74 2d  _Alloc(pPreStmt-
ad90: 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a 20 20 20 20  >nSql + 1);.    
ada0: 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20    memcpy(zCopy, 
adb0: 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e  zSql, pPreStmt->
adc0: 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  nSql);.      zCo
add0: 70 79 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  py[pPreStmt->nSq
ade0: 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  l] = '\0';.     
adf0: 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20   pPreStmt->zSql 
ae00: 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 23  = zCopy;.    }.#
ae10: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 61 73 73 65  endif.  }.  asse
ae20: 72 74 28 20 70 50 72 65 53 74 6d 74 20 29 3b 0a  rt( pPreStmt );.
ae30: 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
ae40: 33 30 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  30(pPreStmt->zSq
ae50: 6c 29 3d 3d 70 50 72 65 53 74 6d 74 2d 3e 6e 53  l)==pPreStmt->nS
ae60: 71 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ql );.  assert( 
ae70: 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72 65 53 74  0==memcmp(pPreSt
ae80: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
ae90: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 20  pPreStmt->nSql) 
aea0: 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64 20 76 61  );..  /* Bind va
aeb0: 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65  lues to paramete
aec0: 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  rs that begin wi
aed0: 74 68 20 24 20 6f 72 20 3a 20 2a 2f 0a 20 20 66  th $ or : */.  f
aee0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b  or(i=1; i<=nVar;
aef0: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
af00: 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71   char *zVar = sq
af10: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
af20: 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
af30: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61   i);.    if( zVa
af40: 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30 5d  r!=0 && (zVar[0]
af50: 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30 5d  =='$' || zVar[0]
af60: 3d 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30 5d  ==':' || zVar[0]
af70: 3d 3d 27 40 27 29 20 29 7b 0a 20 20 20 20 20 20  =='@') ){.      
af80: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20  Tcl_Obj *pVar = 
af90: 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e  Tcl_GetVar2Ex(in
afa0: 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c 20  terp, &zVar[1], 
afb0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
afc0: 20 70 56 61 72 3d 3d 30 20 26 26 20 70 44 62 2d   pVar==0 && pDb-
afd0: 3e 7a 42 69 6e 64 46 61 6c 6c 62 61 63 6b 21 3d  >zBindFallback!=
afe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  0 ){.        Tcl
aff0: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 20 20  _Obj *pCmd;.    
b000: 20 20 20 20 69 6e 74 20 72 78 3b 0a 20 20 20 20      int rx;.    
b010: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
b020: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d  ewStringObj(pDb-
b030: 3e 7a 42 69 6e 64 46 61 6c 6c 62 61 63 6b 2c 20  >zBindFallback, 
b040: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  -1);.        Tcl
b050: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
b060: 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  md);.        Tcl
b070: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b080: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43  ement(interp, pC
b090: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
b0a0: 67 4f 62 6a 28 7a 56 61 72 2c 2d 31 29 29 3b 0a  gObj(zVar,-1));.
b0b0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 65 64          if( need
b0c0: 52 65 73 75 6c 74 52 65 73 65 74 20 29 20 54 63  ResultReset ) Tc
b0d0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
b0e0: 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20 20 6e  terp);.        n
b0f0: 65 65 64 52 65 73 75 6c 74 52 65 73 65 74 20 3d  eedResultReset =
b100: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 78 20 3d   1;.        rx =
b110: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
b120: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
b130: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
b140: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
b150: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
b160: 20 20 20 20 20 20 20 69 66 28 20 72 78 3d 3d 54         if( rx==T
b170: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  CL_OK ){.       
b180: 20 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65     pVar = Tcl_Ge
b190: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b1a0: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
b1b0: 65 20 69 66 28 20 72 78 3d 3d 54 43 4c 5f 45 52  e if( rx==TCL_ER
b1c0: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROR ){.         
b1d0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
b1e0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
b1f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b200: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 72 20  .          pVar 
b210: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
b220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b230: 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20   pVar ){.       
b240: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
b250: 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20  u8 *data;.      
b260: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
b270: 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70  ype = (pVar->typ
b280: 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70  ePtr ? pVar->typ
b290: 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29  ePtr->name : "")
b2a0: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 54  ;.        c = zT
b2b0: 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ype[0];.        
b2c0: 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27  if( zVar[0]=='@'
b2d0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 28   ||.           (
b2e0: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
b2f0: 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61  (zType,"bytearra
b300: 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e  y")==0 && pVar->
b310: 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20 20  bytes==0) ){.   
b320: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61         /* Load a
b330: 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68   BLOB type if th
b340: 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69  e Tcl variable i
b350: 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e  s a bytearray an
b360: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  d.          ** i
b370: 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  t has no string 
b380: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
b390: 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20  r the host.     
b3a0: 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
b3b0: 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  r name begins wi
b3c0: 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20  th "@". */.     
b3d0: 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f       data = Tcl_
b3e0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
b3f0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
b400: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b410: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
b420: 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51  , i, data, n, SQ
b430: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
b440: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
b450: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
b460: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
b470: 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d  mt->apParm[iParm
b480: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
b490: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
b4a0: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
b4b0: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
b4c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
b4d0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
b4e0: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
b4f0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &n);.          s
b500: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
b510: 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20  pStmt, i, n);.  
b520: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b530: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
b540: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
b550: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
b560: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20   double r;.     
b570: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
b580: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
b590: 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20  , pVar, &r);.   
b5a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
b5b0: 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  ind_double(pStmt
b5c0: 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  , i, r);.       
b5d0: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
b5e0: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
b5f0: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==0
b600: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
b610: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
b620: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
b630: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
b640: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
b650: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
b660: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
b670: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
b680: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &v);.          s
b690: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
b6a0: 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a  4(pStmt, i, v);.
b6b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b6c0: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
b6d0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
b6e0: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
b6f0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
b700: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b710: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
b720: 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64  mt, i, (char *)d
b730: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
b740: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
b750: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
b760: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
b770: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70      pPreStmt->ap
b780: 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[iParm++] = 
b790: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pVar;.        }.
b7a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b7b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
b7c0: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29  d_null(pStmt, i)
b7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b7e0: 69 66 28 20 6e 65 65 64 52 65 73 75 6c 74 52 65  if( needResultRe
b7f0: 73 65 74 20 29 20 54 63 6c 5f 52 65 73 65 74 52  set ) Tcl_ResetR
b800: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
b810: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
b820: 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20  pPreStmt->nParm 
b830: 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70 50 72  = iParm;.  *ppPr
b840: 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  eStmt = pPreStmt
b850: 3b 0a 20 20 69 66 28 20 6e 65 65 64 52 65 73 75  ;.  if( needResu
b860: 6c 74 52 65 73 65 74 20 26 26 20 72 63 3d 3d 54  ltReset && rc==T
b870: 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 52 65 73 65  CL_OK ) Tcl_Rese
b880: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
b890: 65 72 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  erp);..  return 
b8a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
b8b0: 65 61 73 65 20 61 20 73 74 61 74 65 6d 65 6e 74  ease a statement
b8c0: 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
b8d0: 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 64  ned by calling d
b8e0: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
b8f0: 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75  )..** There shou
b900: 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  ld be exactly on
b910: 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  e call to this f
b920: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  unction for each
b930: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50 72   call to.** dbPr
b940: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a  epareAndBind()..
b950: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 69 73  **.** If the dis
b960: 63 61 72 64 20 70 61 72 61 6d 65 74 65 72 20 69  card parameter i
b970: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
b980: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
b990: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69 6d 6d  s deleted.** imm
b9a0: 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65 72 77  ediately. Otherw
b9b0: 69 73 65 20 69 74 20 69 73 20 61 64 64 65 64 20  ise it is added 
b9c0: 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 20  to the LRU list 
b9d0: 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74 75 72  and may be retur
b9e0: 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75 62 73  ned.** by a subs
b9f0: 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 64  equent call to d
ba00: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
ba10: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
ba20: 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28  d dbReleaseStmt(
ba30: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
ba40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba50: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
ba60: 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 50 72  andle */.  SqlPr
ba70: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
ba80: 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20 50 72  Stmt,      /* Pr
ba90: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
baa0: 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c 65 61   handle to relea
bab0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 63  se */.  int disc
bac0: 61 72 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ard             
bad0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
bae0: 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74 20 63  to delete (not c
baf0: 61 63 68 65 29 20 74 68 65 20 70 50 72 65 53 74  ache) the pPreSt
bb00: 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  mt */.){.  int i
bb10: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
bb20: 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61 6e   bound string an
bb30: 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65 72  d blob parameter
bb40: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
bb50: 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72  i<pPreStmt->nPar
bb60: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  m; i++){.    Tcl
bb70: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 50  _DecrRefCount(pP
bb80: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69  reStmt->apParm[i
bb90: 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65 53 74  ]);.  }.  pPreSt
bba0: 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a 0a  mt->nParm = 0;..
bbb0: 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74    if( pDb->maxSt
bbc0: 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61 72 64  mt<=0 || discard
bbd0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
bbe0: 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e 65  e cache is turne
bbf0: 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74  d off, deallocat
bc00: 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ed the statement
bc10: 20 2a 2f 0a 20 20 20 20 64 62 46 72 65 65 53 74   */.    dbFreeSt
bc20: 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  mt(pPreStmt);.  
bc30: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 64  }else{.    /* Ad
bc40: 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  d the prepared s
bc50: 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20  tatement to the 
bc60: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
bc70: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a 2f 0a   cache list. */.
bc80: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e      pPreStmt->pN
bc90: 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ext = pDb->stmtL
bca0: 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  ist;.    pPreStm
bcb0: 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  t->pPrev = 0;.  
bcc0: 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c    if( pDb->stmtL
bcd0: 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44 62 2d  ist ){.     pDb-
bce0: 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76  >stmtList->pPrev
bcf0: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
bd00: 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74   }.    pDb->stmt
bd10: 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b  List = pPreStmt;
bd20: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74  .    if( pDb->st
bd30: 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  mtLast==0 ){.   
bd40: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
bd50: 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  nStmt==0 );.    
bd60: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
bd70: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20  = pPreStmt;.    
bd80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
bd90: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e  ert( pDb->nStmt>
bda0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0 );.    }.    p
bdb0: 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 0a 20 20  Db->nStmt++;..  
bdc0: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
bdd0: 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d 65  too many stateme
bde0: 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65 6d  nt in cache, rem
bdf0: 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73 20  ove the surplus 
be00: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
be10: 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65  end of the cache
be20: 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 77   list.  */.    w
be30: 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74  hile( pDb->nStmt
be40: 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b  >pDb->maxStmt ){
be50: 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61 72  .      SqlPrepar
be60: 65 64 53 74 6d 74 20 2a 70 4c 61 73 74 20 3d 20  edStmt *pLast = 
be70: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3b 0a 20  pDb->stmtLast;. 
be80: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
be90: 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 50 72 65  st = pLast->pPre
bea0: 76 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  v;.      pDb->st
beb0: 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20  mtLast->pNext = 
bec0: 30 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53  0;.      pDb->nS
bed0: 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 64 62 46  tmt--;.      dbF
bee0: 72 65 65 53 74 6d 74 28 70 4c 61 73 74 29 3b 0a  reeStmt(pLast);.
bef0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
bf00: 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
bf10: 64 20 77 69 74 68 20 64 62 45 76 61 6c 58 58 58  d with dbEvalXXX
bf20: 28 29 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  () functions:.**
bf30: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 49 6e 69 74  .**   dbEvalInit
bf40: 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 53 74  ().**   dbEvalSt
bf50: 65 70 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  ep().**   dbEval
bf60: 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 20 20  Finalize().**   
bf70: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 0a  dbEvalRowInfo().
bf80: 2a 2a 20 20 20 64 62 45 76 61 6c 43 6f 6c 75 6d  **   dbEvalColum
bf90: 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a 74 79 70 65  nValue().*/.type
bfa0: 64 65 66 20 73 74 72 75 63 74 20 44 62 45 76 61  def struct DbEva
bfb0: 6c 43 6f 6e 74 65 78 74 20 44 62 45 76 61 6c 43  lContext DbEvalC
bfc0: 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 44  ontext;.struct D
bfd0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 7b 0a 20  bEvalContext {. 
bfe0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20   SqliteDb *pDb; 
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
c010: 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  dle */.  Tcl_Obj
c020: 20 2a 70 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *pSql;         
c030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
c040: 63 74 20 68 6f 6c 64 69 6e 67 20 73 74 72 69 6e  ct holding strin
c050: 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73  g zSql */.  cons
c060: 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20  t char *zSql;   
c070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c080: 65 6d 61 69 6e 69 6e 67 20 53 51 4c 20 74 6f 20  emaining SQL to 
c090: 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 53 71 6c  execute */.  Sql
c0a0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
c0b0: 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20  reStmt;      /* 
c0c0: 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  Current statemen
c0d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t */.  int nCol;
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c100: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
c110: 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f  rned by pStmt */
c120: 0a 20 20 69 6e 74 20 65 76 61 6c 46 6c 61 67 73  .  int evalFlags
c130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c140: 20 20 20 2f 2a 20 46 6c 61 67 73 20 75 73 65 64     /* Flags used
c150: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
c160: 41 72 72 61 79 3b 20 20 20 20 20 20 20 20 20 20  Array;          
c170: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
c180: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20   array variable 
c190: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  */.  Tcl_Obj **a
c1a0: 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  pColName;       
c1b0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
c1c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
c1d0: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c  .};..#define SQL
c1e0: 49 54 45 5f 45 56 41 4c 5f 57 49 54 48 4f 55 54  ITE_EVAL_WITHOUT
c1f0: 4e 55 4c 4c 53 20 20 30 78 30 30 30 30 31 20 20  NULLS  0x00001  
c200: 2f 2a 20 55 6e 73 65 74 20 61 72 72 61 79 28 2a  /* Unset array(*
c210: 29 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 2f  ) for NULL */../
c220: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79  *.** Release any
c230: 20 63 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e   cache of column
c240: 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79   names currently
c250: 20 68 65 6c 64 20 61 73 20 70 61 72 74 20 6f 66   held as part of
c260: 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f  .** the DbEvalCo
c270: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
c280: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
c290: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
c2a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 52  .static void dbR
c2b0: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
c2c0: 73 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  s(DbEvalContext 
c2d0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
c2e0: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ColName ){.    i
c2f0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
c300: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
c310: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65  +){.      Tcl_De
c320: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70  crRefCount(p->ap
c330: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
c340: 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28   }.    Tcl_Free(
c350: 28 63 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c  (char *)p->apCol
c360: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Name);.    p->ap
c370: 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ColName = 0;.  }
c380: 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  .  p->nCol = 0;.
c390: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
c3a0: 69 7a 65 20 61 20 44 62 45 76 61 6c 43 6f 6e 74  ize a DbEvalCont
c3b0: 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ext structure..*
c3c0: 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69  *.** If pArray i
c3d0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
c3e0: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   it contains the
c3f0: 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61   name of a Tcl a
c400: 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65  rray.** variable
c410: 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72  . The "*" member
c420: 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20 69   of this array i
c430: 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20  s set to a list 
c440: 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68  containing.** th
c450: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
c460: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
c470: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
c480: 20 61 73 20 70 61 72 74 20 6f 66 20 65 61 63 68   as part of each
c490: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45 76  .** call to dbEv
c4a0: 61 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f 72 64  alStep(), in ord
c4b0: 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  er from left to 
c4c0: 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74  right. e.g. if t
c4d0: 68 65 20 6e 61 6d 65 73 0a 2a 2a 20 6f 66 20 74  he names.** of t
c4e0: 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75  he returned colu
c4f0: 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64  mns are a, b and
c500: 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20   c, it does the 
c510: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68  equivalent of th
c520: 65 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61 6e 64  e.** tcl command
c530: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74 20  :.**.**     set 
c540: 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61 20  ${pArray}(*) {a 
c550: 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76  b c}.*/.static v
c560: 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74 28 0a  oid dbEvalInit(.
c570: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
c580: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c590: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
c5a0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 6e 69  structure to ini
c5b0: 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53 71 6c  tialize */.  Sql
c5c0: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c5e0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
c5f0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
c600: 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ql,             
c610: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 63       /* Object c
c620: 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20 73 63  ontaining SQL sc
c630: 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ript */.  Tcl_Ob
c640: 6a 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 20  j *pArray,      
c650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
c660: 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79 20 74  e of Tcl array t
c670: 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d 65 6e  o set (*) elemen
c680: 74 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 65 76  t of */.  int ev
c690: 61 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  alFlags         
c6a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
c6b0: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 65  gs controlling e
c6c0: 76 61 6c 75 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  valuation */.){.
c6d0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
c6e0: 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74  izeof(DbEvalCont
c6f0: 65 78 74 29 29 3b 0a 20 20 70 2d 3e 70 44 62 20  ext));.  p->pDb 
c700: 3d 20 70 44 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c  = pDb;.  p->zSql
c710: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
c720: 28 70 53 71 6c 29 3b 0a 20 20 70 2d 3e 70 53 71  (pSql);.  p->pSq
c730: 6c 20 3d 20 70 53 71 6c 3b 0a 20 20 54 63 6c 5f  l = pSql;.  Tcl_
c740: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 71  IncrRefCount(pSq
c750: 6c 29 3b 0a 20 20 69 66 28 20 70 41 72 72 61 79  l);.  if( pArray
c760: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61   ){.    p->pArra
c770: 79 20 3d 20 70 41 72 72 61 79 3b 0a 20 20 20 20  y = pArray;.    
c780: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
c790: 28 70 41 72 72 61 79 29 3b 0a 20 20 7d 0a 20 20  (pArray);.  }.  
c7a0: 70 2d 3e 65 76 61 6c 46 6c 61 67 73 20 3d 20 65  p->evalFlags = e
c7b0: 76 61 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a  valFlags;.}../*.
c7c0: 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72 6d  ** Obtain inform
c7d0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
c7e0: 72 6f 77 20 74 68 61 74 20 74 68 65 20 44 62 45  row that the DbE
c7f0: 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73 73 65  valContext passe
c800: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
c810: 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  t argument curre
c820: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
c830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
c840: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20 20  bEvalRowInfo(.  
c850: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
c860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c870: 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20 63 6f  /* Evaluation co
c880: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ntext */.  int *
c890: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
c8a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
c8b0: 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  T: Number of col
c8c0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54  umn names */.  T
c8d0: 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c  cl_Obj ***papCol
c8e0: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 2f  Name           /
c8f0: 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20  * OUT: Array of 
c900: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
c910: 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ){.  /* Compute 
c920: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
c930: 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43 6f    if( 0==p->apCo
c940: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  lName ){.    sql
c950: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
c960: 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e   = p->pPreStmt->
c970: 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  pStmt;.    int i
c980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c990: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
c9a0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
c9b0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c9e0: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
c9f0: 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20   by pStmt */.   
ca00: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c   Tcl_Obj **apCol
ca10: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  Name = 0;      /
ca20: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  * Array of colum
ca30: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20 20  n names */..    
ca40: 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d  p->nCol = nCol =
ca50: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ca60: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
ca70: 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26 20    if( nCol>0 && 
ca80: 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70  (papColName || p
ca90: 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20 20 20  ->pArray) ){.   
caa0: 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28     apColName = (
cab0: 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c  Tcl_Obj**)Tcl_Al
cac0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f  loc( sizeof(Tcl_
cad0: 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20  Obj*)*nCol );.  
cae0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
caf0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cb00: 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20     apColName[i] 
cb10: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
cb20: 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
cb30: 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c  n_name(pStmt,i),
cb40: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63   -1);.        Tc
cb50: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61  l_IncrRefCount(a
cb60: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
cb70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61      }.      p->a
cb80: 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c  pColName = apCol
cb90: 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Name;.    }..   
cba0: 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61   /* If results a
cbb0: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20  re being stored 
cbc0: 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  in an array vari
cbd0: 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74  able, then creat
cbe0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72  e.    ** the arr
cbf0: 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20  ay(*) entry for 
cc00: 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a  that array.    *
cc10: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72  /.    if( p->pAr
cc20: 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ray ){.      Tcl
cc30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
cc40: 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70  = p->pDb->interp
cc50: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
cc60: 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f  *pColList = Tcl_
cc70: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
cc80: 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d  Tcl_Obj *pStar =
cc90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
cca0: 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20  j("*", -1);..   
ccb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
ccc0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ccd0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
cce0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
ccf0: 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43  p, pColList, apC
cd00: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
cd10: 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e    }.      Tcl_In
cd20: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72  crRefCount(pStar
cd30: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
cd40: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
cd50: 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72  p->pArray, pStar
cd60: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a  , pColList, 0);.
cd70: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
cd80: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
cd90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
cda0: 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20  papColName ){.  
cdb0: 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20    *papColName = 
cdc0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  p->apColName;.  
cdd0: 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b  }.  if( pnCol ){
cde0: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d  .    *pnCol = p-
cdf0: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >nCol;.  }.}../*
ce00: 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f  .** Return one o
ce10: 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52  f TCL_OK, TCL_BR
ce20: 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  EAK or TCL_ERROR
ce30: 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69  . If TCL_ERROR i
ce40: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74  s.** returned, t
ce50: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  hen an error mes
ce60: 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
ce70: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
ce80: 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  r before.** retu
ce90: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72  rning..**.** A r
cea0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
ceb0: 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72  CL_OK means ther
cec0: 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61  e is a row of da
ced0: 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  ta available. Th
cee0: 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
cef0: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20   accessed using 
cf00: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20  dbEvalRowInfo() 
cf10: 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  and dbEvalColumn
cf20: 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a  Value(). This.**
cf30: 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f   is analogous to
cf40: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
cf50: 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c  ITE_ROW from sql
cf60: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20  ite3_step(). If 
cf70: 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20  TCL_BREAK.** is 
cf80: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74  returned, then t
cf90: 68 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61  he SQL script ha
cfa0: 73 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75  s finished execu
cfb0: 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61  ting and there a
cfc0: 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72  re.** no further
cfd0: 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e   rows available.
cfe0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
cff0: 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   to SQLITE_DONE.
d000: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
d010: 62 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c  bEvalStep(DbEval
d020: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63  Context *p){.  c
d030: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76  onst char *zPrev
d040: 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Sql = 0;       /
d050: 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * Previous value
d060: 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a   of p->zSql */..
d070: 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c    while( p->zSql
d080: 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74  [0] || p->pPreSt
d090: 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  mt ){.    int rc
d0a0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
d0b0: 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eStmt==0 ){.    
d0c0: 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d    zPrevSql = (p-
d0d0: 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20  >zSql==zPrevSql 
d0e0: 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a  ? 0 : p->zSql);.
d0f0: 20 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65        rc = dbPre
d100: 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70  pareAndBind(p->p
d110: 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d  Db, p->zSql, &p-
d120: 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53  >zSql, &p->pPreS
d130: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
d140: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
d150: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73  urn rc;.    }els
d160: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73  e{.      int rcs
d170: 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62  ;.      SqliteDb
d180: 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a   *pDb = p->pDb;.
d190: 20 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65        SqlPrepare
d1a0: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20  dStmt *pPreStmt 
d1b0: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20  = p->pPreStmt;. 
d1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
d1d0: 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53  t *pStmt = pPreS
d1e0: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20  tmt->pStmt;..   
d1f0: 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33     rcs = sqlite3
d200: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
d210: 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c      if( rcs==SQL
d220: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
d230: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
d240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d250: 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b  if( p->pArray ){
d260: 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52  .        dbEvalR
d270: 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b  owInfo(p, 0, 0);
d280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
d290: 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  cs = sqlite3_res
d2a0: 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20  et(pStmt);..    
d2b0: 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73    pDb->nStep = s
d2c0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
d2d0: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
d2e0: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
d2f0: 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20  CAN_STEP,1);.   
d300: 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20     pDb->nSort = 
d310: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
d320: 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45  tus(pStmt,SQLITE
d330: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
d340: 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ,1);.      pDb->
d350: 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  nIndex = sqlite3
d360: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
d370: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
d380: 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31  ATUS_AUTOINDEX,1
d390: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 56  );.      pDb->nV
d3a0: 4d 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f  MStep = sqlite3_
d3b0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
d3c0: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
d3d0: 54 55 53 5f 56 4d 5f 53 54 45 50 2c 31 29 3b 0a  TUS_VM_STEP,1);.
d3e0: 20 20 20 20 20 20 64 62 52 65 6c 65 61 73 65 43        dbReleaseC
d3f0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a 20  olumnNames(p);. 
d400: 20 20 20 20 20 70 2d 3e 70 50 72 65 53 74 6d 74       p->pPreStmt
d410: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
d420: 20 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rcs!=SQLITE_OK 
d430: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
d440: 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f   a run-time erro
d450: 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74  r occurs, report
d460: 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73   the error and s
d470: 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20  top reading.    
d480: 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 2e 20      ** the SQL. 
d490: 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 62 52 65   */.        dbRe
d4a0: 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70  leaseStmt(pDb, p
d4b0: 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 23 69 66  PreStmt, 1);.#if
d4c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
d4d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 44 62 2d       if( p->pDb-
d4e0: 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20  >bLegacyPrepare 
d4f0: 26 26 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 53  && rcs==SQLITE_S
d500: 43 48 45 4d 41 20 26 26 20 7a 50 72 65 76 53 71  CHEMA && zPrevSq
d510: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
d520: 2a 20 49 66 20 74 68 65 20 72 75 6e 74 69 6d 65  * If the runtime
d530: 20 65 72 72 6f 72 20 77 61 73 20 61 6e 20 53 51   error was an SQ
d540: 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 61 6e 64  LITE_SCHEMA, and
d550: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
d560: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c          ** handl
d570: 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  e is configured 
d580: 74 6f 20 75 73 65 20 74 68 65 20 6c 65 67 61 63  to use the legac
d590: 79 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  y sqlite3_prepar
d5a0: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
d5b0: 20 69 6e 74 65 72 66 61 63 65 2c 20 72 65 74 72   interface, retr
d5c0: 79 20 70 72 65 70 61 72 65 28 29 2f 73 74 65 70  y prepare()/step
d5d0: 28 29 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 53  () on the same S
d5e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  QL statement..  
d5f0: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
d600: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63  only happens onc
d610: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
d620: 20 73 65 63 6f 6e 64 20 53 51 4c 49 54 45 5f 53   second SQLITE_S
d630: 43 48 45 4d 41 0a 20 20 20 20 20 20 20 20 20 20  CHEMA.          
d640: 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 20 65 72  ** error, the er
d650: 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
d660: 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
d670: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  er. */.         
d680: 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a 50 72 65 76   p->zSql = zPrev
d690: 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 63  Sql;.          c
d6a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
d6b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
d6c0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
d6d0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 0a  lt(pDb->interp,.
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77           Tcl_New
d700: 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
d710: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
d720: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  ), -1));.       
d730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d740: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
d750: 20 20 20 20 20 20 20 20 64 62 52 65 6c 65 61 73          dbReleas
d760: 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53  eStmt(pDb, pPreS
d770: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  tmt, 0);.      }
d780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d790: 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a 20 20 72   Finished */.  r
d7a0: 65 74 75 72 6e 20 54 43 4c 5f 42 52 45 41 4b 3b  eturn TCL_BREAK;
d7b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
d7c0: 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 63 75 72  ll resources cur
d7d0: 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79 20 74  rently held by t
d7e0: 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  he DbEvalContext
d7f0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
d800: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
d810: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 72  t argument. Ther
d820: 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61 63  e should be exac
d830: 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  tly one call to 
d840: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
d850: 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74   for each call t
d860: 6f 20 64 62 45 76 61 6c 49 6e 69 74 28 29 2e 0a  o dbEvalInit()..
d870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
d880: 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 44 62  bEvalFinalize(Db
d890: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b  EvalContext *p){
d8a0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74  .  if( p->pPreSt
d8b0: 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
d8c0: 33 5f 72 65 73 65 74 28 70 2d 3e 70 50 72 65 53  3_reset(p->pPreS
d8d0: 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  tmt->pStmt);.   
d8e0: 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70   dbReleaseStmt(p
d8f0: 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72 65 53 74  ->pDb, p->pPreSt
d900: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70  mt, 0);.    p->p
d910: 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  PreStmt = 0;.  }
d920: 0a 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79  .  if( p->pArray
d930: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
d940: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 41 72 72  RefCount(p->pArr
d950: 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70 41 72 72  ay);.    p->pArr
d960: 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 54 63  ay = 0;.  }.  Tc
d970: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
d980: 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62 52 65 6c  ->pSql);.  dbRel
d990: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
d9a0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
d9b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
d9c0: 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74 72 75 63   a Tcl_Obj struc
d9d0: 74 75 72 65 20 77 69 74 68 20 72 65 66 2d 63 6f  ture with ref-co
d9e0: 75 6e 74 20 30 20 74 68 61 74 20 63 6f 6e 74 61  unt 0 that conta
d9f0: 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
da00: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 27 74 68   for the iCol'th
da10: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
da20: 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ow currently poi
da30: 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 74 68  nted to by.** th
da40: 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e DbEvalContext 
da50: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
da60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
da70: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
da80: 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 45 76 61  c Tcl_Obj *dbEva
da90: 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 44 62 45  lColumnValue(DbE
daa0: 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 69  valContext *p, i
dab0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73 71 6c 69  nt iCol){.  sqli
dac0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
dad0: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70  = p->pPreStmt->p
dae0: 53 74 6d 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Stmt;.  switch( 
daf0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
db00: 79 70 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ype(pStmt, iCol)
db10: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
db20: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
db30: 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71    int bytes = sq
db40: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
db50: 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  es(pStmt, iCol);
db60: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
db70: 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74  r *zBlob = sqlit
db80: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
db90: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
dba0: 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20 29 20     if( !zBlob ) 
dbb0: 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  bytes = 0;.     
dbc0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 42   return Tcl_NewB
dbd0: 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 2a  yteArrayObj((u8*
dbe0: 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73 29 3b 0a  )zBlob, bytes);.
dbf0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
dc00: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
dc10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e  .      sqlite_in
dc20: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
dc30: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
dc40: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
dc50: 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33   if( v>=-2147483
dc60: 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38  647 && v<=214748
dc70: 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20  3647 ){.        
dc80: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 49 6e  return Tcl_NewIn
dc90: 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20  tObj((int)v);.  
dca0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dcb0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
dcc0: 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a  wWideIntObj(v);.
dcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dce0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
dcf0: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  OAT: {.      ret
dd00: 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  urn Tcl_NewDoubl
dd10: 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  eObj(sqlite3_col
dd20: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
dd30: 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a  , iCol));.    }.
dd40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
dd50: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 65  NULL: {.      re
dd60: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69  turn Tcl_NewStri
dd70: 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e  ngObj(p->pDb->zN
dd80: 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ull, -1);.    }.
dd90: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 63    }..  return Tc
dda0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
ddb0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
ddc0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
ddd0: 20 69 43 6f 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a   iCol), -1);.}..
dde0: 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20 54  /*.** If using T
ddf0: 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36 20 6f  cl version 8.6 o
de00: 72 20 67 72 65 61 74 65 72 2c 20 75 73 65 20 74  r greater, use t
de10: 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e 73 20  he NR functions 
de20: 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65 63 75  to avoid.** recu
de30: 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f 6e 20  rsive evalution 
de40: 6f 66 20 73 63 72 69 70 74 73 20 62 79 20 74 68  of scripts by th
de50: 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e 64 20  e [db eval] and 
de60: 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f  [db trans].** co
de70: 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69 66 20  mmands. Even if 
de80: 74 68 65 20 68 65 61 64 65 72 73 20 75 73 65 64  the headers used
de90: 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67   while compiling
dea0: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 0a 2a   the extension.*
deb0: 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e 65 77  * are 8.6 or new
dec0: 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73 74 69  er, the code sti
ded0: 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54 63 6c  ll tests the Tcl
dee0: 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75 6e 74   version at runt
def0: 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61 6c 6c  ime..** This all
df00: 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62 6c 65  ows stubs-enable
df10: 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65 20 75  d builds to be u
df20: 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72 20 54  sed with older T
df30: 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f  cl libraries..*/
df40: 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56  .#if TCL_MAJOR_V
df50: 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c  ERSION>8 || (TCL
df60: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d  _MAJOR_VERSION==
df70: 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56  8 && TCL_MINOR_V
df80: 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64 65 66  ERSION>=6).# def
df90: 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e  ine SQLITE_TCL_N
dfa0: 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e 74 20  RE 1.static int 
dfb0: 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29 7b 0a  DbUseNre(void){.
dfc0: 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e    int major, min
dfd0: 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56 65 72  or;.  Tcl_GetVer
dfe0: 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69  sion(&major, &mi
dff0: 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  nor, 0, 0);.  re
e000: 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38 20  turn( (major==8 
e010: 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20  && minor>=6) || 
e020: 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c  major>8 );.}.#el
e030: 73 65 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69  se./*.** Compili
e040: 6e 67 20 75 73 69 6e 67 20 68 65 61 64 65 72 73  ng using headers
e050: 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20 38 2e   earlier than 8.
e060: 36 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  6. In this case 
e070: 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  NR cannot be.** 
e080: 75 73 65 64 2c 20 73 6f 20 44 62 55 73 65 4e 72  used, so DbUseNr
e090: 65 28 29 20 74 6f 20 61 6c 77 61 79 73 20 72 65  e() to always re
e0a0: 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64 20 23  turn zero. Add #
e0b0: 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68 65 20  defines for the 
e0c0: 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78  other.** Tcl_NRx
e0d0: 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 74  xx() functions t
e0e0: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
e0f0: 72 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f 6d 70  rom causing comp
e100: 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c 0a  ilation errors,.
e110: 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  ** even though t
e120: 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61 74 69  he only invocati
e130: 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61 72 65 20  ons of them are 
e140: 77 69 74 68 69 6e 20 63 6f 6e 64 69 74 69 6f 6e  within condition
e150: 61 6c 20 62 6c 6f 63 6b 73 0a 2a 2a 20 6f 66 20  al blocks.** of 
e160: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
e170: 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
e180: 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20   ) { ... }.*/.# 
e190: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43  define SQLITE_TC
e1a0: 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66 69 6e 65  L_NRE 0.# define
e1b0: 20 44 62 55 73 65 4e 72 65 28 29 20 30 0a 23 20   DbUseNre() 0.# 
e1c0: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 41 64 64  define Tcl_NRAdd
e1d0: 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c 63 2c 64  Callback(a,b,c,d
e1e0: 2c 65 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 20  ,e,f) (void)0.# 
e1f0: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61  define Tcl_NREva
e200: 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20  lObj(a,b,c) 0.# 
e210: 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65  define Tcl_NRCre
e220: 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63  ateCommand(a,b,c
e230: 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64 29 30 0a  ,d,e,f) (void)0.
e240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
e250: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70  is function is p
e260: 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c 65  art of the imple
e270: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
e280: 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20   command:.**.** 
e290: 20 20 24 64 62 20 65 76 61 6c 20 53 51 4c 20 3f    $db eval SQL ?
e2a0: 41 52 52 41 59 4e 41 4d 45 3f 20 53 43 52 49 50  ARRAYNAME? SCRIP
e2b0: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  T.*/.static int 
e2c0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62  SQLITE_TCLAPI Db
e2d0: 45 76 61 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43  EvalNextCmd(.  C
e2e0: 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d  lientData data[]
e2f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e300: 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69      /* data[0] i
e310: 73 20 74 68 65 20 28 44 62 45 76 61 6c 43 6f 6e  s the (DbEvalCon
e320: 74 65 78 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f  text*) */.  Tcl_
e330: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65   /* Tcl interpre
e360: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ter */.  int res
e370: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e390: 20 52 65 73 75 6c 74 20 73 6f 20 66 61 72 20 2a   Result so far *
e3a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
e3b0: 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  result;         
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e3d0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
e3e0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c   /* The first el
e3f0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 64 61 74  ement of the dat
e400: 61 5b 5d 20 61 72 72 61 79 20 69 73 20 61 20 70  a[] array is a p
e410: 6f 69 6e 74 65 72 20 74 6f 20 61 20 44 62 45 76  ointer to a DbEv
e420: 61 6c 43 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73  alContext.  ** s
e430: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
e440: 65 64 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c  ed using Tcl_All
e450: 6f 63 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  oc(). The second
e460: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 64 61 74 61   element of data
e470: 5b 5d 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69  [].  ** is a poi
e480: 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62  nter to a Tcl_Ob
e490: 6a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  j containing the
e4a0: 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66   script to run f
e4b0: 6f 72 20 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a  or each row.  **
e4c0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
e4d0: 20 71 75 65 72 69 65 73 20 65 6e 63 61 70 73 75   queries encapsu
e4e0: 6c 61 74 65 64 20 69 6e 20 64 61 74 61 5b 30 5d  lated in data[0]
e4f0: 2e 20 2a 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e  . */.  DbEvalCon
e500: 74 65 78 74 20 2a 70 20 3d 20 28 44 62 45 76 61  text *p = (DbEva
e510: 6c 43 6f 6e 74 65 78 74 20 2a 29 64 61 74 61 5b  lContext *)data[
e520: 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  0];.  Tcl_Obj *p
e530: 53 63 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62  Script = (Tcl_Ob
e540: 6a 20 2a 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54  j *)data[1];.  T
e550: 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d  cl_Obj *pArray =
e560: 20 70 2d 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77   p->pArray;..  w
e570: 68 69 6c 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f  hile( (rc==TCL_O
e580: 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e  K || rc==TCL_CON
e590: 54 49 4e 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b  TINUE) && TCL_OK
e5a0: 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74  ==(rc = dbEvalSt
e5b0: 65 70 28 70 29 29 20 29 7b 0a 20 20 20 20 69 6e  ep(p)) ){.    in
e5c0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  t i;.    int nCo
e5d0: 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  l;.    Tcl_Obj *
e5e0: 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20  *apColName;.    
e5f0: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c  dbEvalRowInfo(p,
e600: 20 26 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61   &nCol, &apColNa
e610: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  me);.    for(i=0
e620: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
e630: 20 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79        if( pArray
e640: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ==0 ){.        T
e650: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
e660: 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  terp, apColName[
e670: 69 5d 2c 20 30 2c 20 64 62 45 76 61 6c 43 6f 6c  i], 0, dbEvalCol
e680: 75 6d 6e 56 61 6c 75 65 28 70 2c 69 29 2c 20 30  umnValue(p,i), 0
e690: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e6a0: 66 28 20 28 70 2d 3e 65 76 61 6c 46 6c 61 67 73  f( (p->evalFlags
e6b0: 20 26 20 53 51 4c 49 54 45 5f 45 56 41 4c 5f 57   & SQLITE_EVAL_W
e6c0: 49 54 48 4f 55 54 4e 55 4c 4c 53 29 21 3d 30 0a  ITHOUTNULLS)!=0.
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
e6e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
e6f0: 79 70 65 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d  ype(p->pPreStmt-
e700: 3e 70 53 74 6d 74 2c 20 69 29 3d 3d 53 51 4c 49  >pStmt, i)==SQLI
e710: 54 45 5f 4e 55 4c 4c 20 0a 20 20 20 20 20 20 29  TE_NULL .      )
e720: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 55 6e  {.        Tcl_Un
e730: 73 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  setVar2(interp, 
e740: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 41  Tcl_GetString(pA
e750: 72 72 61 79 29 2c 20 0a 20 20 20 20 20 20 20 20  rray), .        
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
e770: 6c 5f 47 65 74 53 74 72 69 6e 67 28 61 70 43 6f  l_GetString(apCo
e780: 6c 4e 61 6d 65 5b 69 5d 29 2c 20 30 29 3b 0a 20  lName[i]), 0);. 
e790: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e7a0: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
e7b0: 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61  r2(interp, pArra
e7c0: 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  y, apColName[i],
e7d0: 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
e7e0: 75 65 28 70 2c 69 29 2c 20 30 29 3b 0a 20 20 20  ue(p,i), 0);.   
e7f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e800: 2f 2a 20 54 68 65 20 72 65 71 75 69 72 65 64 20  /* The required 
e810: 69 6e 74 65 72 70 72 65 74 65 72 20 76 61 72 69  interpreter vari
e820: 61 62 6c 65 73 20 61 72 65 20 6e 6f 77 20 70 6f  ables are now po
e830: 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
e840: 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
e850: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  m the current ro
e860: 77 2e 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  w. If using NRE,
e870: 20 73 63 68 65 64 75 6c 65 20 63 61 6c 6c 62 61   schedule callba
e880: 63 6b 73 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  cks to evaluate.
e890: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 70 53      ** script pS
e8a0: 63 72 69 70 74 2c 20 74 68 65 6e 20 74 6f 20 69  cript, then to i
e8b0: 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74  nvoke this funct
e8c0: 69 6f 6e 20 61 67 61 69 6e 20 74 6f 20 66 65 74  ion again to fet
e8d0: 63 68 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ch the next.    
e8e0: 2a 2a 20 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e  ** row (or clean
e8f0: 20 75 70 20 69 66 20 74 68 65 72 65 20 69 73 20   up if there is 
e900: 6e 6f 20 6e 65 78 74 20 72 6f 77 20 6f 72 20 74  no next row or t
e910: 68 65 20 73 63 72 69 70 74 20 74 68 72 6f 77 73  he script throws
e920: 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 63 65 70   an.    ** excep
e930: 74 69 6f 6e 29 2e 20 41 66 74 65 72 20 73 63 68  tion). After sch
e940: 65 64 75 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c  eduling the call
e950: 62 61 63 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f  backs, return co
e960: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 0a 20 20 20  ntrol to the.   
e970: 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20   ** caller..    
e980: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74  **.    ** If not
e990: 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c   using NRE, eval
e9a0: 75 61 74 65 20 70 53 63 72 69 70 74 20 64 69 72  uate pScript dir
e9b0: 65 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e  ectly and contin
e9c0: 75 65 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  ue with the.    
e9d0: 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  ** next iteratio
e9e0: 6e 20 6f 66 20 74 68 69 73 20 77 68 69 6c 65 28  n of this while(
e9f0: 2e 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20  ...) loop.  */. 
ea00: 20 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28     if( DbUseNre(
ea10: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e  ) ){.      Tcl_N
ea20: 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74  RAddCallback(int
ea30: 65 72 70 2c 20 44 62 45 76 61 6c 4e 65 78 74 43  erp, DbEvalNextC
ea40: 6d 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28 76  md, (void*)p, (v
ea50: 6f 69 64 2a 29 70 53 63 72 69 70 74 2c 20 30 2c  oid*)pScript, 0,
ea60: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
ea70: 6e 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28  n Tcl_NREvalObj(
ea80: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
ea90: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
eaa0: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45        rc = Tcl_E
eab0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
eac0: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
ead0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44    }.  }..  Tcl_D
eae0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ecrRefCount(pScr
eaf0: 69 70 74 29 3b 0a 20 20 64 62 45 76 61 6c 46 69  ipt);.  dbEvalFi
eb00: 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c  nalize(p);.  Tcl
eb10: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 29  _Free((char *)p)
eb20: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c  ;..  if( rc==TCL
eb30: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42  _OK || rc==TCL_B
eb40: 52 45 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  REAK ){.    Tcl_
eb50: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
eb60: 72 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43  rp);.    rc = TC
eb70: 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  L_OK;.  }.  retu
eb80: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
eb90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
eba0: 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
ebb0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
ebc0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61  the following da
ebd0: 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c 65  tabase.** handle
ebe0: 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a   sub-commands:.*
ebf0: 2a 0a 2a 2a 20 20 20 24 64 62 20 75 70 64 61 74  *.**   $db updat
ec00: 65 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a  e_hook ?SCRIPT?.
ec10: 2a 2a 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f  **   $db wal_hoo
ec20: 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20  k ?SCRIPT?.**   
ec30: 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20  $db commit_hook 
ec40: 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64  ?SCRIPT?.**   $d
ec50: 62 20 70 72 65 75 70 64 61 74 65 20 68 6f 6f 6b  b preupdate hook
ec60: 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61   ?SCRIPT?.*/.sta
ec70: 74 69 63 20 76 6f 69 64 20 44 62 48 6f 6f 6b 43  tic void DbHookC
ec80: 6d 64 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  md(.  Tcl_Interp
ec90: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20   *interp,       
eca0: 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74        /* Tcl int
ecb0: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 53 71  erpreter */.  Sq
ecc0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20  liteDb *pDb,    
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ece0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
ecf0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
ed00: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
ed10: 20 20 20 20 20 20 2f 2a 20 53 43 52 49 50 54 20        /* SCRIPT 
ed20: 61 72 67 75 6d 65 6e 74 20 28 6f 72 20 4e 55 4c  argument (or NUL
ed30: 4c 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  L) */.  Tcl_Obj 
ed40: 2a 2a 70 70 48 6f 6f 6b 20 20 20 20 20 20 20 20  **ppHook        
ed50: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
ed60: 65 72 20 74 6f 20 6d 65 6d 62 65 72 20 6f 66 20  er to member of 
ed70: 53 71 6c 69 74 65 44 62 20 2a 2f 0a 29 7b 0a 20  SqliteDb */.){. 
ed80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ed90: 44 62 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 2a  Db->db;..  if( *
eda0: 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63  ppHook ){.    Tc
edb0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
edc0: 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b  nterp, *ppHook);
edd0: 0a 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b  .    if( pArg ){
ede0: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
edf0: 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
ee00: 3b 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20  ;.      *ppHook 
ee10: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
ee20: 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
ee30: 20 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f   assert( !(*ppHo
ee40: 6f 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 54  ok) );.    if( T
ee50: 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68  cl_GetCharLength
ee60: 28 70 41 72 67 29 3e 30 20 29 7b 0a 20 20 20 20  (pArg)>0 ){.    
ee70: 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 70 41 72 67    *ppHook = pArg
ee80: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
ee90: 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b  RefCount(*ppHook
eea0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
eeb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
eec0: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
eed0: 4b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 75  K.  sqlite3_preu
eee0: 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28  pdate_hook(db, (
eef0: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
ef00: 6f 6f 6b 3f 44 62 50 72 65 55 70 64 61 74 65 48  ook?DbPreUpdateH
ef10: 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b  andler:0), pDb);
ef20: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
ef30: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62  3_update_hook(db
ef40: 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  , (pDb->pUpdateH
ef50: 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64  ook?DbUpdateHand
ef60: 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20  ler:0), pDb);.  
ef70: 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
ef80: 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e  _hook(db, (pDb->
ef90: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62  pRollbackHook?Db
efa0: 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a  RollbackHandler:
efb0: 30 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69  0), pDb);.  sqli
efc0: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
efd0: 20 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f   (pDb->pWalHook?
efe0: 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c  DbWalHandler:0),
eff0: 20 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pDb);.}../*.** 
f000: 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
f010: 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74  mand below creat
f020: 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d  es a new Tcl com
f030: 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  mand for each.**
f040: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f   connection it o
f050: 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74  pens to an SQLit
f060: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
f070: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
f080: 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72  oked.** whenever
f090: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f   one of those co
f0a0: 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69  nnection-specifi
f0b0: 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78  c commands is ex
f0c0: 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c  ecuted.** in Tcl
f0d0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
f0e0: 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63  if you run Tcl c
f0f0: 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ode like this:.*
f100: 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74  *.**       sqlit
f110: 65 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61  e3 db1  "my_data
f120: 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64  base".**       d
f130: 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54  b1 close.**.** T
f140: 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64  he first command
f150: 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74   opens a connect
f160: 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64  ion to the "my_d
f170: 61 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73  atabase" databas
f180: 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74  e.** and calls t
f190: 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22  hat connection "
f1a0: 64 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e  db1".  The secon
f1b0: 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73  d command causes
f1c0: 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74   this.** subrout
f1d0: 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ine to be invoke
f1e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f1f0: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44   SQLITE_TCLAPI D
f200: 62 4f 62 6a 43 6d 64 28 0a 20 20 76 6f 69 64 20  bObjCmd(.  void 
f210: 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  *cd,.  Tcl_Inter
f220: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f230: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f240: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
f250: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
f260: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
f270: 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20  .  int choice;. 
f280: 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b   int rc = TCL_OK
f290: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
f2a0: 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d   char *DB_strs[]
f2b0: 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72   = {.    "author
f2c0: 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  izer",          
f2d0: 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20     "backup",    
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 62 69 6e              "bin
f2f0: 64 5f 66 61 6c 6c 62 61 63 6b 22 2c 0a 20 20 20  d_fallback",.   
f300: 20 22 62 75 73 79 22 2c 20 20 20 20 20 20 20 20   "busy",        
f310: 20 20 20 20 20 20 20 20 20 20 20 22 63 61 63 68             "cach
f320: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
f330: 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 0a 20      "changes",. 
f340: 20 20 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20     "close",     
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
f360: 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  llate",         
f370: 20 20 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e        "collation
f380: 5f 6e 65 65 64 65 64 22 2c 0a 20 20 20 20 22 63  _needed",.    "c
f390: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20  ommit_hook",    
f3a0: 20 20 20 20 20 20 20 20 22 63 6f 6d 70 6c 65 74          "complet
f3b0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
f3c0: 20 22 63 6f 70 79 22 2c 0a 20 20 20 20 22 64 65   "copy",.    "de
f3d0: 73 65 72 69 61 6c 69 7a 65 22 2c 20 20 20 20 20  serialize",     
f3e0: 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c         "enable_l
f3f0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20  oad_extension", 
f400: 22 65 72 72 6f 72 63 6f 64 65 22 2c 0a 20 20 20  "errorcode",.   
f410: 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20   "eval",        
f420: 20 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73             "exis
f430: 74 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ts",            
f440: 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 0a      "function",.
f450: 20 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20      "incrblob", 
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
f470: 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20 20  nterrupt",      
f480: 20 20 20 20 20 20 20 22 6c 61 73 74 5f 69 6e 73         "last_ins
f490: 65 72 74 5f 72 6f 77 69 64 22 2c 0a 20 20 20 20  ert_rowid",.    
f4a0: 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20  "nullvalue",    
f4b0: 20 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f            "oneco
f4c0: 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 20  lumn",          
f4d0: 20 20 20 22 70 72 65 75 70 64 61 74 65 22 2c 0a     "preupdate",.
f4e0: 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20      "profile",  
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
f500: 72 6f 67 72 65 73 73 22 2c 20 20 20 20 20 20 20  rogress",       
f510: 20 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 0a         "rekey",.
f520: 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c 20 20      "restore",  
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
f540: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20  ollback_hook",  
f550: 20 20 20 20 20 20 20 22 73 65 72 69 61 6c 69 7a         "serializ
f560: 65 22 2c 0a 20 20 20 20 22 73 74 61 74 75 73 22  e",.    "status"
f570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f580: 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20    "timeout",    
f590: 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61             "tota
f5a0: 6c 5f 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20  l_changes",.    
f5b0: 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  "trace",        
f5c0: 20 20 20 20 20 20 20 20 20 20 22 74 72 61 63 65            "trace
f5d0: 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  _v2",           
f5e0: 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22     "transaction"
f5f0: 2c 0a 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f  ,.    "unlock_no
f600: 74 69 66 79 22 2c 20 20 20 20 20 20 20 20 20 20  tify",          
f610: 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20  "update_hook",  
f620: 20 20 20 20 20 20 20 20 20 22 76 65 72 73 69 6f           "versio
f630: 6e 22 2c 0a 20 20 20 20 22 77 61 6c 5f 68 6f 6f  n",.    "wal_hoo
f640: 6b 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  k",             
f650: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
f660: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b             .  };
f670: 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20  .  enum DB_enum 
f680: 7b 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49  {.    DB_AUTHORI
f690: 5a 45 52 2c 20 20 20 20 20 20 20 20 20 20 20 20  ZER,            
f6a0: 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20 20  DB_BACKUP,      
f6b0: 20 20 20 20 20 20 20 20 20 44 42 5f 42 49 4e 44           DB_BIND
f6c0: 5f 46 41 4c 4c 42 41 43 4b 2c 0a 20 20 20 20 44  _FALLBACK,.    D
f6d0: 42 5f 42 55 53 59 2c 20 20 20 20 20 20 20 20 20  B_BUSY,         
f6e0: 20 20 20 20 20 20 20 20 20 44 42 5f 43 41 43 48           DB_CACH
f6f0: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
f700: 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 0a 20 20    DB_CHANGES,.  
f710: 20 20 44 42 5f 43 4c 4f 53 45 2c 20 20 20 20 20    DB_CLOSE,     
f720: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
f730: 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20  OLLATE,         
f740: 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f       DB_COLLATIO
f750: 4e 5f 4e 45 45 44 45 44 2c 0a 20 20 20 20 44 42  N_NEEDED,.    DB
f760: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20  _COMMIT_HOOK,   
f770: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c          DB_COMPL
f780: 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  ETE,            
f790: 20 44 42 5f 43 4f 50 59 2c 0a 20 20 20 20 44 42   DB_COPY,.    DB
f7a0: 5f 44 45 53 45 52 49 41 4c 49 5a 45 2c 20 20 20  _DESERIALIZE,   
f7b0: 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c          DB_ENABL
f7c0: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
f7d0: 2c 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 0a 20  ,DB_ERRORCODE,. 
f7e0: 20 20 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20     DB_EVAL,     
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
f800: 45 58 49 53 54 53 2c 20 20 20 20 20 20 20 20 20  EXISTS,         
f810: 20 20 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f        DB_FUNCTIO
f820: 4e 2c 0a 20 20 20 20 44 42 5f 49 4e 43 52 42 4c  N,.    DB_INCRBL
f830: 4f 42 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  OB,             
f840: 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 20 20   DB_INTERRUPT,  
f850: 20 20 20 20 20 20 20 20 20 20 44 42 5f 4c 41 53            DB_LAS
f860: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 0a  T_INSERT_ROWID,.
f870: 20 20 20 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45      DB_NULLVALUE
f880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
f890: 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20  _ONECOLUMN,     
f8a0: 20 20 20 20 20 20 20 44 42 5f 50 52 45 55 50 44         DB_PREUPD
f8b0: 41 54 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f 46  ATE,.    DB_PROF
f8c0: 49 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  ILE,            
f8d0: 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20     DB_PROGRESS, 
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52              DB_R
f8f0: 45 4b 45 59 2c 0a 20 20 20 20 44 42 5f 52 45 53  EKEY,.    DB_RES
f900: 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20 20  TORE,           
f910: 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f      DB_ROLLBACK_
f920: 48 4f 4f 4b 2c 20 20 20 20 20 20 20 20 44 42 5f  HOOK,        DB_
f930: 53 45 52 49 41 4c 49 5a 45 2c 0a 20 20 20 20 44  SERIALIZE,.    D
f940: 42 5f 53 54 41 54 55 53 2c 20 20 20 20 20 20 20  B_STATUS,       
f950: 20 20 20 20 20 20 20 20 20 44 42 5f 54 49 4d 45           DB_TIME
f960: 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  OUT,            
f970: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
f980: 45 53 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45  ES,.    DB_TRACE
f990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f9a0: 20 20 44 42 5f 54 52 41 43 45 5f 56 32 2c 20 20    DB_TRACE_V2,  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 52             DB_TR
f9c0: 41 4e 53 41 43 54 49 4f 4e 2c 0a 20 20 20 20 44  ANSACTION,.    D
f9d0: 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c  B_UNLOCK_NOTIFY,
f9e0: 20 20 20 20 20 20 20 20 20 44 42 5f 55 50 44 41           DB_UPDA
f9f0: 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20 20  TE_HOOK,        
fa00: 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c 0a 20 20    DB_VERSION,.  
fa10: 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 20 20    DB_WAL_HOOK   
fa20: 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a            .  };.
fa30: 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65    /* don't leave
fa40: 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73   trailing commas
fa50: 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20   on DB_enum, it 
fa60: 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58  confuses the AIX
fa70: 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f   xlc compiler */
fa80: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
fa90: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
faa0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fab0: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
fac0: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
fad0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fae0: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
faf0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
fb00: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
fb10: 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e  DB_strs, "option
fb20: 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29  ", 0, &choice) )
fb30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
fb40: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
fb50: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f  witch( (enum DB_
fb60: 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a  enum)choice ){..
fb70: 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68    /*    $db auth
fb80: 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b  orizer ?CALLBACK
fb90: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
fba0: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
fbb0: 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69  lback to authori
fbc0: 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72  ze each SQL oper
fbd0: 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20  ation as it is. 
fbe0: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35   ** compiled.  5
fbf0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
fc00: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
fc10: 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69  allback before i
fc20: 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  t is.  ** invoke
fc30: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  d:.  **.  **   (
fc40: 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  1) The authoriza
fc50: 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53  tion type (ex: S
fc60: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
fc70: 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  LE, SQLITE_INSER
fc80: 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28  T, ...).  **   (
fc90: 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70  2) First descrip
fca0: 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e  tive name (depen
fcb0: 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74  ds on authorizat
fcc0: 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20  ion type).  **  
fcd0: 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63   (3) Second desc
fce0: 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a  riptive name.  *
fcf0: 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20  *   (4) Name of 
fd00: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78  the database (ex
fd10: 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22  : "main", "temp"
fd20: 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d  ).  **   (5) Nam
fd30: 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61  e of trigger tha
fd40: 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61  t is doing the a
fd50: 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccess.  **.  ** 
fd60: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f  The callback sho
fd70: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66  uld return on of
fd80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
fd90: 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f  trings: SQLITE_O
fda0: 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49  K,.  ** SQLITE_I
fdb0: 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45  GNORE, or SQLITE
fdc0: 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65  _DENY.  Any othe
fdd0: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
fde0: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a  s an error..  **
fdf0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  .  ** If this me
fe00: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
fe10: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
fe20: 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  s, the current a
fe30: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a  uthorization.  *
fe40: 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e  * callback strin
fe50: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  g is returned.. 
fe60: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55   */.  case DB_AU
fe70: 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64  THORIZER: {.#ifd
fe80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
fe90: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
fea0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
feb0: 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f  t(interp, "autho
fec0: 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61  rization not ava
fed0: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
fee0: 75 69 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20  uild",.         
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
ff00: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
ff10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
ff20: 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  se.    if( objc>
ff30: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
ff40: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ff50: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
ff60: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
ff70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ff80: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
ff90: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
ffa0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
ffb0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
ffc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ffd0: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68  terp, pDb->zAuth
ffe0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
fff0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
10000 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74        char *zAut
10010 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  h;.      int len
10020 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
10030 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
10040 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
10050 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zAuth);.      }.
10060 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63        zAuth = Tc
10070 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10080 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
10090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  );.      if( zAu
100a0 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  th && len>0 ){. 
100b0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74         pDb->zAut
100c0 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  h = Tcl_Alloc( l
100d0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
100e0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41    memcpy(pDb->zA
100f0 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b  uth, zAuth, len+
10100 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
10110 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
10120 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  uth = 0;.      }
10130 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10140 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
10150 20 74 79 70 65 64 65 66 20 69 6e 74 20 28 2a 73   typedef int (*s
10160 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29 28  qlite3_auth_cb)(
10170 0a 20 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  .           void
10180 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
10190 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 0a 20  *,const char*,. 
101a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
101b0 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
101c0 2a 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  *);.        pDb-
101d0 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
101e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
101f0 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
10200 28 70 44 62 2d 3e 64 62 2c 28 73 71 6c 69 74 65  (pDb->db,(sqlite
10210 33 5f 61 75 74 68 5f 63 62 29 61 75 74 68 5f 63  3_auth_cb)auth_c
10220 61 6c 6c 62 61 63 6b 2c 70 44 62 29 3b 0a 20 20  allback,pDb);.  
10230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10240 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
10250 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
10260 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
10270 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
10280 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10290 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63 6b 75   /*    $db backu
102a0 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c  p ?DATABASE? FIL
102b0 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ENAME.  **.  ** 
102c0 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65 20 61  Open or create a
102d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
102e0 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
102f0 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 2a  Transfer the.  *
10300 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f 63  * content of loc
10310 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41  al database DATA
10320 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22  BASE (default: "
10330 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68 65 0a  main") into the.
10340 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64 61    ** FILENAME da
10350 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
10360 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a 20 7b  ase DB_BACKUP: {
10370 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
10380 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20  *zDestFile;.    
10390 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
103a0 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
103b0 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
103c0 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
103d0 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  kup;..    if( ob
103e0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
103f0 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  SrcDb = "main";.
10400 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
10410 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
10420 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
10430 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
10440 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20  ){.      zSrcDb 
10450 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
10460 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
10470 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f  zDestFile = Tcl_
10480 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
10490 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
104a0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
104b0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
104c0 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
104d0 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
104e0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
104f0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
10510 65 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65 2c  en_v2(zDestFile,
10520 20 26 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20   &pDest,.       
10530 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
10540 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
10550 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
10560 54 45 7c 20 70 44 62 2d 3e 6f 70 65 6e 46 6c 61  TE| pDb->openFla
10570 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gs, 0);.    if( 
10580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10590 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
105a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
105b0 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 72  "cannot open tar
105c0 67 65 74 20 64 61 74 61 62 61 73 65 3a 20 22 2c  get database: ",
105d0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
105e0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
105f0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
10600 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
10610 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
10620 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63  ;.    }.    pBac
10640 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
10650 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
10660 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64 62   "main", pDb->db
10670 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20 69  , zSrcDb);.    i
10680 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
10690 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
106a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
106b0 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20  "backup failed: 
106c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
106d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
106e0 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
106f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
10700 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
10710 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10720 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  OR;.    }.    wh
10730 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
10740 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
10750 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
10760 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
10770 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
10780 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
10790 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
107a0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
107b0 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
107c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
107d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
107e0 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70  (interp, "backup
107f0 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
10800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
10810 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63  rrmsg(pDest), (c
10820 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
10830 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
10840 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10850 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
10860 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10870 20 2f 2a 20 20 20 20 24 64 62 20 62 69 6e 64 5f   /*    $db bind_
10880 66 61 6c 6c 62 61 63 6b 20 3f 43 41 4c 4c 42 41  fallback ?CALLBA
10890 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  CK?.  **.  ** Wh
108a0 65 6e 20 72 65 73 6f 6c 76 69 6e 67 20 62 69 6e  en resolving bin
108b0 64 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20  d parameters in 
108c0 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
108d0 2c 20 69 66 20 74 68 65 20 70 61 72 61 6d 65 74  , if the paramet
108e0 65 72 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62  er.  ** cannot b
108f0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10900 68 20 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65  h a TCL variable
10910 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 43 41 4c   then invoke CAL
10920 4c 42 41 43 4b 20 77 69 74 68 20 61 0a 20 20 2a  LBACK with a.  *
10930 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
10940 74 20 74 68 61 74 20 69 73 20 74 68 65 20 6e 61  t that is the na
10950 6d 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  me of the parame
10960 74 65 72 20 61 6e 64 20 75 73 65 20 74 68 65 20  ter and use the 
10970 72 65 74 75 72 6e 0a 20 20 2a 2a 20 76 61 6c 75  return.  ** valu
10980 65 20 6f 66 20 74 68 65 20 43 41 4c 4c 42 41 43  e of the CALLBAC
10990 4b 20 61 73 20 74 68 65 20 62 69 6e 64 69 6e 67  K as the binding
109a0 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 72  .  If CALLBACK r
109b0 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
109c0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  .  ** other than
109d0 20 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45   TCL_OK or TCL_E
109e0 52 52 4f 52 20 74 68 65 6e 20 62 69 6e 64 20 61  RROR then bind a
109f0 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
10a00 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20   If CALLBACK is 
10a10 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
10a20 20 74 68 65 6e 20 72 65 76 65 72 74 20 74 6f 20   then revert to 
10a30 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  the default beha
10a40 76 69 6f 72 20 0a 20 20 2a 2a 20 77 68 69 63 68  vior .  ** which
10a50 20 69 73 20 74 6f 20 73 65 74 20 74 68 65 20 62   is to set the b
10a60 69 6e 64 69 6e 67 20 74 6f 20 4e 55 4c 4c 2e 0a  inding to NULL..
10a70 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 43 41 4c    **.  ** If CAL
10a80 4c 42 41 43 4b 20 72 65 74 75 72 6e 73 20 61 6e  LBACK returns an
10a90 20 65 72 72 6f 72 2c 20 74 68 61 74 20 63 61 75   error, that cau
10aa0 73 65 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ses the statemen
10ab0 74 20 65 78 65 63 75 74 69 6f 6e 20 74 6f 0a 20  t execution to. 
10ac0 20 2a 2a 20 61 62 6f 72 74 2e 20 20 48 65 6e 63   ** abort.  Henc
10ad0 65 2c 20 74 6f 20 63 6f 6e 66 69 67 75 72 65 20  e, to configure 
10ae0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f 20  a connection so 
10af0 74 68 61 74 20 69 74 20 74 68 72 6f 77 73 20 61  that it throws a
10b00 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 6f 6e 20  n error.  ** on 
10b10 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 62 69  an attempt to bi
10b20 6e 64 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 76 61  nd an unknown va
10b30 72 69 61 62 6c 65 2c 20 64 6f 20 73 6f 6d 65 74  riable, do somet
10b40 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
10b50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 72    **.  **     pr
10b60 6f 63 20 62 69 6e 64 5f 65 72 72 6f 72 20 7b 6e  oc bind_error {n
10b70 61 6d 65 7d 20 7b 65 72 72 6f 72 20 22 6e 6f 20  ame} {error "no 
10b80 73 75 63 68 20 76 61 72 69 61 62 6c 65 3a 20 24  such variable: $
10b90 6e 61 6d 65 22 7d 0a 20 20 2a 2a 20 20 20 20 20  name"}.  **     
10ba0 64 62 20 62 69 6e 64 5f 66 61 6c 6c 62 61 63 6b  db bind_fallback
10bb0 20 62 69 6e 64 5f 65 72 72 6f 72 0a 20 20 2a 2f   bind_error.  */
10bc0 0a 20 20 63 61 73 65 20 44 42 5f 42 49 4e 44 5f  .  case DB_BIND_
10bd0 46 41 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20  FALLBACK: {.    
10be0 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
10bf0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10c00 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
10c10 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
10c20 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
10c30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10c40 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
10c50 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
10c60 70 44 62 2d 3e 7a 42 69 6e 64 46 61 6c 6c 62 61  pDb->zBindFallba
10c70 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ck ){.        Tc
10c80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10c90 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 69 6e  nterp, pDb->zBin
10ca0 64 46 61 6c 6c 62 61 63 6b 2c 20 28 63 68 61 72  dFallback, (char
10cb0 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
10cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
10cd0 68 61 72 20 2a 7a 43 61 6c 6c 62 61 63 6b 3b 0a  har *zCallback;.
10ce0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
10cf0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
10d00 69 6e 64 46 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  indFallback ){. 
10d10 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
10d20 70 44 62 2d 3e 7a 42 69 6e 64 46 61 6c 6c 62 61  pDb->zBindFallba
10d30 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ck);.      }.   
10d40 20 20 20 7a 43 61 6c 6c 62 61 63 6b 20 3d 20 54     zCallback = T
10d50 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10d60 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
10d70 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43  n);.      if( zC
10d80 61 6c 6c 62 61 63 6b 20 26 26 20 6c 65 6e 3e 30  allback && len>0
10d90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
10da0 3e 7a 42 69 6e 64 46 61 6c 6c 62 61 63 6b 20 3d  >zBindFallback =
10db0 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
10dc0 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
10dd0 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 69 6e 64  emcpy(pDb->zBind
10de0 46 61 6c 6c 62 61 63 6b 2c 20 7a 43 61 6c 6c 62  Fallback, zCallb
10df0 61 63 6b 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ack, len+1);.   
10e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10e10 20 20 70 44 62 2d 3e 7a 42 69 6e 64 46 61 6c 6c    pDb->zBindFall
10e20 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  back = 0;.      
10e30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
10e40 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
10e50 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41  $db busy ?CALLBA
10e60 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
10e70 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
10e80 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51  allback if an SQ
10e90 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65  L statement atte
10ea0 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  mpts to open.  *
10eb0 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62  * a locked datab
10ec0 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
10ed0 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b   case DB_BUSY: {
10ee0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
10ef0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
10f00 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10f10 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c  , 2, objv, "CALL
10f20 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
10f30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10f40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
10f50 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
10f60 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
10f70 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
10f80 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10f90 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 28 63  , pDb->zBusy, (c
10fa0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d  har*)0);.      }
10fb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10fc0 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20    char *zBusy;. 
10fd0 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
10fe0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
10ff0 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  sy ){.        Tc
11000 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
11010 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
11020 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65    zBusy = Tcl_Ge
11030 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11040 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
11050 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26       if( zBusy &
11060 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
11070 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20     pDb->zBusy = 
11080 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
11090 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
110a0 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c  mcpy(pDb->zBusy,
110b0 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a   zBusy, len+1);.
110c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
110d0 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
110e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
110f0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
11100 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  y ){.        pDb
11110 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
11120 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
11130 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
11140 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48  pDb->db, DbBusyH
11150 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
11160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11170 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
11180 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
11190 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
111a0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
111b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24  .  }..  /*     $
111c0 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20  db cache flush. 
111d0 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68   **     $db cach
111e0 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20  e size n.  **.  
111f0 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65  ** Flush the pre
11200 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
11210 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68  cache, or set th
11220 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
11230 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20   of.  ** cached 
11240 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
11250 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45  .  case DB_CACHE
11260 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75  : {.    char *su
11270 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  bCmd;.    int n;
11280 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d  ..    if( objc<=
11290 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
112a0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
112b0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61  rp, 1, objv, "ca
112c0 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f  che option ?arg?
112d0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
112e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
112f0 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54  }.    subCmd = T
11300 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
11310 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20  Obj( objv[2], 0 
11320 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43  );.    if( *subC
11330 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d  md=='f' && strcm
11340 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22  p(subCmd,"flush"
11350 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
11360 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
11370 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
11380 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
11390 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b   objv, "flush");
113a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
113b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
113c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
113d0 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
113e0 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pDb );.      }. 
113f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75     }else if( *su
11400 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72  bCmd=='s' && str
11410 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65  cmp(subCmd,"size
11420 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
11430 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
11440 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
11450 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
11460 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22  , objv, "size n"
11470 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
11480 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
114a0 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d    if( TCL_ERROR=
114b0 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
114c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
114d0 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  3], &n) ){.     
114e0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
114f0 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
11500 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c  cannot convert \
11510 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
11520 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
11530 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
11540 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67  0), "\" to integ
11550 65 72 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  er", (char*)0);.
11560 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11570 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11590 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a       if( n<0 ){.
115a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75 73              flus
115b0 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
115c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
115d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
115e0 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f  }else if( n>MAX_
115f0 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29  PREPARED_STMTS )
11600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  {.            n 
11610 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  = MAX_PREPARED_S
11620 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20  TMTS;.          
11630 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
11640 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20  >maxStmt = n;.  
11650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11670 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11680 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20  t( interp, "bad 
11690 6f 70 74 69 6f 6e 20 5c 22 22 2c 0a 20 20 20 20  option \"",.    
116a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
116b0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
116c0 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74  2],0), "\": must
116d0 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a   be flush or siz
116e0 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63  e",.          (c
116f0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
11700 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11710 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
11720 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
11730 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  $db changes.  **
11740 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
11750 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
11760 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
11770 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
11780 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a   deleted by.  **
11790 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
117a0 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
117b0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
117c0 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  ent, not includi
117d0 6e 67 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e  ng.  ** any chan
117e0 67 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67  ges made by trig
117f0 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20  ger programs..  
11800 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41  */.  case DB_CHA
11810 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
11820 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
11830 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
11840 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11850 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11860 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
11870 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11880 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
11890 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
118a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
118b0 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
118c0 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73  ntObj(pResult, s
118d0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70  qlite3_changes(p
118e0 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
118f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
11900 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a    $db close.  **
11910 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  .  ** Shutdown t
11920 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f  he database.  */
11930 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45  .  case DB_CLOSE
11940 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65  : {.    Tcl_Dele
11950 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
11960 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
11970 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
11980 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  0));.    break;.
11990 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
119a0 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e     $db collate N
119b0 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  AME SCRIPT.  **.
119c0 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
119d0 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
119e0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
119f0 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
11a00 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
11a10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
11a20 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
11a30 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
11a40 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
11a50 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a  e DB_COLLATE: {.
11a60 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a      SqlCollate *
11a70 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68  pCollate;.    ch
11a80 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
11a90 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20  har *zScript;.  
11aa0 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20    int nScript;. 
11ab0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
11ac0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
11ad0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11ae0 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
11af0 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
11b00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
11b20 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
11b30 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
11b40 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70  , 0);.    zScrip
11b50 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
11b60 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
11b70 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20  , &nScript);.   
11b80 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c   pCollate = (Sql
11b90 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c  Collate*)Tcl_All
11ba0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  oc( sizeof(*pCol
11bb0 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20  late) + nScript 
11bc0 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
11bd0 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74  Collate==0 ) ret
11be0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11bf0 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74     pCollate->int
11c00 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
11c10 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78    pCollate->pNex
11c20 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  t = pDb->pCollat
11c30 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  e;.    pCollate-
11c40 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72  >zScript = (char
11c50 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a  *)&pCollate[1];.
11c60 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
11c70 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  e = pCollate;.  
11c80 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74    memcpy(pCollat
11c90 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72  e->zScript, zScr
11ca0 69 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b  ipt, nScript+1);
11cb0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11cc0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
11cd0 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
11ce0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
11cf0 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
11d00 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
11d10 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
11d20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
11d30 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
11d40 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
11d50 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
11d60 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11d70 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11d80 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
11d90 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
11da0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
11db0 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
11dc0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
11dd0 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
11de0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
11df0 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
11e00 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
11e10 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
11e20 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
11e30 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
11e40 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
11e50 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
11e60 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
11e70 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
11e80 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
11e90 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
11ea0 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
11eb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11ec0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
11ed0 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
11ee0 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
11ef0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
11f00 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
11f10 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
11f20 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
11f30 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
11f40 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
11f50 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
11f60 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
11f70 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
11f80 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
11f90 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
11fa0 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
11fb0 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
11fc0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
11fd0 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
11fe0 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
11ff0 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
12000 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
12010 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
12020 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
12030 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
12040 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
12050 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
12060 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
12070 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
12080 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
12090 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
120a0 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
120b0 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
120c0 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
120d0 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
120e0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
120f0 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
12100 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
12110 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
12120 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12130 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
12140 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
12150 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12160 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
12170 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
12180 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
12190 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
121a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
121b0 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
121c0 74 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  t, (char*)0);.  
121d0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
121e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
121f0 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  r *zCommit;.    
12200 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
12210 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
12220 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
12230 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d  _Free(pDb->zComm
12240 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
12250 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c     zCommit = Tcl
12260 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
12270 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
12280 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d  ;.      if( zCom
12290 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  mit && len>0 ){.
122a0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
122b0 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  mmit = Tcl_Alloc
122c0 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
122d0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
122e0 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69  >zCommit, zCommi
122f0 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  t, len+1);.     
12300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12310 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
12320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12330 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
12340 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
12350 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
12360 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12370 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
12380 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
12390 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
123a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
123b0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
123c0 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
123d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
123e0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
123f0 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
12400 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
12410 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
12420 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
12430 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
12440 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
12450 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
12460 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
12470 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
12480 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
12490 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
124a0 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
124b0 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
124c0 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
124d0 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
124e0 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
124f0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
12500 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
12510 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
12520 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
12530 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
12540 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
12550 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
12560 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
12570 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12580 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
12590 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
125a0 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
125b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
125c0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
125d0 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
125e0 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
125f0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
12600 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
12610 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
12620 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
12630 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
12640 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
12650 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
12660 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
12670 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
12680 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
12690 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
126a0 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
126b0 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
126c0 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
126d0 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
126e0 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
126f0 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
12700 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
12710 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
12720 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
12730 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
12740 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
12750 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
12760 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
12770 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
12780 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
12790 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
127a0 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
127b0 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
127c0 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
127d0 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
127e0 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
127f0 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
12800 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
12810 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
12820 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
12830 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
12840 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
12850 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
12860 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
12870 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
12880 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
12890 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
128a0 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
128b0 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
128c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
128d0 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
128e0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
128f0 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
12900 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
12910 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
12920 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
12930 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
12940 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
12950 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
12960 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
12970 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
12980 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
12990 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
129a0 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
129b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
129c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
129d0 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
129e0 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
129f0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
12a00 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
12a10 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
12a20 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
12a30 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
12a40 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
12a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12a60 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
12a70 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
12a80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
12a90 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
12aa0 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
12ab0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12ae0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
12af0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
12b00 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
12b10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12b20 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
12b30 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
12b40 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12b60 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
12b70 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12ba0 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20  bytes in zSep[] 
12bb0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c  */.    int nNull
12bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12bd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12be0 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d  bytes in zNull[]
12bf0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
12c00 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
12c10 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
12c20 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63  atement */.    c
12c30 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20  har *zLine;     
12c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
12c50 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69  single line of i
12c60 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
12c70 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
12c80 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
12c90 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d        /* zLine[]
12ca0 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20   broken up into 
12cb0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63  columns */.    c
12cc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
12cd0 69 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  it;        /* Ho
12ce0 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e  w to commit chan
12cf0 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  ges */.    FILE 
12d00 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
12d10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
12d20 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
12d30 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20  int lineno = 0; 
12d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
12d50 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  ine number of in
12d60 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
12d70 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30  char zLineNum[80
12d80 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ];          /* L
12d90 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74  ine number print
12da0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54   buffer */.    T
12db0 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
12dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
12dd0 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  terp result */..
12de0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12df0 7a 53 65 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20  zSep;.    const 
12e00 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20  char *zNull;.   
12e10 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f   if( objc<5 || o
12e20 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54  bjc>7 ){.      T
12e30 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12e40 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
12e50 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c  .         "CONFL
12e60 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41  ICT-ALGORITHM TA
12e70 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45  BLE FILENAME ?SE
12e80 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
12e90 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20  DICATOR?");.    
12ea0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12eb0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
12ec0 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20  ( objc>=6 ){.   
12ed0 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65     zSep = Tcl_Ge
12ee0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12ef0 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[5], 0);.    
12f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65  }else{.      zSe
12f10 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a  p = "\t";.    }.
12f20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20      if( objc>=7 
12f30 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  ){.      zNull =
12f40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
12f50 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30  omObj(objv[6], 0
12f60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12f70 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a      zNull = "";.
12f80 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c      }.    zConfl
12f90 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ict = Tcl_GetStr
12fa0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12fb0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62  2], 0);.    zTab
12fc0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
12fd0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
12fe0 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ], 0);.    zFile
12ff0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
13000 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c  FromObj(objv[4],
13010 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20   0);.    nSep = 
13020 73 74 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a  strlen30(zSep);.
13030 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c      nNull = strl
13040 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20  en30(zNull);.   
13050 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
13060 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
13070 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
13080 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73  rror: non-null s
13090 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
130a0 64 20 66 6f 72 20 63 6f 70 79 22 2c 0a 20 20 20  d for copy",.   
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
130d0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
130e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
130f0 20 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66   if(strcmp(zConf
13100 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22  lict, "rollback"
13110 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
13120 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
13130 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21  t, "abort"   ) !
13140 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
13150 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
13160 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30  "fail"    ) != 0
13170 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d   &&.       strcm
13180 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67  p(zConflict, "ig
13190 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26  nore"  ) != 0 &&
131a0 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
131b0 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61  Conflict, "repla
131c0 63 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20  ce" ) != 0 ) {. 
131d0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
131e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
131f0 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66  rror: \"", zConf
13200 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  lict,.          
13210 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d    "\", conflict-
13220 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62  algorithm must b
13230 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61  e one of: rollba
13240 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ck, ".          
13250 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20    "abort, fail, 
13260 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61  ignore, or repla
13270 63 65 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ce", (char*)0);.
13280 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13290 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
132a0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
132b0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
132c0 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
132d0 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
132e0 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
132f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13300 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
13310 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
13320 20 22 2c 20 7a 54 61 62 6c 65 2c 20 28 63 68 61   ", zTable, (cha
13330 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
13340 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13350 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
13360 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
13370 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13380 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
13390 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
133a0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
133b0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
133c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
133d0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
133e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
133f0 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
13400 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
13410 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
13420 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
13430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
13440 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
13450 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
13460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
13470 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
13480 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
13490 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
134a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
134b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
134c0 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
134d0 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
134e0 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
134f0 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
13500 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13510 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
13520 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28 63 68  t malloc()", (ch
13530 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
13540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13550 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13560 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
13570 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
13580 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
13590 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
135a0 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
135b0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
135c0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
135d0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
135e0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
135f0 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
13600 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ',';.      zSql[
13610 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
13620 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20  }.    zSql[j++] 
13630 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b  = ')';.    zSql[
13640 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  j] = 0;.    rc =
13650 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
13660 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
13670 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
13680 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
13690 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
136a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
136b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
136c0 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
136d0 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
136e0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
136f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
13700 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
13710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13720 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20  R;.    }.    in 
13730 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
13740 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
13750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
13760 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13770 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
13780 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
13790 22 2c 20 7a 46 69 6c 65 2c 20 28 63 68 61 72 2a  ", zFile, (char*
137a0 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
137b0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
137c0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
137d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
137e0 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
137f0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
13800 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
13810 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
13820 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
13830 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13840 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
13850 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
13860 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
13870 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
13880 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13890 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  ROR;.    }.    (
138a0 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
138b0 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49  c(pDb->db, "BEGI
138c0 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
138d0 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d    zCommit = "COM
138e0 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28  MIT";.    while(
138f0 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f   (zLine = local_
13900 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21  getline(0, in))!
13910 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
13920 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e   *z;.      linen
13930 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c  o++;.      azCol
13940 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20  [0] = zLine;.   
13950 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c     for(i=0, z=zL
13960 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ine; *z; z++){. 
13970 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a         if( *z==z
13980 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d  Sep[0] && strncm
13990 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29  p(z, zSep, nSep)
139a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
139b0 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   *z = 0;.       
139c0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
139d0 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a    if( i<nCol ){.
139e0 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f              azCo
139f0 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b  l[i] = &z[nSep];
13a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
13a10 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20  = nSep-1;.      
13a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
13a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13a40 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20  ( i+1!=nCol ){. 
13a50 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
13a60 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  r;.        int n
13a70 45 72 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Err = strlen30(z
13a80 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20  File) + 200;.   
13a90 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c       zErr = mall
13aa0 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20  oc(nErr);.      
13ab0 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
13ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13ad0 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a  snprintf(nErr, z
13ae0 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Err,.           
13af0 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e    "Error: %s lin
13b00 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
13b10 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
13b20 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
13b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  .             zF
13b40 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f  ile, lineno, nCo
13b50 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
13b60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13b70 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
13b80 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
13b90 20 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72         free(zErr
13ba0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13bb0 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
13bc0 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
13bd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13be0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
13bf0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
13c00 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20         /* check 
13c10 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69  for null data, i
13c20 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75  f so, bind as nu
13c30 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ll */.        if
13c40 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74  ( (nNull>0 && st
13c50 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a  rcmp(azCol[i], z
13c60 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20  Null)==0).      
13c70 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28      || strlen30(
13c80 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 0a 20 20 20  azCol[i])==0.   
13c90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
13ca0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
13cb0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b  ull(pStmt, i+1);
13cc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13cd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13ce0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
13cf0 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d  t, i+1, azCol[i]
13d00 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
13d10 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
13d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13d30 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
13d40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13d50 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
13d60 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
13d70 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
13d80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13d90 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
13da0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13db0 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  p,"Error: ", sql
13dc0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
13dd0 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
13de0 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
13df0 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
13e00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13e10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13e20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20  free(azCol);.   
13e30 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
13e40 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
13e50 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76  e(pStmt);.    (v
13e60 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
13e70 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69  (pDb->db, zCommi
13e80 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  t, 0, 0, 0);..  
13e90 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d    if( zCommit[0]
13ea0 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20   == 'C' ){.     
13eb0 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74   /* success, set
13ec0 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65   result as numbe
13ed0 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
13ee0 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52  ssed */.      pR
13ef0 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
13f00 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
13f10 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49  ;.      Tcl_SetI
13f20 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c  ntObj(pResult, l
13f30 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  ineno);.      rc
13f40 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
13f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66  else{.      /* f
13f60 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c  ailure, append l
13f70 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c  ineno where fail
13f80 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
13f90 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
13fa0 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a  eof(zLineNum), z
13fb0 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e  LineNum,"%d",lin
13fc0 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  eno);.      Tcl_
13fd0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13fe0 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68  erp,", failed wh
13ff0 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  ile processing l
14000 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c  ine: ",zLineNum,
14010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14020 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
14030 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
14040 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
14050 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
14060 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
14070 20 64 65 73 65 72 69 61 6c 69 7a 65 20 3f 2d 6d   deserialize ?-m
14080 61 78 73 69 7a 65 20 4e 3f 20 3f 2d 72 65 61 64  axsize N? ?-read
14090 6f 6e 6c 79 20 42 4f 4f 4c 3f 20 3f 44 41 54 41  only BOOL? ?DATA
140a0 42 41 53 45 3f 20 56 41 4c 55 45 0a 20 20 2a 2a  BASE? VALUE.  **
140b0 0a 20 20 2a 2a 20 52 65 6f 70 65 6e 20 44 41 54  .  ** Reopen DAT
140c0 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 20 22  ABASE (default "
140d0 6d 61 69 6e 22 29 20 75 73 69 6e 67 20 74 68 65  main") using the
140e0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 24 56 41 4c   content in $VAL
140f0 55 45 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  UE.  */.  case D
14100 42 5f 44 45 53 45 52 49 41 4c 49 5a 45 3a 20 7b  B_DESERIALIZE: {
14110 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14120 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
14130 5a 45 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ZE.    Tcl_Appen
14140 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14150 22 4d 45 4d 44 42 20 6e 6f 74 20 61 76 61 69 6c  "MEMDB not avail
14160 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
14170 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ld",.           
14180 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
14190 29 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43  )0);.    rc = TC
141a0 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
141b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
141c0 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
141d0 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 75 65 20  Tcl_Obj *pValue 
141e0 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
141f0 64 20 63 68 61 72 20 2a 70 42 41 3b 0a 20 20 20  d char *pBA;.   
14200 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14210 70 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6c  pData;.    int l
14220 65 6e 2c 20 78 72 63 3b 0a 20 20 20 20 73 71 6c  en, xrc;.    sql
14230 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 53 69 7a  ite3_int64 mxSiz
14240 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  e = 0;.    int i
14250 3b 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61 64  ;.    int isRead
14260 6f 6e 6c 79 20 3d 20 30 3b 0a 0a 0a 20 20 20 20  only = 0;...    
14270 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20  if( objc<3 ){.  
14280 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
14290 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
142a0 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45  objv, "?DATABASE
142b0 3f 20 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20  ? VALUE");.     
142c0 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
142d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
142e0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b    }.    for(i=2;
142f0 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b   i<objc-1; i++){
14300 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
14310 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  r *z = Tcl_GetSt
14320 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20  ring(objv[i]);. 
14330 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
14340 7a 2c 22 2d 6d 61 78 73 69 7a 65 22 29 3d 3d 30  z,"-maxsize")==0
14350 20 26 26 20 69 3c 6f 62 6a 63 2d 32 20 29 7b 0a   && i<objc-2 ){.
14360 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c          rc = Tcl
14370 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
14380 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14390 2b 2b 69 5d 2c 20 26 6d 78 53 69 7a 65 29 3b 0a  ++i], &mxSize);.
143a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
143b0 20 67 6f 74 6f 20 64 65 73 65 72 69 61 6c 69 7a   goto deserializ
143c0 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  e_error;.       
143d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
143e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
143f0 63 6d 70 28 7a 2c 22 2d 72 65 61 64 6f 6e 6c 79  cmp(z,"-readonly
14400 22 29 3d 3d 30 20 26 26 20 69 3c 6f 62 6a 63 2d  ")==0 && i<objc-
14410 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
14420 3d 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  = Tcl_GetBoolean
14430 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
14440 6f 62 6a 76 5b 2b 2b 69 5d 2c 20 26 69 73 52 65  objv[++i], &isRe
14450 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 20  adonly);.       
14460 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 64   if( rc ) goto d
14470 65 73 65 72 69 61 6c 69 7a 65 5f 65 72 72 6f 72  eserialize_error
14480 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
14490 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
144a0 20 20 69 66 28 20 7a 53 63 68 65 6d 61 3d 3d 30    if( zSchema==0
144b0 20 26 26 20 69 3d 3d 6f 62 6a 63 2d 32 20 26 26   && i==objc-2 &&
144c0 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20   z[0]!='-' ){.  
144d0 20 20 20 20 20 20 7a 53 63 68 65 6d 61 20 3d 20        zSchema = 
144e0 7a 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  z;.        conti
144f0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
14500 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14510 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
14520 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20  nown option: ", 
14530 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  z, (char*)0);.  
14540 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
14550 4f 52 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  OR;.      goto d
14560 65 73 65 72 69 61 6c 69 7a 65 5f 65 72 72 6f 72  eserialize_error
14570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 56 61 6c  ;.    }.    pVal
14580 75 65 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31  ue = objv[objc-1
14590 5d 3b 0a 20 20 20 20 70 42 41 20 3d 20 54 63 6c  ];.    pBA = Tcl
145a0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
145b0 6d 4f 62 6a 28 70 56 61 6c 75 65 2c 20 26 6c 65  mObj(pValue, &le
145c0 6e 29 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  n);.    pData = 
145d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
145e0 28 20 6c 65 6e 20 29 3b 0a 20 20 20 20 69 66 28  ( len );.    if(
145f0 20 70 44 61 74 61 3d 3d 30 20 26 26 20 6c 65 6e   pData==0 && len
14600 3e 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >0 ){.      Tcl_
14610 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14620 65 72 70 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  erp, "out of mem
14630 6f 72 79 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  ory", (char*)0);
14640 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
14650 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
14660 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  {.      int flag
14670 73 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e  s;.      if( len
14680 3e 30 20 29 20 6d 65 6d 63 70 79 28 70 44 61 74  >0 ) memcpy(pDat
14690 61 2c 20 70 42 41 2c 20 6c 65 6e 29 3b 0a 20 20  a, pBA, len);.  
146a0 20 20 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e      if( isReadon
146b0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  ly ){.        fl
146c0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 44 45 53  ags = SQLITE_DES
146d0 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43  ERIALIZE_FREEONC
146e0 4c 4f 53 45 20 7c 20 53 51 4c 49 54 45 5f 44 45  LOSE | SQLITE_DE
146f0 53 45 52 49 41 4c 49 5a 45 5f 52 45 41 44 4f 4e  SERIALIZE_READON
14700 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
14710 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d  .        flags =
14720 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c   SQLITE_DESERIAL
14730 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45 20  IZE_FREEONCLOSE 
14740 7c 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41  | SQLITE_DESERIA
14750 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45 3b  LIZE_RESIZEABLE;
14760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78  .      }.      x
14770 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 73  rc = sqlite3_des
14780 65 72 69 61 6c 69 7a 65 28 70 44 62 2d 3e 64 62  erialize(pDb->db
14790 2c 20 7a 53 63 68 65 6d 61 2c 20 70 44 61 74 61  , zSchema, pData
147a0 2c 20 6c 65 6e 2c 20 6c 65 6e 2c 20 66 6c 61 67  , len, len, flag
147b0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 72  s);.      if( xr
147c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  c ){.        Tcl
147d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
147e0 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
147f0 20 73 65 74 20 4d 45 4d 44 42 20 63 6f 6e 74 65   set MEMDB conte
14800 6e 74 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  nt", (char*)0);.
14810 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
14820 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
14830 20 20 20 20 20 20 69 66 28 20 6d 78 53 69 7a 65        if( mxSize
14840 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
14850 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
14860 6f 6c 28 70 44 62 2d 3e 64 62 2c 20 7a 53 63 68  ol(pDb->db, zSch
14870 65 6d 61 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ema,SQLITE_FCNTL
14880 5f 53 49 5a 45 5f 4c 49 4d 49 54 2c 26 6d 78 53  _SIZE_LIMIT,&mxS
14890 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
148a0 20 20 7d 0a 64 65 73 65 72 69 61 6c 69 7a 65 5f    }.deserialize_
148b0 65 72 72 6f 72 3a 0a 23 65 6e 64 69 66 0a 20 20  error:.#endif.  
148c0 20 20 62 72 65 61 6b 3b 20 0a 20 20 7d 0a 0a 20    break; .  }.. 
148d0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
148e0 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
148f0 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20  nsion BOOLEAN.  
14900 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65  **.  ** Turn the
14910 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69   extension loadi
14920 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72  ng feature on or
14930 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66   off.  It if off
14940 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74   by.  ** default
14950 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14960 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
14970 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65  ENSION: {.#ifnde
14980 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
14990 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
149a0 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20   int onoff;.    
149b0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
149c0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
149d0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
149e0 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22   objv, "BOOLEAN"
149f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14a00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14a10 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
14a20 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
14a30 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
14a40 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20  &onoff) ){.     
14a50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14a60 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
14a70 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
14a80 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e  _extension(pDb->
14a90 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  db, onoff);.    
14aa0 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20  break;.#else.   
14ab0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14ac0 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e  t(interp, "exten
14ad0 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20  sion loading is 
14ae0 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f  turned off at co
14af0 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20  mpile-time",.   
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
14b20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14b30 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  R;.#endif.  }.. 
14b40 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
14b50 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20  errorcode.  **. 
14b60 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
14b70 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64  umeric error cod
14b80 65 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72  e that was retur
14b90 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20  ned by the most 
14ba0 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c  recent.  ** call
14bb0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
14bc0 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ()..  */.  case 
14bd0 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a  DB_ERRORCODE: {.
14be0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
14bf0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
14c00 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
14c10 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e  e3_errcode(pDb->
14c20 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  db)));.    break
14c30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
14c40 20 20 20 20 24 64 62 20 65 78 69 73 74 73 20 24      $db exists $
14c50 73 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  sql.  **    $db 
14c60 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20  onecolumn $sql. 
14c70 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65   **.  ** The one
14c80 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73  column method is
14c90 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
14ca0 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e  of:.  **     lin
14cb0 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73  dex [$db eval $s
14cc0 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73  ql] 0.  */.  cas
14cd0 65 20 44 42 5f 45 58 49 53 54 53 3a 0a 20 20 63  e DB_EXISTS:.  c
14ce0 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
14cf0 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
14d00 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *pResult = 0;.  
14d10 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
14d20 73 45 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f  sEval;.    if( o
14d30 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
14d40 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
14d50 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
14d60 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
14d70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14d80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45  ;.    }..    dbE
14d90 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20  valInit(&sEval, 
14da0 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 2c  pDb, objv[2], 0,
14db0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62   0);.    rc = db
14dc0 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
14dd0 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
14de0 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
14df0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
14e00 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
14e10 20 20 70 52 65 73 75 6c 74 20 3d 20 64 62 45 76    pResult = dbEv
14e20 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73  alColumnValue(&s
14e30 45 76 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Eval, 0);.      
14e40 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
14e50 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
14e60 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
14e70 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
14e80 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
14e90 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
14ea0 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  || rc==TCL_OK ){
14eb0 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
14ec0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
14ed0 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 3b 0a  bj(rc==TCL_OK);.
14ee0 20 20 20 20 7d 0a 20 20 20 20 64 62 45 76 61 6c      }.    dbEval
14ef0 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29  Finalize(&sEval)
14f00 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 75 6c  ;.    if( pResul
14f10 74 20 29 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  t ) Tcl_SetObjRe
14f20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
14f30 73 75 6c 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  sult);..    if( 
14f40 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
14f50 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
14f60 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OK;.    }.    br
14f70 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
14f80 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20   **    $db eval 
14f90 3f 6f 70 74 69 6f 6e 73 3f 20 24 73 71 6c 20 3f  ?options? $sql ?
14fa0 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f  array? ?{  ...co
14fb0 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20  de... }?.  **.  
14fc0 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65  ** The SQL state
14fd0 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20  ment in $sql is 
14fe0 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20  evaluated.  For 
14ff0 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61  each row, the va
15000 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c  lues are.  ** pl
15010 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73  aced in elements
15020 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61   of the array na
15030 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20  med "array" and 
15040 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78  ...code... is ex
15050 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20  ecuted..  ** If 
15060 22 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64  "array" and "cod
15070 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20  e" are omitted, 
15080 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b  then no callback
15090 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65   is every invoke
150a0 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
150b0 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  y" is an empty s
150c0 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  tring, then the 
150d0 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65  values are place
150e0 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20  d in variables. 
150f0 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68   ** that have th
15100 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
15110 68 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63  he fields extrac
15120 74 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ted by the query
15130 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
15140 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69 6e 74  _EVAL: {.    int
15150 20 65 76 61 6c 46 6c 61 67 73 20 3d 20 30 3b 0a   evalFlags = 0;.
15160 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15170 7a 4f 70 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  zOpt;.    while(
15180 20 6f 62 6a 63 3e 33 20 26 26 20 28 7a 4f 70 74   objc>3 && (zOpt
15190 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
151a0 28 6f 62 6a 76 5b 32 5d 29 29 21 3d 30 20 26 26  (objv[2]))!=0 &&
151b0 20 7a 4f 70 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b   zOpt[0]=='-' ){
151c0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
151d0 70 28 7a 4f 70 74 2c 20 22 2d 77 69 74 68 6f 75  p(zOpt, "-withou
151e0 74 6e 75 6c 6c 73 22 29 3d 3d 30 20 29 7b 0a 20  tnulls")==0 ){. 
151f0 20 20 20 20 20 20 20 65 76 61 6c 46 6c 61 67 73         evalFlags
15200 20 7c 3d 20 53 51 4c 49 54 45 5f 45 56 41 4c 5f   |= SQLITE_EVAL_
15210 57 49 54 48 4f 55 54 4e 55 4c 4c 53 3b 0a 20 20  WITHOUTNULLS;.  
15220 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
15230 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
15240 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15250 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  p, "unknown opti
15260 6f 6e 3a 20 5c 22 22 2c 20 7a 4f 70 74 2c 20 22  on: \"", zOpt, "
15270 5c 22 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a  \"", (void*)0);.
15280 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
15290 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
152a0 7d 0a 20 20 20 20 20 20 6f 62 6a 63 2d 2d 3b 0a  }.      objc--;.
152b0 20 20 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20        objv++;.  
152c0 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
152d0 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a  <3 || objc>5 ){.
152e0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
152f0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
15300 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
15310 20 20 20 22 3f 4f 50 54 49 4f 4e 53 3f 20 53 51     "?OPTIONS? SQ
15320 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f  L ?ARRAY-NAME? ?
15330 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
15340 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15350 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
15360 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
15370 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74     DbEvalContext
15380 20 73 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63   sEval;.      Tc
15390 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63  l_Obj *pRet = Tc
153a0 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
153b0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
153c0 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
153d0 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61  dbEvalInit(&sEva
153e0 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  l, pDb, objv[2],
153f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 77 68   0, 0);.      wh
15400 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63  ile( TCL_OK==(rc
15410 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26 73   = dbEvalStep(&s
15420 45 76 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20  Eval)) ){.      
15430 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
15440 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
15450 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f     dbEvalRowInfo
15460 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20  (&sEval, &nCol, 
15470 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  0);.        for(
15480 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
15490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
154a0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
154b0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
154c0 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  et, dbEvalColumn
154d0 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 69 29  Value(&sEval, i)
154e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
154f0 20 20 20 7d 0a 20 20 20 20 20 20 64 62 45 76 61     }.      dbEva
15500 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c  lFinalize(&sEval
15510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
15520 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
15530 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
15540 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
15550 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Ret);.        rc
15560 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20   = TCL_OK;.     
15570 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63   }.      Tcl_Dec
15580 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
15590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
155a0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 32    ClientData cd2
155b0 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62 45 76 61  [2];.      DbEva
155c0 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20  lContext *p;.   
155d0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72     Tcl_Obj *pArr
155e0 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 63  ay = 0;.      Tc
155f0 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
15600 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  .      if( objc>
15610 3d 35 20 26 26 20 2a 28 63 68 61 72 20 2a 29 54  =5 && *(char *)T
15620 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15630 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  v[3]) ){.       
15640 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33   pArray = objv[3
15650 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
15660 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
15670 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54  objc-1];.      T
15680 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
15690 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 20 20 20  pScript);..     
156a0 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74   p = (DbEvalCont
156b0 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  ext *)Tcl_Alloc(
156c0 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e  sizeof(DbEvalCon
156d0 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62  text));.      db
156e0 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c  EvalInit(p, pDb,
156f0 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79   objv[2], pArray
15700 2c 20 65 76 61 6c 46 6c 61 67 73 29 3b 0a 0a 20  , evalFlags);.. 
15710 20 20 20 20 20 63 64 32 5b 30 5d 20 3d 20 28 76       cd2[0] = (v
15720 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20 20 63  oid *)p;.      c
15730 64 32 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a 29  d2[1] = (void *)
15740 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20 72  pScript;.      r
15750 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  c = DbEvalNextCm
15760 64 28 63 64 32 2c 20 69 6e 74 65 72 70 2c 20 54  d(cd2, interp, T
15770 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  CL_OK);.    }.  
15780 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
15790 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
157a0 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 4f  function NAME [O
157b0 50 54 49 4f 4e 53 5d 20 53 43 52 49 50 54 0a 20  PTIONS] SCRIPT. 
157c0 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
157d0 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69  a new SQL functi
157e0 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
157f0 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66   Whenever that f
15800 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  unction is.  ** 
15810 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
15820 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
15830 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
15840 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 74 69 6f 6e    **.  ** Option
15850 73 3a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  s:.  **         
15860 2d 2d 61 72 67 63 6f 75 6e 74 20 4e 20 20 20 20  --argcount N    
15870 20 20 20 20 20 20 20 46 75 6e 63 74 69 6f 6e 20         Function 
15880 68 61 73 20 65 78 61 63 74 6c 79 20 4e 20 61 72  has exactly N ar
15890 67 75 6d 65 6e 74 73 0a 20 20 2a 2a 20 20 20 20  guments.  **    
158a0 20 20 20 20 20 2d 2d 64 65 74 65 72 6d 69 6e 69       --determini
158b0 73 74 69 63 20 20 20 20 20 20 20 20 54 68 65 20  stic        The 
158c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65  function is pure
158d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 2d 2d  .  **         --
158e0 64 69 72 65 63 74 6f 6e 6c 79 20 20 20 20 20 20  directonly      
158f0 20 20 20 20 20 50 72 6f 68 69 62 69 74 20 75 73       Prohibit us
15900 65 20 69 6e 73 69 64 65 20 74 72 69 67 67 65 72  e inside trigger
15910 73 20 61 6e 64 20 76 69 65 77 73 0a 20 20 2a 2a  s and views.  **
15920 20 20 20 20 20 20 20 20 20 2d 2d 72 65 74 75 72           --retur
15930 6e 74 79 70 65 20 54 59 50 45 20 20 20 20 20 20  ntype TYPE      
15940 53 70 65 63 69 66 79 20 74 68 65 20 72 65 74 75  Specify the retu
15950 72 6e 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  rn type of the f
15960 75 6e 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 63  unction.  */.  c
15970 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a  ase DB_FUNCTION:
15980 20 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73   {.    int flags
15990 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
159a0 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75      SqlFunc *pFu
159b0 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  nc;.    Tcl_Obj 
159c0 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68  *pScript;.    ch
159d0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
159e0 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20  nt nArg = -1;.  
159f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
15a00 20 65 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f   eType = SQLITE_
15a10 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 62  NULL;.    if( ob
15a20 6a 63 3c 34 20 29 7b 0a 20 20 20 20 20 20 54 63  jc<4 ){.      Tc
15a30 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15a40 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
15a50 22 4e 41 4d 45 20 3f 53 57 49 54 43 48 45 53 3f  "NAME ?SWITCHES?
15a60 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
15a70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15a80 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  R;.    }.    for
15a90 28 69 3d 33 3b 20 69 3c 28 6f 62 6a 63 2d 31 29  (i=3; i<(objc-1)
15aa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
15ab0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63  nst char *z = Tc
15ac0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15ad0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  [i]);.      int 
15ae0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
15af0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 31 20 26  .      if( n>1 &
15b00 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61  & strncmp(z, "-a
15b10 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29  rgcount",n)==0 )
15b20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
15b30 3d 28 6f 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20  =(objc-2) ){.   
15b40 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
15b50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15b60 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
15b70 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c   an argument: ",
15b80 20 7a 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20   z,(char*)0);.  
15b90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
15ba0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
15bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15bc0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
15bd0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
15be0 2b 31 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65  +1], &nArg) ) re
15bf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15c00 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
15c10 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
15c20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15c30 28 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72  (interp, "number
15c40 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75   of arguments mu
15c50 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  st be non-negati
15c60 76 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ve",.           
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
15c90 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15ca0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
15cb0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
15cc0 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
15cd0 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72 6e 63  if( n>1 && strnc
15ce0 6d 70 28 7a 2c 20 22 2d 64 65 74 65 72 6d 69 6e  mp(z, "-determin
15cf0 69 73 74 69 63 22 2c 6e 29 3d 3d 30 20 29 7b 0a  istic",n)==0 ){.
15d00 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
15d10 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
15d20 49 53 54 49 43 3b 0a 20 20 20 20 20 20 7d 65 6c  ISTIC;.      }el
15d30 73 65 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 31  se.      if( n>1
15d40 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22   && strncmp(z, "
15d50 2d 64 69 72 65 63 74 6f 6e 6c 79 22 2c 6e 29 3d  -directonly",n)=
15d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  =0 ){.        fl
15d70 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 44 49  ags |= SQLITE_DI
15d80 52 45 43 54 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  RECTONLY;.      
15d90 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  }else.      if( 
15da0 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 7a  n>1 && strncmp(z
15db0 2c 20 22 2d 72 65 74 75 72 6e 74 79 70 65 22 2c  , "-returntype",
15dc0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
15dd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
15de0 54 79 70 65 5b 5d 20 3d 20 7b 22 69 6e 74 65 67  Type[] = {"integ
15df0 65 72 22 2c 20 22 72 65 61 6c 22 2c 20 22 74 65  er", "real", "te
15e00 78 74 22 2c 20 22 62 6c 6f 62 22 2c 20 22 61 6e  xt", "blob", "an
15e10 79 22 2c 20 30 7d 3b 0a 20 20 20 20 20 20 20 20  y", 0};.        
15e20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 49  assert( SQLITE_I
15e30 4e 54 45 47 45 52 3d 3d 31 20 26 26 20 53 51 4c  NTEGER==1 && SQL
15e40 49 54 45 5f 46 4c 4f 41 54 3d 3d 32 20 26 26 20  ITE_FLOAT==2 && 
15e50 53 51 4c 49 54 45 5f 54 45 58 54 3d 3d 33 20 29  SQLITE_TEXT==3 )
15e60 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15e70 28 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3d 3d 34  ( SQLITE_BLOB==4
15e80 20 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d   && SQLITE_NULL=
15e90 3d 35 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =5 );.        if
15ea0 28 20 69 3d 3d 28 6f 62 6a 63 2d 32 29 20 29 7b  ( i==(objc-2) ){
15eb0 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
15ec0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15ed0 72 70 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75  rp, "option requ
15ee0 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
15ef0 3a 20 22 2c 20 7a 2c 28 63 68 61 72 2a 29 30 29  : ", z,(char*)0)
15f00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
15f10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15f30 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i++;.        if(
15f40 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
15f50 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15f60 76 5b 69 5d 2c 20 61 7a 54 79 70 65 2c 20 22 74  v[i], azType, "t
15f70 79 70 65 22 2c 20 30 2c 20 26 65 54 79 70 65 29  ype", 0, &eType)
15f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
15f90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15fb0 20 20 65 54 79 70 65 2b 2b 3b 0a 20 20 20 20 20    eType++;.     
15fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15fd0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15fe0 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70  (interp, "bad op
15ff0 74 69 6f 6e 20 5c 22 22 2c 20 7a 2c 0a 20 20 20  tion \"", z,.   
16000 20 20 20 20 20 20 20 20 20 22 5c 22 3a 20 6d 75           "\": mu
16010 73 74 20 62 65 20 2d 61 72 67 63 6f 75 6e 74 2c  st be -argcount,
16020 20 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c   -deterministic,
16030 20 2d 64 69 72 65 63 74 6f 6e 6c 79 2c 22 0a 20   -directonly,". 
16040 20 20 20 20 20 20 20 20 20 20 20 22 20 6f 72 20             " or 
16050 2d 72 65 74 75 72 6e 74 79 70 65 22 2c 20 28 63  -returntype", (c
16060 68 61 72 2a 29 30 0a 20 20 20 20 20 20 20 20 29  har*)0.        )
16070 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
16080 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16090 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
160a0 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62  Script = objv[ob
160b0 6a 63 2d 31 5d 3b 0a 20 20 20 20 7a 4e 61 6d 65  jc-1];.    zName
160c0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
160d0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
160e0 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d   0);.    pFunc =
160f0 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62   findSqlFunc(pDb
16100 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
16110 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74  ( pFunc==0 ) ret
16120 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16130 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53     if( pFunc->pS
16140 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54  cript ){.      T
16150 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
16160 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
16170 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63  .    }.    pFunc
16180 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72  ->pScript = pScr
16190 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  ipt;.    Tcl_Inc
161a0 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
161b0 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75  t);.    pFunc->u
161c0 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66  seEvalObjv = saf
161d0 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69  eToUseEvalObjv(i
161e0 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b  nterp, pScript);
161f0 0a 20 20 20 20 70 46 75 6e 63 2d 3e 65 54 79 70  .    pFunc->eTyp
16200 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 72  e = eType;.    r
16210 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
16220 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d  te_function(pDb-
16230 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  >db, zName, nArg
16240 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  , flags,.       
16250 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75   pFunc, tclSqlFu
16260 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nc, 0, 0);.    i
16270 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16280 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
16290 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
162a0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
162b0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
162c0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
162d0 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
162e0 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ILE);.    }.    
162f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
16300 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
16310 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c  crblob ?-readonl
16320 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
16330 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a  LUMN ROWID.  */.
16340 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c    case DB_INCRBL
16350 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c  OB: {.#ifdef SQL
16360 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
16370 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  B.    Tcl_Append
16380 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
16390 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61  incrblob not ava
163a0 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
163b0 75 69 6c 64 22 2c 20 28 63 68 61 72 2a 29 30 29  uild", (char*)0)
163c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
163d0 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
163e0 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
163f0 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
16400 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69  char *zDb = "mai
16410 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  n";.    const ch
16420 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
16430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
16440 75 6d 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  umn;.    Tcl_Wid
16450 65 49 6e 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20  eInt iRow;..    
16460 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
16470 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f   -readonly optio
16480 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a  n */.    if( obj
16490 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63  c>3 && strcmp(Tc
164a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
164b0 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  [2]), "-readonly
164c0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
164d0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
164e0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
164f0 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(5+isReadonl
16500 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69  y) && objc!=(6+i
16510 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20  sReadonly) ){.  
16520 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
16530 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
16540 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c  objv, "?-readonl
16550 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f  y? ?DB? TABLE CO
16560 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20  LUMN ROWID");.  
16570 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16580 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
16590 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73   if( objc==(6+is
165a0 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
165b0 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
165c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
165d0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c  .    }.    zTabl
165e0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
165f0 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b  g(objv[objc-3]);
16600 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54  .    zColumn = T
16610 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16620 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20  v[objc-2]);.    
16630 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  rc = Tcl_GetWide
16640 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16650 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c  p, objv[objc-1],
16660 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66   &iRow);..    if
16670 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
16680 20 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74        rc = creat
16690 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
166a0 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65  (.          inte
166b0 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54  rp, pDb, zDb, zT
166c0 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 28  able, zColumn, (
166d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69 52  sqlite3_int64)iR
166e0 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20  ow, isReadonly. 
166f0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
16700 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
16710 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
16720 20 20 20 24 64 62 20 69 6e 74 65 72 72 75 70 74     $db interrupt
16730 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72  .  **.  ** Inter
16740 72 75 70 74 20 74 68 65 20 65 78 65 63 75 74 69  rupt the executi
16750 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d  on of the inner-
16760 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72  most SQL interpr
16770 65 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a  eter.  This.  **
16780 20 63 61 75 73 65 73 20 74 68 65 20 53 51 4c 20   causes the SQL 
16790 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74  statement to ret
167a0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20  urn an error of 
167b0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
167c0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
167d0 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20  _INTERRUPT: {.  
167e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
167f0 75 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  upt(pDb->db);.  
16800 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
16810 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
16820 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e  nullvalue ?STRIN
16830 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  G?.  **.  ** Cha
16840 6e 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68  nge text used wh
16850 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20  en a NULL comes 
16860 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61  back from the da
16870 74 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49  tabase. If ?STRI
16880 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  NG?.  ** is not 
16890 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68  present, then th
168a0 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67  e current string
168b0 20 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69   used for NULL i
168c0 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
168d0 20 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72   If STRING is pr
168e0 65 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49  esent, then STRI
168f0 4e 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  NG is returned..
16900 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
16910 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b   DB_NULLVALUE: {
16920 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
16930 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
16940 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
16950 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
16960 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55   objv, "NULLVALU
16970 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E");.      retur
16980 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16990 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d   }.    if( objc=
169a0 3d 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =3 ){.      int 
169b0 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20  len;.      char 
169c0 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74  *zNull = Tcl_Get
169d0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
169e0 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
169f0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75      if( pDb->zNu
16a00 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ll ){.        Tc
16a10 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
16a20 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
16a30 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c    if( zNull && l
16a40 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
16a50 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c  pDb->zNull = Tcl
16a60 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
16a70 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
16a80 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e  y(pDb->zNull, zN
16a90 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  ull, len);.     
16aa0 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65     pDb->zNull[le
16ab0 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
16ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16ad0 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a  pDb->zNull = 0;.
16ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16af0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
16b00 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
16b10 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d  ewStringObj(pDb-
16b20 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20  >zNull, -1));.  
16b30 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
16b40 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
16b50 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
16b60 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  d.  **.  ** Retu
16b70 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
16b80 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
16b90 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
16ba0 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
16bb0 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
16bc0 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
16bd0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
16be0 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57  esult;.    Tcl_W
16bf0 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20  ideInt rowid;.  
16c00 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
16c10 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
16c20 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
16c30 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
16c40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16c50 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
16c60 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
16c70 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
16c80 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
16c90 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
16ca0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
16cb0 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57  p);.    Tcl_SetW
16cc0 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  ideIntObj(pResul
16cd0 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62  t, rowid);.    b
16ce0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
16cf0 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43    ** The DB_ONEC
16d00 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20  OLUMN method is 
16d10 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65  implemented toge
16d20 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 58 49  ther with DB_EXI
16d30 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  STS..  */..  /* 
16d40 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20     $db progress 
16d50 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  ?N CALLBACK?.  *
16d60 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  *.  ** Invoke th
16d70 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
16d80 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
16d90 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
16da0 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
16db0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
16dc0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
16dd0 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
16de0 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
16df0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
16e00 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
16e10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16e20 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
16e30 50 72 6f 67 72 65 73 73 2c 20 28 63 68 61 72 2a  Progress, (char*
16e40 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
16e50 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
16e60 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =4 ){.      char
16e70 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20   *zProgress;.   
16e80 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
16e90 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69    int N;.      i
16ea0 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
16eb0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
16ec0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e  erp, objv[2], &N
16ed0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
16ee0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16ef0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66       };.      if
16f00 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
16f10 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
16f20 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72  Free(pDb->zProgr
16f30 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ess);.      }.  
16f40 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20      zProgress = 
16f50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
16f60 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c  mObj(objv[3], &l
16f70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
16f80 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e  Progress && len>
16f90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
16fa0 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63  ->zProgress = Tc
16fb0 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
16fc0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
16fd0 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  py(pDb->zProgres
16fe0 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65  s, zProgress, le
16ff0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
17000 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
17010 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  zProgress = 0;. 
17020 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
17030 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
17040 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20  ESS_CALLBACK.   
17050 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
17060 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
17070 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
17080 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
17090 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
170a0 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
170b0 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61   N, DbProgressHa
170c0 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
170d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
170e0 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
170f0 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
17100 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
17110 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
17120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
17130 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
17140 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
17150 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  "N CALLBACK");. 
17160 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
17170 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
17180 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
17190 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65  *    $db profile
171a0 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
171b0 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
171c0 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
171d0 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
171e0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65 61 63  outine after eac
171f0 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
17200 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75    ** that has ru
17210 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20  n.  The text of 
17220 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20  the SQL and the 
17230 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65  amount of elapse
17240 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61   time are.  ** a
17250 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
17260 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73  ACK before the s
17270 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20  cript is run..  
17280 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
17290 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  FILE: {.    if( 
172a0 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
172b0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
172c0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
172d0 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
172e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
172f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
17300 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
17310 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
17320 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
17330 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
17340 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
17350 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 28 63 68  b->zProfile, (ch
17360 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
17370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17380 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
17390 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
173a0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
173b0 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
173c0 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
173d0 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20  >zProfile);.    
173e0 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69    }.      zProfi
173f0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
17400 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
17410 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
17420 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20  if( zProfile && 
17430 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
17440 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
17450 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
17460 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
17470 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66  emcpy(pDb->zProf
17480 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c  ile, zProfile, l
17490 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
174a0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
174b0 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20  >zProfile = 0;. 
174c0 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
174d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
174e0 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
174f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
17500 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26  LOATING_POINT) &
17510 26 20 5c 0a 20 20 20 20 21 64 65 66 69 6e 65 64  & \.    !defined
17520 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50  (SQLITE_OMIT_DEP
17530 52 45 43 41 54 45 44 29 0a 20 20 20 20 20 20 69  RECATED).      i
17540 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
17550 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
17560 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
17570 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17580 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64  3_profile(pDb->d
17590 62 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64  b, DbProfileHand
175a0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
175b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
175c0 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
175d0 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
175e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
175f0 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
17600 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
17610 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59     $db rekey KEY
17620 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67  .  **.  ** Chang
17630 65 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e  e the encryption
17640 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72   key on the curr
17650 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62  ently open datab
17660 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
17670 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 23 69 66   DB_REKEY: {.#if
17680 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17690 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64  HAS_CODEC) && !d
176a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
176b0 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43  IT_CODEC_FROM_TC
176c0 4c 29 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  L).    int nKey;
176d0 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b  .    void *pKey;
176e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
176f0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
17700 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
17710 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
17720 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20  v, "KEY");.     
17730 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17740 52 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66  R;.    }.#if def
17750 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
17760 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e  CODEC) && !defin
17770 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
17780 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20  ODEC_FROM_TCL). 
17790 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
177a0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
177b0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79  j(objv[2], &nKey
177c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
177d0 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64  te3_rekey(pDb->d
177e0 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, pKey, nKey);.
177f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
17800 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
17810 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
17820 69 74 65 33 5f 65 72 72 73 74 72 28 72 63 29 2c  ite3_errstr(rc),
17830 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
17840 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
17850 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
17860 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
17870 20 2f 2a 20 20 20 20 24 64 62 20 72 65 73 74 6f   /*    $db resto
17880 72 65 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49  re ?DATABASE? FI
17890 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a  LENAME.  **.  **
178a0 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
178b0 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
178c0 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
178d0 74 68 65 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  the content.  **
178e0 20 6f 66 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74   of FILENAME int
178f0 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61  o the local data
17900 62 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64  base DATABASE (d
17910 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e  efault: "main").
17920 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
17930 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63  RESTORE: {.    c
17940 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46  onst char *zSrcF
17950 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
17960 68 61 72 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20  har *zDestDb;.  
17970 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b    sqlite3 *pSrc;
17980 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
17990 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
179a0 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d    int nTimeout =
179b0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   0;..    if( obj
179c0 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44  c==3 ){.      zD
179d0 65 73 74 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  estDb = "main";.
179e0 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d        zSrcFile =
179f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17a00 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c  bjv[2]);.    }el
17a10 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
17a20 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20  {.      zDestDb 
17a30 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
17a40 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
17a50 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47  zSrcFile = Tcl_G
17a60 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
17a70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17a80 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
17a90 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
17aa0 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45  objv, "?DATABASE
17ab0 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20  ? FILENAME");.  
17ac0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17ad0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
17ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
17af0 6e 5f 76 32 28 7a 53 72 63 46 69 6c 65 2c 20 26  n_v2(zSrcFile, &
17b00 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17b20 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
17b30 4e 4c 59 20 7c 20 70 44 62 2d 3e 6f 70 65 6e 46  NLY | pDb->openF
17b40 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66  lags, 0);.    if
17b50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17b60 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
17b70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17b80 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73  , "cannot open s
17b90 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20  ource database: 
17ba0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
17bb0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72  lite3_errmsg(pSr
17bc0 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
17bd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
17be0 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
17bf0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63  ;.    }.    pBac
17c10 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
17c20 63 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64  ckup_init(pDb->d
17c30 62 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63  b, zDestDb, pSrc
17c40 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69  , "main");.    i
17c50 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
17c60 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
17c70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17c80 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
17c90 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
17ca0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
17cb0 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
17cc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17cd0 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
17ce0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17cf0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
17d00 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
17d10 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
17d20 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
17d30 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
17d40 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
17d50 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
17d60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17d70 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
17d80 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b     if( nTimeout+
17d90 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a  + >= 3 ) break;.
17da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17db0 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20  sleep(100);.    
17dc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
17dd0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
17de0 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
17df0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17e00 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
17e10 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
17e20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
17e30 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d  LITE_BUSY || rc=
17e40 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29  =SQLITE_LOCKED )
17e50 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
17e60 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
17e70 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64   "restore failed
17e80 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  : source databas
17e90 65 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20  e busy",.       
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
17ec0 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
17ed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17ee0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17ef0 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
17f00 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  ore failed: ",. 
17f10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17f20 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
17f30 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
17f40 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
17f50 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
17f60 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
17f70 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
17f80 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
17f90 20 24 64 62 20 73 65 72 69 61 6c 69 7a 65 20 3f   $db serialize ?
17fa0 44 41 54 41 42 41 53 45 3f 0a 20 20 2a 2a 0a 20  DATABASE?.  **. 
17fb0 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 72   ** Return a ser
17fc0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 61 20  ialization of a 
17fd0 64 61 74 61 62 61 73 65 2e 20 20 0a 20 20 2a 2f  database.  .  */
17fe0 0a 20 20 63 61 73 65 20 44 42 5f 53 45 52 49 41  .  case DB_SERIA
17ff0 4c 49 5a 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20  LIZE: {.#ifndef 
18000 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
18010 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 54 63  SERIALIZE.    Tc
18020 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18030 6e 74 65 72 70 2c 20 22 4d 45 4d 44 42 20 6e 6f  nterp, "MEMDB no
18040 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
18050 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20  his build",.    
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
18080 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
18090 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
180a0 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 20 3d 20  char *zSchema = 
180b0 6f 62 6a 63 3e 3d 33 20 3f 20 54 63 6c 5f 47 65  objc>=3 ? Tcl_Ge
180c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
180d0 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 73   : "main";.    s
180e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20  qlite3_int64 sz 
180f0 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
18100 64 20 63 68 61 72 20 2a 70 44 61 74 61 3b 0a 20  d char *pData;. 
18110 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
18120 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
18130 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18140 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
18150 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f  bjv, "?DATABASE?
18160 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  ");.      rc = T
18170 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
18180 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
18190 65 65 64 46 72 65 65 3b 0a 20 20 20 20 20 20 70  eedFree;.      p
181a0 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 73  Data = sqlite3_s
181b0 65 72 69 61 6c 69 7a 65 28 70 44 62 2d 3e 64 62  erialize(pDb->db
181c0 2c 20 7a 53 63 68 65 6d 61 2c 20 26 73 7a 2c 20  , zSchema, &sz, 
181d0 53 51 4c 49 54 45 5f 53 45 52 49 41 4c 49 5a 45  SQLITE_SERIALIZE
181e0 5f 4e 4f 43 4f 50 59 29 3b 0a 20 20 20 20 20 20  _NOCOPY);.      
181f0 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
18200 20 20 20 20 20 6e 65 65 64 46 72 65 65 20 3d 20       needFree = 
18210 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
18220 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20          pData = 
18230 73 71 6c 69 74 65 33 5f 73 65 72 69 61 6c 69 7a  sqlite3_serializ
18240 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 63 68 65  e(pDb->db, zSche
18250 6d 61 2c 20 26 73 7a 2c 20 30 29 3b 0a 20 20 20  ma, &sz, 0);.   
18260 20 20 20 20 20 6e 65 65 64 46 72 65 65 20 3d 20       needFree = 
18270 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
18280 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18290 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
182a0 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70 44  wByteArrayObj(pD
182b0 61 74 61 2c 73 7a 29 29 3b 0a 20 20 20 20 20 20  ata,sz));.      
182c0 69 66 28 20 6e 65 65 64 46 72 65 65 20 29 20 73  if( needFree ) s
182d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
182e0 61 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  a);.    }.#endif
182f0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
18300 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
18310 64 62 20 73 74 61 74 75 73 20 28 73 74 65 70 7c  db status (step|
18320 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 7c 76  sort|autoindex|v
18330 6d 73 74 65 70 29 0a 20 20 2a 2a 0a 20 20 2a 2a  mstep).  **.  **
18340 20 44 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f   Display SQLITE_
18350 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
18360 43 41 4e 5f 53 54 45 50 20 6f 72 0a 20 20 2a 2a  CAN_STEP or.  **
18370 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
18380 55 53 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20  US_SORT for the 
18390 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c  most recent eval
183a0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
183b0 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69  _STATUS: {.    i
183c0 6e 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt v;.    const 
183d0 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69  char *zOp;.    i
183e0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
183f0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18400 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
18410 6f 62 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72  objv, "(step|sor
18420 74 7c 61 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a  t|autoindex)");.
18430 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
18440 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
18450 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53    zOp = Tcl_GetS
18460 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
18470 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
18480 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29  Op, "step")==0 )
18490 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
184a0 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73  >nStep;.    }els
184b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70  e if( strcmp(zOp
184c0 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a  , "sort")==0 ){.
184d0 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e        v = pDb->n
184e0 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Sort;.    }else 
184f0 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20  if( strcmp(zOp, 
18500 22 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20  "autoindex")==0 
18510 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62  ){.      v = pDb
18520 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  ->nIndex;.    }e
18530 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
18540 4f 70 2c 20 22 76 6d 73 74 65 70 22 29 3d 3d 30  Op, "vmstep")==0
18550 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44   ){.      v = pD
18560 62 2d 3e 6e 56 4d 53 74 65 70 3b 0a 20 20 20 20  b->nVMStep;.    
18570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
18580 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18590 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20  terp,.          
185a0 20 20 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a    "bad argument:
185b0 20 73 68 6f 75 6c 64 20 62 65 20 61 75 74 6f 69   should be autoi
185c0 6e 64 65 78 2c 20 73 74 65 70 2c 20 73 6f 72 74  ndex, step, sort
185d0 20 6f 72 20 76 6d 73 74 65 70 22 2c 0a 20 20 20   or vmstep",.   
185e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
185f0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
18600 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
18610 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
18620 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18630 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
18640 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
18650 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
18660 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c  $db timeout MILL
18670 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20  ESECONDS.  **.  
18680 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65  ** Delay for the
18690 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
186a0 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65  seconds specifie
186b0 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73  d when a file is
186c0 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20   locked..  */.  
186d0 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a  case DB_TIMEOUT:
186e0 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20   {.    int ms;. 
186f0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
18700 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
18710 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
18720 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49   2, objv, "MILLI
18730 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20  SECONDS");.     
18740 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18750 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
18760 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
18770 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
18780 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
18790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
187a0 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
187b0 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d  meout(pDb->db, m
187c0 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  s);.    break;. 
187d0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
187e0 20 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e    $db total_chan
187f0 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ges.  **.  ** Re
18800 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18810 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
18820 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65  e modified, inse
18830 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64  rted, or deleted
18840 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
18850 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
18860 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a  was created..  *
18870 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41  /.  case DB_TOTA
18880 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  L_CHANGES: {.   
18890 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
188a0 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
188b0 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
188c0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
188d0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
188e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
188f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
18900 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
18910 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
18920 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
18930 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
18940 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  lt, sqlite3_tota
18950 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  l_changes(pDb->d
18960 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
18970 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
18980 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b   trace ?CALLBACK
18990 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
189a0 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
189b0 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
189c0 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72  BACK routine for
189d0 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
189e0 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ent.  ** that is
189f0 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
18a00 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
18a10 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43  is appended to C
18a20 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20  ALLBACK before. 
18a30 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74   ** it is execut
18a40 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
18a50 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20  DB_TRACE: {.    
18a60 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
18a70 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18a80 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
18a90 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
18aa0 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
18ab0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
18ac0 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
18ad0 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
18ae0 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
18af0 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
18b00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18b10 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 28 63 68  pDb->zTrace, (ch
18b20 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
18b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18b40 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20   char *zTrace;. 
18b50 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
18b60 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
18b70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
18b80 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
18b90 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ace);.      }.  
18ba0 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c      zTrace = Tcl
18bb0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
18bc0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
18bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61  ;.      if( zTra
18be0 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ce && len>0 ){. 
18bf0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
18c00 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ce = Tcl_Alloc( 
18c10 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
18c20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
18c30 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c  Trace, zTrace, l
18c40 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
18c50 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
18c60 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  >zTrace = 0;.   
18c70 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
18c80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
18c90 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
18ca0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
18cb0 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26 26 20  ATING_POINT) && 
18cc0 5c 0a 20 20 20 20 21 64 65 66 69 6e 65 64 28 53  \.    !defined(S
18cd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
18ce0 43 41 54 45 44 29 0a 20 20 20 20 20 20 69 66 28  CATED).      if(
18cf0 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
18d00 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
18d10 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
18d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
18d30 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54  ace(pDb->db, DbT
18d40 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  raceHandler, pDb
18d50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18d60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
18d70 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30  trace(pDb->db, 0
18d80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
18d90 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
18da0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
18db0 20 20 20 24 64 62 20 74 72 61 63 65 5f 76 32 20     $db trace_v2 
18dc0 3f 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b  ?CALLBACK? ?MASK
18dd0 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
18de0 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
18df0 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
18e00 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72  BACK routine for
18e10 20 65 61 63 68 20 74 72 61 63 65 20 65 76 65 6e   each trace even
18e20 74 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20  t.  ** matching 
18e30 74 68 65 20 6d 61 73 6b 20 74 68 61 74 20 69 73  the mask that is
18e40 20 67 65 6e 65 72 61 74 65 64 2e 20 20 54 68 65   generated.  The
18e50 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
18e60 61 70 70 65 6e 64 65 64 20 74 6f 0a 20 20 2a 2a  appended to.  **
18e70 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65   CALLBACK before
18e80 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e   it is executed.
18e90 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
18ea0 54 52 41 43 45 5f 56 32 3a 20 7b 0a 20 20 20 20  TRACE_V2: {.    
18eb0 69 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20  if( objc>4 ){.  
18ec0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18ed0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
18ee0 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
18ef0 3f 20 3f 4d 41 53 4b 3f 22 29 3b 0a 20 20 20 20  ? ?MASK?");.    
18f00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18f10 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
18f20 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
18f30 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
18f40 63 65 56 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ceV2 ){.        
18f50 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18f60 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54  (interp, pDb->zT
18f70 72 61 63 65 56 32 2c 20 28 63 68 61 72 2a 29 30  raceV2, (char*)0
18f80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
18fa0 20 2a 7a 54 72 61 63 65 56 32 3b 0a 20 20 20 20   *zTraceV2;.    
18fb0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
18fc0 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 77 4d 61   Tcl_WideInt wMa
18fd0 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  sk = 0;.      if
18fe0 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
18ff0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
19000 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
19010 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
19020 20 20 20 22 73 74 61 74 65 6d 65 6e 74 22 2c 20     "statement", 
19030 22 70 72 6f 66 69 6c 65 22 2c 20 22 72 6f 77 22  "profile", "row"
19040 2c 20 22 63 6c 6f 73 65 22 2c 20 30 0a 20 20 20  , "close", 0.   
19050 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
19060 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20  enum TTYPE_enum 
19070 7b 0a 20 20 20 20 20 20 20 20 20 20 54 54 59 50  {.          TTYP
19080 45 5f 53 54 4d 54 2c 20 54 54 59 50 45 5f 50 52  E_STMT, TTYPE_PR
19090 4f 46 49 4c 45 2c 20 54 54 59 50 45 5f 52 4f 57  OFILE, TTYPE_ROW
190a0 2c 20 54 54 59 50 45 5f 43 4c 4f 53 45 0a 20 20  , TTYPE_CLOSE.  
190b0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20        };.       
190c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
190d0 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
190e0 4c 69 73 74 4f 62 6a 4c 65 6e 67 74 68 28 69 6e  ListObjLength(in
190f0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
19100 6c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  len) ){.        
19110 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19120 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
19130 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
19140 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
19150 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
19160 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Obj;.          i
19170 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20  nt ttype;.      
19180 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
19190 54 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64 65 78  Tcl_ListObjIndex
191a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
191b0 2c 20 69 2c 20 26 70 4f 62 6a 29 20 29 7b 0a 20  , i, &pObj) ){. 
191c0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
191d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
191e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
191f0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
19200 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
19210 70 2c 20 70 4f 62 6a 2c 20 54 54 59 50 45 5f 73  p, pObj, TTYPE_s
19220 74 72 73 2c 20 22 74 72 61 63 65 20 74 79 70 65  trs, "trace type
19230 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 21       0, &ttype)!
19260 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
19270 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49         Tcl_WideI
19280 6e 74 20 77 54 79 70 65 3b 0a 20 20 20 20 20 20  nt wType;.      
19290 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
192a0 45 72 72 6f 72 20 3d 20 54 63 6c 5f 44 75 70 6c  Error = Tcl_Dupl
192b0 69 63 61 74 65 4f 62 6a 28 54 63 6c 5f 47 65 74  icateObj(Tcl_Get
192c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
192d0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
192e0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
192f0 28 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20  (pError);.      
19300 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b        if( TCL_OK
19310 3d 3d 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ==Tcl_GetWideInt
19320 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19330 70 4f 62 6a 2c 20 26 77 54 79 70 65 29 20 29 7b  pObj, &wType) ){
19340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
19350 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
19360 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  pError);.       
19370 20 20 20 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20         wMask |= 
19380 77 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  wType;.         
19390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
193a0 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
193b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
193c0 20 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20   pError);.      
193d0 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
193e0 52 65 66 43 6f 75 6e 74 28 70 45 72 72 6f 72 29  RefCount(pError)
193f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19400 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
19420 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
19430 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69  .            swi
19440 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45  tch( (enum TTYPE
19450 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20  _enum)ttype ){. 
19460 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
19470 65 20 54 54 59 50 45 5f 53 54 4d 54 3a 20 20 20  e TTYPE_STMT:   
19480 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45   wMask |= SQLITE
19490 5f 54 52 41 43 45 5f 53 54 4d 54 3b 20 20 20 20  _TRACE_STMT;    
194a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
194b0 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
194c0 50 52 4f 46 49 4c 45 3a 20 77 4d 61 73 6b 20 7c  PROFILE: wMask |
194d0 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50  = SQLITE_TRACE_P
194e0 52 4f 46 49 4c 45 3b 20 62 72 65 61 6b 3b 0a 20  ROFILE; break;. 
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
19500 65 20 54 54 59 50 45 5f 52 4f 57 3a 20 20 20 20  e TTYPE_ROW:    
19510 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45   wMask |= SQLITE
19520 5f 54 52 41 43 45 5f 52 4f 57 3b 20 20 20 20 20  _TRACE_ROW;     
19530 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
19540 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
19550 43 4c 4f 53 45 3a 20 20 20 77 4d 61 73 6b 20 7c  CLOSE:   wMask |
19560 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43  = SQLITE_TRACE_C
19570 4c 4f 53 45 3b 20 20 20 62 72 65 61 6b 3b 0a 20  LOSE;   break;. 
19580 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
19590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
195a0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
195b0 20 20 20 20 20 20 20 20 77 4d 61 73 6b 20 3d 20          wMask = 
195c0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d  SQLITE_TRACE_STM
195d0 54 3b 20 2f 2a 20 75 73 65 20 74 68 65 20 22 6c  T; /* use the "l
195e0 65 67 61 63 79 22 20 64 65 66 61 75 6c 74 20 2a  egacy" default *
195f0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
19600 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56  if( pDb->zTraceV
19610 32 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  2 ){.        Tcl
19620 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
19630 65 56 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eV2);.      }.  
19640 20 20 20 20 7a 54 72 61 63 65 56 32 20 3d 20 54      zTraceV2 = T
19650 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
19660 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
19670 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54  n);.      if( zT
19680 72 61 63 65 56 32 20 26 26 20 6c 65 6e 3e 30 20  raceV2 && len>0 
19690 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
196a0 7a 54 72 61 63 65 56 32 20 3d 20 54 63 6c 5f 41  zTraceV2 = Tcl_A
196b0 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
196c0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
196d0 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 7a  pDb->zTraceV2, z
196e0 54 72 61 63 65 56 32 2c 20 6c 65 6e 2b 31 29 3b  TraceV2, len+1);
196f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19700 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
19710 65 56 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  eV2 = 0;.      }
19720 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
19730 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
19740 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
19750 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
19760 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69  G_POINT).      i
19770 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  f( pDb->zTraceV2
19780 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
19790 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
197a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
197b0 33 5f 74 72 61 63 65 5f 76 32 28 70 44 62 2d 3e  3_trace_v2(pDb->
197c0 64 62 2c 20 28 75 6e 73 69 67 6e 65 64 29 77 4d  db, (unsigned)wM
197d0 61 73 6b 2c 20 44 62 54 72 61 63 65 56 32 48 61  ask, DbTraceV2Ha
197e0 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
197f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19800 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f    sqlite3_trace_
19810 76 32 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  v2(pDb->db, 0, 0
19820 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
19830 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
19840 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
19850 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
19860 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
19870 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
19880 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  ive] SCRIPT.  **
19890 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  .  ** Start a ne
198a0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  w transaction (i
198b0 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
198c0 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73  eady in the mids
198d0 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e  t of a.  ** tran
198e0 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65  saction) and exe
198f0 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72  cute the TCL scr
19900 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74  ipt SCRIPT.  Aft
19910 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63  er SCRIPT.  ** c
19920 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72  ompletes, either
19930 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
19940 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20  saction or roll 
19950 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50  it back if SCRIP
19960 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e  T.  ** throws an
19970 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20   exception.  Or 
19980 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61  if no new transa
19990 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
199a0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
199b0 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65  ** pass the exce
199c0 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20  ption on up the 
199d0 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
199e0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61   This command wa
199f0 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61  s inspired by Da
19a00 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b  ve Thomas's talk
19a10 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a   on Ruby at the.
19a20 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c    ** 2005 O'Reil
19a30 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43  ly Open Source C
19a40 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e  onvention (OSCON
19a50 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
19a60 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b  B_TRANSACTION: {
19a70 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
19a80 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74  cript;.    const
19a90 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20   char *zBegin = 
19aa0 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f  "SAVEPOINT _tcl_
19ab0 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20  transaction";.  
19ac0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
19ad0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
19ae0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
19af0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
19b00 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49  jv, "[TYPE] SCRI
19b10 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
19b20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19b30 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62    }..    if( pDb
19b40 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
19b50 30 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a  0 && objc==4 ){.
19b60 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
19b70 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73  st char *TTYPE_s
19b80 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  trs[] = {.      
19b90 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20    "deferred",   
19ba0 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69  "exclusive",  "i
19bb0 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20  mmediate", 0.   
19bc0 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d     };.      enum
19bd0 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20   TTYPE_enum {.  
19be0 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45        TTYPE_DEFE
19bf0 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c  RRED, TTYPE_EXCL
19c00 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d  USIVE, TTYPE_IMM
19c10 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a  EDIATE.      };.
19c20 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b        int ttype;
19c30 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
19c40 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
19c50 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
19c60 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61  TTYPE_strs, "tra
19c70 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a  nsaction type",.
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
19ca0 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20   &ttype) ){.    
19cb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19cc0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
19cd0 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75      switch( (enu
19ce0 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79  m TTYPE_enum)tty
19cf0 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  pe ){.        ca
19d00 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45  se TTYPE_DEFERRE
19d10 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  D:    /* no-op *
19d20 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /;              
19d30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19d40 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43    case TTYPE_EXC
19d50 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e  LUSIVE:   zBegin
19d60 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53   = "BEGIN EXCLUS
19d70 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IVE";  break;.  
19d80 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
19d90 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42  _IMMEDIATE:   zB
19da0 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d  egin = "BEGIN IM
19db0 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b  MEDIATE";  break
19dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19dd0 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
19de0 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20  jv[objc-1];..   
19df0 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69   /* Run the SQLi
19e00 74 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64  te BEGIN command
19e10 20 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73   to open a trans
19e20 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
19e30 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d  int. */.    pDb-
19e40 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a  >disableAuth++;.
19e50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19e60 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
19e70 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  Begin, 0, 0, 0);
19e80 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  .    pDb->disabl
19e90 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28  eAuth--;.    if(
19ea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19eb0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
19ec0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19ed0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
19ee0 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a  pDb->db), (char*
19ef0 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
19f00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
19f10 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61   }.    pDb->nTra
19f20 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20  nsaction++;..   
19f30 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45   /* If using NRE
19f40 2c 20 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c  , schedule a cal
19f50 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20  lback to invoke 
19f60 74 68 65 20 73 63 72 69 70 74 20 70 53 63 72 69  the script pScri
19f70 70 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  pt, then.    ** 
19f80 61 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63  a second callbac
19f90 6b 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20  k to commit (or 
19fa0 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72  rollback) the tr
19fb0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76  ansaction or sav
19fc0 65 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70  epoint.    ** op
19fd0 65 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e  ened above. If n
19fe0 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76  ot using NRE, ev
19ff0 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70  aluate the scrip
1a000 74 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e  t directly, then
1a010 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e  .    ** call fun
1a020 63 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73  ction DbTransPos
1a030 74 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74  tCmd() to commit
1a040 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74   (or rollback) t
1a050 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
1a060 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69     ** or savepoi
1a070 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  nt.  */.    if( 
1a080 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
1a090 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c      Tcl_NRAddCal
1a0a0 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62  lback(interp, Db
1a0b0 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64  TransPostCmd, cd
1a0c0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1a0d0 20 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76    (void)Tcl_NREv
1a0e0 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53  alObj(interp, pS
1a0f0 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d  cript, 0);.    }
1a100 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1a110 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
1a120 26 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c  &cd, interp, Tcl
1a130 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
1a140 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b  p, pScript, 0));
1a150 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
1a160 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
1a170 20 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e      $db unlock_n
1a180 6f 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20  otify ?script?. 
1a190 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e   */.  case DB_UN
1a1a0 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23  LOCK_NOTIFY: {.#
1a1b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
1a1c0 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
1a1d0 46 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  FY.    Tcl_Appen
1a1e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a1f0 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e  "unlock_notify n
1a200 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
1a210 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20  this build",.   
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
1a240 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
1a250 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
1a260 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
1a270 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
1a280 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1a290 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
1a2a0 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
1a2b0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
1a2c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a2d0 20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29   void (*xNotify)
1a2e0 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d  (void **, int) =
1a2f0 20 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   0;.      void *
1a300 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a  pNotifyArg = 0;.
1a310 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
1a320 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b  pUnlockNotify ){
1a330 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
1a340 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
1a350 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
1a360 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
1a370 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20  ockNotify = 0;. 
1a380 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
1a390 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
1a3a0 20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44       xNotify = D
1a3b0 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20  bUnlockNotify;. 
1a3c0 20 20 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72         pNotifyAr
1a3d0 67 20 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b  g = (void *)pDb;
1a3e0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55  .        pDb->pU
1a3f0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62  nlockNotify = ob
1a400 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54  jv[2];.        T
1a410 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1a420 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
1a430 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  fy);.      }..  
1a440 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1a450 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44  unlock_notify(pD
1a460 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20  b->db, xNotify, 
1a470 70 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20  pNotifyArg) ){. 
1a480 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
1a490 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a4a0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
1a4b0 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
1a4c0 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  0);.        rc =
1a4d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1a4e0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
1a4f0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
1a500 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
1a510 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  b preupdate_hook
1a520 20 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 20 20 24   count.  **    $
1a530 64 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f  db preupdate_hoo
1a540 6b 20 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a  k hook ?SCRIPT?.
1a550 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75    **    $db preu
1a560 70 64 61 74 65 5f 68 6f 6f 6b 20 6e 65 77 20 49  pdate_hook new I
1a570 4e 44 45 58 0a 20 20 2a 2a 20 20 20 20 24 64 62  NDEX.  **    $db
1a580 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20   preupdate_hook 
1a590 6f 6c 64 20 49 4e 44 45 58 0a 20 20 2a 2f 0a 20  old INDEX.  */. 
1a5a0 20 63 61 73 65 20 44 42 5f 50 52 45 55 50 44 41   case DB_PREUPDA
1a5b0 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51  TE: {.#ifndef SQ
1a5c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
1a5d0 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 54  PDATE_HOOK.    T
1a5e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a5f0 69 6e 74 65 72 70 2c 20 22 70 72 65 75 70 64 61  interp, "preupda
1a600 74 65 5f 68 6f 6f 6b 20 77 61 73 20 6f 6d 69 74  te_hook was omit
1a610 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
1a620 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ime", .         
1a630 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1a640 72 2a 29 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  r*)0);.    rc = 
1a650 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
1a660 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1a670 74 20 63 68 61 72 20 2a 61 7a 53 75 62 5b 5d 20  t char *azSub[] 
1a680 3d 20 7b 22 63 6f 75 6e 74 22 2c 20 22 64 65 70  = {"count", "dep
1a690 74 68 22 2c 20 22 68 6f 6f 6b 22 2c 20 22 6e 65  th", "hook", "ne
1a6a0 77 22 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b 0a 20  w", "old", 0};. 
1a6b0 20 20 20 65 6e 75 6d 20 44 62 50 72 65 75 70 64     enum DbPreupd
1a6c0 61 74 65 53 75 62 43 6d 64 20 7b 0a 20 20 20 20  ateSubCmd {.    
1a6d0 20 20 50 52 45 5f 43 4f 55 4e 54 2c 20 50 52 45    PRE_COUNT, PRE
1a6e0 5f 44 45 50 54 48 2c 20 50 52 45 5f 48 4f 4f 4b  _DEPTH, PRE_HOOK
1a6f0 2c 20 50 52 45 5f 4e 45 57 2c 20 50 52 45 5f 4f  , PRE_NEW, PRE_O
1a700 4c 44 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  LD.    };.    in
1a710 74 20 69 53 75 62 3b 0a 0a 20 20 20 20 69 66 28  t iSub;..    if(
1a720 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 20   objc<3 ){.     
1a730 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1a740 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
1a750 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20  v, "SUB-COMMAND 
1a760 3f 41 52 47 53 3f 22 29 3b 0a 20 20 20 20 7d 0a  ?ARGS?");.    }.
1a770 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
1a780 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
1a790 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 7a 53  rp, objv[2], azS
1a7a0 75 62 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64  ub, "sub-command
1a7b0 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a  ", 0, &iSub) ){.
1a7c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
1a7d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
1a7e0 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
1a7f0 20 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43   DbPreupdateSubC
1a800 6d 64 29 69 53 75 62 20 29 7b 0a 20 20 20 20 20  md)iSub ){.     
1a810 20 63 61 73 65 20 50 52 45 5f 43 4f 55 4e 54 3a   case PRE_COUNT:
1a820 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
1a830 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 70 72  Col = sqlite3_pr
1a840 65 75 70 64 61 74 65 5f 63 6f 75 6e 74 28 70 44  eupdate_count(pD
1a850 62 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  b->db);.        
1a860 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1a870 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1a880 49 6e 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20  IntObj(nCol));. 
1a890 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a8a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
1a8b0 65 20 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  e PRE_HOOK: {.  
1a8c0 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34        if( objc>4
1a8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
1a8e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1a8f0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
1a900 22 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 22 29  "hook ?SCRIPT?")
1a910 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1a920 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a940 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70  DbHookCmd(interp
1a950 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 34 20  , pDb, (objc==4 
1a960 3f 20 6f 62 6a 76 5b 33 5d 20 3a 20 30 29 2c 20  ? objv[3] : 0), 
1a970 26 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65  &pDb->pPreUpdate
1a980 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 62  Hook);.        b
1a990 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1a9a0 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 44 45       case PRE_DE
1a9b0 50 54 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 54  PTH: {.        T
1a9c0 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20  cl_Obj *pRet;.  
1a9d0 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
1a9e0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  3 ){.          T
1a9f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1aa00 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c  interp, 3, objv,
1aa10 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
1aa20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1aa30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1aa40 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e      pRet = Tcl_N
1aa50 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
1aa60 5f 70 72 65 75 70 64 61 74 65 5f 64 65 70 74 68  _preupdate_depth
1aa70 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
1aa80 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1aa90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
1aaa0 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
1aab0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1aac0 20 20 63 61 73 65 20 50 52 45 5f 4e 45 57 3a 0a    case PRE_NEW:.
1aad0 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 4f        case PRE_O
1aae0 4c 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  LD: {.        in
1aaf0 74 20 69 49 64 78 3b 0a 20 20 20 20 20 20 20 20  t iIdx;.        
1ab00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
1ab10 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 69  Value;.        i
1ab20 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
1ab30 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
1ab40 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1ab50 20 33 2c 20 6f 62 6a 76 2c 20 22 49 4e 44 45 58   3, objv, "INDEX
1ab60 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ");.          re
1ab70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ab80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ab90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1aba0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1abb0 6f 62 6a 76 5b 33 5d 2c 20 26 69 49 64 78 29 20  objv[3], &iIdx) 
1abc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1abd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1abe0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1abf0 20 20 69 66 28 20 69 53 75 62 3d 3d 50 52 45 5f    if( iSub==PRE_
1ac00 4f 4c 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OLD ){.         
1ac10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1ac20 65 75 70 64 61 74 65 5f 6f 6c 64 28 70 44 62 2d  eupdate_old(pDb-
1ac30 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c  >db, iIdx, &pVal
1ac40 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ue);.        }el
1ac50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
1ac60 73 65 72 74 28 20 69 53 75 62 3d 3d 50 52 45 5f  sert( iSub==PRE_
1ac70 4e 45 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20  NEW );.         
1ac80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1ac90 65 75 70 64 61 74 65 5f 6e 65 77 28 70 44 62 2d  eupdate_new(pDb-
1aca0 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c  >db, iIdx, &pVal
1acb0 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ue);.        }..
1acc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1acd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ace0 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
1acf0 70 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  pObj;.          
1ad00 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pObj = Tcl_NewSt
1ad10 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
1ad20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1ad30 74 28 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b 0a  t(pValue), -1);.
1ad40 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65            Tcl_Se
1ad50 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1ad60 70 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20 20 20  p, pObj);.      
1ad70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ad80 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ad90 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
1ada0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
1adb0 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
1adc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1add0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1ade0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1adf0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1ae00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
1ae10 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20  PDATE_HOOK */.  
1ae20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
1ae30 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 77  /*.  **    $db w
1ae40 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  al_hook ?script?
1ae50 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64  .  **    $db upd
1ae60 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74  ate_hook ?script
1ae70 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f  ?.  **    $db ro
1ae80 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72  llback_hook ?scr
1ae90 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ipt?.  */.  case
1aea0 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 0a 20 20   DB_WAL_HOOK:.  
1aeb0 63 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48  case DB_UPDATE_H
1aec0 4f 4f 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f 52  OOK:.  case DB_R
1aed0 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a  OLLBACK_HOOK: {.
1aee0 20 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f      /* set ppHoo
1aef0 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55  k to point at pU
1af00 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f  pdateHook or pRo
1af10 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65  llbackHook, depe
1af20 6e 64 69 6e 67 20 6f 6e 0a 20 20 20 20 2a 2a 20  nding on.    ** 
1af30 77 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64  whether [$db upd
1af40 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64  ate_hook] or [$d
1af50 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d  b rollback_hook]
1af60 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20   was invoked..  
1af70 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a    */.    Tcl_Obj
1af80 20 2a 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20   **ppHook = 0;. 
1af90 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
1afa0 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20 70 70 48  B_WAL_HOOK ) ppH
1afb0 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61 6c  ook = &pDb->pWal
1afc0 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68  Hook;.    if( ch
1afd0 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f  oice==DB_UPDATE_
1afe0 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20  HOOK ) ppHook = 
1aff0 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  &pDb->pUpdateHoo
1b000 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  k;.    if( choic
1b010 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48  e==DB_ROLLBACK_H
1b020 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26  OOK ) ppHook = &
1b030 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
1b040 6f 6b 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ok;.    if( objc
1b050 3e 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c  >3 ){.       Tcl
1b060 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1b070 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
1b080 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
1b090 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b0a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
1b0b0 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70  DbHookCmd(interp
1b0c0 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 33 20  , pDb, (objc==3 
1b0d0 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20 30 29 2c 20  ? objv[2] : 0), 
1b0e0 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 62 72 65  ppHook);.    bre
1b0f0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
1b100 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a   $db version.  *
1b110 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
1b120 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  e version string
1b130 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
1b140 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
1b150 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20  DB_VERSION: {.  
1b160 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
1b170 28 69 3d 32 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b  (i=2; i<objc; i+
1b180 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
1b190 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 54 63 6c  char *zArg = Tcl
1b1a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b1b0 69 5d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  i]);.      /* Op
1b1c0 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73  tional arguments
1b1d0 20 74 6f 20 24 64 62 20 76 65 72 73 69 6f 6e 20   to $db version 
1b1e0 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 65 73  are used for tes
1b1f0 74 69 6e 67 20 70 75 72 70 6f 73 65 20 2a 2f 0a  ting purpose */.
1b200 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b210 53 54 0a 20 20 20 20 20 20 2f 2a 20 24 64 62 20  ST.      /* $db 
1b220 76 65 72 73 69 6f 6e 20 2d 75 73 65 2d 6c 65 67  version -use-leg
1b230 61 63 79 2d 70 72 65 70 61 72 65 20 42 4f 4f 4c  acy-prepare BOOL
1b240 45 41 4e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  EAN.      **.   
1b250 20 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 75     ** Turn the u
1b260 73 65 20 6f 66 20 6c 65 67 61 63 79 20 73 71 6c  se of legacy sql
1b270 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 6f  ite3_prepare() o
1b280 6e 20 6f 72 20 6f 66 66 2e 0a 20 20 20 20 20 20  n or off..      
1b290 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  */.      if( str
1b2a0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75 73 65 2d  cmp(zArg, "-use-
1b2b0 6c 65 67 61 63 79 2d 70 72 65 70 61 72 65 22 29  legacy-prepare")
1b2c0 3d 3d 30 20 26 26 20 69 2b 31 3c 6f 62 6a 63 20  ==0 && i+1<objc 
1b2d0 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ){.        i++;.
1b2e0 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f          if( Tcl_
1b2f0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
1b300 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
1b310 5d 2c 20 26 70 44 62 2d 3e 62 4c 65 67 61 63 79  ], &pDb->bLegacy
1b320 50 72 65 70 61 72 65 29 20 29 7b 0a 20 20 20 20  Prepare) ){.    
1b330 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
1b340 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
1b350 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20  }.      }else.. 
1b360 20 20 20 20 20 2f 2a 20 24 64 62 20 76 65 72 73       /* $db vers
1b370 69 6f 6e 20 2d 6c 61 73 74 2d 73 74 6d 74 2d 70  ion -last-stmt-p
1b380 74 72 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  tr.      **.    
1b390 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74    ** Return a st
1b3a0 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 61 20  ring which is a 
1b3b0 68 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  hex encoding of 
1b3c0 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  the pointer to t
1b3d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74  he.      ** most
1b3e0 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
1b3f0 73 74 6d 74 20 69 6e 20 74 68 65 20 73 74 61 74  stmt in the stat
1b400 65 6d 65 6e 74 20 63 61 63 68 65 2e 0a 20 20 20  ement cache..   
1b410 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1b420 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6c  strcmp(zArg, "-l
1b430 61 73 74 2d 73 74 6d 74 2d 70 74 72 22 29 3d 3d  ast-stmt-ptr")==
1b440 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1b450 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20  r zBuf[100];.   
1b460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
1b470 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1b480 66 29 2c 20 7a 42 75 66 2c 20 22 25 70 22 2c 0a  f), zBuf, "%p",.
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4a0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74           pDb->st
1b4b0 6d 74 4c 69 73 74 20 3f 20 70 44 62 2d 3e 73 74  mtList ? pDb->st
1b4c0 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 3a 20 30  mtList->pStmt: 0
1b4d0 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  );.        Tcl_S
1b4e0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1b4f0 20 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54   zBuf, TCL_VOLAT
1b500 49 4c 45 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ILE);.      }els
1b510 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1b520 54 45 5f 54 45 53 54 20 2a 2f 0a 20 20 20 20 20  TE_TEST */.     
1b530 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41   {.        Tcl_A
1b540 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b550 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67  rp, "unknown arg
1b560 75 6d 65 6e 74 3a 20 22 2c 20 7a 41 72 67 2c 20  ument: ", zArg, 
1b570 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
1b580 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b590 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
1b5a0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 32 20   }.    if( i==2 
1b5b0 29 7b 20 20 20 0a 20 20 20 20 20 20 54 63 6c 5f  ){   .      Tcl_
1b5c0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1b5d0 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
1b5e0 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
1b5f0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
1b600 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
1b610 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f  }...  } /* End o
1b620 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61  f the SWITCH sta
1b630 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75  tement */.  retu
1b640 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51  rn rc;.}..#if SQ
1b650 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a  LITE_TCL_NRE./*.
1b660 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61 74 20  ** Adaptor that 
1b670 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43  provides an objC
1b680 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  md interface to 
1b690 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a  the NRE-enabled.
1b6a0 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70  ** interface imp
1b6b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
1b6c0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1b6d0 45 5f 54 43 4c 41 50 49 20 44 62 4f 62 6a 43 6d  E_TCLAPI DbObjCm
1b6e0 64 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64  dAdaptor(.  void
1b6f0 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65   *cd,.  Tcl_Inte
1b700 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b710 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b720 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b  j *const*objv.){
1b730 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52  .  return Tcl_NR
1b740 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65  CallObjProc(inte
1b750 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64  rp, DbObjCmd, cd
1b760 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d  , objc, objv);.}
1b770 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1b780 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a  E_TCL_NRE */../*
1b790 0a 2a 2a 20 49 73 73 75 65 20 74 68 65 20 75 73  .** Issue the us
1b7a0 61 67 65 20 6d 65 73 73 61 67 65 20 77 68 65 6e  age message when
1b7b0 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 20 63   the "sqlite3" c
1b7c0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1b7d0 20 61 72 65 0a 2a 2a 20 69 6e 63 6f 72 72 65 63   are.** incorrec
1b7e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1b7f0 20 73 71 6c 69 74 65 43 6d 64 55 73 61 67 65 28   sqliteCmdUsage(
1b800 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b810 6e 74 65 72 70 2c 0a 20 20 54 63 6c 5f 4f 62 6a  nterp,.  Tcl_Obj
1b820 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
1b830 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1b840 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1b850 6a 76 2c 0a 20 20 20 20 22 48 41 4e 44 4c 45 20  jv,.    "HANDLE 
1b860 3f 46 49 4c 45 4e 41 4d 45 3f 20 3f 2d 76 66 73  ?FILENAME? ?-vfs
1b870 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64   VFSNAME? ?-read
1b880 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  only BOOLEAN? ?-
1b890 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22  create BOOLEAN?"
1b8a0 0a 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78  .    " ?-nomutex
1b8b0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c   BOOLEAN? ?-full
1b8c0 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f  mutex BOOLEAN? ?
1b8d0 2d 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23  -uri BOOLEAN?".#
1b8e0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1b8f0 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
1b900 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b910 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
1b920 54 43 4c 29 0a 20 20 20 20 22 20 3f 2d 6b 65 79  TCL).    " ?-key
1b930 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64   CODECKEY?".#end
1b940 69 66 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  if.  );.  return
1b950 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
1b960 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44  *.**   sqlite3 D
1b970 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f  BNAME FILENAME ?
1b980 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d  -vfs VFSNAME? ?-
1b990 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f  key KEY? ?-reado
1b9a0 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20  nly BOOLEAN?.** 
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61            ?-crea
1b9d0 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f  te BOOLEAN? ?-no
1b9e0 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a  mutex BOOLEAN?.*
1b9f0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
1ba00 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e   main Tcl comman
1ba10 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71  d.  When the "sq
1ba20 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  lite" Tcl comman
1ba30 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c  d is.** invoked,
1ba40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
1ba50 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ns to process th
1ba60 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  at command..**.*
1ba70 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
1ba80 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73  ment, DBNAME, is
1ba90 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61   an arbitrary na
1baa0 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20  me for a new.** 
1bab0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1bac0 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ion.  This comma
1bad0 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  nd creates a new
1bae0 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a   command named.*
1baf0 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73  * DBNAME that is
1bb00 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   used to control
1bb10 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   that connection
1bb20 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a  .  The database.
1bb30 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  ** connection is
1bb40 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
1bb50 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64  e DBNAME command
1bb60 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
1bb70 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1bb80 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
1bb90 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1bba0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73  se file..**.*/.s
1bbb0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1bbc0 5f 54 43 4c 41 50 49 20 44 62 4d 61 69 6e 28 0a  _TCLAPI DbMain(.
1bbd0 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63    void *cd,.  Tc
1bbe0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1bbf0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1bc00 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
1bc10 62 6a 76 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  bjv.){.  SqliteD
1bc20 62 20 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68  b *p;.  const ch
1bc30 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72  ar *zArg;.  char
1bc40 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74   *zErrMsg;.  int
1bc50 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
1bc60 20 2a 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63   *zFile = 0;.  c
1bc70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
1bc80 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  = 0;.  int flags
1bc90 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
1bca0 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61  translatedFilena
1bcb0 6d 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  me;.#if defined(
1bcc0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1bcd0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1bce0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f  LITE_OMIT_CODEC_
1bcf0 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 76 6f 69 64  FROM_TCL).  void
1bd00 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e   *pKey = 0;.  in
1bd10 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23 65 6e 64  t nKey = 0;.#end
1bd20 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  if.  int rc;..  
1bd30 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65  /* In normal use
1bd40 2c 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72  , each TCL inter
1bd50 70 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61  preter runs in a
1bd60 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20   single thread. 
1bd70 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61   So.  ** by defa
1bd80 75 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e  ult, we can turn
1bd90 20 6f 66 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e   off mutexing on
1bda0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
1bdb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
1bdc0 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20  ** However, for 
1bdd0 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
1bde0 20 69 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f   it is useful to
1bdf0 20 68 61 76 65 20 6d 75 74 65 78 65 73 20 74 75   have mutexes tu
1be00 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53  rned.  ** on.  S
1be10 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d  o, by default, m
1be20 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f  utexes default o
1be30 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70  ff.  But if comp
1be40 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53  iled with.  ** S
1be50 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c  QLITE_TCL_DEFAUL
1be60 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e  T_FULLMUTEX then
1be70 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74   mutexes default
1be80 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66   on..  */.#ifdef
1be90 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41   SQLITE_TCL_DEFA
1bea0 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20  ULT_FULLMUTEX.  
1beb0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
1bec0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1bed0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1bee0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1bef0 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73  _FULLMUTEX;.#els
1bf00 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  e.  flags = SQLI
1bf10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1bf20 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
1bf30 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
1bf40 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65  OPEN_NOMUTEX;.#e
1bf50 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ndif..  if( objc
1bf60 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c  ==1 ) return sql
1bf70 69 74 65 43 6d 64 55 73 61 67 65 28 69 6e 74 65  iteCmdUsage(inte
1bf80 72 70 2c 20 6f 62 6a 76 29 3b 0a 20 20 69 66 28  rp, objv);.  if(
1bf90 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
1bfa0 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
1bfb0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1bfc0 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [1], 0);.    if(
1bfd0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76   strcmp(zArg,"-v
1bfe0 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20  ersion")==0 ){. 
1bff0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
1c000 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
1c010 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
1c020 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
1c030 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
1c040 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
1c050 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 73   strcmp(zArg,"-s
1c060 6f 75 72 63 65 69 64 22 29 3d 3d 30 20 29 7b 0a  ourceid")==0 ){.
1c070 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
1c080 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71  Result(interp,sq
1c090 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
1c0a0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
1c0b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
1c0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c0d0 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61  strcmp(zArg,"-ha
1c0e0 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a  s-codec")==0 ){.
1c0f0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1c100 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26  TE_HAS_CODEC) &&
1c110 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1c120 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d  _OMIT_CODEC_FROM
1c130 5f 54 43 4c 29 0a 20 20 20 20 20 20 54 63 6c 5f  _TCL).      Tcl_
1c140 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c150 65 72 70 2c 22 31 22 2c 28 63 68 61 72 2a 29 30  erp,"1",(char*)0
1c160 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54  );.#else.      T
1c170 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c180 69 6e 74 65 72 70 2c 22 30 22 2c 28 63 68 61 72  interp,"0",(char
1c190 2a 29 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  *)0);.#endif.   
1c1a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
1c1b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c1c0 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 20 72  zArg[0]=='-' ) r
1c1d0 65 74 75 72 6e 20 73 71 6c 69 74 65 43 6d 64 55  eturn sqliteCmdU
1c1e0 73 61 67 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sage(interp, obj
1c1f0 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  v);.  }.  for(i=
1c200 32 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 2b 29 7b  2; i<objc; i++){
1c210 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
1c220 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
1c230 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67  ]);.    if( zArg
1c240 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]!='-' ){.    
1c250 20 20 69 66 28 20 7a 46 69 6c 65 21 3d 30 20 29    if( zFile!=0 )
1c260 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 43 6d   return sqliteCm
1c270 64 55 73 61 67 65 28 69 6e 74 65 72 70 2c 20 6f  dUsage(interp, o
1c280 62 6a 76 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c  bjv);.      zFil
1c290 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  e = zArg;.      
1c2a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1c2b0 20 20 20 20 69 66 28 20 69 3d 3d 6f 62 6a 63 2d      if( i==objc-
1c2c0 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74  1 ) return sqlit
1c2d0 65 43 6d 64 55 73 61 67 65 28 69 6e 74 65 72 70  eCmdUsage(interp
1c2e0 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 69 2b 2b  , objv);.    i++
1c2f0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
1c300 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30  (zArg,"-key")==0
1c310 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
1c320 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1c330 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1c340 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f  LITE_OMIT_CODEC_
1c350 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20  FROM_TCL).      
1c360 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
1c370 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1c380 62 6a 76 5b 69 5d 2c 20 26 6e 4b 65 79 29 3b 0a  bjv[i], &nKey);.
1c390 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1c3a0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
1c3b0 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a  , "-vfs")==0 ){.
1c3c0 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c        zVfs = Tcl
1c3d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c3e0 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
1c3f0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
1c400 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20  "-readonly")==0 
1c410 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
1c420 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
1c430 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
1c440 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c  interp, objv[i],
1c450 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
1c460 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
1c470 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
1c480 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
1c490 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1c4a0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
1c4b0 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c  ATE);.        fl
1c4c0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
1c4d0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
1c4e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c4f0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
1c500 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1c510 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
1c520 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
1c530 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
1c540 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1c550 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63  strcmp(zArg, "-c
1c560 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  reate")==0 ){.  
1c570 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
1c580 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
1c590 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
1c5a0 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29 20  p, objv[i], &b) 
1c5b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c5c0 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
1c5d0 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
1c5e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1c5f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1c600 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1c610 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
1c620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c630 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
1c640 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
1c650 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1c660 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
1c670 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d  g, "-nomutex")==
1c680 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
1c690 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
1c6a0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
1c6b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
1c6c0 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
1c6d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
1c6e0 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
1c6f0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
1c700 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
1c710 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
1c720 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55   ~SQLITE_OPEN_FU
1c730 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  LLMUTEX;.      }
1c740 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
1c750 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
1c760 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20  PEN_NOMUTEX;.   
1c770 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1c780 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
1c790 22 2d 66 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30  "-fullmutex")==0
1c7a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
1c7b0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
1c7c0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
1c7d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d  (interp, objv[i]
1c7e0 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
1c7f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
1c800 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
1c810 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
1c820 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b  _OPEN_FULLMUTEX;
1c830 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
1c840 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  = ~SQLITE_OPEN_N
1c850 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65  OMUTEX;.      }e
1c860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
1c870 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
1c880 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
1c890 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1c8a0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
1c8b0 20 22 2d 75 72 69 22 29 3d 3d 30 20 29 7b 0a 20   "-uri")==0 ){. 
1c8c0 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
1c8d0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
1c8e0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
1c8f0 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29  rp, objv[i], &b)
1c900 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c910 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
1c920 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
1c930 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1c940 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _URI;.      }els
1c950 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
1c960 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
1c970 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _URI;.      }.  
1c980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
1c990 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c9a0 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
1c9b0 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67   option: ", zArg
1c9c0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
1c9d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c9e0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
1c9f0 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
1ca00 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54  p = (SqliteDb*)T
1ca10 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
1ca20 28 2a 70 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74  (*p) );.  memset
1ca30 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
1ca40 29 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 3d  ));.  if( zFile=
1ca50 3d 30 20 29 20 7a 46 69 6c 65 20 3d 20 22 22 3b  =0 ) zFile = "";
1ca60 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54  .  zFile = Tcl_T
1ca70 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
1ca80 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20  (interp, zFile, 
1ca90 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
1caa0 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ame);.  rc = sql
1cab0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69  ite3_open_v2(zFi
1cac0 6c 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67  le, &p->db, flag
1cad0 73 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f  s, zVfs);.  Tcl_
1cae0 44 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61  DStringFree(&tra
1caf0 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
1cb00 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b  ;.  if( p->db ){
1cb10 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1cb20 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
1cb30 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20  ode(p->db) ){.  
1cb40 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
1cb50 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1cb60 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
1cb70 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
1cb80 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
1cb90 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d  p->db);.      p-
1cba0 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  >db = 0;.    }. 
1cbb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72   }else{.    zErr
1cbc0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
1cbd0 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
1cbe0 74 65 33 5f 65 72 72 73 74 72 28 72 63 29 29 3b  te3_errstr(rc));
1cbf0 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
1cc00 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
1cc10 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  C) && !defined(S
1cc20 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43  QLITE_OMIT_CODEC
1cc30 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 69 66 28  _FROM_TCL).  if(
1cc40 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
1cc50 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c  lite3_key(p->db,
1cc60 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
1cc70 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
1cc80 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ->db==0 ){.    T
1cc90 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1cca0 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
1ccb0 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
1ccc0 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1ccd0 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )p);.    sqlite3
1cce0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
1ccf0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1cd00 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  RROR;.  }.  p->m
1cd10 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45  axStmt = NUM_PRE
1cd20 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70  PARED_STMTS;.  p
1cd30 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
1cd40 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1cd50 4e 5f 55 52 49 3b 0a 20 20 70 2d 3e 69 6e 74 65  N_URI;.  p->inte
1cd60 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a  rp = interp;.  z
1cd70 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
1cd80 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
1cd90 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62  1], 0);.  if( Db
1cda0 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
1cdb0 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d  Tcl_NRCreateComm
1cdc0 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
1cdd0 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f  , DbObjCmdAdapto
1cde0 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20  r, DbObjCmd,.   
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44       (char*)p, D
1ce10 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d  bDeleteCmd);.  }
1ce20 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72  else{.    Tcl_Cr
1ce30 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
1ce40 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f  nterp, zArg, DbO
1ce50 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c  bjCmd, (char*)p,
1ce60 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
1ce70 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1ce80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
1ce90 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
1cea0 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
1ceb0 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
1cec0 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
1ced0 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
1cee0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
1cef0 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
1cf00 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
1cf10 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
1cf20 2c 62 2c 63 29 20 54 43 4c 5f 56 45 52 53 49 4f  ,b,c) TCL_VERSIO
1cf30 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
1cf40 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
1cf50 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e a PACKAGE_VERS
1cf60 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ION macro define
1cf70 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
1cf80 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f  .** defined auto
1cf90 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65  matically by the
1cfa0 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20   TEA makefile.  
1cfb0 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69  But other makefi
1cfc0 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65  les.** do not de
1cfd0 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e  fine it..*/.#ifn
1cfe0 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
1cff0 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43  ION.# define PAC
1d000 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c  KAGE_VERSION SQL
1d010 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  ITE_VERSION.#end
1d020 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
1d030 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
1d040 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c  ..**.** This Tcl
1d050 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
1d060 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e   only a single n
1d070 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  ew Tcl command n
1d080 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a  amed "sqlite"..*
1d090 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69  * (Hence there i
1d0a0 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20  s no namespace. 
1d0b0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
1d0c0 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61  nt in using a na
1d0d0 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68  mespace.** if th
1d0e0 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  e extension only
1d0f0 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65   supplies one ne
1d100 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73  w name!)  The "s
1d110 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69  qlite" command i
1d120 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65  s.** used to ope
1d130 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64  n a new SQLite d
1d140 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68  atabase.  See th
1d150 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69  e DbMain() routi
1d160 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20  ne above.** for 
1d170 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1d180 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
1d190 65 20 45 58 54 45 52 4e 20 6d 61 63 72 6f 73 20  e EXTERN macros 
1d1a0 61 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20  are required by 
1d1b0 54 43 4c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  TCL in order to 
1d1c0 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e  work on windows.
1d1d0 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  .*/.EXTERN int S
1d1e0 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
1d1f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1d200 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f  .  int rc = Tcl_
1d210 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
1d220 2c 20 22 38 2e 34 22 2c 20 30 29 20 3f 20 54 43  , "8.4", 0) ? TC
1d230 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52  L_OK : TCL_ERROR
1d240 3b 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ;.  if( rc==TCL_
1d250 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  OK ){.    Tcl_Cr
1d260 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
1d270 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
1d280 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
1d290 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
1d2a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1d2b0 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20  _3_SUFFIX_ONLY. 
1d2c0 20 20 20 2f 2a 20 54 68 65 20 22 73 71 6c 69 74     /* The "sqlit
1d2d0 65 22 20 61 6c 69 61 73 20 69 73 20 75 6e 64 6f  e" alias is undo
1d2e0 63 75 6d 65 6e 74 65 64 2e 20 20 49 74 20 69 73  cumented.  It is
1d2f0 20 68 65 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75   here only to su
1d300 70 70 6f 72 74 0a 20 20 20 20 2a 2a 20 6c 65 67  pport.    ** leg
1d310 61 63 79 20 73 63 72 69 70 74 73 2e 20 20 41 6c  acy scripts.  Al
1d320 6c 20 6e 65 77 20 73 63 72 69 70 74 73 20 73 68  l new scripts sh
1d330 6f 75 6c 64 20 75 73 65 20 6f 6e 6c 79 20 74 68  ould use only th
1d340 65 20 22 73 71 6c 69 74 65 33 22 0a 20 20 20 20  e "sqlite3".    
1d350 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20  ** command. */. 
1d360 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1d370 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1d380 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f  "sqlite", (Tcl_O
1d390 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
1d3a0 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  n, 0, 0);.#endif
1d3b0 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 50 6b  .    rc = Tcl_Pk
1d3c0 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
1d3d0 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b   "sqlite3", PACK
1d3e0 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  AGE_VERSION);.  
1d3f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1d400 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
1d410 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
1d420 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1d430 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
1d440 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
1d450 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
1d460 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  e3_Unload(Tcl_In
1d470 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
1d480 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
1d490 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
1d4a0 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
1d4b0 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
1d4c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1d4d0 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
1d4e0 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63  CL_OK; }../* Bec
1d4f0 61 75 73 65 20 69 74 20 61 63 63 65 73 73 65 73  ause it accesses
1d500 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1d510 20 61 6e 64 20 75 73 65 73 20 70 65 72 73 69 73   and uses persis
1d520 74 65 6e 74 20 73 74 61 74 65 2c 20 53 51 4c 69  tent state, SQLi
1d530 74 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  te.** is not con
1d540 73 69 64 65 72 65 64 20 61 70 70 72 6f 70 72 69  sidered appropri
1d550 61 74 65 20 66 6f 72 20 73 61 66 65 20 69 6e 74  ate for safe int
1d560 65 72 70 72 65 74 65 72 73 2e 20 20 48 65 6e 63  erpreters.  Henc
1d570 65 2c 20 77 65 20 63 61 75 73 65 0a 2a 2a 20 74  e, we cause.** t
1d580 68 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20 69  he _SafeInit() i
1d590 6e 74 65 72 66 61 63 65 73 20 72 65 74 75 72 6e  nterfaces return
1d5a0 20 54 43 4c 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 45   TCL_ERROR..*/.E
1d5b0 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
1d5c0 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
1d5d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
1d5e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d5f0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
1d600 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61  qlite3_SafeUnloa
1d610 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
1d620 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
1d630 7b 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  {return TCL_ERRO
1d640 52 3b 7d 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53  R;}....#ifndef S
1d650 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
1d660 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49  NLY.int Sqlite_I
1d670 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1d680 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
1d690 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
1d6a0 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  erp); }.int Tcls
1d6b0 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
1d6c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
1d6d0 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
1d6e0 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69  nit(interp); }.i
1d6f0 6e 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64  nt Sqlite_Unload
1d700 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1d710 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
1d720 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1d730 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
1d740 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
1d750 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
1d760 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
1d770 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK; }.#endif..
1d780 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 54 43 4c  /*.** If the TCL
1d790 53 48 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  SH macro is defi
1d7a0 6e 65 64 2c 20 61 64 64 20 63 6f 64 65 20 74 6f  ned, add code to
1d7b0 20 6d 61 6b 65 20 61 20 73 74 61 6e 64 2d 61 6c   make a stand-al
1d7c0 6f 6e 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  one program..*/.
1d7d0 23 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c 53  #if defined(TCLS
1d7e0 48 29 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74  H)../* This is t
1d7f0 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20  he main routine 
1d800 66 6f 72 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  for an ordinary 
1d810 54 43 4c 20 73 68 65 6c 6c 2e 20 20 49 66 20 74  TCL shell.  If t
1d820 68 65 72 65 20 61 72 65 0a 2a 2a 20 61 72 65 20  here are.** are 
1d830 61 72 67 75 6d 65 6e 74 73 2c 20 72 75 6e 20 74  arguments, run t
1d840 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1d850 74 20 61 73 20 61 20 73 63 72 69 70 74 2e 20 20  t as a script.  
1d860 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 72 65  Otherwise,.** re
1d870 61 64 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20  ad TCL commands 
1d880 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e  from standard in
1d890 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  put.*/.static co
1d8a0 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f  nst char *tclsh_
1d8b0 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b  main_loop(void){
1d8c0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1d8d0 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d  char zMainloop[]
1d8e0 20 3d 0a 20 20 20 20 22 69 66 20 7b 5b 6c 6c 65   =.    "if {[lle
1d8f0 6e 67 74 68 20 24 61 72 67 76 5d 3e 3d 31 7d 20  ngth $argv]>=1} 
1d900 7b 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20  {\n".      "set 
1d910 61 72 67 76 30 20 5b 6c 69 6e 64 65 78 20 24 61  argv0 [lindex $a
1d920 72 67 76 20 30 5d 5c 6e 22 0a 20 20 20 20 20 20  rgv 0]\n".      
1d930 22 73 65 74 20 61 72 67 76 20 5b 6c 72 61 6e 67  "set argv [lrang
1d940 65 20 24 61 72 67 76 20 31 20 65 6e 64 5d 5c 6e  e $argv 1 end]\n
1d950 22 0a 20 20 20 20 20 20 22 73 6f 75 72 63 65 20  ".      "source 
1d960 24 61 72 67 76 30 5c 6e 22 0a 20 20 20 20 22 7d  $argv0\n".    "}
1d970 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
1d980 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
1d990 0a 20 20 20 20 20 20 22 77 68 69 6c 65 20 7b 21  .      "while {!
1d9a0 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e  [eof stdin]} {\n
1d9b0 22 0a 20 20 20 20 20 20 20 20 22 69 66 20 7b 24  ".        "if {$
1d9c0 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
1d9d0 0a 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73  .          "puts
1d9e0 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
1d9f0 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d  \"\n".        "}
1da00 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
1da10 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
1da20 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a  wline \"% \"\n".
1da30 20 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20          "}\n".  
1da40 20 20 20 20 20 20 22 66 6c 75 73 68 20 73 74 64        "flush std
1da50 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  out\n".        "
1da60 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74  append line [get
1da70 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20  s stdin]\n".    
1da80 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63      "if {[info c
1da90 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20  omplete $line]} 
1daa0 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22  {\n".          "
1dab0 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
1dac0 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
1dad0 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
1dae0 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
1daf0 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
1db00 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
1db10 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b       "} elseif {
1db20 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b  $result!=\"\"} {
1db30 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
1db40 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22  "puts $result\n"
1db50 0a 20 20 20 20 20 20 20 20 20 20 22 7d 5c 6e 22  .          "}\n"
1db60 0a 20 20 20 20 20 20 20 20 20 20 22 73 65 74 20  .          "set 
1db70 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20  line {}\n".     
1db80 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a     "} else {\n".
1db90 20 20 20 20 20 20 20 20 20 20 22 61 70 70 65 6e            "appen
1dba0 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20  d line \\n\n".  
1dbb0 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
1dbc0 20 20 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e    "}\n".    "}\n
1dbd0 22 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ".  ;.  return z
1dbe0 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 0a 23 64 65  Mainloop;.}..#de
1dbf0 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20  fine TCLSH_MAIN 
1dc00 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64  main   /* Needed
1dc10 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74   to fake out mkt
1dc20 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 53 51 4c  clapp */.int SQL
1dc30 49 54 45 5f 43 44 45 43 4c 20 54 43 4c 53 48 5f  ITE_CDECL TCLSH_
1dc40 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63  MAIN(int argc, c
1dc50 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54  har **argv){.  T
1dc60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1dc70 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  p;.  int i;.  co
1dc80 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 72 69 70  nst char *zScrip
1dc90 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 41  t = 0;.  char zA
1dca0 72 67 63 5b 33 32 5d 3b 0a 23 69 66 20 64 65 66  rgc[32];.#if def
1dcb0 69 6e 65 64 28 54 43 4c 53 48 5f 49 4e 49 54 5f  ined(TCLSH_INIT_
1dcc0 50 52 4f 43 29 0a 20 20 65 78 74 65 72 6e 20 63  PROC).  extern c
1dcd0 6f 6e 73 74 20 63 68 61 72 20 2a 54 43 4c 53 48  onst char *TCLSH
1dce0 5f 49 4e 49 54 5f 50 52 4f 43 28 54 63 6c 5f 49  _INIT_PROC(Tcl_I
1dcf0 6e 74 65 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a  nterp*);.#endif.
1dd00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
1dd10 49 4e 33 32 5f 57 43 45 29 0a 20 20 69 66 28 20  IN32_WCE).  if( 
1dd20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 44  getenv("SQLITE_D
1dd30 45 42 55 47 5f 42 52 45 41 4b 22 29 20 29 7b 0a  EBUG_BREAK") ){.
1dd40 20 20 20 20 69 66 28 20 69 73 61 74 74 79 28 30      if( isatty(0
1dd50 29 20 26 26 20 69 73 61 74 74 79 28 32 29 20 29  ) && isatty(2) )
1dd60 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1dd70 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
1dd80 20 20 22 61 74 74 61 63 68 20 64 65 62 75 67 67    "attach debugg
1dd90 65 72 20 74 6f 20 70 72 6f 63 65 73 73 20 25 64  er to process %d
1dda0 20 61 6e 64 20 70 72 65 73 73 20 61 6e 79 20 6b   and press any k
1ddb0 65 79 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 5c  ey to continue.\
1ddc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 47 45  n",.          GE
1ddd0 54 50 49 44 28 29 29 3b 0a 20 20 20 20 20 20 66  TPID());.      f
1dde0 67 65 74 63 28 73 74 64 69 6e 29 3b 0a 20 20 20  getc(stdin);.   
1ddf0 20 7d 65 6c 73 65 7b 0a 23 69 66 20 64 65 66 69   }else{.#if defi
1de00 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
1de10 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20  efined(WIN32).  
1de20 20 20 20 20 44 65 62 75 67 42 72 65 61 6b 28 29      DebugBreak()
1de30 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1de40 53 49 47 54 52 41 50 29 0a 20 20 20 20 20 20 72  SIGTRAP).      r
1de50 61 69 73 65 28 53 49 47 54 52 41 50 29 3b 0a 23  aise(SIGTRAP);.#
1de60 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1de70 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 61 6c  #endif..  /* Cal
1de80 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
1de90 77 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65  wn() once before
1dea0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
1deb0 65 6c 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f  else. This is to
1dec0 0a 20 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20  .  ** test that 
1ded0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1dee0 28 29 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  () can be safely
1def0 20 63 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f   called by a pro
1df00 63 65 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a  cess before.  **
1df10 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1df20 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73  ize() is. */.  s
1df30 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1df40 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  );..  Tcl_FindEx
1df50 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
1df60 29 3b 0a 20 20 54 63 6c 5f 53 65 74 53 79 73 74  );.  Tcl_SetSyst
1df70 65 6d 45 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c  emEncoding(NULL,
1df80 20 22 75 74 66 2d 38 22 29 3b 0a 20 20 69 6e 74   "utf-8");.  int
1df90 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
1dfa0 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69  Interp();.  Sqli
1dfb0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
1dfc0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1dfd0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72  rintf(sizeof(zAr
1dfe0 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22  gc), zArgc, "%d"
1dff0 2c 20 61 72 67 63 2d 31 29 3b 0a 20 20 54 63 6c  , argc-1);.  Tcl
1e000 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1e010 61 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43  argc", zArgc, TC
1e020 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1e030 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1e040 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76  erp,"argv0",argv
1e050 5b 30 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  [0],TCL_GLOBAL_O
1e060 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  NLY);.  Tcl_SetV
1e070 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22  ar(interp,"argv"
1e080 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  , "", TCL_GLOBAL
1e090 5f 4f 4e 4c 59 29 3b 0a 20 20 66 6f 72 28 69 3d  _ONLY);.  for(i=
1e0a0 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
1e0b0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1e0c0 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20  interp, "argv", 
1e0d0 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20  argv[i],.       
1e0e0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1e0f0 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d   | TCL_LIST_ELEM
1e100 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44  ENT | TCL_APPEND
1e110 5f 56 41 4c 55 45 29 3b 0a 20 20 7d 0a 23 69 66  _VALUE);.  }.#if
1e120 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48 5f 49   defined(TCLSH_I
1e130 4e 49 54 5f 50 52 4f 43 29 0a 20 20 7a 53 63 72  NIT_PROC).  zScr
1e140 69 70 74 20 3d 20 54 43 4c 53 48 5f 49 4e 49 54  ipt = TCLSH_INIT
1e150 5f 50 52 4f 43 28 69 6e 74 65 72 70 29 3b 0a 23  _PROC(interp);.#
1e160 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 53 63 72  endif.  if( zScr
1e170 69 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  ipt==0 ){.    zS
1e180 63 72 69 70 74 20 3d 20 74 63 6c 73 68 5f 6d 61  cript = tclsh_ma
1e190 69 6e 5f 6c 6f 6f 70 28 29 3b 0a 20 20 7d 0a 20  in_loop();.  }. 
1e1a0 20 69 66 28 20 54 63 6c 5f 47 6c 6f 62 61 6c 45   if( Tcl_GlobalE
1e1b0 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 53 63 72  val(interp, zScr
1e1c0 69 70 74 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ipt)!=TCL_OK ){.
1e1d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e1e0 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56  zInfo = Tcl_GetV
1e1f0 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f  ar(interp, "erro
1e200 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42  rInfo", TCL_GLOB
1e210 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  AL_ONLY);.    if
1e220 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e  ( zInfo==0 ) zIn
1e230 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  fo = Tcl_GetStri
1e240 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
1e250 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
1e260 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
1e270 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
1e280 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e290 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1e2a0 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20  #endif /* TCLSH 
1e2b0 2a 2f 0a                                         */.